Ab Version 3.3 ist es möglich, FH-Complete mit User Defined Fields zu erweitern. Derzeit können Personen und Prestudenten mit Zusatzfeldern erweitert werden. Dadurch können bei Interessenten, Studierenden und Mitarbeitern zusätzliche Felder hinzugefügt werden. Diese können im FAS verwaltet und auch wieder exportiert werden.
Um UserDefinedFields hinzuzufügen, muss in der Datenbank in der Tabelle system.tbl_udf definiert werden welche UDF in welcher Tabelle zur Verfügung stehen sollen. Dies wird mit Hilfe eines JSON Schema definiert.
Um Beispielsweise die Schuhgröße erfassen zu können wird in der Tabelle system.tbl_udf folgender Eintrag hinzugefügt:
schema: public
table: tbl_person
jsons:
[{ "name": "udf_schuhgroesse", "description": "udf/schuhgroesseDescription", "placeholder": "udf/schuhgroessePlaceholder", "title": "udf/schuhgroesseTitle", "type": "dropdown", "sort":1, "defaultValue":"43", "listValues": { "enum": [ "42","43" ] }, "requiredPermissions": ["basis/person"] }]
Die Bezeichnungen werden mehrsprachig erfasst und daher im Phrasensystem in der Datenbank abgelegt. Dazu muss für die app „core“ die Phrase „udf/schuhgroesseDescription“ und „udf/schuhgroessePlaceholder“ erstellt werden. Dies erfolgt in den Tabellen system.tbl_phrase, system.tbl_phrasentext und system.tbl_app.
Nachdem die Einträge angelegt wurden, werden die Eingabefelder im FAS im Karteireiter Zusatzfelder angezeigt:
In der Datenbank existiert die Tabelle system.tbl_udf in dieser wird gespeichert welche Tabellen mit UserDefinedFields erweitert werden können.
system.tbl_udf table_schema varchar table_name varchar udf_schema jsonb
Die Grundstruktur wie das udf_schema JSON aussieht wird in einem eigenen JSON Schema definiert. Dieses wird im Filesystem abgelegt. udfmasterschema.json
In vordefinierten Tabellen wird eine Spalte udf_values hinzugefügt. In dieser Spalte werden die Daten der UserDefinedFields gespeichert.
zB
public.tbl_person person_id vorname nachname .... udf_values jsonb
{ "title": "UDF", "type": "object", "tableswhitelist":{ "type": "string", "enum": ["tbl_person", "tbl_prestudent","tbl_mitarbeiter","tbl_lehrveranstaltung","tbl_lehreinheit"] }, "properties": { "name": { "type": "string" }, "description": { "type": "array", }, "placeholder": { "type": "array", }, "title":{ "type": "array", }, "type": { "type": "string", "enum": ["checkbox","textfield","textarea","date","dropdown","multipledropdown"] }, "sort":{ "type": "integer" }, "defaultValue":{ "type": "string" }, "validation":{ "type": "object", "properties": { "required":{ "type": "boolean" }, "min-length":{ "type": "integer" }, "max-length":{ "type": "integer" }, "min-value":{ "type": "integer" }, "min-value":{ "type": "integer" }, "regex":{ "type": "object", "properties": { "language": "string", "expression": "string" } } }, }, "listValues":{ "type": "object", "properties": { "sql":{ "type":"string" }, "enum":{ "type":"array" }, }, }, }, "required": ["type","name"] }
[{ "name": "udf_schuhgroesse", "description": "udf/schuhgroesseDescription", "placeholder": "udf/schuhgroessePlaceholder", "title": "udf/schuhgroesseTitle", "type": "dropdown", "sort":1, "defaultValue":"43", "validation": { "required":true, "min-value":10, "max-value":100, "regex":[{ "language": "php", "expression": "/[1-9]*/" },{ "language": "js", "expression": "/[0-9]*/" }] }, "listValues": { "enum": [ "42","43" ] }, "requiredPermissions": ["basis/person"] }, { "name": "udf_kleriker", "description": "udf/klerikerDescription", "placeholder": "udf/klerikerPlaceholder", "title": "udf/klerikerTitle", "type": "checkbox", "sort":2, "defaultValue":false, "requiredPermissions": ["basis/person"] }]
Bei den ListValues können derzeit keine Phrasennamen verwendet werden. Statt enum kann hier auch sql verwendet werden. Dabei wird anstatt einer fixen Liste ein SQL Befehl hinterlegt der die Daten für das Dropdown liefert. Der SQL muss 2 Spalten mit den verpflichtenden Titeln „id“ und „description“ zurückliefern, wobei „id“ der Wert ist, der im UDF gespeichert wird und „description“ der angezeigte Text im UDF.
Die Spalte udf_values in tbl_person enthält lediglich die Daten des Eingabefeldes:
{ "udf_schuhgroesse": "44", "udf_kleriker": true, "udf_arrayvalue": ["1", "2"], "udf_nullvalue": null, "udf_stringvalue": "string" }
[{ "name": "udf_example1", "sort": 1, "type": "multipledropdown", "title": "udf/example1Title", "listValues": { "enum": [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50] }, "validation": { "regex": [ {"language": "php", "expression": "/^[0-9]+$/"}, {"language": "js", "expression": "/[0-9]*/"} ], "required": true, "min-value": 40, "max-value": 50 }, "description": "udf/example1Description", "placeholder": "udf/example1Placeholder", "defaultValue": 42, "requiredPermissions": ["basis/person"] }, { "name": "udf_example2", "sort": 2, "type": "dropdown", "title": "udf/example2Title", "listValues": { "enum": [[10, 50], [11, 51], {"id": 12, "description": 52}, [13, 53], [14, 54], [15, 55], [16, 56], [17, 57], [18, 58], [19, 59]] }, "validation": { "regex": [ {"language": "php", "expression": "/^[0-9]+$/"}, {"language": "js", "expression": "/[0-9]*/"} ], "required": false, "min-value": 10, "max-value": 19 }, "description": "udf/example2Description", "placeholder": "udf/example2Placeholder", "defaultValue": 15, "requiredPermissions": ["basis/person"] }, { "name": "udf_example5", "sort": 5, "type": "dropdown", "title": "udf/example5Title", "listValues": { "sql": "WITH RECURSIVE t(id, description) AS (VALUES (10, 60) UNION ALL SELECT id + 1, description + 1 FROM t WHERE id < 20) SELECT id, description FROM t" }, "validation": { "regex": [ {"language": "php", "expression": "/^[0-9]+$/"}, {"language": "js", "expression": "/[0-9]*/"} ], "required": false, "min-value": 10, "max-value": 19 }, "description": "udf/example5Description", "placeholder": "udf/example5Placeholder", "defaultValue": 12, "requiredPermissions": ["basis/person"] }, { "name": "udf_example3", "sort": 3, "type": "textarea", "title": "udf/example3Title", "validation": { "regex": [ {"language": "php", "expression": "/^[a-zA-Z0-9]+$/"}, {"language": "js", "expression": "/^[a-zA-Z0-9]+$/"} ], "required": true, "min-length": 2, "max-length": 20 }, "description": "udf/example3Description", "placeholder": "udf/example3Placeholder", "defaultValue": "Ex3", "requiredPermissions": ["basis/person"] }, { "name": "udf_example4", "sort": 4, "type": "textfield", "title": "udf/example4Title", "validation": { "regex": [ {"language": "php", "expression": "/^[0-9]+$/"}, {"language": "js", "expression": "/[0-9]*/"} ], "required": false, "min-value": 1, "max-value": 99, "min-length": 1, "max-length": 2 }, "description": "udf/example4Description", "placeholder": "udf/example4Placeholder", "defaultValue": 1, "requiredPermissions": ["basis/person"] }, { "name": "udf_example6", "sort": 6, "type": "checkbox", "title": "udf/example6Title", "validation": { "required": true }, "description": "udf/example6Description", "defaultValue": false, "requiredPermissions": ["basis/person"] }]