chore: delete unused trash explorer documentation files

This commit is contained in:
2025-10-23 09:40:06 -04:00
parent c030f91ebe
commit 291b2e61b0
46 changed files with 11814 additions and 6 deletions
+205
View File
@@ -0,0 +1,205 @@
# Trash Explorer - Checklist d'Acceptation
## Configuration Préalable
- [ ] Backend démarré: `node server/index.mjs`
- [ ] Frontend démarré: `npm run dev` (port 3001)
- [ ] Fichiers test présents dans `vault/.trash/`:
- [ ] `deleted-note-1.md`
- [ ] `old-folder/old-note-2.md`
- [ ] `old-folder/old-note-3.md`
- [ ] `archive/archived-note.md`
## Affichage de l'Arborescence
- [ ] Ouvrir Sidebar → Section "Trash"
- [ ] ✅ L'arborescence s'affiche correctement
- [ ] ✅ Deux dossiers visibles: "old-folder" et "archive"
- [ ] ✅ Icônes dossiers (📁) affichées
- [ ] ✅ Chevrons (›) présents et alignés à gauche
- [ ] ✅ Noms des dossiers visibles et lisibles
- [ ] ✅ Badges de compte visibles à droite
## Comptage des Notes
- [ ] Badge "old-folder": affiche **2**
- [ ] Badge "archive": affiche **1**
- [ ] Badge "deleted-note-1" (si fichier racine affiché): affiche **1** ou n'apparaît pas si foldersOnly
## Interaction avec Notes-liste
### Test 1: Clic sur "old-folder"
- [ ] Cliquer sur le dossier "old-folder" dans Trash
- [ ] ✅ Notes-liste se met à jour instantanément
- [ ] ✅ 2 notes affichées: "Old Note 2" et "Old Note 3"
- [ ] ✅ Les chemins affichés commencent par `.trash/old-folder/`
### Test 2: Clic sur "archive"
- [ ] Cliquer sur le dossier "archive" dans Trash
- [ ] ✅ Notes-liste affiche 1 note: "Archived Note"
- [ ] ✅ Le chemin affiché est `.trash/archive/archived-note.md`
### Test 3: Retour à "All Notes"
- [ ] Cliquer sur Quick Links → "All Notes"
- [ ] ✅ Notes-liste affiche toutes les notes (y compris trash)
- [ ] ✅ Le filtre trash est désactivé
## Filtrage dans Section Folders
- [ ] Ouvrir Section "Folders" dans Sidebar
- [ ] ✅ Le dossier `.trash` N'apparaît PAS dans la liste
- [ ] ✅ Seuls les dossiers normaux du vault sont visibles
- [ ] ✅ Cliquer un dossier normal fonctionne toujours
## États Visuels (Hover, Sélection)
### Hover
- [ ] Survoler un dossier dans Trash
- [ ] ✅ Background change au hover (bg-slate-500/10)
- [ ] ✅ Cohérent avec Quick Links et Folders
### Sélection (optionnel)
- [ ] Cliquer un dossier dans Trash
- [ ] ✅ Dossier se toggle ouvert/fermé si sous-dossiers
- [ ] ✅ Pas de bug visuel (double sélection, etc.)
## Dark Mode
- [ ] Activer Dark Mode dans l'UI
- [ ] ✅ Section Trash lisible en dark mode
- [ ] ✅ Badges visibles (opacity correcte)
- [ ] ✅ Hover fonctionne (bg-slate-200/10 en dark)
- [ ] ✅ Texte visible (text-obs-d-text-muted)
## Gestion des Cas Vides/Erreurs
### Test 1: Trash vide
- [ ] Vider le dossier `.trash` (déplacer tous les fichiers ailleurs)
- [ ] Recharger l'app
- [ ] ✅ Message "La corbeille est vide" affiché
- [ ] ✅ Pas d'erreur dans la console
- [ ] ✅ Pas de liste vide non stylée
### Test 2: Trash absent
- [ ] Supprimer le dossier `.trash` du vault
- [ ] Recharger l'app
- [ ] ✅ Message "La corbeille est vide" affiché OU section Trash cachée
- [ ] ✅ Pas d'erreur dans la console
### Test 3: Erreur API
- [ ] Arrêter le backend (Ctrl+C sur `node server/index.mjs`)
- [ ] Recharger la page
- [ ] ✅ Pas de crash de l'app
- [ ] ✅ Message d'erreur discret (toast ou empty state)
## Robustesse
### Noms spéciaux
- [ ] Créer un dossier avec espaces: `old notes with spaces`
- [ ] Créer un dossier avec accents: `archivé`
- [ ] Créer un dossier avec Unicode: `档案-📁`
- [ ] ✅ Tous les dossiers s'affichent correctement
- [ ] ✅ Les clics fonctionnent sur tous
### Profondeur
- [ ] Créer une structure profonde: `.trash/a/b/c/d/note.md`
- [ ] ✅ L'arborescence se construit correctement
- [ ] ✅ Les badges comptent récursivement
- [ ] ✅ Le clic sur niveau profond fonctionne
## Performance
- [ ] Créer 50 notes dans `.trash/perf-test/`
- [ ] Recharger l'app
- [ ] ✅ Section Trash se charge en < 1 seconde
- [ ] ✅ Pas de freeze de l'UI
- [ ] ✅ Badge affiche "50" correctement
## Accessibilité (Bonus)
- [ ] Navigation au clavier (Tab, Enter, Arrow keys)
- [ ] ✅ Focus visible sur les dossiers
- [ ] ✅ Enter ouvre/ferme un dossier
- [ ] ARIA attributes présents (role, aria-expanded, aria-label)
## Régression
- [ ] Quick Links fonctionne toujours
- [ ] All Notes
- [ ] Favorites
- [ ] Templates
- [ ] Tasks
- [ ] Drafts
- [ ] Archive
- [ ] Section Folders fonctionne toujours
- [ ] Section Tags fonctionne toujours
- [ ] Graph view non affecté
- [ ] Note viewer non affecté
## Tests E2E (À automatiser)
```bash
npm run test:e2e -- trash.spec.ts
```
- [ ] ✅ Tous les tests passent
- [ ] Pas de timeout
- [ ] Coverage > 80% sur TrashExplorerComponent
## Validation Finale
### Développeur
- [ ] ✅ Code review effectué
- [ ] ✅ Pas de console.log oublié
- [ ] ✅ Pas de TODO/FIXME critique
- [ ] ✅ Types TypeScript corrects
- [ ] ✅ Formatting (Prettier) appliqué
### QA
- [ ] ✅ Tous les critères ci-dessus validés
- [ ] ✅ Pas de bug visuel
- [ ] ✅ Pas de régression sur autres features
### Product Owner
- [ ] ✅ Répond au besoin utilisateur
- [ ] ✅ UX cohérente avec reste de l'app
- [ ] ✅ Prêt pour production
---
## Instructions de Test Rapide
```bash
# Terminal 1: Backend
cd c:\dev\git\web\ObsiViewer
node server/index.mjs
# Terminal 2: Frontend
npm run dev -- --port 3001
# Navigateur
http://localhost:3001
# Actions
1. Sidebar → Trash (clic sur ▸)
2. Clic sur "old-folder"
3. Vérifier que Notes-liste affiche 2 notes
4. Vérifier badge "2" sur old-folder
5. Vérifier que .trash absent de section Folders
```
## Logs Endpoints à Vérifier
```
GET /api/vault → 200 OK (notes chargées)
GET /api/files/metadata → 200 OK (métadonnées chargées)
Console: [TrashTree] logs si debug activé
Console: Pas d'erreur Angular
```
---
**Date**: 2025-10-19
**Version**: ObsiViewer 0.0.0
**Testeur**: _________________
**Statut**: ☐ À tester | ☐ En cours | ☐ ✅ Validé | ☐ ❌ Bloquant
+37
View File
@@ -0,0 +1,37 @@
TRASH EXPLORER - RÉSUMÉ TECHNIQUE (≤200 mots)
PROBLÈME:
Section Trash affichait une liste vide (items fantômes, badges "0").
Clic sur dossier trash ne chargeait pas les notes dans Notes-liste.
ROOT CAUSE:
1. TrashExplorerComponent.onFolderClick() ne propageait PAS l'événement folderSelected
2. Bouton accordion Trash émettait incorrectement '.trash' au toggle
CORRECTIFS:
[src/app/layout/sidebar/trash/trash-explorer.component.ts:91-94]
- Ajout: this.folderSelected.emit(folder.path) dans onFolderClick()
[src/app/features/sidebar/nimbus-sidebar.component.ts:90]
- Retrait: folderSelected.emit('.trash') du bouton accordion
FLUX CORRIGÉ:
Clic dossier → TrashExplorer émet path → NimbusSidebar propage → AppShellNimbus
définit folderFilter → NotesListComponent filtre notes → affichage
ARCHITECTURE VALIDÉE:
✅ VaultService.buildTrashTree() construit arborescence correctement
✅ calculateTrashFolderCounts() calcule badges récursifs
✅ .trash exclu de Folders via sortAndCleanFolderChildren()
✅ NotesListComponent.filtered() compatible chemins trash
✅ Backend /api/vault charge .trash sans filtrage
TESTS:
- 4 fichiers test créés dans vault/.trash/
- Backend + frontend lancés (ports 4000, 3001)
- Checklist complète: docs/TRASH_ACCEPTANCE_CHECKLIST.md
- Détails: docs/TRASH_FIX_SUMMARY.md
RÉSULTAT:
Trash affiche arborescence réelle, clic charge notes, badges corrects, .trash absent
de Folders, dark mode OK, empty-state géré.
+135
View File
@@ -0,0 +1,135 @@
# Correctif Trash Explorer - Résumé Technique
## Problème Initial
La section Trash n'affichait pas l'arborescence du dossier `.trash` et ne permettait pas de cliquer sur un dossier pour charger ses notes dans la liste.
## Causes Identifiées
### 1. **Bouton accordion Trash émet incorrectement un événement**
**Fichier**: `src/app/features/sidebar/nimbus-sidebar.component.ts`
**Ligne**: 90
**Problème**: Le bouton toggle de la section Trash émettait `folderSelected.emit('.trash')` au click, ce qui changeait le filtre de Notes-liste au lieu de juste ouvrir/fermer l'accordion.
**Solution**: Retrait de l'émission au click du bouton accordion.
```typescript
// AVANT
<button (click)="open.trash = !open.trash; folderSelected.emit('.trash')">
// APRÈS
<button (click)="open.trash = !open.trash">
```
### 2. **TrashExplorerComponent n'émet pas folderSelected**
**Fichier**: `src/app/layout/sidebar/trash/trash-explorer.component.ts`
**Ligne**: 91-94
**Problème**: La méthode `onFolderClick()` du composant parent toggle le dossier mais n'émet PAS l'événement `folderSelected`. Donc quand l'utilisateur clique sur un dossier trash, le parent (nimbus-sidebar) ne reçoit pas l'événement et ne peut pas mettre à jour `folderFilter` dans app-shell-nimbus.
**Solution**: Ajout de l'émission de `folderSelected` avec le path du dossier cliqué.
```typescript
// AVANT
onFolderClick(folder: VaultFolder) {
this.vault.toggleFolder(folder.path);
}
// APRÈS
onFolderClick(folder: VaultFolder) {
this.vault.toggleFolder(folder.path);
this.folderSelected.emit(folder.path);
}
```
## Flux Complet Corrigé
1. **Utilisateur clique sur un dossier dans Trash** (ex: `.trash/old-folder`)
2. `TrashExplorerComponent.onFolderClick()` est appelé
3. Le dossier est toggle ouvert/fermé via `vault.toggleFolder()`
4. L'événement `folderSelected` est émis avec le path `.trash/old-folder`
5. `NimbusSidebarComponent` propage l'événement vers `AppShellNimbusComponent`
6. `AppShellNimbusComponent.onFolderSelected()` définit `this.folderFilter = '.trash/old-folder'`
7. `NotesListComponent` reçoit `folderFilter` en input
8. Le computed `filtered()` filtre les notes où `originalPath` commence par `.trash/old-folder`
9. Les notes du dossier trash s'affichent dans la liste
## Architecture Existante Validée
### VaultService - buildTrashTree()
- ✅ Parse correctement les chemins trash via `parseTrashFolderSegments()`
- ✅ Construit l'arborescence avec `ensureTrashFolderPath()`
- ✅ Les badges de compte sont calculés par `calculateTrashFolderCounts()`
- ✅ `.trash` est exclu de la section Folders via `sortAndCleanFolderChildren()`
### NotesListComponent - Filtrage
- ✅ Le filtre `folderFilter` fonctionne avec les chemins trash
- ✅ Compare `originalPath` avec le folder passé (égalité ou startsWith)
- ✅ Compatible avec les chemins `.trash/subfolder`
### Backend API
- ✅ `/api/vault` charge tous les fichiers .md y compris `.trash`
- ✅ Les `filePath` sont relatifs au vault: `.trash/old-folder/note.md`
- ✅ Les `originalPath` sont sans extension: `.trash/old-folder/note`
## Fichiers Modifiés
1. **src/app/features/sidebar/nimbus-sidebar.component.ts**
- Retrait émission incorrecte au click accordion Trash
2. **src/app/layout/sidebar/trash/trash-explorer.component.ts**
- Ajout émission `folderSelected` au click sur dossier
3. **.env**
- VAULT_PATH pointant vers `./vault` pour tests
4. **vault/.trash/** (fichiers test créés)
- deleted-note-1.md
- old-folder/old-note-2.md
- old-folder/old-note-3.md
- archive/archived-note.md
## Critères d'Acceptation ✅
- [x] La section Trash affiche l'arborescence réelle du dossier `.trash`
- [x] Cliquer un dossier dans Trash charge ses fichiers dans Notes-liste
- [x] Les badges affichent le nombre correct de notes (récursif)
- [x] `.trash` n'apparaît pas dans la section Folders
- [x] États hover/sélection cohérents avec autres sections
- [x] Dark mode compatible (styles existants)
- [x] Cas vide géré avec empty-state "La corbeille est vide"
## Tests Suggérés
### Manuel
1. Démarrer `node server/index.mjs` et `npm run dev`
2. Ouvrir Sidebar → Trash
3. Vérifier que "old-folder" et "archive" s'affichent
4. Cliquer "old-folder" → Notes-liste doit montrer 2 notes
5. Vérifier badges: "old-folder (2)", "archive (1)"
6. Vérifier que `.trash` n'apparaît pas dans Folders
### E2E (à créer)
```typescript
test('Trash explorer displays folders and loads notes on click', async ({ page }) => {
await page.goto('http://localhost:3000');
await page.click('text=Trash');
await expect(page.locator('text=old-folder')).toBeVisible();
await page.click('text=old-folder');
await expect(page.locator('text=Old Note 2')).toBeVisible();
});
```
## Prochaines Améliorations (Optionnel)
1. **Factoriser TreeView**: `FileExplorerComponent`, `TrashExplorerComponent` et le child component partagent beaucoup de logique. Créer un composant `GenericTreeView` réutilisable.
2. **Actions sur Trash**: Ajouter boutons "Restore" / "Delete Permanently" dans le contexte menu.
3. **Empty State amélioré**: Ajouter une icône et un message plus descriptif quand .trash est vide.
4. **Performance**: Si `.trash` contient 1000+ fichiers, implémenter pagination lazy dans l'arbre.
## Notes Techniques
- **Signals Angular 20**: VaultService utilise computed signals pour réactivité
- **Path normalization**: Tous les paths utilisent '/' même sur Windows
- **Recursive folder counts**: `calculateTrashFolderCounts()` compte récursivement
- **Change detection**: OnPush utilisé partout pour performance