347 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # 📋 Checklist d'intégration - Wikilinks & Graph View
 | ||
| 
 | ||
| ## ✅ Ce qui a été créé automatiquement
 | ||
| 
 | ||
| ### Services (3 fichiers)
 | ||
| - ✅ `src/services/wikilink-parser.service.ts`
 | ||
| - ✅ `src/services/note-index.service.ts`
 | ||
| - ✅ `src/services/note-preview.service.ts`
 | ||
| 
 | ||
| ### Composants (4 composants)
 | ||
| - ✅ `src/components/note-preview-card/`
 | ||
| - ✅ `src/components/graph-options-panel/`
 | ||
| - ✅ `src/components/graph-view-container/`
 | ||
| - ✅ `src/components/graph-view/` (modifié avec d3-force)
 | ||
| 
 | ||
| ### Modifications
 | ||
| - ✅ `src/components/tags-view/note-viewer/note-viewer.component.ts` (hover preview)
 | ||
| - ✅ `src/styles.css` (styles wikilinks et overlays)
 | ||
| 
 | ||
| ### Documentation (4 fichiers)
 | ||
| - ✅ `docs/WIKILINKS_README.md`
 | ||
| - ✅ `docs/WIKILINKS_GRAPH_IMPLEMENTATION.md`
 | ||
| - ✅ `docs/WIKILINKS_QUICK_START.md`
 | ||
| - ✅ `INTEGRATION_CHECKLIST.md` (ce fichier)
 | ||
| 
 | ||
| ### Tests
 | ||
| - ✅ `src/services/wikilink-parser.service.spec.ts`
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 🔧 Étapes d'intégration manuelle
 | ||
| 
 | ||
| ### Étape 1 : Identifier votre service de vault principal
 | ||
| 
 | ||
| Trouvez où vous chargez les notes dans votre application.
 | ||
| 
 | ||
| **Exemple possible** : `src/services/vault.service.ts` ou `src/app.component.ts`
 | ||
| 
 | ||
| ```typescript
 | ||
| // Votre fichier actuel (à identifier)
 | ||
| export class VaultService {
 | ||
|   notes = signal<Note[]>([]);
 | ||
|   
 | ||
|   loadNotes() {
 | ||
|     // Votre logique de chargement actuelle
 | ||
|     this.http.get<Note[]>('/api/notes').subscribe(notes => {
 | ||
|       this.notes.set(notes);
 | ||
|     });
 | ||
|   }
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### Étape 2 : Ajouter le scan du vault
 | ||
| 
 | ||
| **Fichier à modifier** : Le service identifié à l'étape 1
 | ||
| 
 | ||
| ```typescript
 | ||
| import { NoteIndexService } from './services/note-index.service';
 | ||
| 
 | ||
| export class VaultService {
 | ||
|   private noteIndexService = inject(NoteIndexService);
 | ||
|   notes = signal<Note[]>([]);
 | ||
|   
 | ||
|   loadNotes() {
 | ||
|     this.http.get<Note[]>('/api/notes').subscribe(notes => {
 | ||
|       this.notes.set(notes);
 | ||
|       
 | ||
|       // ✨ AJOUTER CETTE LIGNE
 | ||
|       this.noteIndexService.scanVault(notes);
 | ||
|     });
 | ||
|   }
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| **Checkpoint** : ✅ L'index est construit au chargement du vault
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ### Étape 3 : Identifier votre composant de vue de note
 | ||
| 
 | ||
| Trouvez le composant qui affiche une note individuelle.
 | ||
| 
 | ||
| **Exemple possible** : 
 | ||
| - `src/components/note-page/note-page.component.ts`
 | ||
| - `src/components/note-display/note-display.component.ts`
 | ||
| - `src/app/pages/note/note.component.ts`
 | ||
| 
 | ||
| ### Étape 4 : Activer les previews dans note-viewer
 | ||
| 
 | ||
| **Fichier à modifier** : Le composant identifié à l'étape 3
 | ||
| 
 | ||
| ```typescript
 | ||
| // AVANT
 | ||
| @Component({
 | ||
|   template: `
 | ||
|     <app-note-viewer
 | ||
|       [note]="currentNote()"
 | ||
|       [noteHtmlContent]="htmlContent()">
 | ||
|     </app-note-viewer>
 | ||
|   `
 | ||
| })
 | ||
| 
 | ||
| // APRÈS - Ajouter [allNotes]
 | ||
| @Component({
 | ||
|   template: `
 | ||
|     <app-note-viewer
 | ||
|       [note]="currentNote()"
 | ||
|       [noteHtmlContent]="htmlContent()"
 | ||
|       [allNotes]="allNotes()">  <!-- ✨ AJOUTER -->
 | ||
|     </app-note-viewer>
 | ||
|   `
 | ||
| })
 | ||
| export class NotePageComponent {
 | ||
|   private vaultService = inject(VaultService);
 | ||
|   
 | ||
|   currentNote = signal<Note>(...);
 | ||
|   allNotes = computed(() => this.vaultService.notes());  // ✨ AJOUTER
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| **Checkpoint** : ✅ Hover sur un wikilink affiche une preview card
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ### Étape 5 : Ajouter le toggle Document/Graph
 | ||
| 
 | ||
| **Fichier à modifier** : Le même composant qu'à l'étape 4
 | ||
| 
 | ||
| ```typescript
 | ||
| import { GraphViewContainerComponent } from './components/graph-view-container/graph-view-container.component';
 | ||
| 
 | ||
| @Component({
 | ||
|   template: `
 | ||
|     <div class="note-page-container">
 | ||
|       <!-- Toolbar avec toggle -->
 | ||
|       <div class="toolbar flex gap-2 p-4 border-b">
 | ||
|         <button 
 | ||
|           (click)="viewMode.set('document')"
 | ||
|           [class.active]="viewMode() === 'document'"
 | ||
|           class="px-4 py-2 rounded">
 | ||
|           📄 Document
 | ||
|         </button>
 | ||
|         <button 
 | ||
|           (click)="viewMode.set('graph')"
 | ||
|           [class.active]="viewMode() === 'graph'"
 | ||
|           class="px-4 py-2 rounded">
 | ||
|           🕸️ Graph
 | ||
|         </button>
 | ||
|       </div>
 | ||
|       
 | ||
|       <!-- Contenu conditionnel -->
 | ||
|       <div class="content-area flex-1">
 | ||
|         @if (viewMode() === 'document') {
 | ||
|           <app-note-viewer
 | ||
|             [note]="currentNote()"
 | ||
|             [noteHtmlContent]="htmlContent()"
 | ||
|             [allNotes]="allNotes()"
 | ||
|             (wikiLinkActivated)="onWikiLinkClick($event)">
 | ||
|           </app-note-viewer>
 | ||
|         } @else {
 | ||
|           <app-graph-view-container
 | ||
|             [centerNoteId]="currentNote().id"
 | ||
|             (nodeSelected)="onNodeSelected($event)">
 | ||
|           </app-graph-view-container>
 | ||
|         }
 | ||
|       </div>
 | ||
|     </div>
 | ||
|   `,
 | ||
|   imports: [NoteViewerComponent, GraphViewContainerComponent],
 | ||
|   styles: [`
 | ||
|     .note-page-container {
 | ||
|       display: flex;
 | ||
|       flex-direction: column;
 | ||
|       height: 100%;
 | ||
|     }
 | ||
|     
 | ||
|     .toolbar button.active {
 | ||
|       background-color: #4f46e5;
 | ||
|       color: white;
 | ||
|     }
 | ||
|     
 | ||
|     .content-area {
 | ||
|       overflow: auto;
 | ||
|     }
 | ||
|   `]
 | ||
| })
 | ||
| export class NotePageComponent {
 | ||
|   viewMode = signal<'document' | 'graph'>('document');  // ✨ AJOUTER
 | ||
|   currentNote = signal<Note>(...);
 | ||
|   allNotes = computed(() => this.vaultService.notes());
 | ||
|   
 | ||
|   onNodeSelected(nodeId: string) {  // ✨ AJOUTER
 | ||
|     // Naviguer vers la note sélectionnée
 | ||
|     this.router.navigate(['/note', nodeId]);
 | ||
|   }
 | ||
|   
 | ||
|   onWikiLinkClick(link: WikiLinkActivation) {  // ✨ AJOUTER
 | ||
|     this.router.navigate(['/note', link.target], {
 | ||
|       fragment: link.heading || link.block
 | ||
|     });
 | ||
|   }
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| **Checkpoint** : ✅ Bouton Graph affiche le graphe interactif
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 🧪 Tests de validation
 | ||
| 
 | ||
| ### Test 1 : Wikilinks cliquables
 | ||
| 1. Créer une note avec `[[test]]`
 | ||
| 2. Vérifier que le lien est bleu et souligné
 | ||
| 3. Clic → navigation fonctionne
 | ||
| 
 | ||
| ### Test 2 : Preview au survol
 | ||
| 1. Hover sur un wikilink
 | ||
| 2. Attendre 300ms
 | ||
| 3. Une carte apparaît avec titre + extrait
 | ||
| 4. Quitter → carte disparaît
 | ||
| 
 | ||
| ### Test 3 : Graph View
 | ||
| 1. Cliquer sur "Graph"
 | ||
| 2. Voir le graphe avec le nœud actuel au centre
 | ||
| 3. Drag un nœud → il se déplace
 | ||
| 4. Ajuster un slider → le graphe réagit
 | ||
| 
 | ||
| ### Test 4 : Liens orphelins
 | ||
| 1. Créer `[[note-inexistante]]`
 | ||
| 2. Le lien doit être gris avec pointillés
 | ||
| 3. Hover → pas de preview (normal)
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 🎨 Personnalisation optionnelle
 | ||
| 
 | ||
| ### Couleurs des wikilinks
 | ||
| 
 | ||
| Ajouter dans `src/styles.css` :
 | ||
| 
 | ||
| ```css
 | ||
| :root {
 | ||
|   --wiki-link: #10b981;              /* Vert */
 | ||
|   --wiki-link-hover: #059669;
 | ||
|   --wiki-link-orphan: #ef4444;       /* Rouge */
 | ||
|   --wiki-link-orphan-hover: #dc2626;
 | ||
| }
 | ||
| ```
 | ||
| 
 | ||
| ### Forces du graphe par défaut
 | ||
| 
 | ||
| Modifier `src/components/graph-view-container/graph-view-container.component.ts` :
 | ||
| 
 | ||
| ```typescript
 | ||
| displayOptions = signal<GraphDisplayOptions>({
 | ||
|   showArrows: true,
 | ||
|   textFadeThreshold: 50,
 | ||
|   nodeSize: 7,              // Nœuds plus gros
 | ||
|   linkThickness: 2,         // Liens plus épais
 | ||
|   chargeStrength: -150,     // Plus de répulsion
 | ||
|   linkDistance: 120,        // Liens plus longs
 | ||
|   centerStrength: 0.1,      // Plus de centrage
 | ||
|   centerNodeId: undefined
 | ||
| });
 | ||
| ```
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 📊 Vérification finale
 | ||
| 
 | ||
| Cochez chaque élément :
 | ||
| 
 | ||
| ### Fonctionnalités core
 | ||
| - [ ] Scanner du vault appelé au chargement
 | ||
| - [ ] Wikilinks sont cliquables
 | ||
| - [ ] Preview card s'affiche au hover (300ms)
 | ||
| - [ ] Graph View remplace le document
 | ||
| - [ ] Drag & drop des nœuds fonctionne
 | ||
| 
 | ||
| ### Options du graphe
 | ||
| - [ ] Slider "Node size" modifie la taille
 | ||
| - [ ] Slider "Link thickness" modifie l'épaisseur
 | ||
| - [ ] Toggle "Arrows" affiche/cache les flèches
 | ||
| - [ ] Bouton "Animate" relance la simulation
 | ||
| - [ ] Forces ajustables fonctionnent
 | ||
| 
 | ||
| ### Performance
 | ||
| - [ ] Graph avec 100 notes : fluide (60fps)
 | ||
| - [ ] Preview s'ouvre rapidement (<500ms)
 | ||
| - [ ] Pas d'erreur dans la console
 | ||
| 
 | ||
| ### Responsive
 | ||
| - [ ] Desktop : Panneau options fixe à droite
 | ||
| - [ ] Mobile : Drawer coulissant pour options
 | ||
| - [ ] Preview cards s'adaptent à l'écran
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 🆘 Problèmes courants
 | ||
| 
 | ||
| ### "Property 'allNotes' does not exist"
 | ||
| 
 | ||
| Vous avez oublié d'ajouter l'input dans votre composant parent :
 | ||
| 
 | ||
| ```typescript
 | ||
| allNotes = computed(() => this.vaultService.notes());
 | ||
| ```
 | ||
| 
 | ||
| ### "Cannot find module 'graph-view-container'"
 | ||
| 
 | ||
| Vérifiez le chemin d'import relatif depuis votre composant.
 | ||
| 
 | ||
| ### "Le graphe est vide"
 | ||
| 
 | ||
| ```typescript
 | ||
| // Vérifier que le scan a été fait
 | ||
| console.log('Nodes:', this.noteIndexService.getAllNodes().length);
 | ||
| 
 | ||
| // Si 0, appeler scanVault()
 | ||
| this.noteIndexService.scanVault(this.allNotes());
 | ||
| ```
 | ||
| 
 | ||
| ### "Les previews ne s'affichent jamais"
 | ||
| 
 | ||
| Vérifiez que `[allNotes]` est bien passé au note-viewer.
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## 📚 Ressources
 | ||
| 
 | ||
| - **Documentation complète** : `docs/WIKILINKS_GRAPH_IMPLEMENTATION.md`
 | ||
| - **Guide rapide** : `docs/WIKILINKS_QUICK_START.md`
 | ||
| - **Exemples de code** : Voir les docs ci-dessus
 | ||
| 
 | ||
| ---
 | ||
| 
 | ||
| ## ✅ C'est fait !
 | ||
| 
 | ||
| Une fois toutes les étapes complétées, vous avez :
 | ||
| 
 | ||
| ✨ **Wikilinks cliquables** avec preview au survol  
 | ||
| 🕸️ **Graph View interactif** avec toutes les options  
 | ||
| ⚡ **Performance optimisée** pour 1000+ notes  
 | ||
| 📱 **Responsive** desktop et mobile  
 | ||
| 
 | ||
| **Bon travail !** 🎉
 |