ObsiViewer/URL_PRIORITY_FIX.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

159 lines
4.4 KiB
Markdown

# 🔧 Fix: URL Deep-Linking Priority Logic
## 🐛 Problème Identifié
L'URL `http://localhost:3000/?note=HOME.md&quick=Tâches` ne fonctionnait pas correctement car il y avait un **conflit entre les paramètres multiples**. Les effets appliquaient tous les filtres simultanément au lieu de respecter une priorité.
### Cause Racine
- `UrlStateService.parseUrlParams()` parsait tous les paramètres sans logique de priorité
- Pour `?note=HOME.md&quick=Tâches`, les effets appliquaient à la fois la note ET le filtre quick link
- Cela causait un comportement imprévisible et des conflits
## ✅ Solution Appliquée
### Implémentation de la Logique de Priorité
Dans `UrlStateService.parseUrlParams()`:
```typescript
private parseUrlParams(params: any): UrlState {
// Priorité: note > tag > folder > quick
// Si note est présent, ignorer les autres filtres
if (params['note']) {
return {
note: decodeURIComponent(params['note']),
tag: undefined,
folder: undefined,
quick: undefined,
search: params['search'] ? decodeURIComponent(params['search']) : undefined
};
}
// Si tag est présent, ignorer folder et quick
if (params['tag']) {
return {
note: undefined,
tag: decodeURIComponent(params['tag']),
folder: undefined,
quick: undefined,
search: params['search'] ? decodeURIComponent(params['search']) : undefined
};
}
// Si folder est présent, ignorer quick
if (params['folder']) {
return {
note: undefined,
tag: undefined,
folder: decodeURIComponent(params['folder']),
quick: undefined,
search: params['search'] ? decodeURIComponent(params['search']) : undefined
};
}
// Sinon, quick peut être présent
return {
note: undefined,
tag: undefined,
folder: undefined,
quick: params['quick'] ? decodeURIComponent(params['quick']) : undefined,
search: params['search'] ? decodeURIComponent(params['search']) : undefined
};
}
```
### Priorité Implémentée
1. **note** (priorité maximale) - ouvre directement la note, ignore tous les autres filtres
2. **tag** - applique le filtre tag, ignore folder et quick
3. **folder** - applique le filtre dossier, ignore quick
4. **quick** - applique le filtre quick link (seulement si aucun des autres n'est présent)
5. **search** - s'applique toujours en complément
## 📊 Résultat
### Avant la Correction
- `?note=HOME.md&quick=Tâches` → conflit entre note et quick link
- Comportement imprévisible, note peut ne pas s'ouvrir correctement
### Après la Correction
- `?note=HOME.md&quick=Tâches`**ouvre seulement la note HOME.md**
- Le paramètre `quick=Tâches` est ignoré (priorité respectée)
- Comportement prévisible et cohérent
## 🧪 Tests de Validation
### URLs à Tester
#### Test 1: Note seule
```
URL: ?note=HOME.md
Attendu: Note HOME.md s'ouvre
```
#### Test 2: Note + Quick (conflit résolu)
```
URL: ?note=HOME.md&quick=Tâches
Attendu: Note HOME.md s'ouvre, quick ignoré ✅
```
#### Test 3: Tag seul
```
URL: ?tag=home
Attendu: Filtre tag appliqué
```
#### Test 4: Tag + Folder (conflit résolu)
```
URL: ?tag=home&folder=Allo-3
Attendu: Filtre tag appliqué, folder ignoré ✅
```
#### Test 5: Folder seul
```
URL: ?folder=Allo-3
Attendu: Filtre folder appliqué
```
#### Test 6: Folder + Quick (conflit résolu)
```
URL: ?folder=Allo-3&quick=Favoris
Attendu: Filtre folder appliqué, quick ignoré ✅
```
#### Test 7: Quick seul
```
URL: ?quick=Tâches
Attendu: Filtre quick appliqué
```
#### Test 8: Combinaisons avec Search
```
URL: ?note=HOME.md&search=test
Attendu: Note HOME.md s'ouvre + recherche "test" appliquée ✅
```
## 🔧 Fichiers Modifiés
-`src/app/services/url-state.service.ts` - Ajout logique de priorité dans `parseUrlParams()`
## 📝 Notes Techniques
### Pourquoi cette approche?
- **Simple**: Pas besoin de modifier les effects existants
- **Robuste**: Logique centralisée dans le parsing
- **Prévisible**: Priorité claire et documentée
- **Compatible**: Fonctionne avec tous les effects existants
### Impact
- Aucun breaking change
- Amélioration de la cohérence des URLs
- Résolution des conflits entre paramètres multiples
- Meilleure expérience utilisateur pour le deep-linking
## 🎯 Status
**Status**: ✅ **FIXÉ ET COMPILÉ**
**Impact**: Amélioration de la logique de priorité pour les URLs
**Test requis**: Validation des combinaisons de paramètres
**Compatibilité**: 100% backward compatible