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
 |