From a3c06960230d14e234b0b28896346ac528b5e4c7 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 28 May 2026 10:50:48 +0200 Subject: [PATCH] feat(projects) : archivage en masse des tickets sur statut final MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TaskBulkActions : prop canArchive + bouton archive conditionnel - pages/projects/[id] : computed canArchiveSelection (true quand le filtre statut courant pointe vers un statut isFinal) - purge la sélection des ids hors filtre courant pour garder le compteur cohérent en vue liste --- frontend/components/task/TaskBulkActions.vue | 13 +++++++++++++ frontend/pages/projects/[id]/index.vue | 15 +++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/frontend/components/task/TaskBulkActions.vue b/frontend/components/task/TaskBulkActions.vue index 264b671..77cecd4 100644 --- a/frontend/components/task/TaskBulkActions.vue +++ b/frontend/components/task/TaskBulkActions.vue @@ -79,6 +79,17 @@ @update:model-value="(v: number | null) => v && emit('bulk-update', 'group', v)" /> + + + (), { selectedTasks: () => [], projects: () => [], + canArchive: false, }) const emit = defineEmits<{ diff --git a/frontend/pages/projects/[id]/index.vue b/frontend/pages/projects/[id]/index.vue index 610db7f..6387b7e 100644 --- a/frontend/pages/projects/[id]/index.vue +++ b/frontend/pages/projects/[id]/index.vue @@ -161,6 +161,7 @@ :priorities="priorities" :efforts="efforts" :groups="groups" + :can-archive="canArchiveSelection" @toggle-all="toggleSelectAll(filteredTasks)" @bulk-update="onBulkUpdate" @bulk-archive="onBulkArchive" @@ -297,6 +298,12 @@ const effortFilterOptions = computed(() => efforts.value.map(e => ({ label: e.label, value: e.id })) ) +const canArchiveSelection = computed(() => { + if (selectedStatusId.value === null) return false + const status = statuses.value.find(s => s.id === selectedStatusId.value) + return status?.isFinal === true +}) + const filteredTasks = computed(() => { let result = tasks.value.filter(t => !t.archived) if (selectedGroupId.value) { @@ -323,6 +330,14 @@ const filteredTasks = computed(() => { return result }) +watch(filteredTasks, (list) => { + if (selectedTaskIds.size === 0) return + const visibleIds = new Set(list.map(t => t.id)) + for (const id of selectedTaskIds) { + if (!visibleIds.has(id)) selectedTaskIds.delete(id) + } +}) + function tasksByStatus(statusId: number): Task[] { return filteredTasks.value.filter(t => t.status?.id === statusId) }