++ dopo un'operazione si torna alla pagina di partenza, con i suoi filtri
- Gli elenchi tengono ricerca, filtri e ordinamento nell'indirizzo (#[Url]); la pagina c'era già. - I link verso schede e operazioni (data-ritorno) portano ?da= con la pagina di partenza, o il da già ricevuto: si risale all'origine (elenco -> scheda -> Rientra -> elenco filtrato). - Ritorno::valida accetta solo percorsi interni: niente rimandi esterni. - Trait RicordaRitorno: redirect dopo il salvataggio, Annulla e "Torna indietro" usano la pagina di partenza. Senza da, tutto come prima. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1 +1,34 @@
|
||||
import './bootstrap';
|
||||
|
||||
// ─── Ritorno alla pagina di partenza ────────────────────────────────────────
|
||||
//
|
||||
// I link con data-ritorno (schede e operazioni) portano con sé ?da=<percorso>:
|
||||
// la pagina di partenza con i suoi filtri, oppure il `da` che la pagina
|
||||
// corrente aveva già ricevuto, così si risale sempre all'origine del percorso
|
||||
// (elenco → scheda → Rientra → torna all'elenco). Il server lo valida e lo usa
|
||||
// dopo conferma o annulla: App\Support\Ritorno, trait RicordaRitorno.
|
||||
//
|
||||
// Si calcola al momento dell'uso e non al caricamento: filtri e pagina degli
|
||||
// elenchi cambiano l'indirizzo (#[Url] di Livewire) senza ricaricare.
|
||||
|
||||
function ritornoCorrente() {
|
||||
const qui = new URL(window.location.href);
|
||||
return qui.searchParams.get('da') || (qui.pathname + qui.search);
|
||||
}
|
||||
|
||||
function aggiornaLink(link) {
|
||||
const destinazione = new URL(link.getAttribute('href'), window.location.origin);
|
||||
if (destinazione.origin !== window.location.origin) return;
|
||||
destinazione.searchParams.set('da', ritornoCorrente());
|
||||
link.setAttribute('href', destinazione.pathname + destinazione.search + destinazione.hash);
|
||||
}
|
||||
|
||||
// Fase di cattura: si arriva prima di wire:navigate, che legge l'href al
|
||||
// pointerdown (precaricamento) e al click. contextmenu e focusin coprono
|
||||
// "apri in una nuova scheda" e la tastiera.
|
||||
['pointerdown', 'click', 'contextmenu', 'focusin'].forEach((evento) => {
|
||||
document.addEventListener(evento, (e) => {
|
||||
const link = e.target instanceof Element ? e.target.closest('a[data-ritorno][href]') : null;
|
||||
if (link) aggiornaLink(link);
|
||||
}, true);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user