Appearance
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
- Le déplacement est possible par glisser-déposer vers un dossier cible visible.
- Le déplacement est possible via un menu contextuel « Déplacer vers... » avec sélection du dossier cible.
- Le déplacement d'un sous-dossier déplace automatiquement son contenu (fichiers + sous-dossiers descendants).
- Un sous-dossier ne peut pas être déplacé dans l'un de ses propres descendants (protection anti-boucle).
- L'arborescence est mise à jour immédiatement après déplacement.
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/folders/folder.controller.ts | Endpoint PATCH /folders/:uuid/move |
back/src/api/folders/folder.service.ts | Contrôles d'accès + règles de déplacement + garde anti-boucle |
back/src/api/folders/dto/folder.dto.ts | DTO MoveFolderRequestDto (targetFolderUuid) |
back/src/api/folders/folder.service.spec.ts | Tests unitaires des règles métier de moveFolder |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/admin/folders/AdminFolderDetailPage.vue | Déplacement de sous-dossier par drag-and-drop (chips + fil d'Ariane) et via menu contextuel |
front/src/components/documents/FolderTargetDialog.vue | Sé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.js | Action moveFolder(folderUuid, targetFolderUuid) |
4. Endpoints API (rappel)
| Méthode | Chemin | Description |
|---|---|---|
PATCH | /folders/:uuid/move | Dé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_iddu 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)
- succès du
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
- émission des événements
front/src/__tests__/stores/folder-store.spec.js- appel
PATCH /folders/:uuid/moveavectargetFolderUuid
- appel
8. Notes d'implémentation
- Le composant
FolderTargetDialogest 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).
