feat: guide d'utilisation - couverture complete, telechargement MD/PDF, section Architecture Mermaid, guide desktop elargi (#105, BUG-067)
This commit is contained in:
@@ -175,6 +175,7 @@ Avant de corriger quoi que ce soit, un agent IA doit :
|
||||
| *BUG-064* | [🟡 IMPORTANT] Éditeur Excalidraw : le diagramme ne s'affiche jamais (canvas vide), pour tout fichier `.excalidraw` / `.excalidraw.md` | 🟢 corrigé | P1 | 📱 frontend + ⚙️ backend | IA | `frontend/excalidraw-editor.html`, `backend/main.py`, `tests/frontend/excalidraw-viewer.test.mjs`, `tests/test_security_hardening.py`, `tests/e2e/excalidraw.spec.js`, `test_vault/diagram-app-export.excalidraw` | Ouvrir un `.excalidraw` (ou `.excalidraw.md`) dans ObsiGate | Deux causes : (1) la feuille de style d'Excalidraw n'était jamais chargée → éditeur non stylisé + `.excalidraw` sans hauteur fixe → boucle de resize jusqu'au plafond `2^25` (33 554 432 px) → scène blanche. Correctif : `<link>` CSS depuis esm.sh + `style-src` CSP autorisant `https://esm.sh`. (2) `appState.collaborators` objet JSON → `collaborators.forEach is not a function` ; `sanitizeAppState()` reconvertit en `Map` et écarte `width/height/offsetLeft/offsetTop`. | Vérifié navigateur : hauteur canvas 525 px (avant 33 554 432), dessin affiché, UI stylisée, 0 erreur. E2E + tests statiques CSP/CSS ajoutés. |
|
||||
| *BUG-065* | [🟡 IMPORTANT] Éditeur Excalidraw : l'auto-save recharge la page en pleine édition | 🟢 corrigé | P1 | 📱 frontend | IA | `frontend/js/excalidraw-viewer.js`, `frontend/js/utils.js`, `frontend/excalidraw-editor.html`, `tests/frontend/excalidraw-viewer.test.mjs` | Ouvrir un `.excalidraw` puis modifier un élément : au bout de 2 s la vue se recharge | Chaque modification déclenchait un `PUT save` 2 s plus tard → SSE `index_updated` → `reloadExternalWrite` → `openFile` → **recréation de l'iframe** (refresh visible). Auto-save supprimée : sauvegarde explicite (bouton 💾 / Ctrl+S). `reloadExternalWrite` ignore le fichier si un iframe Excalidraw est ouvert (`iframe[data-excalidraw-vault/path]`). Le badge « Modified » ne réagit plus aux changements d'`appState` (resize/zoom) mais à la signature des éléments. | Vérifié Playwright : plus de refresh, badge stable après bascule plein écran. Test statique (absence de `requestSave`/`saveTimer`). |
|
||||
| *BUG-066* | [🔵 MINEUR] Configuration : icônes manquantes dans la table des matières (« Fichiers cachés », « Partages publics ») | 🟢 corrigé | P3 | 📱 frontend | IA | `frontend/locales/{fr,en}.json` | Ouvrir Configuration → observer le sommaire : les entrées « Fichiers cachés » et « Partages publics » n'ont pas d'icône | `config.section_hidden` → « 🗂️ Fichiers cachés » / « 🗂️ Hidden files », `config.section_shares` → « 📤 Partages publics » (EN avait déjà l'icône). Test : `tests/frontend/unit.test.mjs` (+1 : toutes les entrées du sommaire portent une icône FR/EN) | Les libellés du sommaire utilisent des clés i18n distinctes des titres de section (`auto.f8ba6127`, `config.section_partages-publics`) qui, elles, avaient l'icône |
|
||||
| *BUG-067* | [🔵 MINEUR] Guide d'utilisation : l'entrée « 📱 Mobile » du sommaire ne fait rien (section absente) | 🟢 corrigé | P3 | 📱 frontend | IA | `frontend/index.html` | Ouvrir le Guide → cliquer « 📱 Mobile » dans le sommaire : rien ne se passe | L'ancre `#help-mobile-editor` était présente dans la TOC mais aucune section `id="help-mobile-editor"` n'existait (l'édition mobile n'était qu'un h3 de `help-edition`). Fix #105 : section dédiée créée avec ancre + entrée de nav cohérente. | Vérifié par test statique `tests/test_guide.py::test_nav_anchors_resolve` |
|
||||
| | | | | | | | | | | |
|
||||
|
||||
### TODOs techniques (améliorations / nouvelles tâches)
|
||||
@@ -246,6 +247,7 @@ Avant de corriger quoi que ce soit, un agent IA doit :
|
||||
| 2026-09-17 | BUG-065, #78 (complément) | Correction + feature | `frontend/js/excalidraw-viewer.js`, `frontend/js/utils.js`, `frontend/excalidraw-editor.html`, `tests/frontend/excalidraw-viewer.test.mjs`, `docs/features/excalidraw.md`, `CHANGELOG.md`, `docs/ISSUES_TODOLIST.md` | **BUG-065** : l'auto-save Excalidraw (débounce 2 s) déclenchait `PUT save` → SSE `index_updated` → `reloadExternalWrite` → `openFile` → recréation de l'iframe = refresh visible pendant le dessin. Auto-save retirée (`excalidraw-viewer.js` : plus de `requestSave`/`saveTimer`), sauvegarde explicite (bouton 💾 / Ctrl+S) ; `reloadExternalWrite` (utils.js) court-circuite le re-rendu si un iframe Excalidraw est ouvert sur ce fichier (attributs `data-excalidraw-vault`/`data-excalidraw-path`) ; le badge « Modified » suit désormais une signature des éléments (`id:versionNonce`) au lieu de tout `onChange` — resize/zoom/plein écran ne marquent plus le fichier modifié. **#78 (complément)** : bouton **plein écran** `#btn-fullscreen` dans la barre d'outils de l'éditeur (`requestFullscreen` sur le document de l'iframe) + iframe créée avec `allow="fullscreen" allowfullscreen`. Vérifié Playwright : bascule plein écran OK (`document.fullscreenElement` true→false), badge non modifié après bascule ; tests statiques `excalidraw-viewer.test.mjs` 12/12, validate-imports 38 modules, unit 9/9. | 🟢 corrigé (en attente vérif utilisateur) |
|
||||
| 2026-09-17 | #78 (complément) | UI | `frontend/excalidraw-editor.html`, `docs/features/excalidraw.md`, `CHANGELOG.md` | **#78 (complément)** : la barre d'outils de l'éditeur Excalidraw passe en **colonne d'icônes** (34×34 px, SVG seuls), **collée au bord droit** (`right: 0` ; `top: 45%` ; empilement vertical), avec `title`/`aria-label`. L'icône du bouton Save est remplacée par une coche pendant 1,2 s après une sauvegarde réussie. Badge « Modifié » réduit à une pastille. Vérifié Playwright : bord droit au bord de l'iframe, haut 45 %, 4 boutons empilés ; bascule plein écran OK, cycle d'icône Save + `PUT save` observés. | 🟢 livré (en attente vérif utilisateur) |
|
||||
| 2026-09-18 | BUG-066 | Correction | `frontend/locales/fr.json`, `frontend/locales/en.json`, `tests/frontend/unit.test.mjs`, `CHANGELOG.md`, `docs/ISSUES_TODOLIST.md` | **BUG-066** : la table des matières de la page de configuration n'affichait aucune icône pour « Fichiers cachés » et « Partages publics ». Les libellés du sommaire proviennent de clés i18n (`config.section_hidden`, `config.section_shares`) distinctes des titres de section qui, eux, portaient déjà l'icône. Alignement : 🗂️ / 📤 en FR **et** EN. Test de non-régression : `unit.test.mjs` vérifie que **toutes** les entrées `.help-nav-link` du sommaire portent une icône dans les deux langues (17/17). Vérifié : `unit.test.mjs` 10/10, `validate-imports` 38 modules. | 🟢 corrigé (en attente vérif utilisateur) |
|
||||
| 2026-09-18 | #105, BUG-067 | Documentation + correction | `frontend/index.html`, `frontend/js/config.js`, `frontend/style.css`, `frontend/locales/{fr,en}.json`, `backend/guide_export.py`, `backend/main.py`, `tests/test_guide.py`, `docs/features/guide-coverage-105.md`, `CHANGELOG.md`, `docs/ROADMAP.md`, `docs/ISSUES_TODOLIST.md` | **#105** : audit complet de couverture du Guide d'utilisation — 8 nouvelles sections (Architecture + diagramme Mermaid, API & intégrations, Diagrammes Mermaid & Excalidraw, Hors-ligne & synchronisation, Collaboration temps réel, Application desktop, Bibliothèque & signets, Multilingue) et compléments (recherche sémantique, MFA/WebAuthn, notifications push, exports HTML/ePub/ZIP, PDF, vue multi-panneaux, admin). Téléchargement du guide en Markdown et PDF (`GET /api/guide/download?format=md|pdf`, FR/EN, rendu par le moteur d'export existant). Guide plus large en desktop. **BUG-067** : ancre morte `#help-mobile-editor` → section dédiée créée. | 🟢 corrigé (en attente vérif utilisateur)
|
||||
|
||||
---
|
||||
|
||||
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
# ObsiGate — Roadmap
|
||||
|
||||
> **Version :** 2.12.2 | **Dernière mise à jour :** 2026-09-18
|
||||
> **Version :** 2.13.0 | **Dernière mise à jour :** 2026-09-18
|
||||
> **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact
|
||||
> vers les fonctionnalités livrées.
|
||||
> - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)**
|
||||
@@ -187,6 +187,7 @@
|
||||
| 92 | Assistant IA — Écosystème d'outils phase 2 (recherche à clé, cache/retry, Playwright, crawl, Gitea/GitHub, documents XLSX/DOCX/CSV/PDF) | 2.10.0 | [features/ai-tools-roadmap.md](./features/ai-tools-roadmap.md) |
|
||||
| 103 | Configuration — clés utilisateur des sources connectées & recherche à clé (page Configurations, `data/api_keys.json`, priorité sur l'env) | 2.11.0 | [features/ai-tools-roadmap.md](./features/ai-tools-roadmap.md) |
|
||||
| 104 | Configuration — Redesign UI de la section « Clés API IA » : recherche fournisseurs, carte défaut 2 colonnes + badges de capacités, cartes dépliables, footer d'actions sticky | 2.12.0 | [features/ai-keys-ui.md](./features/ai-keys-ui.md) |
|
||||
| 105 | Guide d'utilisation — audit de couverture complet, téléchargement Markdown/PDF, guide desktop élargi, section Architecture (Mermaid) + BUG-067 | 2.13.0 | [features/guide-coverage-105.md](./features/guide-coverage-105.md) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
# #105 — Guide d'utilisation : couverture, téléchargement MD/PDF, Architecture
|
||||
|
||||
> **Statut :** livré | **Version :** 2.13.0 | **Bugs liés :** BUG-067
|
||||
> **Roadmap :** [docs/ROADMAP.md](../ROADMAP.md) · **Changelog :** [../../CHANGELOG.md](../../CHANGELOG.md)
|
||||
|
||||
## 1. Objectif
|
||||
|
||||
Après ~35 features livrées (#70→#104), le guide intégré (modale « Guide
|
||||
d'utilisation », `#help-modal` de `frontend/index.html`) ne représentait plus
|
||||
l'application : Mermaid, hors-ligne/PWA, collaboration Yjs, desktop Tauri,
|
||||
exports HTML/ePub/ZIP, recherche sémantique, MFA/WebAuthn, push, split view,
|
||||
API OpenAPI/MCP étaient absents. L'item couvre quatre livrables :
|
||||
|
||||
1. **Audit de couverture** — toutes les fonctionnalités visibles ET non visibles
|
||||
(API, MCP, webhooks, endpoints de partage) sont documentées.
|
||||
2. **Section Architecture** — diagramme Mermaid des grandes composantes.
|
||||
3. **Téléchargement Markdown + PDF** du guide, dans la langue courante.
|
||||
4. **Lecture desktop élargie** (mode Tauri + grands viewports web).
|
||||
|
||||
## 2. Source de vérité du contenu
|
||||
|
||||
Le contenu des nouvelles sections vit dans **`scripts/guide_content.py`** :
|
||||
dictionnaire `CONTENT` (clé → FR, EN) + constructeurs HTML qui **ne peuvent
|
||||
pas diverger** des locales (le FR inline est généré depuis `CONTENT`).
|
||||
|
||||
- `scripts/merge_guide_locales.py` → injecte les clés `guide105.*` dans
|
||||
`frontend/locales/{fr,en}.json` (insertion textuelle, parité assertée).
|
||||
- `scripts/insert_guide_sections.py` → insère sections/TOC/compléments dans
|
||||
`index.html` (idempotent, préserve les fins de ligne, vérifie l'équilibre
|
||||
`<section>` et l'absence d'ancre morte).
|
||||
- **Règle :** ne jamais éditer les blocs `guide105.*` des JSON ni les sections
|
||||
#105 de `index.html` à la main — modifier `guide_content.py` et relancer les
|
||||
deux scripts (séquence figée, sinon HTML et locales divergent).
|
||||
|
||||
## 3. Rendu du guide dans l'app
|
||||
|
||||
Les textes portent `data-i18n="guide105.*"` ; `_applyDOM()` (i18n.js) les
|
||||
remplit avec la locale courante. Les valeurs FR/EN contiennent du **HTML
|
||||
minimal** (`<code>`, `<strong>`, `<a href="https://…">`) — sûre ici car ces
|
||||
chaînes sont statiques dans le dépôt (jamais de contenu utilisateur ; même
|
||||
convention que `help.desc_*` existant).
|
||||
|
||||
Le diagramme d'architecture est un bloc `<pre class="mermaid-code"><code
|
||||
class="language-mermaid">` : à l'ouverture de la modale, `renderGuideMermaid()`
|
||||
(config.js) appelle `renderMermaidBlocks()` (mermaid-viewer.js) sur la modale —
|
||||
le viewer ne rend que les vues document, la modale est donc enrichie ici. Si le
|
||||
CDN Mermaid n'est pas prêt, le bloc reste du code lisible et le rendu est
|
||||
retenté à l'ouverture suivante (`data-mermaid-rendered` ne se pose qu'après
|
||||
succès). Le MD exporté embarque le diagramme en fenced block ` ```mermaid `
|
||||
(copiable, rendu par GitHub/VS Code/Obsidian) ; le PDF contient le même bloc.
|
||||
|
||||
## 4. Téléchargement (MD + PDF)
|
||||
|
||||
`backend/guide_export.py` : parseur stdlib (html.parser → arbre minimal) ;
|
||||
extraction de `#help-modal`→`.help-content`, résolution i18n **identique à
|
||||
_applyDOM** (un élément `data-i18n` est remplacé par la valeur locale, sinon le
|
||||
FR inline sert de repli), conversion Markdown (titres, listes imbriquées,
|
||||
tables, fenced code, gras/italique/code/kbd/links http) et HTML propre pour
|
||||
WeasyPrint. PDF : pipeline d'export existant (`build_pdf_html` + `generate_pdf`),
|
||||
repli `_render_reportlab_pdf` (markdown simplifié) quand GTK manque (Windows
|
||||
nu) — même stratégie que le bouton « PDF » des documents (#92).
|
||||
`get_guide_document(fmt, lang)` met en cache (octets+signature mtime/size de
|
||||
`index.html` et `fr.json`) pour éviter de re-générer à chaque requête.
|
||||
|
||||
Endpoint `GET /api/guide/download?format=md|pdf&lang=fr|en`
|
||||
(`require_auth`, tag OpenAPI **« Guide »**), `Content-Disposition: attachment`.
|
||||
Côté UI : boutons « Markdown » / « PDF » dans l'en-tête de la modale
|
||||
(`#help-download-md`/`#help-download-pdf`), handler `downloadGuide()` dans
|
||||
`frontend/js/config.js` — fetch avec `AuthManager.getAuthHeaders()` +
|
||||
credentials (identique à `viewer.downloadExport()`), blob → lien
|
||||
téléchargeable, toasts i18n réutilisés (`viewer.export_*`).
|
||||
|
||||
## 5. Guide desktop élargi
|
||||
|
||||
`frontend/js/desktop.js::initDesktopIntegration()` ajoute `body.desktop-mode`
|
||||
(une fois, après le garde Tauri). CSS (section « Help Modal: desktop » de
|
||||
`style.css`) : conteneur 1760 px / 96 vw, contenu 1440 px, modale 94 vh ; le
|
||||
même layout est accordé aux viewports ≥1400 px web via media-query (contenu
|
||||
1280 px). Le mobile reste inchangé (≤768 px plein écran).
|
||||
|
||||
## 6. Couverture fonctionnelle du guide (après #105)
|
||||
|
||||
| Domaine app | Section du guide |
|
||||
|---|---|
|
||||
| Vaults, arborescence, filtres, breadcrumb | Interface, Navigation |
|
||||
| Onglets, popout, split view | Onglets, Personnalisation |
|
||||
| Recherche TF-IDF, opérateurs, facettes, sémantique, recherches sauvegardées, signets | Recherche, Bibliothèque |
|
||||
| Tags, frontmatter | Tags |
|
||||
| Fichiers, types supportés, CodeMirror, PDF, export HTML/ePub/ZIP, anti-doublons upload | Fichiers |
|
||||
| Mermaid | Diagrammes |
|
||||
| Excalidraw | Excalidraw |
|
||||
| Éditeur, AI toolbar, BooksLM, commandes @//, skills, images, outils, historique | Édition, IA |
|
||||
| Édition mobile | Mobile (section dédiée, BUG-067) |
|
||||
| Graphe, backlinks | Bibliothèque, Graphe |
|
||||
| Palette de commandes, raccourcis | Palette, Raccourcis |
|
||||
| Partage public, PDF du partage, webhooks HMAC | Partage, Webhooks |
|
||||
| Backups, diff, purge, audit log, gestionnaire | Sauvegardes et Audits |
|
||||
| JWT/Argon2id, rate limit, MFA TOTP/WebAuthn, admin dashboard, secrets, CSP | Sécurité |
|
||||
| PWA hors-ligne, IndexedDB queue, watcher, conflits Syncthing | Hors-ligne, Bibliothèque |
|
||||
| Collaboration Yjs/CRDT, awareness, push VAPID | Collaboration, Interface |
|
||||
| Tauri desktop (updater signé, wizard, fenêtrage) | Desktop |
|
||||
| API REST OpenAPI (/docs, /redoc, /api, /openapi.json), MCP /mcp, automatisation | API & Intégrations |
|
||||
| i18n FR/EN, export du guide multilingue | Multilingue |
|
||||
| Architecture technique (couches, flux, données, déploiement) | **Architecture** (nouveau) |
|
||||
| Plugins sandboxés | Plugins |
|
||||
|
||||
## 7. Tests & vérifications
|
||||
|
||||
- `tests/test_guide.py` (11) : ancre TOC→sections (garde-fou BUG-067),
|
||||
sections #105 présentes, parité/présence des clés `guide105.*` FR=EN,
|
||||
Markdown FR/EN (titres, mermaid, absence de balises résiduelles), PDF
|
||||
(`%PDF`, taille), metadata `get_guide_document`, endpoint MD/PDF/400 via
|
||||
TestClient, OpenAPI (path + tag « Guide »).
|
||||
- Suite backend pytest : 1216 passed · ruff/mypy 0 erreur ·
|
||||
`validate-imports` 38 modules · `unit.test.mjs` 10/10 · E2E complet CI.
|
||||
- SW cache busting : `SW_VERSION` v21→v22.
|
||||
|
||||
## 8. Limites assumées
|
||||
|
||||
- Le PDF est généré côté serveur avec les polices système ; en l'absence de
|
||||
GTK (Windows de dev) c'est le repli reportlab (sans tableaux) — la voie
|
||||
WeasyPrint est celle des conteneurs Docker/prod.
|
||||
- Le sommaire et les sections sont en dur dans `index.html` : tout ajout futur
|
||||
de section passe par `guide_content.py` + les deux scripts (jamais à la main).
|
||||
Reference in New Issue
Block a user