From d5d6452cf2e1bb23ed4b97425e141f1eb420e4af Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 12 Mar 2026 18:07:21 +0100 Subject: [PATCH] feat(frontend) : add group archive/unarchive to ProjectGroupTab Co-Authored-By: Claude Opus 4.6 --- .../components/project/ProjectGroupTab.vue | 90 ++++++++++++++++--- 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/frontend/components/project/ProjectGroupTab.vue b/frontend/components/project/ProjectGroupTab.vue index d267bb8..cab52be 100644 --- a/frontend/components/project/ProjectGroupTab.vue +++ b/frontend/components/project/ProjectGroupTab.vue @@ -2,12 +2,22 @@

Groupes

- +
+ + +
@@ -28,6 +38,24 @@ + import type { TaskGroup } from '~/services/dto/task-group' +import type { Task } from '~/services/dto/task' import { useTaskGroupService } from '~/services/task-groups' +import { useTaskService } from '~/services/tasks' const props = defineProps<{ projectId: number @@ -59,16 +89,38 @@ const columns: DataTableColumn[] = [ { key: 'description', label: 'Description', class: 'max-w-xs truncate text-neutral-700' }, ] -const { getByProject, remove } = useTaskGroupService() -const items = ref([]) +const groupService = useTaskGroupService() +const taskService = useTaskService() + +const allGroups = ref([]) +const activeTasks = ref([]) +const archivedTasks = ref([]) const isLoading = ref(true) const drawerOpen = ref(false) const selectedItem = ref(null) +const showArchived = ref(false) + +const items = computed(() => + allGroups.value.filter(g => showArchived.value ? g.archived : !g.archived) +) + +function canArchiveGroup(group: TaskGroup): boolean { + const groupTasks = activeTasks.value.filter(t => t.group?.id === group.id) + if (groupTasks.length === 0) return false + return groupTasks.every(t => t.status?.isFinal === true) +} async function loadItems() { isLoading.value = true try { - items.value = await getByProject(props.projectId) + const [g, t, at] = await Promise.all([ + groupService.getByProject(props.projectId), + taskService.getByProject(props.projectId), + taskService.getByProjectArchived(props.projectId), + ]) + allGroups.value = g + activeTasks.value = t + archivedTasks.value = at } finally { isLoading.value = false } @@ -85,7 +137,23 @@ function openEdit(item: TaskGroup) { } async function handleDelete(id: number) { - await remove(id) + await groupService.remove(id) + await loadItems() + emit('updated') +} + +async function handleArchive(group: TaskGroup) { + const groupTasks = activeTasks.value.filter(t => t.group?.id === group.id) + await Promise.all(groupTasks.map(t => taskService.update(t.id, { archived: true }))) + await groupService.update(group.id, { archived: true }) + await loadItems() + emit('updated') +} + +async function handleUnarchive(group: TaskGroup) { + const groupTasks = archivedTasks.value.filter(t => t.group?.id === group.id) + await Promise.all(groupTasks.map(t => taskService.update(t.id, { archived: false }))) + await groupService.update(group.id, { archived: false }) await loadItems() emit('updated') }