- 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
181 lines
3.8 KiB
Markdown
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.
|
|
|