- Barre de filtres avec 3 pills: Tous, Recherches, Repertoires
- Chaque saved-search-item a data-type=search|directory
- _applySavedFilter() masque/affiche selon le filtre actif
- _initSavedFilter() initialise les listeners (run once)
- Extensible: ajouter un pill + data-type suffit
- Gere l'etat empty quand aucun resultat pour le filtre
- Recherche classique: icone search (loupe) grise a droite
- Recherche repertoire: icone folder-search bleue a droite
- Icones dans .saved-search-meta, poussees a droite via margin-left:auto
- Les badges/vault restent a gauche dans .saved-search-badges
- ContextMenuManager: option Ajouter aux recherches sauvegardees pour repertoires
- _saveDirectorySearch: POST /api/saved-searches avec include_paths=repertoire/**
- Bascule automatique vers longlet Sauvegardes dans le sidebar
- loadSavedSearches: icone folder-search + classe saved-search-dir pour recherches dossier
- Recherches dossier affichent le chemin au lieu d'une query vide
- Header: retire Aa/wd/.*, compteur 0/0, fleches nav (reste filtre + clear)
- Nouvelle barre flottante sticky en bas du content-area
- Style pill arrondi, fond semi-transparent, ombre legere
- Contient: compteur, nav prev/next, toggles Aa/wd/.*
- Apparait seulement quand des resultats sont affiches
- Disparait au clear ou retour dashboard
- Mobile: filtre + clear restent visibles
- IDs renommes rb-* pour eviter collisions
- Retrait des 3 boutons (delete/cancel/save) de la barre Forge (doublons)
- Retrait des handlers JS associés dans editor-poc.html
- Le header parent ObsiGate reste visible quand Forge est ouvert
- Les boutons save/delete du parent délèguent à Forge via postMessage
- Forge écoute 'parent-save' et 'parent-delete' du parent
- state.editorVault/editorPath settés dans viewer.js pour le parent
height:100% doesn't work when parent uses flex height. position:absolute collapses the parent. 82vh = 90vh modal - header. Also set bodyEl overflow:hidden.
.editor-body has flex height, so percentage height on iframe didn't work. Changed to position:absolute;inset:0 which fills the relative parent regardless of flex sizing.
Forge button now reuses the existing editor-modal with an iframe. Same position as the Edit/CodeMirror modal. On close, the forge iframe is removed and the current file is refreshed (picks up changes saved by the POC's auto-save). Updated both frontend/js/viewer.js and frontend/app.js.
Add standalone /editor-poc page demonstrating all 5 toolbar zones:
- Zone 1: Top Fixed Bar (hamburger, title, AI glow button, save indicator)
- Zone 2a: Slash Command Menu (/ on empty line, 15 commands, filtering)
- Zone 2b: Bubble Menu (on text selection, formatting + AI dropdown)
- Zone 3: Floating Quick Insert (per-line, Image/PDF/Code/Table/AI)
- Zone 4: AI Side Panel (Ctrl+J toggle, chat, suggestions)
- Zone 5: Drag & Drop overlay with dashed border
Files:
- new: frontend/editor-poc.html (46KB standalone vanilla JS)
- backend/main.py: +/editor-poc route before catch-all
- frontend/index.html: Editor POC button in header menu
- frontend/js/config.js: initEditorPocBtn() function + export
- frontend/js/legacy.js: re-export initEditorPocBtn
- frontend/js/app.js + frontend/app.js: init call in both versions
#15: Click backup item to preview content in side panel (100KB limit)
#16: Purge all backups per vault (red 'Vider' button)
#17: /api/backups/compress — gzip backups older than N days
#18: /api/backups/auto — backup files modified since N hours
#19: Restore button per backup in manager with timestamp extraction
+ Professional side-panel preview, action buttons on hover, vault grouping
- Config: max_backups_per_file (default 10) in config.json + UI field
- Auto-cleanup: _backup_file deletes oldest backups when limit exceeded
- New endpoints: GET /api/backups (list all), POST /api/backups/delete,
POST /api/backups/purge (by file or vault)
- New module: backup-manager.js - full-page view with filter, grouped by
vault/file, individual delete, per-file purge, stats
- Link from backup viewer footer: 'Gerer tous les backups'
- _get_backup_dir: now resolves relative path using the SPECIFIC vault's
directory (matching _backup_file exactly), not the first vault in index
- Removed _get_backup_root (unused after refactor)
- backups.js: global document click handler for #backup-close (same
pattern as Graph View's initGraphView)
- Close button created once in createOverlay() as a static DOM element
outside the panel, positioned absolutely (top-right corner)
- Never touched by setBody() innerHTML replacements
- Uses same class/id pattern as Graph View: editor-btn + backup-close
- Handler attached via addEventListener ONCE, never needs re-binding
- Removed all CLOSE_BTN from render functions (loading/error/empty/main)
- Close button: <button class="backup-close-btn"><i data-lucide="x"></i></button>
(same HTML pattern as AdminPanel editor-btn)
- Handler: addEventListener via DOM query in setBody() after innerHTML
(same JS pattern as AdminPanel)
- Removed all inline onclick, global capture handler, window._backupViewerClose
- CSS: .backup-close-btn now matches .editor-btn style (bordered icon button)
- Escape key + overlay click still work for closing
- _backup_file: resolve relative backup path against vault parent (survives CWD changes)
- _get_backup_root: same resolution logic for listing
- backups.js: global document-level capture-phase click handler for .backup-close-btn
(works regardless of innerHTML replacements, text node targets, or event bubbling)
- vaulthome.js: getFileIcon was imported from viewer.js but lives in utils.js
- backups.js: setBody() now re-binds close button handler after innerHTML replacement
- Vault home (#12): recursive file listing (rglob), rel_dir in metadata,
'recursif' badge, updated roadmap description
- Backup viewer: fix close button (inline onclick + event delegation
fallback for text nodes), improve error messages
- Backup API: remove response_model to prevent Pydantic 500 errors,
add try/except + logging on backups/diff/restore endpoints,
per-entry error handling in _list_backup_files,
encoding safety (errors='replace') on read_text
- AI status: call /api/ai/status at startup in _initAIStatus
instead of waiting for user click on sync badge