feat(5.9): US-005 - poll-guard modal/bife pe trigger periodic
- base.html: listener htmx:beforeRequest scopat la #submissions-wrap care anuleaza (preventDefault) DOAR poll-ul periodic (fara requestConfig.triggeringEvent) cat timp modalul de detaliu e deschis SAU exista checkbox de bulk bifat. - F5/R6: trimiteriChanged si submit-ul de filtru au triggeringEvent -> trec mereu, deci pauza nu ramane lipita permanent daca randul bifat paraseste filtrul. - Resume automat (anularea nu opreste timer-ul htmx) + resume explicit pe checkbox change via delegare pe body -> trimiteriChanged from:body (pastreaza filtrul). - Vechea pauza pe „rand expandat" (5.8) era deja inlocuita de modalul global (US-003). - 3 teste noi in tests/test_web_modal.py; suita 843 passed, 1 deselected. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -646,5 +646,47 @@
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script>
|
||||
// Poll-guard (PRD 5.9 US-005, R6). Inlocuieste vechea pauza pe „rand expandat" (5.8):
|
||||
// randul-sibling de detaliu nu mai exista (US-003 l-a mutat in modalul global, care
|
||||
// traieste in afara #submissions-wrap -> un swap de poll nu-l atinge). Aici oprim
|
||||
// poll-ul de 15s de a REINCARCA lista cat timp (a) modalul e deschis SAU (b) exista
|
||||
// cel putin un checkbox de bulk bifat — altfel modalul s-ar reseta / bifele s-ar sterge.
|
||||
//
|
||||
// CRITIC (F5): blocam DOAR trigger-ul periodic. In htmx `load`/`every 15s` declanseaza
|
||||
// requestul FARA `triggeringEvent`; `trimiteriChanged` (HX-Trigger dupa corectie/stergere)
|
||||
// si submit-ul/filtrul AU `triggeringEvent` -> TREC MEREU. Asa evitam blocajul permanent:
|
||||
// daca randul bifat paraseste filtrul, pauza nu ramane lipita (pauza e legata strict de
|
||||
// trigger-ul periodic, nu de o stare „sticky"). Anularea unui `htmx:beforeRequest` NU
|
||||
// opreste timer-ul htmx (se reprogrameaza singur) -> poll-ul reia automat la urmatorul
|
||||
// tic cand ambele conditii dispar; nu se pierde scroll, focus sau selectia de bife.
|
||||
(function() {
|
||||
function modalDeschis() {
|
||||
var o = document.getElementById('modal-detaliu');
|
||||
return !!(o && !o.hidden);
|
||||
}
|
||||
function existaBifa() {
|
||||
return !!document.querySelector('#submissions-wrap input[name="submission_id"]:checked');
|
||||
}
|
||||
document.body.addEventListener('htmx:beforeRequest', function(evt) {
|
||||
var d = evt.detail || {};
|
||||
if (!d.elt || d.elt.id !== 'submissions-wrap') return; // doar poll-ul listei
|
||||
var rc = d.requestConfig || {};
|
||||
if (rc.triggeringEvent) return; // trimiteriChanged / filtru: TREC MEREU
|
||||
if (modalDeschis() || existaBifa()) evt.preventDefault(); // pauza scopata pe periodic
|
||||
});
|
||||
// Resume pe checkbox `change`->gol: delegare pe body ca sa prinda si checkbox-urile
|
||||
// randate dupa swap. Cand modalul e inchis si nu mai exista nicio bifa, fortam un
|
||||
// refresh imediat (nu mai asteptam ticul de 15s) prin `trimiteriChanged from:body`,
|
||||
// care pastreaza filtrul curent (hx-include #filtre-trimiteri) si trece de guard.
|
||||
document.body.addEventListener('change', function(evt) {
|
||||
var t = evt.target;
|
||||
if (!(t && t.name === 'submission_id')) return;
|
||||
if (!modalDeschis() && !existaBifa() && window.htmx) {
|
||||
htmx.trigger(document.body, 'trimiteriChanged');
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user