Files
ObsiGate/docs/features/navigation-tab-158.md
T
bruno a50227849d
CI / lint (push) Successful in 2m46s
CI / security (push) Successful in 1m57s
CI / build (push) Canceled after 0s
CI / e2e (push) Canceled after 0s
CI / test (push) Canceled after 1h50m30s
feat: onglet de navigation avec facettes, tris et retour Home complet #158
- 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
2026-10-02 12:27:27 -04:00

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 — voir navfacets.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) : tags exposés + survivent au response_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.js ajouté à la liste des modules purs.