Das Forms-Addon besteht aus einem i-doit-kompatiblen Add-on und einer Backend-Applikation. Das Backend ist für die Datenhaltung verantwortlich und wird über eine REST-API bedient.
Du kannst i-doit als Proxy verwenden, um mit dem Forms-Backend zu kommunizieren. Das setzt jedoch eine valide Benutzersession in i-doit voraus. Alternativ sprichst du die Forms-Backend-API direkt an. Dieses Dokument geht von einer direkten Kommunikation aus.
Keine serverseitige Validierung
Das Backend enthält keinerlei logische Validierungen -- diese Aufgabe übernimmt ausschließlich das Frontend. Bei einer direkten API-Nutzung verzichtest du vollständig auf Kontrollstrukturen. Beachte das bei der Nutzung.
Für die Nutzung von i-doit-Attributen setzt du zusätzlich die Forms-Addon-API voraus, um auf essentielle Attributinformationen zuzugreifen.
Die Authentifizierung gegen das Forms-Backend erfolgt mit Benutzername und API-Schlüssel -- dieselben Konfigurationsparameter, die du in der i-doit-Konfiguration hinterlegt hast:
1234567
POST http://localhost:3000/login
Content-Type: application/json
{
"apikey": "APIKEY",
"name": "USERNAME"
}
Bei erfolgreicher Authentifizierung erhältst du einen JSON Web Token:
123
{
"access_token": "{JWT_TOKEN}"
}
Den Token gibst du fortan in jedem Request im Authorization-Header an, sofern der Endpunkt eine Authentifizierung voraussetzt. Beispiel:
12
GET http://localhost:3000/api/form
Authorization: bearer {JWT_TOKEN}
Ein Token ist standardmäßig 60 Minuten gültig. Nach Ablauf musst du dich erneut einloggen.
GET http://localhost:3000/api/form/6245bf4f36f695945b3df9be
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MWU2YThlNmY1ZTMxYjI5NzAwOTMxOWEiLCJuYW1lIjoic2VsY3VrIiwic3ViIjoiJDJhJDEwJFJ4YlRybVpUVXlXc1NSQ2VZTFR6enVBZXJZTUF1dUlsNU5qOWt5RFN4WXlFL0NsdG1iLmY2IiwiaWF0IjoxNjU3MjkyNTAxLCJleHAiOjE2NTcyOTYxMDF9.yEZAjFAGpOCbDsJuI_vqot5J75MOE0bKPPn8osQS0Ik
Über diesen Endpunkt erstellst du neue Formulare. Die Definition erfolgt über JSON mit folgender Struktur:
1 2 3 4 5 6 7 8 910
{
// Name des Forms
"name": "My Form",
// Struktur
"shape": {
...
},
// Veröffentlichungsstatus
"published": false
}
Die Struktur des Formulars gibst du unter shape an. Sie bildet eine normalisierte und hierarchische Struktur ab. Auf der ersten Ebene enthält sie alle verfügbaren Knoten-Elemente: Überschriften, Texte, Trennlinien, i-doit-Kategorie-Attribute und Seiten.
Es ist sicherzustellen, dass die Knoten-IDs (root, SEITE_1, SEITE_2,…) einzigartig sind und keine Wiederholungen aufweisen.
Im Folgenden siehst du eine vollständige Struktur eines Formulars, das aus zwei Seiten ("SEITE_1" und "SEITE_2") besteht. Jede Seite beinhaltet eine Überschrift und eine Textbeschreibung.
{
"Text165729439981501359363935038671": {
"children": [],
"config": {
// Type des Knotens: Text
"type": "Text",
"props": {
// Anzuzeigender Text
"text": "Page 2 Text",
// Platzhalter: Wird angezeigt, sofern der Inhalt im Frontend geleert wird
"placeholder": "Enter your text",
// Sichtbarkeit: Soll das Element versteckt werden?
"hidden": true
}
}
}
}
Dieser Typ ist komplexer als die vorherigen und enthält daher mehr Konfigurationsparameter. Die Parameter unterscheiden sich je nach Typ des Kategorieattributs.
Die grundlegende Datenstruktur wird am Beispiel des Attributs Allgemein > Bezeichnung beschrieben:
{
"Attribute165731273460305039947937820184": {
"children": [],
"config": {
// Type des Knotens: Kategorieattribut
"type": "Attribute",
"props": {
// Attribut-ID: Zusammensetzung aus der Konstante der Kategorie und des technischen Attributidentifikators
"attribute": "C__CATG__GLOBAL.title",
// Standardmäßige Bezeichnung des Feldes im Formular, sofern "label" nicht angegeben wurde
"defaultLabel": "Bezeichnung (Allgemein)",
// Feldbezeichnung
"label": "BEZEICHNUNG",
// Handelt es sich um ein Pflichtfeld?
"required": false,
// Wird das Attribut i-doit-seitig vorausgesetzt? Nativ oder aber über die Validierungskonfiguration.
"isSystemRequired": false,
// Label der Kategorie
"categoryLabel": "Allgemein",
// Attributtyp
"type": "text",
// Ist das Feld sichtbar?
"hidden": false,
// Standardwert
"defaultValue": "Vorausgefüllter Wert"
}
}
}
}
Einige Konfigurationsparameter werden von der Forms-Addon-API vorgegeben. Sie bestehen aus statischen oder dynamischen Werten:
attribute*: statischer Wert
type* : statischer Wert, gibt den Attributtypen wieder
isSystemRequired : variabler Wert, wird auf Basis der Validierung oder nativ berechnet
Dieser Parameter überschreibt required, sofern das Attribut system-seitig vorausgesetzt wird.
defaultValue : variabler Wert, wird vorausgefüllt, sofern der Objekttyp ein Default-Template adressiert, welches ein Wert für das Attribut definiert
Eine fehlerhafte Angabe von isSystemRequired wird zwangsläufig in einen Fehler beim Submit des Formulars führen, sofern required nicht true ist. defaultValue ist nicht zwingend notwendig, sofern die Werte aus dem Default-Template nicht berücksichtigt werden sollen.
All diese Informationen ermittelst du über die Forms-Addon-API:
1
GET https://idoit-instance/forms/api/attribute?category=C__CATG__GLOBAL,C__CATG__ACCOUNTING&class=C__OBJTYPE__SERVER
category enthält eine kommaseparierte Liste an Kategoriekonstanten. class enthält die Objekttypkonstante und wird benötigt, um defaultValue zu ermitteln. Beispielhafte Rückgabe:
i-doit verfügt über Attribute, die eine Abhängigkeit zu einem anderen Attribut innerhalb der Kategorie aufweisen. Ein einfaches Beispiel ist Modell > Modell, das von Modell > Hersteller abhängt.
Das Forms-Addon-Frontend enthält Kontrollmechanismen, die erkennen, wenn du Modell > Modell (Child) ohne Modell > Hersteller nutzt, und das Parentattribut automatisch hinzufügen.
Diese Attribute identifizierst du anhand ihrer Metadaten: Das Childattribut enthält eine parent- und das Parentattribut eine children-Information: