From 74836d57eb8d5056000ef5dcc24e2f522ae80b05 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Thu, 1 Jan 2026 17:15:18 +0100 Subject: [PATCH] Auto-commit local changes before build (2026-01-01 17:15:18) --- .last-branch | 2 +- .../src/templates/main/run_checks.html | 37 +++++++++++++++---- docs/changelog.md | 7 ++++ 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/.last-branch b/.last-branch index 093e0ca..2b5807b 100644 --- a/.last-branch +++ b/.last-branch @@ -1 +1 @@ -v20260101-07-run-checks-shift-multiselect-delegation-fix +v20260101-08-run-checks-shift-multiselect-persist diff --git a/containers/backupchecks/src/templates/main/run_checks.html b/containers/backupchecks/src/templates/main/run_checks.html index 8eb2235..675be3c 100644 --- a/containers/backupchecks/src/templates/main/run_checks.html +++ b/containers/backupchecks/src/templates/main/run_checks.html @@ -289,7 +289,12 @@ // Shift-click range selection for checkbox rows var lastCheckedCb = null; - function statusClass(status) { + + + // Track checkbox state before click to avoid double-toggle issues across browsers + var lastMouseDownCb = null; + var lastMouseDownChecked = null; +function statusClass(status) { var s = (status || "").toString().toLowerCase(); // Allow derived display strings like "Success (override)" @@ -376,10 +381,17 @@ table.addEventListener('mousedown', function (e) { var t = e.target; if (!t) return; - if (t.classList && t.classList.contains('rc_row_cb') && e.shiftKey) { - e.preventDefault(); - if (window.getSelection) { - try { window.getSelection().removeAllRanges(); } catch (err) {} + + if (t.classList && t.classList.contains('rc_row_cb')) { + // Remember state before click so Shift-click logic can reliably compute the intended target state + lastMouseDownCb = t; + lastMouseDownChecked = t.checked; + + if (e.shiftKey) { + e.preventDefault(); + if (window.getSelection) { + try { window.getSelection().removeAllRanges(); } catch (err) {} + } } } }, true); @@ -395,9 +407,15 @@ table.addEventListener('click', function (e) { e.stopPropagation(); // The default action would toggle the checkbox; do it manually - var targetChecked = !t.checked; + // Use the remembered pre-click state to avoid double toggling in some browsers + var preChecked = (lastMouseDownCb === t ? lastMouseDownChecked : t.checked); + var targetChecked = !preChecked; t.checked = targetChecked; + // Reset mousedown tracking once we've consumed it + lastMouseDownCb = null; + lastMouseDownChecked = null; + var cbs = Array.prototype.slice.call(table.querySelectorAll('tbody .rc_row_cb')); var start = cbs.indexOf(lastCheckedCb); var end = cbs.indexOf(t); @@ -422,7 +440,12 @@ table.addEventListener('click', function (e) { // Normal click: let default toggle happen, but remember the last checkbox lastCheckedCb = t; - // Defer update until after the checkbox state changes + + + // Reset mousedown tracking + lastMouseDownCb = null; + lastMouseDownChecked = null; +// Defer update until after the checkbox state changes setTimeout(updateButtons, 0); }, true); diff --git a/docs/changelog.md b/docs/changelog.md index 9c77e53..48c9412 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -151,6 +151,13 @@ - Disabled default browser text selection when using Shift during checkbox interaction. - Applied Gmail-style range selection logic for consistent multi-row selection behavior. +--- + +## v20260101-08-run-checks-shift-multiselect-selection-retain + +- Fixed Shift-click multi-select on the Run Checks page so the initial checkbox selection is preserved when selecting additional rows with Shift. +- Made Shift range selection use the checkbox pre-click state to prevent unintended double-toggles across browsers. + ================================================================================================================================================ ## v0.1.14 -- 2.45.2