V1-Grid-Buttons — Vollständiger Katalog und V2-Übertragung¶
Stand: Code-Audit vom 2026-07-12 gegen
httpdocs/(V1, Yii 1.1) undfrontend-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:
frontendWikiundfrontendTicketexistieren 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):
- Inventare per Grid-Checkbox markieren → Button „Change User" (gated:
inventory_rental_edit). - JS POSTet die markierten
MTAGs[]anaddToLocation→ 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 ausfield_configuration(getEditFields(true)). Die Auswahl ist im Modal nicht änderbar. - Checkbox „Copy values from previous location entry" (
_form.php:79): sperrt alleallow_copy=1-Felder außerLTAG, MTAG, L2809, L2810, L2815, status— gesperrte Felder werden nicht übertragen und kommen beim Speichern je Gerät aus dessen jüngstem vorherigen Eintrag. - Speichern (
:1718–1809): ein neuer Location-Datensatz je Inventar in einer Transaktion — neue LTAG,L2815=1(wird aktueller Standort),customer_KTAGvom Inventar, Felddefaults viaInventoryHelper::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)¶
- Add to Notepad (Selektion → Notiz je Inventar,
notepad_edit) — kleiner Baustein, Notepad-Endpoint vorhanden. - Release Documents im Kalibrierungs-Grid (
dms_edit) — Backenddocuments/bulk-approveexistiert, Grid-Anbindung fehlt. - Create Order aus Auswahl (
bookings_edit) — Buchung mit vorbelegten Positionen. - Bulk-Download (ZIP) (
document_download) — bereits als Folge zu PR #2780 notiert. - Massen-Statuswechsel aus dem Grid — Backend
POST /inventories/status-batchexistiert ohne UI (in V1 kein Grid-Button, aber sinnvolle Ergänzung). - Clone-/Duplizieren-Zeilenbuttons —
duplicate-Endpoints existieren für inventories/device-types/calibrations/prices/bookings/contacts, Grid-Buttons fehlen. - „Delete all über gefilterten Bestand" mit Fortschritt (V1: Inventory/Rental/Type).
- ~~Make Types~~ ✅ erledigt (siehe 2.11) · METTEAM-Sync-Buttons (Integrations-Phase), Artikel-Grid (Fachmodul).