8.6 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	📋 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
// 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
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
// 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
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
- Créer une note avec [[test]]
- Vérifier que le lien est bleu et souligné
- Clic → navigation fonctionne
Test 2 : Preview au survol
- Hover sur un wikilink
- Attendre 300ms
- Une carte apparaît avec titre + extrait
- Quitter → carte disparaît
Test 3 : Graph View
- Cliquer sur "Graph"
- Voir le graphe avec le nœud actuel au centre
- Drag un nœud → il se déplace
- Ajuster un slider → le graphe réagit
Test 4 : Liens orphelins
- Créer [[note-inexistante]]
- Le lien doit être gris avec pointillés
- Hover → pas de preview (normal)
🎨 Personnalisation optionnelle
Couleurs des wikilinks
Ajouter dans src/styles.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 :
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 :
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"
// 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 ! 🎉