feat : include collaborator tasks in dashboard, my-tasks, and project filters

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Matthieu
2026-04-09 09:57:30 +02:00
parent 21e9d2cab4
commit fa7bb27ef5
3 changed files with 30 additions and 14 deletions

View File

@@ -172,7 +172,10 @@ const totalHoursThisWeek = computed(() =>
) )
const myTasks = 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(() => const myTasksDone = computed(() =>

View File

@@ -140,33 +140,43 @@ async function loadReferenceData() {
} }
async function loadTasks() { async function loadTasks() {
const params: Record<string, string | number | boolean | string[]> = { const baseParams: Record<string, string | number | boolean | string[]> = {
archived: false, archived: false,
} }
if (selectedAssigneeId.value) {
params.assignee = `/api/users/${selectedAssigneeId.value}`
}
if (selectedProjectId.value) { if (selectedProjectId.value) {
params.project = `/api/projects/${selectedProjectId.value}` baseParams.project = `/api/projects/${selectedProjectId.value}`
} }
if (selectedGroupId.value) { if (selectedGroupId.value) {
params.group = `/api/task_groups/${selectedGroupId.value}` baseParams.group = `/api/task_groups/${selectedGroupId.value}`
} }
if (selectedPriorityId.value) { if (selectedPriorityId.value) {
params.priority = `/api/task_priorities/${selectedPriorityId.value}` baseParams.priority = `/api/task_priorities/${selectedPriorityId.value}`
} }
if (selectedEffortId.value) { if (selectedEffortId.value) {
params.effort = `/api/task_efforts/${selectedEffortId.value}` baseParams.effort = `/api/task_efforts/${selectedEffortId.value}`
} }
if (selectedTagId.value) { if (selectedTagId.value) {
params['tags[]'] = `/api/task_tags/${selectedTagId.value}` baseParams['tags[]'] = `/api/task_tags/${selectedTagId.value}`
} }
if (sortBy.value === 'deadline') { if (sortBy.value === 'deadline') {
params['order[deadline]'] = 'asc' baseParams['order[deadline]'] = 'asc'
} else if (sortBy.value === 'scheduledStart') { } 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<number, Task>()
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() { async function loadAll() {

View File

@@ -298,7 +298,10 @@ const filteredTasks = computed(() => {
result = result.filter(t => t.tags?.some(tag => tag.id === selectedTagId.value)) result = result.filter(t => t.tags?.some(tag => tag.id === selectedTagId.value))
} }
if (selectedAssigneeId.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) { if (selectedStatusId.value) {
result = result.filter(t => t.status?.id === selectedStatusId.value) result = result.filter(t => t.status?.id === selectedStatusId.value)