enhancement
major
minor
defect
critical
major
minor
major
#30062
Modell-Editor der React-Benutzeroberfläche: Instanz-Browser und Instanz-Import des ausgewählten Typs
Abspaltung von #30047 (Verwaltungsansichten noch nicht portiert, erfasst unter #29767). Siehe auch: #29108.
Hintergrund
Der Modell-Editor der React-Benutzeroberfläche wird von tl-dev-tools als „Administration → Modell“ bereitgestellt. Der klassische Modell-Editor verfügt zusätzlich über einen Instanz-Browser des ausgewählten Typs (instanceBrowser.layout.xml) und eine Instanz-Importfunktion (instanceUpload/dialog.layout.xml).
Funktion
Im React-Modell-Editor zeigt die Registerkarte „Instanzen“ neben dem Klassendiagramm die Instanzen der ausgewählten Klasse an – bei einer abstrakten Klasse sind dies die Instanzen aller ihrer konkreten Spezialisierungen. Im Bearbeitungsmodus werden die Instanzen in der Tabelle bearbeitet, Zeilen hinzugefügt und gelöscht. Bei einer neuen Zeile einer abstrakten Klasse wird abgefragt, welcher konkrete Typ erstellt werden soll. Die ausgewählten Instanzen werden als XML (*.objects.xml) exportiert, die Tabelle als Excel-Datei, und über ein Dialogfeld können Instanzen aus einer XML-Datei importiert werden.
Die Bearbeitung des Modells selbst (Referenzen, Generalisierungen, Diagrammbearbeitung) ist Gegenstand von #30035 und nicht Teil dieses Tickets.
Lösung
Zeilenerstellung für abstrakte Typen (`<table row-edit>`, `<composition-table>`)
Ein zu erstellender Typ steht für seine konkreten Typen (ModelAccessPolicy.concreteTypes): einen konkreten Typ für sich selbst, einen abstrakten für seine konkreten Spezialisierungen; ein abstrakter Typ ohne konkrete Spezialisierung bietet keine Zeilenerstellung an. Es werden nur die Typen angeboten, die der aktuelle Benutzer erstellen darf (in einem persistenten Formularobjekt erfolgt die Überprüfung beim Speichern). Bei mehreren Typen öffnet der Hinzufügen-Befehl über seine Schaltfläche ein Menü, in dem diese nach Bezeichnung aufgelistet sind; der ausgewählte Typ wird angelegt. Zuvor schlug die Erstellung eines abstrakten Typs (oder einer `<composition-table>` über eine Referenz eines abstrakten Typs) fehl, wenn eine Zeile hinzugefügt wurde.
- Ein „add“-Befehl für beide Tabellen (RowSetTableControl#getAddRowCommand()): Das rahmenlose Zeilenbearbeitungselement <table> stellt ihn im Befehlsbereich des Formulars bereit, die <composition-table> zeigt ihn in ihrer Symbolleiste an. Er ist nur sichtbar, solange ein Typ angeboten wird.
- RowSetEditSession#createTypes() / #addRow(TLClass, Consumer).
- CommandTrigger (tl-layout-react): Ein „ReactButtonControl“ gibt seine ID für die Dauer des Klicks bekannt, sodass ein Befehl, der mit einem Folge-Menü antwortet, diese an der angeklickten Schaltfläche platziert.
Aus den Eingaben (`<table>`, `<tree-table>`) berechnete Zeilen- und Erstellungs-Typen
`types-expr` und `create-type-expr` sind TL-Script-Ausdrücke über die Eingaben der Tabelle, die berechneten Entsprechungen von `types` und `create-type` mit derselben Bedeutung; jedes Paar schließt das andere aus (Konfigurationsfehler). Sie werden beim Aufbau des Steuerelements ausgewertet (innerhalb eines `<switch rebuild="true"> ` einmal pro Eingabewert). Der Personalisierungsschlüssel der Tabelle wird aus den berechneten Typen gebildet (auch zusammen mit einem konfigurierten Personalisierungsschlüssel), sodass die Spaltenauswahl pro Typ beibehalten wird.
Download exportierter Objekte
- <download/> akzeptiert jede Datei (BinaryDataSource), sodass das Ergebnis von `instanceExport(...)` heruntergeladen werden kann; zuvor wurde die Meldung „... ist keine Datei“ ausgegeben.
- Der Standardname eines Instanzexports verwendet das 24-Stunden-Format (yyyy-MM-dd_HH-mm-ss).
Modell-Editor (`tl-dev-tools`)
- Der mittlere Bereich ist eine Registerleiste „Diagramm / Instanzen“.
- Instanzen: Tabelle zur Zeilenbearbeitung über alle($type) mit types-expr / create-type-expr = der ausgewählten Klasse; das Löschen führt beim Speichern zum Entfernen der Instanzen; Befehle „Instanzen exportieren“ (XML der ausgewählten Zeilen, instanceExport), „Excel-Export“, „Instanzen importieren“.
- Importdialog (admin/model/import-instances.view.xml): Feld für XML-Datei, instanceImport($file, false, $type) in einer Transaktion; die Tabelle liest anschließend ihre Zeilen erneut ein.
- Der XML-Export berücksichtigt Kompositionsreferenzen; Objekte in anderen Referenzen benötigen eine <instance-resolver> -Annotation an ihrem Typ (andernfalls wird der Export mit einer Meldung abgelehnt, in der die Referenz genannt wird), wie im klassischen Instanz-Browser.
Überprüfung
tl-demo-react (/view/, root / root1234), Administration → Modell, Typ auswählen, Registerkarte „Instanzen“. Abstrakte Klasse mit Instanzen: Modul demo.charts, Klasse Transaktion. Abstrakten Typ in einer Kompositionstabelle anlegen: Projekte → P2 → Leistungen, Bereich „Leistungen bearbeiten“.