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(beicalibration_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(viaFrontendGridSetting::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(beiuser_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:¶
frontend_grid_settingTabelle speichert pro User + Grid: Komma-getrennte Spaltennamenadmin_grid_setting_templateTabelle definiert System-Templates als Default- Fallback-Kette: User-Setting → User-Default-Template → System-Template
- 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 * * * *→saveAsStatisticCommand - Speichert monatlich oder täglich den COUNT für jeden Filter
- Chart-Daten aus
filter_statisticTabelle
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-filtersmit 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:
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:
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:
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_*)
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)
settingDisplay)
- Dynamische Spalten aus Grid-Settings
- Chart: Doughnut/Pie mit PrimeVue Charts
2.3 Last-Calibration-Widget (last_calibration)
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)
2.9 Risk-Matrix-Widget (support_risk_entries)
2.10 Risk-Priority-Widget (support_risk_priority)
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:¶
- Widget-Titel beibehalten — JSON-Kompatibilität mit v1
- Settings-Format beibehalten — Gleiche Schlüssel, gleiche Werte
- Dynamische Spalten — Grid-Settings-API nutzen statt Hardcoding
- Permission-gating — Widget-Katalog + Widget-Rendering absichern
- Generische Tabelle — Ein konfigurierbares
DashboardTableWidgetfür alle Grid-basierten Widgets - Custom-Renderer — Separate Komponenten für Feed, Matrix, Balken-Widgets