enhancement
major
minor
defect
critical
major
minor
minor
#30205
React-Tabelle mit Row-Edit: Spalte auf ein abgeleitetes Attribut ist editierbar, Speichern scheitert
Problem
In einer <table row-edit="ALL"> ist eine Attributspalte auf ein abgeleitetes Attribut (Query-Attribut, <query> im Modell) editierbar. Beim Speichern kommt „Problem setting attribute value“.
Version: 8.0.0-alpha12, React-View-Layer (tl-layout-view/tl-layout-react).
Reproduktion (Prime)
Reifegradtabelle im Statusbericht (prime/project/status-report.view.xml), Spalten MaturityRating#suggestion und #sources als <column attribute="..."/>:
- Bearbeiten: Beide Zellen sind Eingabefelder.
- Wert ändern, Speichern: Fehler „Problem setting attribute value“.
Prime nutzt dafür computed-columns, also nur lesend.
Erwartetes Verhalten
Abgeleitete Attribute sind in Row-Edit-Tabellen nur lesbar, wie in Formularen.
Dasselbe gilt für die dynamische Sichtbarkeit eines Attributs (<dynamic-visibility>, TLDynamicVisibility): Im Formular berechnet sie den Modus eines Feldes (verborgen, nur lesbar, deaktiviert, editierbar, Pflicht) aus den Werten des Objekts und folgt dessen Änderungen. In Tabellen wurde sie bisher ignoriert. Außerdem wurde ein durch die dynamische Sichtbarkeit verpflichtendes Attribut (Modus mandatory) auch im Formular nur als Pflichtfeld markiert, ein leerer Wert aber beim Speichern nicht abgelehnt.
Lösung
- Statischer Modus: Ob eine Tabellenzelle eines Attributs editierbar ist, entscheidet wie im Formular das Modell: Ein abgeleitetes oder als nicht editierbar annotiertes Attribut ist in jeder Attributspalte nur lesbar, egal ob die Spalte deklariert (<column attribute="..."/>) oder von der Tabelle abgeleitet ist. In neuen Zeilen gilt die Sichtbarkeit beim Anlegen (create-visibility). Die Teile einer nicht editierbaren Komposition werden im Dialog nur angezeigt.
- Dynamischer Modus in Zellen: Die dynamische Sichtbarkeit eines Attributs gilt auch in Tabellenzellen. In einer bearbeiteten Zeile wird der Modus einer Zelle für das Objekt ihrer Zeile berechnet und neu berechnet, sobald sich in derselben Zeile ein Wert ändert, von dem er abhängt: Die Zelle ist editierbar, nur lesbar, ein inaktives Eingabefeld oder als Pflichtfeld markiert. Der Modus hidden zeigt eine leere Zelle – in bearbeiteten wie in nur angezeigten Zeilen; die Spalte bleibt, andere Zeilen zeigen ihren Wert. Ein verborgener Wert geht auch nicht in Sortierung, Filter, Suche und Export ein.
- Dynamische Pflichtfelder werden geprüft: Liefert die dynamische Sichtbarkeit mandatory, ist ein leerer Wert ein Fehler, der am Feld bzw. an der Zelle angezeigt wird und das Speichern verhindert – im Formular wie in der Tabelle. Jeder andere Modus außer default hebt die Pflicht auf; default behält die Pflicht des Attributs.
- Technisch: AttributeModeTracker ist von der Form gelöst (AttributeChanges: im Formular die Feldänderungen der Form, in der Tabelle die Wertänderungen der Zeile in der RowSetEditSession). AttributeCellEditing nutzt dieselbe Modusberechnung wie das Formularfeld, ColumnProviderService.attributeValue dieselbe Sichtbarkeitsregel für angezeigte Zellen. Die Pflichtprüfung erfolgt im FormValidationModel (DynamicMandatoryConstraintCheck). Die Regeln je Modus liegen an einer Stelle (FormVisibility.isVisible(boolean), FormVisibility.isMandatory(boolean), DynamicVisibility).
Migration
Die Klasse DynamicVisibility liegt jetzt im Paket com.top_logic.model.annotate (Modul tl-core) statt in com.top_logic.layout.view.form. Java-Code, der sie verwendet, muss den Import anpassen:
import com.top_logic.model.annotate.DynamicVisibility;
Verhaltensänderung: Ein Attribut, dessen dynamische Sichtbarkeit mandatory liefert, verhindert jetzt mit leerem Wert das Speichern eines React-Formulars oder einer Row-Edit-Tabelle. Bei read-only, disabled, hidden oder editable wird ein im Modell als Pflicht deklariertes Attribut dagegen nicht mehr als Pflicht geprüft.