From 058d7181164580cbf99666487bb5effdcc200886 Mon Sep 17 00:00:00 2001 From: Pier-Jean Malandrino Date: Wed, 29 Apr 2026 17:45:14 +0200 Subject: [PATCH] feat(#209): rework sidebar nav (Home / Docs / Stores / Runs / Settings) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The sidebar was the project's actual nav (the design doc called it 'top nav' but the existing app is sidebar-driven). Five entries reflecting the doc-centric IA replace the seven analysis-centric ones. Sidebar - shared/ui/AppSidebar.vue: data-driven over a NavItem[] table instead of seven hard-coded RouterLinks. Inline SVG icon components keep the visual weight close to the previous version with no new dependency. - Five entries: Home / Docs (★ primary, bolder label) / Stores / Runs / Settings. - Active state via matchesActive(path, prefixes): exact match for Home, prefix match (with segment / query boundary) for the others. Pure helper in shared/ui/navActive.ts, unit tested. Removed from the sidebar (legacy pages still reachable by URL): Studio, Documents, Search, Reasoning, History. i18n - nav.docs / nav.stores / nav.runs added in fr + en, grouped under the 0.6.0 nav block. - Legacy nav labels (nav.studio / nav.documents / nav.history / nav.reasoning / nav.search) kept — the legacy pages still render headings using them. Duplicate nav.search entries removed (the key now lives once per locale, in the nav block). Tests - shared/ui/navActive.test.ts (5 cases): exact-match for Home, prefix boundary semantics, multi-prefix matching, empty list edge. Refs #209 --- frontend/src/shared/i18n.ts | 31 +++- frontend/src/shared/ui/AppSidebar.vue | 226 ++++++++++++----------- frontend/src/shared/ui/navActive.test.ts | 33 ++++ frontend/src/shared/ui/navActive.ts | 22 +++ 4 files changed, 194 insertions(+), 118 deletions(-) create mode 100644 frontend/src/shared/ui/navActive.test.ts create mode 100644 frontend/src/shared/ui/navActive.ts diff --git a/frontend/src/shared/i18n.ts b/frontend/src/shared/i18n.ts index 63db0fd..e9fca0c 100644 --- a/frontend/src/shared/i18n.ts +++ b/frontend/src/shared/i18n.ts @@ -6,15 +6,22 @@ type Messages = Record const messages: Messages = { fr: { - // Sidebar + // Sidebar — 0.6.0 doc-centric nav (#209) 'nav.home': 'Accueil', + 'nav.docs': 'Documents', + 'nav.stores': 'Stores', + 'nav.runs': 'Runs', + 'nav.settings': 'Paramètres', + 'nav.collapse': 'Réduire la barre latérale', + 'nav.expand': 'Développer la barre latérale', + // Legacy nav labels — kept because the legacy pages (/studio, /documents, + // /history, /search, /reasoning) still render headings using them. They + // are no longer surfaced in the sidebar. 'nav.studio': 'Studio', 'nav.documents': 'Documents', 'nav.history': 'Historique', 'nav.reasoning': 'Raisonnement', - 'nav.settings': 'Paramètres', - 'nav.collapse': 'Réduire la barre latérale', - 'nav.expand': 'Développer la barre latérale', + 'nav.search': 'Recherche', // Top bar 'topbar.newAnalysis': 'Nouvelle analyse', @@ -251,8 +258,7 @@ const messages: Messages = { 'chunking.batchNotice': 'Le chunking n\u2019est pas disponible pour cette analyse. Les documents volumineux trait\u00e9s par batch ne g\u00e9n\u00e8rent pas la structure interne n\u00e9cessaire au d\u00e9coupage. Coming soon !', - // Search - 'nav.search': 'Recherche', + // Search (legacy nav label moved to the top with the other legacy keys) 'search.hint': 'Saisissez un terme pour rechercher dans les chunks indexés.', // Ingestion / My Documents @@ -303,14 +309,20 @@ const messages: Messages = { 'Instance de d\u00e9monstration \u2014 les documents upload\u00e9s sont partag\u00e9s et temporaires (max {n} Mo). Ne pas envoyer de fichiers confidentiels.', }, en: { + // Sidebar — 0.6.0 doc-centric nav (#209) 'nav.home': 'Home', + 'nav.docs': 'Docs', + 'nav.stores': 'Stores', + 'nav.runs': 'Runs', + 'nav.settings': 'Settings', + 'nav.collapse': 'Collapse sidebar', + 'nav.expand': 'Expand sidebar', + // Legacy nav labels — kept because legacy pages still use them. 'nav.studio': 'Studio', 'nav.documents': 'Documents', 'nav.history': 'History', 'nav.reasoning': 'Reasoning', - 'nav.settings': 'Settings', - 'nav.collapse': 'Collapse sidebar', - 'nav.expand': 'Expand sidebar', + 'nav.search': 'Search', 'topbar.newAnalysis': 'New analysis', @@ -537,7 +549,6 @@ const messages: Messages = { 'chunking.batchNotice': 'Chunking is not available for this analysis. Large documents processed in batch mode do not generate the internal structure required for chunking. Coming soon!', - 'nav.search': 'Search', 'search.hint': 'Enter a term to search through indexed chunks.', 'ingestion.ingest': 'Ingest', diff --git a/frontend/src/shared/ui/AppSidebar.vue b/frontend/src/shared/ui/AppSidebar.vue index d0581e9..6814df6 100644 --- a/frontend/src/shared/ui/AppSidebar.vue +++ b/frontend/src/shared/ui/AppSidebar.vue @@ -2,113 +2,15 @@