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) }