@webiny/app-admin 6.5.0-beta.2 → 6.5.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/features/formModel/Field.d.ts +7 -1
- package/features/formModel/Field.js +13 -5
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +12 -0
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FormErrors.js +1 -1
- package/features/formModel/FormErrors.js.map +1 -1
- package/features/formModel/FormModel.d.ts +1 -0
- package/features/formModel/FormModel.js +17 -0
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +339 -0
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/ObjectField.d.ts +9 -1
- package/features/formModel/ObjectField.js +26 -17
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/abstractions.d.ts +14 -1
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +2 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +14 -11
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -1
- package/package.json +19 -19
|
@@ -31,7 +31,15 @@ export declare class ObjectField implements IObjectField {
|
|
|
31
31
|
setDisabled(value: boolean): void;
|
|
32
32
|
setVisible(value: boolean): void;
|
|
33
33
|
setAncestorRules(rules: IRule[]): void;
|
|
34
|
-
setForm(form: IFormModel, parentPath?: string): void;
|
|
34
|
+
setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void;
|
|
35
|
+
/** Scope for direct children: a path `form.field()` resolves to this field. */
|
|
36
|
+
private _childScope;
|
|
37
|
+
/**
|
|
38
|
+
* Scope for the children of a list item. Children keep `qualifiedName` without an
|
|
39
|
+
* item selector, so `$.` rule targets and `field.parent()` need the item's index to
|
|
40
|
+
* reach their siblings. Resolved lazily, so it follows reorders and removals.
|
|
41
|
+
*/
|
|
42
|
+
private _itemScope;
|
|
35
43
|
setValidation(validation: IFieldValidation): void;
|
|
36
44
|
private setValidationWithCache;
|
|
37
45
|
addBeforeChange(cb: BeforeChangeCallback): void;
|
|
@@ -2,23 +2,23 @@ import { makeAutoObservable, runInAction, toJS } from "mobx";
|
|
|
2
2
|
import { Field } from "./Field.js";
|
|
3
3
|
import { createTemplateBuilder } from "./fieldTypes/ObjectFieldType.js";
|
|
4
4
|
const TEMPLATE_DISCRIMINATOR = "_templateId";
|
|
5
|
-
function createChildFields(childBuilders, form, parentPath) {
|
|
5
|
+
function createChildFields(childBuilders, form, parentPath, scopePath) {
|
|
6
6
|
const children = new Map();
|
|
7
7
|
for (const [name, builder] of Object.entries(childBuilders)){
|
|
8
8
|
const config = builder.build(name);
|
|
9
|
-
const field = createFieldFromConfig(config, form, parentPath);
|
|
9
|
+
const field = createFieldFromConfig(config, form, parentPath, scopePath);
|
|
10
10
|
children.set(name, field);
|
|
11
11
|
}
|
|
12
12
|
return children;
|
|
13
13
|
}
|
|
14
|
-
function createFieldFromConfig(config, form, parentPath) {
|
|
14
|
+
function createFieldFromConfig(config, form, parentPath, scopePath) {
|
|
15
15
|
if (config.childBuilders) {
|
|
16
16
|
const objField = new ObjectField(config);
|
|
17
|
-
if (form) objField.setForm(form, parentPath);
|
|
17
|
+
if (form) objField.setForm(form, parentPath, scopePath);
|
|
18
18
|
return objField;
|
|
19
19
|
}
|
|
20
20
|
const field = new Field(config);
|
|
21
|
-
if (form) field.setForm(form, parentPath);
|
|
21
|
+
if (form) field.setForm(form, parentPath, scopePath);
|
|
22
22
|
return field;
|
|
23
23
|
}
|
|
24
24
|
function hydrateChildren(children, data, options) {
|
|
@@ -53,6 +53,7 @@ class ObjectField {
|
|
|
53
53
|
this._ownLayout = null;
|
|
54
54
|
this._templateLayouts = {};
|
|
55
55
|
this._validating = false;
|
|
56
|
+
this._childScope = ()=>this._base.scopedName;
|
|
56
57
|
this.config = config;
|
|
57
58
|
this._base = new Field({
|
|
58
59
|
...config,
|
|
@@ -64,7 +65,9 @@ class ObjectField {
|
|
|
64
65
|
if (this._isTemplated) this._children = new Map();
|
|
65
66
|
else this._children = createChildFields(config.childBuilders, null);
|
|
66
67
|
makeAutoObservable(this, {
|
|
67
|
-
config: false
|
|
68
|
+
config: false,
|
|
69
|
+
_childScope: false,
|
|
70
|
+
_itemScope: false
|
|
68
71
|
});
|
|
69
72
|
}
|
|
70
73
|
_findTemplate(id) {
|
|
@@ -73,7 +76,7 @@ class ObjectField {
|
|
|
73
76
|
_rebuildChildrenForTemplate(templateId) {
|
|
74
77
|
const template = this._findTemplate(templateId);
|
|
75
78
|
if (!template) throw new Error(`Template "${templateId}" not found on field "${this.config.name}". Available: ${this._templates.map((t)=>t.id).join(", ") || "(none)"}.`);
|
|
76
|
-
const children = createChildFields(template.childBuilders, this._form, this.qualifiedName);
|
|
79
|
+
const children = createChildFields(template.childBuilders, this._form, this.qualifiedName, this._childScope);
|
|
77
80
|
this._children = children;
|
|
78
81
|
this._activeTemplateId = templateId;
|
|
79
82
|
const inner = this._innerLayoutFor(templateId);
|
|
@@ -100,12 +103,18 @@ class ObjectField {
|
|
|
100
103
|
setAncestorRules(rules) {
|
|
101
104
|
this._base.setAncestorRules(rules);
|
|
102
105
|
}
|
|
103
|
-
setForm(form, parentPath) {
|
|
106
|
+
setForm(form, parentPath, scopePath) {
|
|
104
107
|
this._form = form;
|
|
105
|
-
this._base.setForm(form, parentPath);
|
|
108
|
+
this._base.setForm(form, parentPath, scopePath);
|
|
106
109
|
const myPath = this._base.qualifiedName;
|
|
107
|
-
for (const [, field] of this._children)field.setForm(form, myPath);
|
|
108
|
-
for (const item of this._items)for (const [, field] of item.children)field.setForm(form, myPath);
|
|
110
|
+
for (const [, field] of this._children)field.setForm(form, myPath, this._childScope);
|
|
111
|
+
for (const item of this._items)for (const [, field] of item.children)field.setForm(form, myPath, this._itemScope(item.key));
|
|
112
|
+
}
|
|
113
|
+
_itemScope(key) {
|
|
114
|
+
return ()=>{
|
|
115
|
+
const index = this._items.findIndex((item)=>item.key === key);
|
|
116
|
+
return `${this._base.scopedName}.${index}`;
|
|
117
|
+
};
|
|
109
118
|
}
|
|
110
119
|
setValidation(validation) {
|
|
111
120
|
this._base.setValidation(validation);
|
|
@@ -313,10 +322,10 @@ class ObjectField {
|
|
|
313
322
|
}
|
|
314
323
|
this.config.childBuilders[name] = builder;
|
|
315
324
|
const built = builder.build(name);
|
|
316
|
-
const newField = createFieldFromConfig(built, this._form, this.qualifiedName);
|
|
325
|
+
const newField = createFieldFromConfig(built, this._form, this.qualifiedName, this._childScope);
|
|
317
326
|
this._children.set(name, newField);
|
|
318
327
|
if (this.config.isList) for (const item of this._items){
|
|
319
|
-
const itemField = createFieldFromConfig(built, this._form, this.qualifiedName);
|
|
328
|
+
const itemField = createFieldFromConfig(built, this._form, this.qualifiedName, this._itemScope(item.key));
|
|
320
329
|
item.children.set(name, itemField);
|
|
321
330
|
}
|
|
322
331
|
}
|
|
@@ -399,11 +408,11 @@ class ObjectField {
|
|
|
399
408
|
const source = this._items[index];
|
|
400
409
|
if (!source) return;
|
|
401
410
|
const data = getChildrenData(source.children);
|
|
402
|
-
const
|
|
411
|
+
const key = `item_${++itemKeyCounter}`;
|
|
412
|
+
const children = createChildFields(this._templateChildBuilders(source.templateId), this._form, this.qualifiedName, this._itemScope(key));
|
|
403
413
|
hydrateChildren(children, data, {
|
|
404
414
|
clone: true
|
|
405
415
|
});
|
|
406
|
-
const key = `item_${++itemKeyCounter}`;
|
|
407
416
|
this._items.splice(index + 1, 0, {
|
|
408
417
|
key,
|
|
409
418
|
children,
|
|
@@ -419,9 +428,9 @@ class ObjectField {
|
|
|
419
428
|
return template.childBuilders;
|
|
420
429
|
}
|
|
421
430
|
_addItemInternal(data, templateId) {
|
|
422
|
-
const children = createChildFields(this._templateChildBuilders(templateId), this._form, this.qualifiedName);
|
|
423
|
-
if (data) hydrateChildren(children, data);
|
|
424
431
|
const key = `item_${++itemKeyCounter}`;
|
|
432
|
+
const children = createChildFields(this._templateChildBuilders(templateId), this._form, this.qualifiedName, this._itemScope(key));
|
|
433
|
+
if (data) hydrateChildren(children, data);
|
|
425
434
|
this._items.push({
|
|
426
435
|
key,
|
|
427
436
|
children,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/formModel/ObjectField.js","sources":["../../../src/features/formModel/ObjectField.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, toJS } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { createTemplateBuilder } from \"./fieldTypes/ObjectFieldType.js\";\nimport type {\n IObjectFieldConfig,\n IObjectField,\n IObjectFieldTemplates,\n IListItemField,\n IField,\n IObjectFieldVM,\n IFieldValidation,\n IFormModel,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IRule,\n ITemplateBuilder,\n ITemplateConfig,\n ITemplateVM,\n FieldTypeMap,\n LayoutNode,\n LayoutNodeVM,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n ComputedFieldCallback,\n IFieldCallbackParams\n} from \"./abstractions.js\";\n\n/** Reserved key used as the template discriminator in templated object data. */\nexport const TEMPLATE_DISCRIMINATOR = \"_templateId\";\n\nfunction createChildFields(\n childBuilders: Record<string, IFieldBuilder>,\n form: IFormModel | null,\n parentPath?: string\n): Map<string, IField> {\n const children = new Map<string, IField>();\n for (const [name, builder] of Object.entries(childBuilders)) {\n const config = builder.build(name);\n const field = createFieldFromConfig(config, form, parentPath);\n children.set(name, field);\n }\n return children;\n}\n\nfunction createFieldFromConfig(config: any, form: IFormModel | null, parentPath?: string): IField {\n if (config.childBuilders) {\n const objField = new ObjectField(config as IObjectFieldConfig);\n if (form) {\n objField.setForm(form, parentPath);\n }\n return objField;\n }\n const field = new Field(config);\n if (form) {\n field.setForm(form, parentPath);\n }\n return field;\n}\n\nfunction hydrateChildren(\n children: Map<string, IField>,\n data: Record<string, unknown> | null | undefined,\n options?: { clone?: boolean }\n): void {\n if (!data) {\n return;\n }\n for (const [name, field] of children) {\n if (name in data) {\n if (options?.clone && field.config.cloneValue) {\n field.setValueSilent(field.config.cloneValue(data[name]));\n } else {\n field.setValueSilent(data[name]);\n }\n }\n }\n}\n\nfunction getChildrenData(children: Map<string, IField>): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of children) {\n if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n}\n\nasync function validateChildren(\n children: Map<string, IField>,\n options?: { force?: boolean }\n): Promise<boolean> {\n let allValid = true;\n for (const [, field] of children) {\n const valid = await field.validate(options);\n if (!valid) {\n allValid = false;\n }\n }\n return allValid;\n}\n\nexport function isObjectField(field: IField): field is ObjectField {\n return field.type === \"object\";\n}\n\nlet itemKeyCounter = 0;\n\ninterface ListItem {\n key: string;\n children: Map<string, IField>;\n templateId?: string;\n}\n\n/**\n * ObjectField — hierarchical field with children, using composition.\n * Holds a `_base` Field for scalar behavior (callbacks, disabled/hidden, form ref).\n * Adds its own children/items management for object and list modes.\n */\nexport class ObjectField implements IObjectField {\n readonly config: IObjectFieldConfig;\n\n private _base: Field;\n private _form: IFormModel | null = null;\n private _children: Map<string, IField>;\n private _items: ListItem[] = [];\n private _templates: ITemplateConfig[] = [];\n private _isTemplated: boolean;\n private _activeTemplateId: string | null = null;\n /** Inner layout for non-templated objects (single layout, applied per item too). */\n private _ownLayout: LayoutNode[] | null = null;\n /** Per-template inner layouts for templated objects. */\n private _templateLayouts: Record<string, LayoutNode[]> = {};\n private _validating = false;\n\n constructor(config: IObjectFieldConfig) {\n this.config = config;\n this._base = new Field({\n ...config,\n type: \"object\",\n renderer:\n config.renderer ??\n (config.isList ? \"objectAccordionMultiple\" : \"objectAccordionSingle\")\n });\n this._templates = config.templates ?? [];\n this._isTemplated = this._templates.length > 0;\n\n if (this._isTemplated) {\n // Templated mode: children populated per-item (list) or when a template is picked (single).\n this._children = new Map();\n } else {\n this._children = createChildFields(config.childBuilders, null);\n }\n\n makeAutoObservable(this, {\n config: false\n });\n }\n\n private _findTemplate(id: string): ITemplateConfig | undefined {\n return this._templates.find(t => t.id === id);\n }\n\n private _rebuildChildrenForTemplate(templateId: string): void {\n const template = this._findTemplate(templateId);\n if (!template) {\n throw new Error(\n `Template \"${templateId}\" not found on field \"${this.config.name}\". ` +\n `Available: ${this._templates.map(t => t.id).join(\", \") || \"(none)\"}.`\n );\n }\n const children = createChildFields(template.childBuilders, this._form, this.qualifiedName);\n this._children = children;\n this._activeTemplateId = templateId;\n const inner = this._innerLayoutFor(templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n // --- Forwarded from _base ---\n\n get name(): string {\n return this._base.name;\n }\n\n get type(): string {\n return \"object\";\n }\n\n get visible(): boolean {\n return this._base.visible;\n }\n\n get disabled(): boolean {\n return this._base.disabled;\n }\n\n setDisabled(value: boolean): void {\n this._base.setDisabled(value);\n }\n\n setVisible(value: boolean): void {\n this._base.setVisible(value);\n }\n\n setAncestorRules(rules: IRule[]): void {\n this._base.setAncestorRules(rules);\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._base.setForm(form, parentPath);\n const myPath = this._base.qualifiedName;\n for (const [, field] of this._children) {\n field.setForm(form, myPath);\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.setForm(form, myPath);\n }\n }\n }\n\n setValidation(validation: IFieldValidation): void {\n this._base.setValidation(validation);\n }\n\n private setValidationWithCache(\n validation: IFieldValidation,\n value: unknown,\n result: boolean\n ): void {\n this._base.setValidationWithCache(validation, value, result);\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._base.addBeforeChange(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._base.addAfterChange(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._base.addAfterSetValue(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._base.addOnBlur(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._base.addRequiredWhen(fn, message);\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._base.setComputed(fn);\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._base.setComputedUntilDirty(fn);\n }\n\n blur(): void {\n this._base.blur();\n }\n\n remove(): void {\n this._base.remove();\n }\n\n get qualifiedName(): string {\n return this._base.qualifiedName;\n }\n\n focus(): void {\n this._base.focus();\n }\n\n requestFocus(): void {\n this._base.requestFocus();\n }\n\n clearFocusRequest(): void {\n this._base.clearFocusRequest();\n }\n\n getInnerLayout(): LayoutNode[] | null {\n if (this.isTemplated) {\n return this._activeTemplateId\n ? (this._templateLayouts[this._activeTemplateId] ?? null)\n : null;\n }\n return this._ownLayout;\n }\n\n // --- Object-specific ---\n\n get isList(): boolean {\n return this.config.isList;\n }\n\n get isTemplated(): boolean {\n return this._isTemplated;\n }\n\n get activeTemplateId(): string | null {\n return this._activeTemplateId;\n }\n\n get availableTemplates(): ITemplateVM[] {\n const result: ITemplateVM[] = [];\n for (const template of this._templates) {\n if (template.visible && this._form) {\n if (!template.visible(this._form)) {\n continue;\n }\n }\n result.push({ id: template.id, label: template.label, icon: template.icon });\n }\n return result;\n }\n\n setTemplate(templateId: string): void {\n if (this._activeTemplateId === templateId) {\n return;\n }\n this._rebuildChildrenForTemplate(templateId);\n }\n\n get templates(): IObjectFieldTemplates {\n return {\n add: (id: string, configure: (t: ITemplateBuilder) => void) =>\n this._addTemplate(id, configure),\n remove: (templateId: string) => this._removeTemplate(templateId)\n };\n }\n\n private _addTemplate(id: string, configure: (t: ITemplateBuilder) => void): void {\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; templates.add() requires the field to be defined with .template().`\n );\n }\n if (id === TEMPLATE_DISCRIMINATOR) {\n throw new Error(\n `Template id \"${TEMPLATE_DISCRIMINATOR}\" is reserved. Choose a different id.`\n );\n }\n if (this._findTemplate(id)) {\n throw new Error(`Duplicate template id \"${id}\".`);\n }\n const tb = createTemplateBuilder();\n configure(tb);\n this._templates.push(tb._build(id, this._form!.registry));\n }\n\n private _removeTemplate(templateId: string): void {\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; templates.remove() requires the field to be defined with .template().`\n );\n }\n const index = this._templates.findIndex(t => t.id === templateId);\n if (index === -1) {\n return;\n }\n this._templates.splice(index, 1);\n\n if (this.config.isList) {\n this._items = this._items.filter(item => item.templateId !== templateId);\n return;\n }\n if (this._activeTemplateId === templateId) {\n this._activeTemplateId = null;\n this._children = new Map();\n }\n }\n\n setInnerLayout(layout: LayoutNode[] | Record<string, LayoutNode[]>): void {\n if (Array.isArray(layout)) {\n if (this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is templated; layout.object() must pass a per-template map (Record<templateId, LayoutNode[]>), not a single LayoutNode[].`\n );\n }\n this._ownLayout = layout;\n this._templateLayouts = {};\n // Apply nested object layouts to children that already exist\n // (non-templated single + non-templated list items).\n this._applyNestedObjectLayouts(layout, this._children);\n for (const item of this._items) {\n this._applyNestedObjectLayouts(layout, item.children);\n }\n return;\n }\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; layout.object() must pass a single LayoutNode[], not a per-template map.`\n );\n }\n this._templateLayouts = layout;\n this._ownLayout = null;\n // Apply nested object layouts to currently-active templated children\n // (templated single with active template + templated list items).\n if (this._activeTemplateId && layout[this._activeTemplateId]) {\n this._applyNestedObjectLayouts(layout[this._activeTemplateId], this._children);\n }\n for (const item of this._items) {\n if (item.templateId && layout[item.templateId]) {\n this._applyNestedObjectLayouts(layout[item.templateId], item.children);\n }\n }\n }\n\n /**\n * Walk an inner layout for nested `object` nodes and forward each one to\n * the matching child field. The recursion bottoms out naturally: each\n * matched child is itself an ObjectField and will run `_applyNestedObjectLayouts`\n * against its own children whenever they materialise.\n */\n private _applyNestedObjectLayouts(layout: LayoutNode[], children: Map<string, IField>): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const child = children.get(node.fieldName);\n if (child && isObjectField(child)) {\n child.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._applyNestedObjectLayouts(tab.layout, children);\n }\n }\n }\n }\n\n /**\n * Returns the inner layout that should apply to a freshly-built children\n * Map for the given templateId (templated objects/lists) or for the\n * non-templated case. Used to seed nested object layouts on newly-created\n * children before they go live.\n */\n private _innerLayoutFor(templateId: string | undefined): LayoutNode[] | undefined {\n if (this.isTemplated) {\n if (templateId === undefined) {\n return undefined;\n }\n return this._templateLayouts[templateId];\n }\n return this._ownLayout ?? undefined;\n }\n\n private _resolveLayoutForChildren(\n children: Map<string, IField>,\n templateId: string | null\n ): LayoutNodeVM[] {\n const layoutNodes = this.isTemplated\n ? templateId !== null\n ? this._templateLayouts[templateId]\n : undefined\n : (this._ownLayout ?? undefined);\n if (layoutNodes && this._form?.resolveChildLayout) {\n return this._form.resolveChildLayout(layoutNodes, children);\n }\n // Default: one row per visible child, in insertion order.\n const fallback: LayoutNodeVM[] = [];\n for (const [, field] of children) {\n if (field.visible) {\n fallback.push({ type: \"row\", fields: [field.vm] });\n }\n }\n return fallback;\n }\n\n get children(): Map<string, IField> {\n return this._children;\n }\n\n get items(): IListItemField[] {\n return this._items.map(item => ({\n key: item.key,\n children: item.children,\n templateId: item.templateId,\n getData: () => this._getItemData(item)\n }));\n }\n\n private _getItemData(item: ListItem): Record<string, unknown> {\n const data = getChildrenData(item.children);\n if (item.templateId !== undefined) {\n return { [TEMPLATE_DISCRIMINATOR]: item.templateId, ...data };\n }\n return data;\n }\n\n private _getClonedItemData(item: ListItem): Record<string, unknown> {\n const data = getChildrenData(item.children);\n const children = createChildFields(\n this._templateChildBuilders(item.templateId),\n this._form,\n this.qualifiedName\n );\n hydrateChildren(children, data, { clone: true });\n const clonedData = getChildrenData(children);\n if (item.templateId !== undefined) {\n return { [TEMPLATE_DISCRIMINATOR]: item.templateId, ...clonedData };\n }\n return clonedData;\n }\n\n private _getClonedData(): Record<string, unknown> {\n const data = getChildrenData(this._children);\n const builders =\n this.isTemplated && this._activeTemplateId\n ? this._templateChildBuilders(this._activeTemplateId)\n : this.config.childBuilders;\n const children = createChildFields(builders, this._form, this.qualifiedName);\n hydrateChildren(children, data, { clone: true });\n const clonedData = getChildrenData(children);\n if (this.isTemplated && this._activeTemplateId) {\n return { [TEMPLATE_DISCRIMINATOR]: this._activeTemplateId, ...clonedData };\n }\n return clonedData;\n }\n\n getChild(name: string): IField | undefined {\n return this._children.get(name);\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n if (this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is templated; use templates.add()/remove() to manage children. Each template owns its own fields.`\n );\n }\n const builders = factory(this._form!.registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._children.delete(name);\n this.config.childBuilders[name] = undefined as unknown as IFieldBuilder;\n delete this.config.childBuilders[name];\n if (this.config.isList) {\n for (const item of this._items) {\n item.children.delete(name);\n }\n }\n continue;\n }\n\n this.config.childBuilders[name] = builder;\n const built = builder.build(name);\n const newField = createFieldFromConfig(built, this._form, this.qualifiedName);\n this._children.set(name, newField);\n\n if (this.config.isList) {\n for (const item of this._items) {\n const itemField = createFieldFromConfig(built, this._form, this.qualifiedName);\n item.children.set(name, itemField);\n }\n }\n }\n\n // Re-apply nested object layouts so newly-added children pick up any\n // layout.object() entries already registered on this field.\n if (this._ownLayout) {\n this._applyNestedObjectLayouts(this._ownLayout, this._children);\n for (const item of this._items) {\n this._applyNestedObjectLayouts(this._ownLayout, item.children);\n }\n }\n }\n\n getListItemChild(index: number, name: string): IField | undefined {\n const item = this._items[index];\n return item?.children.get(name);\n }\n\n getData(): any {\n if (this.config.isList) {\n return this._items.map(item => this._getItemData(item));\n }\n if (this.isTemplated) {\n if (this._activeTemplateId === null) {\n return null;\n }\n return {\n [TEMPLATE_DISCRIMINATOR]: this._activeTemplateId,\n ...getChildrenData(this._children)\n };\n }\n return getChildrenData(this._children);\n }\n\n getValue<T = unknown>(): T {\n return this.getData() as T;\n }\n\n setValue(value: unknown): void {\n this.setValueSilent(value);\n }\n\n setValueSilent(value: unknown): void {\n if (this.config.isList) {\n this._items = [];\n if (Array.isArray(value)) {\n for (const itemData of value) {\n if (this.isTemplated) {\n if (!itemData || typeof itemData !== \"object\") {\n continue;\n }\n const data = itemData as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId !== \"string\") {\n continue;\n }\n if (!this._findTemplate(templateId)) {\n continue;\n }\n const { [TEMPLATE_DISCRIMINATOR]: _discarded, ...rest } = data;\n this._addItemInternal(rest, templateId);\n } else {\n this._addItemInternal(itemData);\n }\n }\n }\n return;\n }\n if (this.isTemplated) {\n if (value === null || value === undefined) {\n this._activeTemplateId = null;\n this._children = new Map();\n return;\n }\n const data = value as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId !== \"string\") {\n return;\n }\n if (!this._findTemplate(templateId)) {\n return;\n }\n this._rebuildChildrenForTemplate(templateId);\n const { [TEMPLATE_DISCRIMINATOR]: _discarded, ...rest } = data;\n hydrateChildren(this._children, rest);\n return;\n }\n hydrateChildren(this._children, value as Record<string, unknown>);\n }\n\n addItem(\n templateIdOrData?: string | Record<string, unknown>,\n data?: Record<string, unknown>\n ): void {\n if (this.isTemplated) {\n if (typeof templateIdOrData !== \"string\") {\n throw new Error(\n `Object field \"${this.config.name}\": templated list items require a template id. ` +\n `Call addItem(templateId) with one of: ${this._templates.map(t => t.id).join(\", \")}.`\n );\n }\n if (!this._findTemplate(templateIdOrData)) {\n throw new Error(\n `Template \"${templateIdOrData}\" not found on field \"${this.config.name}\". ` +\n `Available: ${this._templates.map(t => t.id).join(\", \") || \"(none)\"}.`\n );\n }\n this._addItemInternal(data, templateIdOrData);\n return;\n }\n if (typeof templateIdOrData === \"string\") {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; addItem() does not accept a template id.`\n );\n }\n this._addItemInternal(templateIdOrData);\n }\n\n removeItem(index: number): void {\n this._items.splice(index, 1);\n }\n\n moveItem(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n fromIndex >= this._items.length ||\n toIndex < 0 ||\n toIndex >= this._items.length ||\n fromIndex === toIndex\n ) {\n return;\n }\n const [item] = this._items.splice(fromIndex, 1);\n this._items.splice(toIndex, 0, item);\n }\n\n duplicateItem(index: number): void {\n const source = this._items[index];\n if (!source) {\n return;\n }\n const data = getChildrenData(source.children);\n const children = createChildFields(\n this._templateChildBuilders(source.templateId),\n this._form,\n this.qualifiedName\n );\n hydrateChildren(children, data, { clone: true });\n const key = `item_${++itemKeyCounter}`;\n this._items.splice(index + 1, 0, { key, children, templateId: source.templateId });\n const inner = this._innerLayoutFor(source.templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n private _templateChildBuilders(templateId: string | undefined): Record<string, IFieldBuilder> {\n if (templateId === undefined) {\n return this.config.childBuilders;\n }\n const template = this._findTemplate(templateId);\n if (!template) {\n throw new Error(`Template \"${templateId}\" not found on field \"${this.config.name}\".`);\n }\n return template.childBuilders;\n }\n\n private _addItemInternal(data?: Record<string, unknown>, templateId?: string): void {\n const children = createChildFields(\n this._templateChildBuilders(templateId),\n this._form,\n this.qualifiedName\n );\n if (data) {\n hydrateChildren(children, data);\n }\n const key = `item_${++itemKeyCounter}`;\n this._items.push({ key, children, templateId });\n const inner = this._innerLayoutFor(templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n resetValidation(): void {\n this._base.resetValidation();\n for (const [, field] of this._children) {\n field.resetValidation();\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.resetValidation();\n }\n }\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (type !== \"object\") {\n throw new Error(`Field \"${this.config.name}\" is type \"object\", not \"${type}\".`);\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n get vm(): IObjectFieldVM {\n const baseVm = this._base.vm;\n return {\n name: baseVm.name,\n qualifiedName: baseVm.qualifiedName,\n type: \"object\",\n label: baseVm.label,\n help: baseVm.help,\n description: baseVm.description,\n note: baseVm.note,\n placeholder: baseVm.placeholder,\n value: this.getValue(),\n validation: baseVm.validation,\n validating: this._validating,\n required: baseVm.required,\n visible: baseVm.visible,\n disabled: baseVm.disabled,\n renderer: baseVm.renderer,\n rendererSettings: baseVm.rendererSettings,\n context: baseVm.context,\n onChange: (value: unknown) => this.setValue(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n focusRequested: baseVm.focusRequested,\n clearFocusRequest: baseVm.clearFocusRequest,\n isList: this.config.isList,\n fields: this.config.isList\n ? []\n : Array.from(this._children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n layout: this.config.isList\n ? []\n : this._resolveLayoutForChildren(this._children, this._activeTemplateId),\n items: this.config.isList\n ? this._items.map((item, index) => ({\n key: item.key,\n fields: Array.from(item.children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n layout: this._resolveLayoutForChildren(\n item.children,\n item.templateId ?? null\n ),\n templateId: item.templateId,\n remove: () => this.removeItem(index),\n moveUp: () => this.moveItem(index, index - 1),\n moveDown: () => this.moveItem(index, index + 1),\n duplicate: () => this.duplicateItem(index),\n getClonedData: () => this._getClonedItemData(item)\n }))\n : [],\n addItem: (value?: unknown) => {\n if (value === undefined) {\n return this.addItem();\n }\n if (typeof value === \"string\") {\n return this.addItem(value);\n }\n const data = value as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId === \"string\") {\n const { [TEMPLATE_DISCRIMINATOR]: _, ...rest } = data;\n return this.addItem(templateId, rest);\n }\n return this.addItem(value as Record<string, unknown>);\n },\n removeItem: (index: number) => this.removeItem(index),\n moveItem: (from: number, to: number) => this.moveItem(from, to),\n duplicateItem: (index: number) => this.duplicateItem(index),\n isTemplated: this.isTemplated,\n availableTemplates: this.availableTemplates,\n activeTemplateId: this._activeTemplateId,\n setTemplate: (templateId: string) => this.setTemplate(templateId),\n getClonedData: () => this._getClonedData()\n };\n }\n\n get hasErrors(): boolean {\n const checkChildren = (children: Map<string, IField>): boolean => {\n for (const [, field] of children) {\n if (field.vm.validation.isValid === false) {\n return true;\n }\n if (isObjectField(field) && field.hasErrors) {\n return true;\n }\n }\n return false;\n };\n\n if (this.config.isList) {\n for (const item of this._items) {\n if (checkChildren(item.children)) {\n return true;\n }\n }\n } else {\n if (checkChildren(this._children)) {\n return true;\n }\n }\n return false;\n }\n\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n this.setValidation({ isValid: null });\n return true;\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._base.resolveRequired();\n if (requiredState.required) {\n const message = requiredState.message || \"This field is required.\";\n if (this.config.isList && this._items.length === 0) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n if (!this.config.isList) {\n if (this.isTemplated) {\n if (this._activeTemplateId === null) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n } else {\n const data = this.getData();\n const hasAnyValue = Object.values(data).some(\n v => v !== null && v !== undefined && v !== \"\"\n );\n if (!hasAnyValue) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n }\n }\n }\n\n if (this.config.isList && this.config.listSchema) {\n const listData = this.getData();\n if (\n !requiredState.required &&\n (listData === null ||\n listData === undefined ||\n (Array.isArray(listData) && listData.length === 0))\n ) {\n this.setValidationWithCache({ isValid: null }, listData, true);\n return true;\n }\n const result = await this.config.listSchema.safeParseAsync(listData);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n if (this.config.schema) {\n const data = this.getData();\n if (!requiredState.required) {\n if (data == null) {\n this.setValidationWithCache({ isValid: null }, data, true);\n return true;\n }\n const hasAnyValue = Object.values(data).some(\n v => v !== null && v !== undefined && v !== \"\"\n );\n if (!hasAnyValue) {\n this.setValidationWithCache({ isValid: null }, data, true);\n return true;\n }\n }\n const result = await this.config.schema.safeParseAsync(data);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n let allValid = true;\n\n if (this.config.isList) {\n for (const item of this._items) {\n const valid = await validateChildren(item.children, options);\n if (!valid) {\n allValid = false;\n }\n }\n } else {\n allValid = await validateChildren(this._children, options);\n }\n\n runInAction(() => {\n this.setValidation({ isValid: allValid });\n });\n\n return allValid;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n}\n"],"names":["TEMPLATE_DISCRIMINATOR","createChildFields","childBuilders","form","parentPath","children","Map","name","builder","Object","config","field","createFieldFromConfig","objField","ObjectField","Field","hydrateChildren","data","options","getChildrenData","isObjectField","toJS","validateChildren","allValid","valid","itemKeyCounter","makeAutoObservable","id","t","templateId","template","Error","inner","value","rules","myPath","item","validation","result","cb","fn","message","configure","tb","createTemplateBuilder","index","layout","Array","node","child","tab","undefined","layoutNodes","fallback","clonedData","builders","factory","built","newField","itemField","itemData","_discarded","rest","templateIdOrData","fromIndex","toIndex","source","key","type","baseVm","f","_","from","to","checkChildren","runInAction","requiredState","hasAnyValue","v","listData","firstIssue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"features/formModel/ObjectField.js","sources":["../../../src/features/formModel/ObjectField.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, toJS } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { createTemplateBuilder } from \"./fieldTypes/ObjectFieldType.js\";\nimport type {\n IObjectFieldConfig,\n IObjectField,\n IObjectFieldTemplates,\n IListItemField,\n IField,\n IObjectFieldVM,\n IFieldValidation,\n IFormModel,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IRule,\n ITemplateBuilder,\n ITemplateConfig,\n ITemplateVM,\n FieldTypeMap,\n LayoutNode,\n LayoutNodeVM,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n ComputedFieldCallback,\n IFieldCallbackParams\n} from \"./abstractions.js\";\n\n/** Reserved key used as the template discriminator in templated object data. */\nexport const TEMPLATE_DISCRIMINATOR = \"_templateId\";\n\nfunction createChildFields(\n childBuilders: Record<string, IFieldBuilder>,\n form: IFormModel | null,\n parentPath?: string,\n scopePath?: () => string\n): Map<string, IField> {\n const children = new Map<string, IField>();\n for (const [name, builder] of Object.entries(childBuilders)) {\n const config = builder.build(name);\n const field = createFieldFromConfig(config, form, parentPath, scopePath);\n children.set(name, field);\n }\n return children;\n}\n\nfunction createFieldFromConfig(\n config: any,\n form: IFormModel | null,\n parentPath?: string,\n scopePath?: () => string\n): IField {\n if (config.childBuilders) {\n const objField = new ObjectField(config as IObjectFieldConfig);\n if (form) {\n objField.setForm(form, parentPath, scopePath);\n }\n return objField;\n }\n const field = new Field(config);\n if (form) {\n field.setForm(form, parentPath, scopePath);\n }\n return field;\n}\n\nfunction hydrateChildren(\n children: Map<string, IField>,\n data: Record<string, unknown> | null | undefined,\n options?: { clone?: boolean }\n): void {\n if (!data) {\n return;\n }\n for (const [name, field] of children) {\n if (name in data) {\n if (options?.clone && field.config.cloneValue) {\n field.setValueSilent(field.config.cloneValue(data[name]));\n } else {\n field.setValueSilent(data[name]);\n }\n }\n }\n}\n\nfunction getChildrenData(children: Map<string, IField>): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of children) {\n if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n}\n\nasync function validateChildren(\n children: Map<string, IField>,\n options?: { force?: boolean }\n): Promise<boolean> {\n let allValid = true;\n for (const [, field] of children) {\n const valid = await field.validate(options);\n if (!valid) {\n allValid = false;\n }\n }\n return allValid;\n}\n\nexport function isObjectField(field: IField): field is ObjectField {\n return field.type === \"object\";\n}\n\nlet itemKeyCounter = 0;\n\ninterface ListItem {\n key: string;\n children: Map<string, IField>;\n templateId?: string;\n}\n\n/**\n * ObjectField — hierarchical field with children, using composition.\n * Holds a `_base` Field for scalar behavior (callbacks, disabled/hidden, form ref).\n * Adds its own children/items management for object and list modes.\n */\nexport class ObjectField implements IObjectField {\n readonly config: IObjectFieldConfig;\n\n private _base: Field;\n private _form: IFormModel | null = null;\n private _children: Map<string, IField>;\n private _items: ListItem[] = [];\n private _templates: ITemplateConfig[] = [];\n private _isTemplated: boolean;\n private _activeTemplateId: string | null = null;\n /** Inner layout for non-templated objects (single layout, applied per item too). */\n private _ownLayout: LayoutNode[] | null = null;\n /** Per-template inner layouts for templated objects. */\n private _templateLayouts: Record<string, LayoutNode[]> = {};\n private _validating = false;\n\n constructor(config: IObjectFieldConfig) {\n this.config = config;\n this._base = new Field({\n ...config,\n type: \"object\",\n renderer:\n config.renderer ??\n (config.isList ? \"objectAccordionMultiple\" : \"objectAccordionSingle\")\n });\n this._templates = config.templates ?? [];\n this._isTemplated = this._templates.length > 0;\n\n if (this._isTemplated) {\n // Templated mode: children populated per-item (list) or when a template is picked (single).\n this._children = new Map();\n } else {\n this._children = createChildFields(config.childBuilders, null);\n }\n\n makeAutoObservable<this, \"_childScope\" | \"_itemScope\">(this, {\n config: false,\n _childScope: false,\n _itemScope: false\n });\n }\n\n private _findTemplate(id: string): ITemplateConfig | undefined {\n return this._templates.find(t => t.id === id);\n }\n\n private _rebuildChildrenForTemplate(templateId: string): void {\n const template = this._findTemplate(templateId);\n if (!template) {\n throw new Error(\n `Template \"${templateId}\" not found on field \"${this.config.name}\". ` +\n `Available: ${this._templates.map(t => t.id).join(\", \") || \"(none)\"}.`\n );\n }\n const children = createChildFields(\n template.childBuilders,\n this._form,\n this.qualifiedName,\n this._childScope\n );\n this._children = children;\n this._activeTemplateId = templateId;\n const inner = this._innerLayoutFor(templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n // --- Forwarded from _base ---\n\n get name(): string {\n return this._base.name;\n }\n\n get type(): string {\n return \"object\";\n }\n\n get visible(): boolean {\n return this._base.visible;\n }\n\n get disabled(): boolean {\n return this._base.disabled;\n }\n\n setDisabled(value: boolean): void {\n this._base.setDisabled(value);\n }\n\n setVisible(value: boolean): void {\n this._base.setVisible(value);\n }\n\n setAncestorRules(rules: IRule[]): void {\n this._base.setAncestorRules(rules);\n }\n\n setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void {\n this._form = form;\n this._base.setForm(form, parentPath, scopePath);\n const myPath = this._base.qualifiedName;\n for (const [, field] of this._children) {\n field.setForm(form, myPath, this._childScope);\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.setForm(form, myPath, this._itemScope(item.key));\n }\n }\n }\n\n /** Scope for direct children: a path `form.field()` resolves to this field. */\n private _childScope = (): string => {\n return this._base.scopedName;\n };\n\n /**\n * Scope for the children of a list item. Children keep `qualifiedName` without an\n * item selector, so `$.` rule targets and `field.parent()` need the item's index to\n * reach their siblings. Resolved lazily, so it follows reorders and removals.\n */\n private _itemScope(key: string): () => string {\n return () => {\n const index = this._items.findIndex(item => item.key === key);\n return `${this._base.scopedName}.${index}`;\n };\n }\n\n setValidation(validation: IFieldValidation): void {\n this._base.setValidation(validation);\n }\n\n private setValidationWithCache(\n validation: IFieldValidation,\n value: unknown,\n result: boolean\n ): void {\n this._base.setValidationWithCache(validation, value, result);\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._base.addBeforeChange(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._base.addAfterChange(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._base.addAfterSetValue(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._base.addOnBlur(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._base.addRequiredWhen(fn, message);\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._base.setComputed(fn);\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._base.setComputedUntilDirty(fn);\n }\n\n blur(): void {\n this._base.blur();\n }\n\n remove(): void {\n this._base.remove();\n }\n\n get qualifiedName(): string {\n return this._base.qualifiedName;\n }\n\n focus(): void {\n this._base.focus();\n }\n\n requestFocus(): void {\n this._base.requestFocus();\n }\n\n clearFocusRequest(): void {\n this._base.clearFocusRequest();\n }\n\n getInnerLayout(): LayoutNode[] | null {\n if (this.isTemplated) {\n return this._activeTemplateId\n ? (this._templateLayouts[this._activeTemplateId] ?? null)\n : null;\n }\n return this._ownLayout;\n }\n\n // --- Object-specific ---\n\n get isList(): boolean {\n return this.config.isList;\n }\n\n get isTemplated(): boolean {\n return this._isTemplated;\n }\n\n get activeTemplateId(): string | null {\n return this._activeTemplateId;\n }\n\n get availableTemplates(): ITemplateVM[] {\n const result: ITemplateVM[] = [];\n for (const template of this._templates) {\n if (template.visible && this._form) {\n if (!template.visible(this._form)) {\n continue;\n }\n }\n result.push({ id: template.id, label: template.label, icon: template.icon });\n }\n return result;\n }\n\n setTemplate(templateId: string): void {\n if (this._activeTemplateId === templateId) {\n return;\n }\n this._rebuildChildrenForTemplate(templateId);\n }\n\n get templates(): IObjectFieldTemplates {\n return {\n add: (id: string, configure: (t: ITemplateBuilder) => void) =>\n this._addTemplate(id, configure),\n remove: (templateId: string) => this._removeTemplate(templateId)\n };\n }\n\n private _addTemplate(id: string, configure: (t: ITemplateBuilder) => void): void {\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; templates.add() requires the field to be defined with .template().`\n );\n }\n if (id === TEMPLATE_DISCRIMINATOR) {\n throw new Error(\n `Template id \"${TEMPLATE_DISCRIMINATOR}\" is reserved. Choose a different id.`\n );\n }\n if (this._findTemplate(id)) {\n throw new Error(`Duplicate template id \"${id}\".`);\n }\n const tb = createTemplateBuilder();\n configure(tb);\n this._templates.push(tb._build(id, this._form!.registry));\n }\n\n private _removeTemplate(templateId: string): void {\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; templates.remove() requires the field to be defined with .template().`\n );\n }\n const index = this._templates.findIndex(t => t.id === templateId);\n if (index === -1) {\n return;\n }\n this._templates.splice(index, 1);\n\n if (this.config.isList) {\n this._items = this._items.filter(item => item.templateId !== templateId);\n return;\n }\n if (this._activeTemplateId === templateId) {\n this._activeTemplateId = null;\n this._children = new Map();\n }\n }\n\n setInnerLayout(layout: LayoutNode[] | Record<string, LayoutNode[]>): void {\n if (Array.isArray(layout)) {\n if (this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is templated; layout.object() must pass a per-template map (Record<templateId, LayoutNode[]>), not a single LayoutNode[].`\n );\n }\n this._ownLayout = layout;\n this._templateLayouts = {};\n // Apply nested object layouts to children that already exist\n // (non-templated single + non-templated list items).\n this._applyNestedObjectLayouts(layout, this._children);\n for (const item of this._items) {\n this._applyNestedObjectLayouts(layout, item.children);\n }\n return;\n }\n if (!this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; layout.object() must pass a single LayoutNode[], not a per-template map.`\n );\n }\n this._templateLayouts = layout;\n this._ownLayout = null;\n // Apply nested object layouts to currently-active templated children\n // (templated single with active template + templated list items).\n if (this._activeTemplateId && layout[this._activeTemplateId]) {\n this._applyNestedObjectLayouts(layout[this._activeTemplateId], this._children);\n }\n for (const item of this._items) {\n if (item.templateId && layout[item.templateId]) {\n this._applyNestedObjectLayouts(layout[item.templateId], item.children);\n }\n }\n }\n\n /**\n * Walk an inner layout for nested `object` nodes and forward each one to\n * the matching child field. The recursion bottoms out naturally: each\n * matched child is itself an ObjectField and will run `_applyNestedObjectLayouts`\n * against its own children whenever they materialise.\n */\n private _applyNestedObjectLayouts(layout: LayoutNode[], children: Map<string, IField>): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const child = children.get(node.fieldName);\n if (child && isObjectField(child)) {\n child.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._applyNestedObjectLayouts(tab.layout, children);\n }\n }\n }\n }\n\n /**\n * Returns the inner layout that should apply to a freshly-built children\n * Map for the given templateId (templated objects/lists) or for the\n * non-templated case. Used to seed nested object layouts on newly-created\n * children before they go live.\n */\n private _innerLayoutFor(templateId: string | undefined): LayoutNode[] | undefined {\n if (this.isTemplated) {\n if (templateId === undefined) {\n return undefined;\n }\n return this._templateLayouts[templateId];\n }\n return this._ownLayout ?? undefined;\n }\n\n private _resolveLayoutForChildren(\n children: Map<string, IField>,\n templateId: string | null\n ): LayoutNodeVM[] {\n const layoutNodes = this.isTemplated\n ? templateId !== null\n ? this._templateLayouts[templateId]\n : undefined\n : (this._ownLayout ?? undefined);\n if (layoutNodes && this._form?.resolveChildLayout) {\n return this._form.resolveChildLayout(layoutNodes, children);\n }\n // Default: one row per visible child, in insertion order.\n const fallback: LayoutNodeVM[] = [];\n for (const [, field] of children) {\n if (field.visible) {\n fallback.push({ type: \"row\", fields: [field.vm] });\n }\n }\n return fallback;\n }\n\n get children(): Map<string, IField> {\n return this._children;\n }\n\n get items(): IListItemField[] {\n return this._items.map(item => ({\n key: item.key,\n children: item.children,\n templateId: item.templateId,\n getData: () => this._getItemData(item)\n }));\n }\n\n private _getItemData(item: ListItem): Record<string, unknown> {\n const data = getChildrenData(item.children);\n if (item.templateId !== undefined) {\n return { [TEMPLATE_DISCRIMINATOR]: item.templateId, ...data };\n }\n return data;\n }\n\n private _getClonedItemData(item: ListItem): Record<string, unknown> {\n const data = getChildrenData(item.children);\n const children = createChildFields(\n this._templateChildBuilders(item.templateId),\n this._form,\n this.qualifiedName\n );\n hydrateChildren(children, data, { clone: true });\n const clonedData = getChildrenData(children);\n if (item.templateId !== undefined) {\n return { [TEMPLATE_DISCRIMINATOR]: item.templateId, ...clonedData };\n }\n return clonedData;\n }\n\n private _getClonedData(): Record<string, unknown> {\n const data = getChildrenData(this._children);\n const builders =\n this.isTemplated && this._activeTemplateId\n ? this._templateChildBuilders(this._activeTemplateId)\n : this.config.childBuilders;\n const children = createChildFields(builders, this._form, this.qualifiedName);\n hydrateChildren(children, data, { clone: true });\n const clonedData = getChildrenData(children);\n if (this.isTemplated && this._activeTemplateId) {\n return { [TEMPLATE_DISCRIMINATOR]: this._activeTemplateId, ...clonedData };\n }\n return clonedData;\n }\n\n getChild(name: string): IField | undefined {\n return this._children.get(name);\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n if (this.isTemplated) {\n throw new Error(\n `Object field \"${this.config.name}\" is templated; use templates.add()/remove() to manage children. Each template owns its own fields.`\n );\n }\n const builders = factory(this._form!.registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._children.delete(name);\n this.config.childBuilders[name] = undefined as unknown as IFieldBuilder;\n delete this.config.childBuilders[name];\n if (this.config.isList) {\n for (const item of this._items) {\n item.children.delete(name);\n }\n }\n continue;\n }\n\n this.config.childBuilders[name] = builder;\n const built = builder.build(name);\n const newField = createFieldFromConfig(\n built,\n this._form,\n this.qualifiedName,\n this._childScope\n );\n this._children.set(name, newField);\n\n if (this.config.isList) {\n for (const item of this._items) {\n const itemField = createFieldFromConfig(\n built,\n this._form,\n this.qualifiedName,\n this._itemScope(item.key)\n );\n item.children.set(name, itemField);\n }\n }\n }\n\n // Re-apply nested object layouts so newly-added children pick up any\n // layout.object() entries already registered on this field.\n if (this._ownLayout) {\n this._applyNestedObjectLayouts(this._ownLayout, this._children);\n for (const item of this._items) {\n this._applyNestedObjectLayouts(this._ownLayout, item.children);\n }\n }\n }\n\n getListItemChild(index: number, name: string): IField | undefined {\n const item = this._items[index];\n return item?.children.get(name);\n }\n\n getData(): any {\n if (this.config.isList) {\n return this._items.map(item => this._getItemData(item));\n }\n if (this.isTemplated) {\n if (this._activeTemplateId === null) {\n return null;\n }\n return {\n [TEMPLATE_DISCRIMINATOR]: this._activeTemplateId,\n ...getChildrenData(this._children)\n };\n }\n return getChildrenData(this._children);\n }\n\n getValue<T = unknown>(): T {\n return this.getData() as T;\n }\n\n setValue(value: unknown): void {\n this.setValueSilent(value);\n }\n\n setValueSilent(value: unknown): void {\n if (this.config.isList) {\n this._items = [];\n if (Array.isArray(value)) {\n for (const itemData of value) {\n if (this.isTemplated) {\n if (!itemData || typeof itemData !== \"object\") {\n continue;\n }\n const data = itemData as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId !== \"string\") {\n continue;\n }\n if (!this._findTemplate(templateId)) {\n continue;\n }\n const { [TEMPLATE_DISCRIMINATOR]: _discarded, ...rest } = data;\n this._addItemInternal(rest, templateId);\n } else {\n this._addItemInternal(itemData);\n }\n }\n }\n return;\n }\n if (this.isTemplated) {\n if (value === null || value === undefined) {\n this._activeTemplateId = null;\n this._children = new Map();\n return;\n }\n const data = value as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId !== \"string\") {\n return;\n }\n if (!this._findTemplate(templateId)) {\n return;\n }\n this._rebuildChildrenForTemplate(templateId);\n const { [TEMPLATE_DISCRIMINATOR]: _discarded, ...rest } = data;\n hydrateChildren(this._children, rest);\n return;\n }\n hydrateChildren(this._children, value as Record<string, unknown>);\n }\n\n addItem(\n templateIdOrData?: string | Record<string, unknown>,\n data?: Record<string, unknown>\n ): void {\n if (this.isTemplated) {\n if (typeof templateIdOrData !== \"string\") {\n throw new Error(\n `Object field \"${this.config.name}\": templated list items require a template id. ` +\n `Call addItem(templateId) with one of: ${this._templates.map(t => t.id).join(\", \")}.`\n );\n }\n if (!this._findTemplate(templateIdOrData)) {\n throw new Error(\n `Template \"${templateIdOrData}\" not found on field \"${this.config.name}\". ` +\n `Available: ${this._templates.map(t => t.id).join(\", \") || \"(none)\"}.`\n );\n }\n this._addItemInternal(data, templateIdOrData);\n return;\n }\n if (typeof templateIdOrData === \"string\") {\n throw new Error(\n `Object field \"${this.config.name}\" is not templated; addItem() does not accept a template id.`\n );\n }\n this._addItemInternal(templateIdOrData);\n }\n\n removeItem(index: number): void {\n this._items.splice(index, 1);\n }\n\n moveItem(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n fromIndex >= this._items.length ||\n toIndex < 0 ||\n toIndex >= this._items.length ||\n fromIndex === toIndex\n ) {\n return;\n }\n const [item] = this._items.splice(fromIndex, 1);\n this._items.splice(toIndex, 0, item);\n }\n\n duplicateItem(index: number): void {\n const source = this._items[index];\n if (!source) {\n return;\n }\n const data = getChildrenData(source.children);\n const key = `item_${++itemKeyCounter}`;\n const children = createChildFields(\n this._templateChildBuilders(source.templateId),\n this._form,\n this.qualifiedName,\n this._itemScope(key)\n );\n hydrateChildren(children, data, { clone: true });\n this._items.splice(index + 1, 0, { key, children, templateId: source.templateId });\n const inner = this._innerLayoutFor(source.templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n private _templateChildBuilders(templateId: string | undefined): Record<string, IFieldBuilder> {\n if (templateId === undefined) {\n return this.config.childBuilders;\n }\n const template = this._findTemplate(templateId);\n if (!template) {\n throw new Error(`Template \"${templateId}\" not found on field \"${this.config.name}\".`);\n }\n return template.childBuilders;\n }\n\n private _addItemInternal(data?: Record<string, unknown>, templateId?: string): void {\n const key = `item_${++itemKeyCounter}`;\n const children = createChildFields(\n this._templateChildBuilders(templateId),\n this._form,\n this.qualifiedName,\n this._itemScope(key)\n );\n if (data) {\n hydrateChildren(children, data);\n }\n this._items.push({ key, children, templateId });\n const inner = this._innerLayoutFor(templateId);\n if (inner) {\n this._applyNestedObjectLayouts(inner, children);\n }\n }\n\n resetValidation(): void {\n this._base.resetValidation();\n for (const [, field] of this._children) {\n field.resetValidation();\n }\n for (const item of this._items) {\n for (const [, field] of item.children) {\n field.resetValidation();\n }\n }\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (type !== \"object\") {\n throw new Error(`Field \"${this.config.name}\" is type \"object\", not \"${type}\".`);\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n get vm(): IObjectFieldVM {\n const baseVm = this._base.vm;\n return {\n name: baseVm.name,\n qualifiedName: baseVm.qualifiedName,\n type: \"object\",\n label: baseVm.label,\n help: baseVm.help,\n description: baseVm.description,\n note: baseVm.note,\n placeholder: baseVm.placeholder,\n value: this.getValue(),\n validation: baseVm.validation,\n validating: this._validating,\n required: baseVm.required,\n visible: baseVm.visible,\n disabled: baseVm.disabled,\n renderer: baseVm.renderer,\n rendererSettings: baseVm.rendererSettings,\n context: baseVm.context,\n onChange: (value: unknown) => this.setValue(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n focusRequested: baseVm.focusRequested,\n clearFocusRequest: baseVm.clearFocusRequest,\n isList: this.config.isList,\n fields: this.config.isList\n ? []\n : Array.from(this._children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n layout: this.config.isList\n ? []\n : this._resolveLayoutForChildren(this._children, this._activeTemplateId),\n items: this.config.isList\n ? this._items.map((item, index) => ({\n key: item.key,\n fields: Array.from(item.children.values())\n .filter(f => f.visible)\n .map(f => f.vm),\n layout: this._resolveLayoutForChildren(\n item.children,\n item.templateId ?? null\n ),\n templateId: item.templateId,\n remove: () => this.removeItem(index),\n moveUp: () => this.moveItem(index, index - 1),\n moveDown: () => this.moveItem(index, index + 1),\n duplicate: () => this.duplicateItem(index),\n getClonedData: () => this._getClonedItemData(item)\n }))\n : [],\n addItem: (value?: unknown) => {\n if (value === undefined) {\n return this.addItem();\n }\n if (typeof value === \"string\") {\n return this.addItem(value);\n }\n const data = value as Record<string, unknown>;\n const templateId = data[TEMPLATE_DISCRIMINATOR];\n if (typeof templateId === \"string\") {\n const { [TEMPLATE_DISCRIMINATOR]: _, ...rest } = data;\n return this.addItem(templateId, rest);\n }\n return this.addItem(value as Record<string, unknown>);\n },\n removeItem: (index: number) => this.removeItem(index),\n moveItem: (from: number, to: number) => this.moveItem(from, to),\n duplicateItem: (index: number) => this.duplicateItem(index),\n isTemplated: this.isTemplated,\n availableTemplates: this.availableTemplates,\n activeTemplateId: this._activeTemplateId,\n setTemplate: (templateId: string) => this.setTemplate(templateId),\n getClonedData: () => this._getClonedData()\n };\n }\n\n get hasErrors(): boolean {\n const checkChildren = (children: Map<string, IField>): boolean => {\n for (const [, field] of children) {\n if (field.vm.validation.isValid === false) {\n return true;\n }\n if (isObjectField(field) && field.hasErrors) {\n return true;\n }\n }\n return false;\n };\n\n if (this.config.isList) {\n for (const item of this._items) {\n if (checkChildren(item.children)) {\n return true;\n }\n }\n } else {\n if (checkChildren(this._children)) {\n return true;\n }\n }\n return false;\n }\n\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n this.setValidation({ isValid: null });\n return true;\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._base.resolveRequired();\n if (requiredState.required) {\n const message = requiredState.message || \"This field is required.\";\n if (this.config.isList && this._items.length === 0) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n if (!this.config.isList) {\n if (this.isTemplated) {\n if (this._activeTemplateId === null) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n } else {\n const data = this.getData();\n const hasAnyValue = Object.values(data).some(\n v => v !== null && v !== undefined && v !== \"\"\n );\n if (!hasAnyValue) {\n this.setValidation({ isValid: false, message });\n return false;\n }\n }\n }\n }\n\n if (this.config.isList && this.config.listSchema) {\n const listData = this.getData();\n if (\n !requiredState.required &&\n (listData === null ||\n listData === undefined ||\n (Array.isArray(listData) && listData.length === 0))\n ) {\n this.setValidationWithCache({ isValid: null }, listData, true);\n return true;\n }\n const result = await this.config.listSchema.safeParseAsync(listData);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n if (this.config.schema) {\n const data = this.getData();\n if (!requiredState.required) {\n if (data == null) {\n this.setValidationWithCache({ isValid: null }, data, true);\n return true;\n }\n const hasAnyValue = Object.values(data).some(\n v => v !== null && v !== undefined && v !== \"\"\n );\n if (!hasAnyValue) {\n this.setValidationWithCache({ isValid: null }, data, true);\n return true;\n }\n }\n const result = await this.config.schema.safeParseAsync(data);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this.setValidation({\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n });\n });\n return false;\n }\n }\n\n let allValid = true;\n\n if (this.config.isList) {\n for (const item of this._items) {\n const valid = await validateChildren(item.children, options);\n if (!valid) {\n allValid = false;\n }\n }\n } else {\n allValid = await validateChildren(this._children, options);\n }\n\n runInAction(() => {\n this.setValidation({ isValid: allValid });\n });\n\n return allValid;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n}\n"],"names":["TEMPLATE_DISCRIMINATOR","createChildFields","childBuilders","form","parentPath","scopePath","children","Map","name","builder","Object","config","field","createFieldFromConfig","objField","ObjectField","Field","hydrateChildren","data","options","getChildrenData","isObjectField","toJS","validateChildren","allValid","valid","itemKeyCounter","makeAutoObservable","id","t","templateId","template","Error","inner","value","rules","myPath","item","key","index","validation","result","cb","fn","message","configure","tb","createTemplateBuilder","layout","Array","node","child","tab","undefined","layoutNodes","fallback","clonedData","builders","factory","built","newField","itemField","itemData","_discarded","rest","templateIdOrData","fromIndex","toIndex","source","type","baseVm","f","_","from","to","checkChildren","runInAction","requiredState","hasAnyValue","v","listData","firstIssue"],"mappings":"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"}
|
|
@@ -185,7 +185,13 @@ export interface IField {
|
|
|
185
185
|
setValueSilent(value: unknown): void;
|
|
186
186
|
setDisabled(value: boolean): void;
|
|
187
187
|
setVisible(value: boolean): void;
|
|
188
|
-
|
|
188
|
+
/**
|
|
189
|
+
* `parentPath` is the parent's qualified name. `scopePath` returns a path that
|
|
190
|
+
* `form.field()` resolves to the parent itself; it differs from `parentPath` for
|
|
191
|
+
* list item children, where it includes the item index (`blocks.2`). `$.` rule
|
|
192
|
+
* targets and `field.parent()` resolve against it. Defaults to `parentPath`.
|
|
193
|
+
*/
|
|
194
|
+
setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void;
|
|
189
195
|
setAncestorRules(rules: IRule[]): void;
|
|
190
196
|
setValidation(validation: IFieldValidation): void;
|
|
191
197
|
resetValidation(): void;
|
|
@@ -583,6 +589,13 @@ export interface IFormModel<T = Record<string, any>> {
|
|
|
583
589
|
}): void;
|
|
584
590
|
reset(): void;
|
|
585
591
|
validate(): Promise<boolean>;
|
|
592
|
+
/**
|
|
593
|
+
* Assign errors from outside the form, e.g. a rejected save. Errors whose `path`
|
|
594
|
+
* resolves to a visible field become that field's validation error; the rest are
|
|
595
|
+
* form-level. The form is marked as submitted so `FormErrors` renders them. They are
|
|
596
|
+
* cleared by the next `validate()`, `setData()` or `reset()`.
|
|
597
|
+
*/
|
|
598
|
+
setErrors(errors: IFormError[]): void;
|
|
586
599
|
submit<T = Record<string, unknown>>(options?: {
|
|
587
600
|
skipValidation?: boolean;
|
|
588
601
|
}): Promise<T | false>;
|