# #99 — Barre de filtrage de la sidebar sur « Récents » et « Sauvegardes » > **Statut :** ✅ livré · **Version :** 2.6.0 · **ID :** #99 > **Lié :** BUG-049 (icône du bouton « + » de l'assistant), #100 (pastille Deep Research). ## Contexte La barre de recherche/filtrage de la sidebar (`#sidebar-filter-input`) agissait historiquement sur les onglets **Fichiers** (arborescence) et **Tags**. L'onglet **Historique IA** a reçu son propre filtrage en #98. Les onglets **Récents** et **Sauvegardes** (« saved searches ») n'étaient pas couverts : taper dans la barre n'avait aucun effet dans ces deux vues. ## A. Onglet « Récents » — ✅ livré - Nouveau cache module `_recentQuery` et fonction exportée `filterRecentFiles(query)` (`frontend/js/config.js`). - `_applyRecentFilter(files)` filtre le cache `_recentFilesCache` sur **titre, chemin, vault, aperçu et tags**, via `_sidebarNorm()` (normalisation `NFD` + suppression des diacritiques + minuscules) — donc insensible à la casse **et** aux accents. - `loadRecentFiles()` applique désormais le filtre courant après chaque chargement. - Aucun résultat → un message `sidebar.no_results` est inséré dans `#recent-list` (classe `.sidebar-filter-empty`, style existant). - `switchSidebarTab("recent")` applique la requête courante et pose le placeholder `sidebar.filter_recent`. ## B. Onglet « Sauvegardes » — ✅ livré - Nouveau `_savedQuery` et fonction exportée `filterSavedSearches(query)` (`frontend/js/viewer.js`). - `_applySavedFilter()` combine désormais **le filtre de type** (pills Tous / Recherches / Répertoires) **et la requête texte** : un élément est visible si son `data-type` correspond au pill **et** si son texte (requête, vault, chemins inclus/exclus) contient la requête normalisée (`_savedNorm`). - Aucun résultat avec une requête active → message `sidebar.no_results` ajouté à `#saved-searches-list` (nettoyé à chaque ré-application pour ne pas s'accumuler). - `switchSidebarTab("saved")` ré-applique la requête et pose le placeholder `sidebar.filter_saved`. ## C. Routage unifié de la barre de filtrage — ✅ livré `initSidebarFilter()` (`frontend/js/sidebar.js`) est refactorisé autour de deux fonctions `routeFilter(q)` / `routeClear()` qui dirigent la saisie, la bascule casse (`Aa`) et le bouton « × » vers le filtre de l'onglet actif : | Onglet | Filtre | |---|---| | `vaults` | `performTreeSearch` / `restoreSidebarTree` | | `recent` | `filterRecentFiles` | | `saved` | `filterSavedSearches` | | `ai` | `filterAIHistory` | | `tags` | `filterTagCloud` | ## D. i18n — ✅ livré - `sidebar.filter_recent` : « Filtrer les fichiers récents... » / "Filter recent files..." - `sidebar.filter_saved` : « Filtrer les recherches sauvegardées... » / "Filter saved searches..." - Le message d'absence de résultat réutilise `sidebar.no_results`. ## E. Tests — ✅ livré - `tests/frontend/sidebar-filters.test.mjs` (nouveau, 8 tests) : rendu des listes, filtrage par titre/casse, accents/tags, vault/chemin, restauration, message d'absence de résultat, et combinaison pill + requête sur les sauvegardes. - Ajouté à la liste explicite du job `lint` de `.gitea/workflows/ci.yml`. ## F. Points d'attention - Le filtrage est **client-side** (les listes sont déjà chargées) : aucune requête réseau supplémentaire n'est déclenchée par la frappe. - Sur « Sauvegardes », le filtre de type et la requête sont **cumulatifs** ; vider la barre (ou « × ») ne réinitialise pas le pill actif.