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

8.0.0-alpha4
TopLogic Release

2026-05-21

enhancement

major
#28388
ResourceProvider über Modell-Annotation
#29236
ChangeLog: Filterung auf Kompositionsbaum eines Root-Objekts
#29267
TreeLayout: 2D-Sub-Grid für Knoten mit hohem Fan-out
minor
#29249
Fehlgeschlagene Überprüfung sollte nicht als "Interner Fehler" gemeldet werden
#29262
Anwendungsindividueller Browser-Tab-Titel über Komponentenkanal
#29286
Migrate Java source encoding from ISO-8859-1 to UTF-8.

defect

major
#29257
Fehlender Objekttyp in transienten Revisionen
minor
#29284
Flow-Diagram: Font-Metrik passt nicht - Texte fließen über ihren Rahmen hinaus
enhancement

major

#29236

ChangeLog: Filterung auf Kompositionsbaum eines Root-Objekts

PersistencyLayer

Motivation

TopLogic serialisiert alle Änderungen in einer linearen Revisionsfolge. Änderungen unterschiedlicher Benutzer und unterschiedlicher Objekte werden im globalen Zeitstrahl vermischt. Für eine View auf einen komplexen Objektbaum (Root-Objekt R plus alle Objekte seines Kompositionsbaums) interessieren den Benutzer nicht die Änderungen an einzelnen Objekten im globalen Timeline, sondern nur jene Änderungen, die den angezeigten Unterbaum betreffen. Aus dem gleichen Fokus heraus ergeben sich Folgeanforderungen: gezielt eine Änderung oder eine Kette von Änderungen zurücknehmen, den aktiv wirksamen Stand eines Unterbaums auf einen früheren Zustand zurücksetzen, und für die UI passende Undo-/Redo-Handler bereitstellen.

Umfang

ChangeLog-Filter

  • ChangeFilter als Interface für selektive ChangeLogBuilder-Ergebnisse; ChangeLogBuilder.setFilter(...) als minimale Anbindung.
  • SubtreeFilter(root, includeSubtree) akzeptiert nur Änderungen, deren betroffenes Objekt zum Zeitpunkt der Revision im Kompositionsunterbaum von root lag (bzw. nur das Root selbst, wenn includeSubtree=false). adjustStartRev klammert die Suche an die Erzeugungsrevision von root. Ergebnisse werden pro (revision, unversionierte Identität) memoisiert; Pfad-Präfixe werden zwischen Geschwistern geteilt.
  • ChangeSetAnalyzer wird aus ChangeLogBuilder als öffentliche Klasse ausgelagert, damit auch Nicht-UI-Code die Konvertierung KB-Event → Modell-ChangeSet nutzen kann.

Rollback- und Undo/Redo-Utility

com.top_logic.element.changelog.ChangeSetReverter bietet:

  • revertAll(Collection) — Inverses in absteigender Revisionsreihenfolge innerhalb der Caller-Transaktion, ohne eigenen Commit.
  • revertAll(kb, Collection, message) — transaktionaler Wrapper.
  • revertSubtreeTo(root, targetRevision, message) — rollt den Unterbaum von root auf den Stand bei targetRevision zurück. Liest den Event-Stream direkt über kb.getDiffReader, ohne die UI-Pair-Dedup; alle subtree-relevanten Änderungen werden rückgängig gemacht, auch Reverts im Zeitfenster.
  • findUndoCandidate(root, windowSize, includeSubtree) / findRedoCandidate(...) — lokalisieren die jüngste echte Änderung bzw. den jüngsten noch nicht redone-ten Revert. Der Redo-Kandidat ist nur valide, wenn zwischen dem Kandidaten und HEAD keine reguläre Vorwärts-Änderung liegt; anderenfalls TopLogicException(ERROR_CANNOT_REDO_CHAIN_BROKEN).
  • undoLast / redoLast — bequeme Wrapper, die den Kandidaten suchen, eine Transaktion mit der korrekten Revert-Message öffnen und committen.

CommandHandler

  • UndoCommandHandler und RedoCommandHandler (@InApp) analog zu RevertCommandHandler. Target-Modell ist der Unterbaum-Root (null = global). Konfigurationsoptionen: ** check-conflicts (Bool, Default true) — Konflikt-Bestätigungsdialog. ** window-size (Int, Default 50) — obere Grenze für das inspizierte Fenster der Änderungshistorie (bounds Suche, nicht Ergebnis). ** include-subtree (Bool, Default true) — Unterbaum oder nur Objekt selbst.

TL-Script-Integration

Im Modul tl-model-search (Package com.top_logic.model.search.expr.config.operations.changelog):

  • changeLog([obj [, maxEntries [, includeSubtree]]]) — liefert die Änderungen als Liste von tl.changelog:ChangeSet. Ohne Objekt bzw. bei null: globale Änderungshistorie.
  • revertChanges(changes) — nimmt die übergebenen ChangeSets innerhalb der aktiven Transaktion zurück (kein eigenes Commit).

Explizit nicht als TL-Script-Funktion abgebildet: undo / redo. Grund: Ein Script läuft in der umgebenden Operations-Transaktion und kann deren Commit-Message nicht überschreiben, wodurch das resultierende Commit nicht als Revert erkennbar wäre. Diese Operationen sind daher ausschließlich als CommandHandler verfügbar.

Modell-Erweiterung

Am tl.changelog:ChangeSet-Typ zwei derived Boolean-Properties (Migration Ticket_29236_Added_isRevert_isRedo):

  • isRevert — true, wenn der ChangeSet selbst eine andere Änderung zurücknimmt.
  • isRedo — true, wenn der ChangeSet eine zurückgenommene Änderung wiederherstellt.

Beide werden aus den vorhandenen Default-Methoden ChangeSet.isRevert() / isRedo() berechnet und sind dadurch direkt aus TL-Script auf dem Attribut zugreifbar.

Dialog-Anbindung

ChangeLogListModelBuilder.supportsModel akzeptiert zusätzlich TLObject; bei nicht-null-Modell wird ein SubtreeFilter angehängt. Der globale Opener des Meine letzten Änderungen-Dialogs im User-Menu wurde so konfiguriert, dass das Modell der enthaltenen Table explizit auf null gesetzt wird (<target><null/></target> + targetComponent), damit der Dialog beim Aufruf aus dem User-Menu unabhängig vom Aufrufkontext die ungefilterte Historie zeigt. Eine Variante mit Modell-Kanal für subtree-spezifische Views ist dadurch ohne weitere Core-Änderungen möglich.

Nicht in diesem Ticket

  • Einbindung konkreter Undo/Redo-Buttons in existierende Layouts.
  • Konfigurierbare Betroffenheit über einzelne Kompositionsreferenzen (Opt-in/Opt-out nicht-komponierter Referenzen).
  • Persistenter Index (revision, ancestorId) zur schnelleren Subtree-Abfrage. Memoisierung im Filter reicht für typische Fenster.

Tests

  • test.com.top_logic.element.changelog.TestSubtreeChangeLog — 5 Testfälle für Subtree-Filter.
  • test.com.top_logic.element.changelog.TestChangeSetReverter — 10 Testfälle für revertSubtreeTo, undoLast, redoLast inklusive zweier aufeinanderfolgender Undos, Redo-Wiederherstellung, Redo-No-op, Subtree-Isolation und der Kette ch1, ch2, undo, ch3, ch4, undo, redo, redo (die den gebrochenen Redo-Stack über TopLogicException(ERROR_CANNOT_REDO_CHAIN_BROKEN) erkennt).
  • 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