- clic sur un repertoire de l'arbre (modes focus vault et All) ouvre un onglet de navigation dedie qui coexiste avec les onglets de fichiers ouverts
- vue: sous-repertoires cliquables, facettes Vaults/Tags/Extensions (meme mecanisme que la recherche), tris Pertinence/Date, bouton Sauver; tags indexes exposes par GET /api/vault/{v}/files
- BUG-100: showWelcome re-injecte la section Raccourcis & Astuces et goHome efface la recherche globale + le filtre de la sidebar
3.5 KiB
#158 — Navigation : vue répertoire en onglet, filtres & tris, retour Home complet
Statut : livré le 2026-10-02 · ID :
#158(correctif associé :BUG-100) Fichiers :frontend/js/vaulthome.js,frontend/js/ui.js,frontend/js/sidebar.js,frontend/js/navfacets.js(nouveau),frontend/js/viewer.js,frontend/js/legacy.js,backend/services/vaults.py,backend/schemas.py,frontend/style.css,frontend/locales/{fr,en}.json
Problème
La vue « chemin + Récents + fichiers du répertoire » (vault home) ne s'affichait qu'en mode focus vault, disparaissait dès qu'un fichier était ouvert (aucun onglet), ne listait pas les sous-répertoires, n'avait ni filtre ni tri, et le clic sur le titre ne rendait pas la vraie page d'accueil.
Conception
Un onglet de navigation par vault. TabManager.openNav(vault, dir) (frontend/js/ui.js)
crée/rétarget l'onglet nav::<vault> (icône dossier) ; TabManager.activate() branche sur
cache.nav et rend showVaultHome(vault, dir) au lieu de fetcher un fichier. Les onglets de
fichiers ne sont jamais fermés. Le dashboard appelle TabManager.deactivate() : aucun onglet
ne reste « actif », donc un clic suivant ré-éffectue réellement l'onglet (avant : early-return
et vue figée).
Points d'entrée des clics (frontend/js/sidebar.js) : clic répertoire dans l'arbre (2 sites,
mode focus et mode All), changement de contexte vault (sélecteur), facettes/filtres et fil
d'Ariane de la vue (vaulthome.js route tout par openNav, plus aucune délégation sur
l'arbre). La ligne d'un vault garde son rôle d'expansion seul : un onglet de navigation à
l'ouverture d'un vault casserait les compteurs d'onglets et « fermer le dernier onglet →
dashboard » (13 tests E2E split-view*).
Contenu de la vue (vaulthome.js) : fil d'Ariane · barre Pertinence / Date + Sauver
· panneau de facettes · Répertoires cliquables (GET /api/browse) · Récents (racine) ·
fichiers (GET /api/vault/{v}/files?recursive=false). Les facettes réutilisent les classes de
la page de recherche (search-facets, search-sort, search-save-btn) — même visuel, même
repli obsigate_facets_collapsed, filtrage local (pas de nouvelle requête).
Facettes (frontend/js/navfacets.js, pur, sans DOM) : buildNavFacets,
filterNavFiles, sortNavFiles. Le listing embarque les tags indexés :
GET /api/vault/{v}/files renvoie tags (_indexed_tags() dans
backend/services/vaults.py, lookup vault::path dans l'index inversé, [] si non indexé).
Décisions / limites connues
- Un seul onglet de navigation par vault : cliquer un autre répertoire re-cible le même onglet (pas d'empilement d'onglets). En mode split, la vue s'affiche dans la zone principale.
- « Pertinence » = tri alphabétique (
ponytail:commenté) : un listing de répertoire n'a aucun signal de pertinence tant que la vue n'a pas sa propre requête — voirnavfacets.js::sortNavFiles. - Facettes calculées sur la liste courante (répertoire non récursif, 200 fichiers max) : les sous-répertoires non listés n'apportent aucune compte.
Tests
tests/test_nav_files.py(3) :tagsexposés + survivent auresponse_model, tags en sous-répertoire, miss d'index →[].tests/frontend/navfacets.test.mjs(10) : comptages, filtres tag/ext (insensible au point), combinaison ET, tris, non-mutation.tests/frontend/unit.test.mjs:navfacets.jsajouté à la liste des modules purs.