diff --git a/CHANGES.rst b/CHANGES.rst index 718368a9..77d731a8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -27,6 +27,7 @@ Bugfixes & Improvements - Prevent auto creation of invalid links in comments (`#995`_, pkvach) - Fix W3C Validation issues (`#999`_, pkvach) - Handle deleted comments in Disqus migration (`#994`_, pkvach) +- Disable Postbox submit button on click, enable after response (`#993`_, pkvach) .. _#951: https://github.com/posativ/isso/pull/951 .. _#967: https://github.com/posativ/isso/pull/967 @@ -34,6 +35,7 @@ Bugfixes & Improvements .. _#995: https://github.com/isso-comments/isso/pull/995 .. _#999: https://github.com/isso-comments/isso/pull/999 .. _#994: https://github.com/isso-comments/isso/pull/994 +.. _#993: https://github.com/isso-comments/isso/pull/993 0.13.1.dev0 (2023-02-05) ------------------------ diff --git a/isso/js/app/isso.js b/isso/js/app/isso.js index fbf958a3..84f16175 100644 --- a/isso/js/app/isso.js +++ b/isso/js/app/isso.js @@ -92,34 +92,50 @@ var Postbox = function(parent) { // submit form, initialize optional fields with `null` and reset form. // If replied to a comment, remove form completely. - $("[type=submit]", el).on("click", function() { + $("[type=submit]", el).on("click", function(event) { edit(); if (! el.validate()) { return; } + const submitButton = event.target; + submitButton.disabled = true; // Disable the submit button to prevent double posting + var author = $("[name=author]", el).value || null, email = $("[name=email]", el).value || null, website = $("[name=website]", el).value || null; - localStorage.setItem("isso-author", JSON.stringify(author)); - localStorage.setItem("isso-email", JSON.stringify(email)); - localStorage.setItem("isso-website", JSON.stringify(website)); - - api.create($("#isso-thread").getAttribute("data-isso-id"), { - author: author, email: email, website: website, - text: $(".isso-textarea", el).value, - parent: parent || null, - title: $("#isso-thread").getAttribute("data-title") || null, - notification: $("[name=notification]", el).checked() ? 1 : 0, - }).then(function(comment) { - $(".isso-textarea", el).value = ""; - insert(comment, true); - - if (parent !== null) { - el.onsuccess(); - } - }); + try { + localStorage.setItem("isso-author", JSON.stringify(author)); + localStorage.setItem("isso-email", JSON.stringify(email)); + localStorage.setItem("isso-website", JSON.stringify(website)); + + api.create($("#isso-thread").getAttribute("data-isso-id"), { + author: author, email: email, website: website, + text: $(".isso-textarea", el).value, + parent: parent || null, + title: $("#isso-thread").getAttribute("data-title") || null, + notification: $("[name=notification]", el).checked() ? 1 : 0, + }).then( + function(comment) { + $(".isso-textarea", el).value = ""; + insert(comment, true); + + if (parent !== null) { + el.onsuccess(); + } + + submitButton.disabled = false; + }, + function(err) { + console.error(err); + submitButton.disabled = false; + } + ); + } catch (err) { + console.error(err); + submitButton.disabled = false; + } }); return el; diff --git a/isso/js/tests/integration/highlight-comments.test.js b/isso/js/tests/integration/highlight-comments.test.js index 0e176c11..4f21cbe9 100644 --- a/isso/js/tests/integration/highlight-comments.test.js +++ b/isso/js/tests/integration/highlight-comments.test.js @@ -40,6 +40,7 @@ test('Linked should be highlighted', async () => { // Cleanup // Need to click once to surface "confirm" and then again to confirm + await page.waitForSelector('#isso-1 > .isso-text-wrapper > .isso-comment-footer > .isso-delete'); await expect(page).toClick('#isso-1 > .isso-text-wrapper > .isso-comment-footer > .isso-delete'); await expect(page).toClick('#isso-1 > .isso-text-wrapper > .isso-comment-footer > .isso-delete'); }); diff --git a/isso/js/tests/integration/puppet.test.js b/isso/js/tests/integration/puppet.test.js index e77070be..e903b968 100644 --- a/isso/js/tests/integration/puppet.test.js +++ b/isso/js/tests/integration/puppet.test.js @@ -148,6 +148,8 @@ test("should fill Postbox with valid data and receive 201 reply", async () => { await expect(elm.replace(//, '