diff --git a/public/userarea/gridFilter.js b/public/userarea/gridFilter.js index 389a194..201c61d 100644 --- a/public/userarea/gridFilter.js +++ b/public/userarea/gridFilter.js @@ -391,24 +391,36 @@ } // ── Ripristina stato filtri dopo un re-render (checkbox + restrizione) ── + let _restoring = false; function restoreFilterState() { - if (!filtersActive) return; - injectCheckboxes(); - applyVisibility(); // ri-applica sia filtri colonna sia restringi selezione + if (!filtersActive || _restoring) return; + _restoring = true; // evita loop con l'observer mentre iniettiamo/nascondiamo + try { + injectCheckboxes(); + applyVisibility(); // ri-applica filtri colonna E restringi selezione + } finally { + // rilascia dopo il tick così le nostre mutazioni non ci ri-triggerano subito + setTimeout(() => { + _restoring = false; + }, 0); + } } - // ── Re-inietta dopo ogni re-render della griglia ── + // ── Observer: qualunque cosa ricrei le righe (propagazione, save, ecc.) + // ripristina automaticamente checkbox + restrizione. Robusto perché + // non dipende da chi chiama renderVisibleRows. ── function hookRerender() { - const orig = R().renderVisibleRows; - R().renderVisibleRows = function () { - const ret = orig.apply(this, arguments); - // sincrono - restoreFilterState(); - // e di nuovo dopo il tick, per coprire re-render dentro .then() async - setTimeout(restoreFilterState, 0); - setTimeout(restoreFilterState, 50); - return ret; - }; + const rowC = document.getElementById("gridRowContainer"); + if (!rowC) return; + + const obs = new MutationObserver(() => { + if (!filtersActive || _restoring) return; + // debounce leggero: aspetta che il render finisca + clearTimeout(hookRerender._t); + hookRerender._t = setTimeout(restoreFilterState, 30); + }); + + obs.observe(rowC, { childList: true }); } function init() {