Skip to Content
FrontendCrud V2Crud GeneratorGenerator v2changes.json Reference

changes.json Reference

changes.json is where all entity customization lives. It sits alongside data.json in each version folder and is never overwritten by the generator — only merged when creating a new version.


Full Schema

{ "listingFields": { "all": [], "selected": ["id", "name", "status"], "hideSelected": ["slug"], "hide": ["internalId"], "order": ["name", "status", "id"], "sortable": ["name", "createdAt"], "sortableKeys": { "status": "status.name" }, "columnWidths": { "name": 200 }, "alignment": { "price": "right", "status": "center" }, "defaultOrder": { "createdAt": "desc" }, "iconFields": ["status"] }, "formFields": { "sections": { "General": ["name", "description", "type"], "Pricing": ["price", "priceSpecial"], "System": ["createdAt", "updatedAt"] }, "required": ["name", "type"], "optional": ["description"], "hide": ["slug"], "order": [], "validation": { "name": { "minLength": 2, "maxLength": 100 } }, "defaultValues": { "status": "active" }, "helperText": { "price": "Enter price excluding tax" } }, "formModalShowFields": { "fields": ["name", "status", "createdAt"], "systemFields": ["createdAt", "updatedAt", "id"], "hide": [], "validation": {}, "defaultValues": {}, "helperText": {} }, "formModalEditFields": { "fields": ["name", "status", "type"], "hide": [], "validation": { "name": { "minLength": 2 } }, "defaultValues": {}, "helperText": {} }, "formModalAddFields": { "fields": ["name", "status", "type"], "hide": [], "validation": {}, "defaultValues": { "status": "active" }, "helperText": {} }, "showFields": { "sections": { "Information": ["name", "description", "status"], "System": ["id", "createdAt", "updatedAt"] }, "hide": [], "order": [] }, "filterFields": { "all": ["name", "status", "createdAt"], "defaults": ["status"], "hide": [], "order": [], "range": { "createdAt": true, "price": true }, "rangeKeys": { "price": { "min": "priceMin", "max": "priceMax" } }, "translatable": ["status"], "searchMethods": { "name": ["partial", "start", "exact"] }, "className": { "name": "filter-wide" }, "hideToolbar": ["id"], "helperText": { "createdAt": "Filter by creation date" }, "fieldIcon": { "status": "circle" }, "defaultFilterValues": { "status": "active" } }, "sideboxFields": { "all": [ { "fieldName": "tags", "targetResource": "tags", "targetEntity": "TagBundle/Tag" } ], "hide": [] }, "fieldOverrides": { "price": { "type": "CURRENCY", "format": "money" }, "rate": { "type": "PERCENT" }, "tableName": { "optionsArrayFinite": "TableNames" }, "fieldType": { "optionsArrayFinite": "PropertyTypes" } }, "exclusionList": { "listing": ["password", "token", "secretKey"], "forms": ["id", "createdAt", "updatedAt", "deletedAt"], "show": ["password"] }, "actions": { "listing": ["quick-show", "show", "quick-edit", "edit", "delete"], "showPage": ["edit", "print", "delete", "export"] } }

Section Breakdown

listingFields — Table / Grid Columns

KeyTypeDescription
allstring[]All available columns (from API serialization group)
selectedstring[]Columns shown by default
hideSelectedstring[]Columns in selected that are hidden from user toggle
hidestring[]Columns completely removed (highest priority)
orderstring[]Column display order
sortablestring[]Columns with sort arrows
sortableKeysobjectMap display key → API sort key when they differ
columnWidthsobjectFixed width per column in pixels
alignmentobjectleft / center / right per column
defaultOrderobjectDefault sort direction per field, e.g. { "name": "asc" }
iconFieldsstring[]Columns that render an icon instead of raw text

formFields — Create / Edit Form

KeyTypeDescription
sectionsobjectGroup fields into named sections
requiredstring[]Fields with required validation
optionalstring[]Non-required fields to include
hidestring[]Fields removed from the form
validationobjectPer-field rules: minLength, maxLength, pattern
defaultValuesobjectPre-filled values on form open
helperTextobjectHelper text shown below each field

formModalShowFields / formModalEditFields / formModalAddFields

Three independent modal types — each is a separate key in changes.json:

Modal keyPurposeAffected by writeableProperties?
formModalShowFieldsRead-only quick-view modal (from listing row)No — always shows all specified fields
formModalEditFieldsEditable quick-edit modal (from listing row)Yes — filtered to writeable fields
formModalAddFieldsQuick-add modal (from listing toolbar)Yes — filtered to writeable fields

Fallback: If a typed modal key is absent, the generator falls back to the legacy formModalFields key. If that is also absent, the modal defaults to the required/filter fields.

MANY_TO_MANY fields are automatically excluded from all modal and form field lists. They render as sidebox components instead.

Shared keys for each modal:

KeyTypeDescription
fieldsstring[]Fields shown in the modal
systemFieldsstring[](Show modal only) Shown in a collapsible “System Information” block
hidestring[]Fields excluded from this modal
validationobjectPer-field validation rules
defaultValuesobjectPre-filled values
helperTextobjectHelper text below each field

showFields — Detail Page

KeyTypeDescription
sectionsobjectNamed sections with field arrays: { "Info": ["name", "status"] }
hidestring[]Fields excluded from the detail page
sequencablestring[]Fields that render next/previous navigation links
iconFieldsstring[]Fields rendered as icons instead of text
orderstring[]Field display order when no sections are defined
"showFields": { "sections": { "Information": ["name", "description"], "System": ["id", "createdAt", "updatedAt"] }, "hide": [], "sequencable": ["status"], "iconFields": ["priority"] }

filterFields — Search / Filter Panel

KeyTypeDescription
allstring[]All available filter fields (pre-populated by generator)
defaultsstring[]Filters shown and active by default
hidestring[]Filters completely removed
rangeobjectEnable range filter: { "price": true, "createdAt": true }
rangeKeysobjectCustom min/max API param names: { "price": { "min": "priceMin", "max": "priceMax" } }
translatablestring[]Filter values that are translated before sending to API
searchMethodsobjectSearch strategies per field: { "name": ["partial", "start", "exact"] }
classNameobjectCustom CSS class per filter field: { "name": "filter-wide" }
fieldIconobjectIcon shown next to filter: { "status": "circle" }
hideToolbarstring[]Filters whose toolbar element is hidden
helperTextobjectHelper text below each filter
defaultFilterValuesobjectDefault filter values pre-applied on page load: { "status": "active" }

sideboxFields — Sidebar Relationships

Relationship fields (MANY_TO_MANY, ONE_TO_MANY) are rendered as sidebox components on the detail page.

"sideboxFields": { "all": [ { "fieldName": "tags", "targetResource": "tags", "targetEntity": "TagBundle/Tag" } ], "hide": ["attachments"] }
Key in each itemDescription
fieldNameThe relation field name on this entity
targetResourceAPI resource slug for the related entity
targetEntityEntity path for the related entity (used for navigation)

fieldOverrides — Custom Field Types & Options

Override the auto-detected TSX field type or add optionsArrayFinite for a finite dropdown:

"fieldOverrides": { "amount": { "type": "CURRENCY" }, "rate": { "type": "PERCENT" }, "notes": { "type": "TEXTAREA" }, "tableName": { "optionsArrayFinite": "TableNames" }, "fieldType": { "optionsArrayFinite": "PropertyTypes" }, "propertyType":{ "optionsArrayFinite": "PropertyTypes" } }

When optionsArrayFinite is set, the generator emits ColumnTypeEnum.SELECT with the raw identifier (e.g. TableNames) as the options source — referencing the imported constant in the generated index.tsx. See Custom Properties for the full implementation.

Overrides apply to allAvailableFields — a merged pool of every field from every source. If a field name is not found in the pool, the override creates a synthetic field entry.

exclusionList — Global Field Exclusions

Hide fields across an entire context without listing them in every section. Checked alongside each section’s own hide array — both are applied:

"exclusionList": { "listing": ["password", "token"], "forms": ["id", "slug", "createdAt", "updatedAt", "deletedAt"], "show": ["password"] }
CategoryApplied to
listinglistingFields, filterFields
formsformFields, all formModal* sections
showshowFields

actions — Available Actions

"actions": { "listing": ["quick-show", "show", "quick-edit", "edit", "delete"], "showPage": ["edit", "print", "delete", "export"], "listingAllActions": ["show", "edit", "delete", "export"], "kanbanListingAllActions": ["show", "edit", "delete"], "treeviewListingAllActions":["show", "edit", "delete", "move-up", "move-down"] }
KeyDescription
listingDefault row actions shown on the listing page
showPageActions shown on the detail / show page
listingAllActionsFull set of possible row actions (all-actions menu)
kanbanListingAllActionsActions available in kanban view
treeviewListingAllActionsActions available in treeview mode

Priority rule: hide always wins. A field in both selected and hide will be hidden.


Field Type Auto-Detection

The generator maps API field types and name patterns to TSX input types automatically. Override any mapping with fieldOverrides.

API Type / FormatField Name PatternTSX Type
MANY_TO_ONE, ONE_TO_ONE, MANY_TO_MANYSELECT_ASYNC
string*Email*EMAIL
string*Phone*, *Tel*TEL
string*color*, *Color*COLOR
string*icon*, *Icon*ICON
string, money format*price*, *amount*, *total*, *cost*CURRENCY
decimal, float*rate*, *percent*PERCENT
booleanBOOLEAN
integer, smallintNUMBER
decimalDECIMAL
floatFLOAT
textTEXTAREA
dateDATE
datetimeDATETIME
json_documentJSON
string (default)TEXT
Last updated on