242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # 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
 | |
| - **`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 `SearchInputWithAssistantComponent` dans 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 `SearchInputWithAssistantComponent` dans:
 | |
|   1. **Sidebar search** (vue mobile) - context: `vault-sidebar`
 | |
|   2. **Header search** (vue desktop) - context: `vault-header`  
 | |
|   3. **Graph search** (via graph-options-panel) - context: `graph`
 | |
| - 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:**
 | |
| 1. Barre latérale gauche (mobile/desktop)
 | |
| 2. Header central (desktop)
 | |
| 3. 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.json` lu/é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é
 | |
| 1. **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
 | |
| 
 | |
| 2. **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
 | |
| 
 | |
| 3. **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
 | |
| 
 | |
| ### Assistant de Requêtes
 | |
| 1. **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
 | |
| 
 | |
| 2. **Historique:**
 | |
|    - Soumettre requête → apparaît dans historique
 | |
|    - Cliquer item historique → applique la requête
 | |
|    - "Clear history" → vide l'historique
 | |
|    - Recharger page → historique persiste
 | |
| 
 | |
| 3. **Navigation clavier:**
 | |
|    - ↓ → sélectionner suggestion suivante
 | |
|    - ↑ → sélectionner suggestion précédente
 | |
|    - Enter → appliquer suggestion sélectionnée
 | |
|    - Esc → fermer popover
 | |
| 
 | |
| ### Persistence
 | |
| 1. **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.
 | |
| 
 | |
| 2. **localStorage:**
 | |
|    - Vérifier 3 clés distinctes: `obsidian-search-history-vault-sidebar`, etc.
 | |
|    - Limité à 10 items par contexte
 | |
|    - Dernier en premier (LIFO)
 | |
| 
 | |
| ## Commandes de Test
 | |
| 
 | |
| ```bash
 | |
| # 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
 |