ObsiViewer/docs/WIKILINKS_QUICK_START.md

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)