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