Files
notifications-admin/app/assets/javascripts/preventDuplicateFormSubmissions.js
T

47 lines
1.6 KiB
JavaScript
Raw Normal View History

(function () {
2017-09-15 14:10:21 +01:00
"use strict";
const disableSubmitButtons = function (event) {
const $submitButton = $(this).find(':submit');
2017-09-15 14:10:21 +01:00
if ($submitButton.data('clicked') === 'true') {
2017-09-15 14:10:21 +01:00
event.preventDefault();
return;
}
2017-09-15 14:10:21 +01:00
$submitButton.data('clicked', 'true');
2017-09-15 14:10:21 +01:00
2025-10-06 09:38:54 -04:00
// Add loading spinner for Send/Schedule/Cancel buttons
const buttonName = $submitButton.attr('name')?.toLowerCase();
if (["send", "schedule", "cancel"].includes(buttonName)) {
2025-10-06 09:38:54 -04:00
// Use setTimeout with minimal delay to allow form submission to proceed first
setTimeout(() => {
$submitButton.prop('disabled', true);
2017-09-15 14:10:21 +01:00
2025-10-06 09:38:54 -04:00
// Add loading spinner and aria-busy attribute for accessibility
if ($submitButton.find('.loading-spinner').length === 0) {
$submitButton.attr('aria-busy', 'true');
$submitButton.append('<span class="loading-spinner" role="status" aria-label="Sending"></span>');
}
2025-10-06 09:38:54 -04:00
// Disable Cancel button too
const $cancelButton = $('button[name]').filter(function () {
return $(this).attr('name')?.toLowerCase() === 'cancel';
});
$cancelButton.prop('disabled', true);
}, 50); // Small delay to ensure form submits first
} else {
2025-10-06 09:38:54 -04:00
setTimeout(() => renableSubmitButton($submitButton)(), 1500);
2017-09-15 14:10:21 +01:00
}
};
const renableSubmitButton = ($submitButton) => () => {
2017-09-15 14:10:21 +01:00
$submitButton.data('clicked', '');
$submitButton.prop('disabled', false);
2025-10-06 09:38:54 -04:00
$submitButton.attr('aria-busy', 'false');
$submitButton.find('.loading-spinner').remove(); // clean up spinner
2017-09-15 14:10:21 +01:00
};
$('form').on('submit', disableSubmitButtons);
})();