@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.
Files changed (143) hide show
  1. package/base/Admin.js +2 -0
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.js +20 -4
  4. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  5. package/base/Base/DefaultLayoutRenderers.d.ts +2 -0
  6. package/base/Base/DefaultLayoutRenderers.js +11 -0
  7. package/base/Base/DefaultLayoutRenderers.js.map +1 -0
  8. package/base/Base/FieldRenderers/InputRenderer.d.ts +15 -0
  9. package/base/Base/FieldRenderers/{TextRenderer.js → InputRenderer.js} +5 -3
  10. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -0
  11. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +25 -0
  12. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +89 -0
  13. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -0
  14. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +21 -0
  15. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +28 -0
  16. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +1 -0
  17. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +17 -0
  18. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +63 -0
  19. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -0
  20. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.d.ts +4 -0
  21. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js +22 -0
  22. package/base/Base/FieldRenderers/ObjectRenderer/resolveItemTitle.js.map +1 -0
  23. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +15 -0
  24. package/base/Base/FieldRenderers/PassthroughRenderer.js +29 -0
  25. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -0
  26. package/base/Base/FieldRenderers/SelectRenderer.d.ts +12 -2
  27. package/base/Base/FieldRenderers/SelectRenderer.js +4 -2
  28. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  29. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +17 -0
  30. package/base/Base/FieldRenderers/TextareaRenderer.js +25 -0
  31. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -0
  32. package/base/Base/FieldRenderers/VerticalTabsRenderer.d.ts +5 -0
  33. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +41 -0
  34. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -0
  35. package/base/Base.js +2 -1
  36. package/base/Base.js.map +1 -1
  37. package/base/createRootContainer.js +4 -0
  38. package/base/createRootContainer.js.map +1 -1
  39. package/base/providers/UiProviders.js +0 -1
  40. package/base/providers/UiProviders.js.map +1 -1
  41. package/components/Filters/Filters.js.map +1 -1
  42. package/components/IconPicker/components/IconPickerCell.d.ts +1 -1
  43. package/components/IconPicker/components/IconPickerTrigger.d.ts +1 -1
  44. package/components/IconPicker/components/IconPickerTrigger.js.map +1 -1
  45. package/components/LexicalEditor/LexicalEditor.js +7 -1
  46. package/components/LexicalEditor/LexicalEditor.js.map +1 -1
  47. package/components/LexicalEditor/lexicalValueFromHtml.d.ts +7 -0
  48. package/components/LexicalEditor/lexicalValueFromHtml.js +35 -0
  49. package/components/LexicalEditor/lexicalValueFromHtml.js.map +1 -0
  50. package/components/OverlayLayout/components/OverlayHeader.d.ts +1 -1
  51. package/components/OverlayLayout/components/OverlayHeader.js.map +1 -1
  52. package/components/SimpleForm/SimpleForm.d.ts +2 -2
  53. package/components/SimpleForm/SimpleForm.js.map +1 -1
  54. package/config/AdminConfig/Form.d.ts +1 -0
  55. package/config/AdminConfig/Form.js +3 -1
  56. package/config/AdminConfig/Form.js.map +1 -1
  57. package/config/AdminConfig/LayoutRenderer.d.ts +10 -0
  58. package/config/AdminConfig/LayoutRenderer.js +21 -0
  59. package/config/AdminConfig/LayoutRenderer.js.map +1 -0
  60. package/config/AdminConfig/Menu/MenuLink.d.ts +2 -2
  61. package/config/AdminConfig.d.ts +4 -0
  62. package/config/AdminConfig.js +2 -1
  63. package/config/AdminConfig.js.map +1 -1
  64. package/exports/admin.d.ts +2 -0
  65. package/exports/admin.js +2 -0
  66. package/exports/admin.js.map +1 -1
  67. package/features/formModel/Field.js +4 -0
  68. package/features/formModel/Field.js.map +1 -1
  69. package/features/formModel/FieldBuilder.d.ts +18 -2
  70. package/features/formModel/FieldBuilder.js +57 -3
  71. package/features/formModel/FieldBuilder.js.map +1 -1
  72. package/features/formModel/FormModel.d.ts +3 -3
  73. package/features/formModel/FormModel.js +48 -13
  74. package/features/formModel/FormModel.js.map +1 -1
  75. package/features/formModel/FormModel.test.js +383 -0
  76. package/features/formModel/FormModel.test.js.map +1 -1
  77. package/features/formModel/FormModelFactory.d.ts +2 -2
  78. package/features/formModel/FormModelFactory.js.map +1 -1
  79. package/features/formModel/FormView.d.ts +24 -4
  80. package/features/formModel/FormView.js +57 -27
  81. package/features/formModel/FormView.js.map +1 -1
  82. package/features/formModel/ObjectField.d.ts +46 -0
  83. package/features/formModel/ObjectField.js +346 -0
  84. package/features/formModel/ObjectField.js.map +1 -0
  85. package/features/formModel/abstractions.d.ts +88 -19
  86. package/features/formModel/abstractions.js +8 -0
  87. package/features/formModel/abstractions.js.map +1 -1
  88. package/features/formModel/index.d.ts +7 -4
  89. package/features/formModel/index.js +9 -2
  90. package/features/formModel/index.js.map +1 -1
  91. package/features/formModel/renderers.d.ts +6 -0
  92. package/features/formModel/renderers.js +10 -0
  93. package/features/formModel/renderers.js.map +1 -0
  94. package/features/formModel/useLayoutRenderers.d.ts +2 -0
  95. package/features/formModel/useLayoutRenderers.js +19 -0
  96. package/features/formModel/useLayoutRenderers.js.map +1 -0
  97. package/features/tools/ToolPipelineRunner.d.ts +10 -0
  98. package/features/tools/ToolPipelineRunner.js +33 -0
  99. package/features/tools/ToolPipelineRunner.js.map +1 -0
  100. package/features/tools/ToolRegistry.d.ts +12 -0
  101. package/features/tools/ToolRegistry.js +29 -0
  102. package/features/tools/ToolRegistry.js.map +1 -0
  103. package/features/tools/abstractions.d.ts +28 -0
  104. package/features/tools/abstractions.js +6 -0
  105. package/features/tools/abstractions.js.map +1 -0
  106. package/features/tools/feature.d.ts +4 -0
  107. package/features/tools/feature.js +19 -0
  108. package/features/tools/feature.js.map +1 -0
  109. package/features/tools/index.d.ts +2 -0
  110. package/features/tools/index.js +4 -0
  111. package/features/tools/index.js.map +1 -0
  112. package/features/wcp/ReactLicense.d.ts +3 -0
  113. package/features/wcp/ReactLicense.js +9 -0
  114. package/features/wcp/ReactLicense.js.map +1 -1
  115. package/features/wcp/WcpGateway.js +4 -0
  116. package/features/wcp/WcpGateway.js.map +1 -1
  117. package/features/webinySdk/WebinySdk.d.ts +11 -0
  118. package/features/webinySdk/WebinySdk.js +27 -0
  119. package/features/webinySdk/WebinySdk.js.map +1 -0
  120. package/features/webinySdk/abstractions.d.ts +6 -0
  121. package/features/webinySdk/abstractions.js +8 -0
  122. package/features/webinySdk/abstractions.js.map +1 -0
  123. package/features/webinySdk/feature.d.ts +3 -0
  124. package/features/webinySdk/feature.js +16 -0
  125. package/features/webinySdk/feature.js.map +1 -0
  126. package/features/webinySdk/index.d.ts +2 -0
  127. package/features/webinySdk/index.js +4 -0
  128. package/features/webinySdk/index.js.map +1 -0
  129. package/index.d.ts +8 -3
  130. package/index.js +5 -2
  131. package/index.js.map +1 -1
  132. package/package.json +24 -23
  133. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +27 -0
  134. package/presentation/textToLexicalTool/TextToLexicalTool.js +25 -0
  135. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -0
  136. package/presentation/textToLexicalTool/feature.d.ts +1 -0
  137. package/presentation/textToLexicalTool/feature.js +10 -0
  138. package/presentation/textToLexicalTool/feature.js.map +1 -0
  139. package/presentation/textToLexicalTool/textToLexicalState.d.ts +5 -0
  140. package/presentation/textToLexicalTool/textToLexicalState.js +19 -0
  141. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -0
  142. package/base/Base/FieldRenderers/TextRenderer.d.ts +0 -5
  143. 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;AAEb,SAASC,iBAAiB;AAE1B,SAASC,mBAAmB,QAAQ,oDAAoD;AAExF,MAAMC,IAAI,GAAGF,iBAAiB,CAAc,CAAC;AAE7C,OAAO,MAAMG,eAAe,GAAGC,MAAM,CAACC,MAAM,CAACH,IAAI,CAACI,UAAU,EAAE;EAC1DC,WAAW,EAAE;AACjB,CAAC,CAAC;AAiBF;AACA,OAAO,MAAMC,iBAAiB,gBAAGrB,KAAA,CAAAsB,aAAA,CAACP,IAAI,CAACQ,oBAAoB,MAAE,CAAC;AAE9D,OAAO,MAAMC,mBAAmB,GAAGvB,cAAc,CAACwB,QAAQ,IAAI;EAC1D,OAAO,SAASD,mBAAmBA,CAAC;IAAEE;EAAS,CAAC,EAAE;IAC9C,oBACI1B,KAAA,CAAAsB,aAAA,CAACN,eAAe,qBACZhB,KAAA,CAAAsB,aAAA,CAACP,IAAI,CAACY,iBAAiB,MAAE,CAAC,eAC1B3B,KAAA,CAAAsB,aAAA,CAACG,QAAQ,QAAEC,QAAmB,CACjB,CAAC;EAE1B,CAAC;AACL,CAAC,CAAC;AAEF,MAAME,aAAa,GAAGd,mBAAmB,CAAC,QAAQ,CAAC;AAEnD,OAAO,MAAMe,cAAc,GAAGA,CAAA,KAAM;EAChC,MAAMC,UAAU,GAAGf,IAAI,CAACgB,SAAS,CAAC,CAAC;EAEnC,MAAMC,YAAyB,GAAG;IAC9BC,MAAM,EAAEH,UAAU,CAACE,YAAY,EAAEC,MAAM;IACvCC,UAAU,EAAEJ,UAAU,CAACE,YAAY,EAAEE,UAAU,IAAI,CAAC,CAAC;IACrDC,MAAM,EAAEP;EACZ,CAAC;EAED,OAAO;IACHQ,KAAK,EAAEN,UAAU,CAACM,KAAK,IAAI,EAAE;IAC7BC,SAAS,EAAEP,UAAU,CAACO,SAAS,IAAI,EAAE;IACrCC,YAAY,EAAER,UAAU,CAACQ,YAAY,IAAI,EAAE;IAC3CC,KAAK,EAAET,UAAU,CAACS,KAAK;IACvBC,IAAI,EAAE;MACFC,UAAU,EAAEX,UAAU,CAACW,UAAU;MACjCC,cAAc,EAAEZ,UAAU,CAACY;IAC/B,CAAC;IACDC,OAAO,EAAEb,UAAU,CAACa,OAAO,IAAI,EAAE;IACjCC,mBAAmB,EAAEd,UAAU,CAACc,mBAAmB,IAAI,EAAE;IACzDZ,YAAY;IACZa,OAAO,EAAEf,UAAU,CAACe,OAAO,IAAI,EAAE;IACjCC,cAAc,EAAEhB,UAAU,CAACgB,cAAc,IAAI;EACjD,CAAC;AACL,CAAC;AAMD,OAAO,MAAMC,MAAM,GAAGA,CAAC;EAAErB;AAAsB,CAAC,KAAK;EACjD,oBAAO1B,KAAA,CAAAsB,aAAA,CAACP,IAAI,CAACiC,YAAY,QAAEtB,QAA4B,CAAC;AAC5D,CAAC;AAMD,OAAO,MAAMuB,OAAO,GAAGA,CAAC;EAAEvB;AAAuB,CAAC,KAAK;EACnD,oBAAO1B,KAAA,CAAAsB,aAAA,CAACP,IAAI,CAACmC,aAAa,QAAExB,QAA6B,CAAC;AAC9D,CAAC;AAED,OAAO,MAAMyB,WAAW,GAAGlC,MAAM,CAACC,MAAM,CAAC+B,OAAO,EAAE;EAC9CF,MAAM;EACN1C,KAAK;EACLH,IAAI;EACJE,KAAK;EACLD,MAAM;EACNM,KAAK;EACLC,IAAI;EACJJ,SAAS;EACTC,QAAQ;EACRC,YAAY;EACZG,MAAM;EACNC,IAAI;EACJiB;AACJ,CAAC,CAAC","ignoreList":[]}
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":[]}
@@ -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
 
@@ -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 = "text";
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 = "select";
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":"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","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): Field | undefined;
28
- getFields(): Map<string, Field>;
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 = new Field(fieldConfig);
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 (!field) {
75
- throw new Error(`Field "${name}" not found.`);
76
+ if (field) {
77
+ return field;
76
78
  }
77
- return field;
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 = new Field(fieldConfig);
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
- data[name] = toJS(field.getValue());
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 (!Object.is(toJS(current), toJS(baseline))) {
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
- this._activeTabs.set(tabKey, id);
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 && field.vm.validation.isValid === false) {
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
  }