TopLogic - the automated application engine
  • Releases
  • Dokumentation
  • Github
  • Discord
  1. Home
  2. Releases
  3. TL_8.0.0-alpha13
  4. #29993

8.0.0-alpha13
TopLogic Release

2026-11-13

enhancement

major
#29993
Konfiguration: Jede konfigurierte Funktion wahlweise in Java oder TL-Script implementierbar, mit derselben Konfigurationssyntax (auch im React-Konfigurationseditor)
#30000
Design-System-UI-Durchlauf, Teil 1: ein Auswahlformular; „surface-interactive-selected“ wird zu „surface-interactive-strong“
#30006
Engine-Erweiterungen für die Steueranwendung: beschreibbarer Geheimnisspeicher in der Datenbank, Kontextpfad der Anwendung im Entwicklungsmodus (tl.contextPath) und Instanzsuche nach Attributwert
#30025
React-Oberfläche: Befehle und Einheiten ausblenden, für die der angemeldete Benutzer auf keinem Objekt die nötige Rolle hat
#30031
Datenbank erzwingt keine Eindeutigkeit der Werte von Referenzen ohne Duplikate: eindeutiger Index auf den Link-Tabellen, eigene Link-Tabellen für Bags
#30041
Self-Service-Konten: Einladungen verfallen und ihre Annahme wird protokolliert; Einladungen können in der React-Benutzeroberfläche angenommen und verwaltet werden; lokalisierte E-Mail-Vorlagen
#30045
Ebenen-Slots anzeigen: Bericht über „ <slot-content> “, das „no <slot> “ erreicht, leeres Fallback von „ <slot> “, Slot-Positionen in geteilten Fenstern und in der Seitenleiste
#30053
Agent läuft: Begrenzt die Anzahl paralleler Tool-Aufrufe (AgentLoop.TOOL_WORKERS) und teilt einem Benutzer mit, dessen Chat-Nachricht auf einen freien Worker wartet
#30054
Screenshots von Agenten gehören zu ihrem Chat: Sie werden zusammen mit diesem gelöscht und im Chat als Miniaturansichten angezeigt.
#30057
Verwaltung der React-Benutzeroberfläche: Scheduler (Aufgabenliste, Jetzt ausführen, Stoppen, Aktivieren/Deaktivieren, Cluster-Sperre, Ausführungsverlauf) mit einem einheitlichen Schalter zum Aktivieren/Deaktivieren pro Aufgabe
#30058
Verwaltung der React-Benutzeroberfläche: Speicherverlaufsdiagramm (Speicherauslastung im Zeitverlauf einschließlich Garbage Collection) und die übrigen Überwachungsansichten der klassischen Benutzeroberfläche
#30059
Verwaltung der React-Benutzeroberfläche: Wartungsfunktionen der klassischen Wartungsseiten (Datenbank-Export/Import/Verlaufskomprimierung, SQL-Konsole, Neuladen, Suchindex, Sicherheitsspeicher, Verschlüsselung)
#30061
React UI: Letzte Änderungen des Benutzers mit Rückgängigmachen eines Commits (Benutzermenü)
#30062
Modell-Editor der React-Benutzeroberfläche: Instanz-Browser und Instanz-Import des ausgewählten Typs
#30063
Verwaltung der React-Benutzeroberfläche: Personen (Kontakte mit optionaler Anmeldung) in einem Formular
#30064
Verwaltung der React-Benutzeroberfläche: Anmeldemeldungen (Meldungen, die bei der Anmeldung angezeigt werden, mit Angabe ihrer Gültigkeitsdauer)
#30065
React-Oberfläche: Workflow-Administration mit BPMN-Editor, Schrittansichten aus dem View-Designer und Aufgabenbearbeitung (BPE)
#30066
React-Administration: Wirksame Rechte eines Kontos auf einem Objekt anzeigen und erklären (Rolleninspektor)
#30074
React-Oberfläche: Anmeldung mit Passkeys (WebAuthn) - passwortlos oder als zweiter Faktor neben TOTP, Verwaltung der eigenen Passkeys in den Einstellungen
#30075
Protokollansicht (React-UI): Details eines Eintrags (Stacktrace) in einem Dialog lesbar anzeigen
#30076
React-Oberfläche: Passwortänderung mit Bestätigungsmeldung und Prüfung vor der Identitätsabfrage; Schutz gegen Durchprobieren von Passwörtern und Einmalcodes
#30081
TL Views: Authenticator-App wechseln (neues TOTP-Geheimnis), Zwei-Faktor-Authentifizierung durch Administrator zurücksetzen
#30086
XML-Import: Die Datei „ <update> “ unter <unless-known> muss die Struktur der untergeordneten Elemente, die sie aktualisiert, wiedergeben.
#30088
Ebene anzeigen: Dokumentieren Sie, wie eine „ChannelSource“ einen Monitor am Laufen hält, während dessen Ansicht ausgeblendet ist, und ihn mit dem Fenster beendet.
#30095
OpenAPI-Client: Parameterwert aus einer Secret-Quelle
#30096
Rechtesystem: Konfigurierbaren Group-Mapper des ElementAccessManager entfernen
#30097
JavaScript-Bibliotheken (umljs, ace, require.js, bpmn-js) im Maven-Build erzeugen statt einzuchecken, bpmn-js auf 18 aktualisieren
#30098
Designsystem als Engine-Modul: Erstellung durch Maven anstelle einer eingecheckten Kopie mit Seals
#30104
Nächtliche Vorschau-Versionen der Engine mit fester Maven-Version und Änderungsliste statt eines wandernden SNAPSHOT
#30108
pac4j-Anmeldung: Die Konto-Zuordnung erhält die ganze Identität des Identity-Providers (Subject, Claims) statt nur eines Login-Namens
#30116
CommonMark: Tabellen (GFM) als HTML-Tabellen darstellen
#30117
Refetch-Timeout nennt nicht den Thread, der die Commit-/Refetch-Sperre hält
#30120
Ebene anzeigen: Optionen eines Zeichenfolgenattributs dürfen keine Anzeigebezeichnungen enthalten
#30122
TLDoclet-Ausnahmen in ext/javadoc/javadoc-ignores abbauen
#30126
tl-chat: Chat-Aktionen laufen als React-Commands des Fensters statt über einen eigenen ChatServlet; der Proxy-Workaround des Chats entfällt zugunsten des Pollings der Engine
#30131
Ebene anzeigen: Den Fallback von „AttributeWithFallbackStorage“ als Platzhalter für ein Formularfeld anzeigen
#30132
Ebene anzeigen: Die Wert-Listener des Modells (<value-listeners>) reagieren über einen UI-unabhängigen Listener-Vertrag auf Feldänderungen im React-Formular.
#30148
RecollateStringColumnsProcessor: ANALYZE nach dem Umstellen der Collation ausführen (PostgreSQL)
#30149
Einem Chat-Agenten soll es ermöglicht werden, Seitenbefehle auszuführen, die auf der Chat-Seite zulässig sind, z. B. einen Dialog zu öffnen
#30150
Stellen Sie einen Anbieter mit aufgezeichneten Musterantworten für die Agentenprüfungen der Bewerbungen bereit
#30151
React-View-Schicht: Befehle ohne HandlerResult - View-Befehle melden Fehler als Exception, React-Befehlshandler liefern ihre Antwort als msgbuf-Nachricht
#30157
React-Oberfläche: Bilder im HTML-Editor einfügen per Strg+V und Drag&Drop, Größe mit Anfassern ändern, nie breiter als der Inhalt
#30158
TL-Chat: Einem Chat-Agenten ermöglichen, die Eingabe eines von ihm ausgeführten Seitenbefehls weiterzugeben
#30160
Albert in eine Anwendung integrieren: fertige React-Chat-Seite, Anleitung und Standardwerte für Archetypen
#30163
SQLFactory: Spaltenänderungen (modifyColumnName/Type/Mandatory) nur mit vollständiger Spaltendefinition erzeugen
#30167
Datenbank-Defaults für Spalten entfernen: Pflichtspalten per „anlegen, füllen, Pflicht setzen“ hinzufügen
#30172
Konten über eine externe Anmeldung erstellen und ihnen über einen Claim Gruppen zuweisen
#30179
Eine Anwendung, die mit „useSSO=true“ erstellt wurde, bietet die generische OpenID-Anmeldung an, die über die Umgebungsvariablen „tl_pac_*“ aktiviert wird – auch auf dem Entwicklungsserver.
#30183
Self-Service: Offene Selbstregistrierung ohne Einladung
#30190
Entfernen Sie die Steuerungsanwendung „tl-factory“ aus der Engine; sie wird in einem eigenen Repository entwickelt.
#30200
Agent-Zugriff und Aufzeichnung: Kommandos arbeiten auf stabilen Objekt-IDs, fachliche Schlüssel nur für Aufzeichnung und Wiedergabe
#30215
Ebene anzeigen: Ein Wertkanal, dessen Wert pro Benutzer gespeichert wird
#30223
Self-Service-E-Mails: Texte in der Servicekonfiguration bearbeitbar, Sprache der Einladung wählbar
#30225
Modell: Handler, die für ein Attribut (Änderung) oder einen Typ (Erstellung, Löschung) deklariert sind, werden innerhalb des Commit ausgeführt
#30227
Design-System-UI-Übung, Teil 1b: Tabellen mit Tiefenwirkung und sichtbaren Spaltengrenzen
#30250
TL-Ansichten: <start-job> / <job-status> – Schließen-Schaltfläche für einen abgeschlossenen Job, „Point of No Return“, Teilergebnis eines abgebrochenen Jobs, Schließen des Dialogs aus dem Folgejob heraus, der Folgejob sieht die Commits des Jobs
#30253
tl-ai-core bindet die Playwright-Browser (Driver-Bundle, 200 MB) in jede Anwendung ein: Die Browser-Tools werden in das optionale Modul tl-ai-browser ausgelagert.
#30266
React-Konfigurationseditor: Mehrzeilige Texte (HTML, Markdown, Code, mehrzeilig) nutzen standardmäßig die ganze Zeile
#30267
Geheimnisse aus der Administration setzen und entfernen, beschreibbare Verzeichnis-Ablage
#30268
Systemumgebung: Herkunft der Konfigurationsvariablen anzeigen und Variablen aus der Administration setzen
#30276
KI-Agenten: Aussagekräftige Commit-Nachrichten für Änderungen eines Agenten statt "Agent edit"
minor
#30139
TL Views: Einheit und eigenes Zahlenformat für Zahlenfelder
#30188
TL-Script: Binärwert als Text lesen; Webapp-Ressource als Binärwert lesen
#30209
React-Tabelle: Spalten abhängig von Kanalwerten ein- und ausblenden (exists-if)
#30218
ModificationListener: Es gibt keine unterstützte Möglichkeit, dem Benutzer mitzuteilen, was durch eine Modifikation geändert wurde, sobald der Commit erfolgreich war.

defect

critical
#30146
Datenmigration ist beim gleichzeitigen Start mehrerer Cluster-Knoten nicht gegen parallele Ausführung geschützt
#30196
Abbrechen eines Hintergrundjobs (TL Views <start-job>, Scheduler-Task, JMS-Consumer) unterbricht den Thread mitten im Datenbankzugriff und schließt eine eingebettete H2-Datenbank (MVStore panic, Anwendung unbenutzbar)
#30224
TestFlowSvgPortable lässt sich nicht kompilieren: FlowFactory.chart() hat den Parameter „fixedView“
#30301
React-Views: TestTreeTableRowEdit kompiliert auf master nicht mehr (ExpandArguments.ROW_INDEX durch ROW_ID ersetzt)
major
#29847
Der Skript-Test „TestTransactionMonitor-01_RevertRevision“ schlägt fehl, wenn eine geplante Aufgabe gleichzeitig eine Transaktion abschließt.
#30043
TL Views: Ein Wert, den der Server festlegt, während der React-Rich-Text-Editor den Fokus hat, wird nie übernommen; der Editor behält seinen Text nach dem Absenden bei.
#30067
React-Oberfläche: Anmeldung in einem Browser-Tab meldet sofort wieder ab, wenn ein zweiter Tab der Anwendung offen ist
#30077
TL Views: Wizard - ein erneut betretener Auto-Weiter-Schritt ohne eigene Navigation lässt den Benutzer ohne Weg zurück in den Ablauf
#30078
React-Oberfläche: Beim Einrichten der Zwei-Faktor-Authentifizierung wird der Schlüssel für die manuelle Eingabe nicht angezeigt, nur der QR-Code
#30079
Konfigurierte SecurityParents funktionieren nicht mit StructuredElementWrapper
#30082
React-Oberfläche: Reiter eines Dialogs verändern die Adresse der Seite und bleiben nach dem Schließen in der URL stehen
#30090
Scheduler: Ein beim Start fälliger Task wird beim Herunterfahren abgehängt, während er noch läuft (NullPointerException in TaskImpl.getLog())
#30099
Scheduler-Tests: testStartTaskImmediately / testPeriodically laufen seit der Überarbeitung des Schedulers zeitweise in einen Timeout
#30103
tl-maven-plugin: Schlägt das Zusammenführen der View-Overlays beim Bau einer Anwendung fehl, bleibt das Build grün
#30106
tl-chat: Befehle im Kopf einer data-list zeigen ihren Zustand nicht (ausgeblendet, deaktiviert mit Grund); ein Klick auf einen gesperrten Befehl bleibt stumm
#30107
tl-maven-plugin: Schlägt das Erzeugen eines Layouts beim Bau einer Anwendung fehl, bleibt das Build grün
#30109
tl-chat: Nach der Anmeldung im selben Browser-Fenster bleibt der Chat bei „Melde dich an, um den Chat zu nutzen“
#30110
Abgebrochener externer Login (OIDC) hinterlässt eine angemeldete Session ohne Tokens
#30115
delete-module / delete-class räumen hasWrapperAttValue-Daten nicht auf
#30118
Passkeys je Anwendung entweder zum Anmelden ohne Passwort oder als zweiter Faktor, nicht beides zugleich
#30119
AlterColumnProcessor aktualisiert das gespeicherte Schema für abstrakte Typen nicht
#30123
Scheduler meldet fälschlich „There is no thread to remove“, wenn der Start eines Tasks scheitert
#30124
OpenAPI-Server: Fehlermeldung eines gescheiterten Skripts ist unlesbar und wird außerhalb des Interaction-Contexts erzeugt
#30125
Agent-Zugriff: /agent-api antwortet auf eine Anfrage ohne gültige Anmeldedaten mit einer Weiterleitung zur Anmeldeseite statt mit einem 401-Fehler.
#30127
Eine Anwendung im Server-Stammverzeichnis behält ihre Sitzung bei: Das Sitzungs-Cookie wird an alle ihre Pfade gesendet, und die React-Seite zeigt ihr Symbol an.
#30128
Ein Aufruf ohne Anmeldedaten des Anbieters führt zu einem Authentifizierungsfehler, und der HTTP-Code 402 bedeutet bei jedem Anbieter einen Abrechnungsfehler.
#30133
Ebene anzeigen: Ein Feld, das aufgrund der dynamischen Sichtbarkeit als Pflichtfeld gekennzeichnet ist, verliert bei einer Validierungsänderung die Markierung „erforderlich“.
#30141
TypeIndexer: Java 21 als unterstützte Quellversion; Records indizieren
#30143
TL Chat: Während ein Agent mehrere Schritte ausführt, bleibt sein letzter Text sichtbar und die Laufzeile nennt den aktuellen Schritt, statt nur "…" und "Arbeitet …" zu zeigen
#30144
In einer Anwendung mit modellbasierter Sicherheit sind Chat-Sitzungen für ihren Eigentümer nicht sichtbar.
#30147
React-Oberfläche: Menü "Weitere Aktionen" schließt nicht mit Escape, wenn alle Einträge deaktiviert sind
#30159
Script-Recorder der React-Oberfläche: Aufnahmen von Baum, Mehrfachauswahl und Dropdown-Assertions lassen sich in einer anderen Sitzung wiederholen
#30164
TL-Chat: Ein Lauf, der mit einer Ausnahme fehlschlägt, hinterlässt keinen Fehler im Chat; er verschwindet nach einem Neuladen.
#30165
React: Ein Befehl mit „ignoreStaleUi“ an ein Steuerelement, das nicht mehr auf dem Bildschirm angezeigt wird, schlägt weiterhin mit dem Fehler 404 „Steuerelement nicht gefunden“ fehl.
#30166
TL-Chat: „runPageCommand“ gibt dem Modell die Ablehnung eines Seitenbefehls auf Englisch statt in der Sprache des Benutzers zurück.
#30173
Die OIDC-Anmeldeschaltfläche wird angezeigt, obwohl der Client weder über eine Discovery-URI noch über Anbieter-Metadaten verfügt.
#30176
Der Entwicklungsserver wird über /admin/stop von jeder beliebigen Adresse aus angehalten.
#30177
Der Entwicklungsserver ignoriert X-Forwarded-*-Header, sodass eine relative Callback-URL hinter einem Proxy den falschen Ursprung angibt.
#30184
DeleteTableProcessor entfernt keine <alternative>-Elemente aus dem gespeicherten Schema
#30201
Veto gegen die Modellbeschränkungen einlegen: Bei einem fehlgeschlagenen Auftrag (und dessen Protokoll) wird lediglich „Kann nicht gespeichert werden, Beschränkungen verletzt“ angezeigt, ohne dass die Probleme aufgeführt werden.
#30216
Hintergrundarbeit scheitert mit „Session revision invalid", wenn das Fenster währenddessen speichert (Jobs, KI-Läufe)
#30231
HtmlResKey: Wert auch als Attribut einlesen (Format ergänzen)
#30244
tl-archetype-deploy: Abhängigkeit des Archetyp-Integrationstests auf tl-demo deklarieren
#30247
Migration auf PostgreSQL mit autosave=NEVER: Erwartete SQL-Fehler brechen die Transaktion ab
#30251
tl-ai-core, Anthropic-Anbieter: Claude 5.5-Modelle fehlen im mitgelieferten Modellkatalog, und claude-haiku-5-5 hat ein „Thinking Budget“ zurückgegeben (HTTP 400)
#30252
tl-ai-mcp-server: „tools/list“ wird nicht anhand der Zugriffsrechte des Aufrufers gefiltert, und „/mcp/“ mit einem abschließenden Schrägstrich liefert den Status 404.
#30254
tl-chat: a missing API key is announced as a rejected key ("Das Modell hat den Zugangsschlüssel abgelehnt")
#30255
tl-ai-core: Der Agent-Zug wurde mit der Meldung „Objekte vom Typ … ohne Berechtigung erstellen“ zurückgesetzt, wenn ein Tool ein Teil in einem Objekt erstellt, das im selben Zug erstellt wurde – die doppelte Pre-Commit-Prüfung entfernen, Anfangswerte im TL-Script überprüfen
minor
#29961
React-Anwendungen enthalten Module der klassischen Oberfläche (Self-Service, WYSIWYG-Editor, Code-Editor, Suche, Monitoring, KI-Administration)
#30044
TL-Ansichten: Ein Seitenleisten-Trennzeichen bleibt sichtbar, wenn alle darauf folgenden Elemente ausgeblendet sind; in der anonymen Sitzung wird das System-Trennzeichen angezeigt, unter dem sich nichts befindet.
#30085
Vorgabewerte <country value="..."/> und <time-zone value="..."/> (CountryDefaultProvider, TimeZoneDefaultProvider) nicht nutzbar
#30089
TL-Script-Funktionen `binarySize()` und `modelHealthReset()` liefern Ganzzahl statt Double und protokollieren bei jedem Aufruf einen Fehler
#30121
Kompilierungsfehler in Eclipse in TL 8 alpha12
#30134
Ebene anzeigen: „ <composition-table> “ ignoriert die Sichtbarkeit (dynamic-visibility, hidden, read-only) seines zusammengesetzten Attributs.
#30140
TL Views: „TestViewsLoad“ erkennt keine undefinierte Variable im Wert-Ausdruck einer berechneten Spalte
#30142
CommaSeparatedStringSet: Nicht-deterministische Serialisierung erzeugt doppelte key-attributes in Schema-Baseline
#30180
Flow-Diagram (Gantt): Klick auf Element wählt nichts aus, wenn frozenRows > 0
#30181
Flow-Diagram (Gantt): Diagramm wird immer komplett eingepasst – kein vertikales Scrollen, unlesbar bei vielen Zeilen
#30185
Flow-Diagram (Gantt): Beschriftung von LineDeco (z. B. „Heute“) unter fixierten Kopfzeilen abgeschnitten; Kanten ohne Pfeilspitze
#30187
Diagramm-Export als SVG (reactFlowToSvg, flowToSvg) ist nicht Batik- bzw. druckfähig
#30191
Die Modulabschaltung führt zu keiner Abschaltung des Moduls, wenn die Klasse seines InContext-Jobs nicht geladen werden kann (die Datenbank bleibt in der JVM des Containers geöffnet).
#30197
React-Tabelle: Datumszelle im In-Place-Edit übernimmt jeden Tastatur-Zwischenstand (z. B. Jahr 0002)
#30198
React-Views: Baumtabelle ({{{<tree-table>}}}) ohne Zeilenbearbeitung ({{{row-edit}}}) – kein Ersatz für das klassische Tree-Grid
#30199
React-Views: Zeilenbearbeitende Tabelle zeigt bei verletztem Constraint nur einen roten Rahmen, keinen Meldungstext
#30204
React-Tabelle: Attributspalte bei mehreren Zeilentypen nur am ersten Typ aufgelöst (Beschriftung, Sortierung, Filter)
#30205
React-Tabelle mit Row-Edit: Spalte auf ein abgeleitetes Attribut ist editierbar, Speichern scheitert
#30206
React: Deaktivierter upload-command zeigt keinen Grund; null-input-disabled sperrt ihn immer
#30207
React: button mit Upload-Aktion öffnet keine Dateiauswahl
#30208
React-Tabelle: keine Zellanzeige für externe Links (URL)
#30211
React: Eingebaute Regeln von delete-object und Co. greifen vor den konfigurierten (visible-if wirkungslos)
#30212
React: null-input-disabled prüft nur den ersten Input
#30213
Binärattribut: Abfrage des Inhaltstyps lädt den ganzen Inhalt; BLOB-Spalten in Objekttabellen nur für kleine Werte
#30214
Ebene anzeigen: Tooltips lassen die Zeilenumbrüche ihres Textes weg (.tl-tooltip__body hat „white-space: normal“)
#30226
React-Tabelle: Befehle kennen weder die angezeigten Zeilen noch deren Reihenfolge
#30237
React-UI: Keine Anzeige, während ein Befehl auf dem Server läuft
#30256
React-UI: Farbrolle einer Zeile, Zelle oder Anzeige als eigenes Skript (row-role, cell-role, role) statt der wirkungslosen Statusklassen tl-status-*
#30257
React-UI: Befehle eines Fensters aus einer abgelösten Sitzung erzeugen je Befehl zwei WARN-Zeilen
#30258
React-UI: Reiter nur für einen Typ zeigen geht nur über eine Typabweichung in access-control, und die wird als WARN geloggt
#30259
KB: Committable.rollback() wird nach erfolgreichem Datenbank-Commit aufgerufen, wenn das Veröffentlichen der Änderungen oder Caches scheitert
#30265
TL-Script: try() gibt bei throw() und TopLogicException nur den Text der Meldung statt des ResKey an catch
#30269
ModelAccessRights.isAllowed(Person, ...): Prüfung für eine andere Person übernimmt Bypass bzw. Admin-Status des aktuellen Kontexts

task

major
#30046
Entfernen Sie den nicht verwendeten Dienst „ReactComponentRegistry“

update

critical
#30111
Update der RequireJS-Abhängigkeit auf ^2.3.7 [SICHERHEIT]
enhancement (Nutzer-sichtbar)

major

#29993

Konfiguration: Jede konfigurierte Funktion wahlweise in Java oder TL-Script implementierbar, mit derselben Konfigurationssyntax (auch im React-Konfigurationseditor)

ReactUITLScript

Kontext

Viele Konfigurationseigenschaften verweisen auf eine Funktion, z. B. einen Filter, eine Abbildung oder einen Label-Provider (PolymorphicConfiguration<F>). Solche Eigenschaften konnten bisher nur mit einer Java-Klasse belegt werden. Umgekehrt nehmen Eigenschaften vom Typ Expr nur TL-Script auf.

Mit ScriptFunction0 ... ScriptFunction4 gab es zwar Eigenschaften, die beides erlauben. Sie hatten aber eine eigene Syntax (<label expression="..."/>), die weder zu Expr (label="...") noch zu einer Java-Implementierung (label="com.foo.MyLabel") passt. Wurde eine Eigenschaft von Expr auf ScriptFunctionN umgestellt, musste jede bestehende Konfiguration angepasst werden. Deshalb wurde ScriptFunctionN kaum verwendet. Außerdem griff die Standardimplementierung von ScriptFunctionN (Eintrag unter <defaults>) innerhalb der Anwendungskonfiguration nicht (siehe #29742).

Im generischen Konfigurationseditor der React-Oberfläche (tl-layout-configedit, z. B. im Modelleditor für Annotationen) hatten Eigenschaften vom Typ ScriptFunctionN gar kein Eingabefeld. Beispiel: React-Modelleditor, Attribut -> "+ Anpassungen" -> "Dynamische Bezeichnung" (DynamicLabel): der Abschnitt "Bezeichnung" (eine ScriptFunction3) war leer.

Verbesserung

Jede Konfigurationseigenschaft, die auf eine Implementierung eines Interfaces verweist, kann wahlweise mit einer Java-Implementierung oder mit TL-Script belegt werden.

Interfaces mit genau einer abstrakten Methode

Für eine Funktion (z. B. Filter, Mapping, LabelProvider, Comparator, Function0 ... FunctionN, IFunctionN) ist die Syntax dieselbe wie bisher für die jeweilige Variante:

{{{#!xml <-- Java-Implementierung (unverändert) --> <filter class="com.foo.MyFilter" my-option="..."/> <x filter="com.foo.MyFilter"/>

<-- TL-Script, wie bei einer Eigenschaft vom Typ Expr --> <x filter="x -> $x.get(my.module:MyType#done)"/> <filter><![CDATA[x -> $x.get(my.module:MyType#done)]]></filter> }}}

Der TL-Script-Ausdruck bekommt die Argumente der Methode in ihrer Reihenfolge. Argumente und Ergebnis werden wie bei TL-Script-Funktionen aus TLScriptFunctions umgewandelt (inklusive @ScriptConversion an der Methode). Liefert das Skript einen Wert vom falschen Typ, gibt es eine verständliche Fehlermeldung.

Damit kann eine Eigenschaft vom Typ Expr später auf einen Funktionstyp umgestellt werden, ohne dass sich bestehende Konfigurationen ändern.

Interfaces mit mehreren Methoden

Ein Interface mit mehreren Methoden (z. B. ListModelBuilder) wird in TL-Script implementiert, indem jede Methode als eigene Eigenschaft angegeben wird, wie jede andere Konfigurationseigenschaft wahlweise als Element oder als Attribut. Der Name der Eigenschaft ist der Methodenname in Bindestrich-Schreibweise oder, wenn die Methode eine @Name-Annotation trägt, deren Wert:

{{{#!xml <builder> <get-model>...</get-model> <supports-model>...</supports-model> <retrieve-model-from-list-element>...</retrieve-model-from-list-element> <supports-list-element>...</supports-list-element> </builder>

<builder get-model="..." supports-model="..." retrieve-model-from-list-element="..."/> }}}

  • Jede abstrakte Methode muss angegeben werden. Eine Default-Methode kann angegeben werden; ohne Angabe gilt ihre Java-Implementierung.
  • Die Elementform gibt es auch für Interfaces mit einer Methode: <filter><accept>...</accept></filter> ist gleichbedeutend mit filter="...".
  • @Name an einer Methode bestimmt den Eigenschaftsnamen wie bei einer Eigenschaft eines Konfigurations-Interfaces. Ist die Methode in der Interface-Hierarchie mehrfach annotiert, gilt die Annotation des speziellsten Interfaces. Überladene Methoden mit unterschiedlichen @Name-Werten sind getrennte Eigenschaften und damit implementierbar.
  • Ein Interface, dessen abstrakte Methoden generisch sind, überladen ohne unterschiedliche @Name-Werte, oder deren Eigenschaftsnamen kollidieren, kann nicht in TL-Script implementiert werden (Konfigurationsfehler). Überladene oder generische Default-Methoden werden nicht angeboten und behalten ihre Java-Implementierung (so bleibt z. B. Comparator implementierbar).

Methoden ohne Parameter

Eine Methode ohne Parameter, deren Ergebnistyp ein einfacher Konfigurationswert ist (primitive Typen und ihre Wrapper, String, Aufzählungen, Class, Date, Typen mit eigenem Format wie ResKey), wird nicht durch ein Skript, sondern durch einen Wert dieses Typs implementiert. Beispiel DefaultProvider:

{{{#!xml <provider is-computed-in-transaction="true" create-default="context -> attribute -> 42"/> }}}

Ein nicht gesetzter Wert einer Default-Methode liefert deren Java-Implementierung, ein fehlender Wert einer abstrakten Methode ist ein Konfigurationsfehler. Methoden ohne Parameter mit einem anderen Ergebnistyp (Object, Typvariable, Interface) bleiben Skripte.

ScriptFunctionN

ScriptFunction0 ... ScriptFunction4 sind ein Fall dieses Mechanismus. Die bisherige Schreibweise <label expression="..."/> bleibt gültig, label="..." funktioniert jetzt ebenfalls, auch innerhalb der Anwendungskonfiguration. Das Ergebnis wird in den Ergebnistyp umgewandelt statt ungeprüft gecastet.

Editoren

In den Konfigurationseditoren (React und klassisch) bietet eine solche Eigenschaft eine Auswahl der Implementierung an: die passenden Java-Klassen und "TL-Script". Das gilt auch, wenn die Auswahl von einer @Options-Funktion berechnet wird (z. B. "Standardwert" im Modelleditor). Mit "TL-Script" erscheint je Methode ein TL-Script-Code-Editor, für eine Methode ohne Parameter mit einfachem Ergebnistyp das passende Eingabefeld (z. B. die Checkbox "In Transaktion berechnet"). Ein konfigurierter Ausdruck öffnet mit "TL-Script" und dem Ausdruck im Editor.

  • Implementiert das Skript die einzige abstrakte Methode, trägt der Code-Editor die Bezeichnung der implementierten Eigenschaft (bei "Dynamische Bezeichnung" also "Bezeichnung", beim Standardwert "Standardwert"). Bei mehreren Methoden trägt jeder Editor die Bezeichnung seiner Methode.
  • Der Tooltip zeigt die Beschreibung der Eigenschaft und der Methode, dann die Argumente mit Name, Typ und Beschreibung und das Ergebnis mit Typ und Beschreibung, z. B. beim Standardwert: "Argumente: context: Object – Der Kontext, in dem …; attribute: TLStructuredTypePart – Das Attribut, für das der Standardwert erzeugt wird. Ergebnis: Object – Standardwert für das angegebene Attribut."
  • Beim Wechsel auf "TL-Script" wird ein Lambda mit den Parameternamen der Methode vorbelegt, z. B. context -> attribute -> null (ohne bekannte Namen arg1 -> arg2 -> null).
  • Die Auswahl enthält nur Klassen, deren generischer Typ zur Eigenschaft passt. Für "Dynamische Bezeichnung" werden also nicht mehr alle IFunction3-Implementierungen des Systems angeboten.

In-App-Dokumentation implementierbarer Interfaces

Der TLDoclet exportiert die JavaDoc eines Interfaces F` in die `messages_*.properties seines Moduls, wenn eine Konfigurationseigenschaft desselben Moduls vom Typ PolymorphicConfiguration<F> ist (direkt, über ein Sub-Interface wie ScriptFunction3 oder als Element einer Liste bzw. Map). Interfaces mit Typparametern (IFunctionN, Mapping) werden nicht exportiert, dort beschreibt die Eigenschaft das Skript. Schlüssel: <Interface>.<methode> (Bezeichnung), .tooltip, .param.<name>.tooltip, .return. Ein Verweis {@link #andereMethode()} ohne Text erscheint als Bezeichnung der verlinkten Methode. Für diese Methoden gibt der Doclet keine Warnungen über fehlende Dokumentation aus.

Behobener Fehler im React-Konfigurationseditor

Wurde der letzte Eintrag einer Liste entfernt (z. B. die einzige Annotation eines Attributs im Modelleditor), galt das Formular nicht als geändert, und "Speichern" verwarf das Entfernen. Hinzufügen, Entfernen, Umsortieren und Typwechsel gelten jetzt immer als Änderung.

Lösung

  • com.top_logic.basic definiert die Schnittstelle ScriptImplementationProvider. Sie wird per ServiceLoader gefunden, damit sie schon beim Lesen der Anwendungskonfiguration greift. Eine Eigenschaft PolymorphicConfiguration<F> mit einem Interface F erhält bei einem Interface mit einer Methode implizit ein Textformat. Dadurch gilt die Unterscheidung für Attribut- und Elementschreibweise, JSON und das Zurückschreiben gleichermaßen.
  • Ein Attributwert in der Form eines qualifizierten Java-Klassennamens (a.b.C, a.b.C$D) ist eine Implementierungsklasse (Fehler, wenn sie nicht existiert). Jeder andere Wert ist ein TL-Script-Ausdruck (bzw. der Wert einer Methode ohne Parameter). Ein bloßer qualifizierter Name ist kein gültiger TL-Script-Ausdruck, beide bisherigen Schreibweisen bleiben gültig.
  • Eine TL-Script-Implementierung wird ohne class-Attribut und ohne Typangabe zurückgeschrieben und gleich wieder eingelesen.
  • com.top_logic.model.search stellt die TL-Script-Implementierung bereit (TLScriptImplementationProvider): einen Proxy für das Interface, der die Ausdrücke ausführt bzw. die Werte liefert. Für jeden implementierten Typ entsteht zur Laufzeit ein Konfigurationstyp (DeclarativeConfigDescriptor), dessen Eigenschaften die Methoden des Interfaces sind (MethodProperty, das auch den Eigenschaftsnamen aus @Name bestimmt). Der Proxy ordnet einen Aufruf über die Signatur der Methode zu, nicht über ihren Namen.
  • Die Umwandlungen von Argumenten und Ergebnissen aus TLScriptMethod sind in die gemeinsame Klasse ScriptConversions ausgelagert.
  • Bezeichnung, Tooltip, Argumente und Ergebnis eines Skript- oder Wert-Editors bestimmt ScriptImplementationLabels für beide Editoren gemeinsam aus der exportierten Interface-Dokumentation. Die Argumentnamen sind die Parameternamen der Methode (die Engine wird mit -parameters übersetzt).
  • Die überflüssige Übersteuerung der Bezeichnung von TLDefaultValue.provider ("Provider") in ElementMessages_*.properties entfällt; die Eigenschaft heißt "Standardwert".
  • Die Einträge für ScriptFunctionN unter <defaults> in modelSearchConf.config.xml, der Texteditor ScriptFunctionEditor mit seinem java:-Präfix und die zugehörigen Editor-Anpassungen entfallen. Die explizite Angabe der Implementierungsklasse in contactConf.config.xml (#29742) ist nicht mehr nötig.

Test

  • TestScriptImplementation, TestMethodProperty, TestJavaTypeUtil, TestJavaTypeFormat, TestConfigUtil (basic), TestScriptConversions, TestTLScriptImplementation, TestScriptImplOptionMapping, TestTLScriptEditorControls (model.search), TestScriptImplementationConfigEditor (model.search.react), TestConfigEditorControl, TestConfigFormControl (configedit), TestAnnotationsFieldControlProvider (layout.view), TestImplementableInterfaceDoc (tl-build_doclet), Scripted-Test TestRegression28606.
  • React-Demo tl-demo-react: Administration -> Modell -> Modul "demo.tickets" -> Attribut "name" von "Ticket" -> Bearbeiten -> "+ Anpassungen" -> "Dynamische Bezeichnung": "Bezeichnung" bietet "TL-Script" an; der Code-Editor heißt "Bezeichnung", ist mit arg1 -> arg2 -> arg3 -> null vorbelegt und zeigt im Tooltip Beschreibung und Argumente; ein Ausdruck wird gespeichert und wieder angezeigt; das Entfernen der einzigen Annotation wird gespeichert.
  • Klassische Demo tl-demo: Administration -> Development -> Modell Editor -> Demo A -> Attribut dateTime -> Bearbeiten -> Anpassungen -> "Dynamische Bezeichnung": "Bezeichnung" bietet LabelWithTimeZone und "TL-Script" an; mit "TL-Script" wie oben.
  • Standardwert in beiden Demos (React: wie oben, "Standard Wert"; klassisch: wie oben, "Standard Wert"): "Standardwert" bietet "TL-Script" an; der Code-Editor ist mit context -> attribute -> null vorbelegt, der Tooltip zeigt Beschreibung, benannte Argumente und Ergebnis; die Checkbox "In Transaktion berechnet" wird gespeichert und wieder angezeigt.
  • Get Started
  • Github
  • Discord
  • Das Unternehmen hinter TopLogic
  • Softwareentwicklung heute
  • Kontakt

© Copyright – Business Operation Systems GmbH

  • top-logic.com
  • Nutzungsbedingungen
  • Impressum
  • Rechtlicher Hinweis
  • Datenschutz
  • EN
  • Login