Table of Contents

Listenansicht und Auswahlansicht

Mit einer Listenansicht kann eine Reihe von Datensätzen gleichzeitig dargestellt werden. Sie kann dazu verwendet werden, einen Datensatz auszuwählen und dann entweder zurück oder weiter nach vorn zu navigieren. Auch eine Auswahl von mehreren Datensätzen, wie z.B. die erledigten Arbeitsschritte an einem Auftrag, ist möglich und wird durch das Aktivieren oder Deaktivieren einer Checkbox an den Datensätzen realisiert.

Jeder Datensatz wird in der Listenansicht in einer Zelle im Überblick dargestellt. Typischerweise gibt es hier einige Kurztexte, die den Datensatz beschreiben, sowie optional ein Vorschaubild und eine farbliche Markierung. Die Positionen und das Layout der einzelnen Elemente kann über eine Listenvorlage individualisiert werden.

Listenansichten sind an eine Klasse gebunden und können durchsucht, sortiert und gefiltert werden. Um eine Listenansicht zu verwenden, muss sie im Designer per Drag & Drop in einen Schritt gezogen werden. Hier gibt es zwei verschiedene Ansichten: Listenansichten haben einen Aktivator und können den ausgewählten Datensatz z.B. in einer Detailansicht anzeigen. Auswahlansichten verhalten sich genau wie Listenansichten, nur dass sie stattdessen zurück navigieren und den ausgewählten Datensatz z.B. in ein Referenzfeld schreiben.

Listenansicht

Abbildung 1 - Eine Listenansicht und eine Auswahlansicht nebeneinander. Die Listenansicht besitzt einen Aktivator, der ausgeführt wird, sobald der Nutzer auf einen Datensatz tippt. Bei der Auswahlansicht navigiert die App einen Schritt zurück und benötigt keinen weiterführenden Aktivator.

Eigenschaften

Eigenschaft Typ Erklärung
Name Text Der eindeutige Name der Ansicht.
Bindung Dropdown Auswahl der Klasse, auf die diese Liste gebunden ist. Schreibgeschützt, falls die Bindung sich von einem vorherigen Schritt ableitet.
Aktivator Dropdown Auswahl eines Aktivators, der bei Berührung eines Datensatzes ausgelöst wird. Wird ausgeblendet, falls es bereits einen Übergang von dieser Liste zu einem Schritt gibt.
Constraint Text WHERE-Klausel für die mobile Gerätedatenbank, um die Datenmenge der Liste filtern. Wird nicht bei Auswahlansichten angezeigt.

Bindung

Jede Listenansicht muss an eine Klasse gebunden werden. Dies bildet die Grundlage, um zu entscheiden, welche Datensätze in der Liste angezeigt werden sollen. Standardmäßig werden alle Datensätze der gebundenen Klasse angezeigt, außer die Liste wird zusätzlich gefiltert. Über den Inspektor auf der rechten Seite lässt sich die Bindung einer Liste auswählen.

Ist noch keine Bindung für die gewünschte Klasse vorhanden, muss zunächst eine neue erstellt werden. Hierfür gibt es mehrere Möglichkeiten. Entweder erstellt man in der Bibliothek im Tab Bindungen eine neue Bindung und weist sie im zweiten Schritt an der Listenansicht zu. Alternativ kann man den speziellen Eintrag Neu... im Dropdown für die Bindung verwenden. Dann wird eine neue Bindung erstellt und sofort zugewiesen. Es ist auch möglich, über das Rechtsklick-Kontextmenü der Liste den Eintrag Bindung bearbeiten zu wählen. Hier würde ebenfalls eine neue Bindung angelegt werden, falls es noch keine gibt.

Tipp

Es kann vorkommen, dass das Dropdown für die Bindung schreibgeschützt ist. Dann hat der Designer automatisch eine Bindung für diese Listenansicht vom vorigen Schritten abgeleitet. Beispielsweise wird die Bindung eines Listenattributs auf einer Detailansicht automatisch für die Listenansicht übernommen, sofern das Attribut mit dem Listenschritt verbunden wurde.

Oberfläche einer Zelle

Die grafische Oberfläche jeder einzelnen Zelle in der Listenansicht ist variabel und kann mit wenig Aufwand an der gebundenen Klasse oder mit etwas mehr Aufwand an der Listenvorlage konfiguriert werden.

Für jede Zelle rendert pit - Mobile standardmäßig ein Vorschaubild (Thumbnail), eine Überschrift (GetName) und einen Untertitel (GetSubName). Möchte man dieses Layout nicht verändern, reicht es aus, diese drei Eigenschaften an der gebundenen Klasse zu hinterlegen. Mehr Informationen zu Klassen gibt es hier. Nachfolgend sieht man eine Listenvorlage mit Markierungen, Vorschaubild und vier Texten.

ListTemplate

Möchte man die Anzahl und Position der Texte und Bilder variieren, muss die Vorlage der Liste überschrieben werden. Über die dynamische Eigenschaft style vom Typ Text kann die Höhe der Zelle in Pixeln vorgegeben werden:

{
    "rowHeight": 60
}

Alle weiteren Einstellungen werden über die dynamische Eigenschaft template vom Typ Text vorgegeben. Sie besteht aus den Eigenschaften childTemplates und labelFormats.

childTemplates ist ein Array von Definitionen für die Steuerelemente, die in der Listenzelle angezeigt werden sollen. type gibt hierbei die Art des Steuerelements vor. Ti.UI.Label zeigt einen Text und Ti.UI.ImageView ein Bild an. bindId zeigt bei Texten auf eine der unter labelFormats definierten Textformatierungen. Für Bilder kann die bindId auf das Vorschaubild der Klasse (thumbImage), auf eine Checkbox für eine Mehrfachauswahl (selectCheckBox:Attributname) oder auf Markierungen (markImage) gesetzt werden. markImagezeigt dabei auf die erste Definition einer Markierung während markImage:ID auf die Markierung mit der angegebenen ID verweist. properties enthält Angaben zur Positionierung und Größe des Steuerelements sowie zur Schriftgröße, -art und -farbe.

Unter labelFormats werden Textformatierungen definiert, die von den Text-Steuerelementen zur Anzeige verwendet werden können. Die Syntax ist dabei die gleiche wie bei der GetName und GetSubName-Funktion an Klassen. Nachfolgend ein Beispiel für die template-Eigenschaft:

{
    "childTemplates": [
        {
            "type": "Ti.UI.Label",
            "bindId": "title",
            "properties": {
                "left": 60,
                "top": 3,
                "height": 20,
                "font": {
                    "fontWeight": "bold",
                    "fontFamily": "Helvetica",
                    "fontSize": 13
                },
                "color": "#555"
            }
        },
        {
            "type": "Ti.UI.Label",
            "bindId": "title2",
            "properties": {
                "left": 60,
                "top": 20,
                "height": 20,
                "font": {
                    "fontFamily": "Helvetica",
                    "fontSize": 13
                },
                "color": "#555"
            }
        },
        {
            "type": "Ti.UI.ImageView",
            "bindId": "thumbImage",
            "properties": {
                "left": 5,
                "bottom": 3,
                "width": 50,
                "height": 50
            }
        }
    ],
    "labelFormats": {
        "title": "%%StartTime%% %%ref_VT_Project.description_ML%%",
        "title2": "%%ref_kind_of_inspection%%"
    }
}

Datensätze filtern

In pit - Mobile werden Filter automatisch vom System eingebunden, ohne dass man sich darum kümmern muss. Beispielsweise werden nicht alle Dokumente sondern nur solche, die zum Auftrag gehören, angezeigt, wenn das Eingabefeld EL_Documents mit der Listenansicht verbunden wurde. Diese Systemfilter werden automatisch mit Filtern kombiniert, die im Prozess hinterlegt wurden. Die Datenmenge einer Listenansicht kann darüber hinaus auf zwei Arten eingeschränkt werden.

Constraints

Zum einen lässt sich dies über die Eigenschaft Constraint erreichen. Hier muss die WHERE-Klausel einer SQLite Anweisung für die mobile Gerätedatenbank hinterlegt werden.

Bemerkung

Komplexe Ausdrücke in Constraints müssen geklammert werden, wenn diese mehrere Bedingungen mit AND / OR verknüpfen.

Das Constraint ist für simple Einschränkungen gedacht, wie z.B. nach einem bestimmten Status zu filtern, und funktioniert auch ohne den Kontext eines vorhergehenden Schritts. Nachfolgend ein Beispiel, wie eine solche Anweisung aussehen kann:

(ref_Occurence_status="00000235:00000004" OR ref_Occurence_status="00000235:00000007")

Mobile Filter

Zum anderen kann ein Filterobjekt an einem Aktivator hinterlegt werden, der zur Listenansicht navigiert (siehe unten). Der Filter lässt es zu, ein Skript zu schreiben, um das gewünschte Filterkriterium zu erreichen. Hier ist es möglich, den aktuellen Zustand der App abzufragen, wie z.B. welche Gebäude im letzten Schritt vom Benutzer ausgewählt worden sind. Am Ende wird wieder eine WHERE-Klausel für die Datenbank zurückgegeben.

Filter

Datensätze sortieren

Eine Listenansicht zeigt im Normalfall ihre Datensätze in der Reihenfolge an, in der sie in die mobile Gerätedatenbank geschrieben wurden. Möchte man eine andere Sortierung verwenden, kann man die dynamische Eigenschaft orderBy vom Typ Text an der Listenansicht verwenden.

Die Syntax für diese Eigenschaft entspricht dabei SQLite, das in der Gerätedatenbank eingesetzt wird. Hier können ein oder mehrere Attribute der gebundenen Klasse kommasepariert angeben werden. Auf den Attributnamen folgt ein Schlüsselwort für die Sortierreihenfolge: ASC oder DESC, wobei ersteres der Standardfall ist und weggelassen werden kann.

Tipp

Soll mehr als ein Attribut für die Sortierung verwendet werden, muss ab dem zweiten Attribut der Tabellenname der Klasse sowie das Zeichen . jeweils vor das Attribut geschrieben werden.

Beispiel für eine orderBy-Eigenschaft:

ref_status.Name, Fault.ref_Building_Project.Name_number, Fault.Date DESC

Datensätze durchsuchen

Listenansichten unterstützen bereits ohne Anpassungsaufwand das Durchsuchen ihrer Datensätze. Als Grundlage für die Suche werden hier alle Attribute herangezogen, die für die Kurzansicht jedes einzelnen Datensatzes benötigt werden. Das sind die GetName- und GetSubName-Attribute sowie alle, die für die Listenvorlage verwendet werden.

Möchte man darüber hinaus noch andere Attribute für die Suche verwenden, muss man das entsprechende Vertragsattribut als searchable markieren. Dies ist eine dynamische Eigenschaft vom Typ Ja / Nein, deren Checkbox für die Suche aktiviert sein muss.

Die Werte aller als suchbar markierten Attribute werden nun als Suchtext verwendet. Datensätze, von denen keines dieser Attribute mit dem Suchtext übereinstimmt, werden schließlich in der Listenansicht ausgeblendet.

Listen- und Auswahlansicht

Eine Listenansicht hat im Vergleich zu einer Auswahlansicht einen Aktivator, der ausgeführt wird, sobald ein Datensatz vom Benutzer angetippt wurde. Oft navigiert dieser Aktivator dann auf eine Detailansicht, um den angetippten Datensatz größer anzuzeigen. Wird kein Aktivator hinterlegt, kann der Nutzer nicht mit den Listeneinträgen interagieren, es sei denn er möchte diese nur über eine Checkbox selektieren. Dann spricht man von einer Mehrfachauswahl.

Eine Auswahlansicht hat bereits eine vom System vorgegebene Funktion beim Antippen eines Datensatzes. Existiert ein vorheriger Schritt mit einer Detailansicht und ist ein Referenzattribut mit der Auswahlansicht über einen Aktivator verknüpft, dann navigiert die App einen Schritt zurück und setzt den ausgewählten Datensatz als neuen Wert für die Referenz.

Das gerade beschriebene Verhalten eines Referenzattributs und einer Auswahlansicht wird automatisch umgesetzt, falls am Referenzattribut gar kein Aktivator hinterlegt ist. Daher benötigt man eine eigene Auswahlansicht nur, falls man dieses Verhalten abändern bzw. erweitern will. Dafür muss die dynamische Eigenschaft oneTouchFunction vom Typ Skript am Aktivator, der zur Auswahlansicht führt, benutzt werden. Weitere Informationen dazu finden Sie hier.

Liste-zu-Liste-Übergang

Neben einer Navigation zu einer Detailansicht des ausgewählten Datensatzes gibt es auch die Möglichkeit, von einer Liste direkt in die nächste zu springen. Dies ist sinnvoll, wenn der zu erstellende Prozess ein Objekt primär über eines seiner Listenattribute definiert. Beispielsweise einen Auftrag über seine Arbeitsschritte. Dann wäre es umständlich, zuerst von der Liste der Aufträge zu der Detailseite eines Auftrags zu navigieren, um sich dann die Arbeitsschritte anzuzeigen.

Eine Abkürzung verschafft hier das Feature des direkten Übergangs von einer Liste zur anderen. Dafür hinterlegt man am Übergang zwischen den beiden Listen die Eigenschaft Übergangsattribut. Hier wählt man aus einem Dropdown eines der Listenattribute der ersten Klasse aus, das dann als Grundlage für die Anzeige in der zweiten Liste genommen wird. Auch die Bindung der zweiten Liste aktualisiert sich im Designer entsprechend auf die Referenzklasse des Listenattributs, im Beispiel also auf die Klasse Arbeitsschritt. Der Nutzer gelangt nun so direkt zu den Arbeitsschritten, wenn er einen Auftrag aus der Liste antippt.

Mehrfachauswahl

Um eine Listenansicht mit einer Mehrfachauswahl auszustatten, muss sie eine Listenvorlage definieren. Über diese Vorlage ist es dann möglich, ein Bild einzubinden, das als Checkbox fungiert. Dafür muss die bindId des Bildes auf den Wert selectCheckBox:Attributname gesetzt werden, wobei Attributname der Name des Attributs ist, das an die Checkbox gebunden ist. Alle Checkboxen haben genau zwei Zustände. Das an die Checkbox gebundene Attribut muss vom Typ Ja / Nein (bool) sein.

Tipp

Wenn die Checkbox an ein Attribut gebunden ist, bedeutet dies, dass jede Änderung des Attributs auch den Zustand der Checkbox verändert. Außerdem wird anders herum die Änderung der Checkbox auch den Wert des Attributs beeinflussen.

Nachfolgend ein Beispiel für die template-Eigenschaft mit einer gebundenen Checkbox:

{
    "childTemplates":[
        ...
        {
            "type": "Ti.UI.ImageView",
            "bindId": "selectCheckBox:Completed",
            "properties": {
                "left": 5,
                "width": 30,
                "height": 30
            }
        }
        ...
    ]
}

Baumstruktur

Treeview

Es ist möglich, eine Listenansicht hierarchisch aufzugliedern, sodass Listeneinträge wiederum untergeordnete Listeneinträge haben und so eine Baumstruktur entsteht. Hierfür muss die dynamische Eigenschaft style vom Typ Text und darunter treePath eingesetzt werden. Der Wert von treePath ist ein Array mit folgender Struktur:

{
    ...
    "treePath": [
        {
            "attribute": "EL_Fault_Commision",
            "activator": "AFaultStart",
            "filter": "FTTT",
            "labelFormats": {
                "title": "Mangel: %%Date%% %%ref_kind_of_fault%%",
                "title2": "%%ref_Trade%% %%ref_Person%%"
            }
        },
        {
            "attribute": "EL_HT_document_link_container",
            "activator": "ADocumentDetail",
            "filter": "FXXX",
            "labelFormats": {
                "title": "Dokument: %%Title%%",
                "title2": "%%Note%%"
            }
        }
    ]
}

Jeder Eintrag in diesem Array entspricht einer Hierarchiestufe unterhalb der Hauptebene. Im Beispiel werden also insgesamt 3 Hierchiestufen abgebildet. Die erste stellt die Datensätze der gebundenen Klasse dar. Diese können nun aufgeklappt werden und zeigen Begehungen an, die dem Datensatz über das Attribut EL_Fault_Commision zugeordnet sind. Begehungen können wiederum aufgeklappt werden und zeigen dann alle verknüpften Dokumente an.

Pro Hierarchiestufe lässt sich ein eigener Aktivator und Filter hinterlegen. Außerdem kann der Inhalt der Listeneinträge verändert werden, indem die zuvor unter template definierten Textlabels überdefiniert werden.

Optional kann man untergeordnete Elemente eines Datensatzes auch noch gruppieren, wenn man z.B. unterhalb eines Auftrags sowohl die zugeordneten Ereignisse und Arbeitsschritte sehen will. Hierfür gibt es innerhalb einer Hierarchiestufe die Eigenschaft groups:

{
    ...
    "treePath": [
        {
            "groups": [
                {
                    "name": "Ereignisse",
                    "id": "groupOccurrences"
                },
                {
                    "name": "Arbeitsschritte",
                    "id": "groupWorkSteps"
                }
            ]
        }
    ]
}

Außerhalb von treePath lassen sich die eben referenzierten Gruppen noch definieren:


{
    ...
    "treePath": [...],
    "groups": {
        "groupOccurrences": {
            "treePath": [
                {
                    "attribute": "EL_HT_document_link_container",
                    "activator": "ADocumentDetail",
                    "filter": "FXXX",
                    "labelFormats": {
                        "title": "Dokument: %%Title%%",
                        "title2": "%%Note%%"
                    }
                }
            ]
        },
    ...
    }
}

Siehe auch

Detailansicht
Vertragsklasse
Markierungen