@webiny/app-admin 6.3.0-beta.1 → 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.
- package/base/Base/DefaultFieldRenderers.js +69 -5
- package/base/Base/DefaultFieldRenderers.js.map +1 -1
- package/base/Base/DefaultLayoutRenderers.js +5 -1
- package/base/Base/DefaultLayoutRenderers.js.map +1 -1
- package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
- package/base/Base/FieldRenderers/InputRenderer.js +2 -2
- package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
- package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
- package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
- package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
- package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
- package/base/Base/Menus.js +5 -64
- package/base/Base/Menus.js.map +1 -1
- package/base/Base/RoutesConfig.js +6 -0
- package/base/Base/RoutesConfig.js.map +1 -1
- package/exports/admin/build-params.d.ts +2 -0
- package/exports/admin/build-params.js +3 -0
- package/exports/admin/build-params.js.map +1 -1
- package/exports/admin/form.d.ts +5 -0
- package/exports/admin/form.js +8 -0
- package/exports/admin/form.js.map +1 -1
- package/exports/admin/ui.d.ts +1 -0
- package/exports/admin/ui.js +1 -0
- package/exports/admin/ui.js.map +1 -1
- package/exports/admin.d.ts +3 -1
- package/exports/admin.js +3 -1
- package/exports/admin.js.map +1 -1
- package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
- package/features/formModel/ConditionRuleEvaluator.js +56 -0
- package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
- package/features/formModel/Field.d.ts +50 -4
- package/features/formModel/Field.js +254 -35
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.d.ts +17 -35
- package/features/formModel/FieldBuilder.js +63 -100
- package/features/formModel/FieldBuilder.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +127 -13
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
- package/features/formModel/FieldBuilderRegistry.js +31 -0
- package/features/formModel/FieldBuilderRegistry.js.map +1 -0
- package/features/formModel/FocusManager.d.ts +14 -0
- package/features/formModel/FocusManager.js +109 -0
- package/features/formModel/FocusManager.js.map +1 -0
- package/features/formModel/FormModel.d.ts +27 -31
- package/features/formModel/FormModel.js +210 -403
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +2044 -193
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormModelFactory.d.ts +4 -2
- package/features/formModel/FormModelFactory.js +13 -3
- package/features/formModel/FormModelFactory.js.map +1 -1
- package/features/formModel/FormView.d.ts +2 -0
- package/features/formModel/FormView.js +44 -37
- package/features/formModel/FormView.js.map +1 -1
- package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
- package/features/formModel/LayoutBuilderFactory.js +386 -0
- package/features/formModel/LayoutBuilderFactory.js.map +1 -0
- package/features/formModel/LayoutMutator.d.ts +11 -0
- package/features/formModel/LayoutMutator.js +136 -0
- package/features/formModel/LayoutMutator.js.map +1 -0
- package/features/formModel/LayoutResolver.d.ts +26 -0
- package/features/formModel/LayoutResolver.js +239 -0
- package/features/formModel/LayoutResolver.js.map +1 -0
- package/features/formModel/ObjectField.d.ts +55 -4
- package/features/formModel/ObjectField.js +499 -82
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/Rules.test.d.ts +1 -0
- package/features/formModel/Rules.test.js +289 -0
- package/features/formModel/Rules.test.js.map +1 -0
- package/features/formModel/abstractions.d.ts +402 -52
- package/features/formModel/abstractions.js +55 -0
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/createFieldRenderer.d.ts +20 -0
- package/features/formModel/createFieldRenderer.js +15 -0
- package/features/formModel/createFieldRenderer.js.map +1 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelDemo.d.ts +4 -0
- package/features/formModel/demo/FormModelDemo.js +230 -0
- package/features/formModel/demo/FormModelDemo.js.map +1 -0
- package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
- package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
- package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
- package/features/formModel/feature.js +12 -0
- package/features/formModel/feature.js.map +1 -1
- package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
- package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/TextFieldType.js +20 -0
- package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/index.d.ts +7 -0
- package/features/formModel/fieldTypes/index.js +9 -0
- package/features/formModel/fieldTypes/index.js.map +1 -0
- package/features/formModel/index.d.ts +13 -4
- package/features/formModel/index.js +21 -2
- package/features/formModel/index.js.map +1 -1
- package/features/formModel/renderers.d.ts +15 -1
- package/features/formModel/renderers.js +15 -1
- package/features/formModel/renderers.js.map +1 -1
- package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
- package/features/tools/LexicalContext/LexicalContext.js +22 -0
- package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
- package/features/tools/LexicalContext/abstractions.d.ts +11 -0
- package/features/tools/LexicalContext/abstractions.js +4 -0
- package/features/tools/LexicalContext/abstractions.js.map +1 -0
- package/features/tools/LexicalContext/index.d.ts +2 -0
- package/features/tools/LexicalContext/index.js +3 -0
- package/features/tools/LexicalContext/index.js.map +1 -0
- package/features/tools/feature.js +2 -0
- package/features/tools/feature.js.map +1 -1
- package/features/tools/index.d.ts +1 -0
- package/features/tools/index.js +1 -0
- package/features/tools/index.js.map +1 -1
- package/index.d.ts +8 -1
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/package.json +31 -25
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
- package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
- package/presentation/lexicalContext/useLexicalContext.js +14 -0
- package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
- package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
- package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
- package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
- package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
- package/routes.d.ts +1 -0
- package/routes.js +4 -0
- package/routes.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
- 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
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
84
|
+
const RowNodeRenderer = observer(({
|
|
75
85
|
node
|
|
76
|
-
}) {
|
|
86
|
+
}) => {
|
|
77
87
|
const {
|
|
78
88
|
fieldRenderers
|
|
79
89
|
} = useFormViewRenderers();
|
|
80
|
-
return /*#__PURE__*/React.createElement(
|
|
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(
|
|
92
|
+
return /*#__PURE__*/React.createElement(Grid.Column, {
|
|
85
93
|
key: field.name,
|
|
86
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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(
|
|
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 {};
|