@webiny/app-admin 6.3.0-beta.2 → 6.3.0-beta.3

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 (234) hide show
  1. package/base/Base/DefaultFieldRenderers.js +69 -5
  2. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  3. package/base/Base/DefaultLayoutRenderers.js +5 -1
  4. package/base/Base/DefaultLayoutRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
  7. package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
  9. package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
  10. package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
  11. package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
  12. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
  13. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
  14. package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
  15. package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
  16. package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
  17. package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
  18. package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
  19. package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
  20. package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
  21. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
  22. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
  23. package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
  24. package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
  25. package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
  26. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
  27. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
  28. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
  29. package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
  30. package/base/Base/FieldRenderers/InputRenderer.js +2 -2
  31. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
  32. package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
  33. package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
  34. package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
  35. package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
  36. package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
  37. package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
  38. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
  39. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
  40. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
  41. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
  42. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
  43. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
  44. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
  45. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
  46. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
  47. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
  48. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
  49. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
  50. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
  51. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
  52. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  53. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
  54. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
  55. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
  56. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
  57. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
  58. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
  59. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
  60. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
  61. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
  62. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
  63. package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
  64. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
  65. package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
  66. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
  67. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
  68. package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
  69. package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
  70. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  71. package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
  72. package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
  73. package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
  74. package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
  75. package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
  76. package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
  77. package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
  78. package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
  79. package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
  80. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
  81. package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
  82. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
  83. package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
  84. package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
  85. package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
  86. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
  87. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
  88. package/base/Base/Menus.js +5 -64
  89. package/base/Base/Menus.js.map +1 -1
  90. package/base/Base/RoutesConfig.js +6 -0
  91. package/base/Base/RoutesConfig.js.map +1 -1
  92. package/exports/admin/build-params.d.ts +2 -0
  93. package/exports/admin/build-params.js +3 -0
  94. package/exports/admin/build-params.js.map +1 -1
  95. package/exports/admin/form.d.ts +5 -0
  96. package/exports/admin/form.js +8 -0
  97. package/exports/admin/form.js.map +1 -1
  98. package/exports/admin/ui.d.ts +1 -0
  99. package/exports/admin/ui.js +1 -0
  100. package/exports/admin/ui.js.map +1 -1
  101. package/exports/admin.d.ts +3 -1
  102. package/exports/admin.js +3 -1
  103. package/exports/admin.js.map +1 -1
  104. package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
  105. package/features/formModel/ConditionRuleEvaluator.js +56 -0
  106. package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
  107. package/features/formModel/Field.d.ts +50 -4
  108. package/features/formModel/Field.js +254 -35
  109. package/features/formModel/Field.js.map +1 -1
  110. package/features/formModel/FieldBuilder.d.ts +17 -35
  111. package/features/formModel/FieldBuilder.js +63 -100
  112. package/features/formModel/FieldBuilder.js.map +1 -1
  113. package/features/formModel/FieldBuilder.test.js +127 -13
  114. package/features/formModel/FieldBuilder.test.js.map +1 -1
  115. package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
  116. package/features/formModel/FieldBuilderRegistry.js +31 -0
  117. package/features/formModel/FieldBuilderRegistry.js.map +1 -0
  118. package/features/formModel/FocusManager.d.ts +14 -0
  119. package/features/formModel/FocusManager.js +109 -0
  120. package/features/formModel/FocusManager.js.map +1 -0
  121. package/features/formModel/FormModel.d.ts +27 -31
  122. package/features/formModel/FormModel.js +210 -403
  123. package/features/formModel/FormModel.js.map +1 -1
  124. package/features/formModel/FormModel.test.js +2044 -193
  125. package/features/formModel/FormModel.test.js.map +1 -1
  126. package/features/formModel/FormModelFactory.d.ts +4 -2
  127. package/features/formModel/FormModelFactory.js +13 -3
  128. package/features/formModel/FormModelFactory.js.map +1 -1
  129. package/features/formModel/FormView.d.ts +2 -0
  130. package/features/formModel/FormView.js +44 -37
  131. package/features/formModel/FormView.js.map +1 -1
  132. package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
  133. package/features/formModel/LayoutBuilderFactory.js +386 -0
  134. package/features/formModel/LayoutBuilderFactory.js.map +1 -0
  135. package/features/formModel/LayoutMutator.d.ts +11 -0
  136. package/features/formModel/LayoutMutator.js +136 -0
  137. package/features/formModel/LayoutMutator.js.map +1 -0
  138. package/features/formModel/LayoutResolver.d.ts +26 -0
  139. package/features/formModel/LayoutResolver.js +239 -0
  140. package/features/formModel/LayoutResolver.js.map +1 -0
  141. package/features/formModel/ObjectField.d.ts +55 -4
  142. package/features/formModel/ObjectField.js +499 -82
  143. package/features/formModel/ObjectField.js.map +1 -1
  144. package/features/formModel/Rules.test.d.ts +1 -0
  145. package/features/formModel/Rules.test.js +289 -0
  146. package/features/formModel/Rules.test.js.map +1 -0
  147. package/features/formModel/abstractions.d.ts +402 -52
  148. package/features/formModel/abstractions.js +55 -0
  149. package/features/formModel/abstractions.js.map +1 -1
  150. package/features/formModel/createFieldRenderer.d.ts +20 -0
  151. package/features/formModel/createFieldRenderer.js +15 -0
  152. package/features/formModel/createFieldRenderer.js.map +1 -0
  153. package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
  154. package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
  155. package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
  156. package/features/formModel/demo/FormModelDemo.d.ts +4 -0
  157. package/features/formModel/demo/FormModelDemo.js +230 -0
  158. package/features/formModel/demo/FormModelDemo.js.map +1 -0
  159. package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
  160. package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
  161. package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
  162. package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
  163. package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
  164. package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
  165. package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
  166. package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
  167. package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
  168. package/features/formModel/feature.js +12 -0
  169. package/features/formModel/feature.js.map +1 -1
  170. package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
  171. package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
  172. package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
  173. package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
  174. package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
  175. package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
  176. package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
  177. package/features/formModel/fieldTypes/FileFieldType.js +20 -0
  178. package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
  179. package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
  180. package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
  181. package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
  182. package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
  183. package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
  184. package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
  185. package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
  186. package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
  187. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
  188. package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
  189. package/features/formModel/fieldTypes/TextFieldType.js +20 -0
  190. package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
  191. package/features/formModel/fieldTypes/index.d.ts +7 -0
  192. package/features/formModel/fieldTypes/index.js +9 -0
  193. package/features/formModel/fieldTypes/index.js.map +1 -0
  194. package/features/formModel/index.d.ts +13 -4
  195. package/features/formModel/index.js +21 -2
  196. package/features/formModel/index.js.map +1 -1
  197. package/features/formModel/renderers.d.ts +15 -1
  198. package/features/formModel/renderers.js +15 -1
  199. package/features/formModel/renderers.js.map +1 -1
  200. package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
  201. package/features/tools/LexicalContext/LexicalContext.js +22 -0
  202. package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
  203. package/features/tools/LexicalContext/abstractions.d.ts +11 -0
  204. package/features/tools/LexicalContext/abstractions.js +4 -0
  205. package/features/tools/LexicalContext/abstractions.js.map +1 -0
  206. package/features/tools/LexicalContext/index.d.ts +2 -0
  207. package/features/tools/LexicalContext/index.js +3 -0
  208. package/features/tools/LexicalContext/index.js.map +1 -0
  209. package/features/tools/feature.js +2 -0
  210. package/features/tools/feature.js.map +1 -1
  211. package/features/tools/index.d.ts +1 -0
  212. package/features/tools/index.js +1 -0
  213. package/features/tools/index.js.map +1 -1
  214. package/index.d.ts +8 -1
  215. package/index.js +7 -0
  216. package/index.js.map +1 -1
  217. package/package.json +30 -24
  218. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
  219. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
  220. package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
  221. package/presentation/lexicalContext/useLexicalContext.js +14 -0
  222. package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
  223. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
  224. package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
  225. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
  226. package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
  227. package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
  228. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
  229. package/routes.d.ts +1 -0
  230. package/routes.js +4 -0
  231. package/routes.js.map +1 -1
  232. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
  233. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
  234. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +0 -1
@@ -1,6 +1,8 @@
1
- import { type IFormModelFactory, type IFormModelConfig } from "./abstractions.js";
2
- import type { IFormModel } from "./abstractions.js";
1
+ import { type IFormModelFactory, type IFormModelConfig, type IFormModel, type IFieldBuilderRegistry, type IRuleEvaluator } from "./abstractions.js";
3
2
  declare class FormModelFactoryImpl implements IFormModelFactory {
3
+ private evaluators;
4
+ private registry;
5
+ constructor(evaluators: IRuleEvaluator[], registry: IFieldBuilderRegistry);
4
6
  create<T = Record<string, any>>(config: IFormModelConfig): IFormModel<T>;
5
7
  }
6
8
  export declare const FormModelFactory: typeof FormModelFactoryImpl & {
@@ -1,13 +1,23 @@
1
1
  import { FormModel } from "./FormModel.js";
2
- import { FormModelFactory as Abstraction } from "./abstractions.js";
2
+ import { FormModelFactory as Abstraction, FieldBuilderRegistry, RuleEvaluator } from "./abstractions.js";
3
3
  class FormModelFactoryImpl {
4
+ constructor(evaluators, registry) {
5
+ this.evaluators = evaluators;
6
+ this.registry = registry;
7
+ }
4
8
  create(config) {
5
- return new FormModel(config);
9
+ const provided = config.ruleEvaluators ?? [];
10
+ return new FormModel({
11
+ ...config,
12
+ ruleEvaluators: [...this.evaluators, ...provided]
13
+ }, this.registry);
6
14
  }
7
15
  }
8
16
  export const FormModelFactory = Abstraction.createImplementation({
9
17
  implementation: FormModelFactoryImpl,
10
- dependencies: []
18
+ dependencies: [[RuleEvaluator, {
19
+ multiple: true
20
+ }], FieldBuilderRegistry]
11
21
  });
12
22
 
13
23
  //# sourceMappingURL=FormModelFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["FormModel","FormModelFactory","Abstraction","FormModelFactoryImpl","create","config","createImplementation","implementation","dependencies"],"sources":["FormModelFactory.ts"],"sourcesContent":["import { FormModel } from \"./FormModel.js\";\nimport {\n FormModelFactory as Abstraction,\n type IFormModelFactory,\n type IFormModelConfig\n} from \"./abstractions.js\";\nimport type { IFormModel } from \"./abstractions.js\";\n\nclass FormModelFactoryImpl implements IFormModelFactory {\n create<T = Record<string, any>>(config: IFormModelConfig): IFormModel<T> {\n return new FormModel(config) as IFormModel<T>;\n }\n}\n\nexport const FormModelFactory = Abstraction.createImplementation({\n implementation: FormModelFactoryImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,SACIC,gBAAgB,IAAIC,WAAW;AAMnC,MAAMC,oBAAoB,CAA8B;EACpDC,MAAMA,CAA0BC,MAAwB,EAAiB;IACrE,OAAO,IAAIL,SAAS,CAACK,MAAM,CAAC;EAChC;AACJ;AAEA,OAAO,MAAMJ,gBAAgB,GAAGC,WAAW,CAACI,oBAAoB,CAAC;EAC7DC,cAAc,EAAEJ,oBAAoB;EACpCK,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["FormModel","FormModelFactory","Abstraction","FieldBuilderRegistry","RuleEvaluator","FormModelFactoryImpl","constructor","evaluators","registry","create","config","provided","ruleEvaluators","createImplementation","implementation","dependencies","multiple"],"sources":["FormModelFactory.ts"],"sourcesContent":["import { FormModel } from \"./FormModel.js\";\nimport {\n FormModelFactory as Abstraction,\n FieldBuilderRegistry,\n RuleEvaluator,\n type IFormModelFactory,\n type IFormModelConfig,\n type IFormModel,\n type IFieldBuilderRegistry,\n type IRuleEvaluator\n} from \"./abstractions.js\";\n\nclass FormModelFactoryImpl implements IFormModelFactory {\n constructor(\n private evaluators: IRuleEvaluator[],\n private registry: IFieldBuilderRegistry\n ) {}\n\n create<T = Record<string, any>>(config: IFormModelConfig): IFormModel<T> {\n const provided = config.ruleEvaluators ?? [];\n return new FormModel(\n {\n ...config,\n ruleEvaluators: [...this.evaluators, ...provided]\n },\n this.registry\n ) as IFormModel<T>;\n }\n}\n\nexport const FormModelFactory = Abstraction.createImplementation({\n implementation: FormModelFactoryImpl,\n dependencies: [[RuleEvaluator, { multiple: true }], FieldBuilderRegistry]\n});\n"],"mappings":"AAAA,SAASA,SAAS;AAClB,SACIC,gBAAgB,IAAIC,WAAW,EAC/BC,oBAAoB,EACpBC,aAAa;AAQjB,MAAMC,oBAAoB,CAA8B;EACpDC,WAAWA,CACCC,UAA4B,EAC5BC,QAA+B,EACzC;IAAA,KAFUD,UAA4B,GAA5BA,UAA4B;IAAA,KAC5BC,QAA+B,GAA/BA,QAA+B;EACxC;EAEHC,MAAMA,CAA0BC,MAAwB,EAAiB;IACrE,MAAMC,QAAQ,GAAGD,MAAM,CAACE,cAAc,IAAI,EAAE;IAC5C,OAAO,IAAIZ,SAAS,CAChB;MACI,GAAGU,MAAM;MACTE,cAAc,EAAE,CAAC,GAAG,IAAI,CAACL,UAAU,EAAE,GAAGI,QAAQ;IACpD,CAAC,EACD,IAAI,CAACH,QACT,CAAC;EACL;AACJ;AAEA,OAAO,MAAMP,gBAAgB,GAAGC,WAAW,CAACW,oBAAoB,CAAC;EAC7DC,cAAc,EAAET,oBAAoB;EACpCU,YAAY,EAAE,CAAC,CAACX,aAAa,EAAE;IAAEY,QAAQ,EAAE;EAAK,CAAC,CAAC,EAAEb,oBAAoB;AAC5E,CAAC,CAAC","ignoreList":[]}
@@ -1,5 +1,7 @@
1
1
  import React from "react";
2
2
  import type { IFormVM, LayoutNodeVM, IFieldVM, ITabsNodeVM } from "./abstractions.js";
3
+ import type { Icon } from "../../components/IconPicker/types.js";
4
+ export declare function renderTabIcon(icon: Icon | undefined): React.ReactElement | undefined;
3
5
  /**
4
6
  * A field renderer component receives a FieldVM and renders the appropriate UI.
5
7
  */
@@ -1,7 +1,17 @@
1
1
  import React, { createContext, useContext, useMemo } from "react";
2
2
  import { observer } from "mobx-react-lite";
3
+ import { Grid, Tabs } from "@webiny/admin-ui";
4
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
3
5
  import { useFieldRenderers } from "./useFieldRenderers.js";
4
6
  import { useLayoutRenderers } from "./useLayoutRenderers.js";
7
+ export function renderTabIcon(icon) {
8
+ if (!icon) {
9
+ return undefined;
10
+ }
11
+ return /*#__PURE__*/React.createElement(FontAwesomeIcon, {
12
+ icon: icon.name.split("/")
13
+ });
14
+ }
5
15
 
6
16
  /**
7
17
  * A field renderer component receives a FieldVM and renders the appropriate UI.
@@ -29,11 +39,11 @@ export { useFormViewRenderers };
29
39
  * Generic form view that walks layout nodes and renders fields.
30
40
  * This component is stateless — it reads from the FormVM and delegates to renderers.
31
41
  */
32
- export const FormView = observer(function FormView({
42
+ export const FormView = observer(({
33
43
  form,
34
44
  renderers,
35
45
  layoutRenderers
36
- }) {
46
+ }) => {
37
47
  const defaultFieldRenderers = useFieldRenderers();
38
48
  const defaultLayoutRenderers = useLayoutRenderers();
39
49
  const value = useMemo(() => ({
@@ -49,9 +59,9 @@ export const FormView = observer(function FormView({
49
59
  node: node
50
60
  }))));
51
61
  });
52
- export const LayoutNodeRenderer = observer(function LayoutNodeRenderer({
62
+ export const LayoutNodeRenderer = observer(({
53
63
  node
54
- }) {
64
+ }) => {
55
65
  switch (node.type) {
56
66
  case "row":
57
67
  return /*#__PURE__*/React.createElement(RowNodeRenderer, {
@@ -71,29 +81,27 @@ export const LayoutNodeRenderer = observer(function LayoutNodeRenderer({
71
81
  return null;
72
82
  }
73
83
  });
74
- const RowNodeRenderer = observer(function RowNodeRenderer({
84
+ const RowNodeRenderer = observer(({
75
85
  node
76
- }) {
86
+ }) => {
77
87
  const {
78
88
  fieldRenderers
79
89
  } = useFormViewRenderers();
80
- return /*#__PURE__*/React.createElement("div", {
81
- className: "grid grid-cols-12 gap-4"
82
- }, node.fields.map(field => {
90
+ return /*#__PURE__*/React.createElement(Grid, null, node.fields.map(field => {
83
91
  const span = Math.floor(12 / node.fields.length);
84
- return /*#__PURE__*/React.createElement("div", {
92
+ return /*#__PURE__*/React.createElement(Grid.Column, {
85
93
  key: field.name,
86
- className: `col-span-${span}`
94
+ span: span
87
95
  }, /*#__PURE__*/React.createElement(FieldRenderer, {
88
96
  field: field,
89
97
  renderers: fieldRenderers
90
98
  }));
91
99
  }));
92
100
  });
93
- const FieldRenderer = observer(function FieldRenderer({
101
+ const FieldRenderer = observer(({
94
102
  field,
95
103
  renderers
96
- }) {
104
+ }) => {
97
105
  const Renderer = field.renderer ? renderers[field.renderer] : undefined;
98
106
  if (!Renderer) {
99
107
  if (process.env.NODE_ENV === "development") {
@@ -110,9 +118,9 @@ const SeparatorNodeRenderer = observer(function SeparatorNodeRenderer() {
110
118
  className: "border-neutral-dimmed my-2"
111
119
  });
112
120
  });
113
- const TabsNodeRenderer = observer(function TabsNodeRenderer({
121
+ const TabsNodeRenderer = observer(({
114
122
  node
115
- }) {
123
+ }) => {
116
124
  const {
117
125
  layoutRenderers
118
126
  } = useFormViewRenderers();
@@ -124,30 +132,29 @@ const TabsNodeRenderer = observer(function TabsNodeRenderer({
124
132
  });
125
133
  }
126
134
  }
127
- const activeTab = node.tabs.find(t => t.id === node.activeTabId);
128
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
129
- className: "flex border-b border-neutral-dimmed"
130
- }, node.tabs.map(tab => /*#__PURE__*/React.createElement("button", {
131
- key: tab.id,
132
- type: "button",
133
- className: `px-4 py-2 text-sm font-medium border-b-2 ${tab.id === node.activeTabId ? "border-primary text-primary" : "border-transparent text-neutral hover:text-neutral-strong"}`,
134
- onClick: () => node.setActiveTab(tab.id)
135
- }, tab.label, tab.hasErrors && /*#__PURE__*/React.createElement("span", {
136
- className: "ml-1 text-destructive text-xs"
137
- }, "*")))), activeTab && /*#__PURE__*/React.createElement("div", {
138
- className: "pt-4"
139
- }, activeTab.description && /*#__PURE__*/React.createElement("p", {
140
- className: "text-sm text-neutral mb-4"
141
- }, activeTab.description), /*#__PURE__*/React.createElement("div", {
142
- className: "flex flex-col gap-4"
143
- }, activeTab.layout.map((childNode, index) => /*#__PURE__*/React.createElement(LayoutNodeRenderer, {
144
- key: index,
145
- node: childNode
146
- })))));
135
+ return /*#__PURE__*/React.createElement(Tabs, {
136
+ value: node.activeTabId,
137
+ onValueChange: id => node.setActiveTab(id),
138
+ tabs: node.tabs.map(tab => /*#__PURE__*/React.createElement(Tabs.Tab, {
139
+ key: tab.id,
140
+ value: tab.id,
141
+ icon: renderTabIcon(tab.icon),
142
+ trigger: /*#__PURE__*/React.createElement(React.Fragment, null, tab.label, tab.hasErrors && /*#__PURE__*/React.createElement("span", {
143
+ className: "ml-1 text-destructive-default text-xs"
144
+ }, "*")),
145
+ disabled: tab.disabled,
146
+ content: /*#__PURE__*/React.createElement("div", {
147
+ className: "flex flex-col gap-4 mt-md"
148
+ }, tab.layout.map((childNode, index) => /*#__PURE__*/React.createElement(LayoutNodeRenderer, {
149
+ key: index,
150
+ node: childNode
151
+ })))
152
+ }))
153
+ });
147
154
  });
148
- const ElementNodeRenderer = observer(function ElementNodeRenderer({
155
+ const ElementNodeRenderer = observer(({
149
156
  node
150
- }) {
157
+ }) => {
151
158
  const {
152
159
  fieldRenderers
153
160
  } = useFormViewRenderers();
@@ -1 +1 @@
1
- {"version":3,"names":["React","createContext","useContext","useMemo","observer","useFieldRenderers","useLayoutRenderers","FormViewRenderersContext","useFormViewRenderers","ctx","Error","FormView","form","renderers","layoutRenderers","defaultFieldRenderers","defaultLayoutRenderers","value","fieldRenderers","createElement","Provider","className","layout","map","node","index","LayoutNodeRenderer","key","type","RowNodeRenderer","SeparatorNodeRenderer","TabsNodeRenderer","ElementNodeRenderer","fields","field","span","Math","floor","length","name","FieldRenderer","Renderer","renderer","undefined","process","env","NODE_ENV","console","warn","CustomRenderer","activeTab","tabs","find","t","id","activeTabId","tab","onClick","setActiveTab","label","hasErrors","description","childNode","props"],"sources":["FormView.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport type {\n IFormVM,\n LayoutNodeVM,\n IRowNodeVM,\n IFieldVM,\n ITabsNodeVM,\n IElementNodeVM\n} from \"./abstractions.js\";\nimport { useFieldRenderers } from \"~/features/formModel/useFieldRenderers.js\";\nimport { useLayoutRenderers } from \"~/features/formModel/useLayoutRenderers.js\";\n\n/**\n * A field renderer component receives a FieldVM and renders the appropriate UI.\n */\nexport type FieldRendererComponent = React.ComponentType<{ field: IFieldVM }>;\n\n/**\n * Map of renderer keys to React components for fields.\n * Lookup order: `{type}:{renderer}` → `{type}`.\n */\nexport type FieldRenderers = Record<string, FieldRendererComponent>;\n\n/**\n * Map of renderer keys to React components for layout nodes.\n */\nexport type LayoutRenderers = Record<string, React.ComponentType<any>>;\n\ninterface FormViewRenderers {\n fieldRenderers: FieldRenderers;\n layoutRenderers: LayoutRenderers;\n}\n\nconst FormViewRenderersContext = createContext<FormViewRenderers | null>(null);\n\nconst useFormViewRenderers = (): FormViewRenderers => {\n const ctx = useContext(FormViewRenderersContext);\n if (!ctx) {\n throw new Error(\"useFormViewRenderers must be used within a FormView.\");\n }\n return ctx;\n};\n\nexport { useFormViewRenderers };\n\ninterface FormViewProps {\n form: IFormVM;\n renderers?: FieldRenderers;\n layoutRenderers?: LayoutRenderers;\n}\n\n/**\n * Generic form view that walks layout nodes and renders fields.\n * This component is stateless — it reads from the FormVM and delegates to renderers.\n */\nexport const FormView = observer(function FormView({\n form,\n renderers,\n layoutRenderers\n}: FormViewProps) {\n const defaultFieldRenderers = useFieldRenderers();\n const defaultLayoutRenderers = useLayoutRenderers();\n\n const value = useMemo(\n () => ({\n fieldRenderers: renderers ?? defaultFieldRenderers,\n layoutRenderers: layoutRenderers ?? defaultLayoutRenderers\n }),\n [renderers, defaultFieldRenderers, layoutRenderers, defaultLayoutRenderers]\n );\n\n return (\n <FormViewRenderersContext.Provider value={value}>\n <div className=\"w-full flex flex-col gap-4\">\n {form.layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n </FormViewRenderersContext.Provider>\n );\n});\n\nexport const LayoutNodeRenderer = observer(function LayoutNodeRenderer({\n node\n}: {\n node: LayoutNodeVM;\n}) {\n switch (node.type) {\n case \"row\":\n return <RowNodeRenderer node={node} />;\n case \"separator\":\n return <SeparatorNodeRenderer />;\n case \"tabs\":\n return <TabsNodeRenderer node={node} />;\n case \"element\":\n return <ElementNodeRenderer node={node} />;\n default:\n return null;\n }\n});\n\nconst RowNodeRenderer = observer(function RowNodeRenderer({ node }: { node: IRowNodeVM }) {\n const { fieldRenderers } = useFormViewRenderers();\n\n return (\n <div className=\"grid grid-cols-12 gap-4\">\n {node.fields.map(field => {\n const span = Math.floor(12 / node.fields.length);\n return (\n <div key={field.name} className={`col-span-${span}`}>\n <FieldRenderer field={field} renderers={fieldRenderers} />\n </div>\n );\n })}\n </div>\n );\n});\n\ninterface FieldRendererProps {\n field: IFieldVM;\n renderers: FieldRenderers;\n}\n\nconst FieldRenderer = observer(function FieldRenderer({ field, renderers }: FieldRendererProps) {\n const Renderer = field.renderer ? renderers[field.renderer] : undefined;\n\n if (!Renderer) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n `[FormView] No renderer found for field \"${field.name}\" (renderer: \"${field.renderer || \"none\"}\").`\n );\n }\n return null;\n }\n\n return <Renderer field={field} />;\n});\n\nconst SeparatorNodeRenderer = observer(function SeparatorNodeRenderer() {\n return <hr className=\"border-neutral-dimmed my-2\" />;\n});\n\nexport interface TabsNodeRendererProps {\n node: ITabsNodeVM;\n}\n\nconst TabsNodeRenderer = observer(function TabsNodeRenderer({ node }: TabsNodeRendererProps) {\n const { layoutRenderers } = useFormViewRenderers();\n\n if (node.renderer) {\n const CustomRenderer = layoutRenderers[node.renderer];\n if (CustomRenderer) {\n return <CustomRenderer node={node} />;\n }\n }\n\n const activeTab = node.tabs.find(t => t.id === node.activeTabId);\n\n return (\n <div>\n <div className=\"flex border-b border-neutral-dimmed\">\n {node.tabs.map(tab => (\n <button\n key={tab.id}\n type=\"button\"\n className={`px-4 py-2 text-sm font-medium border-b-2 ${\n tab.id === node.activeTabId\n ? \"border-primary text-primary\"\n : \"border-transparent text-neutral hover:text-neutral-strong\"\n }`}\n onClick={() => node.setActiveTab(tab.id)}\n >\n {tab.label}\n {tab.hasErrors && <span className=\"ml-1 text-destructive text-xs\">*</span>}\n </button>\n ))}\n </div>\n {activeTab && (\n <div className=\"pt-4\">\n {activeTab.description && (\n <p className=\"text-sm text-neutral mb-4\">{activeTab.description}</p>\n )}\n <div className=\"flex flex-col gap-4\">\n {activeTab.layout.map((childNode, index) => (\n <LayoutNodeRenderer key={index} node={childNode} />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n});\n\nconst ElementNodeRenderer = observer(function ElementNodeRenderer({\n node\n}: {\n node: IElementNodeVM;\n}) {\n const { fieldRenderers } = useFormViewRenderers();\n const Renderer = fieldRenderers[`element:${node.renderer}`];\n\n if (!Renderer) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(`[FormView] No renderer found for element \"${node.renderer}\".`);\n }\n return null;\n }\n\n return <Renderer field={{ ...node.props } as any} />;\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","createContext","useContext","useMemo","observer","Grid","Tabs","FontAwesomeIcon","useFieldRenderers","useLayoutRenderers","renderTabIcon","icon","undefined","createElement","name","split","FormViewRenderersContext","useFormViewRenderers","ctx","Error","FormView","form","renderers","layoutRenderers","defaultFieldRenderers","defaultLayoutRenderers","value","fieldRenderers","Provider","className","layout","map","node","index","LayoutNodeRenderer","key","type","RowNodeRenderer","SeparatorNodeRenderer","TabsNodeRenderer","ElementNodeRenderer","fields","field","span","Math","floor","length","Column","FieldRenderer","Renderer","renderer","process","env","NODE_ENV","console","warn","CustomRenderer","activeTabId","onValueChange","id","setActiveTab","tabs","tab","Tab","trigger","Fragment","label","hasErrors","disabled","content","childNode","props"],"sources":["FormView.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { Grid, Tabs } from \"@webiny/admin-ui\";\nimport type {\n IFormVM,\n LayoutNodeVM,\n IRowNodeVM,\n IFieldVM,\n ITabsNodeVM,\n IElementNodeVM\n} from \"./abstractions.js\";\nimport type { Icon } from \"~/components/IconPicker/types.js\";\nimport type { IconProp } from \"@fortawesome/fontawesome-svg-core\";\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { useFieldRenderers } from \"~/features/formModel/useFieldRenderers.js\";\nimport { useLayoutRenderers } from \"~/features/formModel/useLayoutRenderers.js\";\n\nexport function renderTabIcon(icon: Icon | undefined): React.ReactElement | undefined {\n if (!icon) {\n return undefined;\n }\n return <FontAwesomeIcon icon={icon.name.split(\"/\") as IconProp} />;\n}\n\n/**\n * A field renderer component receives a FieldVM and renders the appropriate UI.\n */\nexport type FieldRendererComponent = React.ComponentType<{ field: IFieldVM }>;\n\n/**\n * Map of renderer keys to React components for fields.\n * Lookup order: `{type}:{renderer}` → `{type}`.\n */\nexport type FieldRenderers = Record<string, FieldRendererComponent>;\n\n/**\n * Map of renderer keys to React components for layout nodes.\n */\nexport type LayoutRenderers = Record<string, React.ComponentType<any>>;\n\ninterface FormViewRenderers {\n fieldRenderers: FieldRenderers;\n layoutRenderers: LayoutRenderers;\n}\n\nconst FormViewRenderersContext = createContext<FormViewRenderers | null>(null);\n\nconst useFormViewRenderers = (): FormViewRenderers => {\n const ctx = useContext(FormViewRenderersContext);\n if (!ctx) {\n throw new Error(\"useFormViewRenderers must be used within a FormView.\");\n }\n return ctx;\n};\n\nexport { useFormViewRenderers };\n\ninterface FormViewProps {\n form: IFormVM;\n renderers?: FieldRenderers;\n layoutRenderers?: LayoutRenderers;\n}\n\n/**\n * Generic form view that walks layout nodes and renders fields.\n * This component is stateless — it reads from the FormVM and delegates to renderers.\n */\nexport const FormView = observer(({ form, renderers, layoutRenderers }: FormViewProps) => {\n const defaultFieldRenderers = useFieldRenderers();\n const defaultLayoutRenderers = useLayoutRenderers();\n\n const value = useMemo(\n () => ({\n fieldRenderers: renderers ?? defaultFieldRenderers,\n layoutRenderers: layoutRenderers ?? defaultLayoutRenderers\n }),\n [renderers, defaultFieldRenderers, layoutRenderers, defaultLayoutRenderers]\n );\n\n return (\n <FormViewRenderersContext.Provider value={value}>\n <div className=\"w-full flex flex-col gap-4\">\n {form.layout.map((node, index) => (\n <LayoutNodeRenderer key={index} node={node} />\n ))}\n </div>\n </FormViewRenderersContext.Provider>\n );\n});\n\nexport const LayoutNodeRenderer = observer(({ node }: { node: LayoutNodeVM }) => {\n switch (node.type) {\n case \"row\":\n return <RowNodeRenderer node={node} />;\n case \"separator\":\n return <SeparatorNodeRenderer />;\n case \"tabs\":\n return <TabsNodeRenderer node={node} />;\n case \"element\":\n return <ElementNodeRenderer node={node} />;\n default:\n return null;\n }\n});\n\nconst RowNodeRenderer = observer(({ node }: { node: IRowNodeVM }) => {\n const { fieldRenderers } = useFormViewRenderers();\n\n return (\n <Grid>\n {node.fields.map(field => {\n const span = Math.floor(12 / node.fields.length) as React.ComponentProps<\n typeof Grid.Column\n >[\"span\"];\n\n return (\n <Grid.Column key={field.name} span={span}>\n <FieldRenderer field={field} renderers={fieldRenderers} />\n </Grid.Column>\n );\n })}\n </Grid>\n );\n});\n\ninterface FieldRendererProps {\n field: IFieldVM;\n renderers: FieldRenderers;\n}\n\nconst FieldRenderer = observer(({ field, renderers }: FieldRendererProps) => {\n const Renderer = field.renderer ? renderers[field.renderer] : undefined;\n\n if (!Renderer) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n `[FormView] No renderer found for field \"${field.name}\" (renderer: \"${field.renderer || \"none\"}\").`\n );\n }\n return null;\n }\n\n return <Renderer field={field} />;\n});\n\nconst SeparatorNodeRenderer = observer(function SeparatorNodeRenderer() {\n return <hr className=\"border-neutral-dimmed my-2\" />;\n});\n\nexport interface TabsNodeRendererProps {\n node: ITabsNodeVM;\n}\n\nconst TabsNodeRenderer = observer(({ node }: TabsNodeRendererProps) => {\n const { layoutRenderers } = useFormViewRenderers();\n\n if (node.renderer) {\n const CustomRenderer = layoutRenderers[node.renderer];\n if (CustomRenderer) {\n return <CustomRenderer node={node} />;\n }\n }\n\n return (\n <Tabs\n value={node.activeTabId}\n onValueChange={id => node.setActiveTab(id)}\n tabs={node.tabs.map(tab => (\n <Tabs.Tab\n key={tab.id}\n value={tab.id}\n icon={renderTabIcon(tab.icon)}\n trigger={\n <>\n {tab.label}\n {tab.hasErrors && (\n <span className=\"ml-1 text-destructive-default text-xs\">*</span>\n )}\n </>\n }\n disabled={tab.disabled}\n content={\n <div className={\"flex flex-col gap-4 mt-md\"}>\n {tab.layout.map((childNode, index) => (\n <LayoutNodeRenderer key={index} node={childNode} />\n ))}\n </div>\n }\n />\n ))}\n />\n );\n});\n\nconst ElementNodeRenderer = observer(({ node }: { node: IElementNodeVM }) => {\n const { fieldRenderers } = useFormViewRenderers();\n const Renderer = fieldRenderers[`element:${node.renderer}`];\n\n if (!Renderer) {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(`[FormView] No renderer found for element \"${node.renderer}\".`);\n }\n return null;\n }\n\n return <Renderer field={{ ...node.props } as any} />;\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ import type { Icon } from "../../components/IconPicker/types.js";
2
+ import type { IField, IFieldBuilder, ILayoutBuilder, ILayoutNodeBuilder, ILayoutNodeHandle, IRule, ITabBuilder, ITabDefinition, ITabDefinitionInput, ITabsBuilder, ITabsNode, LayoutNode, ILayoutNodeAccessHandle } from "./abstractions.js";
3
+ interface TabBuilderInternal extends ITabBuilder {
4
+ _build(id: string): ITabDefinition;
5
+ }
6
+ export declare class TabBuilder implements TabBuilderInternal {
7
+ private _existing;
8
+ private _label;
9
+ private _description;
10
+ private _icon;
11
+ private _layoutFactory;
12
+ private _rules;
13
+ constructor(existing?: ITabDefinition);
14
+ label(text: string): this;
15
+ description(text: string): this;
16
+ icon(icon: Icon): this;
17
+ layout(factory: (l: ILayoutBuilder) => ILayoutNodeBuilder[]): this;
18
+ rules(r: IRule[]): this;
19
+ _build(id: string): ITabDefinition;
20
+ }
21
+ export declare class TabsBuilder implements ITabsBuilder {
22
+ private _id;
23
+ private _renderer;
24
+ private _rules;
25
+ private _pendingTabs;
26
+ private _lastAddedIdx;
27
+ constructor(id?: string);
28
+ renderer(name: string): this;
29
+ tab(tabId: string, configure: (tab: ITabBuilder) => void): this;
30
+ before(_target: string): this;
31
+ after(_target: string): this;
32
+ rules(r: IRule[]): this;
33
+ build(): ITabsNode;
34
+ }
35
+ export declare class TabsAccessBuilder implements ITabsBuilder {
36
+ private _node;
37
+ private _lastAddedIdx;
38
+ constructor(_node: ITabsNode);
39
+ renderer(name: string): this;
40
+ tab(tabId: string, configure: (tab: ITabBuilder) => void): this;
41
+ before(target: string): this;
42
+ after(target: string): this;
43
+ rules(r: IRule[]): this;
44
+ build(): ITabsNode;
45
+ }
46
+ export declare class LayoutBuilderFactory {
47
+ static create(): ILayoutBuilder;
48
+ static buildNodes(builders: ILayoutNodeBuilder[]): LayoutNode[];
49
+ static resolvePositionedRows(nodes: LayoutNode[]): LayoutNode[];
50
+ static resolveObjectInner(inner: ((layout: ILayoutBuilder) => ILayoutNodeBuilder[]) | Record<string, (layout: ILayoutBuilder) => ILayoutNodeBuilder[]>): LayoutNode[] | Record<string, LayoutNode[]>;
51
+ static createNodeHandle(node: LayoutNode): ILayoutNodeHandle;
52
+ static matchesNodeId(node: LayoutNode, nodeId: string): boolean;
53
+ static findNodeById(layout: LayoutNode[], nodeId: string): LayoutNode | undefined;
54
+ static resolveTabDefinition(input: ITabDefinitionInput): ITabDefinition;
55
+ static tabsNodeKey(node: ITabsNode): string;
56
+ static accessNode(layout: LayoutNode[], nodeId: string): ILayoutNodeAccessHandle;
57
+ static collectBuilders(fields: Map<string, IField>, builders: Map<string, IFieldBuilder> | Record<string, IFieldBuilder>, predicate: (builder: IFieldBuilder) => boolean, result: IFieldBuilder[]): void;
58
+ static collectFieldIds(layout: LayoutNode[]): string[];
59
+ static collectBuildersFlat(builders: Record<string, IFieldBuilder>, predicate: (builder: IFieldBuilder) => boolean, result: IFieldBuilder[]): void;
60
+ }
61
+ export {};