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)
#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.
#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
#30120
Ebene anzeigen: Optionen eines Zeichenfolgenattributs dürfen keine Anzeigebezeichnungen enthalten
#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
#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.
#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
#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
#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
minor
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)
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
#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“
#30118
Passkeys je Anwendung entweder zum Anmelden ohne Passwort oder als zweiter Faktor, nicht beides zugleich
#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“.
#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.
#30177
Der Entwicklungsserver ignoriert X-Forwarded-*-Header, sodass eine relative Callback-URL hinter einem Proxy den falschen Ursprung angibt.
#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)
#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.
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
#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
#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
#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
#30211
React: Eingebaute Regeln von delete-object und Co. greifen vor den konfigurierten (visible-if wirkungslos)
#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“)
#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
defect
(Nutzer-sichtbar)
Wofür man das braucht
Manche Befehle brauchen auf dem Server einige Sekunden. Der Anwender muss in dieser Zeit sehen, dass sein Klick angekommen ist und etwas passiert:
- Ausgaben: PDF- oder Excel-Erzeugung über viele Objekte, z. B. ein Blatt je markierter Zeile
- Massenaktionen: Änderungen an vielen Objekten in einer Transaktion
- Importe und Berechnungen: Datei einlesen, Auswertung über einen großen Teilbaum
- Aufrufe externer Systeme: Schnittstellen, deren Antwortzeit die Anwendung nicht in der Hand hat
Üblich ist eine Anzeige der Oberfläche selbst: Sperre mit Warteanzeige nach einer kurzen Verzögerung (z. B. 0,5 s), oder zumindest ein Ladezustand am ausgelösten Knopf.
Problem
Während ein Befehl läuft, zeigt die React-Oberfläche nichts an.
- Der Knopf bekommt keinen Ladezustand, es erscheint keine Sperre, kein Spinner, der Mauszeiger ändert sich nicht.
- Die Oberfläche bleibt scheinbar bedienbar; nichts hindert den Anwender, denselben Knopf erneut zu drücken.
- Die Bibliothek hat Bausteine dafür (Spinner, aria-busy an einzelnen Steuerelementen, ReactProgressControl). Für einen gewöhnlichen Befehl (<generic-command>, <execute-script>, Dialogknöpfe) greift aber keiner davon.
Folgen:
- Doppelte Ausführung: Der Anwender hält den Klick für verloren und klickt erneut. Bei Ausgaben entsteht die Arbeit doppelt, bei Massenaktionen und Anlage-Befehlen entstehen doppelte Objekte.
- Abbruch: Der Anwender lädt die Seite neu oder schließt sie, weil die Anwendung zu hängen scheint.
- Kein Ausweg in der Anwendung:
- Die Anwendung kann während eines laufenden Befehls nichts an den Client schicken. Eine eigene Anzeige vor dem Befehl wäre erst nach dessen Ende sichtbar.
- Ein Fortschrittsdialog mit Hintergrund-Thread ist für einen Befehl von wenigen Sekunden unverhältnismäßig und muss in jeder Anwendung neu gebaut werden.
Version: 8.0.0-alpha12, React-View-Layer (tl-layout-view/tl-layout-react).
Reproduktion
- Ein Befehl, der einige Sekunden braucht, z. B. <execute-script function="count(0, 3000000).map(x -> $x * 2).size()"> an einer beliebigen Ansicht.
- Befehl auslösen und die Oberfläche beobachten: Bis zum Ergebnis ändert sich nichts, der Knopf ist weiter klickbar.
- Alternativ ohne langsamen Befehl: Im Browser die Antwort auf react-api/command künstlich verzögern (z. B. window.fetch umhüllen, Antwort 4 s zurückhalten). Während der 4 s erscheinen im DOM weder aria-busy noch Spinner, Sperre oder geänderter Mauszeiger.
Erwartetes Verhalten
- Läuft ein Befehl länger als eine kurze Schwelle (z. B. 0,5 s), zeigt der Client eine Warteanzeige: Sperre der Oberfläche mit Spinner oder Ladezustand am auslösenden Knopf.
- Bis zum Ende des Befehls nimmt die gesperrte Oberfläche keine weiteren Klicks an.
- Optional: Ein Befehl kann eine eigene Meldung für die Anzeige angeben, z. B. „Bericht wird erzeugt…“.
Lösung
- Sperre mit Warteanzeige: Alle Befehle des Clients laufen nacheinander über einen Kanal (command-channel.ts). Sind Befehle, auf die der Anwender wartet, länger als eine Verzögerung unbeantwortet, legt die Oberfläche eine durchsichtige Sperre über die Seite: in der Mitte der Baustein Spinner (ein Theme wie MUI zeichnet ihn selbst), Mauszeiger „wird bearbeitet“, aria-busy="true" am <body>. Klicks und Tastatureingaben gehen verloren, bevor die Seite sie sieht; der Fokus bleibt, wo er war. Die Sperre verschwindet, sobald alle Befehle beantwortet sind. Befehle, die innerhalb der Verzögerung fertig werden, zeigen nichts an.
- Verzögerung konfigurierbar: Einstellung busy-delay der View-Konfiguration (ViewConfig), Vorgabe 500ms, auch mit Einheit (1s); 0 sperrt sofort. Die Seite übergibt den Wert dem Client als Attribut data-busy-delay am <body>. React-Steuerelemente, die in die klassische Oberfläche eingebettet sind, sperren nicht (sie hat eine eigene Warteanzeige).
- Hintergrundbefehle: Ein Befehl kann mit der Option background (Konstante BACKGROUND_COMMAND der Bridge) geschickt werden; er läuft weiter im Kanal, sperrt aber nie. So markiert sind Abfragen, neben denen der Anwender weitertippt (Vorschläge, Erwähnungen), Ladevorgänge mit eigener Ladeanzeige (Auswahllisten, Icon-Auswahl, Nachladen von Tabellenzeilen) und Meldungen dessen, was der Client schon getan hat (Größen, Fensterzustände, Drop-Proben, Chat-Stream).
- Kein Doppelklick: Knöpfe und Menüeinträge (auch im MUI-Theme) schicken ihren Befehl über den neuen Hook useGuardedCommand: Solange ihr Befehl unbeantwortet ist, nehmen sie keinen weiteren Klick an, auch vor Ablauf der Verzögerung.
- Langlaufende Aufträge (<start-job>) sind nicht betroffen: Ihr Befehl wird sofort beantwortet und läuft über eine Fortsetzung weiter.
- Demo: In tl-demo-react unter Demos → „Lang laufender Auftrag“, Abschnitt „Ein Befehl, der in der Anfrage läuft“.
- Eine eigene Meldung je Befehl ist nicht Teil dieses Tickets.