Table of Contents

ListView

Note

Dieses Control funktioniert nur im Mobile-Client. Im Java-Client wird das Control nicht angezeigt.

ListView

ListView Template Editor

Der ListView Template Editor bietet die Möglichkeit, das HTML/CSS Template für ListItems sprachabhängig zu definieren. Dabei können Template DataSources definiert werden, auf welche aus dem HTML heraus mittels Template Variablen verwiesen wird. So können sehr einfach Businessdaten ins HTML eingebettet und formatiert werden.

Der Editor kann im Property-Grid über das Property Template geöffnet werden.

Template Editor

Allgemein

Das HTML und CSS eines ListItems kann, wenn gewünscht, für jede Sprache einzeln definiert werden. Ist für eine Sprache kein Template definiert, wird auf Deutsch zurückgegriffen.

Button Validate

Über diesen Button können die im HTML eingebetteten Template Variablen und Template MLKeys überprüft werden. Es werden folgende Fälle geprüft:

  • Ist der Template MLKey parsebar und ist der MLKey-Name gültig?
  • Ist die Template Variable parsebar?
  • Passt das angegebene Format zum Datentyp?
  • Zeigt die Template Variable auf eine existierende Template DataSource?
  • Ist jeder Template DataSource eine valide DataSource zugeordnet

Template DataSources

Auf der rechten Seite der Registerkarte HTML befindet sich die Liste der definierten Template DataSources. Jede Template DataSource zeigt auf ein Property der der ListView zugeordneten DataSource Collection.

Im Beispiel ist der ListView die cdArticleColl aus dem FSDemo als DataSource zugewiesen. Somit stehen einer Template DataSource alle Properties des cdArticle-Objekts zur Verfügung. Wie im Bild zu sehen, verweist die Template DataSource Price auf das Property decPrice von cdArticle.

Der Name einer Template DataSource muss eindeutig sein. Aus dem HTML kann nun mittels einer Template Variable auf die Template DataSource zugegriffen und der Wert wie gewünscht im HTML formatiert werden.

HTML

Auf der linken Seite der Registerkarte HTML befindet sich der HTML-Codeeditor, in dem das HTML für das ListItem definiert werden kann.

Note

Das benutzerdefinierte HTML wird zur Laufzeit vom HTML Client (Angular) compiliert und optimiert. Grobe Fehler wie z.B. nicht geschlossene Tags oder invalides HTML können zu Anzeigefehlern führen, die unter Umständen auch andere Bereiche des HTML Clients betreffen. ListView Templates sollten vor dem produktiven Einsatz in allen verfügbaren Browsern ausgiebig getestet werden.

Button Use Base

Mit dem Button Use Base kann das HTML Template z.B. nach einem Customizing wieder auf die Basis zurückgesetzt werden.

Button Template Variable

Mit dem Button Template Variable kann eine neue Template Variable erstellt, oder eine bestehende geändert werden.

Button MLKey

Mit dem Button MLKey wird das MLKey-Wörterbuch geöffnet. Dort kann ein neuer Template MLKey erstellt, oder ein bestehender geändert werden.

HTML Aufbau

Der benutzerdefinierte HTML Code wird im HTML Client in ein <div>-Tag mit der CSS-Klasse lvItem verpackt. Es ist also nicht unbedingt nötig, um den eigenen HTML Code ein <div>-Tag als Container zu implementieren.

Der Code aus dem Beispiel sieht im HTML Client z.B. so aus:

<hc-listitem-content _nghost-wvt-c19 class="ng-star-inserted">
    <div _ngcontent-wvt-c19 class="lvItem">
        <img _ngcontent-wvt-c19 src="http://localhost:8080/Dev/NV286_1_ListView40_FSDemo_4.0_user1/FSDempApplication//images/NVNew1.png">
        <span _ngcontent-wvt-c19>Laptop SILBER kostet 1,899.00€</span>
    </div>
</hc-listitem-content>

Das <div>-Tag mit der CSS-Klasse lvItem kann im CSS wie gewünscht angepasst werden, ohne einen eigenen Container oder eine eigene CSS-Klasse verwenden zu müssen.

Placeholder

Die Konstante %FILESURL% kann im HTML verwendet werden, um zur Laufzeit die Broker-Url zu erhalten. Dadurch können z.B. in <img>-Tags auf Bilder, welche als Ressourcen im Framework Studio hinterlegt wurden, zugegriffen werden.

Dynamische Bilder können über eine binäre Template-Variable realisiert werden. (siehe Abschnitt Images im ListViewItem)

Template Variablen

Über den Button Template Variable öffnet sich der Template Variable Editor. Befindet sich der Cursor im Codeeditor auf einer bestehenden Template Variable, wird diese im Editor vorselektiert.

Template Variable

Auf der linken Seite werden alle zur Verfügung stehenden Template DataSources aufgelistet. Auf der rechten Seite kann für die Template Variable ein passendes Format und/oder FormatPattern definiert werden.

Durch die Aufteilung in Template DataSources und Template Variablen werden die Daten und deren Formatierung im HTML strikt voneinander getrennt. Beispielsweise könnte der Wert einer Template DataSource im englischen HTML anders formatiert werden als im deutschen HTML.

Template Variablen werden im HTML-Code wie folgt angezeigt:

{{ ds:[Name]|f:[Format]|fp:[FormatPattern] }}

Dabei verweist [Name] auf den Namen der zugehörigen Template DataSource, [Format] und [FormatPattern] definieren das im Template Variable Editor ausgewählte Format und FormatPattern.

PreviewValue ist derjenige Wert, der für die Template Variable angezeigt wird, wenn das Template auf der Registerkarte Preview zur Vorschau gerendert wird. Der Wert wird zur Laufzeit ignoriert.

Note

Es wird empfohlen, Template Variablen und Template MLKeys immer über den jeweiligen Editor zu ändern, um Syntaxfehler zu vermeiden.

Template MLKey

Template MLKeys werden im HTML-Code wie folgt angezeigt:

{{ mlkey:[MLKey-Name] }}

Dabei verweist [MLKey-Name] auf den Namen des zugehörigen MLKeys. Zum Beispiel "SYS_OK".

CSS

Das benutzerdefinierte HTML kann mittels CSS im CSS-Codeeditor auf der Registerkarte CSS beliebig angepasst werden.

Beispiel:

.lvltem {
    display: flex;
    flex-direction: row;
    align-items: center;
    background-color: azure;
    border-radius: 0.3rem;
    border: 0.1rem solid gray;
    padding: 0.3rem;
    padding-right: 2.8rem;
}
.lvItem[lvdisabled] {
    background-color: #cccccc;
}
img {
    display: inline;
}

Wie im Kapitel HTML beschrieben, wird ein ListItem mit einem <div>-Tag der CSS-Klasse lvItem umgeben. Im CSS-Code kann somit über den CSS-Selector .lvItem auf das Element zugegriffen werden.

Globales CSS für ListViewItems

Es ergiebt durchaus Sinn, grundelegende Styles von ListViewItems global zu definieren. ListViewItems könnten z.B. eine einheitliche Border oder Hintergrundfarbe besitzen. Für diesen Zweck existiert der globale CSS Editor für ListViewItems am FSGeneral.Controls.BaseControl.

BaseControl

Über das Property ListVIewItem unter der Kategorie Global CSS öffnet sich der CSS Editor.

GlobalCssEditor

Die globalen Styles können je Sprache definiert werden. Ist für eine Sprache kein CSS definiert, wird auf Deutsch zurückgegriffen. Alle globalen Styles werden vom individuellen CSS am Control überschrieben, wie das folgende Beispiel zeigt:

Globales CSS:

.lvItem {
    color: white;
    background-color: green;
}

CSS an ListView LV1:

.lvItem {
    background-color: blue;
}

Die global definierte grüne Hintergrundfarbe wird im CSS von ListView LV1 überschrieben. So haben alle ListViewItems von LV1 eine blaue Hintergrundfarbe und weißen Text.

REM anstatt Pixel

Im CSS sollten Größenangaben ausschließlich mit rem angegeben werden. Der HTML Client skaliert die gesamte Anzeige anhand der vom Browser vorgegebenen Schriftgröße. Im HTML Client wird global für das HTML- und das BODY-Tag folgendes definiert:

html {
    font-size: 62.5%;
}

body { 
    font-size: 1.4rem;
}

In Desktop-Browsern wie z.B. Chrome, Firefox oder Edge ist der Standardwert der Schriftgröße 16px. 1rem ist per Definition genauso groß wie die Schriftgröße des HTML-Tags, also im Standardfall erst einmal 16px. Setzt man nun die font-size des HTML-Tags auf 62.5%, ergibt sich eine Schriftgröße von 10px, womit 1rem nun ebenfalls 10px groß ist.

Da meist in Desktop-Browsern entwickelt und getestet wird, ergibt diese Anpassung Sinn, da es viel einfacher zu verstehen ist, mit Faktor 10, als mit Faktor 16 zu arbeiten. 0.5rem sind 5px, 5rem sind 50px usw.

Deshalb wird im BODY-Tag auch die Schriftgröße auf 1.4rem gesetzt, was letztenendes 14px sind. Dies spiegelt die Standardschriftgröße des HTML Clients wieder.

Probleme können nun enstehen, wenn REM- und Pixelwerte gemischt werden!

Ein Beispiel:

.tpl .remClass {
    width: 10rem;
}

.tpl .pxClass {
    width: 100px;
}

Nehmen wir an, es gibt zwei HTML-Elemente im Template mit den Klassen remClass und pxClass. Liefert der Browser eine Standardgröße von 16px, besteht kein Problem, die beiden Elemente sind exakt gleich groß, da 65.5% von 16px = 10px. Damit sind 10rem exakt 100px.

Anders sieht es aber aus, wenn z.B. ein mobiler Browser eine Standardschriftgröße von 14px liefert. 62.5% von 14px = 8.75px, damit sind 10rem exakt 87.5px und die beiden HTML-Elemente sind plötzlich unterschiedlich groß. Dies kann je nach Gerät und verwendetem Browser zu unvorhersehbaren Skalierungsfehlern führen.

Tip

Es wird ausdrücklich empfohlen, im HTML/CSS des ListItems rem als Größeneinheit zu verwenden.

IsEditable

Im CSS kann auch ein Style für deaktivierte ListItems in einem nicht editierbaren ListView hinterlegt werden. Wird ein ListView im Designer oder per Action auf isEditable = false gesetzt, so wird am <div>-Tag lvItem das HTML-Attribut lvdisabled hinzugefügt:

<hc-listitem-content _nghost-wvt-c19 class="ng-star-inserted">
    <div _ngcontent-wvt-c19 class="lvItem" lvdisabled="true">
        [...]
    </div>
</hc-listitem-content>

Im CSS-Code kann über den Attribute-Selector .lvItem[lvdisabled] genau dieser Fall abgefragt werden. Im Beispiel wird der Hintergrund des ListItems auf grau (#cccccc) gesetzt.

Preview

Template Editor

Wenn der HTML-Code gültig ist, wird auf der Registerkarte "Preview" eine gerenderte Vorschau des Templates angezeigt.

Für die Vorschau werden die PreviewValues für die einzelnen Template Variablen verwendet. Sollte ein PreviewValue nicht gesetzt sein, wird stattdessen der DataSource Name angezeigt. Template MLKeys zeigen den im Wörterbuch hinterlegten Text an.

Fallback für die Standartsprache

Wenn für eine Sprache eines bestimmten HTML-Codes nicht gibt, wird den HTML-Code des Standartsprache (Deutsch) verwendet. Diese Regel wird auch für den CSS-Code anwenden. Anderseits, wenn kein Code auch für die Standardsprache gibt, wird die Meldung TEMPLATE NULL angezeigt.

Images im ListViewItem

ListviewImages

Eine Besonderheit ist das Anzeigen von Bildern in einem ListViewItem mittels <img />, wenn dieses über ein byte[] aus der Datenbank gebunden werden soll. Ein Anwendungsfall wäre z.B. das Anzeigen von Artikelbildern.

Beispiel:

<img class="img" src="data:{{ ds:MimeType }};base64,{{ ds:Image }}" />

Um ein Bild an ein HTML img-Tag zu binden sind zwei Template Variablen notwendig. Das byte[] mit den Bildinformationen alleine reicht abhängig vom genutzten Browser nicht immer aus (siehe Hinweis). Es muss zusätzlich der HTML Mime-Type spezifiziert werden, sodass der Browser weiß, um welches Bildformat es sich handelt.

{{ ds:MimeType }} ist eine Template Variable vom typ FSstring oder string und gibt z.B. den Mime-Type "image/png" oder "image/jpg" zurück.

{{ ds:Image }} ist eine Template Variable vom Type FSByteArray oder byte[]. Binärdaten werden als Base64-String zum Client übertragen. Da das HTML src-Attribut Base64 versteht, ist keine weitere Formatierung der Daten nötig.

Tip

Die Angabe des Mime-Types ist in den meisten Browsern wie Chrome, Firefox, Safari oder Edge (auch auf mobilen Geräten) nicht zwingend nötig. Manche proprietären Browser auf mobilen Geräten haben jedoch Schwierigkeiten, ohne die Angabe des Mime-Types, das Bild korrekt darzustellen. Sollten diese Browser keine Rolle für die Anwendung spielen, kann auch folgendes HTML genutzt werden:

<img class="img" src="data:;base64,{{ ds:Image }}" />

Das Semicolon vor base64 ist ohne die Angabe des Mime-Types zwingend notwendig.