ObsiViewer/docs/URL_STATE/URL_STATE_QUICK_START.md
Bruno Charest 96745e9997 feat: add URL state synchronization for navigation
- Added UrlStateService to sync app state with URL parameters for note selection, tags, folders, and search
- Implemented URL state effects in AppComponent to handle navigation from URL parameters
- Updated sidebar and layout components to reflect URL state changes in UI
- Added URL state updates when navigating via note selection, tag clicks, and search
- Modified note sharing to use URL parameters instead of route paths
- Added auto-opening of relevant
2025-10-24 23:23:30 -04:00

181 lines
3.8 KiB
Markdown

# UrlStateService - Démarrage Rapide (5 minutes)
## 🚀 En 5 minutes
### Étape 1: Injecter le service dans AppComponent (1 min)
```typescript
// src/app/app.component.ts
import { Component, inject } from '@angular/core';
import { UrlStateService } from './services/url-state.service';
@Component({
selector: 'app-root',
standalone: true,
template: `...`
})
export class AppComponent {
private urlStateService = inject(UrlStateService);
// C'est tout! Le service s'initialise automatiquement
}
```
### Étape 2: Utiliser dans NotesListComponent (2 min)
```typescript
// src/app/features/list/notes-list.component.ts
import { Component, inject } from '@angular/core';
import { UrlStateService } from '../../services/url-state.service';
@Component({
selector: 'app-notes-list',
standalone: true,
template: `
<!-- Afficher le filtre actif -->
<div *ngIf="urlState.activeTag() as tag">
Filtre: #{{ tag }}
</div>
<!-- Ouvrir une note -->
<button *ngFor="let note of notes"
(click)="selectNote(note)">
{{ note.title }}
</button>
`
})
export class NotesListComponent {
urlState = inject(UrlStateService);
selectNote(note: Note): void {
this.urlState.openNote(note.filePath);
}
}
```
### Étape 3: Tester les URLs (2 min)
Ouvrez votre navigateur et testez:
```
# Ouvrir une note
http://localhost:4200/viewer?note=Docs/Architecture.md
# Filtrer par tag
http://localhost:4200/viewer?tag=Ideas
# Filtrer par dossier
http://localhost:4200/viewer?folder=Notes/Meetings
# Rechercher
http://localhost:4200/viewer?search=performance
```
## ✅ Vérification
- [ ] Le service est injecté dans AppComponent
- [ ] NotesListComponent utilise le service
- [ ] Les URLs fonctionnent
- [ ] L'état est restauré après rechargement
## 📚 Prochaines étapes
1. **Lire la documentation complète**
- `docs/URL_STATE_SERVICE_INTEGRATION.md`
2. **Voir les exemples**
- `src/app/components/url-state-integration-examples.ts`
3. **Intégrer dans d'autres composants**
- NoteViewComponent
- FoldersComponent
- TagsComponent
- SearchComponent
4. **Ajouter le partage de lien**
```typescript
async shareCurrentState(): Promise<void> {
await this.urlState.copyCurrentUrlToClipboard();
this.toast.success('Lien copié!');
}
```
## 🎯 Cas d'usage courants
### Ouvrir une note
```typescript
await this.urlState.openNote('Docs/Architecture.md');
```
### Filtrer par tag
```typescript
await this.urlState.filterByTag('Ideas');
```
### Filtrer par dossier
```typescript
await this.urlState.filterByFolder('Notes/Meetings');
```
### Rechercher
```typescript
await this.urlState.updateSearch('performance');
```
### Réinitialiser
```typescript
await this.urlState.resetState();
```
## 🔍 Signaux disponibles
```typescript
// État actuel
urlState.currentState()
// Note ouverte
urlState.currentNote()
// Tag actif
urlState.activeTag()
// Dossier actif
urlState.activeFolder()
// Quick link actif
urlState.activeQuickLink()
// Recherche active
urlState.activeSearch()
```
## 🐛 Troubleshooting
### L'URL ne change pas
```typescript
// ❌ Mauvais
this.currentTag = 'Ideas';
// ✅ Correct
await this.urlState.filterByTag('Ideas');
```
### La note n'est pas trouvée
Vérifiez le chemin exact:
```typescript
console.log(this.vault.allNotes().map(n => n.filePath));
```
### L'état n'est pas restauré
Assurez-vous que le service est injecté dans AppComponent.
## 📞 Besoin d'aide?
- Consultez `docs/URL_STATE_SERVICE_INTEGRATION.md`
- Vérifiez les exemples dans `src/app/components/url-state-integration-examples.ts`
- Exécutez les tests: `ng test --include='**/url-state.service.spec.ts'`
## 🎉 Vous êtes prêt!
Le service est maintenant intégré et fonctionnel. Continuez avec la documentation complète pour découvrir toutes les fonctionnalités.