@webiny/app-admin 6.2.0-beta.0 → 6.3.0-beta.0
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/DefaultFieldRenderers.js +20 -4
- package/base/Base/DefaultFieldRenderers.js.map +1 -1
- package/base/Base/DefaultLayoutRenderers.d.ts +2 -0
- package/base/Base/DefaultLayoutRenderers.js +11 -0
- package/base/Base/DefaultLayoutRenderers.js.map +1 -0
- package/base/Base/FieldRenderers/InputRenderer.d.ts +15 -0
- package/base/Base/FieldRenderers/{TextRenderer.js → InputRenderer.js} +5 -3
- package/base/Base/FieldRenderers/InputRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +25 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +89 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +21 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +28 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +63 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.d.ts +4 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js +22 -0
- package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js.map +1 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +15 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.js +29 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.d.ts +12 -2
- package/base/Base/FieldRenderers/SelectRenderer.js +4 -2
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/TextareaRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/TextareaRenderer.js +25 -0
- package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js +41 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -0
- package/base/Base.js +2 -1
- package/base/Base.js.map +1 -1
- package/base/createRootContainer.js +4 -0
- package/base/createRootContainer.js.map +1 -1
- package/base/providers/UiProviders.js +0 -1
- package/base/providers/UiProviders.js.map +1 -1
- package/components/Filters/Filters.js.map +1 -1
- package/components/IconPicker/components/IconPickerCell.d.ts +1 -1
- package/components/IconPicker/components/IconPickerTrigger.d.ts +1 -1
- package/components/IconPicker/components/IconPickerTrigger.js.map +1 -1
- package/components/LexicalEditor/LexicalEditor.js +7 -1
- package/components/LexicalEditor/LexicalEditor.js.map +1 -1
- package/components/LexicalEditor/lexicalValueFromHtml.d.ts +7 -0
- package/components/LexicalEditor/lexicalValueFromHtml.js +35 -0
- package/components/LexicalEditor/lexicalValueFromHtml.js.map +1 -0
- package/components/OverlayLayout/components/OverlayHeader.d.ts +1 -1
- package/components/OverlayLayout/components/OverlayHeader.js.map +1 -1
- package/components/SimpleForm/SimpleForm.d.ts +2 -2
- package/components/SimpleForm/SimpleForm.js.map +1 -1
- package/config/AdminConfig/Form.d.ts +1 -0
- package/config/AdminConfig/Form.js +3 -1
- package/config/AdminConfig/Form.js.map +1 -1
- package/config/AdminConfig/LayoutRenderer.d.ts +10 -0
- package/config/AdminConfig/LayoutRenderer.js +21 -0
- package/config/AdminConfig/LayoutRenderer.js.map +1 -0
- package/config/AdminConfig/Menu/MenuLink.d.ts +2 -2
- package/config/AdminConfig.d.ts +4 -0
- package/config/AdminConfig.js +2 -1
- package/config/AdminConfig.js.map +1 -1
- package/exports/admin.d.ts +2 -0
- package/exports/admin.js +2 -0
- package/exports/admin.js.map +1 -1
- package/features/formModel/Field.js +4 -0
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.d.ts +18 -2
- package/features/formModel/FieldBuilder.js +57 -3
- package/features/formModel/FieldBuilder.js.map +1 -1
- package/features/formModel/FormModel.d.ts +3 -3
- package/features/formModel/FormModel.js +48 -13
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +383 -0
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormModelFactory.d.ts +2 -2
- package/features/formModel/FormModelFactory.js.map +1 -1
- package/features/formModel/FormView.d.ts +24 -4
- package/features/formModel/FormView.js +57 -27
- package/features/formModel/FormView.js.map +1 -1
- package/features/formModel/ObjectField.d.ts +46 -0
- package/features/formModel/ObjectField.js +346 -0
- package/features/formModel/ObjectField.js.map +1 -0
- package/features/formModel/abstractions.d.ts +88 -19
- package/features/formModel/abstractions.js +8 -0
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/index.d.ts +7 -4
- package/features/formModel/index.js +9 -2
- package/features/formModel/index.js.map +1 -1
- package/features/formModel/renderers.d.ts +6 -0
- package/features/formModel/renderers.js +10 -0
- package/features/formModel/renderers.js.map +1 -0
- package/features/formModel/useLayoutRenderers.d.ts +2 -0
- package/features/formModel/useLayoutRenderers.js +19 -0
- package/features/formModel/useLayoutRenderers.js.map +1 -0
- package/features/tools/ToolPipelineRunner.d.ts +10 -0
- package/features/tools/ToolPipelineRunner.js +33 -0
- package/features/tools/ToolPipelineRunner.js.map +1 -0
- package/features/tools/ToolRegistry.d.ts +12 -0
- package/features/tools/ToolRegistry.js +29 -0
- package/features/tools/ToolRegistry.js.map +1 -0
- package/features/tools/abstractions.d.ts +28 -0
- package/features/tools/abstractions.js +6 -0
- package/features/tools/abstractions.js.map +1 -0
- package/features/tools/feature.d.ts +4 -0
- package/features/tools/feature.js +19 -0
- package/features/tools/feature.js.map +1 -0
- package/features/tools/index.d.ts +2 -0
- package/features/tools/index.js +4 -0
- package/features/tools/index.js.map +1 -0
- package/features/wcp/ReactLicense.d.ts +3 -0
- package/features/wcp/ReactLicense.js +9 -0
- package/features/wcp/ReactLicense.js.map +1 -1
- package/features/wcp/WcpGateway.js +4 -0
- package/features/wcp/WcpGateway.js.map +1 -1
- package/features/webinySdk/WebinySdk.d.ts +11 -0
- package/features/webinySdk/WebinySdk.js +27 -0
- package/features/webinySdk/WebinySdk.js.map +1 -0
- package/features/webinySdk/abstractions.d.ts +6 -0
- package/features/webinySdk/abstractions.js +8 -0
- package/features/webinySdk/abstractions.js.map +1 -0
- package/features/webinySdk/feature.d.ts +3 -0
- package/features/webinySdk/feature.js +16 -0
- package/features/webinySdk/feature.js.map +1 -0
- package/features/webinySdk/index.d.ts +2 -0
- package/features/webinySdk/index.js +4 -0
- package/features/webinySdk/index.js.map +1 -0
- package/index.d.ts +8 -3
- package/index.js +5 -2
- package/index.js.map +1 -1
- package/package.json +24 -23
- package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +27 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.js +25 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -0
- package/presentation/textToLexicalTool/feature.d.ts +1 -0
- package/presentation/textToLexicalTool/feature.js +10 -0
- package/presentation/textToLexicalTool/feature.js.map +1 -0
- package/presentation/textToLexicalTool/textToLexicalState.d.ts +5 -0
- package/presentation/textToLexicalTool/textToLexicalState.js +19 -0
- package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -0
- package/base/Base/FieldRenderers/TextRenderer.d.ts +0 -5
- package/base/Base/FieldRenderers/TextRenderer.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createProvider","Menu","Tenant","Route","Theme","Dashboard","Security","LexicalTheme","Title","Logo","Dialog","Form","createAdminConfig","createLexicalTokens","base","AdminWithConfig","Object","assign","WithConfig","displayName","AdminConfigPlugin","createElement","ApplyProtectedConfig","AdminConfigProvider","Original","children","ApplyPublicConfig","lexicalTokens","useAdminConfig","baseConfig","useConfig","lexicalTheme","colors","typography","tokens","menus","userMenus","supportMenus","title","logo","squareLogo","horizontalLogo","widgets","permissionRenderers","dialogs","fieldRenderers","Public","PublicConfig","Private","PrivateConfig","AdminConfig"],"sources":["AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n fieldRenderers: FieldRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n tokens: lexicalTokens\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Security,\n LexicalTheme,\n Dialog,\n Form,\n useAdminConfig\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,cAAc,QAAQ,aAAa;AAC5C,SAASC,IAAI;AAEb,SAASC,MAAM;AAGf,SAASC,KAAK;AACd,SAASC,KAAK;AACd,SAASC,SAAS;AAElB,SAASC,QAAQ;AAEjB,SAASC,YAAY;AACrB,SAASC,KAAK;AACd,SAASC,IAAI;AACb,SAASC,MAAM;AAEf,SAASC,IAAI;
|
|
1
|
+
{"version":3,"names":["React","createProvider","Menu","Tenant","Route","Theme","Dashboard","Security","LexicalTheme","Title","Logo","Dialog","Form","createAdminConfig","createLexicalTokens","base","AdminWithConfig","Object","assign","WithConfig","displayName","AdminConfigPlugin","createElement","ApplyProtectedConfig","AdminConfigProvider","Original","children","ApplyPublicConfig","lexicalTokens","useAdminConfig","baseConfig","useConfig","lexicalTheme","colors","typography","tokens","menus","userMenus","supportMenus","title","logo","squareLogo","horizontalLogo","widgets","permissionRenderers","dialogs","fieldRenderers","layoutRenderers","Public","PublicConfig","Private","PrivateConfig","AdminConfig"],"sources":["AdminConfig.tsx"],"sourcesContent":["import React from \"react\";\nimport { createProvider } from \"@webiny/app\";\nimport { Menu, type MenuConfig } from \"./AdminConfig/Menu.js\";\nimport type { TenantConfig } from \"./AdminConfig/Tenant.js\";\nimport { Tenant } from \"./AdminConfig/Tenant.js\";\nimport type { SupportMenuConfig } from \"./AdminConfig/Menu/SupportMenu.js\";\nimport type { UserMenuConfig } from \"./AdminConfig/Menu/UserMenu.js\";\nimport { Route } from \"./AdminConfig/Route.js\";\nimport { Theme } from \"./AdminConfig/Theme.js\";\nimport { Dashboard } from \"./AdminConfig/Dashboard.js\";\nimport { type WidgetConfig } from \"./AdminConfig/Widget.js\";\nimport { Security } from \"./AdminConfig/Security.js\";\nimport type { PermissionRendererConfig } from \"../permissions/types.js\";\nimport { LexicalTheme } from \"./AdminConfig/LexicalTheme.js\";\nimport { Title } from \"./AdminConfig/Title.js\";\nimport { Logo } from \"./AdminConfig/Logo.js\";\nimport { Dialog } from \"./AdminConfig/Dialog.js\";\nimport type { DialogConfig } from \"./AdminConfig/Dialog.js\";\nimport { Form } from \"./AdminConfig/Form.js\";\nimport type { FieldRendererConfig } from \"./AdminConfig/FieldRenderer.js\";\nimport type { LayoutRendererConfig } from \"./AdminConfig/LayoutRenderer.js\";\nimport { createAdminConfig } from \"./createAdminConfig.js\";\nimport type { EditorTheme } from \"@webiny/lexical-theme\";\nimport { createLexicalTokens } from \"@webiny/lexical-theme/createLexicalEditorTokens.js\";\n\nconst base = createAdminConfig<AdminConfig>();\n\nexport const AdminWithConfig = Object.assign(base.WithConfig, {\n displayName: \"AdminWithConfig\"\n});\n\ninterface AdminConfig {\n menus: MenuConfig[];\n supportMenus: SupportMenuConfig[];\n userMenus: UserMenuConfig[];\n tenant: TenantConfig;\n title: string;\n squareLogo: React.ReactNode;\n horizontalLogo: React.ReactNode;\n widgets: WidgetConfig[];\n permissionRenderers: PermissionRendererConfig[];\n lexicalTheme: EditorTheme;\n dialogs: DialogConfig[];\n fieldRenderers: FieldRendererConfig[];\n layoutRenderers: LayoutRendererConfig[];\n}\n\n/* Once the app fully renders (after the LoginScreen), apply protected configs. */\nexport const AdminConfigPlugin = <base.ApplyProtectedConfig />;\n\nexport const AdminConfigProvider = createProvider(Original => {\n return function AdminConfigProvider({ children }) {\n return (\n <AdminWithConfig>\n <base.ApplyPublicConfig />\n <Original>{children}</Original>\n </AdminWithConfig>\n );\n };\n});\n\nconst lexicalTokens = createLexicalTokens(\"wa-lx-\");\n\nexport const useAdminConfig = () => {\n const baseConfig = base.useConfig();\n\n const lexicalTheme: EditorTheme = {\n colors: baseConfig.lexicalTheme?.colors,\n typography: baseConfig.lexicalTheme?.typography || {},\n tokens: lexicalTokens\n };\n\n return {\n menus: baseConfig.menus ?? [],\n userMenus: baseConfig.userMenus ?? [],\n supportMenus: baseConfig.supportMenus ?? [],\n title: baseConfig.title,\n logo: {\n squareLogo: baseConfig.squareLogo,\n horizontalLogo: baseConfig.horizontalLogo\n },\n widgets: baseConfig.widgets ?? [],\n permissionRenderers: baseConfig.permissionRenderers ?? [],\n lexicalTheme,\n dialogs: baseConfig.dialogs ?? [],\n fieldRenderers: baseConfig.fieldRenderers ?? [],\n layoutRenderers: baseConfig.layoutRenderers ?? []\n };\n};\n\nexport interface PublicProps {\n children: React.ReactNode;\n}\n\nexport const Public = ({ children }: PublicProps) => {\n return <base.PublicConfig>{children}</base.PublicConfig>;\n};\n\nexport interface PrivateProps {\n children: React.ReactNode;\n}\n\nexport const Private = ({ children }: PrivateProps) => {\n return <base.PrivateConfig>{children}</base.PrivateConfig>;\n};\n\nexport const AdminConfig = Object.assign(Private, {\n Public,\n Theme,\n Menu,\n Route,\n Tenant,\n Title,\n Logo,\n Dashboard,\n Security,\n LexicalTheme,\n Dialog,\n Form,\n useAdminConfig\n});\n"],"mappings":"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","ignoreList":[]}
|
package/exports/admin.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { DevToolsSection } from "../components/index.js";
|
|
2
2
|
export { RegisterFeature } from "../components/RegisterFeature.js";
|
|
3
3
|
export { BuildParam, BuildParams } from "../features/buildParams/index.js";
|
|
4
|
+
export { Tool, ToolPipelineRunner } from "../features/tools/index.js";
|
|
5
|
+
export { ToolsFeature } from "../features/tools/index.js";
|
|
4
6
|
export { AdminConfig } from "../config/AdminConfig.js";
|
|
5
7
|
export { Routes } from "../routes.js";
|
package/exports/admin.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { DevToolsSection } from "../components/index.js";
|
|
2
2
|
export { RegisterFeature } from "../components/RegisterFeature.js";
|
|
3
3
|
export { BuildParam, BuildParams } from "../features/buildParams/index.js";
|
|
4
|
+
export { Tool, ToolPipelineRunner } from "../features/tools/index.js";
|
|
5
|
+
export { ToolsFeature } from "../features/tools/index.js";
|
|
4
6
|
export { AdminConfig } from "../config/AdminConfig.js";
|
|
5
7
|
export { Routes } from "../routes.js";
|
|
6
8
|
|
package/exports/admin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DevToolsSection","RegisterFeature","BuildParam","BuildParams","AdminConfig","Routes"],"sources":["admin.ts"],"sourcesContent":["export { DevToolsSection } from \"~/components/index.js\";\nexport { RegisterFeature } from \"~/components/RegisterFeature.js\";\nexport { BuildParam, BuildParams } from \"~/features/buildParams/index.js\";\nexport { AdminConfig } from \"~/config/AdminConfig.js\";\nexport { Routes } from \"~/routes.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,eAAe;AACxB,SAASC,UAAU,EAAEC,WAAW;AAChC,SAASC,WAAW;AACpB,SAASC,MAAM","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["DevToolsSection","RegisterFeature","BuildParam","BuildParams","Tool","ToolPipelineRunner","ToolsFeature","AdminConfig","Routes"],"sources":["admin.ts"],"sourcesContent":["export { DevToolsSection } from \"~/components/index.js\";\nexport { RegisterFeature } from \"~/components/RegisterFeature.js\";\nexport { BuildParam, BuildParams } from \"~/features/buildParams/index.js\";\nexport { Tool, ToolPipelineRunner } from \"~/features/tools/index.js\";\nexport { ToolsFeature } from \"~/features/tools/index.js\";\nexport { AdminConfig } from \"~/config/AdminConfig.js\";\nexport { Routes } from \"~/routes.js\";\n"],"mappings":"AAAA,SAASA,eAAe;AACxB,SAASC,eAAe;AACxB,SAASC,UAAU,EAAEC,WAAW;AAChC,SAASC,IAAI,EAAEC,kBAAkB;AACjC,SAASC,YAAY;AACrB,SAASC,WAAW;AACpB,SAASC,MAAM","ignoreList":[]}
|
|
@@ -129,12 +129,16 @@ export class Field {
|
|
|
129
129
|
name: this.config.name,
|
|
130
130
|
type: this.config.type,
|
|
131
131
|
label: this.config.label,
|
|
132
|
+
help: this.config.help,
|
|
133
|
+
description: this.config.description,
|
|
134
|
+
note: this.config.note,
|
|
132
135
|
placeholder: this.config.placeholder,
|
|
133
136
|
value: this._value,
|
|
134
137
|
validation: this._validation,
|
|
135
138
|
required: this.config.required,
|
|
136
139
|
disabled: this._disabled,
|
|
137
140
|
renderer: this.config.renderer,
|
|
141
|
+
rendererSettings: this.config.rendererSettings,
|
|
138
142
|
options,
|
|
139
143
|
onChange: value => this._setValueFromUI(value),
|
|
140
144
|
onBlur: () => this.blur()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["makeAutoObservable","computed","runInAction","Field","_validation","isValid","_beforeChangeCallbacks","_afterChangeCallbacks","_afterSetValueCallbacks","_onBlurCallbacks","_isUIChange","_form","constructor","config","_value","defaultValue","_disabled","disabled","_hidden","hidden","beforeChangeCallbacks","afterChangeCallbacks","afterSetValueCallbacks","onBlurCallbacks","vm","name","type","getValue","setValue","raw","transformed","cb","setValueSilent","value","setDisabled","visible","setVisible","setValidation","validation","resetValidation","addBeforeChange","push","addAfterChange","addAfterSetValue","addOnBlur","blur","setForm","form","as","Error","remove","removeField","options","_resolveOptions","label","placeholder","required","renderer","onChange","_setValueFromUI","onBlur","undefined","validate","message","requiredMessage","schema","result","safeParseAsync","success","firstIssue","error","issues"],"sources":["Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _isUIChange = false;\n private _form: IFormModel | null = null;\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._value = config.defaultValue ?? null;\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._form!);\n }\n\n if (transformed === this._value) {\n return;\n }\n\n this._value = transformed;\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._form!);\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._form!);\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData().\n */\n setValueSilent(value: unknown): void {\n this._value = value;\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n get visible(): boolean {\n return !this._hidden;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._form!);\n }\n }\n\n setForm(form: IFormModel): void {\n this._form = form;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n\n return {\n name: this.config.name,\n type: this.config.type,\n label: this.config.label,\n placeholder: this.config.placeholder,\n value: this._value,\n validation: this._validation,\n required: this.config.required,\n disabled: this._disabled,\n renderer: this.config.renderer,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => this.blur()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._form!);\n }\n return this.config.options;\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n */\n async validate(): Promise<boolean> {\n // Required check\n if (this.config.required) {\n const value = this._value;\n if (value === null || value === undefined || value === \"\") {\n this._validation = {\n isValid: false,\n message: this.config.requiredMessage || \"This field is required.\"\n };\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(this._value);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n });\n return false;\n }\n }\n\n runInAction(() => {\n this._validation = { isValid: true };\n });\n return true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["makeAutoObservable","computed","runInAction","Field","_validation","isValid","_beforeChangeCallbacks","_afterChangeCallbacks","_afterSetValueCallbacks","_onBlurCallbacks","_isUIChange","_form","constructor","config","_value","defaultValue","_disabled","disabled","_hidden","hidden","beforeChangeCallbacks","afterChangeCallbacks","afterSetValueCallbacks","onBlurCallbacks","vm","name","type","getValue","setValue","raw","transformed","cb","setValueSilent","value","setDisabled","visible","setVisible","setValidation","validation","resetValidation","addBeforeChange","push","addAfterChange","addAfterSetValue","addOnBlur","blur","setForm","form","as","Error","remove","removeField","options","_resolveOptions","label","help","description","note","placeholder","required","renderer","rendererSettings","onChange","_setValueFromUI","onBlur","undefined","validate","message","requiredMessage","schema","result","safeParseAsync","success","firstIssue","error","issues"],"sources":["Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _isUIChange = false;\n private _form: IFormModel | null = null;\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._value = config.defaultValue ?? null;\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._form!);\n }\n\n if (transformed === this._value) {\n return;\n }\n\n this._value = transformed;\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._form!);\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._form!);\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData().\n */\n setValueSilent(value: unknown): void {\n this._value = value;\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n get visible(): boolean {\n return !this._hidden;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._form!);\n }\n }\n\n setForm(form: IFormModel): void {\n this._form = form;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n\n return {\n name: this.config.name,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n value: this._value,\n validation: this._validation,\n required: this.config.required,\n disabled: this._disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => this.blur()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._form!);\n }\n return this.config.options;\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n */\n async validate(): Promise<boolean> {\n // Required check\n if (this.config.required) {\n const value = this._value;\n if (value === null || value === undefined || value === \"\") {\n this._validation = {\n isValid: false,\n message: this.config.requiredMessage || \"This field is required.\"\n };\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(this._value);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n });\n return false;\n }\n }\n\n runInAction(() => {\n this._validation = { isValid: true };\n });\n return true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { IFieldConfig, IValueOption, IFormModel, IFieldBuilder, ISelectFieldBuilder, IFieldBuilderRegistry, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
|
|
2
|
+
import type { IFieldConfig, IObjectFieldConfig, IValueOption, IFormModel, IFieldBuilder, ISelectFieldBuilder, IObjectFieldBuilder, IFieldBuilderRegistry, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
|
|
3
3
|
/**
|
|
4
4
|
* Base FieldBuilder with fluent API.
|
|
5
5
|
* Each method mutates `this` and returns `this` for chaining.
|
|
@@ -9,10 +9,13 @@ export declare class FieldBuilder<TType extends string = string> implements IFie
|
|
|
9
9
|
constructor(type: TType);
|
|
10
10
|
get fieldType(): string;
|
|
11
11
|
label(text: string): this;
|
|
12
|
+
help(text: string): this;
|
|
13
|
+
description(text: string): this;
|
|
14
|
+
note(text: string): this;
|
|
12
15
|
placeholder(text: string): this;
|
|
13
16
|
schema(zodSchema: z.ZodTypeAny): this;
|
|
14
17
|
defaultValue(value: unknown): this;
|
|
15
|
-
renderer(name: string): this;
|
|
18
|
+
renderer(name: string, settings?: Record<string, unknown>): this;
|
|
16
19
|
hidden(): this;
|
|
17
20
|
required(message?: string): this;
|
|
18
21
|
disabled(value?: boolean): this;
|
|
@@ -35,6 +38,19 @@ export declare class SelectFieldBuilder extends FieldBuilder<"select"> implement
|
|
|
35
38
|
constructor();
|
|
36
39
|
options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this;
|
|
37
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Object field builder with .fields(), .list(), .listSchema() support.
|
|
43
|
+
*/
|
|
44
|
+
export declare class ObjectFieldBuilder extends FieldBuilder<"object"> implements IObjectFieldBuilder {
|
|
45
|
+
private _childBuilders;
|
|
46
|
+
private _isList;
|
|
47
|
+
private _listSchema?;
|
|
48
|
+
constructor();
|
|
49
|
+
fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this;
|
|
50
|
+
list(): this;
|
|
51
|
+
listSchema(schema: z.ZodTypeAny): this;
|
|
52
|
+
build(name: string): IObjectFieldConfig;
|
|
53
|
+
}
|
|
38
54
|
/**
|
|
39
55
|
* Factory interface for creating field builders.
|
|
40
56
|
*/
|
|
@@ -19,6 +19,18 @@ export class FieldBuilder {
|
|
|
19
19
|
this._config.label = text;
|
|
20
20
|
return this;
|
|
21
21
|
}
|
|
22
|
+
help(text) {
|
|
23
|
+
this._config.help = text;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
description(text) {
|
|
27
|
+
this._config.description = text;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
note(text) {
|
|
31
|
+
this._config.note = text;
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
22
34
|
placeholder(text) {
|
|
23
35
|
this._config.placeholder = text;
|
|
24
36
|
return this;
|
|
@@ -31,8 +43,9 @@ export class FieldBuilder {
|
|
|
31
43
|
this._config.defaultValue = value;
|
|
32
44
|
return this;
|
|
33
45
|
}
|
|
34
|
-
renderer(name) {
|
|
46
|
+
renderer(name, settings) {
|
|
35
47
|
this._config.renderer = name;
|
|
48
|
+
this._config.rendererSettings = settings;
|
|
36
49
|
return this;
|
|
37
50
|
}
|
|
38
51
|
hidden() {
|
|
@@ -90,7 +103,7 @@ export class FieldBuilder {
|
|
|
90
103
|
export class TextFieldBuilder extends FieldBuilder {
|
|
91
104
|
constructor() {
|
|
92
105
|
super("text");
|
|
93
|
-
this._config.renderer = "
|
|
106
|
+
this._config.renderer = "input";
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
109
|
|
|
@@ -100,7 +113,7 @@ export class TextFieldBuilder extends FieldBuilder {
|
|
|
100
113
|
export class SelectFieldBuilder extends FieldBuilder {
|
|
101
114
|
constructor() {
|
|
102
115
|
super("select");
|
|
103
|
-
this._config.renderer = "
|
|
116
|
+
this._config.renderer = "dropdown";
|
|
104
117
|
}
|
|
105
118
|
options(opts) {
|
|
106
119
|
this._config.options = opts;
|
|
@@ -108,6 +121,40 @@ export class SelectFieldBuilder extends FieldBuilder {
|
|
|
108
121
|
}
|
|
109
122
|
}
|
|
110
123
|
|
|
124
|
+
/**
|
|
125
|
+
* Object field builder with .fields(), .list(), .listSchema() support.
|
|
126
|
+
*/
|
|
127
|
+
export class ObjectFieldBuilder extends FieldBuilder {
|
|
128
|
+
_childBuilders = {};
|
|
129
|
+
_isList = false;
|
|
130
|
+
constructor() {
|
|
131
|
+
super("object");
|
|
132
|
+
this._config.renderer = "object";
|
|
133
|
+
}
|
|
134
|
+
fields(fn) {
|
|
135
|
+
const registry = createFieldBuilderRegistry();
|
|
136
|
+
this._childBuilders = fn(registry);
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
list() {
|
|
140
|
+
this._isList = true;
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
listSchema(schema) {
|
|
144
|
+
this._listSchema = schema;
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
build(name) {
|
|
148
|
+
return {
|
|
149
|
+
...this._config,
|
|
150
|
+
name,
|
|
151
|
+
childBuilders: this._childBuilders,
|
|
152
|
+
isList: this._isList,
|
|
153
|
+
listSchema: this._listSchema
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
111
158
|
/**
|
|
112
159
|
* Factory interface for creating field builders.
|
|
113
160
|
*/
|
|
@@ -126,6 +173,10 @@ class FieldBuilderRegistryImpl {
|
|
|
126
173
|
type: "select",
|
|
127
174
|
create: () => new SelectFieldBuilder()
|
|
128
175
|
});
|
|
176
|
+
this.fieldTypes.set("object", {
|
|
177
|
+
type: "object",
|
|
178
|
+
create: () => new ObjectFieldBuilder()
|
|
179
|
+
});
|
|
129
180
|
if (factories) {
|
|
130
181
|
for (const factory of factories) {
|
|
131
182
|
this.fieldTypes.set(factory.type, factory);
|
|
@@ -150,6 +201,9 @@ class FieldBuilderRegistryImpl {
|
|
|
150
201
|
select() {
|
|
151
202
|
throw new Error("Should be intercepted by Proxy");
|
|
152
203
|
}
|
|
204
|
+
object() {
|
|
205
|
+
throw new Error("Should be intercepted by Proxy");
|
|
206
|
+
}
|
|
153
207
|
}
|
|
154
208
|
export function createFieldBuilderRegistry(factories) {
|
|
155
209
|
return new FieldBuilderRegistryImpl(factories);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["FieldBuilder","constructor","type","_config","name","hidden","required","disabled","fieldType","label","text","placeholder","schema","zodSchema","defaultValue","value","renderer","message","requiredMessage","beforeChange","fn","beforeChangeCallbacks","push","afterChange","afterChangeCallbacks","afterSetValue","afterSetValueCallbacks","onBlur","onBlurCallbacks","build","TextFieldBuilder","SelectFieldBuilder","options","opts","FieldBuilderRegistryImpl","fieldTypes","Map","factories","set","create","factory","proxy","Proxy","get","target","prop","Error","select","createFieldBuilderRegistry"],"sources":["FieldBuilder.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n IFieldConfig,\n IValueOption,\n IFormModel,\n IFieldBuilder,\n ISelectFieldBuilder,\n IFieldBuilderRegistry,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Base FieldBuilder with fluent API.\n * Each method mutates `this` and returns `this` for chaining.\n */\nexport class FieldBuilder<TType extends string = string> implements IFieldBuilder {\n protected _config: IFieldConfig;\n\n constructor(type: TType) {\n this._config = {\n name: \"\",\n type,\n hidden: false,\n required: false,\n disabled: false\n };\n }\n\n get fieldType(): string {\n return this._config.type;\n }\n\n label(text: string): this {\n this._config.label = text;\n return this;\n }\n\n placeholder(text: string): this {\n this._config.placeholder = text;\n return this;\n }\n\n schema(zodSchema: z.ZodTypeAny): this {\n this._config.schema = zodSchema;\n return this;\n }\n\n defaultValue(value: unknown): this {\n this._config.defaultValue = value;\n return this;\n }\n\n renderer(name: string): this {\n this._config.renderer = name;\n return this;\n }\n\n hidden(): this {\n this._config.hidden = true;\n return this;\n }\n\n required(message?: string): this {\n this._config.required = true;\n this._config.requiredMessage = message;\n return this;\n }\n\n disabled(value = true): this {\n this._config.disabled = value;\n return this;\n }\n\n beforeChange(fn: BeforeChangeCallback): this {\n if (!this._config.beforeChangeCallbacks) {\n this._config.beforeChangeCallbacks = [];\n }\n this._config.beforeChangeCallbacks.push(fn);\n return this;\n }\n\n afterChange(fn: AfterChangeCallback): this {\n if (!this._config.afterChangeCallbacks) {\n this._config.afterChangeCallbacks = [];\n }\n this._config.afterChangeCallbacks.push(fn);\n return this;\n }\n\n afterSetValue(fn: AfterSetValueCallback): this {\n if (!this._config.afterSetValueCallbacks) {\n this._config.afterSetValueCallbacks = [];\n }\n this._config.afterSetValueCallbacks.push(fn);\n return this;\n }\n\n onBlur(fn: OnBlurCallback): this {\n if (!this._config.onBlurCallbacks) {\n this._config.onBlurCallbacks = [];\n }\n this._config.onBlurCallbacks.push(fn);\n return this;\n }\n\n build(name: string): IFieldConfig {\n return { ...this._config, name };\n }\n}\n\n/**\n * Text field builder.\n */\nexport class TextFieldBuilder extends FieldBuilder<\"text\"> {\n constructor() {\n super(\"text\");\n this._config.renderer = \"text\";\n }\n}\n\n/**\n * Select field builder with .options() support.\n */\nexport class SelectFieldBuilder extends FieldBuilder<\"select\"> implements ISelectFieldBuilder {\n constructor() {\n super(\"select\");\n this._config.renderer = \"select\";\n }\n\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this {\n this._config.options = opts;\n return this;\n }\n}\n\n/**\n * Factory interface for creating field builders.\n */\nexport interface IFieldTypeFactory {\n readonly type: string;\n create(): FieldBuilder;\n}\n\n/**\n * Proxy-based FieldBuilderRegistry.\n */\nclass FieldBuilderRegistryImpl implements IFieldBuilderRegistry {\n private fieldTypes = new Map<string, IFieldTypeFactory>();\n\n constructor(factories?: IFieldTypeFactory[]) {\n this.fieldTypes.set(\"text\", { type: \"text\", create: () => new TextFieldBuilder() });\n this.fieldTypes.set(\"select\", { type: \"select\", create: () => new SelectFieldBuilder() });\n\n if (factories) {\n for (const factory of factories) {\n this.fieldTypes.set(factory.type, factory);\n }\n }\n\n const proxy = new Proxy(this, {\n get(target, prop: string) {\n const factory = target.fieldTypes.get(prop);\n if (factory) {\n return () => factory.create();\n }\n return target[prop as keyof typeof target];\n }\n }) as any;\n\n return proxy;\n }\n\n // These exist for TypeScript but are intercepted by the Proxy\n text(): TextFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n select(): SelectFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n}\n\nexport function createFieldBuilderRegistry(factories?: IFieldTypeFactory[]): IFieldBuilderRegistry {\n return new FieldBuilderRegistryImpl(factories);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["FieldBuilder","constructor","type","_config","name","hidden","required","disabled","fieldType","label","text","help","description","note","placeholder","schema","zodSchema","defaultValue","value","renderer","settings","rendererSettings","message","requiredMessage","beforeChange","fn","beforeChangeCallbacks","push","afterChange","afterChangeCallbacks","afterSetValue","afterSetValueCallbacks","onBlur","onBlurCallbacks","build","TextFieldBuilder","SelectFieldBuilder","options","opts","ObjectFieldBuilder","_childBuilders","_isList","fields","registry","createFieldBuilderRegistry","list","listSchema","_listSchema","childBuilders","isList","FieldBuilderRegistryImpl","fieldTypes","Map","factories","set","create","factory","proxy","Proxy","get","target","prop","Error","select","object"],"sources":["FieldBuilder.ts"],"sourcesContent":["import type { z } from \"zod\";\nimport type {\n IFieldConfig,\n IObjectFieldConfig,\n IValueOption,\n IFormModel,\n IFieldBuilder,\n ISelectFieldBuilder,\n IObjectFieldBuilder,\n IFieldBuilderRegistry,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Base FieldBuilder with fluent API.\n * Each method mutates `this` and returns `this` for chaining.\n */\nexport class FieldBuilder<TType extends string = string> implements IFieldBuilder {\n protected _config: IFieldConfig;\n\n constructor(type: TType) {\n this._config = {\n name: \"\",\n type,\n hidden: false,\n required: false,\n disabled: false\n };\n }\n\n get fieldType(): string {\n return this._config.type;\n }\n\n label(text: string): this {\n this._config.label = text;\n return this;\n }\n\n help(text: string): this {\n this._config.help = text;\n return this;\n }\n\n description(text: string): this {\n this._config.description = text;\n return this;\n }\n\n note(text: string): this {\n this._config.note = text;\n return this;\n }\n\n placeholder(text: string): this {\n this._config.placeholder = text;\n return this;\n }\n\n schema(zodSchema: z.ZodTypeAny): this {\n this._config.schema = zodSchema;\n return this;\n }\n\n defaultValue(value: unknown): this {\n this._config.defaultValue = value;\n return this;\n }\n\n renderer(name: string, settings?: Record<string, unknown>): this {\n this._config.renderer = name;\n this._config.rendererSettings = settings;\n return this;\n }\n\n hidden(): this {\n this._config.hidden = true;\n return this;\n }\n\n required(message?: string): this {\n this._config.required = true;\n this._config.requiredMessage = message;\n return this;\n }\n\n disabled(value = true): this {\n this._config.disabled = value;\n return this;\n }\n\n beforeChange(fn: BeforeChangeCallback): this {\n if (!this._config.beforeChangeCallbacks) {\n this._config.beforeChangeCallbacks = [];\n }\n this._config.beforeChangeCallbacks.push(fn);\n return this;\n }\n\n afterChange(fn: AfterChangeCallback): this {\n if (!this._config.afterChangeCallbacks) {\n this._config.afterChangeCallbacks = [];\n }\n this._config.afterChangeCallbacks.push(fn);\n return this;\n }\n\n afterSetValue(fn: AfterSetValueCallback): this {\n if (!this._config.afterSetValueCallbacks) {\n this._config.afterSetValueCallbacks = [];\n }\n this._config.afterSetValueCallbacks.push(fn);\n return this;\n }\n\n onBlur(fn: OnBlurCallback): this {\n if (!this._config.onBlurCallbacks) {\n this._config.onBlurCallbacks = [];\n }\n this._config.onBlurCallbacks.push(fn);\n return this;\n }\n\n build(name: string): IFieldConfig {\n return { ...this._config, name };\n }\n}\n\n/**\n * Text field builder.\n */\nexport class TextFieldBuilder extends FieldBuilder<\"text\"> {\n constructor() {\n super(\"text\");\n this._config.renderer = \"input\";\n }\n}\n\n/**\n * Select field builder with .options() support.\n */\nexport class SelectFieldBuilder extends FieldBuilder<\"select\"> implements ISelectFieldBuilder {\n constructor() {\n super(\"select\");\n this._config.renderer = \"dropdown\";\n }\n\n options(opts: IValueOption[] | ((form: IFormModel) => IValueOption[])): this {\n this._config.options = opts;\n return this;\n }\n}\n\n/**\n * Object field builder with .fields(), .list(), .listSchema() support.\n */\nexport class ObjectFieldBuilder extends FieldBuilder<\"object\"> implements IObjectFieldBuilder {\n private _childBuilders: Record<string, IFieldBuilder> = {};\n private _isList = false;\n private _listSchema?: z.ZodTypeAny;\n\n constructor() {\n super(\"object\");\n this._config.renderer = \"object\";\n }\n\n fields(fn: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder>): this {\n const registry = createFieldBuilderRegistry();\n this._childBuilders = fn(registry);\n return this;\n }\n\n list(): this {\n this._isList = true;\n return this;\n }\n\n listSchema(schema: z.ZodTypeAny): this {\n this._listSchema = schema;\n return this;\n }\n\n override build(name: string): IObjectFieldConfig {\n return {\n ...this._config,\n name,\n childBuilders: this._childBuilders,\n isList: this._isList,\n listSchema: this._listSchema\n };\n }\n}\n\n/**\n * Factory interface for creating field builders.\n */\nexport interface IFieldTypeFactory {\n readonly type: string;\n create(): FieldBuilder;\n}\n\n/**\n * Proxy-based FieldBuilderRegistry.\n */\nclass FieldBuilderRegistryImpl implements IFieldBuilderRegistry {\n private fieldTypes = new Map<string, IFieldTypeFactory>();\n\n constructor(factories?: IFieldTypeFactory[]) {\n this.fieldTypes.set(\"text\", { type: \"text\", create: () => new TextFieldBuilder() });\n this.fieldTypes.set(\"select\", { type: \"select\", create: () => new SelectFieldBuilder() });\n this.fieldTypes.set(\"object\", { type: \"object\", create: () => new ObjectFieldBuilder() });\n\n if (factories) {\n for (const factory of factories) {\n this.fieldTypes.set(factory.type, factory);\n }\n }\n\n const proxy = new Proxy(this, {\n get(target, prop: string) {\n const factory = target.fieldTypes.get(prop);\n if (factory) {\n return () => factory.create();\n }\n return target[prop as keyof typeof target];\n }\n }) as any;\n\n return proxy;\n }\n\n // These exist for TypeScript but are intercepted by the Proxy\n text(): TextFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n select(): SelectFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n object(): ObjectFieldBuilder {\n throw new Error(\"Should be intercepted by Proxy\");\n }\n}\n\nexport function createFieldBuilderRegistry(factories?: IFieldTypeFactory[]): IFieldBuilderRegistry {\n return new FieldBuilderRegistryImpl(factories);\n}\n"],"mappings":"AAgBA;AACA;AACA;AACA;AACA,OAAO,MAAMA,YAAY,CAAyD;EAG9EC,WAAWA,CAACC,IAAW,EAAE;IACrB,IAAI,CAACC,OAAO,GAAG;MACXC,IAAI,EAAE,EAAE;MACRF,IAAI;MACJG,MAAM,EAAE,KAAK;MACbC,QAAQ,EAAE,KAAK;MACfC,QAAQ,EAAE;IACd,CAAC;EACL;EAEA,IAAIC,SAASA,CAAA,EAAW;IACpB,OAAO,IAAI,CAACL,OAAO,CAACD,IAAI;EAC5B;EAEAO,KAAKA,CAACC,IAAY,EAAQ;IACtB,IAAI,CAACP,OAAO,CAACM,KAAK,GAAGC,IAAI;IACzB,OAAO,IAAI;EACf;EAEAC,IAAIA,CAACD,IAAY,EAAQ;IACrB,IAAI,CAACP,OAAO,CAACQ,IAAI,GAAGD,IAAI;IACxB,OAAO,IAAI;EACf;EAEAE,WAAWA,CAACF,IAAY,EAAQ;IAC5B,IAAI,CAACP,OAAO,CAACS,WAAW,GAAGF,IAAI;IAC/B,OAAO,IAAI;EACf;EAEAG,IAAIA,CAACH,IAAY,EAAQ;IACrB,IAAI,CAACP,OAAO,CAACU,IAAI,GAAGH,IAAI;IACxB,OAAO,IAAI;EACf;EAEAI,WAAWA,CAACJ,IAAY,EAAQ;IAC5B,IAAI,CAACP,OAAO,CAACW,WAAW,GAAGJ,IAAI;IAC/B,OAAO,IAAI;EACf;EAEAK,MAAMA,CAACC,SAAuB,EAAQ;IAClC,IAAI,CAACb,OAAO,CAACY,MAAM,GAAGC,SAAS;IAC/B,OAAO,IAAI;EACf;EAEAC,YAAYA,CAACC,KAAc,EAAQ;IAC/B,IAAI,CAACf,OAAO,CAACc,YAAY,GAAGC,KAAK;IACjC,OAAO,IAAI;EACf;EAEAC,QAAQA,CAACf,IAAY,EAAEgB,QAAkC,EAAQ;IAC7D,IAAI,CAACjB,OAAO,CAACgB,QAAQ,GAAGf,IAAI;IAC5B,IAAI,CAACD,OAAO,CAACkB,gBAAgB,GAAGD,QAAQ;IACxC,OAAO,IAAI;EACf;EAEAf,MAAMA,CAAA,EAAS;IACX,IAAI,CAACF,OAAO,CAACE,MAAM,GAAG,IAAI;IAC1B,OAAO,IAAI;EACf;EAEAC,QAAQA,CAACgB,OAAgB,EAAQ;IAC7B,IAAI,CAACnB,OAAO,CAACG,QAAQ,GAAG,IAAI;IAC5B,IAAI,CAACH,OAAO,CAACoB,eAAe,GAAGD,OAAO;IACtC,OAAO,IAAI;EACf;EAEAf,QAAQA,CAACW,KAAK,GAAG,IAAI,EAAQ;IACzB,IAAI,CAACf,OAAO,CAACI,QAAQ,GAAGW,KAAK;IAC7B,OAAO,IAAI;EACf;EAEAM,YAAYA,CAACC,EAAwB,EAAQ;IACzC,IAAI,CAAC,IAAI,CAACtB,OAAO,CAACuB,qBAAqB,EAAE;MACrC,IAAI,CAACvB,OAAO,CAACuB,qBAAqB,GAAG,EAAE;IAC3C;IACA,IAAI,CAACvB,OAAO,CAACuB,qBAAqB,CAACC,IAAI,CAACF,EAAE,CAAC;IAC3C,OAAO,IAAI;EACf;EAEAG,WAAWA,CAACH,EAAuB,EAAQ;IACvC,IAAI,CAAC,IAAI,CAACtB,OAAO,CAAC0B,oBAAoB,EAAE;MACpC,IAAI,CAAC1B,OAAO,CAAC0B,oBAAoB,GAAG,EAAE;IAC1C;IACA,IAAI,CAAC1B,OAAO,CAAC0B,oBAAoB,CAACF,IAAI,CAACF,EAAE,CAAC;IAC1C,OAAO,IAAI;EACf;EAEAK,aAAaA,CAACL,EAAyB,EAAQ;IAC3C,IAAI,CAAC,IAAI,CAACtB,OAAO,CAAC4B,sBAAsB,EAAE;MACtC,IAAI,CAAC5B,OAAO,CAAC4B,sBAAsB,GAAG,EAAE;IAC5C;IACA,IAAI,CAAC5B,OAAO,CAAC4B,sBAAsB,CAACJ,IAAI,CAACF,EAAE,CAAC;IAC5C,OAAO,IAAI;EACf;EAEAO,MAAMA,CAACP,EAAkB,EAAQ;IAC7B,IAAI,CAAC,IAAI,CAACtB,OAAO,CAAC8B,eAAe,EAAE;MAC/B,IAAI,CAAC9B,OAAO,CAAC8B,eAAe,GAAG,EAAE;IACrC;IACA,IAAI,CAAC9B,OAAO,CAAC8B,eAAe,CAACN,IAAI,CAACF,EAAE,CAAC;IACrC,OAAO,IAAI;EACf;EAEAS,KAAKA,CAAC9B,IAAY,EAAgB;IAC9B,OAAO;MAAE,GAAG,IAAI,CAACD,OAAO;MAAEC;IAAK,CAAC;EACpC;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAM+B,gBAAgB,SAASnC,YAAY,CAAS;EACvDC,WAAWA,CAAA,EAAG;IACV,KAAK,CAAC,MAAM,CAAC;IACb,IAAI,CAACE,OAAO,CAACgB,QAAQ,GAAG,OAAO;EACnC;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAMiB,kBAAkB,SAASpC,YAAY,CAA0C;EAC1FC,WAAWA,CAAA,EAAG;IACV,KAAK,CAAC,QAAQ,CAAC;IACf,IAAI,CAACE,OAAO,CAACgB,QAAQ,GAAG,UAAU;EACtC;EAEAkB,OAAOA,CAACC,IAA6D,EAAQ;IACzE,IAAI,CAACnC,OAAO,CAACkC,OAAO,GAAGC,IAAI;IAC3B,OAAO,IAAI;EACf;AACJ;;AAEA;AACA;AACA;AACA,OAAO,MAAMC,kBAAkB,SAASvC,YAAY,CAA0C;EAClFwC,cAAc,GAAkC,CAAC,CAAC;EAClDC,OAAO,GAAG,KAAK;EAGvBxC,WAAWA,CAAA,EAAG;IACV,KAAK,CAAC,QAAQ,CAAC;IACf,IAAI,CAACE,OAAO,CAACgB,QAAQ,GAAG,QAAQ;EACpC;EAEAuB,MAAMA,CAACjB,EAAsE,EAAQ;IACjF,MAAMkB,QAAQ,GAAGC,0BAA0B,CAAC,CAAC;IAC7C,IAAI,CAACJ,cAAc,GAAGf,EAAE,CAACkB,QAAQ,CAAC;IAClC,OAAO,IAAI;EACf;EAEAE,IAAIA,CAAA,EAAS;IACT,IAAI,CAACJ,OAAO,GAAG,IAAI;IACnB,OAAO,IAAI;EACf;EAEAK,UAAUA,CAAC/B,MAAoB,EAAQ;IACnC,IAAI,CAACgC,WAAW,GAAGhC,MAAM;IACzB,OAAO,IAAI;EACf;EAESmB,KAAKA,CAAC9B,IAAY,EAAsB;IAC7C,OAAO;MACH,GAAG,IAAI,CAACD,OAAO;MACfC,IAAI;MACJ4C,aAAa,EAAE,IAAI,CAACR,cAAc;MAClCS,MAAM,EAAE,IAAI,CAACR,OAAO;MACpBK,UAAU,EAAE,IAAI,CAACC;IACrB,CAAC;EACL;AACJ;;AAEA;AACA;AACA;;AAMA;AACA;AACA;AACA,MAAMG,wBAAwB,CAAkC;EACpDC,UAAU,GAAG,IAAIC,GAAG,CAA4B,CAAC;EAEzDnD,WAAWA,CAACoD,SAA+B,EAAE;IACzC,IAAI,CAACF,UAAU,CAACG,GAAG,CAAC,MAAM,EAAE;MAAEpD,IAAI,EAAE,MAAM;MAAEqD,MAAM,EAAEA,CAAA,KAAM,IAAIpB,gBAAgB,CAAC;IAAE,CAAC,CAAC;IACnF,IAAI,CAACgB,UAAU,CAACG,GAAG,CAAC,QAAQ,EAAE;MAAEpD,IAAI,EAAE,QAAQ;MAAEqD,MAAM,EAAEA,CAAA,KAAM,IAAInB,kBAAkB,CAAC;IAAE,CAAC,CAAC;IACzF,IAAI,CAACe,UAAU,CAACG,GAAG,CAAC,QAAQ,EAAE;MAAEpD,IAAI,EAAE,QAAQ;MAAEqD,MAAM,EAAEA,CAAA,KAAM,IAAIhB,kBAAkB,CAAC;IAAE,CAAC,CAAC;IAEzF,IAAIc,SAAS,EAAE;MACX,KAAK,MAAMG,OAAO,IAAIH,SAAS,EAAE;QAC7B,IAAI,CAACF,UAAU,CAACG,GAAG,CAACE,OAAO,CAACtD,IAAI,EAAEsD,OAAO,CAAC;MAC9C;IACJ;IAEA,MAAMC,KAAK,GAAG,IAAIC,KAAK,CAAC,IAAI,EAAE;MAC1BC,GAAGA,CAACC,MAAM,EAAEC,IAAY,EAAE;QACtB,MAAML,OAAO,GAAGI,MAAM,CAACT,UAAU,CAACQ,GAAG,CAACE,IAAI,CAAC;QAC3C,IAAIL,OAAO,EAAE;UACT,OAAO,MAAMA,OAAO,CAACD,MAAM,CAAC,CAAC;QACjC;QACA,OAAOK,MAAM,CAACC,IAAI,CAAwB;MAC9C;IACJ,CAAC,CAAQ;IAET,OAAOJ,KAAK;EAChB;;EAEA;EACA/C,IAAIA,CAAA,EAAqB;IACrB,MAAM,IAAIoD,KAAK,CAAC,gCAAgC,CAAC;EACrD;EACAC,MAAMA,CAAA,EAAuB;IACzB,MAAM,IAAID,KAAK,CAAC,gCAAgC,CAAC;EACrD;EACAE,MAAMA,CAAA,EAAuB;IACzB,MAAM,IAAIF,KAAK,CAAC,gCAAgC,CAAC;EACrD;AACJ;AAEA,OAAO,SAASlB,0BAA0BA,CAACS,SAA+B,EAAyB;EAC/F,OAAO,IAAIH,wBAAwB,CAACG,SAAS,CAAC;AAClD","ignoreList":[]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Field } from "./Field.js";
|
|
2
1
|
import type { IFormModel, IField, IFieldBuilder, IFieldBuilderRegistry, IFormVM, IFormError, IFormModelConfig, ILayoutModifier, IPositionedLayoutNode, ILayoutNodeAccessHandle, LayoutNode } from "./abstractions.js";
|
|
3
2
|
export declare class FormModel implements IFormModel {
|
|
4
3
|
private _fields;
|
|
@@ -24,8 +23,8 @@ export declare class FormModel implements IFormModel {
|
|
|
24
23
|
validate(): Promise<boolean>;
|
|
25
24
|
submit<T = Record<string, unknown>>(): Promise<T | false>;
|
|
26
25
|
get vm(): IFormVM;
|
|
27
|
-
getField(name: string):
|
|
28
|
-
getFields(): Map<string,
|
|
26
|
+
getField(name: string): IField | undefined;
|
|
27
|
+
getFields(): Map<string, IField>;
|
|
29
28
|
private _resolveLayout;
|
|
30
29
|
private _resolveLayoutNode;
|
|
31
30
|
private _resolveRowNode;
|
|
@@ -57,5 +56,6 @@ export declare class FormModel implements IFormModel {
|
|
|
57
56
|
private _insertIntoLayout;
|
|
58
57
|
private _createModifierLayoutAPI;
|
|
59
58
|
private _accessLayoutNode;
|
|
59
|
+
private _createField;
|
|
60
60
|
private _isPositionedNode;
|
|
61
61
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { makeAutoObservable, computed, toJS, runInAction, observable } from "mobx";
|
|
2
2
|
import { Field } from "./Field.js";
|
|
3
|
+
import { ObjectField, isObjectField } from "./ObjectField.js";
|
|
3
4
|
import { createFieldBuilderRegistry } from "./FieldBuilder.js";
|
|
4
5
|
const layoutAPI = {
|
|
5
6
|
row(...fieldIds) {
|
|
@@ -17,6 +18,7 @@ const layoutAPI = {
|
|
|
17
18
|
return {
|
|
18
19
|
type: "tabs",
|
|
19
20
|
id: config.id,
|
|
21
|
+
renderer: config.renderer,
|
|
20
22
|
tabs: config.tabs
|
|
21
23
|
};
|
|
22
24
|
},
|
|
@@ -44,7 +46,7 @@ export class FormModel {
|
|
|
44
46
|
// Build fields from builders
|
|
45
47
|
for (const [name, builder] of Object.entries(builders)) {
|
|
46
48
|
const fieldConfig = builder.build(name);
|
|
47
|
-
const field =
|
|
49
|
+
const field = this._createField(fieldConfig);
|
|
48
50
|
field.setForm(this);
|
|
49
51
|
this._fields.set(name, field);
|
|
50
52
|
}
|
|
@@ -71,10 +73,26 @@ export class FormModel {
|
|
|
71
73
|
field(name) {
|
|
72
74
|
// Try exact match first (supports dotted field names like "properties.language").
|
|
73
75
|
const field = this._fields.get(name);
|
|
74
|
-
if (
|
|
75
|
-
|
|
76
|
+
if (field) {
|
|
77
|
+
return field;
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
|
|
80
|
+
// Try dot-notation traversal through ObjectField children.
|
|
81
|
+
const parts = name.split(".");
|
|
82
|
+
if (parts.length > 1) {
|
|
83
|
+
let current = this._fields.get(parts[0]);
|
|
84
|
+
for (let i = 1; i < parts.length && current; i++) {
|
|
85
|
+
if (isObjectField(current)) {
|
|
86
|
+
current = current.getChild(parts[i]);
|
|
87
|
+
} else {
|
|
88
|
+
current = undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (current) {
|
|
92
|
+
return current;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw new Error(`Field "${name}" not found.`);
|
|
78
96
|
}
|
|
79
97
|
fields(factory) {
|
|
80
98
|
const registry = createFieldBuilderRegistry();
|
|
@@ -86,7 +104,7 @@ export class FormModel {
|
|
|
86
104
|
continue;
|
|
87
105
|
}
|
|
88
106
|
const fieldConfig = builder.build(name);
|
|
89
|
-
const field =
|
|
107
|
+
const field = this._createField(fieldConfig);
|
|
90
108
|
field.setForm(this);
|
|
91
109
|
|
|
92
110
|
// Replace or add — same operation on the map
|
|
@@ -137,7 +155,11 @@ export class FormModel {
|
|
|
137
155
|
getData() {
|
|
138
156
|
const data = {};
|
|
139
157
|
for (const [name, field] of this._fields) {
|
|
140
|
-
|
|
158
|
+
if (isObjectField(field)) {
|
|
159
|
+
data[name] = toJS(field.getData());
|
|
160
|
+
} else {
|
|
161
|
+
data[name] = toJS(field.getValue());
|
|
162
|
+
}
|
|
141
163
|
}
|
|
142
164
|
return data;
|
|
143
165
|
}
|
|
@@ -167,8 +189,8 @@ export class FormModel {
|
|
|
167
189
|
get isDirty() {
|
|
168
190
|
for (const [name, field] of this._fields) {
|
|
169
191
|
const baseline = this._baseline.get(name);
|
|
170
|
-
const current = field.getValue();
|
|
171
|
-
if (
|
|
192
|
+
const current = isObjectField(field) ? field.getData() : field.getValue();
|
|
193
|
+
if (JSON.stringify(toJS(current)) !== JSON.stringify(toJS(baseline))) {
|
|
172
194
|
return true;
|
|
173
195
|
}
|
|
174
196
|
}
|
|
@@ -234,9 +256,6 @@ export class FormModel {
|
|
|
234
256
|
return this._resolveTabsNode(node);
|
|
235
257
|
case "element":
|
|
236
258
|
return this._resolveElementNode(node);
|
|
237
|
-
case "object":
|
|
238
|
-
// ObjectNode rendering deferred to Phase 6
|
|
239
|
-
return null;
|
|
240
259
|
default:
|
|
241
260
|
return null;
|
|
242
261
|
}
|
|
@@ -279,10 +298,13 @@ export class FormModel {
|
|
|
279
298
|
return {
|
|
280
299
|
type: "tabs",
|
|
281
300
|
id: node.id,
|
|
301
|
+
renderer: node.renderer,
|
|
282
302
|
tabs,
|
|
283
303
|
activeTabId: validActive,
|
|
284
304
|
setActiveTab: id => {
|
|
285
|
-
|
|
305
|
+
runInAction(() => {
|
|
306
|
+
this._activeTabs.set(tabKey, id);
|
|
307
|
+
});
|
|
286
308
|
}
|
|
287
309
|
};
|
|
288
310
|
}
|
|
@@ -297,7 +319,13 @@ export class FormModel {
|
|
|
297
319
|
const fieldIds = this._collectFieldIdsFromLayout(layout);
|
|
298
320
|
for (const id of fieldIds) {
|
|
299
321
|
const field = this._fields.get(id);
|
|
300
|
-
if (field
|
|
322
|
+
if (!field) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (field.vm.validation.isValid === false) {
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
if (isObjectField(field) && field.hasErrors) {
|
|
301
329
|
return true;
|
|
302
330
|
}
|
|
303
331
|
}
|
|
@@ -438,6 +466,7 @@ export class FormModel {
|
|
|
438
466
|
const node = {
|
|
439
467
|
type: "tabs",
|
|
440
468
|
id: config.id,
|
|
469
|
+
renderer: config.renderer,
|
|
441
470
|
tabs: config.tabs
|
|
442
471
|
};
|
|
443
472
|
return createLayoutNodeHandle(node);
|
|
@@ -538,6 +567,12 @@ export class FormModel {
|
|
|
538
567
|
}
|
|
539
568
|
};
|
|
540
569
|
}
|
|
570
|
+
_createField(config) {
|
|
571
|
+
if (config.childBuilders) {
|
|
572
|
+
return new ObjectField(config);
|
|
573
|
+
}
|
|
574
|
+
return new Field(config);
|
|
575
|
+
}
|
|
541
576
|
_isPositionedNode(entry) {
|
|
542
577
|
return "node" in entry;
|
|
543
578
|
}
|