Appearance
BDD-39 — Création de sous-dossiers
1. User Story
En tant que client externe (entreprise) ou super administrateur
Je veux créer des sous-dossiers dans un dossier
Afin d'organiser mes fichiers en arborescence
2. Critères d'acceptation
- Un bouton permettant de créer un sous-dossier est disponible dans tout dossier ou sous-dossier où l'utilisateur a le droit de création (libellé actuel côté UI : « Nouveau » dans le panneau Sous-dossiers, avec icône dossier).
- Le nombre de niveaux d'arborescence est illimité (chaque dossier peut avoir des enfants, eux-mêmes parents possibles).
- Le sous-dossier est nommé librement par l'utilisateur (nom obligatoire, contrôles de longueur côté front et API).
- Le sous-dossier apparaît immédiatement dans l'arborescence après création (rafraîchissement de la liste des enfants du dossier courant).
- L'arborescence est navigable : fil d'Ariane affichant le chemin courant, navigation vers un ancêtre ou un niveau inférieur.
- Un utilisateur de type « personnel » ne peut pas créer de sous-dossier (pas d'action de création, pas d'API autorisée pour ce profil).
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/folders/folder.controller.ts | POST /folders (body avec parentUuid optionnel), GET /folders/:uuid/children, GET /folders/:uuid/breadcrumb |
back/src/api/folders/folder.service.ts | Création avec parent, résolution entreprise depuis le parent, enfants, chemin fil d'Ariane |
back/src/api/folders/dto/folder.dto.ts | DTO création (parentUuid), réponses enfants / liste |
back/src/guards/adminGuard.ts | Droits d'accès dossiers (dont création en contexte entreprise / super-admin) |
back/prisma/schema.prisma | Modèle folders avec relation parent / enfants |
sql/tool_08_add_sub_folders.sql | Colonne parent_id, FK, règle métier dossier racine unique par entreprise |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/admin/folders/AdminFolderDetailPage.vue | Détail dossier : arborescence type explorateur (QTree) depuis la racine, bouton création, navigation, fil d'Ariane |
front/src/pages/admin/folders/AdminFoldersPage.vue | Liste des dossiers : actions de renommage/suppression, intégration popup de confirmation |
front/src/components/admin/CreateFolderDialog.vue | Mode subfolder : nom uniquement, POST avec parentUuid |
front/src/components/admin/FolderBreadcrumb.vue | Affichage et navigation du fil |
front/src/components/admin/FolderListItem.vue | Item dossier/sous-dossier : actions (éditer, supprimer), affichage métadonnées |
front/src/components/ui/PopUpCard.vue | Dialogue de confirmation réutilisable (texte riche via slot, labels boutons personnalisables) |
front/src/stores/folder-store.js | createFolder, fetchFolderChildren, getFolderChildren (lazy-load arbre), fetchFolderBreadcrumb, trimBreadcrumbToUuid |
front/src/stores/user-store.js | account_type, rôle super-admin pour la condition d'affichage |
front/src/router/folderDetailGuard.js | Accès page détail dossier |
front/src/router/myFolderRedirectGuard.js | Redirection vers le dossier courant/racine selon profil |
front/src/router/superAdminGuard.js | Routes réservées super-admin si applicable |
4. Endpoints API (rappel)
| Méthode | Chemin | Description |
|---|---|---|
POST | /folders | Création dossier racine (name, enterpriseId) ou sous-dossier (name, parentUuid) |
GET | /folders/:uuid/children | Liste des sous-dossiers directs avec métadonnées (compteurs, etc.) |
GET | /folders/:uuid/breadcrumb | Chemin du dossier depuis la racine jusqu'à l'UUID demandé |
5. Points de vérification
- Le bouton de création n'est visible que si
role.type === 'super-admin'ouaccount_type === 'enterprise'(comportement actuelcanCreateSubfolder). - Un compte personnel ne voit pas le bouton « Nouveau » et ne peut pas contourner via l'API (même règle côté back).
- Après création réussie,
fetchFolderChildrenest rappelé sur le dossier courant et une notification positive confirme l'action. - L'arborescence reste ancrée sur la racine pendant la navigation ; seul le contexte (fichiers + header + breadcrumb) du dossier courant est mis à jour.
- Le dossier courant est visuellement identifiable dans l'arbre (état actif) pour faciliter le repérage.
- Le chargement des sous-niveaux se fait en lazy-load via le store (
getFolderChildren) et conserve les métadonnées déjà connues (ex:documentCount). - Le dialogue sous-dossier ne propose pas le choix d'entreprise : l'entreprise est déduite du parent côté API.
- La suppression d'un sous-dossier passe par
PopUpCardavec un message de confirmation contenant le nom en gras. - Le renommage dans l'arbre est inline, compact (input + actions icônes), et la mise à jour du nom est immédiate dans l'arborescence.
- Le fil d'Ariane reflète le dossier ouvert après chargement ; la navigation vers un parent tronque le fil puis recharge le contexte.
- Aucune limite artificielle de profondeur n'est codée (uniquement contraintes BDD / perfs habituelles).
6. Tests associés
Backend
back/src/api/folders/folder.service.spec.ts- création avec
parentUuid, entreprise héritée du parent - erreurs parent invalide / droits
childrenet compteurs
- création avec
back/src/guards/adminGuard.spec.ts(selon évolutions des règles d'accès dossier)
Frontend (unitaires)
front/src/__tests__/components/admin/CreateFolderDialog.spec.js— mode subfolder, validation nom, appelcreateFolderavecparentUuidfront/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js— affichage / masquage « Nouveau », arborescence explorateur, actions inline (renommer/supprimer), rafraîchissements aprèscreatedfront/src/__tests__/pages/admin/folders/AdminFoldersPage.spec.js— liste dossiers, filtres/pagination, actions dossier et intégration popup de suppressionfront/src/__tests__/stores/folder-store.spec.js—createFolder,fetchFolderChildren,getFolderChildren, fil d'Arianefront/src/__tests__/components/admin/FolderBreadcrumb.spec.js— navigation filfront/src/__tests__/components/admin/FolderListItem.spec.js— rendu et actions d'item dossier/sous-dossierfront/src/__tests__/components/ui/PopUpCard.spec.js— rendu, événements, labels personnalisés, slot texte richefront/src/__tests__/router/folderDetailGuard.spec.js— accès page détailfront/src/__tests__/router/myFolderRedirectGuard.spec.js— redirection vers dossier cible selon contextefront/src/__tests__/router/superAdminGuard.spec.js— filtrage d'accès super-admin
E2E (si présents)
front/e2e/pages/admin/admin-folder-detail.spec.js— scénarios navigation / liste fichiers (étendre si besoin pour création sous-dossier)
7. Notes d'implémentation
- Règle métier conservée : une seule racine (
parent_idNULL) active par entreprise ; les sous-dossiers partagent l'arborescence sous cette racine. CreateFolderDialogdistinguemode: 'root' | 'subfolder': en subfolder, pas d'appelGET /folders/enterprises, seulement le nom puisPOSTavecparentUuid.- L'en-tête de la page détail peut afficher titre et fil de façon dégradée pendant les chargements (
headerFolder) pour limiter les clignotements à la navigation. - L'arbre de navigation est maintenu côté front à partir du breadcrumb (racine + noeuds chargés en lazy-load), avec rafraîchissement ciblé de branche après création/renommage/suppression.
