8.3 KiB
8.3 KiB
Graph View & Search Assistant Implementation
Résumé
Implémentation complète de la parité Graph View avec Obsidian et de l'assistant de requêtes dans les 3 barres de recherche.
Modules Créés
1. Search Parser (src/core/search/)
search-parser.types.ts: Types pour le parsing de requêtes Obsidiansearch-parser.ts: Parser complet avec support de:- Préfixes:
path:,file:,tag:,line:,section:,[property] - Opérateurs:
OR,AND,-(exclusion),*(wildcard),""(exact) - Parenthèses pour groupes
- Préfixes:
search-history.service.ts: Gestion de l'historique avec localStorage (10 dernières requêtes)
2. Graph Index Service (src/core/graph/)
graph-index.service.ts:- Indexation des fichiers, tags, paths, attachments
- Suggestions dynamiques pour l'autocomplétion
- Mise à jour automatique lors du chargement des notes
3. Search Query Assistant (src/components/search-query-assistant/)
search-query-assistant.component.ts: Popover d'assistance avec:- Options de recherche cliquables (path:, file:, tag:, etc.)
- Suggestions dynamiques selon le contexte
- Historique avec bouton "clear"
- Navigation clavier (↑↓ Enter Esc)
- Help inline avec opérateurs
4. Search Input Wrapper (src/components/search-input-with-assistant/)
search-input-with-assistant.component.ts:- Composant wrapper pour input + assistant
- Gestion focus/blur
- Clear button
- Intégration complète avec l'assistant
Intégrations
Graph Options Panel
- Ajout du composant
SearchInputWithAssistantComponentdans le filtre "Search files" - Synchronisation bidirectionnelle avec
GraphSettingsService - Gestion des Groups avec requêtes éditables
- Preview des couleurs de groupes
- Add/Remove/Update groups avec persistance JSON
Graph Settings Service (déjà existant, amélioré)
- Lecture/écriture de
.obsidian/graph.json - Debounce 250ms sur les sauvegardes
- Polling pour changements externes (2s)
- Préservation des clés inconnues
Graph Runtime Adapter (mise à jour)
- Utilisation du parser de recherche pour les filtres
- Query matching pour les color groups
- Support complet des filtres Obsidian
App Component
- Intégration de
SearchInputWithAssistantComponentdans:- Sidebar search (vue mobile) - context:
vault-sidebar - Header search (vue desktop) - context:
vault-header - Graph search (via graph-options-panel) - context:
graph
- Sidebar search (vue mobile) - context:
- Effet automatique pour rebuild de l'index lors du chargement des notes
- Méthode
onSearchSubmit()qui enregistre l'historique
Fonctionnalités Implémentées
✅ A. Parité Graph View - Filters
- Tags: Toggle pour afficher/masquer les nœuds de tags
- Attachments: Toggle pour afficher/masquer les fichiers non-MD
- Existing files only: Toggle inversé de
hideUnresolved - Orphans: Toggle pour afficher/masquer les nœuds isolés
- Search: Utilise le parser Obsidian-compatible pour filtrage avancé
✅ B. Parité Graph View - Groups
- Liste des groupes avec couleurs
- Query éditable pour chaque groupe
- Add/Remove/Duplicate groups
- Color preview (RGB + alpha)
- Matching avec le search parser
- Priorité par ordre (premier match gagne)
✅ C. Assistant de Requêtes
3 Emplacements:
- Barre latérale gauche (mobile/desktop)
- Header central (desktop)
- Graph settings → Filters
Comportement:
- Focus → ouvre le popover
- Options cliquables insèrent les préfixes
- Suggestions dynamiques:
path:→ liste des dossierstag:→ liste des tags indexésfile:→ liste des fichiers[property]→ propriétés YAML communes
- Historique des 10 dernières requêtes (localStorage)
- Navigation clavier complète
- Help tooltip avec exemples d'opérateurs
✅ D. Moteur de Recherche Obsidian-Compatible
Supporte:
path:folder/- chemin du fichierfile:name- nom du fichiertag:#todo- tagsline:keyword- mots sur la même lignesection:heading- sous le même heading[property:value]- propriétés frontmatterOR- unionAND- intersection (implicite)-term- exclusion"phrase"- correspondance exacteterm*- wildcard()- groupes avec parenthèses
✅ E. Persistence & Synchronisation
- JSON:
.obsidian/graph.jsonlu/écrit avec debounce - localStorage: Historique par contexte (vault-sidebar, vault-header, graph)
- Polling: Détection des changements externes (2s)
- Atomic writes: .tmp + rename
- Préservation: Toutes les clés inconnues sont conservées
Architecture
src/
├── core/
│ ├── search/
│ │ ├── search-parser.types.ts # Types du parser
│ │ ├── search-parser.ts # Parser Obsidian
│ │ └── search-history.service.ts # Historique localStorage
│ └── graph/
│ └── graph-index.service.ts # Index tags/paths/files
├── components/
│ ├── search-query-assistant/
│ │ └── search-query-assistant.component.ts # Popover assistant
│ ├── search-input-with-assistant/
│ │ └── search-input-with-assistant.component.ts # Wrapper input
│ └── graph-options-panel/
│ └── graph-options-panel.component.ts # Panel avec groups
└── app/
└── graph/
├── graph-settings.service.ts # Persistence JSON
├── graph-settings.types.ts # Types & conversions
└── graph-runtime-adapter.ts # Application filtres/groups
Tests Suggérés
Graph View Parité
-
Filtres de base:
- Activer/désactiver Tags → vérifier apparition nœuds #tag
- Activer/désactiver Attachments → vérifier fichiers PDF/PNG
- Existing files only → masquer liens cassés
- Orphans → masquer nœuds isolés
-
Search avec opérateurs:
tag:#code→ uniquement fichiers avec #codepath:folder/→ fichiers dans folder/tag:#todo OR tag:#urgent→ union-tag:#done→ exclusion"phrase exacte"→ match exact
-
Groups:
- Créer groupe avec query
file:test - Vérifier couleur appliquée aux nœuds matchant
- Tester priorité: premier groupe matché colore le nœud
- Créer groupe avec query
Assistant de Requêtes
-
Popover:
- Focus input → popover s'ouvre
- Clic sur
path:→ insère dans input - Taper
path:→ suggestions de dossiers apparaissent - Taper
tag:→ suggestions de tags apparaissent
-
Historique:
- Soumettre requête → apparaît dans historique
- Cliquer item historique → applique la requête
- "Clear history" → vide l'historique
- Recharger page → historique persiste
-
Navigation clavier:
- ↓ → sélectionner suggestion suivante
- ↑ → sélectionner suggestion précédente
- Enter → appliquer suggestion sélectionnée
- Esc → fermer popover
Persistence
-
JSON graph.json:
- Modifier filtre → vérifier écriture fichier (debounce 250ms)
- Modifier JSON manuellement → vérifier rechargement UI (2s)
- Vérifier préservation de
scale,close, etc.
-
localStorage:
- Vérifier 3 clés distinctes:
obsidian-search-history-vault-sidebar, etc. - Limité à 10 items par contexte
- Dernier en premier (LIFO)
- Vérifier 3 clés distinctes:
Commandes de Test
# Développement
npm start
# Build
npm run build
# Check types
npx tsc --noEmit
Conformité Obsidian
Image 1 vs Image 2 (Objectif)
- Topologie identique: Même nombre de nœuds/arêtes pour config identique
- Entités visibles: Tags, attachments, liens résolus/non résolus
- Couleurs groups: Matching précis des requêtes
Syntaxe Search (Images 3-6)
- Options identiques à Obsidian
- Suggestions contextuelles (paths, tags, files)
- Historique avec clear
- UI moderne avec Tailwind
Notes Techniques
Performance
- Index rebuild: O(n) où n = nombre de notes
- Suggestions: Limitées à 50 items pour performance
- Debounce: 250ms sur sauvegardes pour éviter I/O excessif
Compatibilité
- Angular 18+ (signals, effects)
- Tailwind CSS pour styling
- Standalone components
- SSR-safe (checks
typeof window)
Extensions Futures
- Support de
content:pour recherche full-text task:pour tasks Obsidian- Regex flags (case-sensitive)
- Synonymes/aliases dans suggestions