From 3e6b0e877aa914e55aa0b9e0cec2ea191d6951e5 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Wed, 6 May 2026 09:51:18 +0200 Subject: [PATCH] fix(time-tracking) : filtres projet/tag server-side et vue liste au mois - Pousse les filtres projet et tag a l'API (au lieu d'un filtrage client-side partiel sur la page courante) pour eviter les resultats incomplets en cas de pagination - Ajoute les watchers selectedProjectId/selectedTagId qui declenchent un reload - Mode liste : navigation et plage de chargement passent a 1 mois (au lieu d'une fenetre de 7 jours qui rendait le mode liste inutilisable) - Renomme l'option vide du filtre User en "Tous" (etait "User", ambigu) Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/pages/time-tracking.vue | 64 ++++++++++++++++++++++--------- frontend/services/time-entries.ts | 9 ++++- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/frontend/pages/time-tracking.vue b/frontend/pages/time-tracking.vue index 3e90cd8..ade0e97 100644 --- a/frontend/pages/time-tracking.vue +++ b/frontend/pages/time-tracking.vue @@ -56,7 +56,7 @@ text-field="text-sm" text-value="text-sm" label="User" - empty-option-label="User" + empty-option-label="Tous" /> @@ -217,16 +217,7 @@ function updatePageHeaderHeight() { pageHeaderHeight.value = pageHeaderEl.value?.offsetHeight ?? 0 } -const filteredEntries = computed(() => { - let result = entries.value - if (selectedProjectId.value) { - result = result.filter((e) => e.project?.id === selectedProjectId.value) - } - if (selectedTagId.value) { - result = result.filter((e) => e.tags.some((t) => t.id === selectedTagId.value)) - } - return result -}) +const filteredEntries = computed(() => entries.value) function getMonday(d: Date): Date { const date = new Date(d) @@ -239,15 +230,35 @@ function getMonday(d: Date): Date { function navigatePrev() { const d = new Date(startDate.value) - d.setDate(d.getDate() - (viewMode.value === 'day' ? 1 : 7)) - startDate.value = viewMode.value === 'day' ? d : getMonday(d) + if (viewMode.value === 'day') { + d.setDate(d.getDate() - 1) + startDate.value = d + } else if (viewMode.value === 'list') { + d.setMonth(d.getMonth() - 1) + d.setDate(1) + d.setHours(0, 0, 0, 0) + startDate.value = d + } else { + d.setDate(d.getDate() - 7) + startDate.value = getMonday(d) + } loadEntries() } function navigateNext() { const d = new Date(startDate.value) - d.setDate(d.getDate() + (viewMode.value === 'day' ? 1 : 7)) - startDate.value = viewMode.value === 'day' ? d : getMonday(d) + if (viewMode.value === 'day') { + d.setDate(d.getDate() + 1) + startDate.value = d + } else if (viewMode.value === 'list') { + d.setMonth(d.getMonth() + 1) + d.setDate(1) + d.setHours(0, 0, 0, 0) + startDate.value = d + } else { + d.setDate(d.getDate() + 7) + startDate.value = getMonday(d) + } loadEntries() } @@ -359,12 +370,20 @@ async function onExport(params: { async function loadEntries() { const end = new Date(startDate.value) - end.setDate(end.getDate() + (viewMode.value === 'day' ? 1 : 7)) + if (viewMode.value === 'day') { + end.setDate(end.getDate() + 1) + } else if (viewMode.value === 'list') { + end.setMonth(end.getMonth() + 1) + } else { + end.setDate(end.getDate() + 7) + } entries.value = await timeEntryService.getByDateRange({ after: startDate.value.toISOString(), before: end.toISOString(), user: selectedUserId.value ?? undefined, + project: selectedProjectId.value ?? undefined, + tag: selectedTagId.value ?? undefined, }) } @@ -400,11 +419,20 @@ onMounted(async () => { watch(viewMode, () => { selectedDateFilter.value = null - startDate.value = viewMode.value === 'day' ? startDate.value : getMonday(startDate.value) + if (viewMode.value === 'day') { + // keep current date + } else if (viewMode.value === 'list') { + const d = new Date(startDate.value) + d.setDate(1) + d.setHours(0, 0, 0, 0) + startDate.value = d + } else { + startDate.value = getMonday(startDate.value) + } loadEntries() }) -watch(selectedUserId, () => { +watch([selectedUserId, selectedProjectId, selectedTagId], () => { loadEntries() }) diff --git a/frontend/services/time-entries.ts b/frontend/services/time-entries.ts index 5c4a9d0..b9cccb3 100644 --- a/frontend/services/time-entries.ts +++ b/frontend/services/time-entries.ts @@ -9,7 +9,8 @@ export function useTimeEntryService() { after: string before: string user?: number - types?: number[] + project?: number + tag?: number }): Promise { const query: Record = { 'startedAt[after]': params.after, @@ -18,6 +19,12 @@ export function useTimeEntryService() { if (params.user) { query.user = `/api/users/${params.user}` } + if (params.project) { + query.project = `/api/projects/${params.project}` + } + if (params.tag) { + query['tags[]'] = `/api/task_tags/${params.tag}` + } const data = await api.get>('/time_entries', query) return extractHydraMembers(data) }