docs : update CLAUDE.md structure and fix spec formatting
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
10
CLAUDE.md
10
CLAUDE.md
@@ -12,9 +12,9 @@ Application de gestion de projet. Monorepo Symfony 8 (API Platform 4) + Nuxt 4.
|
||||
## Structure
|
||||
|
||||
```
|
||||
src/Entity/ # Entités Doctrine (User, Client, Project, Task, TaskStatus, TaskEffort, TaskPriority, TaskType, TaskGroup, TimeEntry)
|
||||
src/Entity/ # Entités Doctrine (User, Client, Project, Task, TaskStatus, TaskEffort, TaskPriority, TaskTag, TaskGroup, TimeEntry)
|
||||
src/ApiResource/ # Ressources API Platform (si découplées des entités)
|
||||
src/State/ # Providers et Processors API Platform (MeProvider, AppVersionProvider, ActiveTimeEntryProvider, UserPasswordHasherProcessor)
|
||||
src/State/ # Providers et Processors API Platform (MeProvider, AppVersionProvider, ActiveTimeEntryProvider, UserPasswordHasherProcessor, TaskNumberProcessor)
|
||||
src/Repository/ # Repositories Doctrine
|
||||
src/DataFixtures/ # Fixtures
|
||||
config/ # Config Symfony (security, api_platform, lexik_jwt, nelmio_cors, doctrine)
|
||||
@@ -22,12 +22,12 @@ config/jwt/ # Clés JWT (private.pem, public.pem)
|
||||
migrations/ # Migrations Doctrine
|
||||
docs/plans/ # Plans d'implémentation
|
||||
frontend/ # App Nuxt 4
|
||||
frontend/pages/ # Pages (index, login, clients, projects, projects/[id], projects/[id]/groups, projects/[id]/statuses, time-tracking, admin)
|
||||
frontend/pages/ # Pages (index, login, projects, projects/[id], projects/[id]/groups, projects/[id]/archives, time-tracking, admin)
|
||||
frontend/layouts/ # Layouts (pas "layout")
|
||||
frontend/components/ # Composants Vue (AppTopNav, AppDrawer, ColorPicker, DataTable, *Drawer, TaskCard, Admin*Tab, ProjectStatusTab, ProjectGroupTab, SidebarLink, SidebarTimer, TimeEntry*, TimeTrackingCalendar, ConfirmDeleteStatusModal)
|
||||
frontend/components/ # Composants Vue (AppTopNav, AppDrawer, ColorPicker, DataTable, ClientDrawer, ProjectDrawer, ProjectGroupTab, TaskCard, TaskDrawer, TaskModal, TaskEffortDrawer, TaskGroupDrawer, TaskPriorityDrawer, TaskStatusDrawer, TaskTagDrawer, Admin*Tab, SidebarLink, SidebarTimer, TimeEntryBlock, TimeEntryContextMenu, TimeEntryDrawer, TimeEntryList, TimeTrackingCalendar, UserDrawer, ConfirmDeleteStatusModal, ConfirmDeleteTaskModal)
|
||||
frontend/composables/# Composables (useApi, useAppVersion)
|
||||
frontend/stores/ # Stores Pinia (auth, ui, timer)
|
||||
frontend/services/ # Services API (auth, clients, projects, tasks, task-statuses, task-efforts, task-groups, task-priorities, task-types, users, time-entries)
|
||||
frontend/services/ # Services API (auth, clients, projects, tasks, task-statuses, task-efforts, task-groups, task-priorities, task-tags, users, time-entries)
|
||||
frontend/services/dto/ # Types TypeScript
|
||||
frontend/i18n/locales/ # Fichiers de traduction (langDir résolu depuis i18n/)
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Feature: Archivage de tickets et de groupes
|
||||
o# Feature: Archivage de tickets et de groupes
|
||||
|
||||
## Résumé
|
||||
|
||||
@@ -35,6 +35,7 @@ Une migration Doctrine unique pour les 3 champs (`task_status.is_final`, `task.a
|
||||
### Archivage de groupe (bulk)
|
||||
|
||||
L'archivage d'un groupe est une opération frontend multi-appels :
|
||||
|
||||
1. PATCH chaque ticket du groupe avec `{ archived: true }`
|
||||
2. PATCH le groupe avec `{ archived: true }`
|
||||
|
||||
@@ -53,17 +54,20 @@ La règle "archiver seulement si statut final" est appliquée côté frontend (v
|
||||
### TaskDrawer — archivage et modale suppression
|
||||
|
||||
**Bouton "Archiver"** :
|
||||
|
||||
- Visible uniquement quand le ticket a un statut avec `isFinal: true`
|
||||
- PATCH `{ archived: true }` sur le ticket
|
||||
- Si un timer est actif sur ce ticket, l'arrêter avant d'archiver
|
||||
- Ferme le drawer et rafraîchit la liste des tickets
|
||||
|
||||
**Bouton "Désarchiver"** :
|
||||
|
||||
- Visible quand on consulte un ticket archivé (depuis la page archives)
|
||||
- PATCH `{ archived: false }`
|
||||
- Ferme le drawer et rafraîchit la page archives
|
||||
|
||||
**Modale de confirmation de suppression** :
|
||||
|
||||
- Déclenchée au clic sur "Supprimer" dans le TaskDrawer
|
||||
- Message : "Êtes-vous sûr de vouloir supprimer ce ticket ? Cette action est irréversible."
|
||||
- Deux boutons : "Annuler" / "Supprimer" (style destructif, rouge)
|
||||
@@ -84,11 +88,13 @@ La règle "archiver seulement si statut final" est appliquée côté frontend (v
|
||||
**Toggle "Voir les groupes archivés"** : bascule pour afficher les groupes archivés.
|
||||
|
||||
**Bouton "Archiver" sur un groupe** :
|
||||
|
||||
- Visible uniquement si le groupe a au moins un ticket ET que **tous** ses tickets ont un statut `isFinal: true` (un ticket sans statut bloque l'archivage)
|
||||
- Archive tous les tickets du groupe puis le groupe lui-même (appels PATCH séquentiels)
|
||||
- Rafraîchit la liste
|
||||
|
||||
**Bouton "Désarchiver" sur un groupe archivé** :
|
||||
|
||||
- Désarchive le groupe + tous ses tickets (écrase l'état individuel des tickets)
|
||||
- Rafraîchit la liste
|
||||
|
||||
@@ -123,6 +129,7 @@ Ajout du champ `archived: boolean` dans les types `TaskGroup` et `TaskGroupWrite
|
||||
## Traductions (i18n)
|
||||
|
||||
Clés à ajouter dans `fr.json` :
|
||||
|
||||
- `task.archive` / `task.unarchive`
|
||||
- `task.delete_confirm_title` / `task.delete_confirm_message`
|
||||
- `group.archive` / `group.unarchive`
|
||||
|
||||
Reference in New Issue
Block a user