feat: ramène à la vue d'où l'on vient une fois le document enregistré

Éditer une ligne depuis Dépenses ou Recettes ouvrait le document, puis
relâchait sur la liste des documents : il fallait revenir à la page
d'analyse et refaire ses filtres à la main pour corriger la ligne suivante.

Les deux tables passent maintenant à l'éditeur la vue d'où l'on part,
filtres compris, et il y ramène à ses trois sorties : enregistrement
terminé, abandon, et document introuvable. Sans cette destination — depuis
la liste des documents, ou un lien direct — le repli reste la liste.

La destination arrive par l'URL, donc fabricable par n'importe qui : seule
une page de l'application est suivie (utils/retour.js). Une URL absolue, un
chemin protocol-relatif que le navigateur lirait comme un domaine, ou des
contre-slashs retombent sur le repli.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-22 18:27:13 +02:00
parent 78b9bbf129
commit faab7173bd
5 changed files with 102 additions and 5 deletions

View File

@@ -0,0 +1,22 @@
// Une table d'analyse envoie vers l'editeur de document la page ou revenir une
// fois l'enregistrement termine, filtres compris. Cette destination arrive par
// l'URL : elle est donc fabricable par n'importe qui, et n'est suivie que si
// elle designe une page de l'application.
/**
* La destination de retour portee par une query, ou `repli` si elle manque ou
* ne designe pas un chemin interne.
*
* Sont refuses tout ce qui peut sortir du site : une URL absolue
* (`https://ailleurs`), un chemin protocol-relatif (`//ailleurs`) que le
* navigateur traite comme un domaine, et les contre-slashs dont certains
* navigateurs font des slashs.
*/
export function cheminRetour(brut, repli = '/documents') {
const valeur = Array.isArray(brut) ? brut[0] : brut
if (typeof valeur !== 'string' || valeur === '') return repli
if (!valeur.startsWith('/')) return repli
if (valeur.startsWith('//')) return repli
if (valeur.includes('\\')) return repli
return valeur
}