SolidX
ReferenceMetadata Schema

Views

Metadata schema for defining generated UI views in SolidX.

View Metadata

Where it lives

JSON Pointer: /views JSONPath: $.views Parent: Root of the metadata document

Overview

View metadata defines how SolidX presents models and fields to end users.

If field metadata answers "what does this field mean?", view metadata answers "how should this field appear here?"

This page is the primary reference for:

  • top-level view records
  • layout attrs
  • field-node attrs inside layouts
  • widget selection through editWidget and viewWidget
  • widget-specific attrs
  • real metadata examples for form, list, and tree rendering

For field semantics, validation intent, persistence behavior, and field-level attrs, see Field Metadata.

How To Read This Page

SolidX has multiple view families, but not all of them need the same kind of documentation.

  • form and list are the primary homes for field widget documentation
  • tree reuses the same field-column widgets as list
  • card and kanban are driven more by card composition and card widgets than by per-field widget catalogs

That is why the field list is repeated here by view family. The field contract lives on the field metadata page; the rendering contract lives here.

Common View Shape

Every view record follows the same top-level pattern:

{
  "name": "application-list-view",
  "displayName": "Applications",
  "type": "list",
  "context": "{}",
  "moduleUserKey": "merchant-onboarding",
  "modelUserKey": "application",
  "layout": {
    "type": "list",
    "attrs": {},
    "children": []
  }
}

View Metadata Attributes

AttrPurpose
nameInternal identifier for the view record
displayNameUser-facing label for the view
typeView family such as form, list, tree, card, or kanban
contextOptional serialized context used by the view
moduleUserKeyModule that owns the view
modelUserKeyModel rendered by the view
layoutThe actual layout tree, including layout attrs and child nodes
onFieldChangeOptional field-change workflow hooks for form-driven experiences
onFormLayoutLoadOptional hooks that run when a form layout loads

List View

Use list when users need a tabular view over many records.

Common list Layout Attrs

AttrPurpose
paginationEnables paginated browsing
pageSizeOptionsControls the selectable page sizes
enableGlobalSearchEnables global search across searchable columns
createEnables create actions from the list screen
editEnables edit actions from the list screen
deleteEnables delete actions from the list screen
rowButtonsAdds custom row-level actions
headerButtonsAdds custom list-level actions
allowedViewsLets users switch between compatible view families
truncateAfterTruncates text-like cell output after a character count and shows the full value in the cell tooltip

Common list Field-Node Attrs

These attrs belong to the layout node, not to the field metadata entity:

AttrPurpose
nameChooses the field to render
labelOverrides the default column header
sortableEnables sorting for the column
filterableEnables column-level filtering
isSearchableIncludes the field in global search flows
viewWidgetSelects a custom list or tree widget

shortText

By default, shortText renders as a standard text column.

The default list renderer is DefaultTextListWidget, which is used automatically when no custom viewWidget is set. This default path also respects the list-level truncateAfter attr, so it is the main way to control truncation for long textual values in list and tree views.

ConcernHow it works
Default widgetDefaultTextListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "bankUserId",
    "isSearchable": true
  }
}
WidgetUse whenExtra attrs
MaskedShortTextListViewWidgetThe column should hide the underlying value and show a masked version insteadNone
SolidShortTextAvatarWidgetThe column should display an avatar-style badge next to the valueinitialsKey when the row value is object-shaped
SolidShortTextFieldImageListWidgetThe stored value is an image URL and the column should render a thumbnailNone

MaskedShortTextListViewWidget

AttrPurpose
No extra attrsThis widget simply replaces the visible value with a same-length masked string.
{
  "type": "field",
  "attrs": {
    "name": "paymentGatewayAccessSecret",
    "viewWidget": "maskedShortTextList",
    "sortable": true,
    "filterable": true,
    "isSearchable": true
  }
}

SolidShortTextAvatarWidget

AttrPurpose
initialsKeyWhen the rendered row value is an object rather than a plain string, this attr tells the widget which nested property should be used to compute the visible label and avatar initials.

Example coming soon..

SolidShortTextFieldImageListWidget

AttrPurpose
No extra attrsThis widget treats the field value as an image URL, renders a thumbnail, and opens the image in the built-in lightbox on click.

Example coming soon..

longText

In list and tree views, longText reuses the standard text-column path.

Unlike form rendering, longText does not currently have dedicated list or tree widgets of its own. It behaves like a text column and relies on the same shared truncation and search mechanics as other text-style scalar fields.

ConcernHow it works
Default widgetDefaultTextListWidget
Widget selectionApplied automatically through the shared text-column path
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "description"
  }
}

No additional list or tree widgets are currently registered specifically for longText.

The supported alternative widgets for longText are form-specific and are documented under Form View > longText below.

richText

In list and tree views, richText reuses the standard text-column path.

It does not currently have dedicated list or tree widgets of its own. In these views, it behaves like a text column and relies on the same shared truncation and search mechanics as other text-style scalar fields.

ConcernHow it works
Default widgetDefaultTextListWidget
Widget selectionApplied automatically through the shared text-column path
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "content",
    "label": "Content",
    "sortable": true,
    "filterable": true
  }
}

No additional list or tree widgets are currently registered specifically for richText.

json

Core form rendering is supported for json, but list and tree support is currently limited.

The core list-column dispatch does not currently include a dedicated json renderer, so JSON fields should not be assumed to have the same out-of-the-box list support as scalar text fields.

ConcernHow it works
Default widgetNo dedicated core list widget is currently wired for json
Widget selectionNo core json list-column path is currently registered in list dispatch
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrsNone specific to json at the core list level
Show example from metadata
{
  "type": "field",
  "attrs": {
    "name": "deviceRecognitionVerdict"
  }
}

No dedicated core list or tree widgets are currently registered specifically for json.

int

By default, int renders as a numeric column that reuses the shared text-style cell widget while preserving numeric table alignment.

The core list-column path routes int through SolidIntColumn, which applies numeric cell styling and then renders values through DefaultTextListWidget unless a custom viewWidget is provided.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared numeric column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "pageCount",
    "label": "Page Count"
  }
}

No additional core list or tree widgets are currently registered specifically for int.

bigint

In list and tree views, bigint currently reuses the same numeric column path used for int.

The core list-column path routes bigint through SolidBigintColumn, which delegates to SolidIntColumn. As a result, bigint receives numeric table alignment but still renders through DefaultTextListWidget by default.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared numeric column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "id"
  }
}

No additional core list or tree widgets are currently registered specifically for bigint.

decimal

By default, decimal renders as a numeric column that reuses the shared text-style cell widget while preserving numeric table alignment.

The core list-column path routes decimal through SolidDecimalColumn, which delegates to the same numeric column implementation used for int. This means decimal values inherit the standard text-cell rendering behavior unless a custom viewWidget is provided.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared numeric column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "latePaymentFees",
    "sortable": true,
    "filterable": true,
    "isSearchable": true
  }
}

No additional core list or tree widgets are currently registered specifically for decimal.

boolean

By default, boolean renders as a compact true-or-false column.

The default list renderer is DefaultBooleanListWidget, which turns the stored boolean value into readable output such as Yes and No. This default path is also where column-level label overrides such as trueLabel and falseLabel are applied.

ConcernHow it works
Default widgetDefaultBooleanListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable, trueLabel, falseLabel
Relevant layout attrsenableGlobalSearch when the list experience needs a global search bar, though boolean fields are typically more useful in filters than in keyword search
Show default example
{
  "type": "field",
  "attrs": {
    "name": "isDuplicate",
    "trueLabel": "Duplicate",
    "falseLabel": "Not-Duplicate"
  }
}

No additional core list or tree widgets are currently registered specifically for boolean.

date

By default, date renders as a date-formatted column rather than as plain text.

The default list renderer is DefaultDateListWidget, which delegates value formatting to the shared date-view component. At the list level, formatting is controlled through the layout format attr.

ConcernHow it works
Default widgetDefaultDateListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrsformat, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "doj",
    "sortable": true
  }
}

No additional core list or tree widgets are currently registered specifically for date.

datetime

By default, datetime renders as a formatted date-time column rather than as plain text.

The default list renderer is DefaultDateTimeListWidget, which delegates value formatting to the shared date-view component with time display enabled. At the list level, formatting is controlled through the layout format attr.

ConcernHow it works
Default widgetDefaultDateTimeListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrsformat, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "startTime",
    "format": "DD/MM/YYYY HH:mm:ss"
  }
}

No additional core list or tree widgets are currently registered specifically for datetime.

time

In list and tree views, time currently reuses the standard text-column path.

The core list-column dispatch sends time fields through a dedicated column wrapper, but that wrapper falls back to DefaultTextListWidget. As a result, time currently behaves more like a text field in list and tree views than like a dedicated time-only renderer.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared text-column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable, format
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "startTime",
    "format": "DD/MM/YYYY HH:mm:ss"
  }
}

No additional core list or tree widgets are currently registered specifically for time.

email

In list and tree views, email reuses the standard text-column path.

The core list-column dispatch sends email fields through the same shared renderer used for text-like scalar fields. This means email addresses inherit the standard truncation, search, and text-cell behavior rather than using a dedicated email-specific list widget.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared text-column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "email",
    "isSearchable": true
  }
}

No additional core list or tree widgets are currently registered specifically for email.

password

Core list and tree rendering should not be assumed for password.

The core list-column dispatch does not currently include a dedicated password renderer, and password fields are generally not intended for ordinary list presentation.

ConcernHow it works
Default widgetNo dedicated core list widget is currently wired for password
Widget selectionNo core password list-column path is currently registered in list dispatch
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrsNone specific to password at the core list level
Show example from metadata
{
  "type": "field",
  "attrs": {
    "name": "password"
  }
}

No additional core list or tree widgets are currently registered specifically for password.

selectionStatic

By default, selectionStatic renders as a text-style column whose visible value is derived from the authored option labels.

The list path uses DefaultTextListWidget through the shared text-column renderer. For single-select values, that shared renderer maps stored values to their human-readable labels using selectionStaticValues, so list and tree views show the authored label rather than the raw stored token.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared selection-static column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "status",
    "isSearchable": true
  }
}

No additional core list or tree widgets are currently registered specifically for selectionStatic.

selectionDynamic

By default, selectionDynamic renders as a text-style column whose visible value comes directly from the data returned for the row.

Unlike selectionStatic, the core list path does not perform provider lookups or label mapping at render time. The shared text widget simply displays the current row value as supplied by the dataset.

ConcernHow it works
Default widgetDefaultTextListWidget through the shared selection-dynamic column path
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant layout attrstruncateAfter, enableGlobalSearch
Show default example
{
  "type": "field",
  "attrs": {
    "name": "couponVenueType"
  }
}

No additional core list or tree widgets are currently registered specifically for selectionDynamic.

many-to-one

In list and tree views, many-to-one renders as one related record.

By default, the column uses DefaultRelationManyToOneListWidget, which displays the related value as an interactive text cell. When the column is enabled, the cell can open the related record directly.

ConcernHow it works
Default list widgetDefaultRelationManyToOneListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable, disabled
Relevant widget-level attrscoModelFieldToDisplay, disabled
Show default example
{
  "type": "field",
  "attrs": {
    "name": "institute",
    "sortable": true,
    "filterable": true,
    "isSearchable": true
  }
}
WidgetUse whenExtra attrs
SolidManyToOneRelationAvatarListWidgetThe related value should render as an avatar badge instead of as a text linkNone

SolidManyToOneRelationAvatarListWidget

AttrPurpose
No extra attrsThis widget derives the avatar label from the related record and renders the relation as an avatar badge instead of the default text cell.
{
  "type": "field",
  "attrs": {
    "viewWidget": "SolidManyToOneRelationAvatarListWidget",
    "label": "Client",
    "name": "client",
    "isSearchable": true,
    "searchField": "client.nameOfBusiness",
    "searchMatchMode": "$contains"
  }
}

one-to-many

In list and tree views, one-to-many renders as a compact summary of the related collection.

By default, the column uses DefaultRelationOneToManyListWidget, which shows the first related label and a +N indicator when additional related records are present.

ConcernHow it works
Default list widgetDefaultRelationOneToManyListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant widget-level attrscoModelFieldToDisplay
Show default example
{
  "type": "field",
  "attrs": {
    "name": "questionPossibleAnswersMaster",
    "label": "Possible Response",
    "isSearchable": true
  }
}

No additional core list or tree widgets are currently registered specifically for one-to-many.

many-to-many

In list and tree views, many-to-many renders as a compact summary of the related membership set.

By default, the column uses DefaultRelationManyToManyListWidget, which shows the first related label and a +N indicator when additional related records are present.

ConcernHow it works
Default list widgetDefaultRelationManyToManyListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant widget-level attrscoModelFieldToDisplay
Show default example
{
  "type": "field",
  "attrs": {
    "name": "domains",
    "isSearchable": true,
    "searchField": "domains.name",
    "searchMatchMode": "$contains"
  }
}
WidgetUse whenExtra attrs
SolidManyToManyRelationAvatarListWidgetThe relation membership should render as avatar badges instead of as plain textNone

SolidManyToManyRelationAvatarListWidget

AttrPurpose
No extra attrsThis widget derives avatar labels from the related records and renders the first related record as an avatar with a +N count for the remainder.
{
  "type": "field",
  "attrs": {
    "name": "respondentUser",
    "viewWidget": "SolidManyToManyRelationAvatarListWidget",
    "isSearchable": true
  }
}

mediaSingle

In list and tree views, mediaSingle renders as a thumbnail or file-style preview for the stored asset.

By default, the column uses DefaultMediaSingleListWidget, which shows an inline preview for image, audio, and video assets and falls back to a file-style preview for document-heavy uploads.

ConcernHow it works
Default list widgetDefaultMediaSingleListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant field attrsmediaTypes, mediaMaxSizeKb, mediaStorageProviderUserKey
Show default example
{
  "type": "field",
  "attrs": {
    "name": "logo",
    "sortable": true,
    "filterable": true,
    "isSearchable": true
  }
}

No additional core list or tree widgets are currently registered specifically for mediaSingle.

mediaMultiple

In list and tree views, mediaMultiple renders as a preview of the first asset plus a count for the remaining items.

By default, the column uses DefaultMediaMultipleListWidget, which shows the lead asset, adds a +N count when more files are present, and supports preview or download flows depending on the media type.

ConcernHow it works
Default list widgetDefaultMediaMultipleListWidget
Widget selectionApplied automatically when viewWidget is not provided
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant field attrsmediaTypes, mediaMaxSizeKb, mediaStorageProviderUserKey
Show default example
{
  "type": "field",
  "attrs": {
    "name": "payByLinkInvoiceFile"
  }
}

No additional core list or tree widgets are currently registered specifically for mediaMultiple.

computed

In list and tree views, computed does not use a dedicated widget family of its own.

Instead, SolidX renders the field using the same column style that would normally be used for the computed value type, such as text, numeric, boolean, date, or datetime.

ConcernHow it works
Default list widgetNo dedicated computed widget; rendering is delegated by computedFieldValueType
Widget selectionText-like values use the text-column path; numeric values use the numeric-column path; date-like and boolean values use their matching scalar-column paths
Typical field-node attrsname, label, sortable, filterable, isSearchable
Relevant field attrscomputedFieldValueType
Show default example
{
  "type": "field",
  "attrs": {
    "name": "transactionId"
  }
}

No additional core list or tree widgets are currently registered specifically for computed.

Tree View

Use tree when the same dataset needs to be understood hierarchically.

Tree views reuse the same field-column widgets as list views. In practice, that means the shortText widget coverage documented in the list section above also applies to tree unless a tree-specific renderer is introduced later.

Form View

Use form when users are creating, editing, or inspecting a single record.

Common form Layout Attrs

AttrPurpose
nameInternal layout identifier
labelOptional layout-level label
classNameGrid and spacing classes applied to layout containers
workflowFieldWorkflow control field for workflow-driven forms
workflowFieldUpdateEnabledControls whether the workflow field can change
disabledDisables the entire form layout
readonlyMakes the entire form layout read-only
showAddFormButtonShows or hides the create button
showEditFormButtonShows or hides the edit button
showDeleteFormButtonShows or hides the delete button
formButtonsAdds custom form-level actions

Common form Field-Node Attrs

These attrs belong to the layout node, not to the field metadata entity:

AttrPurpose
nameChooses the field to render
labelOverrides the default field label
descriptionOverrides the default help text
classNameControls field placement in the grid
showLabelHides or shows the rendered field label
disabledDisables the field at the layout level
readonlyMakes the field read-only at the layout level
editWidgetSelects the widget used in edit mode
viewWidgetSelects the widget used in view mode
autoCompleteControls the browser autocomplete behavior for text-style edit widgets that support it

shortText

By default, shortText renders as a standard single-line text input in edit mode and as plain text in view mode.

The default edit renderer is DefaultShortTextFormEditWidget, and the default view renderer is DefaultShortTextFormViewWidget.

ConcernHow it works
Default edit widgetDefaultShortTextFormEditWidget
Default view widgetDefaultShortTextFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, className, showLabel, disabled, readonly
Relevant widget-level attrsautoComplete on the default edit widget
Show default example
{
  "type": "field",
  "attrs": {
    "name": "bankUserId"
  }
}
WidgetUse whenExtra attrs
MaskedShortTextFormEditWidgetThe value should be edited like a password-style secret inputautoComplete
MaskedShortTextFormViewWidgetThe value should stay masked in view modeNone
SolidShortTextFieldAvatarWidgetThe value should be displayed in view mode with an avatar-style badgeNone

MaskedShortTextFormEditWidget

AttrPurpose
autoCompletePassed through to the underlying password-style input so browser autocomplete can be enabled, disabled, or tuned for secret-like values.
{
  "type": "field",
  "attrs": {
    "name": "paymentGatewayAccessSecret",
    "viewWidget": "maskedShortTextForm",
    "editWidget": "maskedShortTextEdit"
  }
}

MaskedShortTextFormViewWidget

AttrPurpose
No extra attrsThis widget renders the same field label as the default view widget, but masks the visible value instead of showing it directly.
{
  "type": "field",
  "attrs": {
    "name": "paymentGatewayAccessSecret",
    "viewWidget": "maskedShortTextForm",
    "editWidget": "maskedShortTextEdit"
  }
}

SolidShortTextFieldAvatarWidget

AttrPurpose
No extra attrsThis widget derives avatar initials directly from the field value and renders the value with an avatar-style badge in view mode.
{
  "type": "field",
  "attrs": {
    "label": "Vendor Name",
    "name": "name",
    "viewWidget": "SolidShortTextFieldAvatarWidget"
  }
}

longText

By default, longText renders as a multiline text area in edit mode and as a default read-only text display in view mode.

The default edit renderer is DefaultLongTextFormEditWidget.

longText supports richer form-side rendering than list-side rendering. Depending on the chosen widget, it can be edited as plain multiline text, as a structured JSON editor, or as a code editor.

ConcernHow it works
Default edit widgetDefaultLongTextFormEditWidget
Default view widgetPlain read-only text display
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, className, showLabel, disabled, readonly
Relevant widget-level attrsNone beyond the standard field-node attrs
Show default example
{
  "type": "field",
  "attrs": {
    "name": "description"
  }
}
WidgetUse whenExtra attrs
DynamicJsonEditorFormEditWidgetThe value is stored as text but authored as a structured JSON array or objectjsonSchema, jsonSchemaShowPreview
DynamicJsonEditorFormViewWidgetThe value is stored as text but should render as structured read-only JSON contentjsonSchema
CodeEditorFormEditWidgetThe value should be edited in a code-oriented editor rather than a plain textareaeditorLanguage, height, fontSize

DynamicJsonEditorFormEditWidget

AttrPurpose
jsonSchemaRequired. Defines the structure that the widget uses to render each JSON entry and choose the correct embedded input controls.
jsonSchemaShowPreviewOptional. When true, shows a live JSON preview beneath the structured editor.
{
  "type": "field",
  "attrs": {
    "name": "templateFields",
    "editWidget": "jsonEditor",
    "viewWidget": "jsonViewer",
    "jsonSchemaShowPreview": false,
    "jsonSchema": {
      "name": {
        "required": true,
        "type": "string"
      },
      "displayName": {
        "required": true,
        "type": "string"
      },
      "datatype": {
        "required": true,
        "type": "selectionStatic",
        "allowedValues": [
          "string",
          "numeric",
          "datetime"
        ]
      },
      "description": {
        "required": true,
        "type": "longText"
      }
    }
  }
}

DynamicJsonEditorFormViewWidget

AttrPurpose
jsonSchemaRequired. Defines how the widget should interpret and render the stored JSON value in structured read-only mode.
{
  "type": "field",
  "attrs": {
    "name": "templateFields",
    "editWidget": "jsonEditor",
    "viewWidget": "jsonViewer",
    "jsonSchemaShowPreview": false,
    "jsonSchema": {
      "name": {
        "required": true,
        "type": "string"
      },
      "displayName": {
        "required": true,
        "type": "string"
      },
      "datatype": {
        "required": true,
        "type": "selectionStatic",
        "allowedValues": [
          "string",
          "numeric",
          "datetime"
        ]
      },
      "description": {
        "required": true,
        "type": "longText"
      }
    }
  }
}

CodeEditorFormEditWidget

AttrPurpose
editorLanguageSets the language mode used by the code editor, such as json or ts.
heightControls the visible editor height. Defaults to 200px.
fontSizeControls the editor font size. Defaults to 14px.
{
  "type": "field",
  "attrs": {
    "name": "defaultValue",
    "editWidget": "codeEditor",
    "editorLanguage": "json"
  }
}

richText

By default, richText renders as a rich-text editor in edit mode and as formatted HTML content in view mode.

The supported richText widget surface is intentionally simple at the moment: one default edit widget and one default view widget.

ConcernHow it works
Default edit widgetDefaultRichTextFormEditWidget
Default view widgetDefaultRichTextFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, className, showLabel, disabled, readonly
Relevant widget-level attrsNone beyond the standard field-node attrs
Show default example
{
  "type": "field",
  "attrs": {
    "name": "content",
    "label": "content"
  }
}

No additional form widgets are currently registered specifically for richText.

json

By default, json renders in forms using a JSON-oriented code editor in both edit and view modes.

The supported core json widget surface is intentionally simple at the moment: one default edit widget and one default view widget.

ConcernHow it works
Default edit widgetDefaultJsonFormEditWidget
Default view widgetDefaultJsonFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, className, showLabel, readonly
Relevant widget-level attrsheight, fontSize
Show default example
{
  "type": "field",
  "attrs": {
    "name": "metadata"
  }
}

No additional core form widgets are currently registered specifically for json.

int

By default, int renders as a number input in edit mode and as a plain numeric read-only value in view mode.

The default edit path uses DefaultIntegerFormEditWidget. The default view path uses DefaultIntegerFormViewWidget.

ConcernHow it works
Default edit widgetDefaultIntegerFormEditWidget
Default view widgetDefaultIntegerFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, autoComplete
Relevant field attrsmin, max, required
Show default example
{
  "type": "field",
  "attrs": {
    "name": "pageCount"
  }
}
WidgetUse whenExtra attrs
SolidIntegerSliderStyleFormEditWidgetThe integer should be chosen from a bounded range instead of typed manuallyNo widget-specific attrs; the widget relies on the field metadata min and max values

SolidIntegerSliderStyleFormEditWidget

AttrPurpose
No widget-specific attrsThis widget renders the field as a slider and relies on the field metadata min and max values to determine the selectable range. When bounds are not authored, the current implementation falls back to its own default range.
{
  "type": "field",
  "attrs": {
    "name": "weightage",
    "editWidget": "integerSlider"
  }
}

No additional core form view widgets are currently registered specifically for int.

bigint

By default, bigint reuses the same whole-number editing experience as int.

The form field factory currently routes bigint through SolidIntegerField, so the default edit path uses DefaultIntegerFormEditWidget and the default view path uses DefaultIntegerFormViewWidget.

ConcernHow it works
Default edit widgetDefaultIntegerFormEditWidget
Default view widgetDefaultIntegerFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, autoComplete
Relevant field attrsrequired
Show default example
{
  "type": "field",
  "attrs": {
    "name": "id"
  }
}

No additional core form widgets are currently registered specifically for bigint.

decimal

By default, decimal renders as a number input in edit mode and as a plain numeric read-only value in view mode.

The default edit path uses DefaultDecimalFormEditWidget. The default view path uses DefaultDecimalFormViewWidget.

ConcernHow it works
Default edit widgetDefaultDecimalFormEditWidget
Default view widgetDefaultDecimalFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly
Relevant field attrsmin, max, required
Show default example
{
  "type": "field",
  "attrs": {
    "name": "latePaymentFees"
  }
}

No additional core form widgets are currently registered specifically for decimal.

boolean

By default, boolean renders as a checkbox-style control in edit mode and as a readable true-or-false value in view mode.

The default edit path resolves through the booleanCheckbox alias to SolidBooleanCheckboxStyleFormEditWidget. The default view path uses DefaultBooleanFormViewWidget.

ConcernHow it works
Default edit widgetSolidBooleanCheckboxStyleFormEditWidget via the booleanCheckbox alias
Default view widgetDefaultBooleanFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, checkboxLabel, trueLabel, falseLabel
Relevant layout attrsdisabled, readonly
Show default example
{
  "type": "field",
  "attrs": {
    "name": "isPBLEnabled",
    "checkboxLabel": "IS PBL Enabled"
  }
}
WidgetUse whenExtra attrs
DefaultBooleanFormEditWidgetThe field should render as an explicit yes-or-no segmented choice instead of as a checkboxtrueLabel, falseLabel
SolidBooleanSwitchStyleFormEditWidgetThe field should render as a switch-style controlNone

DefaultBooleanFormEditWidget

AttrPurpose
trueLabelReplaces the default True label in the segmented control with a business-friendly positive-state label.
falseLabelReplaces the default False label in the segmented control with a business-friendly negative-state label.
{
  "type": "field",
  "attrs": {
    "name": "discrepencyClear",
    "editWidget": "booleanSelectbox",
    "trueLabel": "Yes",
    "falseLabel": "No"
  }
}

SolidBooleanSwitchStyleFormEditWidget

AttrPurpose
No extra attrsThis widget focuses on the control style rather than on additional configuration. It renders the field as a switch while still respecting the standard boolean field-node attrs such as label, disabled, and readonly.
{
  "type": "field",
  "attrs": {
    "name": "accessToSystem",
    "editWidget": "SolidBooleanSwitchStyleFormEditWidget"
  }
}

No additional core form view widgets are currently registered specifically for boolean.

date

By default, date renders as a date picker in edit mode and as a formatted date in view mode.

The default edit path uses DefaultDateFormEditWidget. The default view path uses DefaultDateFormViewWidget.

ConcernHow it works
Default edit widgetDefaultDateFormEditWidget
Default view widgetDefaultDateFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, placeholder, format
Relevant layout attrsdisabled, readonly
Show default example
{
  "type": "field",
  "attrs": {
    "name": "dateOfApproval",
    "label": "Date of Approval",
    "format": "DD/MM/YYYY HH:mm:ss",
    "className": "col-6"
  }
}

No additional core form widgets are currently registered specifically for date.

datetime

By default, datetime renders as a date-time picker in edit mode and as a formatted date-time value in view mode.

The default edit path uses DefaultDateTimeFormEditWidget. The default view path uses DefaultDateTimeFormViewWidget.

ConcernHow it works
Default edit widgetDefaultDateTimeFormEditWidget
Default view widgetDefaultDateTimeFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, placeholder, format
Relevant layout attrsdisabled, readonly
Show default example
{
  "type": "field",
  "attrs": {
    "name": "startTime",
    "format": "DD/MM/YYYY HH:mm:ss"
  }
}

No additional core form widgets are currently registered specifically for datetime.

time

By default, time renders as a time-only picker in edit mode and as a formatted time value in view mode.

The default edit path uses DefaultTimeFormEditWidget. The default view path uses DefaultTimeFormViewWidget.

ConcernHow it works
Default edit widgetDefaultTimeFormEditWidget
Default view widgetDefaultTimeFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, format
Relevant layout attrsdisabled, readonly
Show default example
{
  "type": "field",
  "attrs": {
    "name": "startTime"
  }
}

No additional core form widgets are currently registered specifically for time.

email

By default, email renders as an email-oriented input in edit mode and as plain read-only text in view mode.

The default edit path uses DefaultEmailFormEditWidget. The default read-only display follows the shared plain-text view path used for text-like scalar fields.

ConcernHow it works
Default edit widgetDefaultEmailFormEditWidget
Default view behaviorPlain read-only text display
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, autoComplete
Relevant field attrsmax, regexPattern, regexPatternNotMatchingErrorMsg
Show default example
{
  "type": "field",
  "attrs": {
    "name": "payByLinkCustomerEmailAddress"
  }
}

No additional core form widgets are currently registered specifically for email.

password

By default, password uses two different edit experiences depending on context and a masked read-only view.

When a record is being created, the default create path uses DefaultPasswordFormCreateWidget, which includes password and confirm-password inputs. When an existing record is being edited, the default edit path uses DefaultPasswordFormEditWidget, which opens a controlled change-password dialog. The default view path uses DefaultPasswordFormViewWidget.

ConcernHow it works
Default create widgetDefaultPasswordFormCreateWidget
Default edit widgetDefaultPasswordFormEditWidget
Default view widgetDefaultPasswordFormViewWidget
Widget selectionApplied automatically when createWidget, editWidget, or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, createWidget, editWidget, viewWidget
Relevant field attrsmin, max, regexPattern, regexPatternNotMatchingErrorMsg
Show default example
{
  "type": "field",
  "attrs": {
    "name": "password"
  }
}

No additional core form widgets are currently registered specifically for password.

selectionStatic

By default, selectionStatic renders as an autocomplete-driven picker in edit mode and as the authored label in view mode.

The default edit path uses DefaultSelectionStaticAutocompleteFormEditWidget. The default view path uses DefaultSelectionStaticFormViewWidget.

ConcernHow it works
Default edit widgetDefaultSelectionStaticAutocompleteFormEditWidget
Default view widgetDefaultSelectionStaticFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, showLabel, disabled, readonly, multiSelect
Relevant field attrsselectionStaticValues, selectionValueType, isMultiSelect
Show default example
{
  "type": "field",
  "attrs": {
    "name": "type"
  }
}
WidgetUse whenExtra attrs
SolidSelectionStaticRadioFormEditWidgetThe option set is small and should be shown as explicit radio choicesNone
SolidSelectionStaticSelectButtonFormEditWidgetThe field should render as segmented selection buttons instead of an autocompleteNone

SolidSelectionStaticRadioFormEditWidget

AttrPurpose
No extra attrsThis widget focuses on presentation rather than on additional configuration. It renders the authored options as radio choices and relies on the standard field-node attrs such as label, disabled, and readonly.

Important note: this widget supports single-select only. When multiSelect or isMultiSelect is enabled, the widget reports that the render mode is not supported.

Example coming soon..

SolidSelectionStaticSelectButtonFormEditWidget

AttrPurpose
No extra attrsThis widget renders the authored options as segmented selection buttons and relies on the standard field-node attrs such as label, disabled, and readonly.

Important note: this widget supports single-select only. When multiSelect or isMultiSelect is enabled, the widget reports that the render mode is not supported.

{
  "type": "field",
  "attrs": {
    "name": "enableSeo",
    "editWidget": "SolidSelectionStaticSelectButtonFormEditWidget"
  }
}

No additional core form view widgets are currently registered specifically for selectionStatic.

selectionDynamic

By default, selectionDynamic renders as a provider-backed autocomplete in edit mode and as the current selected label or value in view mode.

The default edit path uses DefaultSelectionDynamicFormEditWidget. The default view path uses DefaultSelectionDynamicFormViewWidget.

ConcernHow it works
Default edit widgetDefaultSelectionDynamicFormEditWidget
Default view widgetDefaultSelectionDynamicFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly, multiSelect, whereClause
Relevant field attrsselectionDynamicProvider, selectionDynamicProviderCtxt, selectionValueType, isMultiSelect
Show default example
{
  "type": "field",
  "attrs": {
    "name": "couponVenueType"
  }
}

No additional core form widgets are currently registered specifically for selectionDynamic.

many-to-one

By default, many-to-one renders as an autocomplete-based relation picker in edit mode and as a simple related-value display in view mode.

The default edit path uses DefaultRelationManyToOneFormEditWidget. The default view path uses DefaultRelationManyToOneFormViewWidget.

ConcernHow it works
Default edit widgetDefaultRelationManyToOneFormEditWidget
Default view widgetDefaultRelationManyToOneFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly
Relevant widget-level attrscoModelFieldToDisplay, autocompleteMatchMode, whereClause, inlineCreate, inlineCreateLayout, inlineCreateAutoSave
Show default example
{
  "type": "field",
  "attrs": {
    "name": "institute"
  }
}
WidgetUse whenExtra attrs
PseudoRelationManyToOneFormWidgetThe field should behave like a custom cross-model lookup rather than a standard metadata relationparentModelName, childModelName, parentFieldName, childFieldName, parentModuleName, childModuleName, parentFieldLabels, parentSearchFields, whereClause, inlineCreateLayout, inlineCreateAutoSave
SolidRelationFieldAvatarFormWidgetThe related value should render as avatar badges in view modeNone

PseudoRelationManyToOneFormWidget

AttrPurpose
parentModelNameIdentifies the lookup model used to drive the pseudo relation search experience.
childModelNameIdentifies the model being edited from the current form context.
parentFieldNameThe field on the lookup model that supplies the stored or displayed value.
childFieldNameThe target field on the child model that should receive the selected value.
parentModuleNameModule name for the lookup model.
childModuleNameModule name for the child model.
parentFieldLabelsOptional list of lookup-model fields to combine into the visible autocomplete label.
parentSearchFieldsOptional list of lookup-model fields to search across instead of only the default parent field.
whereClauseOptional JSON-templated filter applied while resolving autocomplete candidates.
inlineCreateLayoutOptional embedded create layout used by the inline create dialog.
inlineCreateAutoSaveControls whether the inline create dialog auto-saves the created relation record.
{
  "type": "field",
  "attrs": {
    "name": "assignedTo",
    "label": "Assigned To",
    "viewWidget": "PseudoRelationManyToOneFormWidget",
    "editWidget": "PseudoRelationManyToOneFormWidget",
    "parentModelName": "employee",
    "childModelName": "frmsLead",
    "parentFieldName": "employeeName",
    "childFieldName": "assignedTo",
    "childModuleName": "frms",
    "parentModuleName": "peoples",
    "parentFieldLabels": [
      "employeeId",
      "employeeName"
    ]
  }
}

SolidRelationFieldAvatarFormWidget

AttrPurpose
No extra attrsThis widget renders the related value as an avatar-style badge in view mode.
{
  "type": "field",
  "attrs": {
    "label": "Organisation",
    "name": "client",
    "viewWidget": "SolidRelationFieldAvatarFormWidget"
  }
}

one-to-many

By default, one-to-many renders as an embedded child-collection manager in both edit and view modes.

The default edit path uses DefaultRelationOneToManyFormEditWidget. The default view path uses DefaultRelationOneToManyFormViewWidget.

ConcernHow it works
Default edit widgetDefaultRelationOneToManyFormEditWidget
Default view widgetDefaultRelationOneToManyFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly
Relevant widget-level attrswhereClause, inlineListLayout, inlineCreateLayout, inlineCreateAutoSave
Show default example
{
  "type": "field",
  "attrs": {
    "name": "questionPossibleAnswersMaster"
  }
}
WidgetUse whenExtra attrs
PseudoRelationOneToManyFormWidgetThe collection should be managed through a custom embedded list/create flow rather than through a standard metadata relation fieldparentModelName, childModelName, parentFieldName, childFieldName, parentModuleName, childModuleName, whereClause, inlineListLayout, inlineCreateLayout, inlineCreateAutoSave

PseudoRelationOneToManyFormWidget

AttrPurpose
parentModelNameIdentifies the parent model whose form is hosting the pseudo collection.
childModelNameIdentifies the related child model rendered in the embedded list.
parentFieldNameParent-side field whose value should be used to scope the child collection.
childFieldNameChild-side field used to bind each child record back to the parent record.
parentModuleNameModule name for the parent model.
childModuleNameModule name for the child model.
whereClauseOptional JSON filter merged into the embedded child list query.
inlineListLayoutOptional custom list layout used when rendering the embedded child collection.
inlineCreateLayoutOptional custom form layout used when creating or editing child records inline.
inlineCreateAutoSaveControls whether inline child forms save automatically.
{
  "type": "custom",
  "attrs": {
    "name": "employeeDetails",
    "widget": "PseudoRelationOneToManyFormWidget",
    "parentModelName": "employee",
    "childModelName": "employeeDetail",
    "parentFieldName": "employeeId",
    "childFieldName": "employeeId",
    "inlineCreate": "false",
    "childModuleName": "peoples",
    "parentModuleName": "peoples"
  }
}

many-to-many

By default, many-to-many renders as a relation picker in edit mode and as a list-style relation browser in view mode.

The default edit path uses DefaultRelationManyToManyAutoCompleteFormEditWidget. The default view path uses DefaultRelationManyToManyListFormEditWidget.

ConcernHow it works
Default edit widgetDefaultRelationManyToManyAutoCompleteFormEditWidget
Default view widgetDefaultRelationManyToManyListFormEditWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly
Relevant widget-level attrsautocompleteMatchMode, whereClause, inlineCreate, inlineListLayout, inlineCreateLayout, inlineCreateAutoSave
Show default example
{
  "type": "field",
  "attrs": {
    "name": "domains"
  }
}
WidgetUse whenExtra attrs
DefaultRelationManyToManyCheckBoxFormEditWidgetThe full option set is small enough to render comfortably as a checkbox matrixwhereClause, inlineCreate
DefaultRelationManyToManyListFormEditWidgetThe relation should be managed through an embedded list with explicit link, unlink, create, and edit actionswhereClause, inlineListLayout, inlineCreateLayout, inlineCreateAutoSave

DefaultRelationManyToManyCheckBoxFormEditWidget

AttrPurpose
whereClauseOptional JSON-templated filter used when loading the full checkbox option set.
inlineCreateWhen enabled, shows the inline create affordance for creating new related records directly from the widget.
{
  "type": "field",
  "attrs": {
    "name": "users",
    "editWidget": "DefaultRelationManyToManyCheckBoxFormEditWidget",
    "showLabel": false
  }
}

DefaultRelationManyToManyListFormEditWidget

AttrPurpose
whereClauseOptional JSON filter merged into the embedded relation list query.
inlineListLayoutOptional custom list layout used for the embedded relation list.
inlineCreateLayoutOptional custom form layout used when creating or editing related records inline.
inlineCreateAutoSaveControls whether inline create/edit dialogs auto-save related records.

Example coming soon..

mediaSingle

By default, mediaSingle renders as a single-file upload and preview experience in edit mode and as a preview or download surface in view mode.

The default edit path uses DefaultMediaSingleFormEditWidget. The default view path uses DefaultMediaSingleFormViewWidget.

ConcernHow it works
Default edit widgetDefaultMediaSingleFormEditWidget
Default view widgetDefaultMediaSingleFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly
Relevant field attrsmediaTypes, mediaMaxSizeKb, mediaStorageProviderUserKey
Show default example
{
  "type": "field",
  "attrs": {
    "name": "logo"
  }
}

No additional core form widgets are currently registered specifically for mediaSingle.

mediaMultiple

By default, mediaMultiple renders as a multi-file upload and preview experience in edit mode and as a gallery-style preview or download surface in view mode.

The default edit path uses DefaultMediaMultipleFormEditWidget. The default view path uses DefaultMediaMultipleFormViewWidget.

ConcernHow it works
Default edit widgetDefaultMediaMultipleFormEditWidget
Default view widgetDefaultMediaMultipleFormViewWidget
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, disabled, readonly
Relevant field attrsmediaTypes, mediaMaxSizeKb, mediaStorageProviderUserKey
Show default example
{
  "type": "field",
  "attrs": {
    "name": "payByLinkInvoiceFile"
  }
}

No additional core form widgets are currently registered specifically for mediaMultiple.

computed

By default, computed renders as a read-only field and is hidden while a new record is still being created.

The default experience uses the built-in computed-field renderer for both edit and view modes.

ConcernHow it works
Default edit widgetBuilt-in computed renderer
Default view widgetBuilt-in computed renderer
Widget selectionApplied automatically when editWidget or viewWidget is not provided
Typical field-node attrsname, label, description, showLabel, readonly
Relevant field attrscomputedFieldValueType, computedFieldValueProvider, computedFieldTriggerConfig
Show default example
{
  "type": "field",
  "attrs": {
    "name": "transactionId",
    "readonly": true
  }
}

No additional core form widgets are currently registered specifically for computed.

Best Practices

Layout Organization

  • Use logical grouping: Group related fields in columns with descriptive labels
  • Progressive disclosure: Use tabs (notebooks) for complex forms
  • Responsive design: Use appropriate grid classes for different screen sizes
  • Field ordering: Place important fields first, follow logical workflow

Security Considerations

  • Role-based access: Configure view actions based on user roles
  • Field-level security: Hide sensitive fields from unauthorized users
  • Audit trails: Enable audit tracking for sensitive operations

Performance Optimization

  • Pagination: Always enable pagination for large datasets
  • Field selection: Only display necessary fields in list views

Card And Kanban Views

card and kanban views are usually documented at the card-composition level rather than at the individual field-widget level.

They remain important view families, but they do not currently need the same per-field widget catalog that list, tree, and form need.

See Also