218 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Wikilinks & Graph View - Guide de démarrage rapide
 | |
| 
 | |
| ## 🚀 Intégration en 5 minutes
 | |
| 
 | |
| ### Étape 1 : Scanner le vault
 | |
| 
 | |
| Dans votre service principal de gestion du vault :
 | |
| 
 | |
| ```typescript
 | |
| // vault.service.ts ou app.component.ts
 | |
| import { NoteIndexService } from './services/note-index.service';
 | |
| 
 | |
| export class VaultService {
 | |
|   private noteIndexService = inject(NoteIndexService);
 | |
|   
 | |
|   loadVault() {
 | |
|     this.http.get<Note[]>('/api/notes').subscribe(notes => {
 | |
|       this.notes.set(notes);
 | |
|       
 | |
|       // Scanner pour construire l'index
 | |
|       this.noteIndexService.scanVault(notes);
 | |
|     });
 | |
|   }
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Étape 2 : Activer les previews dans note-viewer
 | |
| 
 | |
| ```typescript
 | |
| // Votre composant de vue de note
 | |
| @Component({
 | |
|   selector: 'app-note-page',
 | |
|   template: `
 | |
|     <app-note-viewer
 | |
|       [note]="note()"
 | |
|       [noteHtmlContent]="htmlContent()"
 | |
|       [allNotes]="allNotes()"  <!-- IMPORTANT -->
 | |
|       (wikiLinkActivated)="navigateToNote($event)">
 | |
|     </app-note-viewer>
 | |
|   `
 | |
| })
 | |
| export class NotePageComponent {
 | |
|   note = signal<Note>(...);
 | |
|   allNotes = signal<Note[]>(...); // Toutes les notes du vault
 | |
|   
 | |
|   navigateToNote(link: WikiLinkActivation) {
 | |
|     this.router.navigate(['/note', link.target], {
 | |
|       fragment: link.heading || link.block
 | |
|     });
 | |
|   }
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Étape 3 : Ajouter le Graph View
 | |
| 
 | |
| ```typescript
 | |
| // note-page.component.ts
 | |
| import { GraphViewContainerComponent } from './components/graph-view-container/graph-view-container.component';
 | |
| 
 | |
| @Component({
 | |
|   template: `
 | |
|     <div class="note-page">
 | |
|       <!-- Toggle Document/Graph -->
 | |
|       <div class="toolbar">
 | |
|         <button (click)="viewMode.set('document')">Document</button>
 | |
|         <button (click)="viewMode.set('graph')">Graph</button>
 | |
|       </div>
 | |
|       
 | |
|       <!-- Content -->
 | |
|       @if (viewMode() === 'document') {
 | |
|         <app-note-viewer [note]="note()" [allNotes]="allNotes()">
 | |
|         </app-note-viewer>
 | |
|       } @else {
 | |
|         <app-graph-view-container
 | |
|           [centerNoteId]="note().id"
 | |
|           (nodeSelected)="navigateToNote($event)">
 | |
|         </app-graph-view-container>
 | |
|       }
 | |
|     </div>
 | |
|   `,
 | |
|   imports: [NoteViewerComponent, GraphViewContainerComponent]
 | |
| })
 | |
| export class NotePageComponent {
 | |
|   viewMode = signal<'document' | 'graph'>('document');
 | |
|   note = signal<Note>(...);
 | |
|   allNotes = signal<Note[]>(...);
 | |
|   
 | |
|   navigateToNote(noteIdOrLink: string | WikiLinkActivation) {
 | |
|     if (typeof noteIdOrLink === 'string') {
 | |
|       this.router.navigate(['/note', noteIdOrLink]);
 | |
|     } else {
 | |
|       this.router.navigate(['/note', noteIdOrLink.target], {
 | |
|         fragment: noteIdOrLink.heading || noteIdOrLink.block
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| }
 | |
| ```
 | |
| 
 | |
| ## ✅ Vérification
 | |
| 
 | |
| ### Test 1 : Wikilinks
 | |
| 
 | |
| Créez une note avec ce contenu :
 | |
| 
 | |
| ```markdown
 | |
| # Test Note
 | |
| 
 | |
| Ce lien [[autre-note]] devrait être cliquable.
 | |
| Ce lien avec alias [[autre-note|Mon Alias]] aussi.
 | |
| Ce lien vers une section [[autre-note#Introduction]].
 | |
| ```
 | |
| 
 | |
| **Attendu :**
 | |
| - Les liens sont bleus et soulignés
 | |
| - Hover → preview card apparaît
 | |
| - Clic → navigation
 | |
| 
 | |
| ### Test 2 : Graph View
 | |
| 
 | |
| 1. Ouvrez une note
 | |
| 2. Cliquez sur "Graph"
 | |
| 3. Vous devriez voir :
 | |
|    - Le nœud central (note actuelle) mis en évidence
 | |
|    - Les notes liées autour
 | |
|    - Un panneau d'options à droite
 | |
| 
 | |
| ### Test 3 : Preview au survol
 | |
| 
 | |
| 1. Hovez sur un wikilink
 | |
| 2. Attendez 300ms
 | |
| 3. Une carte devrait apparaître avec :
 | |
|    - Le titre de la note
 | |
|    - Un extrait du contenu
 | |
|    - Un bouton "↗" pour ouvrir
 | |
| 
 | |
| ## 🎨 Personnalisation
 | |
| 
 | |
| ### Changer les couleurs des wikilinks
 | |
| 
 | |
| ```css
 | |
| /* styles.css */
 | |
| :root {
 | |
|   --wiki-link: #10b981;           /* Vert pour les liens valides */
 | |
|   --wiki-link-hover: #059669;
 | |
|   --wiki-link-orphan: #ef4444;    /* Rouge pour les orphelins */
 | |
|   --wiki-link-orphan-hover: #dc2626;
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Ajuster les forces du graphe
 | |
| 
 | |
| ```typescript
 | |
| <app-graph-view-container
 | |
|   [centerNoteId]="note().id"
 | |
|   [initialOptions]="{
 | |
|     forces: {
 | |
|       chargeStrength: -150,      // Plus de répulsion
 | |
|       linkDistance: 120,         // Liens plus longs
 | |
|       centerStrength: 0.1        // Plus de centrage
 | |
|     }
 | |
|   }">
 | |
| </app-graph-view-container>
 | |
| ```
 | |
| 
 | |
| ## 🐛 Problèmes courants
 | |
| 
 | |
| ### "Les previews ne fonctionnent pas"
 | |
| 
 | |
| ```typescript
 | |
| // ❌ MAUVAIS
 | |
| <app-note-viewer [note]="note()">
 | |
| </app-note-viewer>
 | |
| 
 | |
| // ✅ BON
 | |
| <app-note-viewer [note]="note()" [allNotes]="allNotes()">
 | |
| </app-note-viewer>
 | |
| ```
 | |
| 
 | |
| ### "Le graphe est vide"
 | |
| 
 | |
| ```typescript
 | |
| // Vérifiez que le scan a été fait
 | |
| ngOnInit() {
 | |
|   this.noteIndexService.scanVault(this.allNotes());
 | |
|   
 | |
|   // Vérifiez qu'il y a des nœuds
 | |
|   const nodes = this.noteIndexService.getAllNodes();
 | |
|   console.log('Nodes:', nodes.length);
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### "Les performances sont mauvaises"
 | |
| 
 | |
| ```typescript
 | |
| // Limiter la profondeur du graphe
 | |
| buildGraphData(centerNoteId, 1)  // Au lieu de 2
 | |
| 
 | |
| // Ou filtrer les orphelins
 | |
| const graphData = this.noteIndexService.buildGraphData(centerNoteId)
 | |
|   .filter(node => node.backlinks.length > 0 || node.outlinks.length > 0);
 | |
| ```
 | |
| 
 | |
| ## 📖 Documentation complète
 | |
| 
 | |
| Pour plus de détails, consultez :
 | |
| - [WIKILINKS_GRAPH_IMPLEMENTATION.md](./WIKILINKS_GRAPH_IMPLEMENTATION.md) - Documentation complète
 | |
| - [Architecture et API](./WIKILINKS_GRAPH_IMPLEMENTATION.md#architecture)
 | |
| - [Tests et benchmarks](./WIKILINKS_GRAPH_IMPLEMENTATION.md#tests)
 | |
| 
 | |
| ## 🎯 Prochaines étapes
 | |
| 
 | |
| 1. ✅ Intégration de base fonctionnelle
 | |
| 2. ⏭️ Ajouter le zoom/pan au graphe (d3-zoom)
 | |
| 3. ⏭️ Implémenter les groupes de nœuds
 | |
| 4. ⏭️ Export du graphe en PNG
 | |
| 5. ⏭️ Support mobile (long-press + bottom sheet)
 |