Zum Inhalt

Dashboard Widget System v1 — Vollständige Analyse & v2 Migrationsplan

1. Architektur-Übersicht v1

Kernkomponenten

Datei Rolle
FrontendDashboard Model Widget-Typen, JSON-Konfiguration, loadDashBoard() Dispatcher
FrontendDashboardController 22 AJAX-Action-Methoden zum Laden der Widget-Daten
blocks/_view_*.php Widget-Container (Header, Buttons, Settings, Hidden-Fields)
_parts/_table_*.php Tabellen-Rendering via GridViewHelper::renderGrid()
_parts/_chart_*.php Chart-Rendering via Chart.js
_parts/_box_advanced_filter.php Info-Box für Advanced-Filter-Zähler
FrontendGridSetting Model Benutzerspezifische Spalten-Sichtbarkeit pro Grid
FrontendAdvancedFilter Model Formel-basierte Filter (6 Typen)
FrontendFilterStatistic Model Zeitliche Statistik-Snapshots für Charts

Datenmodell

dashboard (Tabelle)
├── uID (VARCHAR 80, PK)
├── user_uID (VARCHAR 80, FK → user)
├── name (VARCHAR 255)
├── value (TEXT) ← JSON-Array aller Widgets
├── status (TINYINT 1) ← 1=aktiv, 0=inaktiv
└── created_at (DATETIME)

Widget JSON-Struktur (ein Element im value-Array):

{
  "title": "widget_type_name",
  "position": { "x": 0, "y": 0, "width": 6, "height": 4 },
  "settings": { /* widget-spezifisch */ }
}

Layout-System

  • GridStack.js mit 12-Spalten-Grid
  • CELL_HEIGHT = 80px, VERTICAL_MARGIN = 16px
  • Drag & Drop + Resize über GridStack
  • Widget-Positionen werden per AJAX gespeichert

2. Vollständiger Widget-Katalog

2.1 Inventar-Widgets (Tabellen)

due_inventory — Fällige Geräte

  • Controller: actionListInventory()FrontendInventory::doAjaxLoadInventory()
  • View: _parts/_table_due_inventory.php
  • Settings: rowsPerPage, portletInventoryConditionFilterVal, customerKtag
  • Spalten:
Spalte Feld Bedingung
Kunde ktag (→ customer.getName()) Nur bei customerKtag = "all"
Geräte-Nr. I4201 Immer
Hersteller I4202 Immer
Modell I4203 Immer
Serien-Nr. I4204 Immer
Fälligkeitsdatum duedate Immer
Aktionen View-Link → /frontendInventory/view Bei inventory_view Berechtigung

overdue_inventory — Überfällige Geräte

  • Identische Spaltenstruktur wie due_inventory
  • Settings: Zusätzlich fn_due = "overdue"

critical_1_inventory, critical_2_inventory, critical_3_inventory — Kritische Geräte

  • Identische Spaltenstruktur wie due_inventory
  • Settings: Zusätzlich fn_critical = "critical_1/2/3"

2.2 Kalibrierungs-Widgets

due_calibration_per_month — Kalibrierungen pro Monat

  • Controller: actionListDueCalibrationPerMonth()FrontendInventory::countFutureInventory()
  • View: _parts/_table_future_inventory.php
  • Settings: rowsPerPage, portletInventoryConditionFilterVal, customerKtag, numberMonth, calibrationDueType
  • Spalten: Dynamisch via FrontendGridSetting::getVisibleFields('calibration_due_per_month')

last_calibration — Letzte Kalibrierungen

  • Controller: actionListLastCalibration()FrontendCalibration::search(LAST_CALIBRATION_TABLE)
  • View: _parts/_table_last_calibration.php
  • Settings: rowsPerPage, date_range, customerKtag, status, hasDocumentColumn, hasDocumentType
  • Spalten: Vollständig dynamisch via FrontendProperty::getGridViewColumns(LAST_CALIBRATION_TABLE)
  • Mit EColumnsDialog → Benutzer kann Spalten ein-/ausblenden und sortieren
  • Action-Spalte: View-Link → /frontendCalibration/view (bei calibration_view)

2.3 Status-Widgets (Tabelle ODER Chart)

assets_status — Inventar-Status

  • Controller: actionListStatusAssets()FrontendStatus::countInventorySearch()
  • View (Tabelle): _parts/_table_assets_status.php
  • View (Chart): _parts/_chart_assets_status.php
  • Settings: rowsPerPage, portletInventoryConditionFilterVal, customerKtag, settingDisplay (table/chart)
  • Spalten: Dynamisch via FrontendGridSetting::getVisibleFields('status_dashboard')
Spalte Feld Rendering
Status title Link zu gefilterten Inventar
Anzahl itemCount Zentriert
  • Chart-Modus: Doughnut/Pie mit Chart.js, Legend mit Titel + Count

ticket_status — Ticket-Status

  • Controller: actionListTicketStatus()FrontendStatus::countTicketSearch()
  • View (Tabelle): _parts/_table_ticket_status.php
  • View (Chart): _parts/_chart_ticket_status.php
  • Settings: rowsPerPage, project, category, type, settingDisplay
  • Spalten: Identisch zu assets_status (via FrontendGridSetting::getVisibleFields('status_dashboard'))

2.4 Auftrags-Widgets (Tabellen)

new_offers — Neue Angebote

  • Controller: actionListBooking()FrontendBooking::doAjaxLoadInventory()
  • View: _parts/_table_new_offers.php
  • Settings: rowsPerPage, customerKtag
  • Spalten:
Spalte Feld
Nummer number
Datum date
Status status
Aktionen View → /frontendBooking/view (bei bookings_view)

order_entries_by_status — Aufträge nach Status

  • Controller: actionListOrders()FrontendBooking::getItemByStatus()
  • View: _parts/_table_orders_by_status.php
  • Settings: rowsPerPage, status
  • Spalten:
Spalte Feld
Kunde customer_KTAG → customer.getName()
Nummer number
Datum date
Kommentar comment
Status status
Aktionen View → /frontendBooking/view (bei bookings_view)

2.5 Notepad-Widgets

notepad_status — Status-Übersicht

  • Controller: actionListNotepadStatus()FrontendStatus::countNotepadSearch()
  • View: _parts/_table_notepad_status.php
  • Spalten: title (Link), count (getTotalItemCount)

notepad_notification — Benachrichtigungen

  • Controller: actionListNotepadNotification()FrontendNotepad::countItemByNotification()
  • View: _parts/_table_notepad_notification.php
  • Spalten: notification_at (Link), count (itemCount)

notepad_entries_by_status_and_assignee — Einträge nach Status & Bearbeiter

  • Controller: actionListNotepad()FrontendNotepad::getItemByStatusAndAssignee()
  • View: _parts/_table_notepad_by_status_and_assignee.php
  • Settings: rowsPerPage, status, assignee
  • Spalten:
Spalte Feld
Geräte-Nr. inventory.I4201
Hersteller inventory.I4202
Modell inventory.I4203
Datum date_time
Bearbeiter assignUser.getFullName()
Status own_status (bedingt: nicht bei OVERDUE/FINISH_TODAY)
Aktionen View Notepad + View Inventory (bei Berechtigungen)

2.6 Support-Widgets

ticket_statistic — Ticket-Statistik (Tabelle)

  • Controller: actionListTicketStatistic()Tickets::countTicketStatistic()
  • View: _parts/_table_ticket_statistic.php
  • Settings: rowsPerPage, numberMonth, project, category
  • Spalten:
Spalte Feld
Zeitraum date_range
Ticket-Typ ticket_type
Offen count_open
Geschlossen count_closed

support_activity_entries — Aktivitäts-Feed (KEIN Grid!)

  • Controller: actionListSupportActivities()Activity::search()
  • View: _parts/_table_support_activities.php
  • Rendering: Custom HTML-Newsfeed (NICHT GridViewHelper)
  • Elemente pro Eintrag:
  • Avatar (Bild + Link)
  • Titel (Link zum Ticket)
  • Beschreibung (Issue + Project)
  • Footer: User, Zeitstempel, Status-Badge

support_risk_entries — Risiko-Matrix (KEIN Grid!)

  • Controller: actionListSupportRisks()TicketRisk::getDataForDashWidget()
  • View: _parts/_table_support_risks.php
  • Rendering: Custom HTML-Tabelle (Impact × Probability Matrix)
  • Elemente:
  • Zeilen = Impact-Level, Spalten = Probability-Level
  • Zellen: Farbe + Ticket-Anzahl mit Link
  • Achsen-Beschriftungen: "Impact" / "Probability"

support_risk_priority — Risiko-Priorität (KEIN Grid!)

  • Controller: actionListSupportRisksPriority()TicketRisk::getDataForPriorityWidget()
  • View: _parts/_table_support_risks_priority.php
  • Rendering: 4-spaltige Balkenvisualisierung
  • Elemente:
  • 4 Risiko-Spalten (risk1, risk2, risk3, risk)
  • Farbige Balken mit Ticket-Count und Höhe

2.7 DMS-Widget

dms_entries — Dokumenten-Einträge

  • Controller: actionListDocument()FrontendDms::getItemByTypeAndStatus()
  • View: _parts/_table_dms_entries.php
  • Settings: rowsPerPage, status, type
  • Spalten:
Spalte Feld Bedingung
Name name Immer
Hersteller I4202 (getI4202()) Nur bei type=inventory
Modell I4203 (getI4203()) Nur bei type=inventory
Version version (getVersion()) Immer
Dateityp filetype (getFileTypeHtml()) Immer
Status action_title (getStatusHtml()) Immer
Typ link_table (getTypeForDashboard()) Immer
Erstellt created (formatiert) Immer
Aktionen View → /adminDocument/view Bei dms_view

2.8 Advanced-Filter-Widgets

advanced_filter — Filter-Ergebnis (Info-Box)

  • Controller: actionGetAdvancedFilterStatistics() → dynamisch nach Typ
  • View: blocks/_view_advanced_filter_{type}.php_parts/_box_advanced_filter.php
  • Settings: filter_id, filter_name, color, type
  • Rendering: KEINE Tabelle — Info-Box mit:
  • Icon (typ-spezifisch: bar-chart, wrench, gavel, shopping-cart)
  • Filter-Name (als Link zur Admin-Seite mit Filter)
  • Ergebnis-Anzahl (count_item, formatiert)
  • Farbiger Hintergrund/Icon nach color
  • 6 Subtypen: inventory, calibration, repair, location, booking, support (ticket)
  • Typ → Admin-Link Mapping:
Typ Admin-Seite Berechtigung
inventory /frontendInventory/admin inventory_view/edit/delete
calibration /frontendCalibration/admin calibration_view/edit/delete
repair /frontendRepair/admin repair_view/edit/delete
location /frontendRental/admin location_view/edit/delete
booking /frontendBooking/admin bookings_view/edit/delete
support /support/ticket/admin support_management_admin

filter_statistic — Filter-Statistik (Chart)

  • Controller: actionGetFilterStatisticForChart()FrontendFilterStatistic::getDataForChart()
  • View: _parts/_chart_filter_statistic.php
  • Settings: chart_filters (Array von Filter-IDs), chart_type (LineChart/AreaChart/BarChart), year
  • Chart-Typen: LineChart, AreaChart, BarChart (aus FrontendFilterStatistic::CHART_TYPES)

2.9 Status-Variable-Widget (Dynamisch)

status_variable — Variable Statistik

  • Controller: actionListItemOfStatistics() → dynamisch nach Variable-Prefix
  • Settings: variable, filter, order (asc/desc)
  • 6 Untertypen nach Variable-Prefix:
Prefix Model View Spalten
(default) FrontendInventory _table_status_variable_inventory I4201, I4202, I4203, I4204, [dynamisch]
booking... FrontendBooking _table_status_variable_booking Auftragsspezifisch
calibration... FrontendCalibration _table_status_variable_calibration Kalibrierspezifisch
notepad... FrontendNotepad _table_status_variable_notepad Notepad-spezifisch
repair... FrontendRepair _table_status_variable_repair Reparaturspezifisch
support_tickets... Tickets _table_status_variable_ticket Ticketspezifisch

Inventory-Spalten (Beispiel):

Spalte Feld
Geräte-Nr. I4201
Hersteller I4202
Modell I4203
Serien-Nr. I4204
[Variable] Dynamisch via AdminStatusSetting::getFormat()
Aktionen View → /frontendInventory/view

2.10 Admin-Widgets

pending_user — Ausstehende Benutzer

  • Controller: actionListPendingUser()FrontendUser::search()
  • View: _parts/_table_pending_user.php
  • Settings: rowsPerPage, userStatus, portletInventoryConditionFilterVal
  • Spalten: Dynamisch via FrontendGridSetting::getVisibleFields('user_dashboard')
  • Action: Update → /adminUser/update (bei user_management_admin)

2.11 Energie-Monitoring

emoncms — emonCMS Integration

  • Controller: actionLoadFeedId()InventoryHelper::getAllFeeds()
  • View: _parts/_table_emoncms.php
  • Settings: feed_id
  • Rendering: Spezifisches Embed/iFrame

3. Spaltenquellen-System

Drei Arten von Spalten-Definitionen:

Art Methode Verwendung
Hardcoded Array direkt in View Einfache Widgets (due_inventory, new_offers, notepad, orders, dms, ticket_statistic)
GridSetting FrontendGridSetting::getVisibleFields(gridName) Konfigurierbare Widgets (assets_status, ticket_status, pending_user, calibration_due_per_month)
Property-basiert FrontendProperty::getGridViewColumns(tableName) Vollständig dynamische Widgets (last_calibration)

Grid-Settings-Mechanismus:

  1. frontend_grid_setting Tabelle speichert pro User + Grid: Komma-getrennte Spaltennamen
  2. admin_grid_setting_template Tabelle definiert System-Templates als Default
  3. Fallback-Kette: User-Setting → User-Default-Template → System-Template
  4. Grid-Name kann role- und property-spezifisch erweitert werden: {gridName}_{role}_{property}

4. Advanced-Filter-System

Formel-Engine:

  • SQL-ähnliche WHERE-Klauseln in formula-Feld
  • Variablen: [date_1], [integer_1] — Placeholder für dynamische Werte
  • Datum-Presets: TODAY, CURRENTMONTH_STARTDAY/ENDDAY, LASTMONTH_STARTDAY/ENDDAY, CURRENTYEAR_STARTDAY/ENDDAY
  • Datum-Arithmetik: [date_field+5], [date_field-3] (Tage)
  • Operatoren: =, !=, <, >, <=, >=, LIKE, IS NULL, IS NOT NULL
  • Logik: AND, OR

6 Filter-Typen:

Typ Model Felder aus
inventory FrontendInventory inventory Tabelle
calibration FrontendCalibration calibration Tabelle
repair FrontendRepair repair Tabelle
location FrontendLocation location Tabelle
booking FrontendBooking booking Tabelle
support Tickets support_tickets Tabelle

Statistik-System:

  • Cron-basiert: */5 * * * *saveAsStatistic Command
  • Speichert monatlich oder täglich den COUNT für jeden Filter
  • Chart-Daten aus filter_statistic Tabelle

5. v2 Ist-Zustand

Bereits implementiert:

  • Dashboard CRUD (create, rename, delete, activate)
  • Widget JSON-Format (kompatibel mit v1)
  • CSS-Grid Layout (12 Spalten, kein GridStack)
  • Widget-Katalog mit Kategorien
  • Count-Widgets: inventory_count, calibration_count, overdue_count, due_count
  • Table-Widgets (Basis): recent_calibrations, recent_bookings, recent_notepads
  • Chart-Widgets: status_overview (Pie), calibrations_per_month (Bar)
  • Advanced-Filter-Count-Widget
  • Filter-Statistik-Widget
  • API: /dashboards, /advanced-filters mit CRUD + Stats

Fehlend für v1-Kompatibilität:

Kategorie Fehlende Widgets
Inventar due_inventory, overdue_inventory, critical_1/2/3_inventory mit korrekten Spalten
Kalibrierung due_calibration_per_month (mit dynamischen Spalten), last_calibration (mit Spaltenkonfiguration)
Status assets_status (mit Table/Chart-Toggle), ticket_status (mit Table/Chart-Toggle)
Aufträge new_offers, order_entries_by_status
Notepad notepad_status, notepad_notification, notepad_entries_by_status_and_assignee
Support ticket_statistic, support_activity_entries (Feed), support_risk_entries (Matrix), support_risk_priority (Balken)
DMS dms_entries
Status-Variable status_variable (6 Untertypen)
Admin pending_user
Spezial emoncms

6. Migrationsplan v1 → v2

Phase 1: Infrastruktur

1.1 Widget-Typen-Registry

Erstelle ein zentrales Widget-Registry-System in v2:

frontend-v2/composables/useDashboardWidgets.ts

Aufbau: - WidgetType Interface mit: type, label, icon, category, defaultSize, component, settingsComponent - Registrierung aller 23+ Widget-Typen - Dynamic Component Loading via <component :is="...">

1.2 Generische Widget-Tabelle

Erweitere TableWidget.vue zu einem konfigurierbaren Dashboard-Table:

frontend-v2/components/dashboard/widgets/DashboardTableWidget.vue

Features: - Spalten-Definition per Props (wie v1 aber als TypeScript-Interface) - Pagination (rowsPerPage aus Widget-Settings) - AJAX-Reload via API-Endpoint - Action-Spalte mit permission-gating - Empty-State - Scroll-Wrapper

1.3 API-Endpoints für Widget-Daten

Neue Laravel-Endpoints für jedes Widget:

GET /api/v2/dashboards/widgets/{type}?settings=...

Oder typ-spezifische Endpoints:

Endpoint Widget
GET /api/v2/inventories/dashboard/due due_inventory
GET /api/v2/inventories/dashboard/overdue overdue_inventory
GET /api/v2/inventories/dashboard/critical/{level} critical_1/2/3
GET /api/v2/inventories/dashboard/status assets_status
GET /api/v2/calibrations/dashboard/per-month due_calibration_per_month
GET /api/v2/calibrations/dashboard/last last_calibration
GET /api/v2/tickets/dashboard/status ticket_status
GET /api/v2/tickets/dashboard/statistics ticket_statistic
GET /api/v2/bookings/dashboard/offers new_offers
GET /api/v2/bookings/dashboard/by-status order_entries_by_status
GET /api/v2/notepads/dashboard/status notepad_status
GET /api/v2/notepads/dashboard/notifications notepad_notification
GET /api/v2/notepads/dashboard/by-status-assignee notepad_entries
GET /api/v2/dms/dashboard/entries dms_entries
GET /api/v2/support/dashboard/activities support_activities
GET /api/v2/support/dashboard/risks support_risks
GET /api/v2/support/dashboard/risk-priority support_risk_priority
GET /api/v2/users/dashboard/pending pending_user
GET /api/v2/inventories/dashboard/status-variable status_variable

1.4 Grid-Setting-API

GET    /api/v2/grid-settings/{gridName}       → sichtbare Spalten
PUT    /api/v2/grid-settings/{gridName}       → Spalten speichern
POST   /api/v2/grid-settings/{gridName}/reset → Auf Template zurücksetzen
GET    /api/v2/grid-settings/templates/{gridName} → Verfügbare Templates

Phase 2: Widget-Komponenten (Priorität nach Nutzung)

Priorität A — Kern-Widgets (häufigste Nutzung)

2.1 Inventar-Tabellen-Widgets (due_inventory, overdue_inventory, critical_*)

frontend-v2/components/dashboard/widgets/InventoryListWidget.vue
- Gemeinsame Komponente mit inventoryType Prop (due/overdue/critical_1/2/3) - Spalten: Customer (bedingt), I4201, I4202, I4203, I4204, duedate - Settings: rowsPerPage, portletInventoryConditionFilterVal, customerKtag

2.2 Assets-Status-Widget (assets_status)

frontend-v2/components/dashboard/widgets/AssetsStatusWidget.vue
- Table/Chart Toggle (settingDisplay) - Dynamische Spalten aus Grid-Settings - Chart: Doughnut/Pie mit PrimeVue Charts

2.3 Last-Calibration-Widget (last_calibration)

frontend-v2/components/dashboard/widgets/LastCalibrationWidget.vue
- Vollständig dynamische Spalten - Spalten-Konfigurationsdialog (wie EColumnsDialog in v1) - Settings: date_range, customerKtag, status, hasDocumentColumn, hasDocumentType

Priorität B — Aufträge & Notepad

2.4 New-Offers-Widget (new_offers) - Spalten: number, date, status + Action

2.5 Orders-By-Status-Widget (order_entries_by_status) - Spalten: customer, number, date, comment, status + Action

2.6 Notepad-Widgets (3 Varianten) - NotepadStatusWidget.vue — title + count - NotepadNotificationWidget.vue — notification_at + count - NotepadEntriesWidget.vue — assetNumber, manufacturer, model, date, assignee, status

Priorität C — Support-Widgets

2.7 Ticket-Statistic-Widget (ticket_statistic) - Spalten: date_range, ticket_type, count_open, count_closed

2.8 Activity-Feed-Widget (support_activity_entries)

frontend-v2/components/dashboard/widgets/ActivityFeedWidget.vue
- KEIN Table — Custom Feed-Layout - Elemente: Avatar, Titel, Beschreibung, Footer (User, Zeit, Status)

2.9 Risk-Matrix-Widget (support_risk_entries)

frontend-v2/components/dashboard/widgets/RiskMatrixWidget.vue
- KEIN Table — Custom Matrix (Impact × Probability) - Farbige Zellen mit Ticket-Counts

2.10 Risk-Priority-Widget (support_risk_priority)

frontend-v2/components/dashboard/widgets/RiskPriorityWidget.vue
- KEIN Table — Balken-Visualisierung

Priorität D — DMS & Spezial

2.11 DMS-Entries-Widget (dms_entries) - Spalten: name, (I4202, I4203 bei Inventar-Typ), version, filetype, status, type, created

2.12 Status-Variable-Widget (status_variable) - Dynamisch nach Variable-Prefix - 6 Untertypen mit jeweils eigenen Spalten

2.13 Pending-User-Widget (pending_user) - Dynamische Spalten aus Grid-Settings

2.14 emoncms-Widget (emoncms) - Feed-Einbettung


Phase 3: Widget-Settings-Dialoge

Jedes Widget braucht einen Settings-Dialog für die Konfiguration:

Widget Settings-Felder
Inventar rowsPerPage, customerKtag, conditionFilter
Kalibrierung/Monat rowsPerPage, customerKtag, numberMonth, calibrationDueType
Last Calibration rowsPerPage, dateRange, customerKtag, status, hasDocumentColumn, hasDocumentType
Assets Status rowsPerPage, customerKtag, settingDisplay (table/chart)
Ticket Status rowsPerPage, project, category, type, settingDisplay
Ticket Statistik rowsPerPage, numberMonth, project, category
Aufträge rowsPerPage, status
Notepad Einträge rowsPerPage, status, assignee
DMS rowsPerPage, status, type
Support Activities rowsPerPage, project, category, status
Advanced Filter filter_id, filter_name, color, type
Filter Statistik chart_filters, chart_type, year
Status Variable variable, filter, order
Pending User rowsPerPage, userStatus
emoncms feed_id

Phase 4: Berechtigungssystem

Jedes Widget erfordert bestimmte Berechtigungen:

Widget Berechtigung
Inventar-Widgets inventory_view
Kalibrierungs-Widgets calibration_view
Auftrags-Widgets bookings_view
Notepad-Widgets notepad_view
DMS-Widget dms_view
Support-Widgets support_view
Pending-User user_management_admin
Advanced Filter Abhängig vom Typ

→ Widget-Katalog soll nur Widgets anzeigen, für die der User Berechtigungen hat.


Phase 5: Kompatibilitätsschicht

JSON-Format-Kompatibilität

v1 und v2 teilen die gleiche dashboard-Tabelle. Widget-Konfigurationen müssen bidirektional kompatibel sein:

  • v1 title-Werte müssen in v2 korrekt gemappt werden
  • v2-eigene Widget-Typen (z.B. inventory_count) sollen als Fallback in v1 ignoriert werden
  • Settings-Format: Identisch halten (gleiche Schlüssel, gleiche Werttypen)

Mapping v1 → v2 Widget-Typen:

v1 title v2 type (vorgeschlagen)
due_inventory due_inventory (beibehalten)
overdue_inventory overdue_inventory (beibehalten)
critical_1_inventory critical_1_inventory (beibehalten)
critical_2_inventory critical_2_inventory (beibehalten)
critical_3_inventory critical_3_inventory (beibehalten)
due_calibration_per_month due_calibration_per_month (beibehalten)
last_calibration last_calibration (beibehalten)
assets_status assets_status (beibehalten)
ticket_status ticket_status (beibehalten)
ticket_statistic ticket_statistic (beibehalten)
new_offers new_offers (beibehalten)
order_entries_by_status order_entries_by_status (beibehalten)
notepad_status notepad_status (beibehalten)
notepad_notification notepad_notification (beibehalten)
notepad_entries_by_status_and_assignee notepad_entries_by_status_and_assignee (beibehalten)
dms_entries dms_entries (beibehalten)
support_activity_entries support_activity_entries (beibehalten)
support_risk_entries support_risk_entries (beibehalten)
support_risk_priority support_risk_priority (beibehalten)
advanced_filter advanced_filter (beibehalten)
filter_statistic filter_statistic (beibehalten)
status_variable status_variable (beibehalten)
pending_user pending_user (beibehalten)
emoncms emoncms (beibehalten)

Empfehlung: Alle v1-title-Werte 1:1 als v2-type übernehmen. Keine Umbenennung. So können v1 und v2 die gleiche JSON-Konfiguration lesen.


7. Zusammenfassung

Kennzahlen:

  • 23+ Widget-Typen in v1
  • 15 Grid-Tabellen, 3 Charts, 3 Custom-Layouts, 2 Info-Boxen
  • 6 Advanced-Filter-Typen mit Formel-Engine
  • 3 Spaltenquellen: Hardcoded, GridSetting, Property-basiert
  • 11 Berechtigungsgruppen steuern die Widget-Sichtbarkeit

Kernprinzipien für v2:

  1. Widget-Titel beibehalten — JSON-Kompatibilität mit v1
  2. Settings-Format beibehalten — Gleiche Schlüssel, gleiche Werte
  3. Dynamische Spalten — Grid-Settings-API nutzen statt Hardcoding
  4. Permission-gating — Widget-Katalog + Widget-Rendering absichern
  5. Generische Tabelle — Ein konfigurierbares DashboardTableWidget für alle Grid-basierten Widgets
  6. Custom-Renderer — Separate Komponenten für Feed, Matrix, Balken-Widgets