Einführung in Inhaltstypen
Mit iCL können Sie schnell umfangreiche Checklisten erstellen, um Informationen über verschiedene Dinge zu sammeln. In vielen Fällen werden Sie diese "Dinge" als separate Daten erfassen wollen. Bei Gebäudeinspektionen ist es zum Beispiel ratsam, alle Daten eines Gebäudes in einer separaten Tabelle zu speichern. Dann können Sie bei jeder Inspektion dieses Gebäudes die Daten verwenden, um Teile Ihrer Checklisten vorab auszufüllen.
Gebäude, Feuerlöschgeräte, Aufzugstypen, Kundeninformationen, ... in iCL können diese mit Inhaltstypen modelliert werden.
Allgemeine Inhaltstypen können alles darstellen, was in der realen Welt existiert. Von Objekten, die inspiziert werden, wie z.B. Aufzüge, Maschinen oder ganze Gebäude, bis hin zu zusätzlichen Informationen, die getrennt von den Inspektionen gespeichert werden sollten, damit sie wiederverwendet werden können, wie z.B. Kontaktinformationen, eine Kundenliste und so weiter.
Mangel-Inhaltstypen haben den gleichen grundlegenden Funktionsumfang wie normale Inhaltstypen. Zusätzlich definieren sie das Objekt, zu dem sie gehören (wir nennen es "übergeordnetes Objekt") und den Status, in dem sie sich gerade befinden (z.B.: offen, in Bearbeitung, gelöst). Der übergeordnete Inhaltstyp kann ein beliebiger Grundinhaltstyp sein, obwohl es natürlich viel sinnvoller ist, einen Mangel an einem Gebäude zu haben als an einem Kunden.
Definieren eines Inhaltstyps
Ein Inhaltstyp definiert
- die Felder, die er speichert (Name, Adresse, Baujahr, ...)
- die Beziehungen zu anderen Inhaltstypen (z.B. ein Aufzug gehört zu einem Gebäude)
- das Formular zur Bearbeitung seiner Daten
- erweiterte Regeln für die Synchronisierung der Daten und vieles mehr.
Diese *.json Datei wird dann in das iCL Portal hochgeladen und auch über den iCL Designer in das iWorkbook importiert.
Beachten Sie, dass die Definition eines Inhaltstyps derzeit keine einfache Aufgabe ist und daher von jemandem mit Softwareentwicklungskenntnissen durchgeführt werden sollte!
1 Die erforderlichen Attribute
Es gibt mehrere Parameter, die vor der Erstellung der Felder selbst festgelegt werden müssen.
Parameter | Wert | Beschreibung |
---|---|---|
"$type": | "contentType" | Definiert den Typ dieser json-Datei als Inhaltstyp. |
"name": | "lowercase_name" | Definiert den Namen für die Datenbank. Nur Kleinbuchstaben und _ für Leerzeichen sind erlaubt. |
"displayName": | "Was Ihnen am besten gefällt" | Definiert den Titel des Inhaltstyps für das iCL Portal und den iCL Filler. |
"canBeInspected": | true | Wenn dieser Inhaltstyp mit einer Arbeitsmappe geprüft werden soll, setzen Sie "canBeInspected": true |
"builtinTypeId": | 6 | Wenn Sie einen Inhaltstyp zum Sammeln von Mängeln erstellen möchten, geben Sie 6 an, ansonsten 0 . Diese Inhaltstypen werden im Bereich "Mängel" der iCL Filler Inspektion angezeigt. |
"titleFieldName": | "der_Name_eines_vorhandenen_Feldes" | Definiert, welches Feld angezeigt werden soll, wenn Sie ein Element auswählen oder die Mangel-Liste anzeigen. |
"icon": | "" | Definiert das angezeigte Symbol in der Liste der Elemente des iCL Fillers. |
"fields": | [] siehe Thema unten | Enthält alle Felder, die als Spalten im iCL Portal angezeigt werden sollen. |
"relationships": | [] siehe Thema unten | Stellt eine Verbindung zu einem anderen Element her. |
"formTemplate": | {} siehe Thema unten | Dieses Attribut wird automatisch generiert, wenn es leer gelassen wird, aber bestimmte Feldtypen müssen dort manuell definiert werden. Weitere Informationen hierzu finden Sie in den folgenden Kapiteln. |
"id": | 2f4fa47a-faba-4748-bb80-a37e1040b1e8 | Definiert einen Bezeichner für die iCL Portal Datenbank. Jeder Inhaltstyp muss in dieser Hinsicht eindeutig sein. Sie können diesen kostenlosen Online-GUID-Generator |
"version": | 1 | Die Version des betreffenden Inhaltstyps. |
Beispiel für einen einsehbaren Inhaltstyp:
{
"$type": "contentType",
"name": "building",
"displayName": "Building",
"canBeInspected": true,
"titleFieldName": "building_number",
"fields": [],
"relationships": [],
"formTemplate": {},
"id": "12345678-abcd-1a2b-3c4d-1234567890",
"version": 1
}
Beispiel für einen Mangel-Inhaltstyp:
{
"$type": "contentType",
"name": "defect",
"displayName": "Defect",
"builtinTypeId": 6,
"titleFieldName": "title",
"fields": [],
"relationships": [],
"formTemplate": {},
"id": "87654321-dcba-b2a1-d4c3-0123456789",
"version": 1
}
2. Das Titelfeld
Jeder Inhaltstyp muss ein Titelfeld haben. Dieses Feld hat dann mehrere besondere Funktionen:
A) Immer wenn eine kurze Information über einen bestimmten Inhaltstyp angezeigt werden soll, wird der Wert des Titelfeldes angezeigt {#showinfo}.
Daher sollte das Titelfeld menschenlesbare Informationen enthalten, die dem Endbenutzer helfen, ein bestimmtes Element zu identifizieren oder zu verstehen, worum es sich handelt.
Im Falle eines Gebäudes können Sie die eindeutige Gebäudenummer verwenden, z.B. "bldng 2019-02-18 001288". Im Falle eines Inhaltstyps "contact_person", der Informationen über einen Ansprechpartner eines bestimmten Kunden enthält, können Sie den vollständigen Namen des Ansprechpartners wählen (z.B. 'Robert Petterson')
Um zu verstehen, wo diese Informationen angezeigt werden, gehen wir von dem folgenden Szenario aus:
Sie entwerfen einen Inhaltstyp "Kunde".
Er hat eine Beziehung zu einem anderen Inhaltstyp "contact_person" (d.h. er ermöglicht es dem Benutzer, die Kontaktperson für einen bestimmten Kunden anzugeben)
Das Inhaltsfeld für die Speicherung der "contact_person" des "Kunden" heißt "customer_contact" und hat den Anzeigenamen "Contact".
- Portal: Das Formular zum Erstellen/Bearbeiten/Löschen von "Kunden" ermöglicht Ihnen die Auswahl einer "contact_person" und zeigt den Wert des Titelfelds im Formular selbst sowie in der Dropdown-Auswahl an.
- Portal: Die Datentabelle "Kunde" enthält eine Spalte "Kontakt" (der Anzeigename des Feldes "Kunde_Kontakt"), in der auch der Wert des Titelfeldes dieses Elements angezeigt wird.
- Ausfüller: Wenn die App alle bekannten Elemente von "contact_person" auflistet, damit der Benutzer eines auswählen kann (z.B. eine Checkliste hat ein Inhaltsfeld, das die Auswahl eines "contact_person" erlaubt, oder die Inspektion erfordert, dass der Benutzer vor Beginn der Inspektion einen "contact_person" auswählt), wird der Wert des Titelfeldes "contact_person" in der Liste angezeigt.
- Ausfüller: Wenn eine Checkliste ein Inhaltsfeld hat, das mit einem "contact_person"-Element gefüllt ist, wird dessen Titelfeld in der Checkliste angezeigt.
- Berichte: Wenn eine Checkliste ein Inhaltsfeld hat, das mit einem "contact_person"-Element gefüllt ist, wird das Titelfeld im Bericht genauso angezeigt wie in der Checkliste.
B) Der Wert des Titelfeldes wird indiziert und für die Volltextsuche verwendet
- Portal: Wenn der Benutzer die Dropdown-Liste öffnet, um ein Element auszuwählen, kann er einen Text eingeben, um die potenziell lange Liste zu filtern
- Ausfüllhilfe: Wenn die Liste der Elemente angezeigt wird, wählt der Benutzer ein Inhaltselement aus, bevor er eine Inspektion beginnt, oder wenn er ein Inhaltselementfeld in einer Checkliste ausfüllt, kann er wiederum einen Suchausdruck eingeben, um diese potenziell lange Liste zu filtern.
Dies gilt auch, wenn der Benutzer einen QR-Code einscannt, um nach einem bestimmten Objekt zu suchen.
Das Titelfeld kann auf zwei Arten definiert werden:
- durch Angabe eines
titleFieldName
, - oder mit Hilfe der
titleFieldExpression
.
2.1 Angabe des Titels mit einem titleFieldName
Wenn Sie einen titleFieldName
angeben, müssen Sie den Namen eines erforderlichen Inhaltsfeldes vom Typ ShortText
wählen.
Dies geschieht aus den beiden oben genannten Gründen (A) und (B)
- Wenn es sich nicht um Kurztext handeln würde, hätte dies negative Auswirkungen auf die Suche
- Wenn es nicht erforderlich wäre, könnten die Benutzer es leer lassen, was dazu führen würde, dass z.B. leere Einträge in einem Selektor-Kontrollelement für diesen Inhaltstyp angezeigt würden.
Die Angabe eines titleFieldName
ist in jedem Fall erforderlich. Wenn auch ein titleFieldExpression
definiert ist, hat dieser Vorrang vor dem titleFieldName
.
2.2 Angabe des Titelfeldes mit titleFieldExpression
Manchmal reicht ein einzelnes Feld nicht aus, um einen indizierbaren und leicht lesbaren Titel für ein bestimmtes Inhaltselement zu erstellen. Zum Beispiel könnte der Inhaltstyp "Gebäude" nicht über eine leicht lesbare Gebäudenummer wie "B 2019-02-18 001288" verfügen, sondern diese Information über mehrere Felder verteilen:
- Das Feld 'bau_datum' mit dem Wert 2019-02-18
- Das Feld 'idx_number' mit dem Wert 001288
Für solche Fälle können Sie die titleFieldExpression
verwenden.
Damit können Sie einen Ausdruck angeben, der jedes Mal, wenn ein Inhaltselement erstellt oder bearbeitet wird, dynamisch ausgewertet wird und mehrere Felder kombinieren kann.
Um eine Gebäudenummer wie oben ("B 2019-02-18 001288") zu erhalten, können Sie den folgenden Ausdruck verwenden: B <%construction_date%> <%idx_number%>
{
"$type": "contentType",
"name": "building",
"displayName": "Building",
"canBeInspected": true,
"titleFieldName": "building_number",
"titleFieldExpression": "B <%construction_date%> <%idx_number%>",
"icon": "",
"fields": [],
"relationships": [],
"formTemplate": {},
"id": "12345678-abcd-1a2b-3c4d-1234567890",
"version": 1
}
Beachten Sie, dass die titleFieldExpression
optional ist und ein titleFieldName
weiterhin erforderlich ist, um mit älteren Versionen unserer Software kompatibel zu bleiben.
Es verhält sich folgendermaßen:
- Wenn ein Inhaltstyp einen
titleFieldExpression
hat, wird dieser gegenüber demtitleFieldName
bevorzugt ausgewertet, um den Titel des Elements zu bestimmen, wenn es erstellt oder bearbeitet wird. - Sie können jedes Feld verwenden, das durch diesen Inhaltstyp definiert ist, um den Titel zusammenzustellen, nicht nur Felder vom Typ
ShortText
. - Wenn eines der Felder, die Sie verwenden, nicht existiert, keinen Wert hat oder ein Fehler bei der Auswertung seines Wertes aufgetreten ist, wird es durch leeren Text ersetzt.
Wenn Sie z.B. in dem Ausdruck B <%cnstructiondate%> <%idx_number%>
fälschlicherweise construction_date
als cnstructiondate
eingeben, würde das Ergebnis "B 001288" lauten.
- Während Sie in den meisten Fällen nur einfache Platzhalter verwenden werden, um Ihr Titelfeld zu erstellen (z.B.
<%Bestätigungsdatum%>
), können Sie auch einen JavaScript-Ausdruck angeben. Nehmen wir zum Beispiel an, dass das Feld<%construction_date%>
vom TypDate
ist, dann enthält das Feldconstruction_date
tatsächlich ein EcmaScript 5 date object
Sie können also etwas Ausgefallenes wie dies tun:
<% construction_date.toLocaleDateString("de-DE, { weekday: 'long', year: 'numerisch', Monat: 'lang', Tag: 'numerisch' }") %>
was folgendes ergeben würde
"Montag, 18. Februar 2019"
- Es steht Ihnen zwar frei, jeden beliebigen Ausdruck zu definieren, aber beachten Sie, dass die resultierende Zeichenkette abgeschnitten wird, wenn sie länger als 200 Zeichen ist!
2. Inhaltliche Felder
Indem Sie die (Inhalts-)Felder eines Inhaltstyps definieren, können Sie festlegen, welche Daten tatsächlich gespeichert werden.
Die Reihenfolge der in der *.json-Datei festgelegten Felder entspricht der Reihenfolge der Spalten der Datentabelle der Inhaltstypen in iCL Portal.
Ein Inhaltsfeld kann die folgenden Attribute enthalten
Parameter | Werteschema | Beschreibung | Pflichtfeld |
---|---|---|---|
"$type": | "contentField" | Jede Spalte muss als contentField definiert werden. Beziehungen werden als contentRelationship definiert. | x |
"type": | "ShortText", "Boolean", "Number",... | gibt den Datentyp an, den dieses Feld enthalten kann. Die Vorgabe ist 'ShortText'. Siehe Tabelle Feldtypen | |
"name": | "test" | Der interne Feldname für die Datenbank. Muss klein geschrieben werden. | |
"displayName": | "Test 123" | Der angezeigte Spaltentitel des Feldes. | x |
"isRequired": | true / false | Ein boolescher Wert, der bestimmt, ob das Feld einen Wert haben muss oder nicht. | |
"isIndexed": | true / false | Ein boolescher Wert, der festlegt, ob ein Suchindex für dieses Feld erstellt werden soll. | |
"builtInField": | entweder eines von ExternalId ,ParentContentItemId ,Status | Damit können Sie interne Felder der iCL festlegen. |
Da alle Inhaltstypen in einer SQL-Datenbank gespeichert werden, können und sollten Sie Indizes verwenden, um Suchanfragen zu beschleunigen. Da die Indizierung aller möglichen Spalten die Aktualisierung von Elementen verlangsamen würde, sollten Sie nur Felder indizieren, die tatsächlich für die Suche verwendet werden.
Das iCL Portal ist jedoch intelligent und indiziert bestimmte Felder automatisch für Sie:
- das Feld title
- das Feld externalid
- jedes Feld, das in einer Beziehung verwendet wird
2.1 Feldtypen
Es gibt die folgenden Feldtypen
Typ | Beschreibung |
---|---|
"ShortText" | 200 Zeichen |
"LangText" | 4 294 967 295 Zeichen |
"Zahl" | -2147483648 - 2147483647 |
"Boolesch" | falsch, wahr |
"Datum" | JJJJ-MM-TT |
"Zeit" | hh:mm:ss |
"GUID" | Global Unique Identifier. |
"ContentItem" | Ermöglicht die Speicherung von IDs anderer Inhaltselemente, um diese zu referenzieren - ähnlich wie ein SQL-Fremdschlüssel |
"FileEntry" | Ermöglicht die Speicherung von Dateien wie z.B. Bildern in einem Inhaltstyp. E.g: 90e0ef39-74c2-4f6d-b78a-6e1a76303112 |
"Benutzer" | ⏳für zukünftige Verwendung |
"Plan" | Ermöglicht das Speichern eines Plans (Datei). [Weitere Informationen finden Sie im Leitfaden zu Plänen.(/docs/guides/plan_features/plan) |
"PlanLocation" | Ermöglicht das Speichern der Position auf einem Plan als POINT(x y) oder als POLYGON((x1 y1,x2 y2,x3 y3,...)) . [Für weitere Informationen lesen Sie den Leitfaden zu Plänen (/docs/guides/plan_features/plan) |
Beispiel:
{
"$type": "contentField",
"type": "Number",
"name": "price",
"displayName": "Price",
}
3. Relationships
Content types can relate to other content types. For example, an elevator may belong to a building, so this relationship can be configured. This later allows to synchronize hierarchies of objects.
"relationships": [
{
"$type": "contentRelationship",
"name": "building",
"displayName": "The building",
"foreignKeyField": "buildingid",
"targetContentType": {
"$type": "contentTypeRef",
"id": "98589aab-1b51-40d9-9a4b-9430859e7b8e",
"version": 1
}
}
],
Parameter | Subparameter | Wert | Beschreibung |
---|---|---|---|
"$type": | "contentRelationship" | Definiert die Verbindung zu einem anderen Inhaltstyp. | |
"name": | "building" | bezieht sich auf das Feld, in dem der verbundene Inhaltstyp angezeigt wird. | |
"displayName": | "Das Gebäude" | ||
"foreignKeyField": | "buildingid" | Der Name des (externen) Feldes, das mit dem angegebenen Feld verknüpft werden soll | |
"targetContentType": | |||
"$type": | "contentTypeRef" | Verwenden Sie immer diesen Wert. | |
"id": | "98589aab-1b51-40d9-9a4b-9430859e7b8e" | Die ID des Inhaltstyps, auf den Sie sich beziehen - kann auch die eigene Inhaltstyp-ID sein, wenn Sie sich nur auf ein anderes Feld beziehen. | |
"version": | 1 | Die Version dieses Inhaltstyps. |
ParentContentItemId
Für Mängel wird eine besondere Beziehung empfohlen: Jeder Mangel gehört zu einem bestimmten Objekt. In iCL wird dies mit dem BuiltInField
ParentContentItemId
umgesetzt.
Mängel müssen dieses Mapping definieren. Auf diese Weise wird der Mangel immer dann mitgesendet, wenn sein übergeordnetes Objekt mit dem Gerät eines Benutzers synchronisiert wird.
Zu diesem Zweck müssen sie ein Inhaltsfeld angeben
{
"$type": "contentField",
"type": "ContentItem",
"name": "parent",
"displayName": "The parent object",
"builtInField":"ParentContentItemId"
}
4. Formularvorlage
Für jeden Inhaltstyp wird eine Formularvorlage zum Anzeigen und Bearbeiten seiner Daten benötigt. Diese Vorlage wird automatisch auf der Grundlage der definierten Inhaltsfelder generiert, wenn Sie die .json-Datei in das iCL Portal hochladen.
Sie können die Formularvorlage ändern, indem Sie
- ein Formularfeld für jedes Feld des Inhaltstyps angeben
- oder indem Sie nur die Felder angeben, die anders sein sollen.
Im letzteren Fall erkennt iCL Portal automatisch, dass einige Felder fehlen und fügt sie on-the-fly hinzu.
Wenn ein Feld beispielsweise ein Dropdown-Feld sein soll, kann der Formularvorlage-Parameter "$type": "Optionen" festgelegt werden. Diese Dropdown-Werte müssen unterhalb der Definition angegeben werden. Hier ist ein Beispiel für ein Feld vom Typ Option:
"formTemplate":
{
"$type": "options",
"name": "personal",
"properties": {
"title": "Personal"
}
},
"available values": [
{
"$type": "value",
"name": "nopersonal",
"value": 0,
"properties": {
"title": "No"
}
},
{
"$type": "value",
"name": "yespersonal",
"value": 1,
"properties": {
"title": "Yes"
}
},
{
"$type": "value",
"name": "finishedpersonal",
"value": 10,
"properties": {
"title": "Finished (hidden)"
}
}
],
In der folgenden Tabelle werden die Details der Wertefelder erläutert:
Parameter | Wert | Beschreibung |
---|---|---|
"$type": | "value" | Dieser Parameter definiert den Bereich als Wert-Feld-Block. |
"name": | "databasename" | Definiert den Namen für die Datenbank. Nur Kleinbuchstaben und _ für Leerzeichen sind erlaubt. |
""value": | 0, 1, 2, ... | die Nummer der Position in der Dropdown-Liste. |
""title" | "So sieht es aus" | Der Titel des Bereichs - dieser Teil wird in der Dropdown-Liste angezeigt. |
Beachten Sie, dass der Wert 10 immer verwendet wird, um einen Eintrag zu verbergen.
Technisch gesehen werden Formularvorlagen im gleichen *.json-Format gespeichert wie die Checklisten einer Arbeitsmappe. Daher können Sie den iCL Designer verwenden, um eine neue "Checkliste" zu erstellen und die Felder nach Bedarf zu konfigurieren.
Nachdem Sie die Arbeitsmappe gespeichert haben, öffnen Sie sie mit einem ZIP-Tool und suchen Sie in iclx\forms
nach der .json Datei.
5. Vorlage für Listenelemente
Mit Listenelementvorlagen können Sie die Anzeige der Inhaltselemente in iCL Filler anpassen.
Standardmäßig hat jedes Element die gleiche Höhe und der Titel der Elemente kann maximal 3 Zeilen lang sein.
Sie können diese Attribute jedoch mit dem listItemTemplate
anpassen.
"listItemTemplate":
{
"$type": "listItem",
"type": "default",
"dynamicHeight": true,
"maxLines": 5
}
Parameter | Wert | Beschreibung |
---|---|---|
"$type": | "listItem" | |
"type": | "default" | Der Name der Vorlage. |
"dynamicHeight": | true/false | Gibt an, ob die Elemente die gleiche Höhe haben sollen oder ob ihre Höhe individuell angepasst werden soll. Standardwert: false. |
"maxLines" | 1, 2, 3, ... | Die maximale Anzahl der Zeilen, die im Titel des Inhaltselements zulässig sind. Maximal 10 Zeilen sind zulässig. Standardwert: 3. |
5.1 Beispiele
"listItemTemplate": {
"$type": "listItem",
"type": "default"
}
Die Eigenschaften „dynamicHeight“ und „maxLines“ haben die Standardwerte false
und 3
. Wenn Sie sie nicht angeben, sieht die Liste der Inhaltselemente wie folgt aus:
Beachten Sie, dass der Titel des dritten Elements länger als 3 Zeilen ist und daher abgeschnitten wird. Außerdem haben Elemente mit kurzen Titeln die gleiche Höhe wie Elemente mit längeren Titeln.
Setzen wir die Eigenschaft „maxLines“ auf 5.
"listItemTemplate": {
"$type": "listItem",
"type": "default",
"maxLines": 5
}
Sie können nun sehen, dass alle Elemente größer geworden sind, da die Vorlage die Anzeige von 5 Zeilen erlaubt, während die Eigenschaft „dynamicHeight“ auf dem Standardwert (false
) bleibt.
Setzen wir „dynamicHeight“ auf true. Das bedeutet, dass die Höhe jedes Inhaltselements dynamisch auf der Grundlage seiner Titel berechnet wird.
"listItemTemplate": {
"$type": "listItem",
"type": "default",
"dynamicHeight": true,
"maxLines": 5
}
Wie Sie sehen können, zeigt der dritte Eintrag immer noch nur die ersten 5 Zeilen seines Titels, aber alle anderen Einträge sind viel kleiner.