@webiny/app-admin 6.1.0 → 6.2.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 (126) hide show
  1. package/base/Admin.js +2 -0
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.d.ts +2 -0
  4. package/base/Base/DefaultFieldRenderers.js +15 -0
  5. package/base/Base/DefaultFieldRenderers.js.map +1 -0
  6. package/base/Base/FieldRenderers/SelectRenderer.d.ts +5 -0
  7. package/base/Base/FieldRenderers/SelectRenderer.js +24 -0
  8. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -0
  9. package/base/Base/FieldRenderers/TextRenderer.d.ts +5 -0
  10. package/base/Base/FieldRenderers/TextRenderer.js +21 -0
  11. package/base/Base/FieldRenderers/TextRenderer.js.map +1 -0
  12. package/base/Base/Menus.js +7 -0
  13. package/base/Base/Menus.js.map +1 -1
  14. package/base/Base.js +2 -1
  15. package/base/Base.js.map +1 -1
  16. package/base/createRootContainer.js +2 -0
  17. package/base/createRootContainer.js.map +1 -1
  18. package/components/Dialogs/DialogParamsContext.d.ts +6 -0
  19. package/components/Dialogs/DialogParamsContext.js +11 -0
  20. package/components/Dialogs/DialogParamsContext.js.map +1 -0
  21. package/components/Dialogs/DialogsContext.d.ts +2 -0
  22. package/components/Dialogs/DialogsContext.js +32 -4
  23. package/components/Dialogs/DialogsContext.js.map +1 -1
  24. package/components/OptionsMenu/OptionsMenu.d.ts +6 -0
  25. package/components/OptionsMenu/OptionsMenu.js +3 -3
  26. package/components/OptionsMenu/OptionsMenu.js.map +1 -1
  27. package/components/RegisterFeature.js +5 -5
  28. package/components/RegisterFeature.js.map +1 -1
  29. package/components/Wcp.d.ts +2 -0
  30. package/components/Wcp.js +7 -0
  31. package/components/Wcp.js.map +1 -1
  32. package/config/AdminConfig/Dialog.d.ts +10 -0
  33. package/config/AdminConfig/Dialog.js +21 -0
  34. package/config/AdminConfig/Dialog.js.map +1 -0
  35. package/config/AdminConfig/FieldRenderer.d.ts +11 -0
  36. package/config/AdminConfig/FieldRenderer.js +21 -0
  37. package/config/AdminConfig/FieldRenderer.js.map +1 -0
  38. package/config/AdminConfig/Form.d.ts +3 -0
  39. package/config/AdminConfig/Form.js +6 -0
  40. package/config/AdminConfig/Form.js.map +1 -0
  41. package/config/AdminConfig.d.ts +10 -0
  42. package/config/AdminConfig.js +7 -1
  43. package/config/AdminConfig.js.map +1 -1
  44. package/exports/admin/security.d.ts +6 -0
  45. package/exports/admin/security.js +5 -0
  46. package/exports/admin/security.js.map +1 -1
  47. package/exports/admin/ui.d.ts +2 -0
  48. package/exports/admin/ui.js +2 -0
  49. package/exports/admin/ui.js.map +1 -1
  50. package/exports/admin.d.ts +0 -3
  51. package/exports/admin.js +0 -3
  52. package/exports/admin.js.map +1 -1
  53. package/features/formModel/Field.d.ts +52 -0
  54. package/features/formModel/Field.js +201 -0
  55. package/features/formModel/Field.js.map +1 -0
  56. package/features/formModel/FieldBuilder.d.ts +45 -0
  57. package/features/formModel/FieldBuilder.js +158 -0
  58. package/features/formModel/FieldBuilder.js.map +1 -0
  59. package/features/formModel/FieldBuilder.test.js +106 -0
  60. package/features/formModel/FieldBuilder.test.js.map +1 -0
  61. package/features/formModel/FormModel.d.ts +61 -0
  62. package/features/formModel/FormModel.js +573 -0
  63. package/features/formModel/FormModel.js.map +1 -0
  64. package/features/formModel/FormModel.test.d.ts +1 -0
  65. package/features/formModel/FormModel.test.js +1140 -0
  66. package/features/formModel/FormModel.test.js.map +1 -0
  67. package/features/formModel/FormModelFactory.d.ts +9 -0
  68. package/features/formModel/FormModelFactory.js +13 -0
  69. package/features/formModel/FormModelFactory.js.map +1 -0
  70. package/features/formModel/FormView.d.ts +23 -0
  71. package/features/formModel/FormView.js +138 -0
  72. package/features/formModel/FormView.js.map +1 -0
  73. package/features/formModel/abstractions.d.ts +286 -0
  74. package/features/formModel/abstractions.js +54 -0
  75. package/features/formModel/abstractions.js.map +1 -0
  76. package/features/formModel/feature.d.ts +3 -0
  77. package/features/formModel/feature.js +16 -0
  78. package/features/formModel/feature.js.map +1 -0
  79. package/features/formModel/index.d.ts +10 -0
  80. package/features/formModel/index.js +14 -0
  81. package/features/formModel/index.js.map +1 -0
  82. package/features/formModel/useFieldRenderers.d.ts +2 -0
  83. package/features/formModel/useFieldRenderers.js +19 -0
  84. package/features/formModel/useFieldRenderers.js.map +1 -0
  85. package/features/security/LogIn/LogInGateway.d.ts +2 -2
  86. package/features/security/LogIn/LogInGateway.js +2 -2
  87. package/features/security/LogIn/LogInGateway.js.map +1 -1
  88. package/features/wcp/WcpGateway.d.ts +2 -2
  89. package/features/wcp/WcpGateway.js +2 -2
  90. package/features/wcp/WcpGateway.js.map +1 -1
  91. package/hooks/index.d.ts +1 -0
  92. package/hooks/index.js +1 -0
  93. package/hooks/index.js.map +1 -1
  94. package/hooks/useDialog.d.ts +9 -29
  95. package/hooks/useDialog.js +16 -24
  96. package/hooks/useDialog.js.map +1 -1
  97. package/hooks/useOpenDialog.d.ts +7 -0
  98. package/hooks/useOpenDialog.js +18 -0
  99. package/hooks/useOpenDialog.js.map +1 -0
  100. package/index.d.ts +5 -0
  101. package/index.js +5 -0
  102. package/index.js.map +1 -1
  103. package/package.json +30 -30
  104. package/permissions/createHasPermission.d.ts +3 -2
  105. package/permissions/createHasPermission.js +4 -8
  106. package/permissions/createHasPermission.js.map +1 -1
  107. package/permissions/createPermissions.d.ts +6 -0
  108. package/permissions/createPermissions.js +201 -0
  109. package/permissions/createPermissions.js.map +1 -0
  110. package/permissions/createPermissions.test.d.ts +1 -0
  111. package/permissions/createPermissions.test.js +177 -0
  112. package/permissions/createPermissions.test.js.map +1 -0
  113. package/permissions/index.d.ts +1 -0
  114. package/permissions/index.js +1 -0
  115. package/permissions/index.js.map +1 -1
  116. package/permissions/types.d.ts +5 -0
  117. package/permissions/types.js.map +1 -1
  118. package/permissions/usePermissions.d.ts +2 -1
  119. package/permissions/usePermissions.js +4 -175
  120. package/permissions/usePermissions.js.map +1 -1
  121. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.d.ts +2 -2
  122. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js +2 -2
  123. package/presentation/installation/presenters/SystemInstaller/SystemInstallerGateway.js.map +1 -1
  124. package/permissions/createHasPermission.test.js +0 -206
  125. package/permissions/createHasPermission.test.js.map +0 -1
  126. /package/{permissions/createHasPermission.test.d.ts → features/formModel/FieldBuilder.test.d.ts} +0 -0
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Base FieldBuilder with fluent API.
3
+ * Each method mutates `this` and returns `this` for chaining.
4
+ */
5
+ export class FieldBuilder {
6
+ constructor(type) {
7
+ this._config = {
8
+ name: "",
9
+ type,
10
+ hidden: false,
11
+ required: false,
12
+ disabled: false
13
+ };
14
+ }
15
+ get fieldType() {
16
+ return this._config.type;
17
+ }
18
+ label(text) {
19
+ this._config.label = text;
20
+ return this;
21
+ }
22
+ placeholder(text) {
23
+ this._config.placeholder = text;
24
+ return this;
25
+ }
26
+ schema(zodSchema) {
27
+ this._config.schema = zodSchema;
28
+ return this;
29
+ }
30
+ defaultValue(value) {
31
+ this._config.defaultValue = value;
32
+ return this;
33
+ }
34
+ renderer(name) {
35
+ this._config.renderer = name;
36
+ return this;
37
+ }
38
+ hidden() {
39
+ this._config.hidden = true;
40
+ return this;
41
+ }
42
+ required(message) {
43
+ this._config.required = true;
44
+ this._config.requiredMessage = message;
45
+ return this;
46
+ }
47
+ disabled(value = true) {
48
+ this._config.disabled = value;
49
+ return this;
50
+ }
51
+ beforeChange(fn) {
52
+ if (!this._config.beforeChangeCallbacks) {
53
+ this._config.beforeChangeCallbacks = [];
54
+ }
55
+ this._config.beforeChangeCallbacks.push(fn);
56
+ return this;
57
+ }
58
+ afterChange(fn) {
59
+ if (!this._config.afterChangeCallbacks) {
60
+ this._config.afterChangeCallbacks = [];
61
+ }
62
+ this._config.afterChangeCallbacks.push(fn);
63
+ return this;
64
+ }
65
+ afterSetValue(fn) {
66
+ if (!this._config.afterSetValueCallbacks) {
67
+ this._config.afterSetValueCallbacks = [];
68
+ }
69
+ this._config.afterSetValueCallbacks.push(fn);
70
+ return this;
71
+ }
72
+ onBlur(fn) {
73
+ if (!this._config.onBlurCallbacks) {
74
+ this._config.onBlurCallbacks = [];
75
+ }
76
+ this._config.onBlurCallbacks.push(fn);
77
+ return this;
78
+ }
79
+ build(name) {
80
+ return {
81
+ ...this._config,
82
+ name
83
+ };
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Text field builder.
89
+ */
90
+ export class TextFieldBuilder extends FieldBuilder {
91
+ constructor() {
92
+ super("text");
93
+ this._config.renderer = "text";
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Select field builder with .options() support.
99
+ */
100
+ export class SelectFieldBuilder extends FieldBuilder {
101
+ constructor() {
102
+ super("select");
103
+ this._config.renderer = "select";
104
+ }
105
+ options(opts) {
106
+ this._config.options = opts;
107
+ return this;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Factory interface for creating field builders.
113
+ */
114
+
115
+ /**
116
+ * Proxy-based FieldBuilderRegistry.
117
+ */
118
+ class FieldBuilderRegistryImpl {
119
+ fieldTypes = new Map();
120
+ constructor(factories) {
121
+ this.fieldTypes.set("text", {
122
+ type: "text",
123
+ create: () => new TextFieldBuilder()
124
+ });
125
+ this.fieldTypes.set("select", {
126
+ type: "select",
127
+ create: () => new SelectFieldBuilder()
128
+ });
129
+ if (factories) {
130
+ for (const factory of factories) {
131
+ this.fieldTypes.set(factory.type, factory);
132
+ }
133
+ }
134
+ const proxy = new Proxy(this, {
135
+ get(target, prop) {
136
+ const factory = target.fieldTypes.get(prop);
137
+ if (factory) {
138
+ return () => factory.create();
139
+ }
140
+ return target[prop];
141
+ }
142
+ });
143
+ return proxy;
144
+ }
145
+
146
+ // These exist for TypeScript but are intercepted by the Proxy
147
+ text() {
148
+ throw new Error("Should be intercepted by Proxy");
149
+ }
150
+ select() {
151
+ throw new Error("Should be intercepted by Proxy");
152
+ }
153
+ }
154
+ export function createFieldBuilderRegistry(factories) {
155
+ return new FieldBuilderRegistryImpl(factories);
156
+ }
157
+
158
+ //# sourceMappingURL=FieldBuilder.js.map
@@ -0,0 +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":[]}
@@ -0,0 +1,106 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { z } from "zod";
3
+ import { TextFieldBuilder, SelectFieldBuilder, createFieldBuilderRegistry } from "./FieldBuilder.js";
4
+ describe("TextFieldBuilder", () => {
5
+ it("should build a text field config with all fluent methods", () => {
6
+ const builder = new TextFieldBuilder().label("Title").placeholder("Enter title").required("Title is required").defaultValue("Untitled").renderer("custom-text").schema(z.string().min(1));
7
+ const config = builder.build("title");
8
+ expect(config.name).toBe("title");
9
+ expect(config.type).toBe("text");
10
+ expect(config.label).toBe("Title");
11
+ expect(config.placeholder).toBe("Enter title");
12
+ expect(config.required).toBe(true);
13
+ expect(config.requiredMessage).toBe("Title is required");
14
+ expect(config.defaultValue).toBe("Untitled");
15
+ expect(config.renderer).toBe("custom-text");
16
+ expect(config.hidden).toBe(false);
17
+ expect(config.disabled).toBe(false);
18
+ expect(config.schema).toBeDefined();
19
+ });
20
+ it("should support hidden() method", () => {
21
+ const config = new TextFieldBuilder().hidden().build("secret");
22
+ expect(config.hidden).toBe(true);
23
+ });
24
+ it("should support disabled() method", () => {
25
+ const config = new TextFieldBuilder().disabled().build("readonly");
26
+ expect(config.disabled).toBe(true);
27
+ });
28
+ it("should default disabled to false", () => {
29
+ const config = new TextFieldBuilder().build("field");
30
+ expect(config.disabled).toBe(false);
31
+ });
32
+ });
33
+ describe("TextFieldBuilder - beforeChange / afterChange", () => {
34
+ it("should store beforeChange callbacks in config", () => {
35
+ const cb1 = value => value;
36
+ const cb2 = value => value;
37
+ const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build("field");
38
+ expect(config.beforeChangeCallbacks).toHaveLength(2);
39
+ expect(config.beforeChangeCallbacks[0]).toBe(cb1);
40
+ expect(config.beforeChangeCallbacks[1]).toBe(cb2);
41
+ });
42
+ it("should store afterChange callbacks in config", () => {
43
+ const cb = () => {};
44
+ const config = new TextFieldBuilder().afterChange(cb).build("field");
45
+ expect(config.afterChangeCallbacks).toHaveLength(1);
46
+ expect(config.afterChangeCallbacks[0]).toBe(cb);
47
+ });
48
+ it("should not have callback arrays when none are added", () => {
49
+ const config = new TextFieldBuilder().build("field");
50
+ expect(config.beforeChangeCallbacks).toBeUndefined();
51
+ expect(config.afterChangeCallbacks).toBeUndefined();
52
+ });
53
+ it("should support chaining callbacks with other builder methods", () => {
54
+ const config = new TextFieldBuilder().label("Title").beforeChange(value => value).required("Required").afterChange(() => {}).build("title");
55
+ expect(config.label).toBe("Title");
56
+ expect(config.required).toBe(true);
57
+ expect(config.beforeChangeCallbacks).toHaveLength(1);
58
+ expect(config.afterChangeCallbacks).toHaveLength(1);
59
+ });
60
+ });
61
+ describe("SelectFieldBuilder", () => {
62
+ it("should build a select field config with static options", () => {
63
+ const options = [{
64
+ label: "English",
65
+ value: "en"
66
+ }, {
67
+ label: "German",
68
+ value: "de"
69
+ }];
70
+ const builder = new SelectFieldBuilder().label("Language").options(options).required();
71
+ const config = builder.build("language");
72
+ expect(config.name).toBe("language");
73
+ expect(config.type).toBe("select");
74
+ expect(config.label).toBe("Language");
75
+ expect(config.required).toBe(true);
76
+ expect(config.options).toEqual(options);
77
+ });
78
+ it("should support reactive options function", () => {
79
+ const optionsFn = () => [{
80
+ label: "A",
81
+ value: "a"
82
+ }];
83
+ const config = new SelectFieldBuilder().options(optionsFn).build("dynamic");
84
+ expect(typeof config.options).toBe("function");
85
+ });
86
+ });
87
+ describe("FieldBuilderRegistry", () => {
88
+ it("should create text builders via registry.text()", () => {
89
+ const registry = createFieldBuilderRegistry();
90
+ const builder = registry.text();
91
+ expect(builder).toBeInstanceOf(TextFieldBuilder);
92
+ });
93
+ it("should create select builders via registry.select()", () => {
94
+ const registry = createFieldBuilderRegistry();
95
+ const builder = registry.select();
96
+ expect(builder).toBeInstanceOf(SelectFieldBuilder);
97
+ });
98
+ it("should support chaining on registry-created builders", () => {
99
+ const registry = createFieldBuilderRegistry();
100
+ const config = registry.text().label("Name").required().build("name");
101
+ expect(config.label).toBe("Name");
102
+ expect(config.required).toBe(true);
103
+ });
104
+ });
105
+
106
+ //# sourceMappingURL=FieldBuilder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","expect","z","TextFieldBuilder","SelectFieldBuilder","createFieldBuilderRegistry","builder","label","placeholder","required","defaultValue","renderer","schema","string","min","config","build","name","toBe","type","requiredMessage","hidden","disabled","toBeDefined","cb1","value","cb2","beforeChange","beforeChangeCallbacks","toHaveLength","cb","afterChange","afterChangeCallbacks","toBeUndefined","options","toEqual","optionsFn","registry","text","toBeInstanceOf","select"],"sources":["FieldBuilder.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { z } from \"zod\";\nimport {\n TextFieldBuilder,\n SelectFieldBuilder,\n createFieldBuilderRegistry\n} from \"./FieldBuilder.js\";\n\ndescribe(\"TextFieldBuilder\", () => {\n it(\"should build a text field config with all fluent methods\", () => {\n const builder = new TextFieldBuilder()\n .label(\"Title\")\n .placeholder(\"Enter title\")\n .required(\"Title is required\")\n .defaultValue(\"Untitled\")\n .renderer(\"custom-text\")\n .schema(z.string().min(1));\n\n const config = builder.build(\"title\");\n\n expect(config.name).toBe(\"title\");\n expect(config.type).toBe(\"text\");\n expect(config.label).toBe(\"Title\");\n expect(config.placeholder).toBe(\"Enter title\");\n expect(config.required).toBe(true);\n expect(config.requiredMessage).toBe(\"Title is required\");\n expect(config.defaultValue).toBe(\"Untitled\");\n expect(config.renderer).toBe(\"custom-text\");\n expect(config.hidden).toBe(false);\n expect(config.disabled).toBe(false);\n expect(config.schema).toBeDefined();\n });\n\n it(\"should support hidden() method\", () => {\n const config = new TextFieldBuilder().hidden().build(\"secret\");\n expect(config.hidden).toBe(true);\n });\n\n it(\"should support disabled() method\", () => {\n const config = new TextFieldBuilder().disabled().build(\"readonly\");\n expect(config.disabled).toBe(true);\n });\n\n it(\"should default disabled to false\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.disabled).toBe(false);\n });\n});\n\ndescribe(\"TextFieldBuilder - beforeChange / afterChange\", () => {\n it(\"should store beforeChange callbacks in config\", () => {\n const cb1 = (value: unknown) => value;\n const cb2 = (value: unknown) => value;\n\n const config = new TextFieldBuilder().beforeChange(cb1).beforeChange(cb2).build(\"field\");\n\n expect(config.beforeChangeCallbacks).toHaveLength(2);\n expect(config.beforeChangeCallbacks![0]).toBe(cb1);\n expect(config.beforeChangeCallbacks![1]).toBe(cb2);\n });\n\n it(\"should store afterChange callbacks in config\", () => {\n const cb = () => {};\n const config = new TextFieldBuilder().afterChange(cb).build(\"field\");\n\n expect(config.afterChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks![0]).toBe(cb);\n });\n\n it(\"should not have callback arrays when none are added\", () => {\n const config = new TextFieldBuilder().build(\"field\");\n expect(config.beforeChangeCallbacks).toBeUndefined();\n expect(config.afterChangeCallbacks).toBeUndefined();\n });\n\n it(\"should support chaining callbacks with other builder methods\", () => {\n const config = new TextFieldBuilder()\n .label(\"Title\")\n .beforeChange(value => value)\n .required(\"Required\")\n .afterChange(() => {})\n .build(\"title\");\n\n expect(config.label).toBe(\"Title\");\n expect(config.required).toBe(true);\n expect(config.beforeChangeCallbacks).toHaveLength(1);\n expect(config.afterChangeCallbacks).toHaveLength(1);\n });\n});\n\ndescribe(\"SelectFieldBuilder\", () => {\n it(\"should build a select field config with static options\", () => {\n const options = [\n { label: \"English\", value: \"en\" },\n { label: \"German\", value: \"de\" }\n ];\n\n const builder = new SelectFieldBuilder().label(\"Language\").options(options).required();\n\n const config = builder.build(\"language\");\n\n expect(config.name).toBe(\"language\");\n expect(config.type).toBe(\"select\");\n expect(config.label).toBe(\"Language\");\n expect(config.required).toBe(true);\n expect(config.options).toEqual(options);\n });\n\n it(\"should support reactive options function\", () => {\n const optionsFn = () => [{ label: \"A\", value: \"a\" }];\n const config = new SelectFieldBuilder().options(optionsFn).build(\"dynamic\");\n expect(typeof config.options).toBe(\"function\");\n });\n});\n\ndescribe(\"FieldBuilderRegistry\", () => {\n it(\"should create text builders via registry.text()\", () => {\n const registry = createFieldBuilderRegistry();\n const builder = registry.text();\n expect(builder).toBeInstanceOf(TextFieldBuilder);\n });\n\n it(\"should create select builders via registry.select()\", () => {\n const registry = createFieldBuilderRegistry();\n const builder = registry.select();\n expect(builder).toBeInstanceOf(SelectFieldBuilder);\n });\n\n it(\"should support chaining on registry-created builders\", () => {\n const registry = createFieldBuilderRegistry();\n const config = registry.text().label(\"Name\").required().build(\"name\");\n expect(config.label).toBe(\"Name\");\n expect(config.required).toBe(true);\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,61 @@
1
+ import { Field } from "./Field.js";
2
+ import type { IFormModel, IField, IFieldBuilder, IFieldBuilderRegistry, IFormVM, IFormError, IFormModelConfig, ILayoutModifier, IPositionedLayoutNode, ILayoutNodeAccessHandle, LayoutNode } from "./abstractions.js";
3
+ export declare class FormModel implements IFormModel {
4
+ private _fields;
5
+ private _layout;
6
+ private _baseline;
7
+ private _submitted;
8
+ private _validateOnChange;
9
+ private _isValid;
10
+ private _errors;
11
+ private _activeTabs;
12
+ constructor(config: IFormModelConfig);
13
+ field(name: string): IField;
14
+ fields(factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>): void;
15
+ layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;
16
+ layout(nodeId: string): ILayoutNodeAccessHandle;
17
+ removeField(name: string): void;
18
+ getData(): Record<string, unknown>;
19
+ setData(data: Record<string, unknown>): void;
20
+ reset(): void;
21
+ get isDirty(): boolean;
22
+ get isValid(): boolean | null;
23
+ get errors(): IFormError[];
24
+ validate(): Promise<boolean>;
25
+ submit<T = Record<string, unknown>>(): Promise<T | false>;
26
+ get vm(): IFormVM;
27
+ getField(name: string): Field | undefined;
28
+ getFields(): Map<string, Field>;
29
+ private _resolveLayout;
30
+ private _resolveLayoutNode;
31
+ private _resolveRowNode;
32
+ private _resolveSeparatorNode;
33
+ private _resolveTabsNode;
34
+ private _resolveElementNode;
35
+ private _tabHasErrors;
36
+ private _collectFieldIdsFromLayout;
37
+ private _tabsNodeKey;
38
+ private _generateDefaultLayout;
39
+ private _warnOrphanFields;
40
+ private _snapshotBaseline;
41
+ private _resetAllValidation;
42
+ /**
43
+ * Find the index of a layout node that matches the given target.
44
+ * Matches: row containing fieldId, tabs by id, element by id/renderer.
45
+ * Returns -1 if not found.
46
+ */
47
+ private _findLayoutIndex;
48
+ private _nodeMatchesTarget;
49
+ /**
50
+ * Remove a target from the layout tree. Handles field IDs in rows,
51
+ * and node IDs for tabs/elements. Drops rows that become empty.
52
+ */
53
+ private _removeFromLayout;
54
+ /**
55
+ * Insert a layout node relative to a target field ID.
56
+ */
57
+ private _insertIntoLayout;
58
+ private _createModifierLayoutAPI;
59
+ private _accessLayoutNode;
60
+ private _isPositionedNode;
61
+ }