Kumi
58993cbf51
- Hide all buttons labeled 'Back' on document ready - Add session key and attempt values logging to assist debugging - Add AJAX request to finalize quiz attempts upon submission - Ensure proper navigation or modal closure after quiz submission These changes improve user experience by providing seamless form submission and debugging support.
153 lines
5.4 KiB
JavaScript
153 lines
5.4 KiB
JavaScript
document.addEventListener("DOMContentLoaded", function () {
|
|
// Function to load a script into the DOM
|
|
function loadScript(url, integrity, crossorigin) {
|
|
return new Promise((resolve, reject) => {
|
|
const script = document.createElement("script");
|
|
script.src = url;
|
|
script.integrity = integrity;
|
|
script.crossOrigin = crossorigin;
|
|
script.onload = () => resolve(script);
|
|
script.onerror = () => reject(new Error(`Failed to load script: ${url}`));
|
|
document.head.appendChild(script);
|
|
});
|
|
}
|
|
|
|
// Function to get URL parameters
|
|
function getUrlParameter(name) {
|
|
url = document.location.href;
|
|
urlobj = new URL(url);
|
|
return urlobj.searchParams.get(name);
|
|
}
|
|
|
|
// Check if the 'embed' parameter is set to '1'
|
|
if (getUrlParameter("embed") === "1") {
|
|
// Apply custom CSS to hide Moodle interface elements
|
|
var style = document.createElement("style");
|
|
style.innerHTML = `
|
|
body.path-mod {
|
|
#header, #footer, .breadcrumb, .navbar, .side-pre, .side-post, .drawer, .drawer-toggler, .footer-popover, .navigation {
|
|
display: none !important;
|
|
}
|
|
#region-main {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
}
|
|
`;
|
|
document.head.appendChild(style);
|
|
|
|
loadScript(
|
|
"https://code.jquery.com/jquery-3.7.1.min.js",
|
|
"sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=",
|
|
"anonymous"
|
|
)
|
|
.then(() => {
|
|
console.log("jQuery loaded successfully");
|
|
// Load Bootstrap after jQuery is loaded
|
|
return loadScript(
|
|
"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js",
|
|
"sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz",
|
|
"anonymous"
|
|
);
|
|
})
|
|
.then(() => {
|
|
console.log("Bootstrap loaded successfully");
|
|
$(document).ready(function () {
|
|
$(".btn-secondary:contains('Back')").hide()
|
|
|
|
var embedded = getUrlParameter("embed");
|
|
var inModal = getUrlParameter("modal");
|
|
|
|
// Set required attribute on inputs associated with labels containing <i title="Required field">
|
|
$('label:has(i[title="Required field"])').each(function () {
|
|
var inputId = $(this).attr("for");
|
|
$("#" + inputId).attr("required", "required");
|
|
});
|
|
|
|
// Hide the modal if the 'cancel' button is clicked
|
|
$("[name=cancel]").click(function () {
|
|
hideContent();
|
|
});
|
|
|
|
$("form").each(function () {
|
|
var form = $(this);
|
|
|
|
form.submit(function (event) {
|
|
event.preventDefault(); // Prevent the default form submission
|
|
|
|
// Check if the form is valid
|
|
if (!form[0].checkValidity()) {
|
|
form[0].reportValidity();
|
|
return;
|
|
}
|
|
|
|
// Serialize the form data
|
|
var formData = form.serialize();
|
|
|
|
// Add the submit button's data to formData
|
|
var submitButton = form.find(
|
|
'input[type="submit"][name="savevalues"]'
|
|
);
|
|
if (submitButton.length) {
|
|
formData +=
|
|
"&" +
|
|
encodeURIComponent(submitButton.attr("name")) +
|
|
"=" +
|
|
encodeURIComponent(submitButton.val());
|
|
}
|
|
|
|
var sesskey = form.find('input[name=sesskey]').val();
|
|
var attempt = form.find('input[name=attempt]').val();
|
|
|
|
console.log(sesskey);
|
|
console.log(attempt);
|
|
|
|
// Perform the AJAX request
|
|
$.ajax({
|
|
url: form.attr("action"), // Use the form's action attribute
|
|
type: form.attr("method"), // Use the form's method attribute
|
|
data: formData,
|
|
success: function (response) {
|
|
if (form.attr("action").includes("/quiz/")) {
|
|
var finalize = "/mod/quiz/processattempt.php";
|
|
var data = {
|
|
attempt: attempt,
|
|
finishattempt: 1,
|
|
sesskey: sesskey,
|
|
};
|
|
$.post(finalize, data, function (response) {
|
|
console.log(response);
|
|
// Close the modal if `modal=1` is set
|
|
if (inModal === "1") {
|
|
window.top.closeQuizModal();
|
|
} else {
|
|
// Else call the nextContent function
|
|
window.top.nextContent();
|
|
}
|
|
});
|
|
} else {
|
|
// Close the modal if `modal=1` is set
|
|
if (inModal === "1") {
|
|
window.top.closeQuizModal();
|
|
} else {
|
|
// Else call the nextContent function
|
|
window.top.nextContent();
|
|
}
|
|
}
|
|
},
|
|
error: function (xhr, status, error) {
|
|
// Handle any errors that occur during the AJAX request
|
|
console.error(
|
|
"Form submission failed: " + status + " - " + error
|
|
);
|
|
},
|
|
});
|
|
});
|
|
});
|
|
});
|
|
})
|
|
.catch((error) => {
|
|
console.error(error);
|
|
});
|
|
}
|
|
});
|