From 78b9bbf1292f25e45e4f3a9e0ef383c2588bd1d6 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Sat, 22 Aug 2026 18:27:01 +0200 Subject: [PATCH] feat: fait vivre les filtres d'analyse dans l'URL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les filtres des pages Dépenses et Recettes n'existaient que dans l'état du composant : recharger la page les perdait, et une vue filtrée ne pouvait ni se partager, ni se mettre en signet, ni servir de destination à un lien. Chaque page déclare desormais comment ses filtres se lisent et s'écrivent dans la query (utils/filtresUrl.js). Ce qui vaut sa valeur par défaut n'est pas écrit : l'URL ne porte que ce qui a été choisi, et reste lisible. Ce qui en arrive est validé — un identifiant qui n'est pas un entier ou une date au mauvais format est ignoré plutôt qu'affiché de travers. Le changement de filtre remplace l'entrée d'historique au lieu d'en empiler une : le bouton Retour du navigateur quitte la page, il ne défait pas les filtres un par un. Côté Dépenses, la requête API dérive de cette même écriture : les paramètres sont les mêmes des deux côtés, la vue et la requête ne peuvent plus diverger. Co-Authored-By: Claude Opus 5 --- .../src/components/analytics/FilterPanel.vue | 8 +- .../components/revenus/RevenusFilterPanel.vue | 30 ++-- frontend/src/pages/AnalyticsPage.vue | 50 +++--- frontend/src/pages/RevenusPage.vue | 53 ++++--- frontend/src/utils/filtresUrl.js | 143 ++++++++++++++++++ frontend/tests/filtresUrl.test.js | 99 ++++++++++++ 6 files changed, 320 insertions(+), 63 deletions(-) create mode 100644 frontend/src/utils/filtresUrl.js create mode 100644 frontend/tests/filtresUrl.test.js diff --git a/frontend/src/components/analytics/FilterPanel.vue b/frontend/src/components/analytics/FilterPanel.vue index ccd349e..55a510c 100644 --- a/frontend/src/components/analytics/FilterPanel.vue +++ b/frontend/src/components/analytics/FilterPanel.vue @@ -120,6 +120,11 @@ import { ref, reactive, computed, onMounted } from 'vue' import SelectionMultiple from '../SelectionMultiple.vue' +const props = defineProps({ + /** Etat de depart, tel que la page l'a lu dans l'URL. */ + filtresInitiaux: { type: Object, default: null } +}) + const emit = defineEmits(['filter-change']) /** Valeur de tag_id demandant les depenses sans tag (cf. SANS_TAG cote API). */ @@ -140,7 +145,8 @@ const filters = reactive({ tag_id: null, fournisseurs: [], date_debut: null, - date_fin: null + date_fin: null, + ...(props.filtresInitiaux ?? {}) }) /** Ordre alphabetique - l'API les trie par montant, ce qui se lit bien dans un diff --git a/frontend/src/components/revenus/RevenusFilterPanel.vue b/frontend/src/components/revenus/RevenusFilterPanel.vue index 67887b8..776bde2 100644 --- a/frontend/src/components/revenus/RevenusFilterPanel.vue +++ b/frontend/src/components/revenus/RevenusFilterPanel.vue @@ -101,25 +101,19 @@