From 28d199bddc39687a7a14f085241f5fc1e3dfc504 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 18 Feb 2026 10:39:08 +0200 Subject: [PATCH] feat: add Calendar, Timesheet, and MiniTimer views Calendar shows weekly time-block layout with hour rows, entry positioning, current time indicator, and week navigation. Timesheet provides a weekly grid with project/task rows, day columns, totals, and add-row functionality. MiniTimer is a minimal always-on-top timer display for the floating window. --- src/components/NavRail.vue | 10 +- src/router/index.ts | 15 ++ src/views/CalendarView.vue | 364 ++++++++++++++++++++++++++++++++ src/views/MiniTimer.vue | 27 +++ src/views/TimesheetView.vue | 407 ++++++++++++++++++++++++++++++++++++ 5 files changed, 822 insertions(+), 1 deletion(-) create mode 100644 src/views/CalendarView.vue create mode 100644 src/views/MiniTimer.vue create mode 100644 src/views/TimesheetView.vue diff --git a/src/components/NavRail.vue b/src/components/NavRail.vue index 643b783..524a541 100644 --- a/src/components/NavRail.vue +++ b/src/components/NavRail.vue @@ -8,6 +8,8 @@ import { Users, FolderKanban, List, + CalendarDays, + Grid3X3, BarChart3, FileText, Settings @@ -23,6 +25,8 @@ const navItems = [ { name: 'Clients', path: '/clients', icon: Users }, { name: 'Projects', path: '/projects', icon: FolderKanban }, { name: 'Entries', path: '/entries', icon: List }, + { name: 'Calendar', path: '/calendar', icon: CalendarDays }, + { name: 'Timesheet', path: '/timesheet', icon: Grid3X3 }, { name: 'Invoices', path: '/invoices', icon: FileText }, { name: 'Reports', path: '/reports', icon: BarChart3 }, { name: 'Settings', path: '/settings', icon: Settings } @@ -65,12 +69,16 @@ function navigate(path: string) { - +
+
diff --git a/src/router/index.ts b/src/router/index.ts index 659428c..32c0773 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -28,11 +28,26 @@ const router = createRouter({ name: 'Entries', component: () => import('../views/Entries.vue') }, + { + path: '/calendar', + name: 'Calendar', + component: () => import('../views/CalendarView.vue') + }, + { + path: '/timesheet', + name: 'Timesheet', + component: () => import('../views/TimesheetView.vue') + }, { path: '/reports', name: 'Reports', component: () => import('../views/Reports.vue') }, + { + path: '/mini-timer', + name: 'MiniTimer', + component: () => import('../views/MiniTimer.vue') + }, { path: '/invoices', name: 'Invoices', diff --git a/src/views/CalendarView.vue b/src/views/CalendarView.vue new file mode 100644 index 0000000..4d01e24 --- /dev/null +++ b/src/views/CalendarView.vue @@ -0,0 +1,364 @@ + + + diff --git a/src/views/MiniTimer.vue b/src/views/MiniTimer.vue new file mode 100644 index 0000000..a51df3c --- /dev/null +++ b/src/views/MiniTimer.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/views/TimesheetView.vue b/src/views/TimesheetView.vue new file mode 100644 index 0000000..5dbf8fa --- /dev/null +++ b/src/views/TimesheetView.vue @@ -0,0 +1,407 @@ + + +