7.8 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	
			7.8 KiB
		
	
	
	
	
	
	
	
Mode Édition Markdown - Quick Start Guide
🚀 Démarrage rapide
Pour tester la fonctionnalité
- 
Démarrer le serveur de développement:
npm run dev - 
Ouvrir ObsiViewer dans le navigateur:
http://localhost:4200 - 
Ouvrir une note Markdown
 - 
Cliquer sur le bouton "Éditer" (icône crayon à gauche de "Open in Full Screen")
 - 
L'éditeur CodeMirror 6 se charge:
- Modifier le contenu
 - Utiliser 
Ctrl+S(ouCmd+S) pour sauvegarder - Cliquer sur "Close" pour revenir en lecture
 
 
🎯 Fonctionnalités implémentées
✅ Bouton "Éditer"
- Ajouté dans 
markdown-viewer.component.ts(ligne 48-59) - Placé à gauche du bouton "Open in Full Screen"
 - Icône lucide-edit-3 (crayon)
 - Émet un événement 
editModeRequested 
✅ Service d'état
EditorStateServicegère le mode'view' | 'edit'- Signal-based pour réactivité
 - Tracking du 
isDirtystate 
✅ Composant éditeur
MarkdownEditorComponent(standalone)- CodeMirror 6 avec extensions:
- Markdown syntax highlighting
 - Line numbers
 - Active line highlighting
 - Bracket matching
 - Search & replace (Ctrl+F)
 - History (undo/redo)
 - Autocomplete
 - Word wrap toggle
 
 
✅ Toolbar d'édition
- Save - Sauvegarde (Ctrl+S) + toast
 - Wrap - Toggle word wrap
 - Undo - Annuler
 - Redo - Refaire
 - Close - Quitter avec confirmation si dirty
 
✅ Lazy loading
- CodeMirror 6 chargé dynamiquement
 - Pas d'impact sur les performances en mode lecture
 - Import async dans 
smart-file-viewer.component.ts 
✅ Sauvegarde
- Intégration avec 
VaultService.saveMarkdown() - Autosave après 5s d'inactivité
 - Toast de succès/erreur via 
ToastService 
✅ Navigation guard
EditorCanDeactivateGuardempêche la perte de données- Confirmation si modifications non sauvegardées
 - Protection beforeunload (fermeture navigateur)
 
✅ Thème Dark/Light
- Variables CSS dans 
codemirror.css - Synchronisation automatique avec le thème du site
 - MutationObserver sur 
<html class="dark"> 
✅ Responsive
- Toolbar compacte sur mobile (≤ 640px)
 - Font-size ajustée
 - Padding réduit
 - Labels cachés, icônes conservées
 
📁 Fichiers créés/modifiés
Nouveaux fichiers
src/
├── app/features/editor/
│   ├── markdown-editor.module.ts              ← Module lazy
│   ├── markdown-editor.component.ts           ← Éditeur CodeMirror 6
│   └── editor-can-deactivate.guard.ts        ← Guard navigation
├── services/
│   └── editor-state.service.ts               ← Gestion d'état
├── styles/
│   └── codemirror.css                        ← Styles globaux
└── docs/
    ├── MARKDOWN_EDITOR.md                    ← Doc complète
    └── MARKDOWN_EDITOR_QUICKSTART.md         ← Ce fichier
Fichiers modifiés
src/
├── components/
│   ├── markdown-viewer/
│   │   └── markdown-viewer.component.ts      ← Bouton "Éditer" + output
│   └── smart-file-viewer/
│       └── smart-file-viewer.component.ts    ← Lazy loading éditeur
├── styles.css                                ← Import codemirror.css
└── package.json                              ← Dépendances CodeMirror 6
🧪 Tests à effectuer
Test 1: Basculement lecture ↔ édition
# Ouvrir une note
# Cliquer sur "Éditer"
# ✓ Transition fluide
# ✓ Contenu chargé
# ✓ Cursor visible
# Cliquer sur "Close"
# ✓ Retour en lecture
Test 2: Sauvegarde
# En mode édition
# Modifier le contenu
# Appuyer sur Ctrl+S
# ✓ Toast "Saved successfully"
# ✓ Flag dirty réinitialisé
# Rafraîchir la page
# ✓ Modifications persistées
Test 3: Navigation guard
# En mode édition
# Modifier le contenu
# Essayer de fermer l'onglet
# ✓ Confirmation beforeunload
# Confirmer "Quitter"
# Rouvrir la note
# ✓ Modifications non sauvegardées perdues (normal)
Test 4: Autosave
# En mode édition
# Modifier le contenu
# Attendre 6 secondes
# ✓ Toast "Saved successfully" automatique
# ✓ Flag dirty réinitialisé
Test 5: Thème Dark/Light
# En mode édition
# Basculer le thème (dark ↔ light)
# ✓ Couleurs de l'éditeur changent
# ✓ Contraste lisible
# ✓ Cursor visible
Test 6: Responsive mobile
# Ouvrir DevTools
# Passer en mode mobile (375px)
# Entrer en mode édition
# ✓ Toolbar compacte
# ✓ Boutons visibles
# ✓ Labels cachés (icônes seules)
# ✓ Scroll fluide
Test 7: Note lourde
# Ouvrir une note > 5000 lignes
# Entrer en mode édition
# ✓ Chargement rapide (< 1s)
# ✓ Scroll fluide
# ✓ Pas de lag à la frappe
Test 8: Front-matter YAML
# Ouvrir une note avec front-matter
---
title: Test
tags: [test, markdown]
---
# Contenu
# Entrer en mode édition
# ✓ Front-matter affiché correctement
# Modifier uniquement le corps
# Sauvegarder
# ✓ Front-matter préservé intact
🐛 Debugging
Activer les logs
Ouvrir la console DevTools et chercher:
[SmartFileViewer] Editor loaded successfully
[SmartFileViewer] Editor unloaded
Inspecter l'état
Dans la console:
// Injecter le service dans la console
const editorState = ng.probe($0).injector.get(EditorStateService);
// Vérifier l'état
console.log(editorState.mode());        // 'view' | 'edit'
console.log(editorState.isDirty());     // true | false
console.log(editorState.currentPath()); // chemin du fichier
Network tab
Vérifier que CodeMirror n'est chargé qu'en mode édition:
- Ouvrir Network tab (DevTools)
 - Ouvrir une note (mode lecture)
 - ✓ Aucun fichier 
codemirrorchargé - Cliquer sur "Éditer"
 - ✓ Fichiers 
@codemirror/*chargés dynamiquement 
📦 Dépendances installées
npm install @codemirror/view @codemirror/state @codemirror/language \
  @codemirror/lang-markdown @codemirror/commands @codemirror/search \
  @codemirror/autocomplete @codemirror/lint @codemirror/legacy-modes \
  @lezer/highlight
Taille bundle:
- Mode lecture: +0 KB (lazy loading)
 - Mode édition: ~150 KB (chargé à la demande)
 
🎨 Personnalisation
Modifier le thème
Éditer src/styles/codemirror.css:
:root {
  --cm-cursor: #your-color;
  --cm-selection-bg: #your-color;
  /* ... */
}
Ajouter une extension CodeMirror
Dans markdown-editor.component.ts, méthode initializeEditor():
const initialState = EditorState.create({
  extensions: [
    // ... extensions existantes
    myCustomExtension(),
  ]
});
Personnaliser la toolbar
Éditer le template de markdown-editor.component.ts:
<div class="markdown-editor__toolbar-right">
  <!-- Ajouter votre bouton ici -->
  <button (click)="myCustomAction()">...</button>
</div>
🚦 Critères d'acceptation (DoD)
- Bouton "Éditer" visible à gauche de "Open in Full Screen"
 - Passage lecture ↔ édition sans recharger la page
 - CodeMirror 6 configuré (Markdown, YAML, line numbers, wrap)
 - Ctrl/Cmd+S déclenche save() via VaultService
 - Toast "Enregistré" ou erreur I/O
 - Bouton "Close" ramène en vue lecture
 - Thème Dark/Light synchronisé
 - Responsive mobile (toolbar compacte)
 - Navigation guard si modifications non sauvegardées
 - Autosave après 5s d'inactivité
 - Tests manuels validés
 
🎓 Ressources
Documentation CodeMirror 6
Angular Signals
Architecture
- Voir 
docs/MARKDOWN_EDITOR.mdpour l'architecture détaillée 
Prêt à tester? Lance npm run dev et ouvre une note! 🚀