From fa7bb27ef5454eb363a33b2d233917c72dc3ddd5 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Thu, 9 Apr 2026 09:57:30 +0200 Subject: [PATCH] feat : include collaborator tasks in dashboard, my-tasks, and project filters Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/pages/index.vue | 5 +++- frontend/pages/my-tasks.vue | 34 +++++++++++++++++--------- frontend/pages/projects/[id]/index.vue | 5 +++- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue index 7a6ca72..31a6a56 100644 --- a/frontend/pages/index.vue +++ b/frontend/pages/index.vue @@ -172,7 +172,10 @@ const totalHoursThisWeek = computed(() => ) const myTasks = computed(() => - tasks.value.filter(t => t.assignee?.id === auth.user?.id) + tasks.value.filter(t => + t.assignee?.id === auth.user?.id + || t.collaborators?.some(c => c.id === auth.user?.id) + ) ) const myTasksDone = computed(() => diff --git a/frontend/pages/my-tasks.vue b/frontend/pages/my-tasks.vue index 5a2c99d..6259ade 100644 --- a/frontend/pages/my-tasks.vue +++ b/frontend/pages/my-tasks.vue @@ -140,33 +140,43 @@ async function loadReferenceData() { } async function loadTasks() { - const params: Record = { + const baseParams: Record = { archived: false, } - if (selectedAssigneeId.value) { - params.assignee = `/api/users/${selectedAssigneeId.value}` - } if (selectedProjectId.value) { - params.project = `/api/projects/${selectedProjectId.value}` + baseParams.project = `/api/projects/${selectedProjectId.value}` } if (selectedGroupId.value) { - params.group = `/api/task_groups/${selectedGroupId.value}` + baseParams.group = `/api/task_groups/${selectedGroupId.value}` } if (selectedPriorityId.value) { - params.priority = `/api/task_priorities/${selectedPriorityId.value}` + baseParams.priority = `/api/task_priorities/${selectedPriorityId.value}` } if (selectedEffortId.value) { - params.effort = `/api/task_efforts/${selectedEffortId.value}` + baseParams.effort = `/api/task_efforts/${selectedEffortId.value}` } if (selectedTagId.value) { - params['tags[]'] = `/api/task_tags/${selectedTagId.value}` + baseParams['tags[]'] = `/api/task_tags/${selectedTagId.value}` } if (sortBy.value === 'deadline') { - params['order[deadline]'] = 'asc' + baseParams['order[deadline]'] = 'asc' } else if (sortBy.value === 'scheduledStart') { - params['order[scheduledStart]'] = 'asc' + baseParams['order[scheduledStart]'] = 'asc' + } + + if (selectedAssigneeId.value) { + const userIri = `/api/users/${selectedAssigneeId.value}` + const [assigneeTasks, collabTasks] = await Promise.all([ + taskService.getFiltered({ ...baseParams, assignee: userIri }), + taskService.getFiltered({ ...baseParams, 'collaborators[]': userIri }), + ]) + const map = new Map() + for (const t of assigneeTasks) map.set(t.id, t) + for (const t of collabTasks) map.set(t.id, t) + tasks.value = [...map.values()].sort((a, b) => b.id - a.id) + } else { + tasks.value = await taskService.getFiltered(baseParams) } - tasks.value = await taskService.getFiltered(params) } async function loadAll() { diff --git a/frontend/pages/projects/[id]/index.vue b/frontend/pages/projects/[id]/index.vue index 4bddb24..48183aa 100644 --- a/frontend/pages/projects/[id]/index.vue +++ b/frontend/pages/projects/[id]/index.vue @@ -298,7 +298,10 @@ const filteredTasks = computed(() => { result = result.filter(t => t.tags?.some(tag => tag.id === selectedTagId.value)) } if (selectedAssigneeId.value) { - result = result.filter(t => t.assignee?.id === selectedAssigneeId.value) + result = result.filter(t => + t.assignee?.id === selectedAssigneeId.value + || t.collaborators?.some(c => c.id === selectedAssigneeId.value) + ) } if (selectedStatusId.value) { result = result.filter(t => t.status?.id === selectedStatusId.value)