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

4.4 KiB

🔧 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():

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âchesouvre 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é
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