Skip to content

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

  1. 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).
  2. Le nombre de niveaux d'arborescence est illimité (chaque dossier peut avoir des enfants, eux-mêmes parents possibles).
  3. Le sous-dossier est nommé librement par l'utilisateur (nom obligatoire, contrôles de longueur côté front et API).
  4. Le sous-dossier apparaît immédiatement dans l'arborescence après création (rafraîchissement de la liste des enfants du dossier courant).
  5. L'arborescence est navigable : fil d'Ariane affichant le chemin courant, navigation vers un ancêtre ou un niveau inférieur.
  6. 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

FichierRôle
back/src/api/folders/folder.controller.tsPOST /folders (body avec parentUuid optionnel), GET /folders/:uuid/children, GET /folders/:uuid/breadcrumb
back/src/api/folders/folder.service.tsCréation avec parent, résolution entreprise depuis le parent, enfants, chemin fil d'Ariane
back/src/api/folders/dto/folder.dto.tsDTO création (parentUuid), réponses enfants / liste
back/src/guards/adminGuard.tsDroits d'accès dossiers (dont création en contexte entreprise / super-admin)
back/prisma/schema.prismaModèle folders avec relation parent / enfants
sql/tool_08_add_sub_folders.sqlColonne parent_id, FK, règle métier dossier racine unique par entreprise

Frontend

FichierRôle
front/src/pages/admin/folders/AdminFolderDetailPage.vueDétail dossier : arborescence type explorateur (QTree) depuis la racine, bouton création, navigation, fil d'Ariane
front/src/pages/admin/folders/AdminFoldersPage.vueListe des dossiers : actions de renommage/suppression, intégration popup de confirmation
front/src/components/admin/CreateFolderDialog.vueMode subfolder : nom uniquement, POST avec parentUuid
front/src/components/admin/FolderBreadcrumb.vueAffichage et navigation du fil
front/src/components/admin/FolderListItem.vueItem dossier/sous-dossier : actions (éditer, supprimer), affichage métadonnées
front/src/components/ui/PopUpCard.vueDialogue de confirmation réutilisable (texte riche via slot, labels boutons personnalisables)
front/src/stores/folder-store.jscreateFolder, fetchFolderChildren, getFolderChildren (lazy-load arbre), fetchFolderBreadcrumb, trimBreadcrumbToUuid
front/src/stores/user-store.jsaccount_type, rôle super-admin pour la condition d'affichage
front/src/router/folderDetailGuard.jsAccès page détail dossier
front/src/router/myFolderRedirectGuard.jsRedirection vers le dossier courant/racine selon profil
front/src/router/superAdminGuard.jsRoutes réservées super-admin si applicable

4. Endpoints API (rappel)

MéthodeCheminDescription
POST/foldersCréation dossier racine (name, enterpriseId) ou sous-dossier (name, parentUuid)
GET/folders/:uuid/childrenListe des sous-dossiers directs avec métadonnées (compteurs, etc.)
GET/folders/:uuid/breadcrumbChemin 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' ou account_type === 'enterprise' (comportement actuel canCreateSubfolder).
  • 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, fetchFolderChildren est 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 PopUpCard avec 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
    • children et compteurs
  • 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, appel createFolder avec parentUuid
  • front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js — affichage / masquage « Nouveau », arborescence explorateur, actions inline (renommer/supprimer), rafraîchissements après created
  • front/src/__tests__/pages/admin/folders/AdminFoldersPage.spec.js — liste dossiers, filtres/pagination, actions dossier et intégration popup de suppression
  • front/src/__tests__/stores/folder-store.spec.jscreateFolder, fetchFolderChildren, getFolderChildren, fil d'Ariane
  • front/src/__tests__/components/admin/FolderBreadcrumb.spec.js — navigation fil
  • front/src/__tests__/components/admin/FolderListItem.spec.js — rendu et actions d'item dossier/sous-dossier
  • front/src/__tests__/components/ui/PopUpCard.spec.js — rendu, événements, labels personnalisés, slot texte riche
  • front/src/__tests__/router/folderDetailGuard.spec.js — accès page détail
  • front/src/__tests__/router/myFolderRedirectGuard.spec.js — redirection vers dossier cible selon contexte
  • front/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_id NULL) active par entreprise ; les sous-dossiers partagent l'arborescence sous cette racine.
  • CreateFolderDialog distingue mode: 'root' | 'subfolder' : en subfolder, pas d'appel GET /folders/enterprises, seulement le nom puis POST avec parentUuid.
  • 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.