@webiny/app-admin 6.1.0-beta.3 → 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,573 @@
1
+ import { makeAutoObservable, computed, toJS, runInAction, observable } from "mobx";
2
+ import { Field } from "./Field.js";
3
+ import { createFieldBuilderRegistry } from "./FieldBuilder.js";
4
+ const layoutAPI = {
5
+ row(...fieldIds) {
6
+ return {
7
+ type: "row",
8
+ fieldIds
9
+ };
10
+ },
11
+ separator() {
12
+ return {
13
+ type: "separator"
14
+ };
15
+ },
16
+ tabs(config) {
17
+ return {
18
+ type: "tabs",
19
+ id: config.id,
20
+ tabs: config.tabs
21
+ };
22
+ },
23
+ element(renderer, props) {
24
+ return {
25
+ type: "element",
26
+ renderer,
27
+ props
28
+ };
29
+ }
30
+ };
31
+ export class FormModel {
32
+ _fields = new Map();
33
+ _layout = [];
34
+ _baseline = new Map();
35
+ _submitted = false;
36
+ _validateOnChange = false;
37
+ _isValid = null;
38
+ _errors = [];
39
+ _activeTabs = observable.map();
40
+ constructor(config) {
41
+ const registry = createFieldBuilderRegistry();
42
+ const builders = config.fields(registry);
43
+
44
+ // Build fields from builders
45
+ for (const [name, builder] of Object.entries(builders)) {
46
+ const fieldConfig = builder.build(name);
47
+ const field = new Field(fieldConfig);
48
+ field.setForm(this);
49
+ this._fields.set(name, field);
50
+ }
51
+
52
+ // Build layout
53
+ if (config.layout) {
54
+ this._layout = config.layout(layoutAPI);
55
+ this._warnOrphanFields();
56
+ } else {
57
+ this._layout = this._generateDefaultLayout();
58
+ }
59
+
60
+ // Validation strategy
61
+ this._validateOnChange = config.validateOnSubmit === false;
62
+
63
+ // Snapshot baseline from defaults
64
+ this._snapshotBaseline();
65
+ makeAutoObservable(this, {
66
+ vm: computed
67
+ }, {
68
+ autoBind: true
69
+ });
70
+ }
71
+ field(name) {
72
+ // Try exact match first (supports dotted field names like "properties.language").
73
+ const field = this._fields.get(name);
74
+ if (!field) {
75
+ throw new Error(`Field "${name}" not found.`);
76
+ }
77
+ return field;
78
+ }
79
+ fields(factory) {
80
+ const registry = createFieldBuilderRegistry();
81
+ const builders = factory(registry);
82
+ for (const [name, builder] of Object.entries(builders)) {
83
+ if (builder === undefined) {
84
+ // undefined = remove
85
+ this.removeField(name);
86
+ continue;
87
+ }
88
+ const fieldConfig = builder.build(name);
89
+ const field = new Field(fieldConfig);
90
+ field.setForm(this);
91
+
92
+ // Replace or add — same operation on the map
93
+ this._fields.set(name, field);
94
+ }
95
+
96
+ // Re-snapshot baseline to include new fields
97
+ this._snapshotBaseline();
98
+ }
99
+ layout(factoryOrNodeId) {
100
+ if (typeof factoryOrNodeId === "string") {
101
+ return this._accessLayoutNode(factoryOrNodeId);
102
+ }
103
+ const factory = factoryOrNodeId;
104
+ const removals = [];
105
+ const modifierLayoutAPI = this._createModifierLayoutAPI(removals);
106
+ const entries = factory(modifierLayoutAPI);
107
+
108
+ // Process removals first
109
+ for (const target of removals) {
110
+ this._layout = this._removeFromLayout(this._layout, target);
111
+ }
112
+
113
+ // Process additions with positional modifiers
114
+ for (const entry of entries) {
115
+ if (this._isPositionedNode(entry)) {
116
+ const {
117
+ node,
118
+ position
119
+ } = entry;
120
+ if (position) {
121
+ this._layout = this._insertIntoLayout(this._layout, node, position);
122
+ } else {
123
+ this._layout.push(node);
124
+ }
125
+ } else {
126
+ this._layout.push(entry);
127
+ }
128
+ }
129
+ }
130
+ removeField(name) {
131
+ this._fields.delete(name);
132
+ this._baseline.delete(name);
133
+
134
+ // Remove from layout
135
+ this._layout = this._removeFromLayout(this._layout, name);
136
+ }
137
+ getData() {
138
+ const data = {};
139
+ for (const [name, field] of this._fields) {
140
+ data[name] = toJS(field.getValue());
141
+ }
142
+ return data;
143
+ }
144
+ setData(data) {
145
+ for (const [name, value] of Object.entries(data)) {
146
+ const field = this._fields.get(name);
147
+ if (field) {
148
+ field.setValueSilent(value);
149
+ }
150
+ }
151
+ this._snapshotBaseline();
152
+ this._resetAllValidation();
153
+ this._submitted = false;
154
+ this._isValid = null;
155
+ this._errors = [];
156
+ }
157
+ reset() {
158
+ for (const [name, field] of this._fields) {
159
+ const baselineValue = this._baseline.get(name);
160
+ field.setValueSilent(baselineValue ?? field.config.defaultValue ?? null);
161
+ }
162
+ this._resetAllValidation();
163
+ this._submitted = false;
164
+ this._isValid = null;
165
+ this._errors = [];
166
+ }
167
+ get isDirty() {
168
+ for (const [name, field] of this._fields) {
169
+ const baseline = this._baseline.get(name);
170
+ const current = field.getValue();
171
+ if (!Object.is(toJS(current), toJS(baseline))) {
172
+ return true;
173
+ }
174
+ }
175
+ return false;
176
+ }
177
+ get isValid() {
178
+ return this._isValid;
179
+ }
180
+ get errors() {
181
+ return this._errors;
182
+ }
183
+ async validate() {
184
+ const errors = [];
185
+ for (const [, field] of this._fields) {
186
+ const valid = await field.validate();
187
+ if (!valid) {
188
+ errors.push({
189
+ path: field.name,
190
+ label: field.config.label,
191
+ message: field.vm.validation.message || "Invalid value."
192
+ });
193
+ }
194
+ }
195
+ const isValid = errors.length === 0;
196
+ runInAction(() => {
197
+ this._errors = errors;
198
+ this._isValid = isValid;
199
+ this._submitted = true;
200
+ });
201
+ return isValid;
202
+ }
203
+ async submit() {
204
+ const valid = await this.validate();
205
+ if (!valid) {
206
+ return false;
207
+ }
208
+ return this.getData();
209
+ }
210
+ get vm() {
211
+ return {
212
+ layout: this._resolveLayout(),
213
+ errors: this._errors,
214
+ isDirty: this.isDirty,
215
+ isValid: this._isValid
216
+ };
217
+ }
218
+ getField(name) {
219
+ return this._fields.get(name);
220
+ }
221
+ getFields() {
222
+ return this._fields;
223
+ }
224
+ _resolveLayout() {
225
+ return this._layout.map(node => this._resolveLayoutNode(node)).filter(Boolean);
226
+ }
227
+ _resolveLayoutNode(node) {
228
+ switch (node.type) {
229
+ case "row":
230
+ return this._resolveRowNode(node);
231
+ case "separator":
232
+ return this._resolveSeparatorNode();
233
+ case "tabs":
234
+ return this._resolveTabsNode(node);
235
+ case "element":
236
+ return this._resolveElementNode(node);
237
+ case "object":
238
+ // ObjectNode rendering deferred to Phase 6
239
+ return null;
240
+ default:
241
+ return null;
242
+ }
243
+ }
244
+ _resolveRowNode(node) {
245
+ const fields = node.fieldIds.map(id => this._fields.get(id)).filter(f => f !== undefined && f.visible).map(f => f.vm);
246
+ if (fields.length === 0) {
247
+ return null;
248
+ }
249
+ return {
250
+ type: "row",
251
+ fields
252
+ };
253
+ }
254
+ _resolveSeparatorNode() {
255
+ return {
256
+ type: "separator"
257
+ };
258
+ }
259
+ _resolveTabsNode(node) {
260
+ if (node.tabs.length === 0) {
261
+ return null;
262
+ }
263
+ const tabKey = node.id || this._tabsNodeKey(node);
264
+ const tabs = node.tabs.map(tab => ({
265
+ id: tab.id,
266
+ label: tab.label,
267
+ description: tab.description,
268
+ icon: tab.icon,
269
+ hasErrors: this._tabHasErrors(tab.layout),
270
+ layout: tab.layout.map(child => this._resolveLayoutNode(child)).filter(Boolean)
271
+ }));
272
+ if (tabs.length === 0) {
273
+ return null;
274
+ }
275
+
276
+ // Resolve active tab — fall back to first tab if stored value is invalid
277
+ const storedActive = this._activeTabs.get(tabKey);
278
+ const validActive = tabs.find(t => t.id === storedActive) ? storedActive : tabs[0].id;
279
+ return {
280
+ type: "tabs",
281
+ id: node.id,
282
+ tabs,
283
+ activeTabId: validActive,
284
+ setActiveTab: id => {
285
+ this._activeTabs.set(tabKey, id);
286
+ }
287
+ };
288
+ }
289
+ _resolveElementNode(node) {
290
+ return {
291
+ type: "element",
292
+ renderer: node.renderer,
293
+ props: node.props
294
+ };
295
+ }
296
+ _tabHasErrors(layout) {
297
+ const fieldIds = this._collectFieldIdsFromLayout(layout);
298
+ for (const id of fieldIds) {
299
+ const field = this._fields.get(id);
300
+ if (field && field.vm.validation.isValid === false) {
301
+ return true;
302
+ }
303
+ }
304
+ return false;
305
+ }
306
+ _collectFieldIdsFromLayout(layout) {
307
+ const ids = [];
308
+ for (const node of layout) {
309
+ if (node.type === "row") {
310
+ ids.push(...node.fieldIds);
311
+ } else if (node.type === "tabs") {
312
+ for (const tab of node.tabs) {
313
+ ids.push(...this._collectFieldIdsFromLayout(tab.layout));
314
+ }
315
+ }
316
+ }
317
+ return ids;
318
+ }
319
+ _tabsNodeKey(node) {
320
+ return `__tabs_${node.tabs.map(t => t.id).join("_")}`;
321
+ }
322
+ _generateDefaultLayout() {
323
+ const layout = [];
324
+ for (const [name, field] of this._fields) {
325
+ if (field.visible) {
326
+ layout.push({
327
+ type: "row",
328
+ fieldIds: [name]
329
+ });
330
+ }
331
+ }
332
+ return layout;
333
+ }
334
+ _warnOrphanFields() {
335
+ const layoutFieldIds = new Set(this._collectFieldIdsFromLayout(this._layout));
336
+ for (const [name, field] of this._fields) {
337
+ if (field.visible && !layoutFieldIds.has(name)) {
338
+ console.warn(`[FormModel] Field "${name}" is not in the layout and not marked as .hidden(). ` + `Add it to the layout or mark it as .hidden() to suppress this warning.`);
339
+ }
340
+ }
341
+ }
342
+ _snapshotBaseline() {
343
+ this._baseline.clear();
344
+ for (const [name, field] of this._fields) {
345
+ this._baseline.set(name, toJS(field.getValue()));
346
+ }
347
+ }
348
+ _resetAllValidation() {
349
+ for (const [, field] of this._fields) {
350
+ field.resetValidation();
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Find the index of a layout node that matches the given target.
356
+ * Matches: row containing fieldId, tabs by id, element by id/renderer.
357
+ * Returns -1 if not found.
358
+ */
359
+ _findLayoutIndex(layout, target) {
360
+ return layout.findIndex(node => this._nodeMatchesTarget(node, target));
361
+ }
362
+ _nodeMatchesTarget(node, target) {
363
+ switch (node.type) {
364
+ case "row":
365
+ return node.fieldIds.includes(target);
366
+ case "tabs":
367
+ return node.id === target;
368
+ case "element":
369
+ return node.id === target || node.renderer === target;
370
+ default:
371
+ return false;
372
+ }
373
+ }
374
+
375
+ /**
376
+ * Remove a target from the layout tree. Handles field IDs in rows,
377
+ * and node IDs for tabs/elements. Drops rows that become empty.
378
+ */
379
+ _removeFromLayout(layout, target) {
380
+ return layout.map(node => {
381
+ if (node.type === "row") {
382
+ const filtered = node.fieldIds.filter(id => id !== target);
383
+ if (filtered.length === 0) {
384
+ return null;
385
+ }
386
+ return {
387
+ ...node,
388
+ fieldIds: filtered
389
+ };
390
+ }
391
+ // Remove tabs/elements by their ID
392
+ if (node.type === "tabs" && node.id === target || node.type === "element" && (node.id === target || node.renderer === target)) {
393
+ return null;
394
+ }
395
+ return node;
396
+ }).filter(Boolean);
397
+ }
398
+
399
+ /**
400
+ * Insert a layout node relative to a target field ID.
401
+ */
402
+ _insertIntoLayout(layout, node, position) {
403
+ const targetIndex = this._findLayoutIndex(layout, position.target);
404
+ if (targetIndex === -1) {
405
+ // Target not found — append
406
+ return [...layout, node];
407
+ }
408
+ const result = [...layout];
409
+ switch (position.type) {
410
+ case "before":
411
+ result.splice(targetIndex, 0, node);
412
+ break;
413
+ case "after":
414
+ result.splice(targetIndex + 1, 0, node);
415
+ break;
416
+ case "replace":
417
+ result.splice(targetIndex, 1, node);
418
+ break;
419
+ }
420
+ return result;
421
+ }
422
+ _createModifierLayoutAPI(removals) {
423
+ return {
424
+ row(...fieldIds) {
425
+ const node = {
426
+ type: "row",
427
+ fieldIds
428
+ };
429
+ return createLayoutNodeHandle(node);
430
+ },
431
+ separator() {
432
+ const node = {
433
+ type: "separator"
434
+ };
435
+ return createLayoutNodeHandle(node);
436
+ },
437
+ tabs(config) {
438
+ const node = {
439
+ type: "tabs",
440
+ id: config.id,
441
+ tabs: config.tabs
442
+ };
443
+ return createLayoutNodeHandle(node);
444
+ },
445
+ element(renderer, props) {
446
+ const node = {
447
+ type: "element",
448
+ renderer,
449
+ props
450
+ };
451
+ return createLayoutNodeHandle(node);
452
+ },
453
+ remove(target) {
454
+ removals.push(target);
455
+ }
456
+ };
457
+ }
458
+ _accessLayoutNode(nodeId) {
459
+ const findTabsNode = layout => {
460
+ for (const node of layout) {
461
+ if (node.type === "tabs" && node.id === nodeId) {
462
+ return node;
463
+ }
464
+ // Search inside nested tabs
465
+ if (node.type === "tabs") {
466
+ for (const tab of node.tabs) {
467
+ const found = findTabsNode(tab.layout);
468
+ if (found) {
469
+ return found;
470
+ }
471
+ }
472
+ }
473
+ }
474
+ return undefined;
475
+ };
476
+ return {
477
+ as: type => {
478
+ const tabsNode = findTabsNode(this._layout);
479
+ if (!tabsNode) {
480
+ throw new Error(`Layout node "${nodeId}" not found.`);
481
+ }
482
+ if (tabsNode.type !== type) {
483
+ throw new Error(`Layout node "${nodeId}" is type "${tabsNode.type}", not "${type}".`);
484
+ }
485
+ return {
486
+ tab: definitionOrId => {
487
+ if (typeof definitionOrId === "string") {
488
+ // Access existing tab
489
+ const tab = tabsNode.tabs.find(t => t.id === definitionOrId);
490
+ if (!tab) {
491
+ throw new Error(`Tab "${definitionOrId}" not found in tabs node "${nodeId}".`);
492
+ }
493
+ return {
494
+ layout: factory => {
495
+ const nodes = factory(layoutAPI);
496
+ tab.layout.push(...nodes);
497
+ },
498
+ before: () => {
499
+ /* no-op for existing tabs */
500
+ },
501
+ after: () => {
502
+ /* no-op for existing tabs */
503
+ }
504
+ };
505
+ } else {
506
+ // Add new tab
507
+ const newTab = {
508
+ ...definitionOrId
509
+ };
510
+ // Resolve layout if it's a factory
511
+ if (typeof definitionOrId.layout === "function") {
512
+ newTab.layout = definitionOrId.layout(layoutAPI);
513
+ }
514
+ return {
515
+ layout: factory => {
516
+ newTab.layout = factory(layoutAPI);
517
+ },
518
+ before: targetTabId => {
519
+ const idx = tabsNode.tabs.findIndex(t => t.id === targetTabId);
520
+ if (idx !== -1) {
521
+ tabsNode.tabs.splice(idx, 0, newTab);
522
+ } else {
523
+ tabsNode.tabs.push(newTab);
524
+ }
525
+ },
526
+ after: targetTabId => {
527
+ const idx = tabsNode.tabs.findIndex(t => t.id === targetTabId);
528
+ if (idx !== -1) {
529
+ tabsNode.tabs.splice(idx + 1, 0, newTab);
530
+ } else {
531
+ tabsNode.tabs.push(newTab);
532
+ }
533
+ }
534
+ };
535
+ }
536
+ }
537
+ };
538
+ }
539
+ };
540
+ }
541
+ _isPositionedNode(entry) {
542
+ return "node" in entry;
543
+ }
544
+ }
545
+ function createLayoutNodeHandle(node) {
546
+ const handle = {
547
+ node,
548
+ before(target) {
549
+ handle.position = {
550
+ type: "before",
551
+ target
552
+ };
553
+ return handle;
554
+ },
555
+ after(target) {
556
+ handle.position = {
557
+ type: "after",
558
+ target
559
+ };
560
+ return handle;
561
+ },
562
+ replace(target) {
563
+ handle.position = {
564
+ type: "replace",
565
+ target
566
+ };
567
+ return handle;
568
+ }
569
+ };
570
+ return handle;
571
+ }
572
+
573
+ //# sourceMappingURL=FormModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["makeAutoObservable","computed","toJS","runInAction","observable","Field","createFieldBuilderRegistry","layoutAPI","row","fieldIds","type","separator","tabs","config","id","element","renderer","props","FormModel","_fields","Map","_layout","_baseline","_submitted","_validateOnChange","_isValid","_errors","_activeTabs","map","constructor","registry","builders","fields","name","builder","Object","entries","fieldConfig","build","field","setForm","set","layout","_warnOrphanFields","_generateDefaultLayout","validateOnSubmit","_snapshotBaseline","vm","autoBind","get","Error","factory","undefined","removeField","factoryOrNodeId","_accessLayoutNode","removals","modifierLayoutAPI","_createModifierLayoutAPI","target","_removeFromLayout","entry","_isPositionedNode","node","position","_insertIntoLayout","push","delete","getData","data","getValue","setData","value","setValueSilent","_resetAllValidation","reset","baselineValue","defaultValue","isDirty","baseline","current","is","isValid","errors","validate","valid","path","label","message","validation","length","submit","_resolveLayout","getField","getFields","_resolveLayoutNode","filter","Boolean","_resolveRowNode","_resolveSeparatorNode","_resolveTabsNode","_resolveElementNode","f","visible","tabKey","_tabsNodeKey","tab","description","icon","hasErrors","_tabHasErrors","child","storedActive","validActive","find","t","activeTabId","setActiveTab","_collectFieldIdsFromLayout","ids","join","layoutFieldIds","Set","has","console","warn","clear","resetValidation","_findLayoutIndex","findIndex","_nodeMatchesTarget","includes","filtered","targetIndex","result","splice","createLayoutNodeHandle","remove","nodeId","findTabsNode","found","as","tabsNode","definitionOrId","nodes","before","after","newTab","targetTabId","idx","handle","replace"],"sources":["FormModel.ts"],"sourcesContent":["import { makeAutoObservable, computed, toJS, runInAction, observable } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { createFieldBuilderRegistry } from \"./FieldBuilder.js\";\nimport type {\n IFormModel,\n IField,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IFormVM,\n IFormError,\n IFormModelConfig,\n ILayoutBuilder,\n ILayoutNodeHandle,\n ILayoutModifier,\n IPositionedLayoutNode,\n ILayoutNodeAccessHandle,\n ITabsHandle,\n ITabHandle,\n LayoutNode,\n LayoutPosition,\n LayoutNodeVM,\n IRowNode,\n IRowNodeVM,\n ISeparatorNode,\n ISeparatorNodeVM,\n ITabsNode,\n ITabsNodeVM,\n ITabDefinition,\n ITabDefinitionVM,\n IElementNode,\n IElementNodeVM\n} from \"./abstractions.js\";\n\nconst layoutAPI: ILayoutBuilder = {\n row(...fieldIds: string[]): IRowNode {\n return { type: \"row\", fieldIds };\n },\n separator(): ISeparatorNode {\n return { type: \"separator\" };\n },\n tabs(config: { id?: string; tabs: ITabDefinition[] }): ITabsNode {\n return { type: \"tabs\", id: config.id, tabs: config.tabs };\n },\n element(renderer: string, props?: Record<string, unknown>): IElementNode {\n return { type: \"element\", renderer, props };\n }\n};\n\nexport class FormModel implements IFormModel {\n private _fields = new Map<string, Field>();\n private _layout: LayoutNode[] = [];\n private _baseline = new Map<string, unknown>();\n private _submitted = false;\n private _validateOnChange = false;\n private _isValid: boolean | null = null;\n private _errors: IFormError[] = [];\n private _activeTabs = observable.map<string, string>();\n\n constructor(config: IFormModelConfig) {\n const registry = createFieldBuilderRegistry();\n const builders = config.fields(registry);\n\n // Build fields from builders\n for (const [name, builder] of Object.entries(builders)) {\n const fieldConfig = builder.build(name);\n const field = new Field(fieldConfig);\n field.setForm(this);\n this._fields.set(name, field);\n }\n\n // Build layout\n if (config.layout) {\n this._layout = config.layout(layoutAPI);\n this._warnOrphanFields();\n } else {\n this._layout = this._generateDefaultLayout();\n }\n\n // Validation strategy\n this._validateOnChange = config.validateOnSubmit === false;\n\n // Snapshot baseline from defaults\n this._snapshotBaseline();\n\n makeAutoObservable(\n this,\n {\n vm: computed\n },\n { autoBind: true }\n );\n }\n\n field(name: string): IField {\n // Try exact match first (supports dotted field names like \"properties.language\").\n const field = this._fields.get(name);\n\n if (!field) {\n throw new Error(`Field \"${name}\" not found.`);\n }\n\n return field;\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n const registry = createFieldBuilderRegistry();\n const builders = factory(registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n // undefined = remove\n this.removeField(name);\n continue;\n }\n\n const fieldConfig = builder.build(name);\n const field = new Field(fieldConfig);\n field.setForm(this);\n\n // Replace or add — same operation on the map\n this._fields.set(name, field);\n }\n\n // Re-snapshot baseline to include new fields\n this._snapshotBaseline();\n }\n\n layout(factory: (layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[]): void;\n layout(nodeId: string): ILayoutNodeAccessHandle;\n layout(\n factoryOrNodeId:\n | ((layout: ILayoutModifier) => (LayoutNode | IPositionedLayoutNode)[])\n | string\n ): void | ILayoutNodeAccessHandle {\n if (typeof factoryOrNodeId === \"string\") {\n return this._accessLayoutNode(factoryOrNodeId);\n }\n\n const factory = factoryOrNodeId;\n const removals: string[] = [];\n const modifierLayoutAPI = this._createModifierLayoutAPI(removals);\n\n const entries = factory(modifierLayoutAPI);\n\n // Process removals first\n for (const target of removals) {\n this._layout = this._removeFromLayout(this._layout, target);\n }\n\n // Process additions with positional modifiers\n for (const entry of entries) {\n if (this._isPositionedNode(entry)) {\n const { node, position } = entry;\n if (position) {\n this._layout = this._insertIntoLayout(this._layout, node, position);\n } else {\n this._layout.push(node);\n }\n } else {\n this._layout.push(entry);\n }\n }\n }\n\n removeField(name: string): void {\n this._fields.delete(name);\n this._baseline.delete(name);\n\n // Remove from layout\n this._layout = this._removeFromLayout(this._layout, name);\n }\n\n getData(): Record<string, unknown> {\n const data: Record<string, unknown> = {};\n for (const [name, field] of this._fields) {\n data[name] = toJS(field.getValue());\n }\n return data;\n }\n\n setData(data: Record<string, unknown>): void {\n for (const [name, value] of Object.entries(data)) {\n const field = this._fields.get(name);\n if (field) {\n field.setValueSilent(value);\n }\n }\n this._snapshotBaseline();\n this._resetAllValidation();\n this._submitted = false;\n this._isValid = null;\n this._errors = [];\n }\n\n reset(): void {\n for (const [name, field] of this._fields) {\n const baselineValue = this._baseline.get(name);\n field.setValueSilent(baselineValue ?? field.config.defaultValue ?? null);\n }\n this._resetAllValidation();\n this._submitted = false;\n this._isValid = null;\n this._errors = [];\n }\n\n get isDirty(): boolean {\n for (const [name, field] of this._fields) {\n const baseline = this._baseline.get(name);\n const current = field.getValue();\n if (!Object.is(toJS(current), toJS(baseline))) {\n return true;\n }\n }\n return false;\n }\n\n get isValid(): boolean | null {\n return this._isValid;\n }\n\n get errors(): IFormError[] {\n return this._errors;\n }\n\n async validate(): Promise<boolean> {\n const errors: IFormError[] = [];\n\n for (const [, field] of this._fields) {\n const valid = await field.validate();\n if (!valid) {\n errors.push({\n path: field.name,\n label: field.config.label,\n message: field.vm.validation.message || \"Invalid value.\"\n });\n }\n }\n\n const isValid = errors.length === 0;\n runInAction(() => {\n this._errors = errors;\n this._isValid = isValid;\n this._submitted = true;\n });\n return isValid;\n }\n\n async submit<T = Record<string, unknown>>(): Promise<T | false> {\n const valid = await this.validate();\n if (!valid) {\n return false;\n }\n return this.getData() as T;\n }\n\n get vm(): IFormVM {\n return {\n layout: this._resolveLayout(),\n errors: this._errors,\n isDirty: this.isDirty,\n isValid: this._isValid\n };\n }\n\n getField(name: string): Field | undefined {\n return this._fields.get(name);\n }\n\n getFields(): Map<string, Field> {\n return this._fields;\n }\n\n private _resolveLayout(): LayoutNodeVM[] {\n return this._layout\n .map(node => this._resolveLayoutNode(node))\n .filter(Boolean) as LayoutNodeVM[];\n }\n\n private _resolveLayoutNode(node: LayoutNode): LayoutNodeVM | null {\n switch (node.type) {\n case \"row\":\n return this._resolveRowNode(node);\n case \"separator\":\n return this._resolveSeparatorNode();\n case \"tabs\":\n return this._resolveTabsNode(node);\n case \"element\":\n return this._resolveElementNode(node);\n case \"object\":\n // ObjectNode rendering deferred to Phase 6\n return null;\n default:\n return null;\n }\n }\n\n private _resolveRowNode(node: IRowNode): IRowNodeVM | null {\n const fields = node.fieldIds\n .map(id => this._fields.get(id))\n .filter((f): f is Field => f !== undefined && f.visible)\n .map(f => f.vm);\n\n if (fields.length === 0) {\n return null;\n }\n\n return { type: \"row\", fields };\n }\n\n private _resolveSeparatorNode(): ISeparatorNodeVM {\n return { type: \"separator\" };\n }\n\n private _resolveTabsNode(node: ITabsNode): ITabsNodeVM | null {\n if (node.tabs.length === 0) {\n return null;\n }\n\n const tabKey = node.id || this._tabsNodeKey(node);\n\n const tabs: ITabDefinitionVM[] = node.tabs.map(tab => ({\n id: tab.id,\n label: tab.label,\n description: tab.description,\n icon: tab.icon,\n hasErrors: this._tabHasErrors(tab.layout),\n layout: tab.layout\n .map(child => this._resolveLayoutNode(child))\n .filter(Boolean) as LayoutNodeVM[]\n }));\n\n if (tabs.length === 0) {\n return null;\n }\n\n // Resolve active tab — fall back to first tab if stored value is invalid\n const storedActive = this._activeTabs.get(tabKey);\n const validActive = tabs.find(t => t.id === storedActive) ? storedActive! : tabs[0].id;\n\n return {\n type: \"tabs\",\n id: node.id,\n tabs,\n activeTabId: validActive,\n setActiveTab: (id: string) => {\n this._activeTabs.set(tabKey, id);\n }\n };\n }\n\n private _resolveElementNode(node: IElementNode): IElementNodeVM {\n return {\n type: \"element\",\n renderer: node.renderer,\n props: node.props\n };\n }\n\n private _tabHasErrors(layout: LayoutNode[]): boolean {\n const fieldIds = this._collectFieldIdsFromLayout(layout);\n for (const id of fieldIds) {\n const field = this._fields.get(id);\n if (field && field.vm.validation.isValid === false) {\n return true;\n }\n }\n return false;\n }\n\n private _collectFieldIdsFromLayout(layout: LayoutNode[]): string[] {\n const ids: string[] = [];\n for (const node of layout) {\n if (node.type === \"row\") {\n ids.push(...node.fieldIds);\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n ids.push(...this._collectFieldIdsFromLayout(tab.layout));\n }\n }\n }\n return ids;\n }\n\n private _tabsNodeKey(node: ITabsNode): string {\n return `__tabs_${node.tabs.map(t => t.id).join(\"_\")}`;\n }\n\n private _generateDefaultLayout(): LayoutNode[] {\n const layout: LayoutNode[] = [];\n for (const [name, field] of this._fields) {\n if (field.visible) {\n layout.push({ type: \"row\", fieldIds: [name] });\n }\n }\n return layout;\n }\n\n private _warnOrphanFields(): void {\n const layoutFieldIds = new Set(this._collectFieldIdsFromLayout(this._layout));\n\n for (const [name, field] of this._fields) {\n if (field.visible && !layoutFieldIds.has(name)) {\n console.warn(\n `[FormModel] Field \"${name}\" is not in the layout and not marked as .hidden(). ` +\n `Add it to the layout or mark it as .hidden() to suppress this warning.`\n );\n }\n }\n }\n\n private _snapshotBaseline(): void {\n this._baseline.clear();\n for (const [name, field] of this._fields) {\n this._baseline.set(name, toJS(field.getValue()));\n }\n }\n\n private _resetAllValidation(): void {\n for (const [, field] of this._fields) {\n field.resetValidation();\n }\n }\n\n /**\n * Find the index of a layout node that matches the given target.\n * Matches: row containing fieldId, tabs by id, element by id/renderer.\n * Returns -1 if not found.\n */\n private _findLayoutIndex(layout: LayoutNode[], target: string): number {\n return layout.findIndex(node => this._nodeMatchesTarget(node, target));\n }\n\n private _nodeMatchesTarget(node: LayoutNode, target: string): boolean {\n switch (node.type) {\n case \"row\":\n return node.fieldIds.includes(target);\n case \"tabs\":\n return node.id === target;\n case \"element\":\n return node.id === target || node.renderer === target;\n default:\n return false;\n }\n }\n\n /**\n * Remove a target from the layout tree. Handles field IDs in rows,\n * and node IDs for tabs/elements. Drops rows that become empty.\n */\n private _removeFromLayout(layout: LayoutNode[], target: string): LayoutNode[] {\n return layout\n .map(node => {\n if (node.type === \"row\") {\n const filtered = node.fieldIds.filter(id => id !== target);\n if (filtered.length === 0) {\n return null;\n }\n return { ...node, fieldIds: filtered };\n }\n // Remove tabs/elements by their ID\n if (\n (node.type === \"tabs\" && node.id === target) ||\n (node.type === \"element\" && (node.id === target || node.renderer === target))\n ) {\n return null;\n }\n return node;\n })\n .filter(Boolean) as LayoutNode[];\n }\n\n /**\n * Insert a layout node relative to a target field ID.\n */\n private _insertIntoLayout(\n layout: LayoutNode[],\n node: LayoutNode,\n position: LayoutPosition\n ): LayoutNode[] {\n const targetIndex = this._findLayoutIndex(layout, position.target);\n\n if (targetIndex === -1) {\n // Target not found — append\n return [...layout, node];\n }\n\n const result = [...layout];\n\n switch (position.type) {\n case \"before\":\n result.splice(targetIndex, 0, node);\n break;\n case \"after\":\n result.splice(targetIndex + 1, 0, node);\n break;\n case \"replace\":\n result.splice(targetIndex, 1, node);\n break;\n }\n\n return result;\n }\n\n private _createModifierLayoutAPI(removals: string[]): ILayoutModifier {\n return {\n row(...fieldIds: string[]): ILayoutNodeHandle {\n const node: IRowNode = { type: \"row\", fieldIds };\n return createLayoutNodeHandle(node);\n },\n separator(): ILayoutNodeHandle {\n const node: ISeparatorNode = { type: \"separator\" };\n return createLayoutNodeHandle(node);\n },\n tabs(config: { id?: string; tabs: ITabDefinition[] }): ILayoutNodeHandle {\n const node: ITabsNode = { type: \"tabs\", id: config.id, tabs: config.tabs };\n return createLayoutNodeHandle(node);\n },\n element(renderer: string, props?: Record<string, unknown>): ILayoutNodeHandle {\n const node: IElementNode = { type: \"element\", renderer, props };\n return createLayoutNodeHandle(node);\n },\n remove(target: string): void {\n removals.push(target);\n }\n };\n }\n\n private _accessLayoutNode(nodeId: string): ILayoutNodeAccessHandle {\n const findTabsNode = (layout: LayoutNode[]): ITabsNode | undefined => {\n for (const node of layout) {\n if (node.type === \"tabs\" && node.id === nodeId) {\n return node;\n }\n // Search inside nested tabs\n if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n const found = findTabsNode(tab.layout);\n if (found) {\n return found;\n }\n }\n }\n }\n return undefined;\n };\n\n return {\n as: (type: \"tabs\"): ITabsHandle => {\n const tabsNode = findTabsNode(this._layout);\n if (!tabsNode) {\n throw new Error(`Layout node \"${nodeId}\" not found.`);\n }\n if (tabsNode.type !== type) {\n throw new Error(\n `Layout node \"${nodeId}\" is type \"${tabsNode.type}\", not \"${type}\".`\n );\n }\n\n return {\n tab: (definitionOrId: ITabDefinition | string): ITabHandle => {\n if (typeof definitionOrId === \"string\") {\n // Access existing tab\n const tab = tabsNode.tabs.find(t => t.id === definitionOrId);\n if (!tab) {\n throw new Error(\n `Tab \"${definitionOrId}\" not found in tabs node \"${nodeId}\".`\n );\n }\n return {\n layout: (factory: (layout: ILayoutBuilder) => LayoutNode[]) => {\n const nodes = factory(layoutAPI);\n tab.layout.push(...nodes);\n },\n before: () => {\n /* no-op for existing tabs */\n },\n after: () => {\n /* no-op for existing tabs */\n }\n };\n } else {\n // Add new tab\n const newTab: ITabDefinition = { ...definitionOrId };\n // Resolve layout if it's a factory\n if (typeof (definitionOrId as any).layout === \"function\") {\n newTab.layout = (definitionOrId as any).layout(layoutAPI);\n }\n return {\n layout: (factory: (layout: ILayoutBuilder) => LayoutNode[]) => {\n newTab.layout = factory(layoutAPI);\n },\n before: (targetTabId: string) => {\n const idx = tabsNode.tabs.findIndex(t => t.id === targetTabId);\n if (idx !== -1) {\n tabsNode.tabs.splice(idx, 0, newTab);\n } else {\n tabsNode.tabs.push(newTab);\n }\n },\n after: (targetTabId: string) => {\n const idx = tabsNode.tabs.findIndex(t => t.id === targetTabId);\n if (idx !== -1) {\n tabsNode.tabs.splice(idx + 1, 0, newTab);\n } else {\n tabsNode.tabs.push(newTab);\n }\n }\n };\n }\n }\n };\n }\n };\n }\n\n private _isPositionedNode(\n entry: LayoutNode | IPositionedLayoutNode\n ): entry is IPositionedLayoutNode {\n return \"node\" in entry;\n }\n}\n\nfunction createLayoutNodeHandle(node: LayoutNode): ILayoutNodeHandle {\n const handle: ILayoutNodeHandle = {\n node,\n before(target: string): IPositionedLayoutNode {\n handle.position = { type: \"before\", target };\n return handle;\n },\n after(target: string): IPositionedLayoutNode {\n handle.position = { type: \"after\", target };\n return handle;\n },\n replace(target: string): IPositionedLayoutNode {\n handle.position = { type: \"replace\", target };\n return handle;\n }\n };\n return handle;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};