ObsiViewer/docs/BOOKMARKS/BOOKMARKS_FIXES.md

7.0 KiB

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:

// 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:

{
  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:

{
  "type": "file",
  "ctime": 1759253065812,
  "path": "groupeC"  // ❌ Pas d'extension
}

Solution: Ajout de l'extension .md:

{
  "type": "file",
  "ctime": 1759253065812,
  "path": "groupeC.md"  // ✅ Extension ajoutée
}

Fichier modifié: vault/.obsidian/bookmarks.json


Instructions de test

Rebuild et relance

# 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:

// 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:

// 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:

// 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:

{
  "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:

{
  "type": "file",
  "ctime": 1759252487676,
  "path": "folder/test2.md"
  // Pas de title → affichera "test2.md"
}

2. Groupes avec caractères spéciaux

Observation: Ligne 41:

{
  "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