enhancement
major
#29704
tl-archetype-app: Neue Anwendung standardmäßig mit React-Oberfläche erzeugen, klassische Oberfläche per Option
#29729
TL Views: Ein Flussdiagramm (flow-diagram) lässt sich nicht für Mehrfachauswahl konfigurieren
#29781
TL Views: Aktionsketten mit benannten Argumenten – Auslöser liefern mehrere Werte, Skripte verwenden sie als implizite Variablen, Aktionen mit Ergebnis führen Folgeaktionen in <with-result> aus
#29856
React UI: consolidate the access check definitions of views, commands and TL-Script functions
#29860
Konfigurationsformulare: Eingabefelder werden über fachliche Annotationen (@MultiLine, @Code, @Html, @Inline, …) gewählt, in klassischer und React-Oberfläche gleich; @ControlProvider und @ConfigControl entfallen
#29865
Configuration layering: removing a list entry whose key the underlying layers do not (or no longer) define fails the application start
#29877
Developer docs: an article on the persistency configuration of an application (single branch vs. multiple branches, type systems, what changes the schema)
#29880
XIO: Import of an evolving external format: report unknown elements, reject a second composite container with a location, match several values in one <switch> case
#29887
TL Views: Einfügevorschläge für ein Textfeld - per TL-Script berechnete Vorschläge an der Schreibmarke
#29892
view-layer forms: actions that enter and leave edit mode (<enter-edit-mode/>, <leave-edit-mode/>)
#29896
Typed configuration: config:ref addresses an entry of a keyed list by a globally unique key without naming the path to it; a view overlay addresses every element by its id
#29906
Design System wave 5c: calendar, kanban, dashboard and value list read the design system package
#29914
Design System wave 5d: foundation pieces and foreign stylesheets read the design system package; tlReactControls.css is removed
#29941
TL Views: Auswahlfeld, das zusätzlich einen frei eingegebenen Wert annimmt ("auswählen oder neu eingeben")
#29942
TL Views: Erwähnungen im HTML-Editor - Verweise auf Objekte (z.B. Projektmitglieder, Tickets) per @/# einfügen, die zu Links werden
#29947
Steueranwendung: Workspace-Management – leere TopLogic-Anwendung in einem Docker-Container anlegen, starten, stoppen und aufräumen
#29948
Credentials für externe Dienste ohne Geheimnisse in der Konfiguration: Secret-Quellen, Token-basierte Authentifizierung (Keycloak/OIDC, Workload Identity, Azure) und API-Gateway
#29953
Steueranwendung: Agenten-Harness im Workspace – Auftrag an Claude Code, Live-Transkript, Übernahme durch einen Menschen, LLM-Zugang über einen Proxy
#29954
KI: Modellkatalog aus der Dienstkonfiguration des LLM-Anbieter-Dienstes herausnehmen und in einer eigenen Ansicht zeigen
#29955
React-UI: Dienstkonfiguration anzeigen, bearbeiten und speichern (mit Kennzeichnung "Neustart erforderlich")
#29956
Anwendungen und Fragment-Module ohne TopLogic-Parent-POM bauen: BOM, Maven-Packaging tl-app/tl-fragment und Feature-Starter
#29974
XML import: <unless-known> cannot import the attributes of a known element without its structure
#29975
XML import: <resolve-existing> loads only the partition of existing objects an ID belongs to; linking checks membership without reading the whole reference
#29976
View layer: <tree-table> offers no <export> (Excel export) although the export writes trees as outlines
#29977
View layer: <tree-table> has no node display (icon, label, CSS class per cell) and no row-class
#29981
View layer: a table column cannot be declared unsortable, so the groups it forms cannot keep the order of their rows
#29989
Javadoc-Verweise und ungenutzte Imports im Maven-Build prüfen, Eclipse meldet fehlerhaftes Javadoc nur noch als Warnung
minor
#29852
TL Views: Mehrwertige Binärwerte als Datei-Chips (oder Werteliste) mit Mehrfach-Upload, Pflichtfeld, Validierung und accept-Filter; <file-list> entfällt
#29872
TL Views: the min/max/step of a number input (slider) are fixed in the configuration and cannot come from a channel or expression
major
#29798
Derived reference reads as empty in the commit check (no user): result filter of AttributeByExpression stays on
#29869
A React view window that lost its SSE connection keeps every later KB revision in memory until its session ends
#29876
KnowledgeBase on H2: deleting objects scans the association tables (the reference indexes start with BRANCH, and H2 seeks an IN list only on the first index column)
#29895
deploy/local applies only to the module in the working directory: a module of a multi-module build cannot be started from the reactor root
#29918
Design System: a panel's toolbar sticks to the title instead of standing at the end of the title bar
#29920
TL Views: Die Zeilenauswahl in einer React-Tabelle braucht bis zu einer Sekunde, weil jede Auswahl alle Zellen neu überträgt und bei einer Tabelle mit Eingabekanal alle Zellen neu erzeugt
#29922
Composition-Tabelle in einem Formular bekommt keine Höhe, ein Dialog kann nicht mehr bis zur Tabelle scrollen
#29923
React-Oberfläche: Inhalt eines Navigationseintrags mit route="none" erzeugt URLs, die sich nicht öffnen lassen
#29932
Gruppen und Adressen sind für Superuser nicht lesbar: tl.accounts:Group und tl.accounts:Address haben keine Rollenquelle
#29933
React-UI: Der Griff eines Split-Panels "läuft weg" beim Ziehen mit der Maus; tiefe Baumknoten brechen um statt waagerecht zu rollen
#29934
View-Designer: Zur Laufzeit geöffnete Sichten (Rahmen eines tile-stack, navigate-push, open-dialog) fehlen im Entwurfsbaum und lassen sich nicht per "Sicht auswählen" anwählen
#29964
React UI: password login sometimes logs out immediately - a command of the replaced window triggers the stale-UI reload of the old window URL
#29970
React-Bridge: Ein Sprung, der seine Zielseite erst erzeugt, malt sie ohne die gesetzte Auswahl
#29971
React-Views: Die Ausführbarkeit eines Befehls übersieht einen Commit eines fremden Threads während des Seitenaufbaus
#29978
View layer: <tree-table> does not reveal a selected object under a collapsed node and misses changes while hidden
#29979
Migration: migrations of an application module without a stored version never run, the auto model upgrade runs instead
#29980
Migration: update-class with a new-name in another module does not move the class's associations
#29983
View layer: a tab strip wider than its container neither scrolls nor wraps nor collapses into a menu
#29990
React-UI: Panels und bedingte Inhalte nehmen in Split-Flächen, Tabs und Stacks die falsche Höhe
#30001
Entwicklungsmodus: neu geschriebene WEB-INF-Dateien sind über den FileManager erst verzögert sichtbar (Theme-Import zeigt keine Variablen, ThemeEditor_Ticket-24158_Import-export scheitert sporadisch)
#30005
React-Oberfläche: Ein Einstiegspunkt verliert beim Laden seine View-Datei aus der URL, F5 zeigt die Default-View (Regression #29957)
#30013
TL Views: Auswahlfelder bieten später angelegte Objekte ihres Typs erst nach neuer Anmeldung an
#30014
React-Formulare: Sichtbarkeit beim Anlegen (create-visibility) eines Attributs wird nicht berücksichtigt
#30015
React-Oberfläche: Anlegen in einem Container wird nicht geprüft, solange der Container-Kanal leer ist
#30016
Aufzählungswerte (Klassifikatoren) sind für Benutzer ohne Administratorrechte nicht entdeckbar: Ein Aufzählungs-Attribut kann nicht gesetzt werden
#30019
TABLE.debounce() verwendet globalen Singleton-Timer — Slice-Nachladen schlägt bei mehreren Tabellen fehl
#30024
React-Oberfläche: NullPointerException in ModelAccessPolicy.isGrantable, wenn ein Zugriffs-Parent seine Parent-Typen nicht statisch kennt
#30026
Instabiler Test: TestQueueReporter#testGetReport schlägt fehl, wenn zwei Builds auf demselben Knoten gleichzeitig laufen oder der Rechner ausgelastet ist
minor
#29868
KBChangeAnalzyer logs "There is a part id ... but no item for update" for every update of a part of a monomorphic inline-set storage
#29883
A boolean attribute without a value reads as false on a persistent object, as null on a transient one
#29894
Commit einer geänderten Annotation loggt ERROR mit Stacktrace, wenn der alte Wert eines abgeleiteten Attributs (z.B. options) nicht mehr instanziierbar ist
#29935
Popup-Fenster (Skript-Rekorder, Dokumentation) lässt sich nach dem Schließen nicht sofort wieder öffnen (Edge/Chromium): Fehler "Cannot read properties of null (reading 'services')"
#29959
Persönliche Einstellungen werden nicht gespeichert, wenn der Benutzer eine verletzte Modell-Bedingung hat (z. B. root ohne Kontaktdaten)
defect
minor
#29868
KBChangeAnalzyer logs "There is a part id ... but no item for update" for every update of a part of a monomorphic inline-set storage
An application whose composition uses an inline set storage without reference column logs one ERROR for every update of a part that does not change the container column. No change is lost, but the false ERROR lines hide real errors. Found in the application Pietro (issue Openium/Pietro#772): 54 lines in one evaluation run.
Problem
Observed: ERROR com.top_logic.element.changelog.KBChangeAnalzyer - There is a part id 'MetaAttribute:2621' but no item for update in: table :'Finding', descriptor: ...InlineSetStorage@...
Expected: no error; the update does not change the container.
Reproduce:
- A composite reference Project#statements with <inline-set-storage container-column="project"/> (no reference-column).
- Create a part, commit.
- Change any attribute of the part (a row column such as status, or only a flex attribute), commit.
- The log has the ERROR above.
Environment: tl-parent-app 8.0.0-alpha10 (tl-element, tl-core).
Cause
- InlineCollectionStorage#getPartId(Map) (l. 160-168) returns the attribute definition id unconditionally when reference-column is null. It does not look at the row. getBaseObjectId(Map) returns row.get(containerColumn), which is null when the column is not in the event.
- An ItemUpdate carries only changed columns and key attributes (DBKnowledgeItem#getChange l. 1105). The container column is no key attribute, so it is missing.
- KBChangeAnalzyer#analyzeTechnicalUpdate(...) (l. 326-331) logs newId == null && newPartId != null as an error. For the monomorphic storage this is the normal case of every update that keeps the container, and of a removal (c X -> null).
- Related: DynamicKnowledgeItem#getChange (tl-core l. 317-341) creates an ItemUpdate for a flex-only change without the key attributes, although AssociationStorageDescriptor#checkKeyAttributes says key attributes are always delivered. Declaring the container column a key attribute therefore does not silence flex updates. Analyse: trifft für das Commit-Ereignis nicht zu, siehe Lösung.
Proposal
- suggested In InlineCollectionStorage#getPartId, for referenceColumn == null, return the definition id only when the row has a non-null container column, as the polymorphic case does.
- suggested Or drop the error in KBChangeAnalzyer#analyzeTechnicalUpdate: a part without base object is legitimate for a removal.
Done when
- Updating a part of a monomorphic inline-set storage logs no error; a test that fails today.
The application filters the message in its log configuration until a release has the fix.
Lösung
- InlineCollectionStorage#getPartId(Map) liefert ohne reference-column die ID der Attributdefinition nur noch, wenn die Zeile eine (nicht-leere) Container-Spalte enthält. Eine Zeile speichert nur dann einen Wert der Referenz; ohne Container (Spalte nicht im Event oder null) gibt es auch keinen Part. Das entspricht dem polymorphen Fall, in dem die Referenz-Spalte diese Rolle übernimmt. Die Prüfung in KBChangeAnalzyer#analyzeTechnicalUpdate bleibt erhalten, sie erkennt weiterhin inkonsistente Zeilen (Referenz-Spalte gesetzt, Container leer). Betroffen war neben inline-set-storage auch inline-list-storage (gleiche Basisklasse).
- Der Vertrag von AssociationStorageDescriptor#getPartId(Map) ist dokumentiert: null, wenn die Zeile keinen Wert für ein Attribut speichert.
- Flex-only-Änderungen: Die unter "Related" vermutete Lücke besteht für das Commit-Ereignis nicht. Ein Flex-Schreibzugriff legt über DynamicKnowledgeItem#getDataObjectForWrite -> internalTouch immer die lokalen Zeilenwerte an, daher liefert DBKnowledgeItem#getChange auch bei einer reinen Flex-Änderung ein ItemUpdate mit den Schlüsselspalten. TestKeyAttributes#testKeyAttributeInFlexOnlyUpdateEvent sichert das ab; am Code war nichts zu ändern.
- Weiterer Fehler in derselben Methode, hier mit behoben: KBChangeAnalzyer#analyzeTechnicalUpdate(..., ItemUpdate) übergab eine leere Menge als "im Commit erzeugte/gelöschte Objekte", während die Pfade für Erzeugung und Löschung die echten Mengen übergeben. Folge: Wird der Container eines Parts im selben Commit gelöscht, ohne dass der Part mitgelöscht wird (Container-Spalte wird nur geleert), schlägt der Commit mit DeletedObjectAccess ... locally deleted fehl; wird ein Part in einen im selben Commit erzeugten Container verschoben, schlägt er mit WrapperRuntimeException: Target object is deleted fehl. analyzeUpdates() übergibt jetzt die Vereinigung der erzeugten und gelöschten Objekt-IDs; für diese Objekte wird die Erzeugung bzw. Löschung statt eines Updates gemeldet.
- Tests in TestTLObjectChangeSet an PreloadTest#compositeSet (monomorpher inline-set-storage): Änderung einer Zeilen-Spalte und einer Flex-Eigenschaft eines Parts protokolliert keinen Fehler und das Change-Set enthält nur die Änderung des Parts; das Entfernen eines Parts wird als Änderung des Containers gemeldet; das Löschen des Containers meldet nur dessen Löschung; das Verschieben eines Parts in einen neu erzeugten Container meldet dessen Erzeugung und die Änderung des Quell-Containers.