Form Component
Need a small backend tweak — a computed/derived field, a read-only field, a save-time rule or side-effect (Kafka, sync), or a custom permission? Don't reimplement the component. Override one extension seam on
FormComponentand keep the Core pipeline. See Extending Core Components · Seam Reference.
The default component for editing the main mediatype of a page. The React shell renders it as a two-column form with field-typed inputs (text, select, date, related-record pickers, toggles, …) grouped into optional sections, with a top-right Save button and a sticky left-side tab navigator.

A second example — a Users admin edit page with multiple sections ("User information", "Change password", "Groups"):

Related docs.
System Overview — RenderV2 — the request that returns{schema, data}to this widget.
6.0/React Components — Default Form Schema/Data — exact JSON shape the BFF emits.
Page Configuration — page-level flags (RETURN_URL,RETURN_AT_SAVE,SORTER, …) that affect the form wrapper.
What the React renderer gives you
- Field-typed inputs auto-derived from the
admFieldtype via the variant mapping (Boolean → switch, Date → date, Enum → select, Related → tree-select, …). - A sticky left-side tab navigator that lists all the form's sections plus all sibling components (RelatedList, RelatedForm, AutoComplete, etc.). Click a tab to scroll to that section.
- Top-right toolbar: Save (highlighted), audit/history button
(when
ALLOW_AUDIT_VIEWis on), tab-sorter (whenSORTERis on), Delete (when permitted). - Per-field validation with required-asterisks, inline error markers,
and the standard message vocabulary translated via
{DICT:...}. - "Unsaved changes" guard — set by
setDirty, triggers a confirm-prompt on navigation. - Bulk-edit mode when the user arrives via the list with multiple
selected ids (
/app/<pageKey>/<id1>,<id2>,...).
For a custom form-shaped widget, emit the Form Schema/Data shape and the React shell renders it with this same widget.
Configuration Keys
These are all available Configuration Keys for the Form Component.
The configuration must be inserted into the database table:
MIB3UX_PAGE_COMPONENT_CONFIGURATIONS
ALLOW_BULK_EDIT
Boolean. True (default): the page can be bulk-edited (when arrived
at with multiple ids). False: bulk-edit is disabled for this
component.
ASIDE_FIELDS
Specifies which columns are shown in a related aside for a specified column.
CONFIGURATION_KEY: ASIDE_FIELDS[<RELATED_FIELD>]
CONFIGURATION_VALUE: ID,NAME,SOURCE,DATEINS,INSTANCE_ID,OWNER
ASIDE_FILTERS
Add custom filter to items shown in related aside.
CONFIGURATION_KEY: ASIDE_FILTERS
CONFIGURATION_VALUE: { Field: 'GVP_GENRES[NAME]', Operator: 'EQUAL', Value: 'action' }
Per-field form:
CONFIGURATION_KEY: ASIDE_FILTERS[<RELATED_FIELD>]
CONFIGURATION_VALUE: <FILTER1>,<FILTER2>
Example:
CONFIGURATION_KEY: ASIDE_FILTERS[INSTANCE_ID]
CONFIGURATION_VALUE: { Field: 'NAME', Operator: 'STARTSWITH', Value: 'MIB' }
Dynamic value referencing a form field via
[templateComponentKey.columnName]:
{Field: 'SOURCE[ID]', Operator: 'EQUAL', Value: '[mib_default_edit_template_main.SOURCE]'}
It is important to pass [ID] (or whatever field the related uses as
its value), because by default MIB3 adds [NAME] as a filter of a
related field.
BATCH_REFERENCE_IDENTIFIER
Sets the batch reference to something other than the component's
default TemplateComponentKey. Used when multiple components share
a save batch.
DENY_ON_READONLY
Boolean. True: deny save on items where the user lacks permission on
any related component or field on the page. False: allow save even
if the user lacks permission on some related mediatypes.
EDIT_URL
URL of a page; used when this form component is reached from a parent
list. In the React era this must end with /<page-key>/{id} —
see ListComponent.EDIT_URL for the full
explanation of why the BFF's formPageKey regex requires the literal
{id} token.
CONFIGURATION_VALUE: /app/react_movies_edit/{id}
For legacy MVC pages: display/form_mediatype/{id} works as before.
EXCLUDE_FIELDS
A comma-separated list of admField column names that should not be
displayed to the user.
CONFIGURATION_KEY: EXCLUDEFIELDS
CONFIGURATION_VALUE: name,timezone,genres
EXCLUDE_BULK_EDIT_FIELDS
A comma-separated list of admField column names that should not be
displayed in the bulk-edit flow.
CONFIGURATION_KEY: EXCLUDEBULKEDITFIELDS
CONFIGURATION_VALUE: name,timezone,genres
HIDE_BULK_EDIT
Boolean. True: the bulk-edit affordance is disabled. False
(default): bulk-edit is enabled. Used when the page mediatype can be
edited but some related component cannot.
INCLUDE_FIELDS
A comma-separated list of admField column names. Forces the
component to display only these fields.
CONFIGURATION_KEY: INCLUDE_FIELDS
CONFIGURATION_VALUE: name,timezone,genres
MEDIATYPE (or MEDIA_TYPE)
The name of the mediatype loaded in the component. Both spellings are
accepted by the BFF for the Form Component — the hands-on
tutorial and most live customer migrations use
MEDIA_TYPE (with underscore). Use one consistently across a page.
READONLY
Boolean. True: forces the component to be read-only regardless of
user permissions. False (default): honour user permissions.
READONLY_FIELDS
A list of fields to be made read-only regardless of user permissions.
TITLE
The title rendered in the component header.
CREATE_ONLY_FIELDS
A list of column names that are writable only during creation. After creation, the fields become read-only and show a tooltip when the cursor hovers over the title.
CONFIGURATION_KEY: CREATE_ONLY_FIELDS
CONFIGURATION_VALUE: name,timezone,genres
The default tooltip can be customised via a dictionary entry:
<form>
<fieldCreationOnly>Default message</fieldCreationOnly>
</form>
FORMGROUPING
Splits the form into titled blocks. Each block lists the fields it
contains, in display order. Fields not in any block fall into a
default block.
[{
"order": 1,
"title": "Movie: Date & Location",
"fields": ["RELEASE_DATE", "COUNTRY"]
}, {
"order": 2,
"title": "Movie: Licensing",
"fields": ["LICENSE_START", "LICENSE_END"]
}, {
"order": 3,
"title": "Movie: Others",
"fields": ["DISTRIBUTOR_ID", "PRODUCER_ID"]
}]
Note
In React, ordering applies globally to the components on the page, so blocks may compete with the page's component structure when rendering. Parts of a component may end up at different positions on the page if grouping order conflicts with the page-level order.
REDIRECT_TO_EDIT_PAGE_BY_FIELD
Dictionary<string, string>. Defines a field whose value, when
clicked, renders as a link to the edit page of another content item.
Applicable only to Integer and Related admField types (the
discriminator is the admField type, not the resulting React
variant). The bracket key must match the field COLUMNNAME exactly
(matched case-insensitively).
React (MibReact). The value is the bare page key — no ~,
no app/ prefix, no {ID} placeholder.
CONFIGURATION_KEY: REDIRECT_TO_EDIT_PAGE_BY_FIELD[ID]
CONFIGURATION_VALUE: react_movies_edit
The BFF emits a link descriptor on the field props and the React
Form builds the route /${pageKey}/${id}:
Integerfield →props.link = { pageKey, id }, whereidis the field's own value. If the field value is empty,idis omitted and no link is rendered.Relatedfield →props.link = { pageKey }(noid; the id comes from the selected related item on the client).
Any other admField type (including Image, which shares the React
related variant) does not render a link.
Note
Legacy MIB (.cshtml). The value is a URL template: a leading
~// is trimmed and the id placeholder {ID} (uppercase,
case-sensitive) is replaced with the field value, e.g.
~app/mvp_movies_form/{ID}. Both a relative path and an absolute
URL are accepted. The React and legacy render paths are independent;
a page rendered through the React shell uses the bare-page-key form
above.
FIELD_PERSIST_FORMAT
Defines the persistence format of a Cron-expression field. Default is Unix format.
CONFIGURATION_KEY:FIELD_PERSIST_FORMAT[<FIELD_NAME>]CONFIGURATION_VALUE:Unix(default) orAws
Configurations Exclusive to React (MibReact)
The settings below apply only when the page is rendered through the
React shell (~/app/...).
MAX_FILE_SIZE
Limits upload sizes when the form has a file mediatype (e.g. Images).
May also be set application-wide via MaxFileSizeDefaultValue.
MAX_FILE_SIZE[FieldName]
Limits upload sizes for related fields that point to file mediatypes.
CUSTOM_FIELD_SCHEMA[FieldName]
Used to override default field schema properties such as layout and field-specific options. Set the configuration value according to the AdmFieldType of the target field.
{
"colFlex": 1,
"colSpan": 12,
"height": 300
}
ColorPicker Field
{
"colFlex": 1,
"colSpan": 12,
"disabled": true,
"disabledAlpha": true,
"allowClear": true,
"disabledFormat": true
}
Supported properties for ColorPicker fields:
colFlex: Controls the responsive width behavior of the field.colSpan: Controls how many columns the field spans in the form grid.disabled: Disables the field when the field is not already read-only by metadata.disabledAlpha: Hides the alpha channel control when set totrue.allowClear: Shows a clear action when set totrue.disabledFormat: Disables color format switching when set totrue.
Slider Field
{
"min": 0,
"max":100,
"step":0.5
}
Supported properties for Slider fields:
min:double, minimum value for the slider.max:double, maximum value for the slider.step:double, value step. Must be divisible bymax-min.
Money Field
{
"colFlex": 1,
"colSpan": 12,
"currency": "USD",
"precision": 2,
"maxDigits": 17,
"stringMode": true
}
Supported properties for Money fields:
colFlex: Controls the responsive width behavior of the field.colSpan: Controls how many columns the field spans in the form grid.currency:string, currency code used to render the currency symbol. Optional; the backend passes it through without ISO validation. Defaults to null (no symbol).precision:int, number of decimal places. Defaults to2.maxDigits:int, maximum number of digits accepted. Defaults to17.stringMode:bool, keeps the value as a string in the input to preserve high-precision decimals without floating-point rounding. Defaults totrue.
The stored value is a numeric decimal (AdmFieldType.Money), not a string.
DISABLE_IF_FILLED[FieldName]
Disables a field when another field or sibling component has a value.
Disable based on another field in the same form:
[
["{templateComponentKey}", "{otherFieldName}"]
]
Disable when a related list has items:
[
["{templateComponentKey}", "items"]
]
You can combine conditions — disable if any matches:
[
["movies-form", "Year"],
["genres-related-list", "items"]
]
CUSTOM_BEHAVIORS[FieldName]
Defines dynamic behaviour rules — when a criterion is met, apply an update to the field's schema and/or data.
Disable a field when another field is empty:
[
{
"criteria": {
"field": { "name": "password", "variant": "input" },
"operator": "isEmpty",
"value": true
},
"update": {
"schema": { "props": { "disabled": true } },
"data": { "force": true }
}
}
]
Clear and disable a field when another field has a specific value:
[
{
"criteria": {
"field": { "name": "provider", "variant": "select" },
"operator": "equal",
"value": { "label": "AgileTV", "value": 90 }
},
"update": {
"schema": { "props": { "options": [] } },
"data": { "value": [], "force": true }
}
}
]
For more information, click here.
RANGE_FIELDS[FieldName]
Supports a UI "range" field that maps two backend date fields to a single frontend RangePicker. The mapping is configured at the component level through the RangeFields dictionary in the form component configuration.
Configuration key: RangeFields
- Key: column name of the start field (for example,
DATE_FROM). - Value: a JSON string with the following properties:
end(required): column name of the end field (for example,DATE_TO).format(optional): frontend display format for the range (default:"DD/MM/YYYY").group(optional): logical group name used to identify the range if needed.
Example configuration:
{ "end": "DATE_TO", "format": "DD/MM/YYYY", "group": "broadcastPeriod" }
SECTION_BEHAVIORS
The value is a JSON string containing an array of section behavior rules.
It is used to control the visibility of form sections dynamically based on field values.
Important: The configuration must be applied to the page component that should be affected by the visibility change. For example, if the configuration is applied to "form_1" component, when the criteria is validated, "form_1" will become visible or invisible.
Syntax
The JSON structure is: [{"criteria":{"field":{"name":["componentKey","fieldName"],"variant":"fieldType"},"operator":"operator","value":value},"update":{"visible":true|false}}]
Example
[{"criteria":{"field":{"name":["user_form","user_type"],"variant":"select"},"operator":"equal","value":"Administrator"},"update":{"visible":true}}]
Details
criteria.field.name
Array format: ["componentKey", "fieldName"]
Example: ["user_form", "user_type"]
The componentKey refers to the component containing the field to observe, while fieldName is the field that will trigger the behavior.
criteria.field.variant
Field type: "input", "select", "checkbox", etc.
criteria.operator
Supported operators: "equal", "notEqual", "contains", "isEmpty", "isNotEmpty", "greaterThan", "lessThan", "in", "notIn"
criteria.value
Any JSON value (string, number, boolean, array, null)
update.visible
true: Show the section where this configuration is applied
false: Hide the section where this configuration is applied (fields remain in data, just not rendered)
Configuration Target
The SECTION_BEHAVIORS configuration is set on the target component that should be shown/hidden.
Example scenario:
- Page has two form components: "user_basic_info" and "user_admin_settings"
- You want to show/hide "user_admin_settings" based on a field in "user_basic_info"
- Apply SECTION_BEHAVIORS configuration to "user_admin_settings" component
- Set criteria.field.name to ["user_basic_info", "user_type"]
- When user_type changes in "user_basic_info", "user_admin_settings" visibility will update
Multiple Behaviors
Multiple behaviors can be defined in the same array:
[{"criteria":{"field":{"name":["form","field"],"variant":"select"},"operator":"equal","value":"show"},"update":{"visible":true}},{"criteria":{"field":{"name":["form","field"],"variant":"select"},"operator":"notEqual","value":"show"},"update":{"visible":false}}]
Notes
- The JSON must be minified (no line breaks) when stored in the database
- Invalid JSON will be ignored (section will remain visible)
- Field values are preserved even when section is hidden
- Behaviors are evaluated on field change events
- The configuration affects only the component where it is applied
Custom fields validation
Starting with Mib 6.0, custom validation criteria can be implemented for field persistence. For more information, click here
======= For more information, see the Dynamic Form Documentation.
CARD_FIELD[FieldName]
Note
This configuration is mostly used for the event edition form of the epg component, but it can be used for any form.
Used to enrich a related field into a card field. It is configured through the following json:
{
"ImageDefinition": {
"Type": "Url",
"ColumnName": "NAME"
},
"MetadataColumns": {
"Genre": "NAME"
},
"LinkFormPageKey": "epg_content_edit",
"DescriptionColumn": "NAME",
"TypeColumn": "EPG_PROGRAM_TYPE_ID"
}
Nowadays, the ImageDefinition only supports images stored in the database as a url.
The ColumnName property on ImageDefinition, as well as the DescriptionColumn and TypeColumn properties expect the column name of the related media type. Conversely, the (key, value) pairs on MetadataColumns obey the relation ([Frontent property]: [Column Name]).
List of available metadata properties:
- "genre"
- "year"
- "age"
- "rating"
Custom field validation
Starting with MIB 6.0, custom validation criteria can be implemented for field persistence. See Custom Validation plugin.
Schema and Data shape
The Form Component speaks the Default Form Schema
- Default Form Data shapes on the wire. Key parts:
- Schema carries
mediaType,fields[]with per-field{variant, config, props},title, and page-levelconfiguration(download,preview,createdAtAsUtc,addNew).addNew(bool) drives the form's "New" button. The BFF mirrors it from the page's create permission (buttons.Create= component create permission + edit mode +AllowCreate), so it matches the toolbarconfiguration.create. It is set uniformly on every form schema of the payload — media-type edit pages and the Authorization edit pages (Users/Groups/Instances/Account) alike.
- Data carries
id,fields(per-field values, with{id, title, value}triples for related-typed fields),permissions,checksum.
Custom form-shaped widgets that emit this shape get rendered by the same React form widget.
Source reference
| React type-key | form |
| BFF assembly | MibServer3.Web |
| BFF class | MibServer3.Web.Component.FormComponent |
MIB3UX_COMPONENTS.COMPONENT_KEY |
mib_default_formcomponent |
| React widget source | packages/core-components/src/components/form/Form.tsx |
| Schema / data contract | Default Form Schema |
Custom backend, core React. Emit the Default Form Schema + Data
shape from your MapSchema / MapData and set
MIB3UX_TEMPLATE_COMPONENTS.COMPONENT_VIEW_TYPE = 'form'. The widget
maps each AdmField variant to a control from
@agilecontent/ui (Input, Select,
AsyncSelect, TreeSelect, DatePicker, RangePicker, Switch,
TextArea, JsonEditor, Upload, etc.); your schema's
fields[].variant is what picks the control.
See also
- Page Configuration — page-level flags
- List Component — the list counterpart
- Simple Related List, Related Form, Related Auto Complete — the related-record siblings that live in the same page as a Form
- Auditing —
ALLOW_AUDIT_VIEWenables the audit drawer accessed from the Form's top-right toolbar - Custom Validation plugin, Custom Business Rule plugin
- Component Creation — author a custom form-shaped component
- 6.0/React Components — Default Form Schema — full JSON contract