59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
(() => {
|
|
const formSelector = "form[data-submit-once]";
|
|
|
|
function progressIndicator() {
|
|
return document.getElementById("submit-progress");
|
|
}
|
|
|
|
function resetForm(form) {
|
|
form.removeAttribute("aria-busy");
|
|
delete form.dataset.submitting;
|
|
|
|
const button = form.querySelector("[data-submit-button]");
|
|
if (!button) {
|
|
return;
|
|
}
|
|
button.disabled = false;
|
|
button.removeAttribute("aria-disabled");
|
|
if (button.dataset.idleLabel) {
|
|
button.textContent = button.dataset.idleLabel;
|
|
delete button.dataset.idleLabel;
|
|
}
|
|
}
|
|
|
|
document.addEventListener("submit", (event) => {
|
|
const form = event.target.closest(formSelector);
|
|
if (!form) {
|
|
return;
|
|
}
|
|
if (form.dataset.submitting === "true") {
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
|
|
form.dataset.submitting = "true";
|
|
form.setAttribute("aria-busy", "true");
|
|
|
|
const button = event.submitter || form.querySelector("[data-submit-button]");
|
|
if (button) {
|
|
button.dataset.idleLabel = button.textContent;
|
|
button.textContent = form.dataset.submittingLabel || "Posting…";
|
|
button.disabled = true;
|
|
button.setAttribute("aria-disabled", "true");
|
|
}
|
|
|
|
const progress = progressIndicator();
|
|
if (progress) {
|
|
progress.hidden = false;
|
|
}
|
|
});
|
|
|
|
window.addEventListener("pageshow", () => {
|
|
document.querySelectorAll(formSelector).forEach(resetForm);
|
|
const progress = progressIndicator();
|
|
if (progress) {
|
|
progress.hidden = true;
|
|
}
|
|
});
|
|
})();
|