250 Commits
Author SHA1 Message Date
bruno d32ee1110b fix(e2e): dropdown autocomplete reste ferme apres une recherche (flag) + reset panes attend le rendu
CI / lint (push) Successful in 28s
CI / security (push) Successful in 21s
CI / test (push) Successful in 33s
CI / build (push) Successful in 13s
CI / e2e (push) Failing after 6m12s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- search.js : suppression par flag (jusqu a la prochaine frappe) au lieu d un timeout 500ms qui expirait avant le clic sur le bouton Forge

- split-view.spec.js : le test reset panes attend l apparition de la liste de commandes (debounce 150ms du palette) avant Entree
2026-08-24 22:58:18 -04:00
bruno 9a834e04ab fix(split-view): le split cree un pane vide (sans copie ni transfert d onglet)
CI / lint (push) Successful in 29s
CI / security (push) Successful in 21s
CI / test (push) Successful in 38s
CI / build (push) Failing after 15s
CI / e2e (push) Skipped
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- la copie de l onglet actif etait dedupe (fichier deja ouvert dans le pane source) et le transfert clavier (200ms) vidait le pane source -> auto-collapse -> grid disparu

- comportement coherent avec le menu contextuel : pane vide, l utilisateur y glisse ses fichiers
2026-08-24 22:25:11 -04:00
bruno 8c9e881922 fix(e2e): derniers tests split-view + Forge - dropdown autocomplete, transferTab menu, drag natif
CI / lint (push) Successful in 29s
CI / security (push) Successful in 21s
CI / test (push) Successful in 33s
CI / build (push) Successful in 12s
CI / e2e (push) Failing after 6m35s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- search.js : le dropdown d autocomplete ne se rouvre plus 500ms apres un hide (la recherche le rouvrait et bloquait les clics toolbar - test Forge)

- ui.js + pane-manager.js : le split via menu contextuel ne transfert plus l onglet en synchrone (vidait le pane source -> auto-collapse -> grid disparu)

- split-view.spec.js : navigation clavier attend la copie asynchrone (setTimeout 150ms qui reactivait pane 0)

- split-view.spec.js : drag depuis l arbre via dragTo (drag natif HTML5)
2026-08-24 22:12:56 -04:00
bruno 70cb9ca6a2 fix(e2e): recherche sur Entree + fixtures note1/note2 + init filtre saved searches
CI / lint (push) Successful in 29s
CI / security (push) Successful in 19s
CI / test (push) Successful in 33s
CI / build (push) Successful in 13s
CI / e2e (push) Failing after 16m5s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- obsigate.spec.ts : searchFor appuie sur Entree (la recherche se declenche au keydown Enter, l autocomplete s affiche pendant la frappe)

- test_vault : ajout note1.md et note2.md (requis par les tests split-view)

- viewer.js : initialise la barre de filtres saved searches meme quand la liste est vide (sinon clics sans effet)
2026-08-24 20:08:56 -04:00
bruno 331c614330 feat(boot): écran de chargement inline + staging backend/frontend pour le bundle desktop
CI / lint (push) Failing after 16s
CI / test (push) Skipped
CI / build (push) Skipped
CI / e2e (push) Skipped
CI / security (push) Successful in 18s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- frontend/index.html : splash #boot-splash 100% inline (CSS+JS), scripts CDN en defer pour ne pas bloquer le premier paint
- frontend/js/app.js : signale le boot terminé via __OBSIGATE_BOOTED (try/finally)
- desktop/src/main.rs : met à jour le statut du splash avant la redirection vers le backend
- ci: stage backend/ + frontend/ sous desktop/ avant tauri build (resources backend/** et frontend/**) dans desktop-build.yml et build-linux.sh
- desktop/gen/schemas/windows-schema.json : régénéré (permissions store/updater)
- docs: README, README.fr, ROADMAP
2026-08-24 15:50:49 -04:00
bruno 9804cf9a6d feat(excalidraw): support .excalidraw.md (Obsidian plugin format) with lz-string decompression
CI / lint (push) Failing after 14s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
2026-07-29 16:08:03 -04:00
bruno 8c665fb568 fix(excalidraw): use import map to force React 18.3.1 for ALL modules including Excalidraw internals
CI / lint (push) Failing after 10s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 23s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
2026-07-29 11:41:30 -04:00
bruno 1b5319fde1 feat(excalidraw): support complet des fichiers .excalidraw (#78)
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- Backend: ajout .excalidraw dans SUPPORTED_EXTENSIONS + squelette JSON creation
- Backend: détection is_excalidraw dans api_file() + FileContentResponse
- Frontend: icône pen-tool dans EXT_ICONS
- Frontend: ajout dans la modale de création (ui.js)
- Frontend: excalidraw-editor.html (iframe autonome, React+Excalidraw via esm.sh)
- Frontend: excalidraw-viewer.js (postMessage, auto-save 2s, thème)
- Frontend: dispatch dans viewer.js (renderFile)
- Tests: 6 tests (détection, création squelette, fallback, tree, roundtrip)
- 359/359 tests passent
2026-07-29 10:55:00 -04:00
bruno 380ca29f2c fix(dragdrop): unify tree+tab drop zone logic, fix cross-pane transfer
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 18s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Three fixes for drag-and-drop in split view (#75):

1. Tree drag-to-split: edge zone detection now runs BEFORE the tree/tab
   dispatch, so dragging a sidebar file to the right/bottom edge of a
   single pane correctly creates a split and opens the file in the new
   pane (was: tree check returned early before edge zone logic).

2. Cross-pane transfer consistency: transferTab() now tracks pane count
   before the transfer — if closePane() fires inside transferTabTo()
   (source pane becomes empty), the DOM is rebuilt and the original
   targetTm reference is stale. After close, re-lookup the tab manager
   that actually holds the transferred tab before _renderTabs()+activate.

3. dragdrop.js flicker: onDragLeave() now checks relatedTarget instead
   of unconditionally clearing highlights on every child boundary.
2026-07-29 10:20:52 -04:00
bruno 298ea082c0 fix: split view — plus de panneaux vides, transfert auto de l'onglet
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 14s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- _hasAnyTab(): empêche split si aucun onglet ouvert (tous les points d'entrée)
- _copyActiveTabToNewPane(): copie l'onglet actif dans le nouveau panneau
- Menu contextuel: l'onglet cliqué-droit est transféré dans le nouveau panneau
- Raccourci clavier Ctrl+Alt+\: transfert l'onglet actif dans le nouveau panneau
- Boutons split: vérifient _hasAnyTab() avant d'agir
- Singleton ui.js: même comportement (split + transfert de l'onglet)
2026-07-28 13:10:57 -04:00
bruno ffefe4eb16 fix: grille CSS grid-row/column explicites pour 2/3/4 panneaux
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Refonte complète du layout grid:
- _computePanePositions: positions explicites (row/col/span) selon n et layout
- _createPaneAt: grid-row/grid-column explicites sur chaque .pane-container
- _addAllResizeHandles: handles placés aux bonnes positions grid
- _rebuildResizeHandles: nettoie et recrée les handles après add/remove
- closePane: repositionne les panneaux restants + rebuild handles
- 3 panneaux horizontal: 2 en haut, 1 pleine largeur en bas
- 3 panneaux vertical: 1 pleine hauteur à gauche, 2 à droite
- 4 panneaux: grille 2×2

Fix aussi: _addPane avec positions explicites + rebuild handles
2026-07-28 11:08:08 -04:00
bruno 257e35198d fix: split view — supprimé display:none qui cachait les panneaux inactifs
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Problème: le lazy rendering masquait le contenu du panneau non-sélectionné
→ split view devenait inutile (un seul panneau visible à la fois)
→ Solution: supprimé display:none dans setActivePane, tous les panneaux visibles

Test mis à jour: test_panes_remain_visible_when_inactive
2026-07-28 10:53:27 -04:00
bruno 03e115b65b feat: #75 complété — 5 dernières sous-tâches implémentées
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 12s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
C1b: Sous-menu « Déplacer vers... » (flyout hover) — liste les autres panneaux
D2: Drag depuis l'arborescence vers panneau — format 'tree:{vault,path}'
E3: Rendu paresseux — display:none sur contenu des panneaux inactifs
E4: Verrouillage éditeur — même fichier déjà ouvert → focus le panneau existant
G3: Bouton reset (🔄 Réinitialiser les panneaux) dans la palette

ROADMAP: section 75 marquée ✅ Complété (reste I2/I3 tests)
2026-07-28 10:15:50 -04:00
bruno 804e6313b3 feat: finalisation split view #75 — boutons, nav clavier, palette, ROADMAP
CI / lint (push) Failing after 12s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Ajouts:
- C3: Boutons Split ⊞→ ⊞↓ dans la barre d'onglets (visibles au survol)
- C2: Ctrl+Alt+←/→/↑/↓ navigation entre panneaux
- C2: Ctrl+Shift+Alt+W fermer tous les autres panneaux
- H1: 5 commandes palette (Split R/D, Close Pane, Focus Next/Prev)
- ROADMAP.md: section 75 mise à jour avec statut 80% complété

CSS: .tab-split-buttons, .tab-split-btn avec opacity hover
2026-07-28 10:08:11 -04:00
bruno ed5cf597f9 fix: migration des onglets singleton → PaneTabManager au split
CI / lint (push) Failing after 13s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 15s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
_buildGrid: quand on passe de single-pane à multi-pane, migre les onglets
du TabManager singleton vers le PaneTabManager du pane 0.
Sans ça, transferTab() ne trouvait pas l'onglet (il était resté dans le singleton).

_collapseToSingle: migration inverse (PaneTabManager → singleton)
quand on ferme le dernier split.
2026-07-27 23:34:06 -04:00
bruno 4deb54b3a3 fix: dragstart singleton TabManager — JSON au lieu de String(idx)
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 16s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Cause: le TabManager singleton (single-pane) écrasait text/plain avec String(idx)
→ getData retournait '1' au lieu du JSON {paneId,tabId,index}
→ le drop handler PaneManager échouait sur 'missing paneId/tabId'

Fix:
- singleton dragstart: JSON.stringify({paneId:0, tabId, index}) + effectAllowed
- singleton drop: parse JSON, fallback legacy parseInt pour rétrocompatibilité
- dragover/drop inchangés (indicateurs visuels)
2026-07-27 23:28:39 -04:00
bruno fe4cb9c47c fix: drag-drop utilise text/plain uniquement + logs console
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 16s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- dragstart: setData 'text/plain' (universel, pas de custom MIME)
- drop container + tab: getData('text/plain')
- console.log dans le drop handler pour diagnostic
- Suppression application/obsigate-tab (non fiable cross-browser)
2026-07-27 23:20:55 -04:00
bruno 1a9a555bee fix: bookmarks/récents utilisent TabManager + drag-to-split corrigé
CI / lint (push) Failing after 10s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 15s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Bug 1 — bookmarks/récents sans tab:
  dashboard.js:135: openFile() → TabManager.openPreview()
  _createCard() est partagé par DashboardRecentWidget ET DashboardBookmarkWidget

Bug 2 — drag-to-split bloqué en single-pane:
  La condition 'if (dragData.paneId === paneId) return' empêchait le split
  car en single-pane, le drag part du pane 0 et drop sur le pane 0.
  → Supprimé. Edge detection vérifiée avant, cross-pane vérifié après.
  Même pane + pas edge → laissé au tab handler (reorder).
2026-07-27 23:04:51 -04:00
bruno d7b0998af8 fix: drag-to-split — drop zone sur .content-wrapper en mode single-pane
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 14s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
Cause: _setupPaneDropZone était uniquement appelé sur .pane-container (créé par split).
En mode single-pane, le DOM est .content-wrapper > .tab-bar + .content-area sans wrapper.
→ Ajout de _setupPaneDropZone sur .content-wrapper dans PaneManager.init()
→ CSS: position:relative sur .content-wrapper pour les indicateurs absolute

Changements:
- pane-manager.js: init() ajoute drop zone sur .content-wrapper (single-pane)
- style.css: position:relative sur .content-wrapper
2026-07-27 22:50:46 -04:00
bruno 8aaf19479f fix: drag-to-split — supprimé filtre types + ajout effectAllowed + fallback text/plain
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 29s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- dragstart: effectAllowed='move' + double setData (obsigate-tab + text/plain)
- dragenter/dragover: acceptent TOUS les drags (plus de filtre types.includes cassant)
- drop: fallback text/plain si application/obsigate-tab indisponible
- console.debug au lieu de silent catch pour diagnostiquer les erreurs restantes
2026-07-27 22:48:48 -04:00
bruno 069d119d03 fix: drag & drop corrigé — 3 bugs critiques résolus
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 15s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
1. types.includes → Array.from(types).includes (DOMStringList n'a pas .includes)
2. dragleave: compteur _dragCounter empêche clear sur child enter/leave
3. drag-to-split: zone recalculée dans drop handler (plus de closure corrompue)
4. drop: stopPropagation + skip same-paneId dans container handler
5. dragenter: appel preventDefault pour accepter le drop dès l'entrée
2026-07-27 22:42:45 -04:00
bruno a842d68038 feat: drop cross-pane fonctionnel + drag-to-split (bord droit/bas)
CI / lint (push) Failing after 12s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 16s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- _setupPaneDropZone: dragover/drop sur .pane-container (fonctionne même si tab bar vide)
- Drag-to-split: déposer un onglet dans les 25% droit → split right, 25% bas → split down
- Indicateurs visuels: zone bleue semi-transparente au drop, tab-bar dashed outline
- stopPropagation dans le drop handler des tabs pour éviter double-fire
- CSS: .pane-drop-zone-indicator, .tab-bar.drop-target, position:relative sur pane-container
2026-07-27 22:16:04 -04:00
bruno e5cd656c6e fix: TabManager exposé sur window + fermeture auto du panneau vide
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 20s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- ui.js: window.TabManager et window._singletonTabManager exposés dans init()
- pane-manager.js: référence corrigée vers window.TabManager (n'était pas en scope)
- PaneTabManager.close/transferTabTo: ferme automatiquement le panneau quand vide (sauf dernier)
- Déployé sur 192.168.30.101:2020, 307 tests verts
2026-07-27 21:51:19 -04:00
bruno ed4c1dcf07 feat: split view pro — TabManager indépendant par panneau avec drag & drop cross-pane
CI / lint (push) Failing after 10s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 17s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- PaneTabManager factory: chaque panneau a sa propre instance avec ses propres onglets
- Drag & drop d'onglets entre panneaux (application/obsigate-tab dataTransfer)
- Split copie l'onglet actif dans le nouveau panneau
- TabManager singleton: délégation automatique vers le panneau actif en mode split
- Persistance complète par panneau (tabs, activeTab, previewTab)
- viewer.js: getContentArea() priorise window._activePaneContentArea
- 307 tests verts, déployé sur 192.168.30.101:2020
2026-07-27 21:37:04 -04:00
bruno b27b38d32b feat: split view multi-panneaux (#75) — PaneManager intégré avec split right/down, menu contextuel, raccourcis clavier, CSS responsive et tests
CI / lint (push) Failing after 35s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 15s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- PaneManager: splitRight/splitDown avec 1-4 panneaux, persistance localStorage, resize
- Viewer/TabManager pane-aware: fonctions getContentArea/getTabBar/getTabList
- Menu contextuel onglets: actions Diviser à droite / Diviser en bas / Fermer le panneau
- Raccourcis clavier: Ctrl+Alt+\ (split right), Ctrl+Alt+Shift+\ (split down), Ctrl+Alt+W (fermer panneau)
- CSS pane-grid: grille, poignées resize, bordure active pane, responsive (désactivé <768px)
- Tests: 22 nouveaux tests unitaires + régression (307 total, 100% green)
- Déployé sur Docker test (localhost:2021)
2026-07-27 21:06:47 -04:00
bruno 0cea78b3b1 feat: badge version dans le header + tag v2.0.0-dev
CI / lint (push) Failing after 9s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 13s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- index.html: <div class="version-badge"> dans header-right
- app.js: fetch /api/health → affiche version dans le badge
- style.css: .version-badge discret (10px, mono, muted)
- Tag: v2.0.0-dev créé → git describe retourne v2.0.0-dev
2026-07-27 18:02:01 -04:00
bruno e213ad183e feat: support multi-format — images, CSV, JSON, TXT + fix PDF embed
CI / lint (push) Failing after 19s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 14s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- PDF: <iframe> → <embed> (plus compatible webview Tauri)
- Images: .png .jpg .gif .svg .webp .bmp .ico → rendu standalone avec toolbar
- CSV: rendu en tableau HTML avec headers sticky
- JSON: affichage formaté avec indentation (html.escape)
- Texte: .txt .log .yml .yaml .py .js .sh .toml .ini → <pre> mono
- CSS: .image-viewer-body, .csv-table, .text-viewer, .json-viewer, .file-toolbar
2026-07-27 15:06:24 -04:00
bruno 2ba7138881 feat: affichage PDF avec TOC + frame-src CSP
CI / lint (push) Successful in 23s
CI / security (push) Successful in 14s
CI / test (push) Successful in 27s
CI / build (push) Successful in 8s
CI / e2e (push) Failing after 1m29s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- CSP: ajout frame-src 'self' http://127.0.0.1:* (permet iframe PDF)
- pdf_reader.py: extract_pdf_toc() — extrait les bookmarks/outline (pypdf + pymupdf)
- main.py: inclut pdf_toc dans la réponse /api/file pour les PDF
- viewer.js: sidebar TOC avec liens vers les pages (si bookmarks présents)
- style.css: layout .pdf-body flex + .pdf-toc sidebar 240px
2026-07-27 12:32:11 -04:00
bruno 553e1dd4ee fix: add copyToClipboard import in viewer.js
CI / lint (push) Successful in 24s
CI / security (push) Successful in 14s
CI / test (push) Successful in 29s
CI / build (push) Successful in 7s
CI / e2e (push) Failing after 25s
Desktop Build / build-windows (push) Has been cancelled
Desktop Build / build-linux (push) Has been cancelled
- Was missing from utils.js import → ReferenceError
2026-07-25 10:36:42 -04:00
bruno cdaea4142b fix: remove duplicate safeHighlight declaration in utils.js
- Caused 'Identifier already declared' error — app won't load
- Original safeHighlight at line 250 (initEditor scope), duplicate removed
2026-07-25 10:35:18 -04:00
bruno 5426022273 fix: HTTP fallback for clipboard — execCommand('copy') textarea method
- Added copyToClipboard() in utils.js with dual strategy:
  - HTTPS: navigator.clipboard.writeText() (modern API)
  - HTTP: textarea + execCommand('copy') (legacy fallback)
- viewer.js: uses copyToClipboard() instead of direct navigator.clipboard
- popout.html: same dual-strategy inline
- Fixed: 'Erreur lors de la copie' on HTTP contexts
2026-07-25 10:32:39 -04:00
bruno 15a217eca4 feat: add copy-to-clipboard button on code blocks in viewer + popout
- CSS: .code-block-wrapper with relative positioning
- CSS: .copy-code-btn with hover opacity transition (hidden until hover)
- CSS: .copied state (green accent) after successful copy
- viewer.js: wraps each <pre> in .code-block-wrapper + appends copy button
- popout.html: same logic with vanilla JS (ES5 compatible)
- Button: 'Copier' → '✓ Copié' on click, reverts after 2s
- Toast: showToast('Code copié dans le presse-papiers') via navigator.clipboard
2026-07-25 10:27:40 -04:00
bruno a1355977d9 fix: popout theme inheritance via URL query param
CI / lint (push) Successful in 24s
CI / security (push) Successful in 14s
CI / test (push) Successful in 28s
CI / build (push) Successful in 18s
CI / e2e (push) Failing after 10s
- Pass current theme as ?theme=dark|light in popout URL
- viewer.js, app.js, palette.js all pass theme to popout
- popout.html reads theme from URL param first (fallback: localStorage, then dark)
- Also syncs theme back to localStorage when set via query param
2026-07-24 14:56:29 -04:00
bruno 6c448b3060 fix: frontend unit tests — add type:module in frontend/js/
CI / lint (push) Failing after 34s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Successful in 14s
- Root package.json has type:commonjs which breaks ES module syntax checks
- Added frontend/js/package.json with type:module for Node.js parsing
- All 27 JS modules now parse correctly in CI environment
2026-07-24 11:37:22 -04:00
bruno 88b73f663f fix: header logout button dynamically recreated by renderUserMenu
- renderUserMenu() rebuilds #logout-btn with innerHTML, wiping inline onclick
- Added onclick='window.handleLogout()' to the dynamic innerHTML string
- Restored addEventListener as double safety
- Settings #profile-logout already has onclick to handleLogout
2026-07-24 10:04:13 -04:00
bruno 14a45c9136 fix: remove remaining logout JS handler in config.js 2026-07-24 09:56:15 -04:00
bruno d2dec1be06 fix: both logout buttons now use inline onclick — no JS handlers
- Header #logout-btn: inline fetch+clear localStorage+redirect
- Settings #profile-logout: inline window.handleLogout or fetch fallback
- Removed all JS event listeners that were causing race conditions
- Zero dependency on ES module loading order
2026-07-24 09:55:43 -04:00
bruno 317065f986 fix: settings logout via inline onclick — bypasses ES module race
- profile-logout now handles logout directly via onclick attribute in HTML
- Calls window.handleLogout() (auth.js global) or direct fetch fallback
- Removed broken JS handler from config.js to avoid double execution
2026-07-24 09:54:42 -04:00
bruno 24b56ac0e7 fix: missing closing brace in config.js causing SyntaxError
- Brace balance was 403 opens vs 402 closes after logout handler patches
- Added missing closing brace — file now parses correctly
2026-07-24 09:52:51 -04:00
bruno b46b98c5a7 fix: settings logout buttons now call AuthManager.logout() directly
- Replaced window.handleLogout indirection with direct AuthManager.logout() call
- config.js already imports AuthManager from auth.js — no race condition
- Same direct call as header button (auth.js line 210)
2026-07-24 09:50:15 -04:00
bruno 3cf1c33b69 fix: remove confirm() dialogs from both logout buttons
- Header logout (#logout-btn) already had no confirm (AuthManager.logout called directly)
- Settings panel (#logout-btn + #profile-logout) now call handleLogout() without confirm
- Both buttons redirect to login screen immediately — consistent behavior
2026-07-24 09:36:23 -04:00
bruno 61caa47745 fix: logout button in settings panel now properly clears session
- Both #logout-btn and #profile-logout now delegate to window.handleLogout()
- Previously they did bare fetch+redirect without clearing JWT token or session state
- Added credentials: 'include' fallback for robustness
2026-07-24 09:27:54 -04:00
bruno 93d0bda627 feat: PDF support + Split View (P1 roadmap items)
#74 — Support PDF complet:
- backend/pdf_reader.py — pymupdf/pypdf text extraction
- .pdf added to SUPPORTED_EXTENSIONS in indexer.py
- PDF-aware file view API endpoint (metadata, text preview)
- Streaming endpoint /api/file/{vault}/pdf/stream
- Frontend PDF viewer with iframe, toolbar, download
- CSS for PDF viewer container

#75 — Split View (PaneManager):
- New module frontend/js/pane-manager.js — ES module
- 1-4 pane CSS grid with resize handles
- Split right/down via keyboard (Ctrl+Alt+\) or PaneManager API
- Persistence in localStorage (obsigate-panes)
- Collapse to single pane, per-pane active state

285 tests passent
2026-07-23 17:33:51 -04:00
bruno 5b956f8d95 Drop debounced search on input, search only on Enter
CI / lint (push) Failing after 25s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 13s
2026-07-21 10:14:26 -04:00
bruno c3c5f11e9b Move sidebar and offline imports to lazy loading
CI / lint (push) Failing after 21s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 10s
2026-07-20 22:31:07 -04:00
bruno 790f97e501 Replace hardcoded French strings with i18n calls
CI / lint (push) Failing after 1m28s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 17s
Initialize i18n before auth so t() works when rendering
auth-dependent UI, and build the command palette lazily so
translations are loaded first. Bump service worker cache version.
2026-07-20 20:16:34 -04:00
bruno cc22ffe6df fix: SW-killer script in index.html — auto-unregister stale Service Worker
CI / lint (push) Failing after 24s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 12s
The SW was the root cause of all persistent French text issues.
Even after rebuild, browsers with a registered SW would serve
cached old files (viewer.js without data-i18n, old locale JSONs).

SW-killer runs before any module script:
1. Detects if SW is controlling the page
2. Unregisters all SW registrations
3. Clears all caches
4. Reloads the page once (sessionStorage flag to prevent loop)

Other fixes in this commit:
- auth.js: import setLocale statically (was dynamic import)
- auth.js: import loadVaults/loadTags from sidebar.js
- sw.js: add JS modules + locales to STATIC_ASSETS for versioning
- sw.js: CACHE_VERSION v4→v5
2026-06-21 23:12:45 -04:00
bruno bea23820ab fix: Sign out + login flow + cache bust for i18n
CI / lint (push) Failing after 20s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 11s
- auth.js: window.handleLogout at module top level (was inside
  renderUserMenu, not always called). Fixes settings dropdown
  'Sign out' onclick='handleLogout()' doing nothing.
- auth.js: add missing imports (loadVaults, loadTags from sidebar.js)
  and dynamic import for IndexUpdateManager (circular dep avoidance).
  Fixes 'loadVaults is not defined' error on login.
- sw.js: CACHE_VERSION v4→v5 to bust stale Service Worker cache
  that was serving old viewer.js without data-i18n attributes,
  causing dashboard tabs to stay French despite English profile.

To apply: rebuild container + unregister SW in DevTools + reload.
2026-06-21 11:37:51 -04:00
bruno 6d4a45797e fix: Sign out button in settings dropdown not working
CI / lint (push) Failing after 21s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 10s
The header dropdown 'Sign out' menu item used onclick='handleLogout()'
but handleLogout was never defined as a global function.

Added window.handleLogout in auth.js that delegates to
AuthManager.logout(), same as the existing logout-btn handler.
2026-06-21 11:14:03 -04:00
bruno dec46cd5ab fix: re-sync language from server after login
CI / lint (push) Failing after 26s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / e2e (push) Has been skipped
CI / security (push) Failing after 10s
Root cause: initI18n() runs before auth on login page, so
/api/auth/me fails (401) and locale falls back to browser language.
After login, showWelcome() renders with stale locale without
re-checking server preference. French users always got French UI.

Fix: after successful login, fetch /api/auth/me and call setLocale()
if server language differs from current. This ensures the dashboard
renders in the user's saved language preference.
2026-06-21 11:06:27 -04:00