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
-
+
+
+
+
handleDelete(item.id)"
>
@@ -28,6 +38,24 @@
{{ item.description ?? '—' }}
+
+
+
+
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')
}