enhancement
major
minor
defect
critical
major
minor
major
#30120
Ebene anzeigen: Optionen eines Zeichenfolgenattributs dürfen keine Anzeigebezeichnungen enthalten
Ein Modellattribut vom Typ „tl.core:String“, dessen Optionen aus <options-by-expression> stammen, wird von der Ansichtsebene (FieldControlService) als Auswahl bearbeitet, deren Optionen über MetaLabelProvider beschriftet werden; bei einer Zeichenkette ist die Beschriftung die Zeichenkette selbst. Es gibt keine Möglichkeit, eine Anzeige-Bezeichnung für einen Optionswert anzuzeigen, die vom gespeicherten Wert abweicht.
Beispiel (Steuerungsanwendung tl-factory): Das Attribut providerType einer Git-Verbindung speichert den Schlüssel eines registrierten Anbietertyps (gitea, git), Optionen factoryGitProviderTypes(). Der Dialog listet „gitea“ / „git“ anstelle von „Gitea“ / „Git-Server (ohne Hosting-Funktionen)“ auf. Der Wert muss der Schlüssel bleiben (es handelt sich um einen Konfigurationsschlüssel einer Registrierung, nicht um eine Modellaufzählung, daher sind tl.core:Enum-Klassifikatoren nicht geeignet).
Vorschlag: eine optionale Label-Funktion für die Optionen eines Attributs, z. B. <options-by-expression function="..." label="value -> ..."/> oder eine separate Annotation <option-label function="value -> ..."/>, die vom Auswahlfeld der Ansichtsebene (und der klassischen Formular-Ebene, wo dies einfach umsetzbar ist) ausgewertet wird, wobei standardmäßig MetaLabelProvider verwendet wird. Die schreibgeschützte Anzeige des Feldes verwendet dieselbe Bezeichnung.
Lösung
Bezeichnungen der Optionsquelle (Standard für die gesamte Anwendung). <options-by-expression> verfügt über die optionale Eigenschaft „option-labels“, einen Bezeichnungsanbieter (In-App-Klassifikator „label-provider“), typischerweise LabelProviderByExpression:
{{{#!xml <options-by-expression function="t -> 'phone', 'portal'"> <option-labels class="com.top_logic.model.search.providers.LabelProviderByExpression" label="key -> switch ($key) { 'email': #('E-mail'@en, 'E-Mail'@de); ... default: $key; }"/> </options-by-expression> }}}
Die Bezeichnungen werden über Generator#getOptionLabels() bereitgestellt und gelten überall dort, wo das Attribut als Auswahl angezeigt wird: im Bearbeitungsfeld, im ausgewählten Wert und in der schreibgeschützten Anzeige eines Feldes der Ansichtsebene (FieldSpec#getOptionLabels()), in der Tabellenspalte des Attributs (sortiert und durchsucht nach den Bezeichnungen) sowie in den klassischen Formularfeldern (StringFieldProvider, LongFieldProvider, FloatFieldProvider). „alphabetic-order“ sortiert nach diesen Bezeichnungen. Die Bilder bleiben die der Optionen.
Überschreiben für ein einzelnes Feld. Der „SelectControlProvider“ eines <field> verfügt ebenfalls über die Eigenschaft „option-labels“; dort angegeben, gelten die Bezeichnungen nur für dieses Feld (auch für einen am Steuerelement konfigurierten Options-Provider ), während Tabellenspalten und andere Formulare die Bezeichnungen der Optionsquelle beibehalten:
{{{#!xml <field attribute="channel"> <input-control class="com.top_logic.layout.view.form.SelectControlProvider"> <option-labels class="com.top_logic.model.search.providers.LabelProviderByExpression" label="key -> switch ($key) { 'email': #('Mail'@en, 'Mail'@de); default: $key; }"/> </input-control> </field> }}}
Sortierung nach Bezeichnung. Jede Sortierung nach der Bezeichnung eines Feldes – „order=“by-label““ im Steuerelement oder die alphabetische Reihenfolge der Quelle – erfolgt anhand der Bezeichnungen, die das Feld tatsächlich anzeigt.
Demo (tl-demo-react): Attribut demo.tickets:Ticket#channel; die Spalte „Channel“ in der Ticketliste zeigt die Modellbezeichnungen an, das Feld „Channel“ im Ticketformular die Kurzbezeichnungen seines Steuerelements.