From 74116506dbeee650ced6bc7b77499f88589adc61 Mon Sep 17 00:00:00 2001 From: matthieu Date: Tue, 10 Mar 2026 22:22:48 +0100 Subject: [PATCH] feat(time-tracking) : add calendar page, timer sidebar, and all UI components - SidebarTimer widget with play/stop button - TimeEntryBlock with drag-to-move and resize - TimeEntryDrawer for create/edit entries - TimeEntryContextMenu for copy/paste/delete - TimeTrackingCalendar grid with week/day view - Time tracking page with filters and navigation - Sidebar link and timer integration in layout - TaskCard play button connected to timer store Co-Authored-By: Claude Opus 4.6 --- frontend/components/SidebarTimer.vue | 33 +++ frontend/components/TaskCard.vue | 8 +- frontend/components/TimeEntryBlock.vue | 115 +++++++++ frontend/components/TimeEntryContextMenu.vue | 89 +++++++ frontend/components/TimeEntryDrawer.vue | 177 +++++++++++++ frontend/components/TimeTrackingCalendar.vue | 176 +++++++++++++ frontend/layouts/default.vue | 16 ++ frontend/nuxt.config.ts | 24 +- frontend/pages/time-tracking.vue | 250 +++++++++++++++++++ 9 files changed, 885 insertions(+), 3 deletions(-) create mode 100644 frontend/components/SidebarTimer.vue create mode 100644 frontend/components/TimeEntryBlock.vue create mode 100644 frontend/components/TimeEntryContextMenu.vue create mode 100644 frontend/components/TimeEntryDrawer.vue create mode 100644 frontend/components/TimeTrackingCalendar.vue create mode 100644 frontend/pages/time-tracking.vue diff --git a/frontend/components/SidebarTimer.vue b/frontend/components/SidebarTimer.vue new file mode 100644 index 0000000..9d572ac --- /dev/null +++ b/frontend/components/SidebarTimer.vue @@ -0,0 +1,33 @@ + + + diff --git a/frontend/components/TaskCard.vue b/frontend/components/TaskCard.vue index e0ccdd2..f917c8c 100644 --- a/frontend/components/TaskCard.vue +++ b/frontend/components/TaskCard.vue @@ -10,7 +10,7 @@

{{ task.title }}

@@ -60,6 +60,12 @@ const emit = defineEmits<{ (e: 'click'): void }>() +const timerStore = useTimerStore() + +function onPlay() { + timerStore.startFromTask(props.task) +} + function onDragStart(event: DragEvent) { event.dataTransfer!.effectAllowed = 'move' event.dataTransfer!.setData('text/plain', String(props.task.id)) diff --git a/frontend/components/TimeEntryBlock.vue b/frontend/components/TimeEntryBlock.vue new file mode 100644 index 0000000..03be585 --- /dev/null +++ b/frontend/components/TimeEntryBlock.vue @@ -0,0 +1,115 @@ + + + diff --git a/frontend/components/TimeEntryContextMenu.vue b/frontend/components/TimeEntryContextMenu.vue new file mode 100644 index 0000000..6088ed3 --- /dev/null +++ b/frontend/components/TimeEntryContextMenu.vue @@ -0,0 +1,89 @@ + + + diff --git a/frontend/components/TimeEntryDrawer.vue b/frontend/components/TimeEntryDrawer.vue new file mode 100644 index 0000000..2e13ce7 --- /dev/null +++ b/frontend/components/TimeEntryDrawer.vue @@ -0,0 +1,177 @@ +