feat(L1): modular widget dashboard — 15 configurable widgets

Replaces monolithic AdminDashboard/ClientDashboard with a per-user
configurable widget grid. 15 widget types: ProductionStats, QueueStatus,
RecentRenders, CostOverview, WorkerStatus, KPISummary, OrderThroughput,
Revenue, ItemStatus, ProcessingTimes, RenderTimeByOutputType,
OutputTypeUsage, TopProducts, OrdersByUser, RenderBackendStats.

DashboardTimeframeContext provides shared timeframe state. Dashboard
config persisted in DB via GET/PUT /api/dashboard/config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 23:11:13 +01:00
parent a70cb55d01
commit f15b035b88
19 changed files with 939 additions and 798 deletions
+3 -15
View File
@@ -1,22 +1,10 @@
import { useAuthStore } from '../store/auth'
import DashboardGrid from '../components/dashboard/DashboardGrid'
import AdminDashboard from '../components/dashboard/AdminDashboard'
import ClientDashboard from '../components/dashboard/ClientDashboard'
export default function DashboardPage() {
const user = useAuthStore((s) => s.user)
const isPrivileged = user?.role === 'admin' || user?.role === 'project_manager'
return (
<div className="space-y-8">
{/* Configurable widget grid — visible to all roles */}
<div className="p-8 pb-0">
<h1 className="text-2xl font-bold text-content mb-6">Dashboard</h1>
<DashboardGrid />
</div>
{/* Role-based analytics section */}
{isPrivileged ? <AdminDashboard /> : <ClientDashboard />}
<div className="p-8">
<h1 className="text-2xl font-bold text-content mb-6">Dashboard</h1>
<DashboardGrid />
</div>
)
}