Major
#27216
Attribute annotation "fallback value" as replacement in case of empty value
Aktuell können für Attribute Default-Werte konfiguriert werden. Diese Werte werden bei Objektanlage in das Attribut gesetzt und gespeichert. Die Werte können später durch den Nutzer bearbeitet werden. Bei dem Wert ist aber nicht mehr erkennbar, ob der Nutzer den Wert explizit eingegeben hat oder ob der Default-Wert beibehalten wurde. Wird der Defaultwert aus dem Kontext berechnet, so gilt immer der Wert bei Objektanlage. Ändert sich der Kontext und würde die Defaultwertberechnung später einen anderen Wert berechnen, hat das keinen Einfluss mehr auf den Default-Wert.
Verbesserung
Gewünscht ist eine Attribut Annotation für einen "Ersatzwert", den das Attribut annehmen soll, wenn kein Wert explizit gesetzt wurde. Der Ersatzwert soll dynamisch sein und sich wie ein berechnetes Attribut ändern können, solange bis ein expliziter Wert in dem Attribut gespeichert wurde.
In der Frontend-Präsentation muss erkennbar sein, ob es sich bei dem angezeigten Wert um den tatsächlichen Wert, oder um den Ersatzwert handelt. Bei Text-Feldern im Edit-Modus soll ein Ersatzwert als Platzhalter-Wert (grau im Eingabefeld) angezeigt werden.
Die Schnittstelle getValue() soll immer den Wert (entweder den explizit gesetzten oder den Ersatzwert) liefern, so dass von dem Wert abhängige Berechnungen keine Unterschied zwischen Wert und Ersatzwert machen müssen.
Wenn in dem Attribut ein expliziter Wert gesetzt wurde, soll es möglich sein, diesen wieder auf den Ersatzwert zurückzusetzen. An der GUI kann dies durch Löschen des dargestellten Wertes geschehen, im Code durch Setzen des Wertes "null".
Hintergrund
Anwendungsfälle für eine solche Funktion sind Attribute die, wenn leer, als wertgleich mit anderen Attributen oder einer Berechnung betrachtet werden sollen.
So ist beispielsweise ein Ist-Termin automatisch gleich dem Plan-Termin, wenn kein Abweichender Wert gepflegt wurde: So eine Funktion ist jetzt entweder umsetzbar durch explizite (redundante) Weichen in jeder Abfrage (wenn null, dann nimm den anderen Wert)... ...oder durch Modellierung des Ist-Termins als Pflichtfeld und impliziter Initialisierung des Wertes bei der Objektanlage. Werden bei der Objektanlage die Eingabefelder für Ist-Termine allerdings angezeigt (z.B. bei tabellarischer Pflege), würde der Nutzer hierdurch zu einer Eingabe gezwungen.
Eine Deklaration dieses Verhaltens im Modell, könnte die UI - Logik extrem vereinfachen.
Anwendung
Es gibt eine neue Speichervorschrift "Attribut mit Rückfallwert", mit der man ein Attribut erzeugen kann, das einen solchen Ersatzwert bei nicht gesetztem Wert definiert.
Ein Attribut mit Rückfallwert referenziert in seiner Speichervorschrift zwei andere Attribute desselben Typs: Eines, das einen explizit gesetzten Wert speichert (das Speicherattribut) und eines, dass den Ersatzwert liefert (das Ersatzwertattribut). Das "Attribut mit Rückfallwert" verhält sich solange kein expliziter Wert gesetzt ist (solange das Speicher-Attribut keinen Wert gesetzt hat) wie ein berechnetes Attribut, dass den Ersatzwert aus dem referenzierten Attribut liefert. Anders als bei einem berechneten Attribut, kann aber ein (expliziter) Wert in dem Attribut gespeichert werden. Die Speicherung erfolgt dann transparent für den Nutzer in dem Speicherattribut. Sowohl das Speicherattribut als auch das Ersatzwertattribut können i.d.R. an der GUI versteckt werden. Nur wenn die Applikationslogik explizit wissen will, ob ein expliziter Wert gesetzt ist, können diese beiden referenzierten Attribute abgefragt werden.
Code-Migration
Die API von com.top_logic.element.meta.form.FieldProvider hat sich geändert. Statt
public FormMember getFormField(EditContext editContext, String fieldName)
muss jetzt
public FormMember createFormField(EditContext editContext, String fieldName)
überschrieben werden. Der FieldProvider ist jetzt auch für den Initialwert eines Formularfeldes zuständig, siehe com.top_logic.element.meta.form.AbstractFieldProvider.initValue(EditContext, FormMember)
Test
- /com.top_logic.demo/src/test/java/test/com/top_logic/demo/scripted/model/attribute/TestFallbackAttribute.script.xml
- Demo-Sicht: Technisches Demo > Komponenten > Ersatzwerte