- 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>
35 lines
1.7 KiB
JavaScript
35 lines
1.7 KiB
JavaScript
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);
|
|
});
|