Implement the admin-only dashboard configuration UI described in the GSoC project plan (Deliverable 4).
Superusers will be able to customise the dashboard layout interactively.
Plan
src/stores/useDashboardStore.js : Zustand store (persisted to localStorage) holding widgetConfigs, layouts, isDirty, and savedVersion. All dashboard layout state now lives here instead of being hardcoded in defaultDashboardConfig.js.
src/components/dashboard/ConfigEditor.jsx : Admin editor accessible at /dashboard/config.
Dashboard.jsx — Reads widgetConfigs/layouts from the store; shows a Configure button for superusers.
Routes.jsx — Adds /dashboard/config to authRoutesLazy, wrapped in AuthGuard + SuperuserGuard.
AppHeader.jsx — Adds a Config nav item visible only when isSuperuser is true.
stores/index.js — Exports useDashboardStore.
Acceptance criteria
Implement the admin-only dashboard configuration UI described in the GSoC project plan (Deliverable 4).
Superusers will be able to customise the dashboard layout interactively.
Plan
src/stores/useDashboardStore.js: Zustand store (persisted tolocalStorage) holdingwidgetConfigs,layouts,isDirty, andsavedVersion. All dashboard layout state now lives here instead of being hardcoded indefaultDashboardConfig.js.src/components/dashboard/ConfigEditor.jsx: Admin editor accessible at/dashboard/config.Dashboard.jsx— ReadswidgetConfigs/layoutsfrom the store; shows a Configure button for superusers.Routes.jsx— Adds/dashboard/configtoauthRoutesLazy, wrapped inAuthGuard+SuperuserGuard.AppHeader.jsx— Adds a Config nav item visible only whenisSuperuseristrue.stores/index.js— ExportsuseDashboardStore.Acceptance criteria
Xbutton