From 50ae9ef5498c9005e5cc023307659e4a7d6ccfa4 Mon Sep 17 00:00:00 2001 From: matthieu Date: Tue, 10 Mar 2026 21:58:35 +0100 Subject: [PATCH] feat(projects) : add per-project task statuses and split project detail into sub-pages Move project detail from [id].vue to [id]/ directory with Kanban, Groups and Statuses sub-pages. Add project filter on task statuses service and drawer. Remove global statuses tab from admin. Co-Authored-By: Claude Opus 4.6 --- .../components/ConfirmDeleteStatusModal.vue | 96 ++++++ frontend/components/ProjectGroupTab.vue | 118 +++++++ frontend/components/ProjectStatusTab.vue | 162 +++++++++ frontend/components/TaskStatusDrawer.vue | 2 + frontend/pages/admin.vue | 4 +- frontend/pages/projects/[id]/groups.vue | 32 ++ frontend/pages/projects/[id]/index.vue | 308 ++++++++++++++++++ frontend/pages/projects/[id]/statuses.vue | 32 ++ frontend/services/dto/task-status.ts | 4 + frontend/services/task-statuses.ts | 9 +- 10 files changed, 763 insertions(+), 4 deletions(-) create mode 100644 frontend/components/ConfirmDeleteStatusModal.vue create mode 100644 frontend/components/ProjectGroupTab.vue create mode 100644 frontend/components/ProjectStatusTab.vue create mode 100644 frontend/pages/projects/[id]/groups.vue create mode 100644 frontend/pages/projects/[id]/index.vue create mode 100644 frontend/pages/projects/[id]/statuses.vue diff --git a/frontend/components/ConfirmDeleteStatusModal.vue b/frontend/components/ConfirmDeleteStatusModal.vue new file mode 100644 index 0000000..ef3afd9 --- /dev/null +++ b/frontend/components/ConfirmDeleteStatusModal.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/frontend/components/ProjectGroupTab.vue b/frontend/components/ProjectGroupTab.vue new file mode 100644 index 0000000..44e85c6 --- /dev/null +++ b/frontend/components/ProjectGroupTab.vue @@ -0,0 +1,118 @@ + + + diff --git a/frontend/components/ProjectStatusTab.vue b/frontend/components/ProjectStatusTab.vue new file mode 100644 index 0000000..40e752a --- /dev/null +++ b/frontend/components/ProjectStatusTab.vue @@ -0,0 +1,162 @@ + + + diff --git a/frontend/components/TaskStatusDrawer.vue b/frontend/components/TaskStatusDrawer.vue index ee65dd6..3fb83da 100644 --- a/frontend/components/TaskStatusDrawer.vue +++ b/frontend/components/TaskStatusDrawer.vue @@ -38,6 +38,7 @@ import { useTaskStatusService } from '~/services/task-statuses' const props = defineProps<{ modelValue: boolean item: TaskStatus | null + projectId: number }>() const emit = defineEmits<{ @@ -90,6 +91,7 @@ async function handleSubmit() { label: form.label.trim(), position: Number(form.position), color: form.color, + project: `/api/projects/${props.projectId}`, } if (isEditing.value && props.item) { diff --git a/frontend/pages/admin.vue b/frontend/pages/admin.vue index ca420b1..9290f01 100644 --- a/frontend/pages/admin.vue +++ b/frontend/pages/admin.vue @@ -19,7 +19,6 @@
- @@ -32,7 +31,6 @@ useHead({ title: 'Administration' }) const tabs = [ - { key: 'statuses', label: 'Statuts' }, { key: 'efforts', label: 'Efforts' }, { key: 'priorities', label: 'Priorités' }, { key: 'types', label: 'Types' }, @@ -41,5 +39,5 @@ const tabs = [ type TabKey = typeof tabs[number]['key'] -const activeTab = ref('statuses') +const activeTab = ref('efforts') diff --git a/frontend/pages/projects/[id]/groups.vue b/frontend/pages/projects/[id]/groups.vue new file mode 100644 index 0000000..fa7e44a --- /dev/null +++ b/frontend/pages/projects/[id]/groups.vue @@ -0,0 +1,32 @@ + + + diff --git a/frontend/pages/projects/[id]/index.vue b/frontend/pages/projects/[id]/index.vue new file mode 100644 index 0000000..2229f3a --- /dev/null +++ b/frontend/pages/projects/[id]/index.vue @@ -0,0 +1,308 @@ + + + diff --git a/frontend/pages/projects/[id]/statuses.vue b/frontend/pages/projects/[id]/statuses.vue new file mode 100644 index 0000000..a6932ee --- /dev/null +++ b/frontend/pages/projects/[id]/statuses.vue @@ -0,0 +1,32 @@ + + + diff --git a/frontend/services/dto/task-status.ts b/frontend/services/dto/task-status.ts index 073c1ec..546046d 100644 --- a/frontend/services/dto/task-status.ts +++ b/frontend/services/dto/task-status.ts @@ -1,13 +1,17 @@ +import type { Project } from './project' + export type TaskStatus = { id: number '@id'?: string label: string color: string position: number + project: Project | null } export type TaskStatusWrite = { label: string color: string position: number + project: string } diff --git a/frontend/services/task-statuses.ts b/frontend/services/task-statuses.ts index 28c4e06..7efcb9c 100644 --- a/frontend/services/task-statuses.ts +++ b/frontend/services/task-statuses.ts @@ -10,6 +10,13 @@ export function useTaskStatusService() { return extractHydraMembers(data) } + async function getByProject(projectId: number): Promise { + const data = await api.get>('/task_statuses', { + project: `/api/projects/${projectId}`, + }) + return extractHydraMembers(data) + } + async function create(payload: TaskStatusWrite): Promise { return api.post('/task_statuses', payload as Record, { toastSuccessKey: 'taskStatuses.created', @@ -28,5 +35,5 @@ export function useTaskStatusService() { }) } - return { getAll, create, update, remove } + return { getAll, getByProject, create, update, remove } }