# Formularelemente
Jedes Element wird durch ein JSON-Objekt beschrieben.

## Flags
|||
|---|---|
|`"isdescription"`|Text in die bemerkung kopieren|
|`"movedya"`| Für Datumsfeld, verschiebt eine Aufgabe auf das datum|
|`"emailsend"`|sendet eine Mail an diese Adresse|

## Allgemein

||Beschreibung|
|---|---|
|`"name":"..."`|optionaler Name als String|
|`"required":true`|als Pflichtfeld kennzeichnen|
|`"inf":"..."`|optionale Informationen in Markdown|

### Markdown
Es wird nur ein kleiner Teil von Markdown unterstützt:

    # Titel
    Normaler Text, Bilder und Links werden unterstützt.
    ![](bild.jpg)
    [Link zum Video](video.mp4)

### Beispiele
```js
"name":"Adresse"
"required":true
```

## Text
```js
"typ":"txt"
```

||Beschreibung|
|---|---|
|`"hint":"..."`|grauer Text, der bei leerem Feld angezeigt wird|
|`"inptyp":"time"`|Uhrzeit im Format `hh:mm` erzwingen|
|`"d":{"inp":"..."}`|editierbarer Text|

### Erfüllt
Falls mindestens ein Zeichen eingeben wurde oder eine mittels `"inptyp"` festgelegte Bedingung erfüllt ist.

## Numerisch
```js
"typ":"num"
```

||Beschreibung|
|---|---|
|`"hint":"..."`|grauer Text, der bei leerem Feld angezeigt wird|
|`"max":x.x`|Maximum|
|`"min":x.x`|Minimum|
|`"d":{"inp":"..."}`|editierbare Zahl als String|

### Erfüllt
Falls gültige Zahl und Wert innerhalb optionaler min/max-Grenzen.

### Beispiel
```js
{
  "typ":"num",
  "min":"18",
  "name":"Alter",
  "hint":"in Jahren"
}
```

## Spinner
```js
"typ":"spin"
"items":[...]
```
Die Objekte in `"items"` sind von der Form `"..."` oder `{"text":"...","value":"..."}`.

||Beschreibung|
|---|---|
|`"d":{"inp":"..."}`|Der angezeigte Text vom gewählten Element oder der Text von `"value"`.|
|`"d":{}`|Falls kein Element ausgewählt ist.|
|`"default":"..."`|Legt ein `"value"` als default fest.|
|`"en_timestamp":true`|Timestamp freischalten (`"d":{"date":x}`)|

### Erfüllt
Falls ein Eintrag ausgewählt ist.

## Checklist
```js
"typ":"chk"
"items":[...]
```
`"items"` wie beim Spinner.

||Beschreibung|
|---|---|
|`"d":{"chk":[...]}`|Array aus: der angezeigte Text vom gewählten Element oder der Text von `"value"`.|

### Erfüllt
Immer

## Media
```js
"typ":"media"
```

||Beschreibung|
|---|---|
|`"max":x`|maximale Anzahl|
|`"en_video":true`|Video freischalten|
|`"d":{"pics":[...]}`|Array|

### Erfüllt
Wenn `"pics"` mindestens ein Bild enthält.

## Datum
```js
"typ":"date"
```

||Beschreibung|
|---|---|
|`"range":[a,b]`|Interval in Tagen relativ zu Heute|
|`"d":{"inp":"..."}`|Datum im Format `YYYY-MM-DD`|

### Erfüllt
Immer

## Unterschrift
```js
"typ":"sign"
```

||Beschreibung|
|---|---|
|`"d":{"filename":"..."}`|Dateiname|

### Erfüllt
unterschrieben

## Formular
```js
"typ":"form"
```
Beachte, dass ein Formular genauso ein Formularelement ist wie die anderen oben beschriebenen. Ein Formular besteht aus den Elemente in `"items`". In `"tmp"` sind Elemente aufgelistet, die durch einen Button hinzugefügt werden können. Das Feld `"name"` wird visuell in der Auflistung verwendet. Dabei bekommt jedes vom Benutzer erstellte Elemente ein Feld `"id"` mit einem automatisch generierten Wert.

||Beschreibung|
|---|---|
|`"items":[...]`|Ein Array aus Formularelementen|
|`"tmp":[...]`|Ein Array aus Formularelementen|

### Erfüllt
Wenn alle mit `"required":true` gekennzeichneten Elemente *Erfüllt* sind.

## Externe Aufgaben
```js
"typ":"ext"
```

||Beschreibung|
|---|---|
|`"by.id":"..."`|`"id"`-Feld vom Ziel|
|`"d":{"resid":"..."}`|Ergebnis-Id, vom Ziel generiert|

### Erfüllt
Wenn ein Ergebnis vorhanden ist.

# Speicherung
## Ergebnisse
Die App sendet jedes Ergebnis als JSONObject.

||Beschreibung|
|---|---|
|`"id":"..."`|Resultid|
|`"rel":"..."`|Verknüpfung zu etwas anderem|
|`"datum":`|Datum|
|`"krzl"`|Kürzel|
|`"fertig":true`|gibt an, dass mit grün abgehakt wurde, ansonsten ist es nur zwischengespeichert|
|`"items":[...]`|Ein Array aus Formularelementen|

Weiterhin gibt es noch Felder, die aus `"items"` extrahiert/konvertiert werden. Bei älteren Versionen fehlt `"items"` noch, da das Format damals noch nicht fertig war. Inzwischen werden diese Felder nicht mehr in der App, sondern auf dem Server generiert.

||Beschreibung|
|---|---|
|`"bilder"`|Bilder von dem Element mit `{"id":"media0","typ":"media"}`|
|`"bemerkung"`|Text von `{"id":0,"typ":"txt","hint":"Bemerkung"}`|

## Konfiguration

||Beschreibung|
|---|---|
|`"items":[...]`|Ein Array aus Formularelementen|