From bbf058acbef69db9d54a6922b2b10987c8bad52e Mon Sep 17 00:00:00 2001 From: "Dennis (via Claude+Gemma)" Date: Sat, 23 May 2026 05:16:50 +0200 Subject: [PATCH] feat(dashboard-charts): Dashboard mit Stunden-Chart (recharts) [tsc:ok] --- .phase4-state.json | 5 +- GENERATION_LOG.md | 10 +++ apps/web/src/pages/Dashboard.tsx | 110 +++++++++++++++++++------------ 3 files changed, 82 insertions(+), 43 deletions(-) diff --git a/.phase4-state.json b/.phase4-state.json index 5da2fd5..0a3c95f 100644 --- a/.phase4-state.json +++ b/.phase4-state.json @@ -1,8 +1,9 @@ { "completed_features": [ "admin-user-management", - "csv-export-time-entries" + "csv-export-time-entries", + "error-boundary" ], - "current_feature": "error-boundary", + "current_feature": "dashboard-charts", "started_at": "2026-05-23T05:10:51.482879" } \ No newline at end of file diff --git a/GENERATION_LOG.md b/GENERATION_LOG.md index 5c33772..4cd826c 100644 --- a/GENERATION_LOG.md +++ b/GENERATION_LOG.md @@ -495,3 +495,13 @@ undefined - `05:15:45` **INFO** wrote 2176 chars in 18.3s (attempt 1) - `05:15:45` **INFO** Running tsc --noEmit on api… - `05:15:46` **INFO** tsc clean ✓ +- `05:15:46` **INFO** Committed feature error-boundary +- `05:15:47` **INFO** Pushed: rc=0 + +## Phase-3 Feature: dashboard-charts (2026-05-23 05:15:47) + +- `05:15:47` **INFO** Description: Dashboard mit Stunden-Chart (recharts) +- `05:15:47` **INFO** Generating apps/web/src/pages/Dashboard.tsx (ÜBERARBEITETER Dashboard. Behalte die 3 Karten (Heute/Woche/Aktive Pro…) +- `05:16:48` **INFO** wrote 7018 chars in 61.7s (attempt 1) +- `05:16:48` **INFO** Running tsc --noEmit on api… +- `05:16:50` **INFO** tsc clean ✓ diff --git a/apps/web/src/pages/Dashboard.tsx b/apps/web/src/pages/Dashboard.tsx index 6f87ba7..75be075 100644 --- a/apps/web/src/pages/Dashboard.tsx +++ b/apps/web/src/pages/Dashboard.tsx @@ -1,7 +1,9 @@ import { useQuery } from "@tanstack/react-query" import { useNavigate } from "@tanstack/react-router" +import { useMemo } from "react" import { api } from "../lib/api" import { Clock, Calendar, FolderKanban, LogOut } from "lucide-react" +import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from "recharts" export default function Dashboard() { const navigate = useNavigate() @@ -16,7 +18,19 @@ export default function Dashboard() { return start.toISOString().split("T")[0] } + const getLast7Days = () => { + const dates = [] + for (let i = 6; i >= 0; i--) { + const d = new Date() + d.setDate(d.getDate() - i) + dates.push(d.toISOString().split("T")[0]) + } + return dates + } + const weekStart = getStartOfWeek() + const last7DaysDates = getLast7Days() + const oldestDate = last7DaysDates[0] const { data: user, isLoading: userLoading } = useQuery({ queryKey: ["me"], @@ -33,12 +47,35 @@ export default function Dashboard() { queryFn: () => api.listTimeEntries({ from: weekStart }) }) + const { data: chartEntries, isLoading: chartLoading } = useQuery({ + queryKey: ["timeEntries", "chart"], + queryFn: () => api.listTimeEntries({ from: oldestDate }) + }) + const handleLogout = () => { api.logout() navigate({ to: "/login" }) } - if (userLoading || todayLoading || weekLoading) { + const chartData = useMemo(() => { + if (!chartEntries) return [] + + return last7DaysDates.map(date => { + const dayEntries = chartEntries.filter(e => e.date === date) + const totalHours = dayEntries.reduce((acc, curr) => acc + (parseFloat(curr.duration) || 0), 0) + + const d = new Date(date) + const dayName = d.toLocaleDateString('de-DE', { weekday: 'short' }) + + return { + name: dayName, + hours: parseFloat(totalHours.toFixed(2)), + date + } + }) + }, [chartEntries]) + + if (userLoading || todayLoading || weekLoading || chartLoading) { return (
@@ -54,8 +91,6 @@ export default function Dashboard() { const activeProjects = new Set((weekEntries || []).map(e => e.projectId)).size const avgDailyHours = (weekHours / 5).toFixed(1) - const lastFiveEntries = (weekEntries || []).slice(-5).reverse() - return (
@@ -74,7 +109,6 @@ export default function Dashboard() {
- {/* Card 1: Heute */}

Heute

@@ -88,7 +122,6 @@ export default function Dashboard() {
- {/* Card 2: Diese Woche */}

Diese Woche

@@ -102,54 +135,49 @@ export default function Dashboard() {
- {/* Card 3: Aktive Projekte */}

Aktive Projekte

{activeProjects} - diese Woche + in dieser Woche
-
+
-
-
-

Letzte 5 Einträge

-
-
- - - - - - - - - - - {lastFiveEntries.length > 0 ? ( - lastFiveEntries.map((entry) => ( - - - - - - - )) - ) : ( - - - - )} - -
DatumProjektBeschreibungDauer
{entry.date}{entry.projectName || "Unbekannt"}{entry.description}{entry.duration}h
- Keine aktuellen Einträge gefunden. -
+
+

Stunden der letzten 7 Tage

+
+ + + + + + + + +