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 Obsidian
- search-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 dossiers
- tag:→ liste des tags indexés
- file:→ 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 fichier
- file:name- nom du fichier
- tag:#todo- tags
- line:keyword- mots sur la même ligne
- section:heading- sous le même heading
- [property:value]- propriétés frontmatter
- OR- union
- AND- intersection (implicite)
- -term- exclusion
- "phrase"- correspondance exacte
- term*- 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 #code
- path: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