enhancement
major
minor
major
minor
major
#29992
React-Modelleditor: Annotation "Eingabekontrolle" bietet keine Umsetzung zur Auswahl an
Kontext
Im Modelleditor der React-Oberfläche (Administration → Modell, Attribut bearbeiten → "+ Anpassungen") kann einem Attribut die Annotation "Eingabekontrolle" (TLInputControl) gegeben werden, die festlegt, mit welchem Control das Attribut bearbeitet wird.
Fehler
Das Auswahlfeld "Umsetzung" der Annotation zeigt "Nichts gefunden". TLInputControl#getImpl bietet die AllInAppImplementations von ReactFieldControlProvider an, aber keine Implementierung trägt @InApp. Die Annotation lässt sich daher im Modelleditor nicht sinnvoll setzen.
Erwartet
Die im Modelleditor wählbaren Implementierungen von ReactFieldControlProvider sind mit @InApp markiert und erscheinen in der Auswahl.
Test
React-Demo tl-demo-react, Administration → Modell → beliebiges Attribut → Bearbeiten → "+ Anpassungen" → "Eingabekontrolle": "Umsetzung" bietet die Field-Control-Provider an.
Lösung
- Die für Modellattribute verwendbaren Field-Control-Provider sind mit @InApp markiert und tragen sprechende Namen: Texteingabe, Passworteingabe, Zahleneingabe, Ja/Nein-Eingabe, Datumsauswahl, Auswahl, Datei-Upload, Symbolauswahl, Farbauswahl, Mehrsprachige Texteingabe, Quellcode-Editor, Texteditor mit Formatierungsfunktionen, Mehrsprachiger Texteditor mit Formatierungsfunktionen, TL-Script-Editor (und in der React-Demo die Temperatureingabe). Provider, die nur Konfigurationswerte oder Annotationen bearbeiten, werden nicht angeboten.
- "Umsetzung" bietet nur die Provider an, die zum Werttyp des annotierten Attributs passen - bzw. zum annotierten Typ selbst, wenn die Eingabekontrolle an einem Typ gesetzt wird. Jeder Provider deklariert über @TargetType die Typarten (TLTypeKind) und ggf. die konkreten Typen, die er bearbeitet (z.B. Farbauswahl nur für tl.util:Color, TL-Script-Editor nur für tl.model.search:Expr); ein Provider ohne @TargetType (die Auswahl) wird immer angeboten. Beispiel: Datum → Datumsauswahl, Auswahl; Zeichenkette → Texteingabe, Passworteingabe, Quellcode-Editor, Auswahl.
- Provider für Zeichenketten werden auch für spezielle Zeichenketten-Typen (z.B. HTML, mehrsprachiger Text) angeboten, da diese ebenfalls die Typart STRING haben.
- Speichern übernimmt offene Listeneinträge: Ein neu hinzugefügter Eintrag einer Liste (z.B. eine neue Annotation unter "+ Anpassungen"), der noch nicht mit ✓ bestätigt wurde, ging beim Speichern bisher kommentarlos verloren. Speichern (ebenso Übernehmen im Konfigurationseditor und OK im Bearbeitungsdialog einer Tabellenzelle) bestätigt solche Einträge jetzt zuerst und speichert sie mit. Kann ein Eintrag nicht übernommen werden (z.B. weil eine Annotation dieses Typs schon existiert), wird das Speichern mit einer Meldung abgelehnt, das Formular bleibt im Bearbeitungsmodus und der Grund steht am Eintrag. Speichern ist nicht mehr gesperrt, nur weil ein Eintrag noch offen ist.
- Ein neuer Eintrag in einer nach Typ geschlüsselten Liste ("+ Anpassungen") wird mit einem Typ vorbelegt, der in der Liste noch nicht vorkommt. Die Meldung über einen bereits vorhandenen Eintrag nennt den Typ mit seinem Namen (z.B. "Eingabekontrolle (TLInputControl)") statt des Java-Interfaces, und sie erscheint an der Typauswahl des Eintrags.
- Neues Attribut mit einer Klasse oder Aufzählung als Typ: Der Dialog "Neues Attribut" scheiterte mit "Database operation failed", wenn als Typ eine Klasse (z.B. Adresse) gewählt wurde. Für Klassen und Aufzählungen wird jetzt eine Referenz angelegt, für primitive Typen weiterhin eine Eigenschaft. Die Typauswahl bietet nur noch primitive Typen, Klassen und Aufzählungen aus Modulen an (keine internen Assoziationen). Referenzen auf Typen anderer Module werden im Klassendiagramm als Attributzeile der Klasse angezeigt und sind damit auswählbar.
- Kardinalität von Referenzen: "Verpflichtend" und "Mehrfach" einer Referenz lassen sich im Modelleditor jetzt ändern (eigenes Formular "Kardinalität" in der Detailansicht einer Referenz).
- Klassendiagramm: Nach dem Anlegen eines Attributs oder einem Neuladen der Seite liefen die Auswahl im Diagramm auf Server und Browser auseinander: Im Browser trat ein IndexOutOfBoundsException beim Anwenden der Auswahländerung auf, nach einem Neuladen wurden mehrere Elemente markiert und die Detailansicht folgte der Auswahl nicht mehr (ClassCastException: LinkedHashSet cannot be cast to TLObject). Die Auswahl bleibt jetzt synchron.
Technische Hinweise
- Neue wiederverwendbare Optionsfunktion TargetTypeInAppImplementations (com.top_logic): die @InApp-Implementierungen des Property-Typs, gefiltert mit TargetTypeFilter nach Typ und Typart des annotierten Elements. Die Annotation "Format" nutzt sie ebenfalls (bisher eine eigene, nur nach Typart filternde Optionsfunktion); dadurch werden dort jetzt auch die Typnamen in @TargetType geprüft, und ohne bekannte Typart werden die uneingeschränkten Implementierungen statt keiner angeboten.
- Neues Interface ValueTypeModel (com.top_logic.element) mit resolved-type/`type-kind`, implementiert von den Edit-Modellen für Attribute, Klassen/Datentypen und Aufzählungen. Damit erreicht eine Annotation über annotated den Werttyp, egal ob sie an einem Attribut oder einem Typ hängt.
- Der React-Annotationseditor setzte den Kontexttyp des Attributs nicht, sodass dessen Werttyp nie aufgelöst wurde; behoben.
- Konfigurationseditor (com.top_logic.layout.configedit): Ein neu hinzugefügter, noch nicht bestätigter Listeneintrag hatte keinen Container, sodass Optionsfunktionen, abgeleitete Werte und Constraints, die nach außen navigieren, bis zur Bestätigung nichts fanden. Ein solcher Eintrag erhält jetzt vorab den Besitzer der Liste als Container.
- Offene Einträge beim Speichern: FormParticipant#commitPendingInput() wird von FormControl vor der Änderungsprüfung von Speichern/Übernehmen/`store-form-state` für alle Teilnehmer aufgerufen; AttributeFieldControl reicht es an ein Eingabe-Control weiter, das PendingInput (com.top_logic.layout.react) implementiert. Die Konfigurationseditoren bestätigen dabei über ConfigFieldIndex#confirmPending() alle offenen Einträge (innere vor äußeren) auf demselben Weg wie ✓. ConfigFormControl und ReactCompactFieldControl verwenden denselben Mechanismus; die bisherige Ablehnung "Eintrag bestätigen oder verwerfen" entfällt.
- Flussdiagramm (com.top_logic.react.flow.*): Diagramm-Patches werden über ReactControl#sendTransientState gesendet und nicht mehr im Zustand gespeichert (bisher wurde jeder vollständige Zustand, z.B. beim Wiederverbinden, mit dem letzten Patch erneut angewendet). Element-IDs werden pro Control fortlaufend vergeben, sodass ein ersetztes Diagramm keine IDs wiederverwendet; Updates für ein ersetztes Diagramm werden verworfen. Der Client tauscht ein neues Diagramm in Patch-Reihenfolge selbst aus. Die gespeicherte Serialisierung wird nach jeder Änderung aktualisiert, sodass ein vollständiger Zustand immer das aktuelle Diagramm enthält.
- Neue Hilfsmethoden TLModelUtil#addForwardReference / addForwardReferenceEnd (com.top_logic) legen eine einfache Vorwärtsreferenz mit privater Assoziation an, wie sie eine <reference> im Modell-XML erzeugt. ModelResolver, ModelEditAction (tl-dev-tools) und das KI-Werkzeug ModelEditorTool nutzen sie; vom KI-Werkzeug angelegte Referenzen haben damit dieselben Endennamen (self und der Referenzname) wie aus Modelldateien geladene.