Ga naar inhoud

Dynamische taakformulieren (DynamicForm)

Taakformulieren (de formulieren bij een Operaton-userTask) worden uit een JSON-spec opgebouwd en gerenderd met onze eigen DynamicForm-component — volledig in onze eigen layout (Tabler), zonder Form.io.

Hoe het samenhangt

bundle taakformulieren/<key>.json   →  seeder  →  DB (task_forms)  →  DynamicForm
        (developer, in git)                         (runtime, hotfix)   (rendering)
BPMN userTask formKey="portal:<key>"  ──────────────────────────────────┘
  • De developer schrijft de spec in de feature-bundle: resources/features/<naam>/taakformulieren/<key>.json.
  • De TaskFormSeeder zet die bij deploy in de tabel task_forms (key, name, schema).
  • Een BPMN-userTask verwijst ernaar met camunda:formKey="portal:<key>".
  • De portal rendert het taakscherm met DynamicForm.

De spec

{
  "key": "autorisatie-beoordelen",
  "name": "Autorisatieverzoek beoordelen",
  "schema": {
    "title": "Autorisatieverzoek beoordelen",
    "sections": [
      { "title": "Beoordeling", "columns": 1, "fields": [
        { "type": "textarea", "name": "opmerking", "label": "Opmerking beoordelaar",
          "validate": { "maxLength": 1000 } }
      ]}
    ]
  }
}
Niveau Sleutels
schema title?, sections[]
section title?, columns? (layout), fields[]
field type, name, label, readOnly?, placeholder?, help?, validate?, visibleWhen?, options?/optionsSource?
validate required, minLength, maxLength, pattern (+patternMessage)
visibleWhen { field, eq } · { field, in: [] } · { field, truthy }

Veldtypes: text, email, number, textarea, select, radio, checkbox. Opties via options (statisch) of optionsSource (dynamisch, bv. "roles").

Een veldtype toevoegen

  1. Maak resources/js/Components/DynamicForm/fields/MijnVeld.jsx (props: field, value, error, options, onChange).
  2. Registreer het in fieldRegistry.js: mijntype: MijnVeld.

Validatie leeft in validation.js, conditionals in conditions.js, opties in options.js.

Beheer: een fout snel herstellen (hotfix)

Beheer → Taakformulieren toont alle formulieren. Via Bewerken pas je de JSON-spec aan met een live preview. Bij opslaan:

  • wordt de spec structureel gevalideerd (TaakformulierSpec),
  • krijgt het formulier overridden = true — een volgende deploy overschrijft een in de portal gewijzigd formulier niet (de bundle blijft de canonieke bron).

Hotfix vs. bron

De beheer-editor is een portal-UI-actie (geen terminal) om een fout van een developer snel te herstellen. De echte fix hoort ook in de bundle-JSON terug, anders wijkt git af van de runtime. Wil je de bundle weer leidend maken, zet dan overridden terug op false (en deploy opnieuw).

Server-validatie

Dezelfde spec stuurt client én server: App\Support\TaakformulierSpec::regels($spec) leidt Laravel-validatieregels af (incl. required_if voor visibleWhen) voor wanneer een ingediend formulier wordt verwerkt. Vertrouw nooit alleen de client.

Verhouding tot Open Forms / Form.io

Voor publieke intakeformulieren gebruiken we Open Forms (zgw). Voor interne taakformulieren gebruiken we DynamicForm — eigen layout, in de portal beheerbaar. Het legacy publieke aanmelden-formulier draait nog op Form.io en blijft ongemoeid.