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:
36
frontend/tests/retour.test.js
Normal file
36
frontend/tests/retour.test.js
Normal file
@@ -0,0 +1,36 @@
|
||||
// La destination de retour arrive par l'URL : elle est fabricable par
|
||||
// n'importe qui, et un lien pieges ne doit pas pouvoir renvoyer l'utilisateur
|
||||
// hors du site apres un enregistrement.
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { cheminRetour } from '../src/utils/retour.js'
|
||||
|
||||
describe('cheminRetour', () => {
|
||||
it('rend la page d analyse avec ses filtres', () => {
|
||||
const vue = '/analytics?immeuble_id=3&fournisseur=PPR&tag_id=0'
|
||||
|
||||
expect(cheminRetour(vue)).toBe(vue)
|
||||
})
|
||||
|
||||
it('retombe sur la liste des documents quand rien n est demande', () => {
|
||||
expect(cheminRetour(undefined)).toBe('/documents')
|
||||
expect(cheminRetour('')).toBe('/documents')
|
||||
})
|
||||
|
||||
it('refuse ce qui sortirait du site', () => {
|
||||
// `//ailleurs.example` est un chemin protocol-relatif : le navigateur y lit
|
||||
// un domaine, pas une page de l'application.
|
||||
expect(cheminRetour('https://ailleurs.example')).toBe('/documents')
|
||||
expect(cheminRetour('//ailleurs.example')).toBe('/documents')
|
||||
expect(cheminRetour('/\\ailleurs.example')).toBe('/documents')
|
||||
expect(cheminRetour('analytics')).toBe('/documents')
|
||||
})
|
||||
|
||||
it('accepte le repli que l appelant lui donne', () => {
|
||||
expect(cheminRetour(null, '/revenus')).toBe('/revenus')
|
||||
})
|
||||
|
||||
it('ne retient que la premiere valeur quand le parametre est repete', () => {
|
||||
expect(cheminRetour(['/analytics', 'https://ailleurs.example'])).toBe('/analytics')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user