Skip to content

BDD-42 — Déplacement de sous-dossier

1. User Story

En tant que client externe (entreprise) ou super administrateur,
Je veux déplacer un sous-dossier vers un autre emplacement de l'arborescence,
Afin de réorganiser la structure de dossiers d'un client.

2. Critères d'acceptation

  1. Le déplacement est possible par glisser-déposer vers un dossier cible visible.
  2. Le déplacement est possible via un menu contextuel « Déplacer vers... » avec sélection du dossier cible.
  3. Le déplacement d'un sous-dossier déplace automatiquement son contenu (fichiers + sous-dossiers descendants).
  4. Un sous-dossier ne peut pas être déplacé dans l'un de ses propres descendants (protection anti-boucle).
  5. L'arborescence est mise à jour immédiatement après déplacement.

3. Périmètre fonctionnel

Backend

FichierRôle
back/src/api/folders/folder.controller.tsEndpoint PATCH /folders/:uuid/move
back/src/api/folders/folder.service.tsContrôles d'accès + règles de déplacement + garde anti-boucle
back/src/api/folders/dto/folder.dto.tsDTO MoveFolderRequestDto (targetFolderUuid)
back/src/api/folders/folder.service.spec.tsTests unitaires des règles métier de moveFolder

Frontend

FichierRôle
front/src/pages/admin/folders/AdminFolderDetailPage.vueDéplacement de sous-dossier par drag-and-drop (chips + fil d'Ariane) et via menu contextuel
front/src/components/documents/FolderTargetDialog.vueSélection de la cible pour le menu « Déplacer vers... »
front/src/components/admin/FolderBreadcrumb.vueÉvénements drag/drop sur le fil d'Ariane
front/src/stores/folder-store.jsAction moveFolder(folderUuid, targetFolderUuid)

4. Endpoints API (rappel)

MéthodeCheminDescription
PATCH/folders/:uuid/moveDéplace un sous-dossier source (:uuid) vers un dossier cible (targetFolderUuid)

Body requis :

json
{
  "targetFolderUuid": "34f4cc93-b0af-473d-a939-e8ce8b72501d"
}

5. Règles métier implémentées

  • Le dossier source et le dossier cible doivent exister et être actifs.
  • Le dossier source et le dossier cible doivent appartenir à la même entreprise.
  • Le dossier source ne peut pas être un dossier racine.
  • Le dossier source ne peut pas être déplacé vers lui-même.
  • Le dossier source ne peut pas être déplacé dans un de ses descendants (anti-boucle).
  • Le déplacement met à jour le parent_id du dossier source ; le contenu est déplacé en cascade par structure.

6. Points de vérification

  • Le menu d'actions de sous-dossier affiche « Déplacer vers... ».
  • Le dialogue de sélection de cible permet de choisir un dossier valide.
  • Le drag-and-drop vers un chip de sous-dossier visible fonctionne.
  • Le drag-and-drop vers un élément du fil d'Ariane fonctionne.
  • Le ghost de drag est une copie visuelle du chip (sans coins carrés visibles).
  • Après succès, la liste des sous-dossiers se rafraîchit immédiatement.

7. Tests associés

Backend (unitaires)

  • back/src/api/folders/folder.service.spec.ts
    • succès du moveFolder
    • source = cible refusé
    • source racine refusée
    • cible descendante refusée (anti-boucle)

Frontend (unitaires)

  • front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js
    • déplacement via menu « Déplacer vers... »
    • déplacement par drag-and-drop vers un sous-dossier visible
    • déplacement par drag-and-drop vers le fil d'Ariane
    • affichage/masquage du ghost pendant le drag
  • front/src/__tests__/components/admin/FolderBreadcrumb.spec.js
    • émission des événements subfolder-drag-over, subfolder-drag-leave, subfolder-drop
  • front/src/__tests__/stores/folder-store.spec.js
    • appel PATCH /folders/:uuid/move avec targetFolderUuid

8. Notes d'implémentation

  • Le composant FolderTargetDialog est réutilisé pour garder une UX homogène avec le déplacement de fichiers.
  • Le backend protège systématiquement contre les boucles de hiérarchie, même si l'UI filtre déjà certaines cibles.
  • Le drag-and-drop frontend et le déplacement via menu contextuel convergent vers la même action store (moveFolder).