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