Widget reference

Form widget: volledige instelling reference

Form widget is bedoeld voor dashboardformulieren: invoervelden renderen in de widget, waarden doorzetten naar datasource filterparams, een webhook aanroepen, of beide in één submit.

Dit is de widget voor use-cases zoals Element datasources met runtime filters, selectieformulieren, zoekpanelen en actieformulieren met optionele audit webhook.

1. Core gedrag

Wat deze widget doet

  • Rendert formuliervelden direct in een dashboardwidget.
  • Stuurt veldwaarden door naar datasourcefilters, webhook, of beide.
  • Kan meerdere target datasources tegelijk patchen via targetDataSourceUids.
  • Kan keuzevelden vullen uit statische opties of uit een datasource.

Belangrijke runtime notities

  • fields[].key is tegelijk de formulierkey, de datasource filterkey en de webhook param key, behalve voor display-only html-velden.
  • editor-velden zijn juist wél actief: die sturen rich HTML mee naar filters/webhook.
  • Form widget vereist geen page filter definitie voor die keys.
  • Als een datasource filters als request params forwardt, gedraagt een form field zich standaard zoals een normale page filter: request param naar de datasource en, als de kolom bestaat, ook een lokale DuckDB filter.
  • repeater-velden zijn de uitzondering: die gaan altijd request-only als één JSON datasource-param en worden niet als lokale DuckDB filter uitgelegd.
  • Laat je targetDataSourceUids leeg, dan gebruikt de widget eerst dataSourceUid en anders de primary datasource.
  • Breedtes full, half, third, quarter, fifth en sixth mappen naar een interne 60-koloms layout; mobiel valt terug naar één kolom.
  • date-velden volgen dezelfde daterange-contracten als de normale dashboardfilters: submit gebruikt {key}From en {key}To, waarbij To de exclusieve bovengrens van de gekozen einddag is.
  • time-velden bewaren een lokale HH:mm-waarde en submitten die direct onder de veldkey, zonder verborgen datum of UTC-conversie.
  • Zet je een number-veld op valueType: currency, dan rendert de invoer als echte valuta-input met configureerbare currencyCode en currencyDisplay, terwijl submit nog steeds een numerieke waarde verstuurt.
  • Widget state wordt per gebruiker onthouden in userSettings, gescoped op pagina + widget-id, zodat je bij terugkomen je laatste formulierwaarden terugziet.
Key Type Beschrijving
submitModefilters / webhook / bothBepaalt of submit filters bijwerkt, webhook triggert, of beide doet.
targetDataSourceUidsstring[]Optionele lijst van datasources die de filterpatch moeten ontvangen.
buttonLabelstringTekst op de submitknop.
buttonIconstringPrimeIcon class, bijvoorbeeld pi pi-send.
buttonSeverityPrimeNG severityKnopstijl zoals primary, info of danger.
filterSuccessMessagestringOptionele succesmelding nadat filters zijn bijgewerkt in filters-mode.
bothSuccessMessagestringOptionele succesmelding voor de filterfase in both-mode, voordat webhook statusupdates binnenkomen.
confirmBeforeSubmitbooleanDefault true. Toont eerst een bevestigingsdialoog; die dialoog gebruikt geen backdrop/mask.
clearAfterSubmitbooleanZet alleen de widgetvelden terug naar hun default/state startwaarde na een succesvolle submit.
persistedStateautomatischDe widget bewaart runtime veldwaarden standaard in user settings per pagina + widget, vergelijkbaar met dashboardfilters.
fieldsarraySchema van de formuliervelden.

2. Veldschema

Field key Type Uitleg
keystringVerplicht en uniek binnen het formulier. Dit is de runtime key die naar filters/webhook gaat.
labelstringUI label; bij leeg wordt key gebruikt.
typetext, textarea, number, date, time, dropdown, multiselect, checkbox, toggle, editor, html, repeaterControleert welke PrimeNG input wordt gerenderd. date is een daterange-picker; time bewaart een lokale HH:mm-tijd.
placeholderstringOptioneel voor tekst-, textarea-, number-, date- en selectvelden.
contentstringAlleen voor html. Rauwe tekst/HTML die als display-only inhoud in het formulier wordt gerenderd.
allowDecimalsbooleanAlleen voor number. Laat decimalen toe; decimal, currency en percent forceren dit ook.
min / maxnumberAlleen voor number. Optionele onder- en bovengrens.
stepnumberAlleen voor number. Stapgrootte van de PrimeNG InputNumber knoppen/invoer.
minFractionDigits / maxFractionDigitsnumberAlleen voor number. Bepaalt hoeveel decimalen zichtbaar/toegestaan zijn.
currencyCode / currencyDisplaystringAlleen relevant wanneer type = number en valueType = currency. Stuurt de zichtbare valuta aan, bijvoorbeeld EUR met symboolweergave.
requiredbooleanBlokkeert submit zolang het veld leeg is.
widthfull, half, third, quarter, fifth, sixthLayoutbreedte binnen de widgetgrid.
valueTypefilter value typeCoercion naar runtime filter/webhook waarde, bijvoorbeeld number, date of datetime.
visibleWhenarrayToont een veld alleen wanneer alle regels matchen.
enabledWhenarrayLaat een veld zichtbaar maar disabled totdat alle regels matchen.
requiredWhenarrayMaakt een veld conditioneel verplicht bovenop de basis required.
clearOnParentChangebooleanReset het veld naar de default/startwaarde zodra een afhankelijk bronveld verandert.
submitWhenHiddenbooleanStuurt verborgen veldwaarden toch mee; default is verborgen velden overslaan.
requestOnlybooleanOpt-in escape hatch: stuur dit veld alleen als datasource request-param en sla de lokale DuckDB filter over.
rowFieldsarrayAlleen voor repeater. Definieert het schema van elk object in de array.
minRows / maxRowsnumberMinimaal en maximaal aantal regels voor een repeater.
addRowLabelstringTekst op de knop om een extra regel toe te voegen.
emptyStateTextstringTekst die getoond wordt wanneer een repeater nog geen regels bevat.

Layout interpretatie

  • full: 1 veld per rij.
  • half: 2 velden per rij vanaf medium/desktop breedte.
  • third: 3 velden per rij vanaf xl/desktop breedte.
  • quarter: 4 velden per rij vanaf xl/desktop breedte.
  • fifth: 5 velden per rij vanaf xl/desktop breedte.
  • sixth: 6 velden per rij vanaf xl/desktop breedte.
  • Op small screens vallen alle velden terug naar full width.
  • editor-velden gebruiken standaard een hogere editorhoogte, maar volgen verder dezelfde breedteregels als andere velden.

Type-specifieke notities

  • date gebruikt een PrimeNG daterange-picker en submit als {key}From / {key}To. To is de echte exclusieve volgende dag, net als in de filterbalk.
  • editor gebruikt dezelfde rich HTML editorstijl als de webhook widget en submit de HTML string.
  • html blijft een passief displayblok voor uitleg of markup en valideert/verstuurt niets.
  • number kan integer of decimal zijn, met optionele min, max, step en fraction digits.

Repeater / array-of-objects

  • Gebruik type: "repeater" wanneer één veld eigenlijk een lijst van regels is, bijvoorbeeld business rules of meerdere voorwaarden.
  • Elke regel gebruikt het schema uit rowFields en levert één object op in de uiteindelijke array.
  • Webhook submit houdt die waarde als echte JSON-array van objecten.
  • Datasource submit verstuurt dezelfde array als één JSON query param, zodat Element of API datasources hem kunnen uitlezen zonder querystring flattening.
  • Gebruikers kunnen repeater-regels in de widget zelf omhoog of omlaag verplaatsen met de inline actieknoppen.
  • rowFields kunnen binnen dezelfde regel ook hun eigen visibleWhen, enabledWhen, requiredWhen, clearOnParentChange, submitWhenHidden en optionFilterBindings gebruiken.
  • Nested repeaters worden bewust niet ondersteund; rowFields zijn in v1 alleen normale inputtypes.

Volgorde aanpassen

  • De volgorde van top-level velden en repeater rowFields volgt direct de arrayvolgorde in de widgetconfig.
  • In de widget editor kun je die volgorde aanpassen met de up/down knoppen op elk veldblok; er is geen aparte sort-index nodig.

3. Afhankelijkheden en parent/child gedrag

Rule key Type Beschrijving
fieldKeystringDe key van het bronveld waar deze regel naar kijkt.
operatorequals, notEquals, in, notIn, isEmpty, isNotEmpty, truthy, falsyVergelijkingsoperator voor de parent/child logica.
valueanySingle waarde voor equals of notEquals.
valuesarrayLijst van waarden voor in of notIn.

Hoe de widget dit interpreteert

  • Elke block visibleWhen, enabledWhen en requiredWhen werkt als AND: alle regels moeten matchen.
  • Je kunt hiermee bijvoorbeeld een tekstveld pas tonen als een toggle aan staat, of een child veld pas verplicht maken als een parent dropdown een bepaalde waarde heeft.
  • Verborgen of disabled velden worden standaard niet meegestuurd naar filters of webhook, tenzij submitWhenHidden expliciet aan staat.
  • clearOnParentChange is handig voor child dropdowns of tekstvelden die niet geldig blijven als de parentkeuze verandert.
  • requestOnly gebruik je alleen wanneer een veld wel een datasourceparam moet zijn, maar niet als lokale filter op de gerenderde DuckDB rows mag landen.
  • Voor repeater-velden werken dezelfde dependencyblokken ook binnen één regel: een rowField kan dus reageren op andere velden in dezelfde regel.

4. Keuzevelden en optiebronnen

Key Gebruik Notities
optionsSourcestatic / datasourceAlleen relevant voor dropdown en multiselect.
options[]array van { label, value }Statische keuzes; value mag string, number, boolean of JSON-parsebare literal zijn.
optionsDataSourceUidstringOptionele aparte datasource voor keuzeopties. Bij leeg valt de widget terug op de widget datasource of primary datasource.
optionsValueFieldstringKolom die als option value gebruikt wordt. Bij leeg valt dit terug op de veld key.
optionsLabelFieldstringKolom voor het zichtbare label. Bij leeg wordt de value getoond.
optionsFilterobjectExtra filterobject bovenop de actieve dashboard filters voor de option lookup.
optionFilterBindingsarrayMapt waarden uit andere formuliervelden naar datasource filterparams voor de option lookup.

Lookup gedrag

  • Datasource-backed keuzevelden gebruiken distinct values uit de gekozen datasource.
  • Actieve dashboardfilters worden meegenomen in de option lookup.
  • De huidige veldkey zelf wordt uit die option lookup filters verwijderd om self-filter loops te voorkomen.
  • optionFilterBindings laat child dropdowns of multiselects reageren op eerdere veldkeuzes zonder aparte page filters.
  • Binnen een repeater kijkt optionFilterBindings van een rowField alleen naar sibling velden in dezelfde regel, niet naar andere regels.
  • Resultaten worden alfabetisch/numeriek gesorteerd op label.

5. Submit modes en webhook

Mode Gedrag Benodigde keys
filtersPatcht veldwaarden naar datasource filterparams.fields
webhookStuurt veldwaarden als webhook params.fields plus webhookId of url
bothDoet eerst de filterpatch en start daarna de webhook.fields plus webhookId of url
Webhook key Type Beschrijving
webhookIdstringOptionele technische ID voor tracing/logica.
urlstringWebhook endpoint.
methodGET/POST/PUT/PATCH/DELETEHTTP methode, default POST.
headersobject of arrayExtra request headers.
authobjectZelfde auth schema als de losse Webhook widget.
refreshAfterRunbooleanHerlaadt dashboarddata na een succesvolle webhookrun.

Praktische use-cases

  • Element datasource trigger: submit naar filters zodat een datasource opnieuw laadt met runtime params.
  • Lead/contact formulier: submit naar webhook zonder datasourcekoppeling.
  • Workflow + dashboard refresh: gebruik both om filters te updaten én een audit/side-effect webhook te sturen.

Statusmeldingen en validatie

  • Gebruik filterSuccessMessage en bothSuccessMessage om de groene submitmelding aan te passen.
  • Webhook statusmeldingen zoals running/completed blijven uit de webhook stream komen en kunnen de eerdere filtermelding overschrijven.
  • Validatie- en webhookfouten worden in de widget niet dubbel getoond wanneer summary en detail dezelfde tekst hebben.

6. Voorbeeld form options JSON

{
  "submitMode": "both",
  "targetDataSourceUids": ["customer_search"],
  "buttonLabel": "Zoeken",
  "buttonIcon": "pi pi-search",
  "buttonSeverity": "primary",
  "clearAfterSubmit": false,
  "fields": [
    {
      "key": "customerId",
      "label": "Klantnummer",
      "type": "text",
      "required": true,
      "width": "half"
    },
    {
      "key": "status",
      "label": "Status",
      "type": "multiselect",
      "width": "half",
      "visibleWhen": [
        { "fieldKey": "includeInactive", "operator": "truthy" }
      ],
      "clearOnParentChange": true,
      "optionsSource": "static",
      "options": [
        { "label": "Actief", "value": "active" },
        { "label": "Inactief", "value": "inactive" }
      ]
    },
    {
      "key": "country",
      "label": "Land",
      "type": "dropdown",
      "width": "third",
      "optionsSource": "datasource",
      "optionsDataSourceUid": "country_options",
      "optionsValueField": "code",
      "optionsLabelField": "name",
      "optionsFilter": { "enabled": true },
      "optionFilterBindings": [
        { "sourceFieldKey": "customerId", "targetFilterKey": "customerId" }
      ]
    },
    {
      "key": "includeInactive",
      "label": "Inclusief inactief",
      "type": "toggle",
      "width": "third"
    },
    {
      "key": "notes",
      "label": "Opmerking",
      "type": "textarea",
      "width": "full",
      "placeholder": "Optionele context voor de webhook"
    },
    {
      "key": "rules",
      "label": "Business rules",
      "type": "repeater",
      "width": "full",
      "requestOnly": true,
      "addRowLabel": "Regel toevoegen",
      "emptyStateText": "Nog geen regels toegevoegd.",
      "rowFields": [
        {
          "key": "field",
          "label": "Veld",
          "type": "text",
          "width": "third"
        },
        {
          "key": "operator",
          "label": "Operator",
          "type": "dropdown",
          "width": "third",
          "optionsSource": "static",
          "options": [
            { "label": "Is gelijk aan", "value": "equals" },
            { "label": "Is niet gelijk aan", "value": "notEquals" }
          ]
        },
        {
          "key": "value",
          "label": "Waarde",
          "type": "text",
          "width": "third"
        }
      ]
    }
  ],
  "webhookId": "audit_customer_search",
  "url": "https://api.example.com/audit",
  "method": "POST",
  "headers": [
    { "key": "X-Flow", "value": "customer-search" }
  ],
  "refreshAfterRun": true
}