diff --git a/.claude/docs/technical/DASHBOARD_WIDGETS_AGENT_GUIDE.md b/.claude/docs/technical/DASHBOARD_WIDGETS_AGENT_GUIDE.md index 7fafcac..d0c53da 100644 --- a/.claude/docs/technical/DASHBOARD_WIDGETS_AGENT_GUIDE.md +++ b/.claude/docs/technical/DASHBOARD_WIDGETS_AGENT_GUIDE.md @@ -42,7 +42,7 @@ Kontext: **Dashboard-Lab** unter geschützten Endpoints `GET/PUT /api/app/...` ( 1. **`backend/widget_catalog.py`** – `WIDGET_CATALOG`: erlaubte Widget-IDs, Reihenfolge, Titel/Beschreibung für API und Default-Layout. 2. **`backend/dashboard_layout_schema.py`** – `DashboardLayoutPayload`: jede Zeile hat `id`, `enabled`, optional `config`. IDs müssen in `ALLOWED_WIDGET_IDS` sein (aus dem Katalog abgeleitet). 3. **`backend/dashboard_widget_config.py`** – `validate_widget_entry_config`: **nur** Widgets in `WIDGETS_ALLOWING_CONFIG` dürfen **nicht-leere** `config` haben; Keys werden streng validiert (unbekannte Keys → Fehler). -4. **Frontend** – `ensurePilotLabWidgetsRegistered()` in `frontend/src/widgetSystem/registerPilotLabWidgets.js`: verbindet jede Katalog-ID mit einer React-Komponente und mappt `ctx.layoutEntry.config` auf Props. +4. **Frontend** – `ensureDashboardWidgetsRegistered()` in `frontend/src/widgetSystem/registerDashboardWidgets.js`: verbindet jede Katalog-ID mit einer React-Komponente und mappt `ctx.layoutEntry.config` auf Props. 5. **Dashboard-Lab-UI** – `frontend/src/pages/DashboardLabPage.jsx`: Umsortieren, Ein/Aus, Speichern; **zusätzliche** UI nur nötig, wenn das Widget konfigurierbare Felder braucht. --- @@ -53,8 +53,8 @@ Kontext: **Dashboard-Lab** unter geschützten Endpoints `GET/PUT /api/app/...` ( |--------|--------|--------| | A | `backend/widget_catalog.py` | Neuen Eintrag `{ "id", "title", "description" }` in `WIDGET_CATALOG` einfügen (Reihenfolge = Default-Reihenfolge im Layout). Optional `"requires_feature": ""` für Tarif-Gating (`dashboard_widget_entitlements`). | | B | `backend/widget_catalog.py` | Optional: ID zu `DEFAULT_LAB_WIDGET_IDS` hinzufügen, wenn es im Standard-Lab **aktiv** sein soll. | -| C | `frontend/src/components/dashboard-widgets/MyWidget.jsx` (oder Pilot-Komponente) | React-Komponente implementieren; typischerweise `refreshTick` aus `mapProps` nutzen, um Daten neu zu laden. | -| D | `frontend/src/widgetSystem/registerPilotLabWidgets.js` | `import` + `registerDashboardWidget({ id, Component, mapProps })` – `id` **exakt** wie im Katalog. | +| C | `frontend/src/components/dashboard-widgets/MyWidget.jsx` (oder Legacy-Widget unter `dashboard-widgets-legacy/`) | React-Komponente implementieren; typischerweise `refreshTick` aus `mapProps` nutzen, um Daten neu zu laden. | +| D | `frontend/src/widgetSystem/registerDashboardWidgets.js` | `import` + `registerDashboardWidget({ id, Component, mapProps })` – `id` **exakt** wie im Katalog. | | E | `backend/tests/test_widget_catalog.py` | Läuft implizit mit; bei Strukturänderungen Katalog-Tests beachten. | | F | `backend/version.py` | `MODULE_VERSIONS["app_dashboard"]` MINOR erhöhen und kurz kommentieren. | | G | Build/Tests | `pytest` (z. B. `tests/test_dashboard_layout_schema.py`, `test_widget_catalog.py`); `npm run build` im `frontend`. | @@ -159,5 +159,5 @@ Nach Speichern ruft die Seite `api.putAppDashboardLayout(layout)` auf; das Backe | Layout-Pydantic | `backend/dashboard_layout_schema.py` | | HTTP | `backend/routers/app_dashboard.py` | | Registry + Render | `frontend/src/widgetSystem/dashboardWidgetRegistry.jsx` | -| Pilot/Lab-Registrierung | `frontend/src/widgetSystem/registerPilotLabWidgets.js` | +| Dashboard-Widget-Registrierung | `frontend/src/widgetSystem/registerDashboardWidgets.js` | | Lab-UI | `frontend/src/pages/DashboardLabPage.jsx` | diff --git a/CLAUDE.md b/CLAUDE.md index 7b3291c..a8384c5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -100,6 +100,11 @@ frontend/src/ **Branch:** develop **Nächster Schritt:** Frontend Chart Integration → Testing → Prod Deploy v0.9i +### Updates (23.04.2026 - Dashboard: veraltete Demo-Route entfernt, klare Produkt-Registry) + +- **Frontend:** Veraltete Visualisierungs-Demo-Route und festes Demo-Layout entfernt; Widget-Registrierung in `frontend/src/widgetSystem/registerDashboardWidgets.js` (`ensureDashboardWidgetsRegistered`). Kern-Widgets unter `frontend/src/components/dashboard-widgets-legacy/`. Chart-Hilfen in `frontend/src/widgetSystem/dashboardChartUtils.js`. +- **Doku:** `.claude/docs/technical/DASHBOARD_WIDGETS_AGENT_GUIDE.md` und Kommentar in `backend/widget_catalog.py` angepasst. + ### Updates (09.04.2026 - Universal CSV Import, Prod-Migration abgeschlossen) - **Agent-Leitfaden:** `.claude/docs/technical/UNIVERSAL_CSV_IMPORT_AGENT_GUIDE.md` (Checkliste für neue Import-Module, Executor, Vorlagen, `source=csv`, SAVEPOINT-/Cursor-Regeln) diff --git a/backend/widget_catalog.py b/backend/widget_catalog.py index e83720d..fc6ee57 100644 --- a/backend/widget_catalog.py +++ b/backend/widget_catalog.py @@ -2,7 +2,7 @@ Öffentlicher Widget-Katalog (Dashboard-Lab / später Produkt-Dashboard). Single Source für: erlaubte IDs, Standard-Reihenfolge, Anzeige-Metadaten für API/GUI. -Frontend-Komponenten registrieren dieselben IDs lokal (siehe widgetSystem/registerPilotLabWidgets). +Frontend-Komponenten registrieren dieselben IDs lokal (siehe widgetSystem/registerDashboardWidgets.js, Funktion ensureDashboardWidgetsRegistered). """ from __future__ import annotations diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 4e397fe..fe9e5e1 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -25,7 +25,6 @@ import Analysis from './pages/Analysis' import SettingsPage from './pages/SettingsPage' import SettingsShell from './layouts/SettingsShell' import ProfileReferenceValuesPage from './pages/ProfileReferenceValuesPage' -import PilotVizPage from './pages/PilotVizPage' import DashboardLabPage from './pages/DashboardLabPage' import DashboardConfigurePage from './pages/DashboardConfigurePage' import GuidePage from './pages/GuidePage' @@ -271,7 +270,6 @@ function AppShell() { }/> }/> - } /> } /> diff --git a/frontend/src/components/pilot/PilotActivitySection.jsx b/frontend/src/components/dashboard-widgets-legacy/ActivityOverviewWidget.jsx similarity index 94% rename from frontend/src/components/pilot/PilotActivitySection.jsx rename to frontend/src/components/dashboard-widgets-legacy/ActivityOverviewWidget.jsx index f4e23a6..a8f912a 100644 --- a/frontend/src/components/pilot/PilotActivitySection.jsx +++ b/frontend/src/components/dashboard-widgets-legacy/ActivityOverviewWidget.jsx @@ -8,9 +8,9 @@ import { BODY_CHART_DAYS_DEFAULT, normalizeBodyChartDays, } from '../../widgetSystem/bodyChartDays' -import PilotRuleCard from './PilotRuleCard' +import DashboardRuleCard from './DashboardRuleCard' -export default function PilotActivitySection({ refreshTick = 0, chartDays = BODY_CHART_DAYS_DEFAULT }) { +export default function ActivityOverviewWidget({ refreshTick = 0, chartDays = BODY_CHART_DAYS_DEFAULT }) { const periodDays = normalizeBodyChartDays(chartDays) const { activeProfile } = useProfile() const globalQualityLevel = activeProfile?.quality_filter_level @@ -124,7 +124,7 @@ export default function PilotActivitySection({ refreshTick = 0, chartDays = BODY

) : ( - actRules.map((item, i) => ) + actRules.map((item, i) => ) )} diff --git a/frontend/src/components/pilot/PilotBodySection.jsx b/frontend/src/components/dashboard-widgets-legacy/BodyOverviewWidget.jsx similarity index 96% rename from frontend/src/components/pilot/PilotBodySection.jsx rename to frontend/src/components/dashboard-widgets-legacy/BodyOverviewWidget.jsx index 18a29f6..3ee41c0 100644 --- a/frontend/src/components/pilot/PilotBodySection.jsx +++ b/frontend/src/components/dashboard-widgets-legacy/BodyOverviewWidget.jsx @@ -15,14 +15,14 @@ import dayjs from 'dayjs' import { api } from '../../utils/api' import { useProfile } from '../../context/ProfileContext' import { getInterpretation } from '../../utils/interpret' -import { rollingAvg, fmtDate } from '../../pilot/pilotChartUtils' +import { rollingAvg, fmtDate } from '../../widgetSystem/dashboardChartUtils' import { BODY_CHART_DAYS_DEFAULT, normalizeBodyChartDays, } from '../../widgetSystem/bodyChartDays' -import PilotRuleCard from './PilotRuleCard' +import DashboardRuleCard from './DashboardRuleCard' -export default function PilotBodySection({ refreshTick = 0, chartDays = BODY_CHART_DAYS_DEFAULT }) { +export default function BodyOverviewWidget({ refreshTick = 0, chartDays = BODY_CHART_DAYS_DEFAULT }) { const windowDays = normalizeBodyChartDays(chartDays) const { activeProfile } = useProfile() const [weights, setWeights] = useState([]) @@ -221,7 +221,7 @@ export default function PilotBodySection({ refreshTick = 0, chartDays = BODY_CHA Körperfett, Magermasse (FFMI), BMI – gleiche Logik wie auf der Verlauf-Seite (Körper).

{rules.map((item, i) => ( - + ))} )} diff --git a/frontend/src/components/pilot/PilotRuleCard.jsx b/frontend/src/components/dashboard-widgets-legacy/DashboardRuleCard.jsx similarity index 97% rename from frontend/src/components/pilot/PilotRuleCard.jsx rename to frontend/src/components/dashboard-widgets-legacy/DashboardRuleCard.jsx index 55bcc6f..c857148 100644 --- a/frontend/src/components/pilot/PilotRuleCard.jsx +++ b/frontend/src/components/dashboard-widgets-legacy/DashboardRuleCard.jsx @@ -2,7 +2,7 @@ import { useState } from 'react' import { ChevronDown, ChevronUp } from 'lucide-react' import { getStatusColor, getStatusBg } from '../../utils/interpret' -export default function PilotRuleCard({ item }) { +export default function DashboardRuleCard({ item }) { const [open, setOpen] = useState(false) const color = getStatusColor(item.status) return ( diff --git a/frontend/src/components/pilot/PilotKpiBoard.jsx b/frontend/src/components/dashboard-widgets-legacy/KpiBoardWidget.jsx similarity index 99% rename from frontend/src/components/pilot/PilotKpiBoard.jsx rename to frontend/src/components/dashboard-widgets-legacy/KpiBoardWidget.jsx index b98e60c..0f4bd00 100644 --- a/frontend/src/components/pilot/PilotKpiBoard.jsx +++ b/frontend/src/components/dashboard-widgets-legacy/KpiBoardWidget.jsx @@ -38,7 +38,7 @@ function buildAutoTileIds(refTiles, hasBf, hasKcal) { * @param {{ refreshTick?: number, kpiConfig?: Record }} props * kpiConfig.tiles: geordnete Kachel-ids; fehlend = automatische Belegung (wie bisher). */ -export default function PilotKpiBoard({ refreshTick = 0, kpiConfig }) { +export default function KpiBoardWidget({ refreshTick = 0, kpiConfig }) { const manualOrder = useMemo(() => kpiTileOrderFromConfig(kpiConfig), [kpiConfig]) const { activeProfile } = useProfile() diff --git a/frontend/src/components/pilot/PilotQuickCapture.jsx b/frontend/src/components/dashboard-widgets-legacy/QuickCaptureWidget.jsx similarity index 97% rename from frontend/src/components/pilot/PilotQuickCapture.jsx rename to frontend/src/components/dashboard-widgets-legacy/QuickCaptureWidget.jsx index 2854bee..55c7899 100644 --- a/frontend/src/components/pilot/PilotQuickCapture.jsx +++ b/frontend/src/components/dashboard-widgets-legacy/QuickCaptureWidget.jsx @@ -9,7 +9,7 @@ import { api } from '../../utils/api' * @param {{ onSaved?: () => void, captureConfig?: Record }} props * captureConfig: show_weight, show_resting_hr, show_hrv, show_vo2_max (false = ausblenden; fehlend = true) */ -export default function PilotQuickCapture({ onSaved, captureConfig }) { +export default function QuickCaptureWidget({ onSaved, captureConfig }) { const cfgRaw = captureConfig && typeof captureConfig === 'object' ? captureConfig : {} const showWeight = cfgRaw.show_weight !== false const showRestingHr = cfgRaw.show_resting_hr !== false @@ -200,7 +200,7 @@ export default function PilotQuickCapture({ onSaved, captureConfig }) { {showRestingHr && (
@@ -12,7 +12,7 @@ export default function PilotWelcome() { Hallo, {activeProfile?.name || 'Nutzer'} 👋

- {dayjs().format('dddd, DD. MMMM YYYY')} · Pilot-Übersicht + {dayjs().format('dddd, DD. MMMM YYYY')} · Übersicht

) diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx index c8d9d2d..3a55779 100644 --- a/frontend/src/pages/Dashboard.jsx +++ b/frontend/src/pages/Dashboard.jsx @@ -5,7 +5,7 @@ import { api } from '../utils/api' import { useProfile } from '../context/ProfileContext' import TrialBanner from '../components/TrialBanner' import EmailVerificationBanner from '../components/EmailVerificationBanner' -import { ensurePilotLabWidgetsRegistered } from '../widgetSystem/registerPilotLabWidgets' +import { ensureDashboardWidgetsRegistered } from '../widgetSystem/registerDashboardWidgets' import { WidgetRenderer } from '../widgetSystem/dashboardWidgetRegistry' function catalogMetaById(catalog) { @@ -27,7 +27,7 @@ export default function Dashboard() { const requestRefresh = () => setRefreshTick((t) => t + 1) useEffect(() => { - ensurePilotLabWidgetsRegistered() + ensureDashboardWidgetsRegistered() }, []) useEffect(() => { diff --git a/frontend/src/pages/DashboardConfigurePage.jsx b/frontend/src/pages/DashboardConfigurePage.jsx index d8b5c55..51d2308 100644 --- a/frontend/src/pages/DashboardConfigurePage.jsx +++ b/frontend/src/pages/DashboardConfigurePage.jsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Link } from 'react-router-dom' import { ChevronDown, ChevronUp, GripVertical, LayoutDashboard, Plus, Search, X } from 'lucide-react' import { api, formatFastApiDetail } from '../utils/api' -import { ensurePilotLabWidgetsRegistered } from '../widgetSystem/registerPilotLabWidgets' +import { ensureDashboardWidgetsRegistered } from '../widgetSystem/registerDashboardWidgets' import { BODY_CHART_DAYS_DEFAULT, BODY_CHART_DAYS_MAX, @@ -46,7 +46,7 @@ function catalogMetaById(catalog) { * @param {{ adminMode?: boolean }} [props] */ export default function DashboardConfigurePage({ adminMode = false } = {}) { - ensurePilotLabWidgetsRegistered() + ensureDashboardWidgetsRegistered() const [bundle, setBundle] = useState(null) const [adminFromDatabase, setAdminFromDatabase] = useState(null) diff --git a/frontend/src/pages/DashboardLabPage.jsx b/frontend/src/pages/DashboardLabPage.jsx index 736adc1..93bf4e0 100644 --- a/frontend/src/pages/DashboardLabPage.jsx +++ b/frontend/src/pages/DashboardLabPage.jsx @@ -3,7 +3,7 @@ import { ChevronDown, ChevronUp, LayoutGrid } from 'lucide-react' import { Link } from 'react-router-dom' import { api, formatFastApiDetail } from '../utils/api' import { WidgetRenderer } from '../widgetSystem/dashboardWidgetRegistry' -import { ensurePilotLabWidgetsRegistered } from '../widgetSystem/registerPilotLabWidgets' +import { ensureDashboardWidgetsRegistered } from '../widgetSystem/registerDashboardWidgets' import { BODY_CHART_DAYS_DEFAULT, BODY_CHART_DAYS_MAX, @@ -38,7 +38,7 @@ function catalogMetaById(catalog) { } export default function DashboardLabPage() { - ensurePilotLabWidgetsRegistered() + ensureDashboardWidgetsRegistered() const [refreshTick, setRefreshTick] = useState(0) const requestRefresh = () => setRefreshTick((t) => t + 1) @@ -198,13 +198,11 @@ export default function DashboardLabPage() {

Widget-System: Katalog, Registry, Renderer; optional pro Widget config (z. B.{' '} Körper / Aktivität: Zeitraum 7–90 Tage; KPI: Kacheln - wählen & sortieren). Layout pro Profil in der DB — - getrennt vom Produktiv-Dashboard. - Vergleich:{' '} - - Pilot-Übersicht (festes Standard-Layout) + wählen & sortieren). Layout pro Profil in der DB — dieselben Widgets wie auf der{' '} + + Produkt-Übersicht - . + , hier mit Editor und API-Fokus.

diff --git a/frontend/src/pages/PilotVizPage.jsx b/frontend/src/pages/PilotVizPage.jsx deleted file mode 100644 index a45351b..0000000 --- a/frontend/src/pages/PilotVizPage.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { useState } from 'react' -import { FlaskConical } from 'lucide-react' -import { Link } from 'react-router-dom' -import { WidgetRenderer } from '../widgetSystem/dashboardWidgetRegistry' -import { ensurePilotLabWidgetsRegistered } from '../widgetSystem/registerPilotLabWidgets' -import { DEFAULT_LAB_LAYOUT } from '../widgetSystem/defaultLabLayout' - -/** - * Pilot-Übersicht nach Product-Spec (festes Standard-Layout). - * Nutzt dasselbe Widget-Rendering wie /app/dashboard-lab. - */ -export default function PilotVizPage() { - ensurePilotLabWidgetsRegistered() - - const [refreshTick, setRefreshTick] = useState(0) - const requestRefresh = () => setRefreshTick((t) => t + 1) - - return ( -
-
- - ← Einstellungen - -

- - Pilot: Übersicht -

-

- Konfigurierbare Ziel-Übersicht (Test). Produktives Dashboard und Verlauf unverändert. Nach Speichern von - Gewicht oder Vitalwerten werden KPIs und Körperbereich neu geladen. -

-
- - -
- ) -} diff --git a/frontend/src/pages/SettingsPage.jsx b/frontend/src/pages/SettingsPage.jsx index 32cf8c4..cfd1f33 100644 --- a/frontend/src/pages/SettingsPage.jsx +++ b/frontend/src/pages/SettingsPage.jsx @@ -463,37 +463,28 @@ export default function SettingsPage() { style={{ borderStyle: 'dashed', borderColor: 'var(--border2)', background: 'var(--surface2)' }} >
- Pilot: Visualisierungs-Module + Entwickler: Dashboard-Layout (API)

- Ziel-Übersicht-Pilot: Schnelleingabe, KPIs, Körper-Chart, Aktivität. Die reguläre Übersicht konfigurierst du - unter Übersicht anpassen oben. + Experimentelles Layout-Lab mit Katalog und API (getrennt von der regulären Übersicht). Die produktive Kachelansicht + steuerst du über Übersicht anpassen oben.

-
- - Pilot öffnen - - - - Dashboard-Lab (Layout API) - -
+ + + Dashboard-Lab öffnen + {/* Auth actions */} diff --git a/frontend/src/pilot/pilotChartUtils.js b/frontend/src/widgetSystem/dashboardChartUtils.js similarity index 100% rename from frontend/src/pilot/pilotChartUtils.js rename to frontend/src/widgetSystem/dashboardChartUtils.js diff --git a/frontend/src/widgetSystem/defaultLabLayout.js b/frontend/src/widgetSystem/defaultLabLayout.js deleted file mode 100644 index d778b08..0000000 --- a/frontend/src/widgetSystem/defaultLabLayout.js +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Standard-Layout v1 (nur Pilot `/pilot/viz` ohne API). - * API-Nutzer: default_layout aus Backend (alle Katalog-IDs; aktiv = DEFAULT_LAB_WIDGET_IDS). - * Diese Datei: kompakte feste 5 Widgets für den Pilot – nicht automatisch alle P1-Widgets. - */ -export const DEFAULT_LAB_LAYOUT = { - version: 1, - widgets: [ - { id: 'welcome', enabled: true }, - { id: 'quick_capture', enabled: true }, - { id: 'kpi_board', enabled: true }, - { id: 'body_overview', enabled: true }, - { id: 'activity_overview', enabled: true }, - ], -} diff --git a/frontend/src/widgetSystem/registerPilotLabWidgets.js b/frontend/src/widgetSystem/registerDashboardWidgets.js similarity index 89% rename from frontend/src/widgetSystem/registerPilotLabWidgets.js rename to frontend/src/widgetSystem/registerDashboardWidgets.js index 7c7260c..68d5204 100644 --- a/frontend/src/widgetSystem/registerPilotLabWidgets.js +++ b/frontend/src/widgetSystem/registerDashboardWidgets.js @@ -1,11 +1,11 @@ /** - * Pilot/Lab-Widgets registrieren. IDs müssen zu backend/widget_catalog.WIDGET_CATALOG passen. + * Dashboard-Widget-Registry: Katalog-IDs aus backend/widget_catalog.WIDGET_CATALOG → React-Komponenten. */ -import PilotWelcome from '../components/pilot/PilotWelcome' -import PilotQuickCapture from '../components/pilot/PilotQuickCapture' -import PilotKpiBoard from '../components/pilot/PilotKpiBoard' -import PilotBodySection from '../components/pilot/PilotBodySection' -import PilotActivitySection from '../components/pilot/PilotActivitySection' +import WelcomeWidget from '../components/dashboard-widgets-legacy/WelcomeWidget' +import QuickCaptureWidget from '../components/dashboard-widgets-legacy/QuickCaptureWidget' +import KpiBoardWidget from '../components/dashboard-widgets-legacy/KpiBoardWidget' +import BodyOverviewWidget from '../components/dashboard-widgets-legacy/BodyOverviewWidget' +import ActivityOverviewWidget from '../components/dashboard-widgets-legacy/ActivityOverviewWidget' import DashboardGreetingWidget from '../components/dashboard-widgets/DashboardGreetingWidget' import QuickWeightTodayWidget from '../components/dashboard-widgets/QuickWeightTodayWidget' import BodyStatStripWidget from '../components/dashboard-widgets/BodyStatStripWidget' @@ -34,18 +34,18 @@ import { registerDashboardWidget } from './dashboardWidgetRegistry' let _registered = false -export function ensurePilotLabWidgetsRegistered() { +export function ensureDashboardWidgetsRegistered() { if (_registered) return _registered = true registerDashboardWidget({ id: 'welcome', - Component: PilotWelcome, + Component: WelcomeWidget, mapProps: () => ({}), }) registerDashboardWidget({ id: 'quick_capture', - Component: PilotQuickCapture, + Component: QuickCaptureWidget, mapProps: (ctx) => ({ onSaved: ctx.requestRefresh, captureConfig: ctx.layoutEntry?.config || {}, @@ -53,7 +53,7 @@ export function ensurePilotLabWidgetsRegistered() { }) registerDashboardWidget({ id: 'kpi_board', - Component: PilotKpiBoard, + Component: KpiBoardWidget, mapProps: (ctx) => ({ refreshTick: ctx.refreshTick, kpiConfig: ctx.layoutEntry?.config || {}, @@ -61,7 +61,7 @@ export function ensurePilotLabWidgetsRegistered() { }) registerDashboardWidget({ id: 'body_overview', - Component: PilotBodySection, + Component: BodyOverviewWidget, mapProps: (ctx) => ({ refreshTick: ctx.refreshTick, chartDays: normalizeBodyChartDays(ctx.layoutEntry?.config?.chart_days), @@ -77,7 +77,7 @@ export function ensurePilotLabWidgetsRegistered() { }) registerDashboardWidget({ id: 'activity_overview', - Component: PilotActivitySection, + Component: ActivityOverviewWidget, mapProps: (ctx) => ({ refreshTick: ctx.refreshTick, chartDays: normalizeBodyChartDays(ctx.layoutEntry?.config?.chart_days), @@ -193,6 +193,6 @@ export function ensurePilotLabWidgetsRegistered() { } /** @internal Nur für Tests */ -export function __resetPilotLabRegistrationForTests() { +export function __resetDashboardWidgetRegistrationForTests() { _registered = false }