enhancement
major
minor
defect
critical
major
minor
major
#30131
Ebene anzeigen: Den Fallback von „AttributeWithFallbackStorage“ als Platzhalter für ein Formularfeld anzeigen
Problem
Ein Attribut mit <fallback-storage> (AttributeWithFallbackStorage) zeigt seinen Fallback-Wert in der klassischen Benutzeroberfläche als Platzhalter des Eingabefelds an: „AbstractFieldProvider“ (com.top_logic.element, Zeilen 40–58) ruft „field.setPlaceholder(fallbackValue)“ auf und registriert einen „ValueListener“ für das Fallback-Attribut, sodass der Platzhalter den Änderungen im Formular folgt; „UpdateFallbackDisplay“ fügt die expliziten/Fallback-CSS-Markierungen hinzu.
Ein <field> der React-Ansichtsebene (FieldElement, AttributeFieldControl) führt nichts davon aus. com.top_logic.layout.view und com.top_logic.layout.react verweisen niemals auf StorageWithFallback / AttributeWithFallbackStorage. Das TLObjectOverlay liest das Basisobjekt, dessen Speicher den Fallback-Wert zurückgibt, wenn der explizite Wert leer ist, sodass der Fallback-Wert als tatsächlicher Wert des Feldes erscheint – nicht als Fallback gekennzeichnet und nicht aktualisiert, wenn das Attribut, aus dem er berechnet wird, im selben Formular bearbeitet wird (das Attribut wird nicht abgeleitet, daher wird das Feld nicht nachverfolgt, AttributeFieldModel#isTraced).
Nur <value-input placeholder="..."> verfügt über einen Platzhalter, einen statischen ResKey (ValueInputElement, FieldSpec.setPlaceholder).
Anwendungsfall
Ein Dialog zum Anlegen eines Projekts aus einem Git-Repository verfügt über das Feld „branch“: Ist dieses leer, bedeutet dies den Standard-Branch des ausgewählten Repositorys, der durch ein Skript aus dem Repository-Feld desselben Objekts berechnet wird. Der Benutzer sollte diesen Standardwert („main“) als ausgegrauten Platzhalter sehen, solange das Feld leer ist; bei Änderungen am Repository wird der Wert neu berechnet, ohne dass der Standardwert gespeichert wird.
Vorschlag
Das React-Formularfeld eines Attributs mit Fallback-Speicherung zeigt den Fallback-Wert als Platzhalter an (die Steuerelemente „select“, „text“ und „number“ akzeptieren bereits Platzhalter von ReactFormFieldControl), verfolgt die Attribute, aus denen der Fallback gelesen wird, wie ein abgeleitetes Feld, und berechnet den Platzhalter bei einer Änderung dieser Attribute neu. Der explizite Wert bleibt leer, bis der Benutzer einen Wert eingibt. Dies entspricht dem klassischen Verhalten von ` AbstractFieldProvider`, einschließlich der Fallback-CSS-Markierung.
Lösung
- Die React-Formularfelder basieren auf der Abstraktion „StorageWithFallback “: Verfügt das Attribut über eine solche Speicherung, zeigt und bearbeitet das Feld nur den expliziten Wert; das TLObjectOverlay puffert und liest das Attribut über dessen Speicherung. Ein geleertes Feld speichert nichts, es gilt wieder der Fallback.
- Der geerbte Wert wird mit dem Format- bzw. Label-Provider des Feldes angezeigt und neu berechnet, wenn sich ein Attribut ändert, das seine Berechnung ausliest (FallbackPlaceholder, TracingScope). Je nach Feldtyp: Text, Zahl, Passwort als Platzhalter; Auswahl und Mehrfachauswahl (Aufzählung oder Objekt) mit dem geerbten Wert anstelle des Leertextes; Radio-Buttons mit „Geerbt: …“ bei der Leer-Option; Datum/Uhrzeit als grauer Hinweis; Schieberegler grau an der geerbten Position; Kontrollkästchen/Schalter als Tri-State (unbestimmt = geerbt) mit dem geerbten Wert als Tooltip; Rich-Text- und Code-Editor als Platzhalter.
- Zurück zum geerbten Wert: Solange ein expliziter Wert gesetzt ist, bietet der Feldcontainer eine Schaltfläche „Auf den geerbten Wert zurücksetzen“ an (auch für Feldtypen ohne leeren Zustand).
- CSS-Markierung am Feldcontainer über StorageWithFallback.getCssExplicit()/getCssFallback(); der Container kombiniert sie mit der konfigurierten CSS-Klasse.
- Die MUI-Adapter (com.top_logic.layout.react.mui) zeigen denselben Zustand an.
- Beschrieben im Entwicklerartikel „view-layer/forms“ („Fields with a fallback“). Demo: Ticket#publicStatus (Auswahl aus derselben Liste wie „status“, Fallback-Status).