@webiny/app-admin 6.5.0-beta.1 → 6.5.0-beta.11
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/base/Admin.js +2 -0
- package/base/Admin.js.map +1 -1
- package/base/Base/FieldRenderers/AutoCompleteRenderer.js +1 -0
- package/base/Base/FieldRenderers/AutoCompleteRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +8 -4
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/{TemplatePicker.d.ts → TemplatePicker/AddTemplateButton.d.ts} +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js +24 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/AddTemplateButton.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.d.ts +13 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js +21 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/SelectableTemplate.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateCard.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGallery.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js +46 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateGalleryToolbar.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.d.ts +8 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js +16 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateIcon.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateList.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.d.ts +3 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js +35 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/TemplateListItem.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.d.ts +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/index.js +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.d.ts +6 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker/types.js +0 -0
- package/base/Base/FieldRenderers/SelectRenderer.js +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +2 -2
- package/components/Filters/Filters.js +7 -1
- package/components/Filters/Filters.js.map +1 -1
- package/components/IconPicker/IconPickerComponent.d.ts +2 -2
- package/components/IconPicker/IconPickerComponent.js +1 -1
- package/components/IconPicker/IconPickerComponent.js.map +1 -1
- package/components/ListView/ListViewBulkActions.d.ts +2 -2
- package/components/ListView/ListViewContent.d.ts +2 -2
- package/components/ListView/ListViewFilters.d.ts +2 -2
- package/components/ListView/index.d.ts +6 -6
- package/components/RolesMultiAutocomplete/index.js +1 -1
- package/components/RolesMultiAutocomplete/index.js.map +1 -1
- package/components/Table/components/Table/TableInner.d.ts +2 -2
- package/components/TeamsMultiAutocomplete/index.js +1 -1
- package/components/TeamsMultiAutocomplete/index.js.map +1 -1
- package/domain/Identity.js +1 -1
- package/domain/Identity.js.map +1 -1
- package/features/debugger/Debugger.d.ts +8 -0
- package/features/debugger/Debugger.js +25 -0
- package/features/debugger/Debugger.js.map +1 -0
- package/features/debugger/DebuggerIndicator.d.ts +16 -0
- package/features/debugger/DebuggerIndicator.js +31 -0
- package/features/debugger/DebuggerIndicator.js.map +1 -0
- package/features/debugger/DebuggerStore.d.ts +55 -0
- package/features/debugger/DebuggerStore.js +65 -0
- package/features/debugger/DebuggerStore.js.map +1 -0
- package/features/debugger/DebuggerView.d.ts +4 -0
- package/features/debugger/DebuggerView.js +49 -0
- package/features/debugger/DebuggerView.js.map +1 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.d.ts +15 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.js +15 -0
- package/features/debugger/GraphQLExtensionsDebugHandler.js.map +1 -0
- package/features/debugger/debuggerLink.d.ts +12 -0
- package/features/debugger/debuggerLink.js +10 -0
- package/features/debugger/debuggerLink.js.map +1 -0
- package/features/debugger/feature.d.ts +1 -0
- package/features/debugger/feature.js +18 -0
- package/features/debugger/feature.js.map +1 -0
- package/features/debugger/index.d.ts +7 -0
- package/features/debugger/index.js +7 -0
- package/features/debugger/permissions.d.ts +68 -0
- package/features/debugger/permissions.js +27 -0
- package/features/debugger/permissions.js.map +1 -0
- package/features/debugger/report.d.ts +7 -0
- package/features/debugger/report.js +22 -0
- package/features/debugger/report.js.map +1 -0
- package/features/debugger/routes.d.ts +4 -0
- package/features/debugger/routes.js +10 -0
- package/features/debugger/routes.js.map +1 -0
- 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 +25 -0
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FormErrors.d.ts +2 -2
- package/features/formModel/FormErrors.js +1 -1
- package/features/formModel/FormErrors.js.map +1 -1
- package/features/formModel/FormModel.d.ts +2 -0
- package/features/formModel/FormModel.js +25 -0
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +587 -2
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormView.d.ts +8 -4
- package/features/formModel/ObjectField.d.ts +11 -1
- package/features/formModel/ObjectField.js +45 -20
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/PresenterErrors.d.ts +2 -2
- package/features/formModel/abstractions.d.ts +30 -1
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/createFieldRenderer.js +3 -4
- package/features/formModel/createFieldRenderer.js.map +1 -1
- package/features/formModel/demo/FormModelDemo.d.ts +2 -2
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +2 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +19 -15
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -1
- package/features/formModel/fieldTypes/ObjectFieldType.d.ts +3 -1
- package/features/formModel/fieldTypes/ObjectFieldType.js +23 -1
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -1
- package/features/notifications/NotificationsRenderer.d.ts +2 -2
- package/features/wcp/WcpGateway.js +7 -0
- package/features/wcp/WcpGateway.js.map +1 -1
- package/hooks/useHotkeys.js +3 -1
- package/hooks/useHotkeys.js.map +1 -1
- package/hooks/useSnackbar.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +3 -2
- package/package.json +34 -34
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js +1 -2
- package/presentation/accessManagement/apiKeys/ApiKeysPresenter.js.map +1 -1
- package/presentation/accessManagement/apiKeys/components/ApiKeysView.d.ts +2 -2
- package/presentation/accessManagement/roles/RolesPresenter.js +1 -2
- package/presentation/accessManagement/roles/RolesPresenter.js.map +1 -1
- package/presentation/accessManagement/roles/components/RolesView.d.ts +2 -2
- package/presentation/accessManagement/teams/TeamsPresenter.js +1 -2
- package/presentation/accessManagement/teams/TeamsPresenter.js.map +1 -1
- package/presentation/accessManagement/teams/components/TeamsView.d.ts +2 -2
- package/presentation/installation/components/SystemInstaller/SystemInstaller.d.ts +2 -2
- package/presentation/listPresenter/QueryMatcher.js +3 -3
- package/presentation/listPresenter/QueryMatcher.js.map +1 -1
- package/presentation/trashBin/components/BulkActions/DeleteItems.d.ts +2 -2
- package/presentation/trashBin/components/BulkActions/RestoreItems.d.ts +2 -2
- package/presentation/trashBin/components/TrashBinOverlay.d.ts +2 -2
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +0 -68
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +0 -1
|
@@ -33,13 +33,17 @@ interface FormViewProps {
|
|
|
33
33
|
* Generic form view that walks layout nodes and renders fields.
|
|
34
34
|
* This component is stateless — it reads from the FormVM and delegates to renderers.
|
|
35
35
|
*/
|
|
36
|
-
export declare const FormView: (({ name, form, renderers, layoutRenderers }: FormViewProps) => React.JSX.Element) & {
|
|
37
|
-
|
|
36
|
+
export declare const FormView: (({ name, form, renderers, layoutRenderers }: FormViewProps) => React.JSX.Element) & React.NamedExoticComponent<FormViewProps> & {
|
|
37
|
+
readonly type: ({ name, form, renderers, layoutRenderers }: FormViewProps) => React.JSX.Element;
|
|
38
38
|
};
|
|
39
39
|
export declare const LayoutNodeRenderer: (({ node }: {
|
|
40
40
|
node: LayoutNodeVM;
|
|
41
|
-
}) => React.JSX.Element | null) & {
|
|
42
|
-
|
|
41
|
+
}) => React.JSX.Element | null) & React.NamedExoticComponent<{
|
|
42
|
+
node: LayoutNodeVM;
|
|
43
|
+
}> & {
|
|
44
|
+
readonly type: ({ node }: {
|
|
45
|
+
node: LayoutNodeVM;
|
|
46
|
+
}) => React.JSX.Element | null;
|
|
43
47
|
};
|
|
44
48
|
export interface TabsNodeRendererProps {
|
|
45
49
|
node: ITabsNodeVM;
|
|
@@ -22,6 +22,8 @@ export declare class ObjectField implements IObjectField {
|
|
|
22
22
|
private _templateLayouts;
|
|
23
23
|
private _validating;
|
|
24
24
|
constructor(config: IObjectFieldConfig);
|
|
25
|
+
/** Layouts declared on the templates themselves via `template.layout()`. */
|
|
26
|
+
private _declaredTemplateLayouts;
|
|
25
27
|
private _findTemplate;
|
|
26
28
|
private _rebuildChildrenForTemplate;
|
|
27
29
|
get name(): string;
|
|
@@ -31,7 +33,15 @@ export declare class ObjectField implements IObjectField {
|
|
|
31
33
|
setDisabled(value: boolean): void;
|
|
32
34
|
setVisible(value: boolean): void;
|
|
33
35
|
setAncestorRules(rules: IRule[]): void;
|
|
34
|
-
setForm(form: IFormModel, parentPath?: string): void;
|
|
36
|
+
setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void;
|
|
37
|
+
/** Scope for direct children: a path `form.field()` resolves to this field. */
|
|
38
|
+
private _childScope;
|
|
39
|
+
/**
|
|
40
|
+
* Scope for the children of a list item. Children keep `qualifiedName` without an
|
|
41
|
+
* item selector, so `$.` rule targets and `field.parent()` need the item's index to
|
|
42
|
+
* reach their siblings. Resolved lazily, so it follows reorders and removals.
|
|
43
|
+
*/
|
|
44
|
+
private _itemScope;
|
|
35
45
|
setValidation(validation: IFieldValidation): void;
|
|
36
46
|
private setValidationWithCache;
|
|
37
47
|
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,
|
|
@@ -61,19 +62,31 @@ class ObjectField {
|
|
|
61
62
|
});
|
|
62
63
|
this._templates = config.templates ?? [];
|
|
63
64
|
this._isTemplated = this._templates.length > 0;
|
|
65
|
+
this._ownLayout = config.layout ?? null;
|
|
66
|
+
this._templateLayouts = this._declaredTemplateLayouts();
|
|
64
67
|
if (this._isTemplated) this._children = new Map();
|
|
65
|
-
else
|
|
68
|
+
else {
|
|
69
|
+
this._children = createChildFields(config.childBuilders, null);
|
|
70
|
+
if (this._ownLayout) this._applyNestedObjectLayouts(this._ownLayout, this._children);
|
|
71
|
+
}
|
|
66
72
|
makeAutoObservable(this, {
|
|
67
|
-
config: false
|
|
73
|
+
config: false,
|
|
74
|
+
_childScope: false,
|
|
75
|
+
_itemScope: false
|
|
68
76
|
});
|
|
69
77
|
}
|
|
78
|
+
_declaredTemplateLayouts() {
|
|
79
|
+
const layouts = {};
|
|
80
|
+
for (const template of this._templates)if (template.layout) layouts[template.id] = template.layout;
|
|
81
|
+
return layouts;
|
|
82
|
+
}
|
|
70
83
|
_findTemplate(id) {
|
|
71
84
|
return this._templates.find((t)=>t.id === id);
|
|
72
85
|
}
|
|
73
86
|
_rebuildChildrenForTemplate(templateId) {
|
|
74
87
|
const template = this._findTemplate(templateId);
|
|
75
88
|
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);
|
|
89
|
+
const children = createChildFields(template.childBuilders, this._form, this.qualifiedName, this._childScope);
|
|
77
90
|
this._children = children;
|
|
78
91
|
this._activeTemplateId = templateId;
|
|
79
92
|
const inner = this._innerLayoutFor(templateId);
|
|
@@ -100,12 +113,18 @@ class ObjectField {
|
|
|
100
113
|
setAncestorRules(rules) {
|
|
101
114
|
this._base.setAncestorRules(rules);
|
|
102
115
|
}
|
|
103
|
-
setForm(form, parentPath) {
|
|
116
|
+
setForm(form, parentPath, scopePath) {
|
|
104
117
|
this._form = form;
|
|
105
|
-
this._base.setForm(form, parentPath);
|
|
118
|
+
this._base.setForm(form, parentPath, scopePath);
|
|
106
119
|
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);
|
|
120
|
+
for (const [, field] of this._children)field.setForm(form, myPath, this._childScope);
|
|
121
|
+
for (const item of this._items)for (const [, field] of item.children)field.setForm(form, myPath, this._itemScope(item.key));
|
|
122
|
+
}
|
|
123
|
+
_itemScope(key) {
|
|
124
|
+
return ()=>{
|
|
125
|
+
const index = this._items.findIndex((item)=>item.key === key);
|
|
126
|
+
return `${this._base.scopedName}.${index}`;
|
|
127
|
+
};
|
|
109
128
|
}
|
|
110
129
|
setValidation(validation) {
|
|
111
130
|
this._base.setValidation(validation);
|
|
@@ -174,6 +193,7 @@ class ObjectField {
|
|
|
174
193
|
result.push({
|
|
175
194
|
id: template.id,
|
|
176
195
|
label: template.label,
|
|
196
|
+
description: template.description,
|
|
177
197
|
icon: template.icon
|
|
178
198
|
});
|
|
179
199
|
}
|
|
@@ -195,7 +215,9 @@ class ObjectField {
|
|
|
195
215
|
if (this._findTemplate(id)) throw new Error(`Duplicate template id "${id}".`);
|
|
196
216
|
const tb = createTemplateBuilder();
|
|
197
217
|
configure(tb);
|
|
198
|
-
|
|
218
|
+
const template = tb._build(id, this._form.registry);
|
|
219
|
+
this._templates.push(template);
|
|
220
|
+
if (template.layout && !this._templateLayouts[id]) this._templateLayouts[id] = template.layout;
|
|
199
221
|
}
|
|
200
222
|
_removeTemplate(templateId) {
|
|
201
223
|
if (!this.isTemplated) throw new Error(`Object field "${this.config.name}" is not templated; templates.remove() requires the field to be defined with .template().`);
|
|
@@ -221,7 +243,10 @@ class ObjectField {
|
|
|
221
243
|
return;
|
|
222
244
|
}
|
|
223
245
|
if (!this.isTemplated) throw new Error(`Object field "${this.config.name}" is not templated; layout.object() must pass a single LayoutNode[], not a per-template map.`);
|
|
224
|
-
this._templateLayouts =
|
|
246
|
+
this._templateLayouts = {
|
|
247
|
+
...this._declaredTemplateLayouts(),
|
|
248
|
+
...layout
|
|
249
|
+
};
|
|
225
250
|
this._ownLayout = null;
|
|
226
251
|
if (this._activeTemplateId && layout[this._activeTemplateId]) this._applyNestedObjectLayouts(layout[this._activeTemplateId], this._children);
|
|
227
252
|
for (const item of this._items)if (item.templateId && layout[item.templateId]) this._applyNestedObjectLayouts(layout[item.templateId], item.children);
|
|
@@ -313,10 +338,10 @@ class ObjectField {
|
|
|
313
338
|
}
|
|
314
339
|
this.config.childBuilders[name] = builder;
|
|
315
340
|
const built = builder.build(name);
|
|
316
|
-
const newField = createFieldFromConfig(built, this._form, this.qualifiedName);
|
|
341
|
+
const newField = createFieldFromConfig(built, this._form, this.qualifiedName, this._childScope);
|
|
317
342
|
this._children.set(name, newField);
|
|
318
343
|
if (this.config.isList) for (const item of this._items){
|
|
319
|
-
const itemField = createFieldFromConfig(built, this._form, this.qualifiedName);
|
|
344
|
+
const itemField = createFieldFromConfig(built, this._form, this.qualifiedName, this._itemScope(item.key));
|
|
320
345
|
item.children.set(name, itemField);
|
|
321
346
|
}
|
|
322
347
|
}
|
|
@@ -399,11 +424,11 @@ class ObjectField {
|
|
|
399
424
|
const source = this._items[index];
|
|
400
425
|
if (!source) return;
|
|
401
426
|
const data = getChildrenData(source.children);
|
|
402
|
-
const
|
|
427
|
+
const key = `item_${++itemKeyCounter}`;
|
|
428
|
+
const children = createChildFields(this._templateChildBuilders(source.templateId), this._form, this.qualifiedName, this._itemScope(key));
|
|
403
429
|
hydrateChildren(children, data, {
|
|
404
430
|
clone: true
|
|
405
431
|
});
|
|
406
|
-
const key = `item_${++itemKeyCounter}`;
|
|
407
432
|
this._items.splice(index + 1, 0, {
|
|
408
433
|
key,
|
|
409
434
|
children,
|
|
@@ -419,9 +444,9 @@ class ObjectField {
|
|
|
419
444
|
return template.childBuilders;
|
|
420
445
|
}
|
|
421
446
|
_addItemInternal(data, templateId) {
|
|
422
|
-
const children = createChildFields(this._templateChildBuilders(templateId), this._form, this.qualifiedName);
|
|
423
|
-
if (data) hydrateChildren(children, data);
|
|
424
447
|
const key = `item_${++itemKeyCounter}`;
|
|
448
|
+
const children = createChildFields(this._templateChildBuilders(templateId), this._form, this.qualifiedName, this._itemScope(key));
|
|
449
|
+
if (data) hydrateChildren(children, data);
|
|
425
450
|
this._items.push({
|
|
426
451
|
key,
|
|
427
452
|
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 this._ownLayout = config.layout ?? null;\n this._templateLayouts = this._declaredTemplateLayouts();\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 if (this._ownLayout) {\n this._applyNestedObjectLayouts(this._ownLayout, this._children);\n }\n }\n\n makeAutoObservable<this, \"_childScope\" | \"_itemScope\">(this, {\n config: false,\n _childScope: false,\n _itemScope: false\n });\n }\n\n /** Layouts declared on the templates themselves via `template.layout()`. */\n private _declaredTemplateLayouts(): Record<string, LayoutNode[]> {\n const layouts: Record<string, LayoutNode[]> = {};\n for (const template of this._templates) {\n if (template.layout) {\n layouts[template.id] = template.layout;\n }\n }\n return layouts;\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({\n id: template.id,\n label: template.label,\n description: template.description,\n icon: template.icon\n });\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 const template = tb._build(id, this._form!.registry);\n this._templates.push(template);\n if (template.layout && !this._templateLayouts[id]) {\n this._templateLayouts[id] = template.layout;\n }\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 // Templates the override doesn't mention keep the layout they declared.\n this._templateLayouts = { ...this._declaredTemplateLayouts(), ...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","layouts","template","id","t","templateId","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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"}
|
|
@@ -3,7 +3,7 @@ interface PresenterErrorsProps {
|
|
|
3
3
|
title?: string;
|
|
4
4
|
errors: string[];
|
|
5
5
|
}
|
|
6
|
-
export declare const PresenterErrors: (({ errors, ...props }: PresenterErrorsProps) => React.JSX.Element | null) & {
|
|
7
|
-
|
|
6
|
+
export declare const PresenterErrors: (({ errors, ...props }: PresenterErrorsProps) => React.JSX.Element | null) & React.NamedExoticComponent<PresenterErrorsProps> & {
|
|
7
|
+
readonly type: ({ errors, ...props }: PresenterErrorsProps) => React.JSX.Element | null;
|
|
8
8
|
};
|
|
9
9
|
export {};
|
|
@@ -171,6 +171,7 @@ export interface ITemplateIcon {
|
|
|
171
171
|
export interface ITemplateVM {
|
|
172
172
|
id: string;
|
|
173
173
|
label: string;
|
|
174
|
+
description?: string;
|
|
174
175
|
icon?: ITemplateIcon;
|
|
175
176
|
}
|
|
176
177
|
export interface IField {
|
|
@@ -185,7 +186,13 @@ export interface IField {
|
|
|
185
186
|
setValueSilent(value: unknown): void;
|
|
186
187
|
setDisabled(value: boolean): void;
|
|
187
188
|
setVisible(value: boolean): void;
|
|
188
|
-
|
|
189
|
+
/**
|
|
190
|
+
* `parentPath` is the parent's qualified name. `scopePath` returns a path that
|
|
191
|
+
* `form.field()` resolves to the parent itself; it differs from `parentPath` for
|
|
192
|
+
* list item children, where it includes the item index (`blocks.2`). `$.` rule
|
|
193
|
+
* targets and `field.parent()` resolve against it. Defaults to `parentPath`.
|
|
194
|
+
*/
|
|
195
|
+
setForm(form: IFormModel, parentPath?: string, scopePath?: () => string): void;
|
|
189
196
|
setAncestorRules(rules: IRule[]): void;
|
|
190
197
|
setValidation(validation: IFieldValidation): void;
|
|
191
198
|
resetValidation(): void;
|
|
@@ -252,18 +259,27 @@ export interface IObjectFieldConfig extends IFieldConfig {
|
|
|
252
259
|
isList: boolean;
|
|
253
260
|
listSchema?: z.ZodTypeAny;
|
|
254
261
|
templates?: ITemplateConfig[];
|
|
262
|
+
/**
|
|
263
|
+
* Inner layout declared on the field itself via `.layout()`. A `layout.object()`
|
|
264
|
+
* node in the parent layout takes precedence over it.
|
|
265
|
+
*/
|
|
266
|
+
layout?: LayoutNode[];
|
|
255
267
|
}
|
|
256
268
|
export interface ITemplateBuilder {
|
|
257
269
|
label(text: string): this;
|
|
270
|
+
description(text: string): this;
|
|
258
271
|
icon(icon: ITemplateIcon): this;
|
|
259
272
|
fields(factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this;
|
|
273
|
+
layout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): this;
|
|
260
274
|
visible(predicate: (form: IFormModel) => boolean): this;
|
|
261
275
|
}
|
|
262
276
|
export interface ITemplateConfig {
|
|
263
277
|
id: string;
|
|
264
278
|
label: string;
|
|
279
|
+
description?: string;
|
|
265
280
|
icon?: ITemplateIcon;
|
|
266
281
|
childBuilders: Record<string, IFieldBuilder>;
|
|
282
|
+
layout?: LayoutNode[];
|
|
267
283
|
visible?: (form: IFormModel) => boolean;
|
|
268
284
|
}
|
|
269
285
|
export interface IObjectField extends ITypedField<Record<string, unknown> | null> {
|
|
@@ -583,6 +599,13 @@ export interface IFormModel<T = Record<string, any>> {
|
|
|
583
599
|
}): void;
|
|
584
600
|
reset(): void;
|
|
585
601
|
validate(): Promise<boolean>;
|
|
602
|
+
/**
|
|
603
|
+
* Assign errors from outside the form, e.g. a rejected save. Errors whose `path`
|
|
604
|
+
* resolves to a visible field become that field's validation error; the rest are
|
|
605
|
+
* form-level. The form is marked as submitted so `FormErrors` renders them. They are
|
|
606
|
+
* cleared by the next `validate()`, `setData()` or `reset()`.
|
|
607
|
+
*/
|
|
608
|
+
setErrors(errors: IFormError[]): void;
|
|
586
609
|
submit<T = Record<string, unknown>>(options?: {
|
|
587
610
|
skipValidation?: boolean;
|
|
588
611
|
}): Promise<T | false>;
|
|
@@ -745,6 +768,12 @@ export interface IObjectFieldBuilder extends IFieldBuilder<"object", false, Reco
|
|
|
745
768
|
list(): this;
|
|
746
769
|
listSchema(schema: z.ZodTypeAny): this;
|
|
747
770
|
template(id: string, configure: (t: ITemplateBuilder) => void): this;
|
|
771
|
+
/**
|
|
772
|
+
* Lay out the object's children: rows of child field names, plus separators, alerts
|
|
773
|
+
* and tabs. Applies to the single object and to every list item. Templated objects
|
|
774
|
+
* declare their layouts per template instead.
|
|
775
|
+
*/
|
|
776
|
+
layout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): this;
|
|
748
777
|
}
|
|
749
778
|
export interface IFieldBuilderRegistry {
|
|
750
779
|
}
|