Zum Inhalt

V1-Grid-Buttons — Vollständiger Katalog und V2-Übertragung

Stand: Code-Audit vom 2026-07-12 gegen httpdocs/ (V1, Yii 1.1) und frontend-v2/ + laravel/ (V2). Zweck: Portierungsgrundlage — jeder Button der V1-Hauptgrids mit Funktion, RBAC-Operation und V2-Status.

Die V1-Grids sind die funktionsreichste Stelle der Anwendung: Toolbar-Buttons, Selektions-Buttons (wirken auf per Checkbox markierte Zeilen) und Zeilen-Buttons. Jeder Button ist an eine authitem-Operation gebunden. Dieser Katalog zählt sie vollständig auf und definiert die harmonisierte V2-Umsetzung.

1. Gemeinsame V1-Infrastruktur

Jedes Grid besteht aus drei Dateien (admin_v2.php = Toolbar + Modals + JS, _admin_v2.php = Grid-Widget + Selektions-Buttons, _columns_v2.php = Spalten + Zeilen-Buttons) und nutzt zentrale Helfer:

Baustein Datei Funktion
GridViewHelper::renderGrid() protected/components/GridViewHelper.php:63 Rendert das Grid-Widget mit Defaults
GridViewHelper::buildBulkActions() GridViewHelper.php:129 Selektions-Leiste + Checkbox-Spalte
GridViewHelper::buildMultiDeleteButton() GridViewHelper.php:152 Standard „Delete Selected"
GridColumnsHelper::build*Button() protected/components/GridColumnsHelper.php:113–258 Zeilen-Button-Fabriken (View/Update/Delete/Clone/Report/DCC)
GridColumnsHelper::renderColumnsDialog() GridColumnsHelper.php:55 Spalten-Konfiguration + Layout-Export
KTbBulkActions protected/components/KTbBulkActions.php Selektions-Buttons, „Delete selected/Delete all"-Split
KCCheckBoxColumn protected/components/KCCheckBoxColumn.php Checkbox-Spalte (.select-on-check)

Dynamische Report-Buttons (Master- und Detail-Kontext, inkl. DCC-Varianten) kommen aus report_setting über AdminReportSetting::getReportMasterButtons() / getReportDetailButtons() mit Rollen-/Gruppenfilter — kein Button ist hart codiert. In V2 ist das bereits als report-context-Prop auf TableMaster umgesetzt.

2. Button-Katalog je Grid

Legende Typ: T = Toolbar (ohne Selektion), S = Selektions-Button (markierte Zeilen), Z = Zeilen-Button.

2.1 Inventar (frontendInventory, 25 Buttons)

# Button Typ Funktion RBAC V2-Status
1 Create Inventory T Neues Inventar inventory_edit ✅ (jetzt permission-gated)
2 Master-Reports (dynamisch) T/S Report für Auswahl/alle report_setting-Rollen report-context
3 Export All T Export gesamter Bestand inventory_view ✅ ExportDialog/Grid-Export
4 Export Filtered T Export gefilterte Menge inventory_view
5 Hierarchie aktualisieren T Hierarchie-View neu aufbauen inventory_* ➖ entfällt (V2 berechnet live)
6 Columns T Spalten-Konfiguration ✅ Spalten-Chooser + Vorlagen
7 Filter Options T Filter-Sidebar ✅ Erweiterte Filter
8 Change User / Add to Location S Neue Location je markiertem Inventar inventory_rental_edit originalgetreu wiederhergestellt (siehe §4)
9 Add to Notepad S Notiz je markiertem Inventar notepad_edit 🔴 offen (Folge-PR)
10 Create Order S Auftrag aus Auswahl bookings_edit 🔴 offen (Folge-PR)
11 Download Documents S Bulk-ZIP der Dokumente document_download 🔴 offen (Folge-PR, s. PR #2780)
12 METTEAM Sync (selected/all) S MSSQL-Sync configure_METTEAM_synchronisation 🔴 offen (Integrations-Phase)
13 Delete Selected / Delete all S Massenlöschung inventory_delete ✅ harmonisiert (useGridActions); „Delete all über Filter" offen
14–24 Zeile: Details, View, QR-View, Update, Clone, Add Child, Show Masters/Childs/Hierarchy, Detail-Reports, Delete Z je Zeile inventory_view/edit/delete teilweise (View/Trace/Reports/Dateien ✅; Clone/Hierarchie-Buttons offen)
25 Expander (Show Details) Z Detail-Zeile aufklappen inventory_view ➖ (V2: Doppelklick → Detailseite)

2.2 Kalibrierung (frontendCalibration, 13 Buttons)

Button Typ RBAC V2-Status
New Calibration T calibration_edit ✅ (über Inventar-Detail)
Master-Reports, Export All/Filtered, Columns, Filter T calibration_view
Delete Selected S calibration_delete ✅ harmonisiert
Release Documents (je DMS-Spalte) S dms_edit 🟡 Backend vorhanden (documents/bulk-approve), Grid-UI offen
Zeile: View, Update, Clone, Detail-Reports, DCC-XML-Validierung, Delete Z calibration_view/edit/delete View/Reports/Dateien ✅; Clone + DCC-Validierung im Grid offen

2.3 Standorte/Leihe (frontendRental, 10 Buttons)

Button Typ RBAC V2-Status
Create Location T location_edit ✅ (jetzt permission-gated)
Master-Reports, Export, Columns, Filter T location_view
Delete Selected / Delete all S location_delete neu: POST /locations/bulk-delete (löscht je Modell → Current-Record-Promote bleibt korrekt)
Zeile: View, Update, Detail-Reports, Delete Z location_view/edit/delete

2.4 Inventar→Location-Subgrid (4 Buttons)

Create Rental (inventory_rental_edit), Zeile View/Update/Delete (inventory_rental_view/edit/delete) — ✅ in V2 als Standorte-Tab der Inventar-Detailseite (Ausleihen, Rückgabe, Historie; PR #2782).

2.5 Kunden (frontendCustomer, 8 Buttons)

Button Typ RBAC V2-Status
Create Customer T customers_edit ✅ (jetzt permission-gated)
Export All/Filtered, Columns, Filter T customers_view
(keine Selektions-Buttons in V1 — Checkbox-Spalte ohne Aktion) V2 hat zusätzlich Bulk-Löschen/-Export (Erweiterung)
Zeile: Details, Inventories-Link (Badge), View, Update, Delete Z customers_view/edit/delete, Link inventory_* Details/View ✅; Inventories-Badge offen

2.6 Kontakte (frontendContact, 6 Buttons)

Button Typ RBAC V2-Status
Create, Export, Columns T contact_edit ✅ (jetzt permission-gated)
Delete Selected S contact_delete neu: POST /contacts/bulk-delete; Einzel-Delete jetzt ebenfalls unter contact_delete (V1-Parität, vorher contact_edit)
Zeile: View, Update (Modal), Clone, Delete Z View/Clone frei, contact_edit, contact_delete ✅ (Delete-Button jetzt gated); Clone: Backend duplicate vorhanden, Grid-Button offen

2.7 Aufträge/Buchungen (frontendBooking, 10 Buttons)

Create Order (bookings_edit) ✅ · Master-Reports/Export/Columns/Filter ✅ · Delete Selected (bookings_delete) ✅ harmonisiert (jetzt Bulk-Endpoint statt Einzel-DELETE-Schleife) · Zeile: Details/View/Update/Detail-Reports (mit „Choose Part"-Modal)/Delete — Basis ✅, „Choose Part" offen.

2.8 Artikel (frontendArticle, 5 Buttons)

Create (article_edit), Columns, Delete Selected (article_delete), Zeile View/Update/Delete (article_view/edit/delete) — 🔴 Artikel-Grid existiert in V2 noch nicht (Fachmodul offen).

2.9 Reparaturen (frontendRepair, 9 Buttons)

Create (repair_edit) ✅ · Export/Columns/Filter ✅ · Delete Selected (repair_delete) ✅ neu: POST /repairs/bulk-delete · Zeile View/Update/Detail-Reports/Delete ✅ (Reports/Dateien über Kontext-Props).

2.10 Preise (frontendPrice, 7 Buttons)

Create (price_create) · Columns/Filter · Delete Selected (price_delete) ✅ harmonisiert · Zeile View/Update/Clone (price_create)/Delete — Clone-Button offen (Backend duplicate vorhanden).

2.11 Gerätetypen (frontendType, 8 Buttons)

New Type (types_create) · Make Types ✅ als „Aus Bestand ableiten" umgesetzt — Dialog mit Vorschau (POST /device-types/derive), eigene Operation types_derive statt types_create, im Standard keiner Rolle zugewiesen · Columns/Filter · Delete Selected (types_delete) ✅ harmonisiert (jetzt Bulk-Endpoint) · Zeile Inventories-Badge/View/Update/Delete — Basis ✅.

2.12 Notizen (frontendNotepad, 9 Buttons)

Create (notepad_edit) · Export · Columns/Filter · Delete Selected (notepad_delete) ✅ harmonisiert · Zeile Add/View/View-Inventory/Update/Delete — Basis ✅; „Send E-Mail"-Checkbox im Bearbeiten-Modal offen.

Hinweis: frontendWiki und frontendTicket existieren in V1 nicht als Grids. Tickets/Projekte sind V2-Neuentwicklungen (dort ist Button-Permission-Gating bereits umgesetzt).

Summe: ~114 Buttons über 12 Grids (25 Inventar, 13 Kalibrierung, 10 Rental, 4 Subgrid, 8 Kunden, 6 Kontakte, 10 Buchung, 5 Artikel, 9 Reparatur, 7 Preise, 8 Typen, 9 Notizen).

3. Selektionsmechanik (V1 → V2)

V1: KCCheckBoxColumn als Spalte 0 (.select-on-check), Auslesen per getCheckedRowsIds(). Selektions-Buttons prüfen „keine Auswahl → Alert". Split-Dropdown „Delete all" verarbeitet den kompletten gefilterten Bestand mit Progressbar. Ein separates „aktive Zeile"-Konzept gibt es nicht — es ist ein reines Multi-Select-Checkbox-Modell; alle Selektions-Buttons wirken auf alle markierten Zeilen.

V2: PrimeVue-Selection (v-model:selection) mit Checkbox-Spalte, sobald Bulk-Actions vorhanden sind; Bulk-Buttons erscheinen bei Selektion in der Toolbar. Seit diesem Umbau werden Bulk-Actions und Extra-Spalten über das permission-Feld gegen die Session-Operations gefiltert (TableMaster.vue, visibleBulkActions/visibleExtraColumns) — exakt die V1-Semantik „Button nur mit Operation sichtbar". „Delete all über gefilterten Bestand" ist noch offen.

4. Deep-Dive: „Add to Location" (V1 „Change User")

Der wichtigste Selektions-Button des Inventar-Grids — exakt rekonstruierter V1-Flow (frontendInventory/_admin_v2.php:15, FrontendRentalController::actionAddToLocation, FrontendRentalController.php:1716):

  1. Inventare per Grid-Checkbox markieren → Button „Change User" (gated: inventory_rental_edit).
  2. JS POSTet die markierten MTAGs[] an addToLocation → Server rendert das Location-Formular (frontendInventory/location/_form.php) ins Modal. Das „Zusatzmodul zur Elementwahl" ist kein Auswahl-Grid/Picker — die Elementwahl ist strikt die Grid-Checkbox-Selektion; das Modal enthält ausschließlich das Formular aus field_configuration (getEditFields(true)). Die Auswahl ist im Modal nicht änderbar.
  3. Checkbox „Copy values from previous location entry" (_form.php:79): sperrt alle allow_copy=1-Felder außer LTAG, MTAG, L2809, L2810, L2815, status — gesperrte Felder werden nicht übertragen und kommen beim Speichern je Gerät aus dessen jüngstem vorherigen Eintrag.
  4. Speichern (:1718–1809): ein neuer Location-Datensatz je Inventar in einer Transaktion — neue LTAG, L2815=1 (wird aktueller Standort), customer_KTAG vom Inventar, Felddefaults via InventoryHelper::setDefaultValue(). Kein E-Mail-Versand in diesem Pfad.

V2-Umsetzung (dieser Umbau): Bulk-Action „Standort/Leihe" im Inventar-Grid (gated location_edit, da der Endpoint POST /locations/bulk-assign darunter läuft) öffnet einen Dialog mit dem registrygetriebenen Location-Formular (DynamicForm resource="locations", wie die Location-Create-Seite). inventory_id/is_active/id sind ausgeblendet (kommen aus Selektion bzw. sind fix 1/generiert). Die Checkbox „Werte vom letzten Standort-Eintrag übernehmen" sperrt die allow_copy-Felder (ausgenommen die V1-Schutzliste id, inventory_id, location_date, location_time, is_active, status); gesperrte und leere Felder werden — wie in V1 — nicht übertragen, der Server füllt sie je Gerät aus dessen letztem Eintrag bzw. den Felddefaults. Zusätzlich (V2-Erweiterung aus PR #2782): optionale Verfügbarkeitsprüfung, belegte Geräte werden übersprungen und gemeldet.

5. Harmonisierte V2-Architektur

Alle Grid-Buttons folgen jetzt einem einheitlichen Muster („Mastergrid-Funktionen", opt-in pro Seite):

Baustein Zweck V1-Entsprechung
TmBulkAction.permission / TmExtraColumn.permission RBAC-Gating je Button/Spalte im TableMaster visible-Callbacks + accessRules
useGridActions Standard-Selektions-Buttons (Löschen via bulk-delete-Endpoint, Export) einmal zentral statt 10× dupliziert buildMultiDeleteButton
report-context + useGridReports Master-/Detail-/Label-/DCC-Reports datengetrieben getReportMasterButtons/getReportDetailButtons
file-context + useGridFiles Dateien je Zeile (DMS-Kategorien) Dateimanagement-Spalten
Seiten-Toolbar mit auth.hasPermission() Create-/Toolbar-Buttons gated accessRules der Create-Actions

Neue Backend-Endpoints (V1-Parität): POST /locations/bulk-delete (location_delete, löscht je Modell → Promote-Events), POST /repairs/bulk-delete (repair_delete), POST /contacts/bulk-delete + Einzel-Delete unter contact_delete (vorher contact_edit).

Behobene Inkonsistenzen: Booking/Repair/Price/Device-Type/Location/Notepad löschten bisher per Einzel-DELETE-Schleife (teils trotz vorhandenem Bulk-Endpoint) — jetzt einheitlich über bulk-delete; Buttons waren komplett ungeschützt gerendert (nur Backend-403) — jetzt permission-gated.

6. Offene Folge-Bausteine (priorisiert)

  1. Add to Notepad (Selektion → Notiz je Inventar, notepad_edit) — kleiner Baustein, Notepad-Endpoint vorhanden.
  2. Release Documents im Kalibrierungs-Grid (dms_edit) — Backend documents/bulk-approve existiert, Grid-Anbindung fehlt.
  3. Create Order aus Auswahl (bookings_edit) — Buchung mit vorbelegten Positionen.
  4. Bulk-Download (ZIP) (document_download) — bereits als Folge zu PR #2780 notiert.
  5. Massen-Statuswechsel aus dem Grid — Backend POST /inventories/status-batch existiert ohne UI (in V1 kein Grid-Button, aber sinnvolle Ergänzung).
  6. Clone-/Duplizieren-Zeilenbuttonsduplicate-Endpoints existieren für inventories/device-types/calibrations/prices/bookings/contacts, Grid-Buttons fehlen.
  7. „Delete all über gefilterten Bestand" mit Fortschritt (V1: Inventory/Rental/Type).
  8. ~~Make Types~~ ✅ erledigt (siehe 2.11) · METTEAM-Sync-Buttons (Integrations-Phase), Artikel-Grid (Fachmodul).