306 lines
7.0 KiB
Markdown
306 lines
7.0 KiB
Markdown
# Corrections Bookmarks - Tests Failed
|
|
|
|
## Tests échoués identifiés
|
|
|
|
D'après le fichier `BOOKMARKS_TEST_PLAN.md`, 3 tests ont échoué:
|
|
|
|
1. **Test 3**: Drag vers la racine (zone "Drop here to move to root") - FAIL
|
|
2. **Test 4**: Drag entre groupes - FAIL
|
|
3. **Test 5**: Détection de cycles - FAIL
|
|
|
|
---
|
|
|
|
## Corrections appliquées
|
|
|
|
### 1. Correction de la logique de moveNode
|
|
|
|
**Problème**: Lors du réordonnancement dans le même conteneur, l'index n'était pas ajusté correctement après la suppression du node.
|
|
|
|
**Solution**: Ajout d'une logique d'ajustement d'index dans `bookmarks.utils.ts`:
|
|
|
|
```typescript
|
|
// If moving within the same parent, adjust index
|
|
let adjustedIndex = newIndex;
|
|
if (oldParentCtime === newParentCtime && oldIndex < newIndex) {
|
|
// When removing from earlier position, indices shift down
|
|
adjustedIndex = newIndex - 1;
|
|
}
|
|
```
|
|
|
|
**Fichier modifié**: `src/core/bookmarks/bookmarks.utils.ts`
|
|
|
|
---
|
|
|
|
### 2. Ajout de logs de debug
|
|
|
|
**Problème**: Difficile de diagnostiquer les problèmes de drag & drop sans visibilité.
|
|
|
|
**Solution**: Ajout de logs console détaillés dans:
|
|
- `BookmarksPanelComponent.handleDrop()`
|
|
- `BookmarkItemComponent.onChildDrop()`
|
|
|
|
**Logs affichés**:
|
|
```javascript
|
|
{
|
|
itemCtime: number,
|
|
fromParent: number | null,
|
|
toParent: number | null,
|
|
newIndex: number,
|
|
sameContainer: boolean
|
|
}
|
|
```
|
|
|
|
**Fichiers modifiés**:
|
|
- `src/components/bookmarks-panel/bookmarks-panel.component.ts`
|
|
- `src/components/bookmark-item/bookmark-item.component.ts`
|
|
|
|
---
|
|
|
|
### 3. Correction du fichier JSON invalide
|
|
|
|
**Problème**: Le fichier `vault/.obsidian/bookmarks.json` contenait un item invalide:
|
|
|
|
```json
|
|
{
|
|
"type": "file",
|
|
"ctime": 1759253065812,
|
|
"path": "groupeC" // ❌ Pas d'extension
|
|
}
|
|
```
|
|
|
|
**Solution**: Ajout de l'extension `.md`:
|
|
|
|
```json
|
|
{
|
|
"type": "file",
|
|
"ctime": 1759253065812,
|
|
"path": "groupeC.md" // ✅ Extension ajoutée
|
|
}
|
|
```
|
|
|
|
**Fichier modifié**: `vault/.obsidian/bookmarks.json`
|
|
|
|
---
|
|
|
|
## Instructions de test
|
|
|
|
### Rebuild et relance
|
|
|
|
```bash
|
|
# 1. Rebuild l'application
|
|
npm run build
|
|
|
|
# 2. Relancer le serveur
|
|
node server/index.mjs
|
|
|
|
# 3. Ouvrir http://localhost:3000
|
|
|
|
# 4. Ouvrir DevTools (F12) pour voir les logs
|
|
```
|
|
|
|
### Tests à refaire
|
|
|
|
#### Test 3: Drag vers la racine
|
|
|
|
1. Créer un groupe "Test Group"
|
|
2. Ajouter un bookmark dans ce groupe
|
|
3. **Ouvrir la console DevTools**
|
|
4. Drag le bookmark vers la zone "Drop here to move to root"
|
|
5. **Observer les logs dans la console**:
|
|
```
|
|
Drop event: {
|
|
itemCtime: ...,
|
|
fromParent: <ctime du groupe>,
|
|
toParent: null,
|
|
newIndex: 0,
|
|
sameContainer: false
|
|
}
|
|
```
|
|
6. Vérifier que le bookmark est maintenant à la racine
|
|
|
|
**Résultat attendu**: ✅ Le bookmark se déplace à la racine
|
|
|
|
---
|
|
|
|
#### Test 4: Drag entre groupes
|
|
|
|
1. Créer 2 groupes: "Groupe A" et "Groupe B"
|
|
2. Ajouter un bookmark dans Groupe A
|
|
3. **Ouvrir la console DevTools**
|
|
4. Drag le bookmark de Groupe A vers Groupe B
|
|
5. **Observer les logs**:
|
|
```
|
|
Child drop event: {
|
|
itemCtime: ...,
|
|
fromParent: <ctime de A>,
|
|
toParent: <ctime de B>,
|
|
toParentTitle: "Groupe B",
|
|
newIndex: 0,
|
|
sameContainer: false
|
|
}
|
|
```
|
|
6. Vérifier que le bookmark est maintenant dans Groupe B
|
|
|
|
**Résultat attendu**: ✅ Le bookmark se déplace de A vers B
|
|
|
|
---
|
|
|
|
#### Test 5: Détection de cycles
|
|
|
|
1. Créer Groupe A
|
|
2. Créer Groupe B **dans** Groupe A
|
|
3. **Ouvrir la console DevTools**
|
|
4. Tenter de drag Groupe A dans Groupe B
|
|
5. **Observer le warning dans la console**:
|
|
```
|
|
Cannot move a parent into its own descendant
|
|
```
|
|
6. Vérifier que la structure reste inchangée
|
|
|
|
**Résultat attendu**: ✅ Le drop est bloqué avec un warning
|
|
|
|
---
|
|
|
|
## Diagnostics supplémentaires
|
|
|
|
### Si Test 3 échoue encore
|
|
|
|
**Vérifier**:
|
|
1. La zone "Drop here to move to root" a-t-elle l'attribut `cdkDropList` ?
|
|
2. L'ID de la drop list est-il bien `"root"` ?
|
|
3. Le handler `handleRootDrop()` est-il bien appelé ?
|
|
|
|
**Debug**:
|
|
```typescript
|
|
// Dans bookmarks-panel.component.ts
|
|
handleRootDrop(event: CdkDragDrop<BookmarkNode[]>): void {
|
|
console.log('ROOT DROP TRIGGERED'); // Ajoutez ce log
|
|
this.isDraggingOverRoot.set(false);
|
|
this.handleDrop(event, null);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Si Test 4 échoue encore
|
|
|
|
**Vérifier**:
|
|
1. Les groupes ont-ils des IDs de drop list uniques (`group-${ctime}`) ?
|
|
2. Les drop lists sont-elles connectées (`cdkDropListConnectedTo`) ?
|
|
3. Le handler `onChildDrop()` est-il bien appelé ?
|
|
|
|
**Debug**:
|
|
```typescript
|
|
// Dans bookmark-item.component.ts
|
|
get dropListId(): string {
|
|
const id = `group-${this.bookmark.ctime}`;
|
|
console.log('Drop list ID:', id); // Ajoutez ce log
|
|
return id;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Si Test 5 échoue encore
|
|
|
|
**Vérifier**:
|
|
1. La méthode `isDescendantOf()` fonctionne-t-elle correctement ?
|
|
2. Le warning apparaît-il dans la console ?
|
|
3. Le document reste-t-il inchangé après la tentative ?
|
|
|
|
**Debug**:
|
|
```typescript
|
|
// Dans bookmark-item.component.ts
|
|
private isDescendantOf(ancestorCtime: number): boolean {
|
|
console.log('Checking if', ancestorCtime, 'is ancestor of', this.bookmark.ctime);
|
|
const result = /* ... logique existante ... */;
|
|
console.log('Result:', result);
|
|
return result;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Problèmes connus résiduels
|
|
|
|
### 1. Titre affiché avec path complet
|
|
|
|
**Observation**: Dans votre JSON, ligne 48:
|
|
```json
|
|
{
|
|
"type": "file",
|
|
"ctime": 1759252487676,
|
|
"path": "folder/test2.md",
|
|
"title": "folder/test2.md" // ❌ Path complet dans title
|
|
}
|
|
```
|
|
|
|
**Cause**: Le title a été explicitement défini avec le path complet lors de la création.
|
|
|
|
**Solution**:
|
|
- Option 1: Ne pas remplir le champ "Title" lors de l'ajout → basename automatique
|
|
- Option 2: Supprimer le champ `title` du JSON pour forcer le fallback
|
|
|
|
**Correction manuelle**:
|
|
```json
|
|
{
|
|
"type": "file",
|
|
"ctime": 1759252487676,
|
|
"path": "folder/test2.md"
|
|
// Pas de title → affichera "test2.md"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2. Groupes avec caractères spéciaux
|
|
|
|
**Observation**: Ligne 41:
|
|
```json
|
|
{
|
|
"type": "group",
|
|
"ctime": 1759253098054,
|
|
"title": "groupeA\\groupeD" // Backslash dans le titre
|
|
}
|
|
```
|
|
|
|
**Impact**: Aucun problème technique, mais peut prêter à confusion (ressemble à un path).
|
|
|
|
**Recommandation**: Éviter les caractères `\` et `/` dans les titres de groupes.
|
|
|
|
---
|
|
|
|
## Checklist de validation
|
|
|
|
Après avoir appliqué les corrections:
|
|
|
|
- [ ] Rebuild effectué (`npm run build`)
|
|
- [ ] Serveur relancé (`node server/index.mjs`)
|
|
- [ ] DevTools ouvert (F12)
|
|
- [ ] Test 3 refait avec logs observés
|
|
- [ ] Test 4 refait avec logs observés
|
|
- [ ] Test 5 refait avec warning observé
|
|
- [ ] Fichier JSON vérifié (pas d'items invalides)
|
|
- [ ] Tous les tests passent ✅
|
|
|
|
---
|
|
|
|
## Prochaines étapes
|
|
|
|
Si les tests passent:
|
|
1. Retirer les logs de debug (ou les mettre en mode verbose)
|
|
2. Continuer avec les tests restants (6-15)
|
|
3. Documenter les résultats finaux
|
|
|
|
Si les tests échouent encore:
|
|
1. Copier les logs de la console
|
|
2. Vérifier les attributs CDK dans le HTML
|
|
3. Tester avec un JSON minimal (1 groupe, 1 bookmark)
|
|
4. Signaler les logs et comportements observés
|
|
|
|
---
|
|
|
|
**Date**: 2025-01-30
|
|
**Version**: 2.0.1
|
|
**Statut**: Corrections appliquées, tests en attente
|