tibi-docs/docs/projektkonfig/fields.md

252 lines
7.6 KiB
Markdown
Raw Normal View History

2022-11-02 15:00:50 +01:00
# fields
2022-11-03 11:05:44 +01:00
Felder im *tibi-server* müssen einen bestimmten Datentyp haben. Über den *tibi-admin* können die Felder über Widgets in unterschiedlichen Ausprägungen dargestellt werden (view-Widgets), bzw. dem Benutzer eine Eingabe abverlangen (input-Widgets).
2022-11-02 15:00:50 +01:00
2022-11-03 11:05:44 +01:00
Es gibt grundlegende Angaben, die jedes Feld haben muss um vom *tibi-server* akzeptiert zu werden. Darüber hinaus kann auch jedes Feld ein `meta` Objekt haben, was dem *tibi-admin* mitteilt, wie er dieses Feld für Ausgabe und Eingabe behandel soll.
2022-11-02 15:00:50 +01:00
Zunächst folgt der grundlegende Aufbau des Feld-Objektes:
2022-11-03 08:59:11 +01:00
!!!include(api/collections/fields/date.yml)!!!
2022-11-02 15:00:50 +01:00
## validator Objekt
2022-11-03 11:05:44 +01:00
Das `validator` Objekt wird *tibi-server* seitig genutzt um die Daten zu validieren. Da das `validator` Objekt dem *tibi-admin* ebenso zur Verfügung steht, kann vorab eine client-seitige Validierung zusätzlich durchgeführt werden.
2022-11-02 16:32:42 +01:00
Attribute des Objektes:
| Attribut | Datentyp | Beschreibung |
| --- | --- | --- |
2022-11-03 11:05:44 +01:00
| `required` | boolean | wenn `true`, dann ist zwingend eine Eingabe zu diesem Feld nötig |
| `allowZero` | boolean | in Kombination mit `required: true`, wenn `true`, dann ist der jeweilige "Null"-Wert des Datentyps erlaubt<br><br>z.B. `type: string` erlaubt den leeren String und `type: number` erlaubt `0` |
| `eval` | string | Javascript-Code der zu true evaluieren muss um den Wert des Feldes als gültig zu definieren |
2022-11-02 16:32:42 +01:00
### eval-Attribut
Der Javascript-Code in diesem Attribut kann folgende Rückgabe-Werte haben:
| Wert | Bedeutung |
| --- | --- |
2022-11-03 11:05:44 +01:00
| `true` | Der Wert des Feldes ist gültig |
| `false` | Der Wert des Feldes ist ungültig |
| `"Text"` | Wird ein String zurückgegeben ist, wird der Wert es Feldes ebenso als ungültig erachtet und der String selbst ist eine benutzerdefinierte Fehlermeldung, die in der Serverantwort gelesen werden kann. |
2022-11-02 16:32:42 +01:00
2022-11-03 11:05:44 +01:00
Es ist ein Oneliner wie `new Date($this) > new Date()` meist ausreichend. Für komplexere Prüfungen ist eine sich selbst ausführende Funktion aber geeigneter, wie z.B.
2022-11-02 16:32:42 +01:00
```javascript
(function() {
if (new Date($this) > new Date()) {
return true
}
return false
})()
```
Dafür eignen sich im YAML Multiline-Modifizierer wie z.B.:
```yaml
eval: |
(function() {
if (new Date($this) > new Date()) {
return true
}
return false
})()
```
2022-11-03 11:05:44 +01:00
Wie im obigen Beispiel zu sehen, gibt es spezielle Variablen die im Javascript zur Verfügung stehen. Nicht alle Variablen stehen server- und clientseitig (*tibi-admin*) zur Verfügung. Eine ensprechende Ausnahmebehandlung ist daher nötig.
2022-11-02 16:32:42 +01:00
Folgende Variablen stehen zur Verfügung:
2022-11-03 11:05:44 +01:00
| Variable | Datentyp | tibi-server | tibi-admin | Bedeutung |
2022-11-02 16:32:42 +01:00
| --- | --- | --- | --- | --- |
2022-11-03 11:05:44 +01:00
| `$this` | | X | X | | Der Wert des Feldes in dem der Validator ausgeführt wird. |
| `$` (alias `entry`) | object | X | X | Das gesamte Objekt des Dokuments |
| `$parent` | object oder array | X | X | Der Wert des Elternknotens zum aktuellen Feld |
| `$stack` | array | X | X | Der Stack bis zum Ursprung des gesamten Objekts |
| `$namespace` | string | X | TODO | Die Bezeichnung des Namespace des aktuellen Projekts |
| `$method` | `"post"`/`"put"` | X | TODO | Die HTTP-Methode (Kleinschreibung) |
| `$auth` | object oder `null` | X | TODO | Das aktuelle Auth-Objekt des eingeloggten Benutzers, siehe Hooks `context.user.auth()` |
| `context` | object | X | - | Das serverseitige context-Objekt, siehe Hooks |
2022-11-02 16:32:42 +01:00
Für die beispielhafte Übertragung von
```json
{
"title": "Mein Datensatz",
"meta": {
"keywords": [
{
"key": "pla",
"description": "Ah Plah"
},
{
"key": "blup",
"description": "Buh Blup"
}
]
}
}
```
wobei wir den `"key": "pla"` betrachten, wären die Inhalte der Variablen folgende:
`$this`:
plah
`$parent` und `$stack[0]`:
```json
{
"key": "pla",
"description": "Ah Plah"
}
```
`$stack[1]`:
```json
[
{
"key": "pla",
"description": "Ah Plah"
},
{
"key": "blup",
"description": "Buh Blup"
}
]
```
`$stack[2]`:
```json
{
"keywords": [
{
"key": "pla",
"description": "Ah Plah"
},
{
"key": "blup",
"description": "Buh Blup"
}
]
}
```
`$stack[3]`, `entry` und `$`:
```json
{
"title": "Mein Datensatz",
"meta": {
"keywords": [
{
"key": "pla",
"description": "Ah Plah"
},
{
"key": "blup",
"description": "Buh Blup"
}
]
}
}
```
2022-11-02 15:00:50 +01:00
## dependsOn und defaultValue Kontext
2022-11-03 11:05:44 +01:00
Der Javascript-Kontext ist für das `eval`-Attribut von `dependsOn` und `defaultValue` ebenso mit Variablen angereichert, wie es beim `validator.eval` der Fall ist. Da der entsprechende Code allerdings nur client-seitig ausgeführt wird (im Feld `meta` Objekt), sind nicht alle Variablen identisch.
Folgende Unterschiede gibt es zu den bereits beschriebenen Variablen von `validator.eval`:
| Variable | Unterschied |
| --- | --- |
| `context` | nicht vorhanden |
| `$method` | `"put"` bedeuted, dass der Datensatz gerade in Bearbeitung ist, `"post"` = Datensatz soll angelegt werden |
| `$navigation` | nur hier vorhanden, da der Server keine `subNavigation` Liste kennt,<br>enthält das aktuelle Objekt der aktiven Unternavigation, also den entprechenden Listeneintrag aus `meta.subNavigation` |
2022-11-02 15:00:50 +01:00
## Datentypen
2022-11-03 11:05:44 +01:00
Via `type` wird der Datentyp des Feldes definiert. Folgende Datentypen sind möglich:
2022-11-02 15:00:50 +01:00
### string
2022-11-03 11:05:44 +01:00
String wird für Zeichenketten verwendet. Das Standardwidget ohne weitere Angabe ist bei der Ausgabe die direkte Textausgabe und bei der Eingabe ein HTML `<input ...>` Element mit dem Attribut `type="text"`.
2022-11-02 15:00:50 +01:00
### number
2022-11-03 11:05:44 +01:00
Number wird sowohl für ganze Zahlen, wie auch für Gleitkommawerte definiert. Auch hier ist das Standard-Widget für die Eingabe ein HTML `<input ...>` Element, allerdings mit dem Attribut `type="number"`.
2022-11-02 15:00:50 +01:00
### boolean
2022-11-03 11:05:44 +01:00
Ein boolcher Wert, also `true` oder `false`, wird über den Typ `"boolean"` definiert und standardmäßig als Checkbox dargestellt.
2022-11-02 15:00:50 +01:00
### date
2022-11-03 11:05:44 +01:00
`"date"` als Datentyp kann sowohl Datumsangabe mit, als auch ohne Uhrzeit aufnehmen. Das Standardwidget ist die einfache Datumseingabe ohne Uhrzeit.
2022-11-02 15:00:50 +01:00
### file
2022-11-03 11:05:44 +01:00
Der Datentyp `"file"` ist für Dateiuploads vorgesehen. Es daher standardmäßig ein Datei-Auswahl-Dialog als Widget für die Eingabe angeboten.
2022-11-02 15:00:50 +01:00
### string[]
2022-11-03 11:05:44 +01:00
Für `"string[]` Arrays ist die Angabe des Widgets zwingend notwendig.
2022-11-02 15:00:50 +01:00
### number[]
2022-11-03 11:05:44 +01:00
Auch für `"number[]"` Arrays wird die Widget-Angabe erwartet.
2022-11-02 15:00:50 +01:00
### object
2022-11-03 11:05:44 +01:00
`"object"` ist ein spezieller Datentyp der zur Strukturierung der API und der Eingabe dient. Dieser Datentyp fasst `subFields` zusammen.
2022-11-02 15:00:50 +01:00
### object[]
2022-11-03 11:05:44 +01:00
Wie `"object"` fasst auch das `"object[]"` Array `subFields` zusammen. Diese allerdings als Liste von Objekten, anstatt als Einzelobjekt.
2022-11-02 15:00:50 +01:00
### any
2022-11-03 11:05:44 +01:00
Felder vom Typ `"any"` können beliebige Daten aufnehmen. Die Validierung schlägt auf Basis der Typ-Validierung hier nie fehl.
2022-11-02 15:00:50 +01:00
2022-11-03 11:05:44 +01:00
## Widgets
2022-11-02 15:00:50 +01:00
2022-11-03 11:05:44 +01:00
Das im *tibi-admin* für die Ein- und Ausgabe von Daten zu verwendente Widget wird über die Feldkonfiguration `meta.widget` festgelegt. Die Angabe erfolgt als String mit dem Widget-Namen.
2022-11-02 15:00:50 +01:00
2022-11-03 11:05:44 +01:00
Nicht jedes Widget kann mit jedem Datentyp umgehen, die möglichen Datentypen werden aber nachfolgend bei jedem Widget erwähnt. Außerdem wird auf individuelle Konfigurationsmöglichkeiten eingegangen.
2022-11-02 15:00:50 +01:00
2022-11-03 11:05:44 +01:00
### text
2022-11-02 15:16:12 +01:00
2022-11-02 15:00:50 +01:00
### number
### checkbox
### select
### date
### datetime
2022-11-03 11:05:44 +01:00
### richText
2022-11-02 15:00:50 +01:00
### file
### image
### selectArray
### checkboxArray
### chipArray
### object
### objectArray
2022-11-02 15:16:12 +01:00
### tabs