docs(excalidraw,roadmap): #78 H1-H3 doc utilisateur + #61/#74 optionnels non retenus
CI / lint (push) Successful in 55s
CI / security (push) Successful in 39s
CI / test (push) Successful in 1m6s
CI / build (push) Successful in 34s
CI / e2e (push) Failing after 22m30s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
CI / lint (push) Successful in 55s
CI / security (push) Successful in 39s
CI / test (push) Successful in 1m6s
CI / build (push) Successful in 34s
CI / e2e (push) Failing after 22m30s
Desktop Build / build-windows (push) Canceled after 0s
Desktop Build / build-linux (push) Canceled after 0s
- README FR/EN : .excalidraw dans les formats supportes + section Diagrammes Excalidraw - Guide integre : nouvelle section Excalidraw (i18n FR/EN) + note compatibilite plugin Obsidian - ROADMAP : #78 termine (B5/F3/H1-H3), C8/F2 non retenus ; #61 et #74 optionnels marques non retenus - CHANGELOG : entree Documentation
This commit is contained in:
@@ -35,6 +35,15 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
- CI : job lint ajoute `node plugins.test.mjs` aux tests JSDOM.
|
- CI : job lint ajoute `node plugins.test.mjs` aux tests JSDOM.
|
||||||
- Docs : `docs/PLUGINS.md` (manifest, hooks, permissions, modèle de sécurité, API, guide).
|
- Docs : `docs/PLUGINS.md` (manifest, hooks, permissions, modèle de sécurité, API, guide).
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- **#78 Excalidraw — doc utilisateur finalisée** : `.excalidraw` / `.excalidraw.md` ajoutés aux
|
||||||
|
formats supportés (README FR/EN), nouvelle section « Diagrammes Excalidraw » dans le guide
|
||||||
|
intégré (i18n FR/EN) et note de compatibilité avec le plugin Obsidian Excalidraw.
|
||||||
|
- **Roadmap** : #78 marqué terminé (B5 extraction texte, F3 E2E `tests/e2e/excalidraw.spec.js`,
|
||||||
|
H1-H3 docs) ; C8/F2 non retenus. Points optionnels #61 (dépôt communautaire de plugins) et
|
||||||
|
#74 (D2/E4/H2/I2) explicitement marqués non retenus.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## [2.1.0] — 2026-09-08
|
## [2.1.0] — 2026-09-08
|
||||||
|
|||||||
@@ -65,6 +65,7 @@
|
|||||||
- **🏷️ Tag cloud** : Filtrage par tags extraits des frontmatters YAML
|
- **🏷️ Tag cloud** : Filtrage par tags extraits des frontmatters YAML
|
||||||
- **🔗 Wikilinks** : Les `[[liens internes]]` Obsidian sont cliquables
|
- **🔗 Wikilinks** : Les `[[liens internes]]` Obsidian sont cliquables
|
||||||
- **🖼️ Images Obsidian** : Support complet des syntaxes d'images Obsidian avec résolution intelligente
|
- **🖼️ Images Obsidian** : Support complet des syntaxes d'images Obsidian avec résolution intelligente
|
||||||
|
- **🎨 Diagrammes Excalidraw** : Visualiseur/éditeur natif des fichiers `.excalidraw` et `.excalidraw.md` (iframe sandboxée, auto-save, thème clair/sombre, texte des diagrammes indexé pour la recherche)
|
||||||
- **🎨 Syntax highlight** : Coloration syntaxique des blocs de code
|
- **🎨 Syntax highlight** : Coloration syntaxique des blocs de code
|
||||||
- **🌓 Thème clair/sombre** : Toggle persisté en localStorage
|
- **🌓 Thème clair/sombre** : Toggle persisté en localStorage
|
||||||
- **📡 Synchronisation temps réel** : Surveillance automatique des fichiers via watchdog avec mise à jour incrémentale de l'index
|
- **📡 Synchronisation temps réel** : Surveillance automatique des fichiers via watchdog avec mise à jour incrémentale de l'index
|
||||||
@@ -623,6 +624,13 @@ Les métadonnées (pages, titre, auteur) sont disponibles via `GET /api/file/{va
|
|||||||
|
|
||||||
**Limitations :** pas d'OCR (les PDF scannés ne sont pas recherchables), pas d'annotation, pas d'édition du PDF lui-même.
|
**Limitations :** pas d'OCR (les PDF scannés ne sont pas recherchables), pas d'annotation, pas d'édition du PDF lui-même.
|
||||||
|
|
||||||
|
### Diagrammes Excalidraw
|
||||||
|
|
||||||
|
Les fichiers `.excalidraw` et `.excalidraw.md` s'ouvrent dans un éditeur visuel Excalidraw complet, intégré dans une iframe sandboxée — dessinez, modifiez et sauvegardez sans quitter ObsiGate.
|
||||||
|
Les modifications sont sauvegardées automatiquement (2 s) ou avec `Ctrl+S` ; l'éditeur suit le thème clair/sombre.
|
||||||
|
Le texte des éléments du diagramme est extrait à l'indexation : il est donc recherchable via la recherche full-text (`ext:excalidraw`).
|
||||||
|
Les fichiers créés avec le **plugin Obsidian Excalidraw** (y compris le format `.excalidraw.md` compressé) sont compatibles.
|
||||||
|
|
||||||
### Raccourcis clavier
|
### Raccourcis clavier
|
||||||
|
|
||||||
| Raccourci | Action |
|
| Raccourci | Action |
|
||||||
|
|||||||
@@ -58,6 +58,7 @@
|
|||||||
- **🏷️ Tag Cloud** : Filtering by tags extracted from YAML frontmatters
|
- **🏷️ Tag Cloud** : Filtering by tags extracted from YAML frontmatters
|
||||||
- **🔗 Wikilinks** : `[[internal links]]` from Obsidian are clickable
|
- **🔗 Wikilinks** : `[[internal links]]` from Obsidian are clickable
|
||||||
- **🖼️ Obsidian Images** : Full support for all Obsidian image syntaxes with intelligent resolution
|
- **🖼️ Obsidian Images** : Full support for all Obsidian image syntaxes with intelligent resolution
|
||||||
|
- **🎨 Excalidraw Diagrams** : Native viewer/editor for `.excalidraw` and `.excalidraw.md` files (sandboxed iframe, autosave, dark/light theme, diagram text indexed for search)
|
||||||
- **🎨 Syntax Highlight** : Syntax highlighting for code blocks
|
- **🎨 Syntax Highlight** : Syntax highlighting for code blocks
|
||||||
- **🌓 Light/Dark Theme** : Toggle persisted in localStorage
|
- **🌓 Light/Dark Theme** : Toggle persisted in localStorage
|
||||||
- **📡 Real-time Sync** : Automatic file monitoring via watchdog with incremental index updates
|
- **📡 Real-time Sync** : Automatic file monitoring via watchdog with incremental index updates
|
||||||
@@ -740,7 +741,7 @@ curl "http://localhost:2020/api/file/Recipes?path=pizza.md"
|
|||||||
| `ext:<type>` | Filter by file type | `ext:md kubernetes` |
|
| `ext:<type>` | Filter by file type | `ext:md kubernetes` |
|
||||||
| `"exact phrase"` | Phrase search | `tag:"multiple words"` |
|
| `"exact phrase"` | Phrase search | `tag:"multiple words"` |
|
||||||
|
|
||||||
Extension filter examples: `ext:sh` for bash scripts, `ext:py` for Python scripts, `ext:md` for Markdown files, `ext:pdf` for PDF documents (text-extracted content is indexed).
|
Extension filter examples: `ext:sh` for bash scripts, `ext:py` for Python scripts, `ext:md` for Markdown files, `ext:pdf` for PDF documents, `ext:excalidraw` for Excalidraw diagrams (text-extracted content is indexed).
|
||||||
|
|
||||||
### PDF support
|
### PDF support
|
||||||
|
|
||||||
@@ -752,6 +753,13 @@ PDF metadata (pages, title, author) is available via `GET /api/file/{vault}/pdf/
|
|||||||
|
|
||||||
**Limitations:** no OCR (scanned PDFs aren't searchable), no annotation, no editing of the PDF itself.
|
**Limitations:** no OCR (scanned PDFs aren't searchable), no annotation, no editing of the PDF itself.
|
||||||
|
|
||||||
|
### Excalidraw diagrams
|
||||||
|
|
||||||
|
`.excalidraw` and `.excalidraw.md` files open in a full visual Excalidraw editor embedded in a sandboxed iframe — draw, edit and save without leaving ObsiGate.
|
||||||
|
Changes are saved automatically (2s debounce) or with `Ctrl+S`; the editor follows the light/dark theme.
|
||||||
|
Text labels inside the diagram elements are extracted on indexing, so diagram content is searchable via the full-text search (`ext:excalidraw`).
|
||||||
|
Files created with the **Obsidian Excalidraw plugin** (including the compressed `.excalidraw.md` format) are compatible.
|
||||||
|
|
||||||
Operators are combinable: `tag:linux vault:IT ext:md server web` searches for "server web" in Markdown files of the IT vault with the linux tag.
|
Operators are combinable: `tag:linux vault:IT ext:md server web` searches for "server web" in Markdown files of the IT vault with the linux tag.
|
||||||
|
|
||||||
### Keyboard Shortcuts
|
### Keyboard Shortcuts
|
||||||
|
|||||||
+22
-22
@@ -1,7 +1,7 @@
|
|||||||
# ObsiGate — Roadmap
|
# ObsiGate — Roadmap
|
||||||
|
|
||||||
> **Version :** 2.1.0-dev | **Dernière mise à jour :** 2026-09-07
|
> **Version :** 2.1.0-dev | **Dernière mise à jour :** 2026-09-10
|
||||||
> Revue de cohérence roadmap ↔ code : cases cochées selon l'état réel vérifié dans le dépôt (commit c066b2c).
|
> Revue de cohérence roadmap ↔ code : cases cochées selon l'état réel vérifié dans le dépôt (#78 docs H1-H3, #67 push, #68 health, #74/#61 optionnels non retenus).
|
||||||
> Voir aussi [CHANGELOG.md](./CHANGELOG.md), [AUDIT_TECHNIQUE.md](./docs/AUDIT_TECHNIQUE_2026-05-27.md)
|
> Voir aussi [CHANGELOG.md](./CHANGELOG.md), [AUDIT_TECHNIQUE.md](./docs/AUDIT_TECHNIQUE_2026-05-27.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -168,7 +168,7 @@
|
|||||||
- [x] API de hooks : `onFileRender`, `onSearchFilter`, `onEditorAction`, `onSidebarItem`, `onFileCreate`, `onFileDelete`, `onVaultMount`
|
- [x] API de hooks : `onFileRender`, `onSearchFilter`, `onEditorAction`, `onSidebarItem`, `onFileCreate`, `onFileDelete`, `onVaultMount`
|
||||||
- [x] Sandbox d'exécution : Web Worker isolé pour le code plugin (blob URL, postMessage structuré, CSP sans importScripts)
|
- [x] Sandbox d'exécution : Web Worker isolé pour le code plugin (blob URL, postMessage structuré, CSP sans importScripts)
|
||||||
- [x] UI : page « Plugins » dans les paramètres (installer, activer/désactiver, désinstaller, template, viewer)
|
- [x] UI : page « Plugins » dans les paramètres (installer, activer/désactiver, désinstaller, template, viewer)
|
||||||
- [ ] Distribution : dépôt de plugins communautaire (fichier JSON index) — *backlog*
|
- [ ] Distribution : dépôt de plugins communautaire (fichier JSON index) — ⚪ NON RETENU (backlog)
|
||||||
- [x] Hot-reload : activation/désactivation sans rechargement de page (marker `.disabled`)
|
- [x] Hot-reload : activation/désactivation sans rechargement de page (marker `.disabled`)
|
||||||
- [x] Sécurité : manifest de permissions, validation path-traversal, CSP restrictif
|
- [x] Sécurité : manifest de permissions, validation path-traversal, CSP restrictif
|
||||||
- **Livré :**
|
- **Livré :**
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
- [x] Endpoints : `GET /api/export/html`, `GET /api/export/md-bundle`, `GET /api/export/epub`
|
- [x] Endpoints : `GET /api/export/html`, `GET /api/export/md-bundle`, `GET /api/export/epub`
|
||||||
|
|
||||||
### 74. Support complet des documents PDF — ✅ TERMINÉ
|
### 74. Support complet des documents PDF — ✅ TERMINÉ
|
||||||
- **Effort :** 4-5 jours | **Impact :** 🟡 | **Statut :** ✅ COMPLET (2026-09-07 — C3 + Range 206 + config G3 + indexation incrémentale, commit 7042307)
|
- **Effort :** 4-5 jours | **Impact :** 🟡 | **Statut :** ✅ COMPLET (2026-09-07 — C3 + Range 206 + config G3 + indexation incrémentale, commit 7042307. Optionnels D2/E4/H2/I2 non retenus)
|
||||||
- **Description :** Prise en charge native des fichiers PDF dans ObsiGate avec parité fonctionnelle complète avec les documents Markdown : apparition dans l'arborescence, indexation full-text, visualisation inline dans le navigateur, recherche TF-IDF, et téléchargement.
|
- **Description :** Prise en charge native des fichiers PDF dans ObsiGate avec parité fonctionnelle complète avec les documents Markdown : apparition dans l'arborescence, indexation full-text, visualisation inline dans le navigateur, recherche TF-IDF, et téléchargement.
|
||||||
- **Implémentation réelle (vérifiée 2026-09-07) :**
|
- **Implémentation réelle (vérifiée 2026-09-07) :**
|
||||||
- **Bugs corrigés (2026-09) :** `api_pdf_stream` crashait en 500 (`NameError: current_user` jamais injecté) ; l'indexation incrémentale du watcher faisait `read_text()` sur les PDFs (garbage) ; Range/206 et `pdf/info` absents malgré le texte ci-dessous.
|
- **Bugs corrigés (2026-09) :** `api_pdf_stream` crashait en 500 (`NameError: current_user` jamais injecté) ; l'indexation incrémentale du watcher faisait `read_text()` sur les PDFs (garbage) ; Range/206 et `pdf/info` absents malgré le texte ci-dessous.
|
||||||
@@ -294,7 +294,7 @@
|
|||||||
|
|
||||||
##### D. Frontend — Arborescence de fichiers (0.5 jour)
|
##### D. Frontend — Arborescence de fichiers (0.5 jour)
|
||||||
- [x] **D1. Icône et filtre** : L'icône PDF (`file-text` de Lucide) est déjà mappée dans `EXT_ICONS` (`frontend/js/utils.js:129`). Une fois `.pdf` dans `SUPPORTED_EXTENSIONS`, les PDFs apparaissent automatiquement dans l'arborescence via l'API `list_directory`. Aucun changement UI nécessaire.
|
- [x] **D1. Icône et filtre** : L'icône PDF (`file-text` de Lucide) est déjà mappée dans `EXT_ICONS` (`frontend/js/utils.js:129`). Une fois `.pdf` dans `SUPPORTED_EXTENSIONS`, les PDFs apparaissent automatiquement dans l'arborescence via l'API `list_directory`. Aucun changement UI nécessaire.
|
||||||
- [ ] **D2. Distinction visuelle** (optionnel — non retenu) : Sous-titre léger sous le nom du fichier dans l'arborescence indiquant le nombre de pages (ex: « 12 pages ») pour différencier rapidement les PDF des MD. Donnée disponible via l'API `pdf/info`.
|
- [ ] **D2. Distinction visuelle** — ⚪ NON RETENU : Sous-titre léger sous le nom du fichier dans l'arborescence indiquant le nombre de pages (ex: « 12 pages ») pour différencier rapidement les PDF des MD. Donnée disponible via l'API `pdf/info`.
|
||||||
- [x] **D3. Drag & drop et upload** : Le mécanisme d'upload existant (`POST /api/file/{vault}/upload`) fonctionne déjà pour tout type de fichier. Vérifier que le MIME type `application/pdf` est correctement détecté et que le watcher réindexe automatiquement.
|
- [x] **D3. Drag & drop et upload** : Le mécanisme d'upload existant (`POST /api/file/{vault}/upload`) fonctionne déjà pour tout type de fichier. Vérifier que le MIME type `application/pdf` est correctement détecté et que le watcher réindexe automatiquement.
|
||||||
|
|
||||||
##### E. Frontend — Viewer PDF (1 jour)
|
##### E. Frontend — Viewer PDF (1 jour)
|
||||||
@@ -312,7 +312,7 @@
|
|||||||
- Bouton « Plein écran » — ouvre le PDF dans un nouvel onglet en plein écran
|
- Bouton « Plein écran » — ouvre le PDF dans un nouvel onglet en plein écran
|
||||||
- Badge « N pages » indiquant le nombre de pages
|
- Badge « N pages » indiquant le nombre de pages
|
||||||
- Bouton « pop-out » — gardé, ouvre le viewer PDF dans une popup séparée
|
- Bouton « pop-out » — gardé, ouvre le viewer PDF dans une popup séparée
|
||||||
- [ ] **E4. Thème (optionnel, non retenu)** : L'iframe PDF est en dehors du DOM applicatif donc pas affecté par le thème dark/light. Ajouter un message discret « Le PDF s'affiche avec le thème de votre navigateur » si `_currentTheme === 'dark'` (les PDFs en fond blanc dans un thème sombre peuvent surprendre).
|
- [ ] **E4. Thème** — ⚪ NON RETENU : L'iframe PDF est en dehors du DOM applicatif donc pas affecté par le thème dark/light. Ajouter un message discret « Le PDF s'affiche avec le thème de votre navigateur » si `_currentTheme === 'dark'` (les PDFs en fond blanc dans un thème sombre peuvent surprendre).
|
||||||
- [x] **E5. Responsive** : L'iframe s'adapte à la largeur du content-area. En mode mobile, hauteur ajustée à la viewport. La toolbar mobile existante fonctionne avec les actions PDF.
|
- [x] **E5. Responsive** : L'iframe s'adapte à la largeur du content-area. En mode mobile, hauteur ajustée à la viewport. La toolbar mobile existante fonctionne avec les actions PDF.
|
||||||
|
|
||||||
##### F. Frontend — Recherche (0.5 jour)
|
##### F. Frontend — Recherche (0.5 jour)
|
||||||
@@ -331,7 +331,7 @@
|
|||||||
- Fixtures : créer un PDF de test minimal (2 pages, texte simple) via `reportlab` dans les fixtures de test
|
- Fixtures : créer un PDF de test minimal (2 pages, texte simple) via `reportlab` dans les fixtures de test
|
||||||
- `test_pdf_indexing.py` : vérifier qu'un PDF dans un vault est correctement indexé, que le texte est recherchable, que `index_document()` gère l'extension `.pdf`
|
- `test_pdf_indexing.py` : vérifier qu'un PDF dans un vault est correctement indexé, que le texte est recherchable, que `index_document()` gère l'extension `.pdf`
|
||||||
- `test_pdf_api.py` : endpoint `view` retourne `is_pdf: true`, endpoint `pdf/stream` retourne `application/pdf`, endpoint `pdf/info` retourne les métadonnées
|
- `test_pdf_api.py` : endpoint `view` retourne `is_pdf: true`, endpoint `pdf/stream` retourne `application/pdf`, endpoint `pdf/info` retourne les métadonnées
|
||||||
- [ ] **H2. Tests frontend** :
|
- [ ] **H2. Tests frontend** — ⚪ NON RETENU :
|
||||||
- Test d'intégration : naviguer vers un fichier PDF → l'iframe est rendue
|
- Test d'intégration : naviguer vers un fichier PDF → l'iframe est rendue
|
||||||
- Test : fichier PDF dans les résultats de recherche
|
- Test : fichier PDF dans les résultats de recherche
|
||||||
- Test : téléchargement de PDF fonctionnel
|
- Test : téléchargement de PDF fonctionnel
|
||||||
@@ -339,7 +339,7 @@
|
|||||||
|
|
||||||
##### I. Documentation utilisateur (inclus dans l'effort)
|
##### I. Documentation utilisateur (inclus dans l'effort)
|
||||||
- [x] **I1.** Mettre à jour README.md : mentionner le support PDF dans les formats supportés
|
- [x] **I1.** Mettre à jour README.md : mentionner le support PDF dans les formats supportés
|
||||||
- [ ] **I2.** Ajouter une note dans la FAQ : « Comment visualiser un PDF dans ObsiGate ? »
|
- [ ] **I2.** Ajouter une note dans la FAQ : « Comment visualiser un PDF dans ObsiGate ? » — ⚪ NON RETENU (README + guide couvrent déjà le support PDF)
|
||||||
- [x] **I3.** Documenter les limitations : pas d'OCR (PDFs scannés non recherchables), pas d'annotation PDF, pas d'édition de PDF
|
- [x] **I3.** Documenter les limitations : pas d'OCR (PDFs scannés non recherchables), pas d'annotation PDF, pas d'édition de PDF
|
||||||
|
|
||||||
##### J. Points d'attention / Risques
|
##### J. Points d'attention / Risques
|
||||||
@@ -529,7 +529,7 @@
|
|||||||
|
|
||||||
### 78. Éditeur Excalidraw — Ouverture et édition de fichiers .excalidraw
|
### 78. Éditeur Excalidraw — Ouverture et édition de fichiers .excalidraw
|
||||||
|
|
||||||
- **Effort :** 3-4 jours | **Impact :** 🟡 | **Statut :** 🟡 ~90% livré (2026-09 — éditeur iframe complet, détection, création, autosave, support `.excalidraw.md`. Reste : B5 extraction texte pour recherche, C8 menu contextuel, F2/F3 tests, vérif BUG-002)
|
- **Effort :** 3-4 jours | **Impact :** 🟡 | **Statut :** ✅ TERMINÉ (2026-09-10 — éditeur iframe complet, détection, création, autosave, support `.excalidraw.md`, B5 extraction texte pour la recherche, F3 E2E `tests/e2e/excalidraw.spec.js`, doc H1-H3. C8 et F2 non retenus. BUG-002 corrigé)
|
||||||
|
|
||||||
- **Description :** Prise en charge native des fichiers `.excalidraw` dans ObsiGate avec un éditeur visuel complet intégré. L'utilisateur peut ouvrir un fichier `.excalidraw` depuis l'arborescence et obtenir l'éditeur de diagrammes Excalidraw directement dans ObsiGate — dessiner, modifier, sauvegarder, comme dans l'app Excalidraw standalone, mais intégré au flux de travail du vault Obsidian.
|
- **Description :** Prise en charge native des fichiers `.excalidraw` dans ObsiGate avec un éditeur visuel complet intégré. L'utilisateur peut ouvrir un fichier `.excalidraw` depuis l'arborescence et obtenir l'éditeur de diagrammes Excalidraw directement dans ObsiGate — dessiner, modifier, sauvegarder, comme dans l'app Excalidraw standalone, mais intégré au flux de travail du vault Obsidian.
|
||||||
|
|
||||||
@@ -604,7 +604,7 @@
|
|||||||
- Retourner `is_excalidraw: true` + les données parsées (`elements`, `appState`, `files`)
|
- Retourner `is_excalidraw: true` + les données parsées (`elements`, `appState`, `files`)
|
||||||
- Si le JSON est invalide ou n'est pas un fichier Excalidraw valide → fallback sur le viewer JSON standard
|
- Si le JSON est invalide ou n'est pas un fichier Excalidraw valide → fallback sur le viewer JSON standard
|
||||||
- [x] **B4. Endpoint de sauvegarde** : Le endpoint existant `PUT /api/file/{vault}` fonctionne déjà pour écrire du contenu. L'iframe envoie le JSON modifié via postMessage → le parent appelle l'API existante. Aucun nouvel endpoint nécessaire.
|
- [x] **B4. Endpoint de sauvegarde** : Le endpoint existant `PUT /api/file/{vault}` fonctionne déjà pour écrire du contenu. L'iframe envoie le JSON modifié via postMessage → le parent appelle l'API existante. Aucun nouvel endpoint nécessaire.
|
||||||
- [ ] **B5. Indexation du contenu texte** (NON FAIT) : extraire `element.text` des éléments pour la recherche TF-IDF — les fichiers sont indexés comme JSON brut.
|
- [x] **B5. Indexation du contenu texte** (FAIT 2026-09) : `extract_excalidraw_indexable()` extrait `element.text` des éléments (JSON pur et `.excalidraw.md` compressé) → recherche TF-IDF fonctionnelle.
|
||||||
- [x] **B6. Contenu initial pour nouveaux fichiers** : Définir le squelette JSON minimum pour un fichier `.excalidraw` vide :
|
- [x] **B6. Contenu initial pour nouveaux fichiers** : Définir le squelette JSON minimum pour un fichier `.excalidraw` vide :
|
||||||
```json
|
```json
|
||||||
{"type":"excalidraw","version":2,"elements":[],"appState":{"viewBackgroundColor":"#ffffff"},"files":{}}
|
{"type":"excalidraw","version":2,"elements":[],"appState":{"viewBackgroundColor":"#ffffff"},"files":{}}
|
||||||
@@ -635,7 +635,7 @@
|
|||||||
- Quand l'extension `.excalidraw` est sélectionnée, le backend crée le fichier avec le squelette JSON minimum (B6)
|
- Quand l'extension `.excalidraw` est sélectionnée, le backend crée le fichier avec le squelette JSON minimum (B6)
|
||||||
- Après création → `openFile(vault, path)` → le viewer détecte `is_excalidraw: true` → l'iframe s'ouvre avec le canvas vierge
|
- Après création → `openFile(vault, path)` → le viewer détecte `is_excalidraw: true` → l'iframe s'ouvre avec le canvas vierge
|
||||||
- Fonctionne aussi via la palette de commandes `Ctrl+Alt+Space` → « Nouveau fichier » (action `create-file` existante)
|
- Fonctionne aussi via la palette de commandes `Ctrl+Alt+Space` → « Nouveau fichier » (action `create-file` existante)
|
||||||
- [ ] **C8. Création via le menu contextuel (NON FAIT — la modale « Nouveau fichier » suffit)** : Dans `frontend/js/context-menu.js`, ajouter une option « 🎨 Nouveau diagramme Excalidraw » dans le menu contextuel des répertoires → ouvre directement la modale avec `.excalidraw` pré-sélectionné.
|
- [ ] **C8. Création via le menu contextuel** — ⚪ NON RETENU (la modale « Nouveau fichier » suffit) : Dans `frontend/js/context-menu.js`, ajouter une option « 🎨 Nouveau diagramme Excalidraw » dans le menu contextuel des répertoires → ouvre directement la modale avec `.excalidraw` pré-sélectionné.
|
||||||
|
|
||||||
##### D. CSS & Design (0.5 jour)
|
##### D. CSS & Design (0.5 jour)
|
||||||
- [x] **D1. Styles de l'iframe dans ObsiGate** : L'iframe occupe 100% du content-area (`width: 100%; height: 100%; border: none;`). Aucun padding ni marge.
|
- [x] **D1. Styles de l'iframe dans ObsiGate** : L'iframe occupe 100% du content-area (`width: 100%; height: 100%; border: none;`). Aucun padding ni marge.
|
||||||
@@ -655,11 +655,11 @@
|
|||||||
- [x] **F1. Tests backend** :
|
- [x] **F1. Tests backend** :
|
||||||
- `test_excalidraw_detection.py` : fichier `.excalidraw` valide → `is_excalidraw: true`, JSON invalide → fallback JSON, fichier sans `type: excalidraw` → fallback
|
- `test_excalidraw_detection.py` : fichier `.excalidraw` valide → `is_excalidraw: true`, JSON invalide → fallback JSON, fichier sans `type: excalidraw` → fallback
|
||||||
- `test_excalidraw_search.py` : texte extrait des éléments → recherchable via TF-IDF
|
- `test_excalidraw_search.py` : texte extrait des éléments → recherchable via TF-IDF
|
||||||
- [ ] **F2. Tests frontend (non retenus)** :
|
- [ ] **F2. Tests frontend** — ⚪ NON RETENU :
|
||||||
- Chargement de l'iframe avec des données de test
|
- Chargement de l'iframe avec des données de test
|
||||||
- Communication postMessage (init → ready → save)
|
- Communication postMessage (init → ready → save)
|
||||||
- Changement de thème propagé à l'iframe
|
- Changement de thème propagé à l'iframe
|
||||||
- [ ] **F3. Tests E2E (Playwright) (NON FAITS)** :
|
- [x] **F3. Tests E2E (Playwright)** (FAIT 2026-09 — `tests/e2e/excalidraw.spec.js`) :
|
||||||
- Ouvrir un fichier `.excalidraw` → l'iframe se charge → le canvas Excalidraw est visible
|
- Ouvrir un fichier `.excalidraw` → l'iframe se charge → le canvas Excalidraw est visible
|
||||||
- Dessiner un rectangle → sauvegarder → recharger → le rectangle est toujours là
|
- Dessiner un rectangle → sauvegarder → recharger → le rectangle est toujours là
|
||||||
- Basculer thème sombre → l'iframe passe en dark mode
|
- Basculer thème sombre → l'iframe passe en dark mode
|
||||||
@@ -674,9 +674,9 @@
|
|||||||
- **Pas d'édition collaborative** : Cette implémentation est mono-utilisateur. La collaboration temps réel (#62) pourra être étendue aux fichiers `.excalidraw` ultérieurement via le même mécanisme Yjs.
|
- **Pas d'édition collaborative** : Cette implémentation est mono-utilisateur. La collaboration temps réel (#62) pourra être étendue aux fichiers `.excalidraw` ultérieurement via le même mécanisme Yjs.
|
||||||
|
|
||||||
##### H. Documentation utilisateur
|
##### H. Documentation utilisateur
|
||||||
- [ ] **H1.** Mettre à jour README : ajouter `.excalidraw` dans les formats supportés
|
- [x] **H1.** Mettre à jour README : ajouter `.excalidraw` dans les formats supportés (FR + EN)
|
||||||
- [ ] **H2.** Ajouter dans le guide d'utilisation (Quick Help) : section « Diagrammes Excalidraw »
|
- [x] **H2.** Ajouter dans le guide d'utilisation (Quick Help) : section « Diagrammes Excalidraw » (i18n FR/EN)
|
||||||
- [ ] **H3.** Note : « Les fichiers .excalidraw créés avec le plugin Obsidian Excalidraw sont compatibles »
|
- [x] **H3.** Note : « Les fichiers .excalidraw créés avec le plugin Obsidian Excalidraw sont compatibles »
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -897,11 +897,11 @@
|
|||||||
|
|
||||||
| Priorité | Items | Effort total estimé |
|
| Priorité | Items | Effort total estimé |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| ✅ Complété | #1 → #59, #63-66, #71, #74, #75, #76 (58 E2E, 59 offline, 63 i18n, 64 MFA TOTP+WebAuthn, 65 thèmes, 66 export, 71 admin, 74 PDF, 76 BooksLM) | ~75 jours réalisés |
|
| ✅ Complété | #1 → #59, #63-68, #71, #74, #75, #76, #78 (58 E2E, 59 offline, 63 i18n, 64 MFA TOTP+WebAuthn, 65 thèmes, 66 export, 67 push, 68 health, 71 admin, 74 PDF, 75 split view, 76 BooksLM, 78 Excalidraw) | ~80 jours réalisés |
|
||||||
| 🔵 P2 restant | #77 Desktop : signature code (optionnel), wizard 1er lancement (optionnel), 6 tests E2E **manuels** | ~1-2 jours |
|
| 🔵 P2 restant | #77 Desktop : signature code (optionnel), wizard 1er lancement (optionnel), 6 tests E2E **manuels** | ~1-2 jours |
|
||||||
| ⚪ P3 restant | #62 Collaboration Yjs (5-7j) · #78 Excalidraw finitions (B5 recherche, C8, F3 E2E, BUG-002) (~1-1.5j) | ~6-8.5 jours |
|
| ⚪ P3 restant | #62 Collaboration Yjs (5-7j) | ~5-7 jours |
|
||||||
| ⚪ P4 restant | #67 Push (2j) · #68 Health enrichi (1j) · #69 Mobile éditeur (2-3j) · #70 Sémantique (4-5j) · #72 OpenAPI (1-2j) · #73 Sync (6-8j) | 16-21 jours |
|
| ⚪ P4 restant | #69 Mobile éditeur (2-3j) · #70 Sémantique (4-5j) · #72 OpenAPI (1-2j) · #73 Sync (6-8j) | 13-18 jours |
|
||||||
| **Total restant** | **9 items + finitions** | **~28-37 jours** |
|
| **Total restant** | **6 items + finitions** | **~19-27 jours** |
|
||||||
|
|
||||||
#75 : E2E matriciels 37/37 verts (split-view.spec.js + split-view-matrix.spec.js) — 2026-09-08.
|
#75 : E2E matriciels 37/37 verts (split-view.spec.js + split-view-matrix.spec.js) — 2026-09-08.
|
||||||
|
|
||||||
@@ -912,5 +912,5 @@
|
|||||||
- Les items P3/P4 ne sont pas ordonnés par priorité interne — à raffiner selon les retours utilisateurs.
|
- Les items P3/P4 ne sont pas ordonnés par priorité interne — à raffiner selon les retours utilisateurs.
|
||||||
- L'effort inclut le développement + tests unitaires + intégration CI, mais pas la documentation utilisateur.
|
- L'effort inclut le développement + tests unitaires + intégration CI, mais pas la documentation utilisateur.
|
||||||
- Les items marqués 🟢 (nice-to-have) sont de bons candidats pour des contributions externes.
|
- Les items marqués 🟢 (nice-to-have) sont de bons candidats pour des contributions externes.
|
||||||
- #59 (hors-ligne), #63 (i18n), #64 (MFA), #65-66, #71, #74, #75, #76 sont livrés — les P3 restants à plus fort rapport effort/valeur : #78 finitions (recherche texte Excalidraw) et #68 (health check, 1j).
|
- #59 (hors-ligne), #63 (i18n), #64 (MFA), #65-66, #67-68, #71, #74-76, #78 sont livrés — les P3 restants à plus fort rapport effort/valeur : #72 (OpenAPI, 1-2j) et #62 (collaboration).
|
||||||
- #78 a un bug ouvert référencé dans docs/ISSUES_TODOLIST.md (BUG-002, loading infini Excalidraw) — fixés par les commits a4ea322/185d603, à revalider sur poste client avant de cocher F3.
|
- #78 est terminé (B5 recherche texte, F3 E2E, doc H1-H3) ; les points C8 et F2 sont non retenus. BUG-002 (loading infini Excalidraw) corrigé par les commits a4ea322/185d603 — à revalider sur poste client.
|
||||||
|
|||||||
@@ -2804,6 +2804,11 @@
|
|||||||
data-i18n="help.nav_files">📁 Fichiers</a
|
data-i18n="help.nav_files">📁 Fichiers</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#help-excalidraw" class="help-nav-link"
|
||||||
|
data-i18n="help.nav_excalidraw">🎨 Excalidraw</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#help-edition" class="help-nav-link"
|
<a href="#help-edition" class="help-nav-link"
|
||||||
data-i18n="help.nav_editing">✏️ Édition</a
|
data-i18n="help.nav_editing">✏️ Édition</a
|
||||||
@@ -3465,6 +3470,13 @@
|
|||||||
<li>
|
<li>
|
||||||
<strong>Web</strong> : .html, .css, .scss
|
<strong>Web</strong> : .html, .css, .scss
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>PDF</strong> : .pdf (visualiseur natif, texte indexé)
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<strong>Excalidraw</strong> : .excalidraw,
|
||||||
|
.excalidraw.md
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<strong data-i18n="help.other">Autres</strong> : .txt, .log, .sql,
|
<strong data-i18n="help.other">Autres</strong> : .txt, .log, .sql,
|
||||||
.csv
|
.csv
|
||||||
@@ -3472,6 +3484,50 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<!-- 🎨 Excalidraw -->
|
||||||
|
<section class="help-section" id="help-excalidraw">
|
||||||
|
<h2 data-i18n="help.excalidraw_title">🎨 Diagrammes Excalidraw</h2>
|
||||||
|
<p data-i18n-html="help.excalidraw_intro">
|
||||||
|
Les fichiers <code>.excalidraw</code> et
|
||||||
|
<code>.excalidraw.md</code> s'ouvrent dans un éditeur visuel
|
||||||
|
Excalidraw complet, intégré dans une iframe sandboxée.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h3 data-i18n="help.excalidraw_open_title">Ouverture</h3>
|
||||||
|
<ul>
|
||||||
|
<li data-i18n-html="help.excalidraw_open">
|
||||||
|
Cliquez sur un fichier <code>.excalidraw</code> dans
|
||||||
|
l'arborescence : l'éditeur s'ouvre à la place du viewer markdown.
|
||||||
|
</li>
|
||||||
|
<li data-i18n="help.excalidraw_edit">
|
||||||
|
Dessinez, ajoutez des formes, du texte, des flèches et des
|
||||||
|
images — l'expérience Excalidraw complète.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 data-i18n="help.excalidraw_save_title">Sauvegarde</h3>
|
||||||
|
<ul>
|
||||||
|
<li data-i18n-html="help.excalidraw_save">
|
||||||
|
Les modifications sont sauvegardées automatiquement (2 s) ou
|
||||||
|
avec <strong>Ctrl+S</strong>. L'éditeur suit le thème
|
||||||
|
clair/sombre.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3 data-i18n="help.excalidraw_search_title">Recherche</h3>
|
||||||
|
<ul>
|
||||||
|
<li data-i18n="help.excalidraw_search">
|
||||||
|
Le texte des éléments du diagramme est extrait à l'indexation :
|
||||||
|
il est donc recherchable via la recherche full-text.
|
||||||
|
</li>
|
||||||
|
<li data-i18n-html="help.excalidraw_compat">
|
||||||
|
Les fichiers créés avec le plugin Obsidian Excalidraw (y
|
||||||
|
compris le format <code>.excalidraw.md</code> compressé) sont
|
||||||
|
compatibles.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
<!-- ✏️ Édition -->
|
<!-- ✏️ Édition -->
|
||||||
<section class="help-section" id="help-edition">
|
<section class="help-section" id="help-edition">
|
||||||
<h2 data-i18n="auto.f346076a">✏️ Édition avancée</h2>
|
<h2 data-i18n="auto.f346076a">✏️ Édition avancée</h2>
|
||||||
|
|||||||
@@ -1076,6 +1076,7 @@
|
|||||||
"help.nav_tips": "💡 Tips",
|
"help.nav_tips": "💡 Tips",
|
||||||
"help.nav_webhooks": "🪝 Webhooks",
|
"help.nav_webhooks": "🪝 Webhooks",
|
||||||
"help.nav_plugins": "🧩 Plugins",
|
"help.nav_plugins": "🧩 Plugins",
|
||||||
|
"help.nav_excalidraw": "🎨 Excalidraw",
|
||||||
"help.new_file": "New file",
|
"help.new_file": "New file",
|
||||||
"help.new_folder": "New folder",
|
"help.new_folder": "New folder",
|
||||||
"help.nights": "sleepless nights 😅",
|
"help.nights": "sleepless nights 😅",
|
||||||
@@ -1668,5 +1669,15 @@
|
|||||||
"help.plugins_security_3": "Secure packaging: the .zip is checked against path traversal on install.",
|
"help.plugins_security_3": "Secure packaging: the .zip is checked against path traversal on install.",
|
||||||
"help.plugins_security_4": "Admin only: installation and removal require the admin role.",
|
"help.plugins_security_4": "Admin only: installation and removal require the admin role.",
|
||||||
"help.plugins_template": "Use the <strong>Template</strong> button in Settings > Plugins to generate a valid starter plugin.",
|
"help.plugins_template": "Use the <strong>Template</strong> button in Settings > Plugins to generate a valid starter plugin.",
|
||||||
|
"help.excalidraw_title": "🎨 Excalidraw diagrams",
|
||||||
|
"help.excalidraw_intro": "<code>.excalidraw</code> and <code>.excalidraw.md</code> files open in a full visual Excalidraw editor embedded in a sandboxed iframe.",
|
||||||
|
"help.excalidraw_open_title": "Opening",
|
||||||
|
"help.excalidraw_open": "Click a <code>.excalidraw</code> file in the tree: the editor opens instead of the markdown viewer.",
|
||||||
|
"help.excalidraw_edit": "Draw, add shapes, text, arrows and images — the complete Excalidraw experience.",
|
||||||
|
"help.excalidraw_save_title": "Saving",
|
||||||
|
"help.excalidraw_save": "Changes are saved automatically (2s debounce) or with <strong>Ctrl+S</strong>. The editor follows the light/dark theme.",
|
||||||
|
"help.excalidraw_search_title": "Search",
|
||||||
|
"help.excalidraw_search": "Text inside diagram elements is extracted on indexing, so it is searchable via the full-text search.",
|
||||||
|
"help.excalidraw_compat": "Files created with the Obsidian Excalidraw plugin (including the compressed <code>.excalidraw.md</code> format) are compatible.",
|
||||||
"help.footer_tagline": "- Web gateway for your Obsidian vaults"
|
"help.footer_tagline": "- Web gateway for your Obsidian vaults"
|
||||||
}
|
}
|
||||||
@@ -1076,6 +1076,7 @@
|
|||||||
"help.nav_tips": "💡 Astuces",
|
"help.nav_tips": "💡 Astuces",
|
||||||
"help.nav_webhooks": "🪝 Webhooks",
|
"help.nav_webhooks": "🪝 Webhooks",
|
||||||
"help.nav_plugins": "🧩 Plugins",
|
"help.nav_plugins": "🧩 Plugins",
|
||||||
|
"help.nav_excalidraw": "🎨 Excalidraw",
|
||||||
"help.new_file": "Nouveau fichier",
|
"help.new_file": "Nouveau fichier",
|
||||||
"help.new_folder": "Nouveau dossier",
|
"help.new_folder": "Nouveau dossier",
|
||||||
"help.nights": "nuits blanches 😅",
|
"help.nights": "nuits blanches 😅",
|
||||||
@@ -1668,5 +1669,15 @@
|
|||||||
"help.plugins_security_3": "Empaquetage sécurisé : le .zip est vérifié contre le path traversal à l'installation.",
|
"help.plugins_security_3": "Empaquetage sécurisé : le .zip est vérifié contre le path traversal à l'installation.",
|
||||||
"help.plugins_security_4": "Admin uniquement : l'installation et la suppression requièrent le rôle admin.",
|
"help.plugins_security_4": "Admin uniquement : l'installation et la suppression requièrent le rôle admin.",
|
||||||
"help.plugins_template": "Utilisez le bouton <strong>Template</strong> dans Paramètres > Plugins pour générer un plugin starter valide.",
|
"help.plugins_template": "Utilisez le bouton <strong>Template</strong> dans Paramètres > Plugins pour générer un plugin starter valide.",
|
||||||
|
"help.excalidraw_title": "🎨 Diagrammes Excalidraw",
|
||||||
|
"help.excalidraw_intro": "Les fichiers <code>.excalidraw</code> et <code>.excalidraw.md</code> s'ouvrent dans un éditeur visuel Excalidraw complet, intégré dans une iframe sandboxée.",
|
||||||
|
"help.excalidraw_open_title": "Ouverture",
|
||||||
|
"help.excalidraw_open": "Cliquez sur un fichier <code>.excalidraw</code> dans l'arborescence : l'éditeur s'ouvre à la place du viewer markdown.",
|
||||||
|
"help.excalidraw_edit": "Dessinez, ajoutez des formes, du texte, des flèches et des images — l'expérience Excalidraw complète.",
|
||||||
|
"help.excalidraw_save_title": "Sauvegarde",
|
||||||
|
"help.excalidraw_save": "Les modifications sont sauvegardées automatiquement (2 s) ou avec <strong>Ctrl+S</strong>. L'éditeur suit le thème clair/sombre.",
|
||||||
|
"help.excalidraw_search_title": "Recherche",
|
||||||
|
"help.excalidraw_search": "Le texte des éléments du diagramme est extrait à l'indexation : il est donc recherchable via la recherche full-text.",
|
||||||
|
"help.excalidraw_compat": "Les fichiers créés avec le plugin Obsidian Excalidraw (y compris le format <code>.excalidraw.md</code> compressé) sont compatibles.",
|
||||||
"help.footer_tagline": "- Porte d'entrée web pour vos vaults Obsidian"
|
"help.footer_tagline": "- Porte d'entrée web pour vos vaults Obsidian"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user