enhancement
major
major
major
#29813
TL Views: a <tree> does not react to a change of an object it does not display yet, so a node that becomes a child of a shown node does not appear
tl-layout-view 8.0.0-alpha10, TreeElement and its observation of model changes.
Problem
A <tree> whose children are computed by an expression (here: the devices placed in a building part, BuildingDefinition#devices, the backwards reference of Device#location) updates when an object it shows changes, but not when an object it does not show yet changes so that it now belongs under a shown node: a device whose location is set from another view (the device's own tab) does not appear under its part; a device that was placed nowhere and is placed now does not appear either, although its part is displayed. The tree observes the displayed nodes, not the observed-types as a <table> does.
Expected
A tree declaring observed-types re-evaluates the children of its displayed nodes when an object of those types is created, changed or deleted, whether or not the object is displayed yet (as the table re-reads its rows), keeping the expansion and the selection where possible.
Workaround in E-Home
projects/buildings.view.xml: a channel placements holding the locations of all devices of the project is an input of the tree, so that the tree is rebuilt (keeping its expanded nodes) whenever a placement changes.
Lösung
Ein erzeugtes oder geändertes Objekt eines in observed-types genannten Typs, das der Baum noch nicht anzeigt, wird über die parents-Funktion des Baums eingeordnet: Der Knoten des Objekts, das es jetzt hält, wird im angezeigten Baum gesucht und seine Kindliste neu abgeglichen (Aufklappzustand und Auswahl bleiben erhalten). Ist dieser Knoten noch nicht berechnet oder liefert parents nichts, passiert nichts – die Kindliste wird berechnet, wenn der Knoten geöffnet wird.
Ein Abgleich des gesamten aufgeklappten Baums findet nicht mehr statt, auch nicht beim Erzeugen eines Objekts (bisher wurde bei jedem Erzeugen eines beobachteten Typs der ganze berechnete Baum abgeglichen, was bei großen Datenmengen nicht tragbar ist). Gelöschte, nicht angezeigte Objekte verändern keine angezeigte Kindliste und werden nicht behandelt.
Da observed-types ohne parents wirkungslos wäre, ist parents per Konfigurations-Constraint Pflicht, sobald observed-types einen Typ nennt (neuer allgemeiner Constraint MandatoryIfSet in com.top_logic.basic.config.constraint.impl, Gegenstück zu MandatoryIfUnset). Der Constraint wird im Konfigurationseditor am Feld angezeigt; beim Laden einer View prüft der ViewLoader die Constraints, so dass ein <tree> mit observed-types ohne parents mit Fehlermeldung nicht lädt.
Die Baum-Demo (tl-demo-react, Demos → Tree Demo) erhält das Kommando "Attach a free ticket" ("Freies Ticket anhängen"), das einem Ticket des Projekts ohne Meilenstein den gewählten Meilenstein zuweist: Das Ticket hat noch keinen Knoten und erscheint nach der Änderung unter dem geöffneten Meilenstein und wird ausgewählt.