From 966d3f765450c4a1505aee7b9d86826afec6ad82 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Tue, 29 Sep 2020 14:39:07 -0400 Subject: [PATCH] fix: early button/anchor clicks do nothing This solves a small UX issue where clicking on a button (or anchor that is not meant to be ajaxified) before ajaxify.end is called leads to nothing happening because the appropriate click handler has not been added. This code will intercept premature clicks, wait until ajaxify.end is called, and then re-send the click. --- public/src/app.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/public/src/app.js b/public/src/app.js index ed25c592d9..1b987757b9 100644 --- a/public/src/app.js +++ b/public/src/app.js @@ -17,6 +17,32 @@ app.cacheBuster = null; app.cacheBuster = config['cache-buster']; + /** + * Occasionally, a button or anchor (not meant to be ajaxified) is clicked before + * ajaxify is ready. Capture that event and re-click it once NodeBB is ready. + * + * e.g. New Topic/Reply, post tools + */ + var earlyQueue = []; // once we can ES6, use Set instead + var earlyClick = function (ev) { + var btnEl = ev.target.closest('button'); + if (!btnEl && ev.target.closest('a') && ev.target.closest('a').getAttribute('data-ajaxify') === 'false') { + btnEl = ev.target.closest('a'); + } + if (btnEl && !earlyQueue.includes(btnEl)) { + earlyQueue.push(btnEl); + ev.stopImmediatePropagation(); + ev.preventDefault(); + } + }; + document.body.addEventListener('click', earlyClick); + $(window).on('action:ajaxify.end', function () { + document.body.removeEventListener('click', earlyClick); + earlyQueue.forEach(function (el) { + el.click(); + }); + }); + bootbox.setDefaults({ locale: config.userLang, });