feat(sidebar+assistant): filtre Recents/Sauvegardes (#99), pastille Deep Research (#100) et icone du bouton + (BUG-049)
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# #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.
|
||||
Reference in New Issue
Block a user