From 7a96e728fa0d8f1d2b8070110c34c14a1c51eb0c Mon Sep 17 00:00:00 2001 From: Peter Goodhall Date: Mon, 18 Aug 2025 14:41:38 +0100 Subject: [PATCH] Prevent double form submission in QSO section Introduces a submission state flag to prevent double submissions of the QSO form, disables the submit button during processing, and restores its state if the page visibility changes or fields are reset. Also adds handling to prevent Enter key from causing duplicate submissions. --- assets/js/sections/qso.js | 64 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/assets/js/sections/qso.js b/assets/js/sections/qso.js index 2f7c936b..dc1e497f 100644 --- a/assets/js/sections/qso.js +++ b/assets/js/sections/qso.js @@ -348,13 +348,54 @@ var favs={}; }); // Test Consistency value on submit form // - $("#qso_input").off('submit').on('submit', function(){ + var isSubmitting = false; + $("#qso_input").off('submit').on('submit', function(e){ + // Prevent double submission + if (isSubmitting) { + e.preventDefault(); + return false; + } + var _submit = true; if ((typeof qso_manual !== "undefined")&&(qso_manual == "1")) { if ($('#qso_input input[name="end_time"]').length == 1) { _submit = testTimeOffConsistency(); } } + + if (_submit) { + // Mark as submitting and disable the submit button + isSubmitting = true; + var submitBtn = $(this).find('button[type="submit"]'); + var originalText = submitBtn.data('original-text'); + if (!originalText) { + // Store original text first time + originalText = submitBtn.html(); + submitBtn.data('original-text', originalText); + } + submitBtn.prop('disabled', true); + submitBtn.html(' Saving...'); + } + return _submit; }) + + // Prevent Enter key from causing double submissions + $("#qso_input").on('keydown', function(e) { + if (e.key === 'Enter' && e.target.type !== 'textarea') { + if (isSubmitting) { + e.preventDefault(); + return false; + } + } + }); + + // Reset submission state when page becomes visible again (handles cases where submission gets stuck) + document.addEventListener('visibilitychange', function() { + if (!document.hidden && typeof isSubmitting !== 'undefined' && isSubmitting) { + setTimeout(function() { + resetSubmissionState(); + }, 1000); // Wait 1 second before resetting to avoid interfering with legitimate submissions + } + }); }); var selected_sat; @@ -477,8 +518,29 @@ function changebadge(entityname) { } } +/* Function: resetSubmissionState resets the form submission state */ +function resetSubmissionState() { + if (typeof isSubmitting !== 'undefined') { + isSubmitting = false; + } + var submitBtn = $('#qso_input button[type="submit"]'); + if (submitBtn.length > 0) { + submitBtn.prop('disabled', false); + // Get the original text from the button or use a fallback + var originalText = submitBtn.data('original-text'); + if (!originalText) { + // Store original text first time + originalText = submitBtn.html(); + submitBtn.data('original-text', originalText); + } + submitBtn.html(originalText); + } +} + /* Function: reset_fields is used to reset the fields on the QSO page */ function reset_fields() { + // Reset submission state + resetSubmissionState(); $('#locator_info').text(""); $('#country').val("");