@webiny/app-admin 0.0.0-unstable.9f53ea597d → 0.0.0-unstable.a4f3e4ea8b

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 (100) hide show
  1. package/base/Admin.js +5 -0
  2. package/base/Admin.js.map +1 -1
  3. package/base/Base/DefaultFieldRenderers.js +4 -0
  4. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/AutoCompleteRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/AutoCompleteRenderer.js +29 -0
  7. package/base/Base/FieldRenderers/AutoCompleteRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/LexicalRenderer.js +10 -6
  9. package/base/Base/FieldRenderers/LexicalRenderer.js.map +1 -1
  10. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js +20 -3
  11. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone/MultiValueDynamicZone.js.map +1 -1
  12. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +11 -2
  13. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -1
  14. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +2 -1
  15. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  16. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +11 -2
  17. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
  18. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +17 -2
  19. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -1
  20. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +3 -2
  21. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -1
  22. package/base/Base/FieldRenderers/SelectRenderer.js +3 -2
  23. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  24. package/components/Drawers/DrawerParamsContext.d.ts +6 -0
  25. package/components/Drawers/DrawerParamsContext.js +10 -0
  26. package/components/Drawers/DrawerParamsContext.js.map +1 -0
  27. package/components/Drawers/DrawersContext.d.ts +13 -0
  28. package/components/Drawers/DrawersContext.js +50 -0
  29. package/components/Drawers/DrawersContext.js.map +1 -0
  30. package/components/Drawers/useDrawers.d.ts +2 -0
  31. package/components/Drawers/useDrawers.js +10 -0
  32. package/components/Drawers/useDrawers.js.map +1 -0
  33. package/components/LexicalEditor/LexicalLinkForm.js +3 -0
  34. package/components/LexicalEditor/LexicalLinkForm.js.map +1 -1
  35. package/components/Wcp.d.ts +0 -2
  36. package/components/Wcp.js +1 -6
  37. package/components/Wcp.js.map +1 -1
  38. package/config/AdminConfig/Drawer.d.ts +10 -0
  39. package/config/AdminConfig/Drawer.js +19 -0
  40. package/config/AdminConfig/Drawer.js.map +1 -0
  41. package/config/AdminConfig.d.ts +4 -0
  42. package/config/AdminConfig.js +3 -0
  43. package/config/AdminConfig.js.map +1 -1
  44. package/features/dateFormatter/DefaultDateFormatter.d.ts +8 -0
  45. package/features/dateFormatter/DefaultDateFormatter.js +25 -0
  46. package/features/dateFormatter/DefaultDateFormatter.js.map +1 -0
  47. package/features/dateFormatter/abstractions.d.ts +13 -0
  48. package/features/dateFormatter/abstractions.js +5 -0
  49. package/features/dateFormatter/abstractions.js.map +1 -0
  50. package/features/dateFormatter/feature.d.ts +3 -0
  51. package/features/dateFormatter/feature.js +17 -0
  52. package/features/dateFormatter/feature.js.map +1 -0
  53. package/features/dateFormatter/formatUtcOffset.d.ts +1 -0
  54. package/features/dateFormatter/formatUtcOffset.js +11 -0
  55. package/features/dateFormatter/formatUtcOffset.js.map +1 -0
  56. package/features/dateFormatter/index.d.ts +4 -0
  57. package/features/dateFormatter/index.js +4 -0
  58. package/features/dateFormatter/useDateFormatter.d.ts +5 -0
  59. package/features/dateFormatter/useDateFormatter.js +8 -0
  60. package/features/dateFormatter/useDateFormatter.js.map +1 -0
  61. package/features/formModel/Field.d.ts +1 -0
  62. package/features/formModel/Field.js +17 -0
  63. package/features/formModel/Field.js.map +1 -1
  64. package/features/formModel/FocusManager.js +10 -3
  65. package/features/formModel/FocusManager.js.map +1 -1
  66. package/features/formModel/FormModel.js +7 -9
  67. package/features/formModel/FormModel.js.map +1 -1
  68. package/features/formModel/FormModel.test.js +244 -0
  69. package/features/formModel/FormModel.test.js.map +1 -1
  70. package/features/formModel/ObjectField.d.ts +1 -0
  71. package/features/formModel/ObjectField.js +25 -0
  72. package/features/formModel/ObjectField.js.map +1 -1
  73. package/features/formModel/abstractions.d.ts +2 -0
  74. package/features/formModel/abstractions.js.map +1 -1
  75. package/features/formModel/createFieldRenderer.d.ts +42 -0
  76. package/features/formModel/createFieldRenderer.js +34 -10
  77. package/features/formModel/createFieldRenderer.js.map +1 -1
  78. package/features/formModel/hasSubtreeFocusRequest.d.ts +12 -0
  79. package/features/formModel/hasSubtreeFocusRequest.js +15 -0
  80. package/features/formModel/hasSubtreeFocusRequest.js.map +1 -0
  81. package/features/formModel/index.d.ts +1 -0
  82. package/features/formModel/index.js +1 -0
  83. package/features/formModel/renderers.d.ts +1 -0
  84. package/features/formModel/renderers.js +1 -0
  85. package/features/wcp/ReactLicense.d.ts +0 -1
  86. package/features/wcp/ReactLicense.js +0 -3
  87. package/features/wcp/ReactLicense.js.map +1 -1
  88. package/features/wcp/WcpGateway.js +0 -3
  89. package/features/wcp/WcpGateway.js.map +1 -1
  90. package/hooks/index.d.ts +3 -0
  91. package/hooks/index.js +3 -0
  92. package/hooks/useDrawer.d.ts +9 -0
  93. package/hooks/useDrawer.js +19 -0
  94. package/hooks/useDrawer.js.map +1 -0
  95. package/hooks/useOpenDrawer.d.ts +7 -0
  96. package/hooks/useOpenDrawer.js +18 -0
  97. package/hooks/useOpenDrawer.js.map +1 -0
  98. package/index.d.ts +5 -0
  99. package/index.js +12 -8
  100. package/package.json +19 -19
@@ -0,0 +1,13 @@
1
+ export type FormattableDate = Date | string | number;
2
+ export interface IDateFormatter {
3
+ /**
4
+ * Formats an absolute date/time as a locale string. Pass `options` to override the defaults for
5
+ * a specific call; change the defaults globally by decorating this abstraction.
6
+ */
7
+ format(date: FormattableDate, options?: Intl.DateTimeFormatOptions): string;
8
+ }
9
+ export declare const DateFormatter: import("@webiny/di").Abstraction<IDateFormatter>;
10
+ export declare namespace DateFormatter {
11
+ type Interface = IDateFormatter;
12
+ type Value = FormattableDate;
13
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const DateFormatter = createAbstraction("DateFormatter");
3
+ export { DateFormatter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/dateFormatter/abstractions.js","sources":["../../../src/features/dateFormatter/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\nexport type FormattableDate = Date | string | number;\n\nexport interface IDateFormatter {\n /**\n * Formats an absolute date/time as a locale string. Pass `options` to override the defaults for\n * a specific call; change the defaults globally by decorating this abstraction.\n */\n format(date: FormattableDate, options?: Intl.DateTimeFormatOptions): string;\n}\n\nexport const DateFormatter = createAbstraction<IDateFormatter>(\"DateFormatter\");\n\nexport namespace DateFormatter {\n export type Interface = IDateFormatter;\n export type Value = FormattableDate;\n}\n"],"names":["DateFormatter","createAbstraction"],"mappings":";AAYO,MAAMA,gBAAgBC,kBAAkC"}
@@ -0,0 +1,3 @@
1
+ export declare const DateFormatterFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ formatter: import("./abstractions.js").IDateFormatter;
3
+ }, []>;
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { DateFormatter } from "./abstractions.js";
3
+ import { DefaultDateFormatter } from "./DefaultDateFormatter.js";
4
+ const DateFormatterFeature = createFeature({
5
+ name: "DateFormatter",
6
+ register (container) {
7
+ container.register(DefaultDateFormatter).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ formatter: container.resolve(DateFormatter)
12
+ };
13
+ }
14
+ });
15
+ export { DateFormatterFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/dateFormatter/feature.js","sources":["../../../src/features/dateFormatter/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { DateFormatter } from \"./abstractions.js\";\nimport { DefaultDateFormatter } from \"./DefaultDateFormatter.js\";\n\nexport const DateFormatterFeature = createFeature({\n name: \"DateFormatter\",\n register(container) {\n container.register(DefaultDateFormatter).inSingletonScope();\n },\n resolve(container) {\n return {\n formatter: container.resolve(DateFormatter)\n };\n }\n});\n"],"names":["DateFormatterFeature","createFeature","container","DefaultDateFormatter","DateFormatter"],"mappings":";;;AAIO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,sBAAsB,gBAAgB;IAC7D;IACA,SAAQD,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACE;QACjC;IACJ;AACJ"}
@@ -0,0 +1 @@
1
+ export declare function formatUtcOffset(): string;
@@ -0,0 +1,11 @@
1
+ function formatUtcOffset() {
2
+ const offset = -new Date().getTimezoneOffset();
3
+ const sign = offset >= 0 ? "+" : "-";
4
+ const abs = Math.abs(offset);
5
+ const hours = String(Math.floor(abs / 60)).padStart(2, "0");
6
+ const minutes = String(abs % 60).padStart(2, "0");
7
+ return `UTC${sign}${hours}:${minutes}`;
8
+ }
9
+ export { formatUtcOffset };
10
+
11
+ //# sourceMappingURL=formatUtcOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/dateFormatter/formatUtcOffset.js","sources":["../../../src/features/dateFormatter/formatUtcOffset.ts"],"sourcesContent":["export function formatUtcOffset(): string {\n const offset = -new Date().getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const abs = Math.abs(offset);\n const hours = String(Math.floor(abs / 60)).padStart(2, \"0\");\n const minutes = String(abs % 60).padStart(2, \"0\");\n return `UTC${sign}${hours}:${minutes}`;\n}\n"],"names":["formatUtcOffset","offset","Date","sign","abs","Math","hours","String","minutes"],"mappings":"AAAO,SAASA;IACZ,MAAMC,SAAS,CAAC,IAAIC,OAAO,iBAAiB;IAC5C,MAAMC,OAAOF,UAAU,IAAI,MAAM;IACjC,MAAMG,MAAMC,KAAK,GAAG,CAACJ;IACrB,MAAMK,QAAQC,OAAOF,KAAK,KAAK,CAACD,MAAM,KAAK,QAAQ,CAAC,GAAG;IACvD,MAAMI,UAAUD,OAAOH,MAAM,IAAI,QAAQ,CAAC,GAAG;IAC7C,OAAO,CAAC,GAAG,EAAED,OAAOG,MAAM,CAAC,EAAEE,SAAS;AAC1C"}
@@ -0,0 +1,4 @@
1
+ export * from "./abstractions.js";
2
+ export * from "./DefaultDateFormatter.js";
3
+ export * from "./feature.js";
4
+ export * from "./useDateFormatter.js";
@@ -0,0 +1,4 @@
1
+ export * from "./abstractions.js";
2
+ export * from "./DefaultDateFormatter.js";
3
+ export * from "./feature.js";
4
+ export * from "./useDateFormatter.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Resolves the shared DateFormatter for components that have no presenter of their own. Prefer
3
+ * formatting in a presenter's view model where one exists.
4
+ */
5
+ export declare function useDateFormatter(): import("./abstractions.js").IDateFormatter;
@@ -0,0 +1,8 @@
1
+ import { useFeature } from "@webiny/app";
2
+ import { DateFormatterFeature } from "./feature.js";
3
+ function useDateFormatter() {
4
+ return useFeature(DateFormatterFeature).formatter;
5
+ }
6
+ export { useDateFormatter };
7
+
8
+ //# sourceMappingURL=useDateFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/dateFormatter/useDateFormatter.js","sources":["../../../src/features/dateFormatter/useDateFormatter.ts"],"sourcesContent":["import { useFeature } from \"@webiny/app\";\nimport { DateFormatterFeature } from \"./feature.js\";\n\n/**\n * Resolves the shared DateFormatter for components that have no presenter of their own. Prefer\n * formatting in a presenter's view model where one exists.\n */\nexport function useDateFormatter() {\n return useFeature(DateFormatterFeature).formatter;\n}\n"],"names":["useDateFormatter","useFeature","DateFormatterFeature"],"mappings":";;AAOO,SAASA;IACZ,OAAOC,WAAWC,sBAAsB,SAAS;AACrD"}
@@ -46,6 +46,7 @@ export declare class Field implements IField {
46
46
  setVisible(value: boolean): void;
47
47
  setAncestorRules(rules: IRule[]): void;
48
48
  setValidation(validation: IFieldValidation): void;
49
+ setValidationWithCache(validation: IFieldValidation, value: unknown, result: boolean): void;
49
50
  resetValidation(): void;
50
51
  addBeforeChange(cb: BeforeChangeCallback): void;
51
52
  addAfterChange(cb: AfterChangeCallback): void;
@@ -173,6 +173,11 @@ class Field {
173
173
  setValidation(validation) {
174
174
  this._validation = validation;
175
175
  }
176
+ setValidationWithCache(validation, value, result) {
177
+ this._validation = validation;
178
+ this._validationCacheKey = this._serializeValue(value);
179
+ this._validationCache = result;
180
+ }
176
181
  resetValidation() {
177
182
  this._validation = {
178
183
  isValid: null
@@ -268,6 +273,7 @@ class Field {
268
273
  const required = this._resolveRequired().required;
269
274
  return {
270
275
  name: this.config.name,
276
+ qualifiedName: this._qualifiedName,
271
277
  type: this.config.type,
272
278
  label: this.config.label,
273
279
  help: this.config.help,
@@ -364,6 +370,17 @@ class Field {
364
370
  return false;
365
371
  }
366
372
  }
373
+ if (!requiredState.required && null == effectiveValue) {
374
+ const cacheKey = this._serializeValue(effectiveValue);
375
+ runInAction(()=>{
376
+ this._validation = {
377
+ isValid: null
378
+ };
379
+ this._validationCacheKey = cacheKey;
380
+ this._validationCache = true;
381
+ });
382
+ return true;
383
+ }
367
384
  if (this.config.schema) {
368
385
  const result = await this.config.schema.safeParseAsync(effectiveValue);
369
386
  if (!result.success) {
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n if (this._parentPath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${this._parentPath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this._qualifiedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","resolved","rule","scoped","rules","runInAction","validation","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","result","firstIssue","JSON","String","Math"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/Field.js","sources":["../../../src/features/formModel/Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n IRule,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback,\n RequiredWhenCallback,\n HiddenWhenCallback,\n DisabledWhenCallback,\n ComputedFieldCallback,\n IFieldCallbackParams,\n IFieldNavigator,\n IFieldScope\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\n */\nclass FieldScope implements IFieldScope {\n constructor(\n private _form: IFormModel,\n private _path: string\n ) {}\n\n field(name: string): IField {\n const path = this._path ? `${this._path}.${name}` : name;\n return this._form.field(path);\n }\n\n parent(): IFieldScope {\n if (!this._path) {\n throw new Error(\"Cannot navigate above root level.\");\n }\n const segments = this._path.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nclass FieldNavigator implements IFieldNavigator {\n constructor(\n private _form: IFormModel,\n private _qualifiedName: string\n ) {}\n\n parent(): IFieldScope {\n const segments = this._qualifiedName.split(\".\");\n segments.pop();\n return new FieldScope(this._form, segments.join(\".\"));\n }\n}\n\nexport class Field implements IField {\n private _value: unknown;\n private _validation: IFieldValidation = { isValid: null };\n private _disabled: boolean;\n private _hidden: boolean;\n private _beforeChangeCallbacks: BeforeChangeCallback[] = [];\n private _afterChangeCallbacks: AfterChangeCallback[] = [];\n private _afterSetValueCallbacks: AfterSetValueCallback[] = [];\n private _onBlurCallbacks: OnBlurCallback[] = [];\n private _requiredWhenCallbacks: RequiredWhenCallback[] = [];\n private _hiddenWhenCallbacks: HiddenWhenCallback[] = [];\n private _disabledWhenCallbacks: DisabledWhenCallback[] = [];\n private _computed: ComputedFieldCallback | null = null;\n private _computedUntilDirty: ComputedFieldCallback | null = null;\n /** Set once a computedUntilDirty field receives its first user edit. */\n private _computedOverridden = false;\n private _validating = false;\n private _validationCacheKey: string | undefined = undefined;\n private _validationCache: boolean | undefined = undefined;\n private _isUIChange = false;\n private _focusRequested = false;\n private _qualifiedName: string = \"\";\n private _parentPath: string = \"\";\n private _form: IFormModel | null = null;\n private _ancestorRules: IRule[] = [];\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._qualifiedName = config.name;\n const defaultValue =\n typeof config.defaultValue === \"function\"\n ? (config.defaultValue as () => unknown)()\n : config.defaultValue;\n this._value = defaultValue ?? (config.isList ? [] : null);\n this._disabled = config.disabled;\n this._hidden = config.hidden;\n\n if (config.beforeChangeCallbacks) {\n this._beforeChangeCallbacks = [...config.beforeChangeCallbacks];\n }\n if (config.afterChangeCallbacks) {\n this._afterChangeCallbacks = [...config.afterChangeCallbacks];\n }\n if (config.afterSetValueCallbacks) {\n this._afterSetValueCallbacks = [...config.afterSetValueCallbacks];\n }\n if (config.onBlurCallbacks) {\n this._onBlurCallbacks = [...config.onBlurCallbacks];\n }\n if (config.requiredWhenCallbacks) {\n this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];\n }\n if (config.hiddenWhenCallbacks) {\n this._hiddenWhenCallbacks = [...config.hiddenWhenCallbacks];\n }\n if (config.disabledWhenCallbacks) {\n this._disabledWhenCallbacks = [...config.disabledWhenCallbacks];\n }\n if (config.computed) {\n this._computed = config.computed;\n } else if (config.computedUntilDirty) {\n this._computedUntilDirty = config.computedUntilDirty;\n }\n\n makeAutoObservable(this, {\n config: false,\n vm: computed\n });\n }\n\n get name(): string {\n return this.config.name;\n }\n\n get type(): string {\n return this.config.type;\n }\n\n getValue<T = unknown>(): T {\n if (this._computed && this._form) {\n return this._computed(this._callbackParams()) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._callbackParams()) as T;\n }\n return this._value as T;\n }\n\n /**\n * Set value with beforeChange/afterChange pipeline.\n * beforeChange always runs (pure transform).\n * afterChange only fires when value actually changed.\n */\n setValue(raw: unknown): void {\n let transformed = this.config.normalizeValue\n ? this._applyNormalizeValue(raw, this.config.normalizeValue)\n : raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._callbackParams());\n }\n\n if (transformed === this._value) {\n return;\n }\n\n const wasComputed = this._computedUntilDirty && !this._computedOverridden && this._form;\n const computedValue = wasComputed\n ? this._computedUntilDirty!(this._callbackParams())\n : undefined;\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n if (!wasComputed || transformed !== computedValue) {\n this._computedOverridden = true;\n }\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._callbackParams());\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._callbackParams());\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData() and reset().\n */\n setValueSilent(value: unknown): void {\n const parsed = this.config.normalizeValue\n ? this._applyNormalizeValue(value, this.config.normalizeValue)\n : value;\n this._value = parsed;\n if (this._computedUntilDirty) {\n if (parsed === null || parsed === undefined) {\n this._computedOverridden = false;\n } else if (this._form) {\n const computedValue = this._computedUntilDirty(this._callbackParams());\n this._computedOverridden = parsed !== computedValue;\n } else {\n this._computedOverridden = true;\n }\n }\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n private _evaluateRules(): { visible: boolean; disabled: boolean } {\n if (!this._form) {\n return { visible: true, disabled: false };\n }\n const own = this.config.rules ?? [];\n const all = [...this._ancestorRules, ...own];\n if (all.length === 0) {\n return { visible: true, disabled: false };\n }\n if (this._parentPath) {\n const resolved = all.map(rule => {\n if (rule.target.startsWith(\"$.\")) {\n return { ...rule, target: `${this._parentPath}.${rule.target.slice(2)}` };\n }\n return rule;\n });\n return this._form.evaluateRules(resolved);\n }\n return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n if (this._form && this._hiddenWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._hiddenWhenCallbacks) {\n if (cb(scoped)) {\n return false;\n }\n }\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\n }\n if (this._form && this._disabledWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._disabledWhenCallbacks) {\n if (cb(scoped)) {\n return true;\n }\n }\n }\n return this._evaluateRules().disabled;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setAncestorRules(rules: IRule[]): void {\n runInAction(() => {\n this._ancestorRules = rules;\n });\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n setValidationWithCache(validation: IFieldValidation, value: unknown, result: boolean): void {\n this._validation = validation;\n this._validationCacheKey = this._serializeValue(value);\n this._validationCache = result;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\n this._validationCacheKey = undefined;\n this._validationCache = undefined;\n }\n\n addBeforeChange(cb: BeforeChangeCallback): void {\n this._beforeChangeCallbacks.push(cb);\n }\n\n addAfterChange(cb: AfterChangeCallback): void {\n this._afterChangeCallbacks.push(cb);\n }\n\n addAfterSetValue(cb: AfterSetValueCallback): void {\n this._afterSetValueCallbacks.push(cb);\n }\n\n addOnBlur(cb: OnBlurCallback): void {\n this._onBlurCallbacks.push(cb);\n }\n\n addRequiredWhen(fn: (params: IFieldCallbackParams) => boolean, message?: string): void {\n this._requiredWhenCallbacks.push({ fn, message });\n }\n\n setComputed(fn: ComputedFieldCallback): void {\n this._computed = fn;\n this._computedUntilDirty = null;\n this._computedOverridden = false;\n }\n\n setComputedUntilDirty(fn: ComputedFieldCallback): void {\n this._computedUntilDirty = fn;\n this._computed = null;\n this._computedOverridden = false;\n }\n\n /**\n * Effective `required` state — true if the built-in `.required()` flag is\n * set, or if any `requiredWhen()` callback returns `true` for the current\n * form state. The first truthy callback wins; its message is used.\n */\n resolveRequired(): { required: boolean; message?: string } {\n return this._resolveRequired();\n }\n\n private _resolveRequired(): { required: boolean; message?: string } {\n if (this.config.required) {\n return { required: true, message: this.config.requiredMessage };\n }\n if (this._form && this._requiredWhenCallbacks.length > 0) {\n const scoped = this._callbackParams();\n for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(scoped)) {\n return { required: true, message: cb.message };\n }\n }\n }\n return { required: false };\n }\n\n blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._callbackParams());\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._parentPath = parentPath || \"\";\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\n }\n\n private _callbackParams(): IFieldCallbackParams {\n if (!this._form) {\n throw new Error(\"Field not attached to a form.\");\n }\n return {\n field: new FieldNavigator(this._form, this._qualifiedName),\n form: this._form\n };\n }\n\n get qualifiedName(): string {\n return this._qualifiedName;\n }\n\n focus(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n this._form.focusField(this._qualifiedName);\n }\n\n requestFocus(): void {\n this._focusRequested = true;\n }\n\n clearFocusRequest(): void {\n this._focusRequested = false;\n }\n\n as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T] {\n if (this.config.type !== type) {\n throw new Error(\n `Field \"${this.config.name}\" is type \"${this.config.type}\", not \"${type}\".`\n );\n }\n return this as unknown as FieldTypeMap[T];\n }\n\n remove(): void {\n if (!this._form) {\n throw new Error(`Field \"${this.config.name}\" is not attached to a form.`);\n }\n (this._form as any).removeField(this.config.name);\n }\n\n get vm(): IFieldVM {\n const options = this._resolveOptions();\n const required = this._resolveRequired().required;\n\n return {\n name: this.config.name,\n qualifiedName: this._qualifiedName,\n type: this.config.type,\n label: this.config.label,\n help: this.config.help,\n description: this.config.description,\n note: this.config.note,\n placeholder: this.config.placeholder,\n value: this.getValue(),\n validation: this.visible ? this._validation : { isValid: null },\n validating: this._validating,\n required,\n visible: this.visible,\n disabled: this.disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n isList: !!this.config.isList,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => {\n if (this._form?.submitted) {\n void this.validate();\n }\n this.blur();\n },\n addItem: (value?: unknown) => this._addItem(value),\n removeItem: (index: number) => this._removeItem(index),\n focusRequested: this._focusRequested,\n clearFocusRequest: () => this.clearFocusRequest(),\n context: this._resolveContext()\n };\n }\n\n private _setValueFromUI(value: unknown): void {\n this._isUIChange = true;\n try {\n this.setValue(value);\n } finally {\n this._isUIChange = false;\n }\n }\n\n private _applyNormalizeValue(value: unknown, normalizeValue: (v: unknown) => unknown): unknown {\n if (this.config.isList && Array.isArray(value)) {\n return value.map(item => normalizeValue(item));\n }\n return normalizeValue(value);\n }\n\n private _addItem(value?: unknown): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI([...current, value ?? null]);\n }\n\n private _removeItem(index: number): void {\n const current = Array.isArray(this._value) ? this._value : [];\n this._setValueFromUI(current.filter((_: unknown, i: number) => i !== index));\n }\n\n private _resolveOptions(): IValueOption[] | undefined {\n if (!this.config.options) {\n return undefined;\n }\n if (typeof this.config.options === \"function\") {\n return this.config.options(this._callbackParams());\n }\n return this.config.options;\n }\n\n private _resolveContext(): Record<string, unknown> {\n if (!this.config.context || !this._form) {\n return {};\n }\n return this.config.context(this._callbackParams());\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n * Hidden fields are excluded from validation.\n *\n * Pass `{ force: true }` to bypass the memoization cache (used by\n * `form.validate()` / `form.submit()`). Blur-triggered validation\n * omits the flag so unchanged values return the cached result.\n */\n async validate(options?: { force?: boolean }): Promise<boolean> {\n if (!this.visible) {\n runInAction(() => {\n this._validation = { isValid: null };\n });\n return true;\n }\n\n const effectiveValue = this.getValue();\n\n // Memoization: return cached result when value hasn't changed.\n if (!options?.force && this._validationCache !== undefined) {\n const cacheKey = this._serializeValue(effectiveValue);\n if (this._validationCacheKey === cacheKey) {\n return this._validationCache;\n }\n }\n\n runInAction(() => {\n this._validating = true;\n });\n\n try {\n const requiredState = this._resolveRequired();\n\n // Required check\n if (requiredState.required) {\n const isEmpty =\n effectiveValue === null ||\n effectiveValue === undefined ||\n effectiveValue === \"\" ||\n (this.config.isList &&\n Array.isArray(effectiveValue) &&\n effectiveValue.length === 0);\n\n if (isEmpty) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: requiredState.message || \"This field is required.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n if (\n !requiredState.required &&\n (effectiveValue === null || effectiveValue === undefined)\n ) {\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: null };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(effectiveValue);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n this._validationCacheKey = cacheKey;\n this._validationCache = false;\n });\n return false;\n }\n }\n\n const cacheKey = this._serializeValue(effectiveValue);\n runInAction(() => {\n this._validation = { isValid: true };\n this._validationCacheKey = cacheKey;\n this._validationCache = true;\n });\n return true;\n } finally {\n runInAction(() => {\n this._validating = false;\n });\n }\n }\n\n private _serializeValue(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(Math.random());\n }\n }\n\n /** True if this field has any computed callback configured. */\n get isComputed(): boolean {\n return this._computed !== null || this._computedUntilDirty !== null;\n }\n\n /** True if a computedUntilDirty field has been overridden by user edit. */\n get isComputedOverridden(): boolean {\n return this._computedOverridden;\n }\n}\n"],"names":["FieldScope","_form","_path","name","path","Error","segments","FieldNavigator","_qualifiedName","Field","config","undefined","defaultValue","makeAutoObservable","computed","raw","transformed","cb","wasComputed","computedValue","value","parsed","own","all","resolved","rule","scoped","rules","runInAction","validation","result","fn","message","form","parentPath","type","options","required","index","normalizeValue","Array","item","current","_","i","effectiveValue","cacheKey","requiredState","isEmpty","firstIssue","JSON","String","Math"],"mappings":";AA0BA,MAAMA;IACF,YACYC,KAAiB,EACjBC,KAAa,CACvB;aAFUD,KAAK,GAALA;aACAC,KAAK,GAALA;IACT;IAEH,MAAMC,IAAY,EAAU;QACxB,MAAMC,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAED,MAAM,GAAGA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAACC;IAC5B;IAEA,SAAsB;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,EACX,MAAM,IAAIC,MAAM;QAEpB,MAAMC,WAAW,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAClCA,SAAS,GAAG;QACZ,OAAO,IAAIN,WAAW,IAAI,CAAC,KAAK,EAAEM,SAAS,IAAI,CAAC;IACpD;AACJ;AAEA,MAAMC;IACF,YACYN,KAAiB,EACjBO,cAAsB,CAChC;aAFUP,KAAK,GAALA;aACAO,cAAc,GAAdA;IACT;IAEH,SAAsB;QAClB,MAAMF,WAAW,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC3CA,SAAS,GAAG;QACZ,OAAO,IAAIN,WAAW,IAAI,CAAC,KAAK,EAAEM,SAAS,IAAI,CAAC;IACpD;AACJ;AAEO,MAAMG;IA4BT,YAAYC,MAAoB,CAAE;aA1B1B,WAAW,GAAqB;YAAE,SAAS;QAAK;aAGhD,sBAAsB,GAA2B,EAAE;aACnD,qBAAqB,GAA0B,EAAE;aACjD,uBAAuB,GAA4B,EAAE;aACrD,gBAAgB,GAAqB,EAAE;aACvC,sBAAsB,GAA2B,EAAE;aACnD,oBAAoB,GAAyB,EAAE;aAC/C,sBAAsB,GAA2B,EAAE;aACnD,SAAS,GAAiC;aAC1C,mBAAmB,GAAiC;QACU,KAC9D,mBAAmB,GAAG;aACtB,WAAW,GAAG;aACd,mBAAmB,GAAuBC;aAC1C,gBAAgB,GAAwBA;aACxC,WAAW,GAAG;aACd,eAAe,GAAG;aAClB,cAAc,GAAW;aACzB,WAAW,GAAW;aACtB,KAAK,GAAsB;aAC3B,cAAc,GAAY,EAAE;QAKhC,IAAI,CAAC,MAAM,GAAGD;QACd,IAAI,CAAC,cAAc,GAAGA,OAAO,IAAI;QACjC,MAAME,eACF,AAA+B,cAA/B,OAAOF,OAAO,YAAY,GACnBA,OAAO,YAAY,KACpBA,OAAO,YAAY;QAC7B,IAAI,CAAC,MAAM,GAAGE,gBAAiBF,CAAAA,OAAO,MAAM,GAAG,EAAE,GAAG,IAAG;QACvD,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ;QAChC,IAAI,CAAC,OAAO,GAAGA,OAAO,MAAM;QAE5B,IAAIA,OAAO,qBAAqB,EAC5B,IAAI,CAAC,sBAAsB,GAAG;eAAIA,OAAO,qBAAqB;SAAC;QAEnE,IAAIA,OAAO,oBAAoB,EAC3B,IAAI,CAAC,qBAAqB,GAAG;eAAIA,OAAO,oBAAoB;SAAC;QAEjE,IAAIA,OAAO,sBAAsB,EAC7B,IAAI,CAAC,uBAAuB,GAAG;eAAIA,OAAO,sBAAsB;SAAC;QAErE,IAAIA,OAAO,eAAe,EACtB,IAAI,CAAC,gBAAgB,GAAG;eAAIA,OAAO,eAAe;SAAC;QAEvD,IAAIA,OAAO,qBAAqB,EAC5B,IAAI,CAAC,sBAAsB,GAAG;eAAIA,OAAO,qBAAqB;SAAC;QAEnE,IAAIA,OAAO,mBAAmB,EAC1B,IAAI,CAAC,oBAAoB,GAAG;eAAIA,OAAO,mBAAmB;SAAC;QAE/D,IAAIA,OAAO,qBAAqB,EAC5B,IAAI,CAAC,sBAAsB,GAAG;eAAIA,OAAO,qBAAqB;SAAC;QAEnE,IAAIA,OAAO,QAAQ,EACf,IAAI,CAAC,SAAS,GAAGA,OAAO,QAAQ;aAC7B,IAAIA,OAAO,kBAAkB,EAChC,IAAI,CAAC,mBAAmB,GAAGA,OAAO,kBAAkB;QAGxDG,mBAAmB,IAAI,EAAE;YACrB,QAAQ;YACR,IAAIC;QACR;IACJ;IAEA,IAAI,OAAe;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;IAC3B;IAEA,IAAI,OAAe;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI;IAC3B;IAEA,WAA2B;QACvB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,EAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe;QAE9C,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,KAAK,EACnE,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe;QAExD,OAAO,IAAI,CAAC,MAAM;IACtB;IAOA,SAASC,GAAY,EAAQ;QACzB,IAAIC,cAAc,IAAI,CAAC,MAAM,CAAC,cAAc,GACtC,IAAI,CAAC,oBAAoB,CAACD,KAAK,IAAI,CAAC,MAAM,CAAC,cAAc,IACzDA;QACN,KAAK,MAAME,MAAM,IAAI,CAAC,sBAAsB,CACxCD,cAAcC,GAAGD,aAAa,IAAI,CAAC,eAAe;QAGtD,IAAIA,gBAAgB,IAAI,CAAC,MAAM,EAC3B;QAGJ,MAAME,cAAc,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,KAAK;QACvF,MAAMC,gBAAgBD,cAChB,IAAI,CAAC,mBAAmB,CAAE,IAAI,CAAC,eAAe,MAC9CP;QAEN,IAAI,CAAC,MAAM,GAAGK;QACd,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,WAAW,EAC5C;YAAA,IAAI,CAACE,eAAeF,gBAAgBG,eAChC,IAAI,CAAC,mBAAmB,GAAG;QAC/B;QAGJ,KAAK,MAAMF,MAAM,IAAI,CAAC,qBAAqB,CACvCA,GAAGD,aAAa,IAAI,CAAC,eAAe;QAGxC,IAAI,CAAC,IAAI,CAAC,WAAW,EACjB,KAAK,MAAMC,MAAM,IAAI,CAAC,uBAAuB,CACzCA,GAAGD,aAAa,IAAI,CAAC,eAAe;IAGhD;IAKA,eAAeI,KAAc,EAAQ;QACjC,MAAMC,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc,GACnC,IAAI,CAAC,oBAAoB,CAACD,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,IAC3DA;QACN,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,IAAI,CAAC,mBAAmB,EACxB,IAAIA,QAAAA,QACA,IAAI,CAAC,mBAAmB,GAAG;aACxB,IAAI,IAAI,CAAC,KAAK,EAAE;YACnB,MAAMF,gBAAgB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe;YACnE,IAAI,CAAC,mBAAmB,GAAGE,WAAWF;QAC1C,OACI,IAAI,CAAC,mBAAmB,GAAG;IAGvC;IAEA,YAAYC,KAAc,EAAQ;QAC9B,IAAI,CAAC,SAAS,GAAGA;IACrB;IAEQ,iBAA0D;QAC9D,IAAI,CAAC,IAAI,CAAC,KAAK,EACX,OAAO;YAAE,SAAS;YAAM,UAAU;QAAM;QAE5C,MAAME,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACnC,MAAMC,MAAM;eAAI,IAAI,CAAC,cAAc;eAAKD;SAAI;QAC5C,IAAIC,AAAe,MAAfA,IAAI,MAAM,EACV,OAAO;YAAE,SAAS;YAAM,UAAU;QAAM;QAE5C,IAAI,IAAI,CAAC,WAAW,EAAE;YAClB,MAAMC,WAAWD,IAAI,GAAG,CAACE,CAAAA;gBACrB,IAAIA,KAAK,MAAM,CAAC,UAAU,CAAC,OACvB,OAAO;oBAAE,GAAGA,IAAI;oBAAE,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,EAAEA,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI;gBAAC;gBAE5E,OAAOA;YACX;YACA,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAACD;QACpC;QACA,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAACD;IACpC;IAEA,IAAI,UAAmB;QACnB,IAAI,IAAI,CAAC,OAAO,EACZ,OAAO;QAEX,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,GAAG,GAAG;YACpD,MAAMG,SAAS,IAAI,CAAC,eAAe;YACnC,KAAK,MAAMT,MAAM,IAAI,CAAC,oBAAoB,CACtC,IAAIA,GAAGS,SACH,OAAO;QAGnB;QACA,OAAO,IAAI,CAAC,cAAc,GAAG,OAAO;IACxC;IAEA,IAAI,WAAoB;QACpB,IAAI,IAAI,CAAC,SAAS,EACd,OAAO;QAEX,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,GAAG;YACtD,MAAMA,SAAS,IAAI,CAAC,eAAe;YACnC,KAAK,MAAMT,MAAM,IAAI,CAAC,sBAAsB,CACxC,IAAIA,GAAGS,SACH,OAAO;QAGnB;QACA,OAAO,IAAI,CAAC,cAAc,GAAG,QAAQ;IACzC;IAEA,WAAWN,KAAc,EAAQ;QAC7B,IAAI,CAAC,OAAO,GAAG,CAACA;IACpB;IAEA,iBAAiBO,KAAc,EAAQ;QACnCC,YAAY;YACR,IAAI,CAAC,cAAc,GAAGD;QAC1B;IACJ;IAEA,cAAcE,UAA4B,EAAQ;QAC9C,IAAI,CAAC,WAAW,GAAGA;IACvB;IAEA,uBAAuBA,UAA4B,EAAET,KAAc,EAAEU,MAAe,EAAQ;QACxF,IAAI,CAAC,WAAW,GAAGD;QACnB,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAACT;QAChD,IAAI,CAAC,gBAAgB,GAAGU;IAC5B;IAEA,kBAAwB;QACpB,IAAI,CAAC,WAAW,GAAG;YAAE,SAAS;QAAK;QACnC,IAAI,CAAC,mBAAmB,GAAGnB;QAC3B,IAAI,CAAC,gBAAgB,GAAGA;IAC5B;IAEA,gBAAgBM,EAAwB,EAAQ;QAC5C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAACA;IACrC;IAEA,eAAeA,EAAuB,EAAQ;QAC1C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAACA;IACpC;IAEA,iBAAiBA,EAAyB,EAAQ;QAC9C,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAACA;IACtC;IAEA,UAAUA,EAAkB,EAAQ;QAChC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAACA;IAC/B;IAEA,gBAAgBc,EAA6C,EAAEC,OAAgB,EAAQ;QACnF,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC;YAAED;YAAIC;QAAQ;IACnD;IAEA,YAAYD,EAAyB,EAAQ;QACzC,IAAI,CAAC,SAAS,GAAGA;QACjB,IAAI,CAAC,mBAAmB,GAAG;QAC3B,IAAI,CAAC,mBAAmB,GAAG;IAC/B;IAEA,sBAAsBA,EAAyB,EAAQ;QACnD,IAAI,CAAC,mBAAmB,GAAGA;QAC3B,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,mBAAmB,GAAG;IAC/B;IAOA,kBAA2D;QACvD,OAAO,IAAI,CAAC,gBAAgB;IAChC;IAEQ,mBAA4D;QAChE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EACpB,OAAO;YAAE,UAAU;YAAM,SAAS,IAAI,CAAC,MAAM,CAAC,eAAe;QAAC;QAElE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,sBAAsB,CAAC,MAAM,GAAG,GAAG;YACtD,MAAML,SAAS,IAAI,CAAC,eAAe;YACnC,KAAK,MAAMT,MAAM,IAAI,CAAC,sBAAsB,CACxC,IAAIA,GAAG,EAAE,CAACS,SACN,OAAO;gBAAE,UAAU;gBAAM,SAAST,GAAG,OAAO;YAAC;QAGzD;QACA,OAAO;YAAE,UAAU;QAAM;IAC7B;IAEA,OAAa;QACT,KAAK,MAAMA,MAAM,IAAI,CAAC,gBAAgB,CAClCA,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe;IAE5C;IAEA,QAAQgB,IAAgB,EAAEC,UAAmB,EAAQ;QACjD,IAAI,CAAC,KAAK,GAAGD;QACb,IAAI,CAAC,WAAW,GAAGC,cAAc;QACjC,IAAI,CAAC,cAAc,GAAGA,aAAa,GAAGA,WAAW,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;IAC7F;IAEQ,kBAAwC;QAC5C,IAAI,CAAC,IAAI,CAAC,KAAK,EACX,MAAM,IAAI7B,MAAM;QAEpB,OAAO;YACH,OAAO,IAAIE,eAAe,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc;YACzD,MAAM,IAAI,CAAC,KAAK;QACpB;IACJ;IAEA,IAAI,gBAAwB;QACxB,OAAO,IAAI,CAAC,cAAc;IAC9B;IAEA,QAAc;QACV,IAAI,CAAC,IAAI,CAAC,KAAK,EACX,MAAM,IAAIF,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;QAE5E,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc;IAC7C;IAEA,eAAqB;QACjB,IAAI,CAAC,eAAe,GAAG;IAC3B;IAEA,oBAA0B;QACtB,IAAI,CAAC,eAAe,GAAG;IAC3B;IAEA,GAAiC8B,IAAO,EAAmB;QACvD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAKA,MACrB,MAAM,IAAI9B,MACN,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE8B,KAAK,EAAE,CAAC;QAGnF,OAAO,IAAI;IACf;IAEA,SAAe;QACX,IAAI,CAAC,IAAI,CAAC,KAAK,EACX,MAAM,IAAI9B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC;QAE3E,IAAI,CAAC,KAAK,CAAS,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;IACpD;IAEA,IAAI,KAAe;QACf,MAAM+B,UAAU,IAAI,CAAC,eAAe;QACpC,MAAMC,WAAW,IAAI,CAAC,gBAAgB,GAAG,QAAQ;QAEjD,OAAO;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,eAAe,IAAI,CAAC,cAAc;YAClC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,OAAO,IAAI,CAAC,QAAQ;YACpB,YAAY,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,GAAG;gBAAE,SAAS;YAAK;YAC9D,YAAY,IAAI,CAAC,WAAW;YAC5BA;YACA,SAAS,IAAI,CAAC,OAAO;YACrB,UAAU,IAAI,CAAC,QAAQ;YACvB,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9B,kBAAkB,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC9C,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAC5BD;YACA,UAAU,CAAChB,QAAmB,IAAI,CAAC,eAAe,CAACA;YACnD,QAAQ;gBACJ,IAAI,IAAI,CAAC,KAAK,EAAE,WACP,IAAI,CAAC,QAAQ;gBAEtB,IAAI,CAAC,IAAI;YACb;YACA,SAAS,CAACA,QAAoB,IAAI,CAAC,QAAQ,CAACA;YAC5C,YAAY,CAACkB,QAAkB,IAAI,CAAC,WAAW,CAACA;YAChD,gBAAgB,IAAI,CAAC,eAAe;YACpC,mBAAmB,IAAM,IAAI,CAAC,iBAAiB;YAC/C,SAAS,IAAI,CAAC,eAAe;QACjC;IACJ;IAEQ,gBAAgBlB,KAAc,EAAQ;QAC1C,IAAI,CAAC,WAAW,GAAG;QACnB,IAAI;YACA,IAAI,CAAC,QAAQ,CAACA;QAClB,SAAU;YACN,IAAI,CAAC,WAAW,GAAG;QACvB;IACJ;IAEQ,qBAAqBA,KAAc,EAAEmB,cAAuC,EAAW;QAC3F,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAIC,MAAM,OAAO,CAACpB,QACpC,OAAOA,MAAM,GAAG,CAACqB,CAAAA,OAAQF,eAAeE;QAE5C,OAAOF,eAAenB;IAC1B;IAEQ,SAASA,KAAe,EAAQ;QACpC,MAAMsB,UAAUF,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAC7D,IAAI,CAAC,eAAe,CAAC;eAAIE;YAAStB,SAAS;SAAK;IACpD;IAEQ,YAAYkB,KAAa,EAAQ;QACrC,MAAMI,UAAUF,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAC7D,IAAI,CAAC,eAAe,CAACE,QAAQ,MAAM,CAAC,CAACC,GAAYC,IAAcA,MAAMN;IACzE;IAEQ,kBAA8C;QAClD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EACpB;QAEJ,IAAI,AAA+B,cAA/B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe;QAEnD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO;IAC9B;IAEQ,kBAA2C;QAC/C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EACnC,OAAO,CAAC;QAEZ,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe;IACnD;IAWA,MAAM,SAASF,OAA6B,EAAoB;QAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACfR,YAAY;gBACR,IAAI,CAAC,WAAW,GAAG;oBAAE,SAAS;gBAAK;YACvC;YACA,OAAO;QACX;QAEA,MAAMiB,iBAAiB,IAAI,CAAC,QAAQ;QAGpC,IAAI,CAACT,SAAS,SAAS,AAA0BzB,WAA1B,IAAI,CAAC,gBAAgB,EAAgB;YACxD,MAAMmC,WAAW,IAAI,CAAC,eAAe,CAACD;YACtC,IAAI,IAAI,CAAC,mBAAmB,KAAKC,UAC7B,OAAO,IAAI,CAAC,gBAAgB;QAEpC;QAEAlB,YAAY;YACR,IAAI,CAAC,WAAW,GAAG;QACvB;QAEA,IAAI;YACA,MAAMmB,gBAAgB,IAAI,CAAC,gBAAgB;YAG3C,IAAIA,cAAc,QAAQ,EAAE;gBACxB,MAAMC,UACFH,QAAAA,kBAEAA,AAAmB,OAAnBA,kBACC,IAAI,CAAC,MAAM,CAAC,MAAM,IACfL,MAAM,OAAO,CAACK,mBACdA,AAA0B,MAA1BA,eAAe,MAAM;gBAE7B,IAAIG,SAAS;oBACT,MAAMF,WAAW,IAAI,CAAC,eAAe,CAACD;oBACtCjB,YAAY;wBACR,IAAI,CAAC,WAAW,GAAG;4BACf,SAAS;4BACT,SAASmB,cAAc,OAAO,IAAI;wBACtC;wBACA,IAAI,CAAC,mBAAmB,GAAGD;wBAC3B,IAAI,CAAC,gBAAgB,GAAG;oBAC5B;oBACA,OAAO;gBACX;YACJ;YAEA,IACI,CAACC,cAAc,QAAQ,IACtBF,QAAAA,gBACH;gBACE,MAAMC,WAAW,IAAI,CAAC,eAAe,CAACD;gBACtCjB,YAAY;oBACR,IAAI,CAAC,WAAW,GAAG;wBAAE,SAAS;oBAAK;oBACnC,IAAI,CAAC,mBAAmB,GAAGkB;oBAC3B,IAAI,CAAC,gBAAgB,GAAG;gBAC5B;gBACA,OAAO;YACX;YAGA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACpB,MAAMhB,SAAS,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAACe;gBACvD,IAAI,CAACf,OAAO,OAAO,EAAE;oBACjB,MAAMmB,aAAanB,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE;oBACzC,MAAMgB,WAAW,IAAI,CAAC,eAAe,CAACD;oBACtCjB,YAAY;wBACR,IAAI,CAAC,WAAW,GAAG;4BACf,SAAS;4BACT,SAASqB,YAAY,WAAW;wBACpC;wBACA,IAAI,CAAC,mBAAmB,GAAGH;wBAC3B,IAAI,CAAC,gBAAgB,GAAG;oBAC5B;oBACA,OAAO;gBACX;YACJ;YAEA,MAAMA,WAAW,IAAI,CAAC,eAAe,CAACD;YACtCjB,YAAY;gBACR,IAAI,CAAC,WAAW,GAAG;oBAAE,SAAS;gBAAK;gBACnC,IAAI,CAAC,mBAAmB,GAAGkB;gBAC3B,IAAI,CAAC,gBAAgB,GAAG;YAC5B;YACA,OAAO;QACX,SAAU;YACNlB,YAAY;gBACR,IAAI,CAAC,WAAW,GAAG;YACvB;QACJ;IACJ;IAEQ,gBAAgBR,KAAc,EAAU;QAC5C,IAAI;YACA,OAAO8B,KAAK,SAAS,CAAC9B;QAC1B,EAAE,OAAM;YACJ,OAAO+B,OAAOC,KAAK,MAAM;QAC7B;IACJ;IAGA,IAAI,aAAsB;QACtB,OAAO,AAAmB,SAAnB,IAAI,CAAC,SAAS,IAAa,AAA6B,SAA7B,IAAI,CAAC,mBAAmB;IAC9D;IAGA,IAAI,uBAAgC;QAChC,OAAO,IAAI,CAAC,mBAAmB;IACnC;AACJ"}
@@ -62,15 +62,22 @@ class FocusManager {
62
62
  resolveChildScope(field, segments) {
63
63
  const nextSegment = segments[1];
64
64
  if (field.isList) {
65
- const index = parseInt(nextSegment, 10);
66
- if (!isNaN(index)) {
67
- const item = field.items[index];
65
+ if (/^\d+$/.test(nextSegment)) {
66
+ const item = field.items[parseInt(nextSegment, 10)];
68
67
  if (!item) return null;
69
68
  return {
70
69
  segments: segments.slice(2),
71
70
  children: item.children
72
71
  };
73
72
  }
73
+ const item = field.items.find((candidate)=>{
74
+ const idField = candidate.children.get("_id");
75
+ return idField ? idField.getValue() === nextSegment : false;
76
+ });
77
+ if (item) return {
78
+ segments: segments.slice(2),
79
+ children: item.children
80
+ };
74
81
  }
75
82
  return {
76
83
  segments: segments.slice(1),
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/FocusManager.js","sources":["../../../src/features/formModel/FocusManager.ts"],"sourcesContent":["import { isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport type { IField, IObjectField, LayoutNode, IObjectNode } from \"./abstractions.js\";\n\nexport interface TabActivation {\n tabKey: string;\n tabId: string;\n}\n\nexport class FocusManager {\n constructor(private _fields: Map<string, IField>) {}\n\n buildFocusPath(name: string, layout: LayoutNode[]): TabActivation[] | null {\n const segments = name.split(\".\");\n return this.walkLayout(layout, segments, this._fields);\n }\n\n private walkLayout(\n layout: LayoutNode[],\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n const target = segments[0];\n\n for (const node of layout) {\n switch (node.type) {\n case \"row\": {\n if (!node.fieldIds.includes(target)) {\n break;\n }\n return this.diveIntoField(target, segments, fieldScope);\n }\n case \"object\": {\n if (node.fieldName !== target) {\n break;\n }\n return this.diveIntoObjectNode(node, segments, fieldScope);\n }\n case \"tabs\": {\n const tabKey = node.id || LayoutBuilderFactory.tabsNodeKey(node);\n for (const tab of node.tabs) {\n const result = this.walkLayout(tab.layout, segments, fieldScope);\n if (result !== null) {\n return [{ tabKey, tabId: tab.id }, ...result];\n }\n }\n break;\n }\n }\n }\n return null;\n }\n\n private diveIntoField(\n fieldName: string,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = field.getInnerLayout();\n if (!inner) {\n return [];\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private diveIntoObjectNode(\n node: IObjectNode,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(node.fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = Array.isArray(node.inner)\n ? node.inner\n : field.activeTemplateId\n ? (node.inner[field.activeTemplateId] ?? null)\n : null;\n if (!inner) {\n const stored = field.getInnerLayout();\n if (!stored) {\n return [];\n }\n return this.walkLayout(stored, childScope.segments, childScope.children);\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private resolveChildScope(\n field: IObjectField,\n segments: string[]\n ): { segments: string[]; children: Map<string, IField> } | null {\n const nextSegment = segments[1];\n if (field.isList) {\n const index = parseInt(nextSegment, 10);\n if (!isNaN(index)) {\n const item = field.items[index];\n if (!item) {\n return null;\n }\n return { segments: segments.slice(2), children: item.children };\n }\n }\n return { segments: segments.slice(1), children: field.children };\n }\n}\n"],"names":["FocusManager","_fields","name","layout","segments","fieldScope","target","node","tabKey","LayoutBuilderFactory","tab","result","fieldName","field","isObjectField","childScope","inner","Array","stored","nextSegment","index","parseInt","isNaN","item"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/FocusManager.js","sources":["../../../src/features/formModel/FocusManager.ts"],"sourcesContent":["import { isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport type { IField, IObjectField, LayoutNode, IObjectNode } from \"./abstractions.js\";\n\nexport interface TabActivation {\n tabKey: string;\n tabId: string;\n}\n\nexport class FocusManager {\n constructor(private _fields: Map<string, IField>) {}\n\n buildFocusPath(name: string, layout: LayoutNode[]): TabActivation[] | null {\n const segments = name.split(\".\");\n return this.walkLayout(layout, segments, this._fields);\n }\n\n private walkLayout(\n layout: LayoutNode[],\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n const target = segments[0];\n\n for (const node of layout) {\n switch (node.type) {\n case \"row\": {\n if (!node.fieldIds.includes(target)) {\n break;\n }\n return this.diveIntoField(target, segments, fieldScope);\n }\n case \"object\": {\n if (node.fieldName !== target) {\n break;\n }\n return this.diveIntoObjectNode(node, segments, fieldScope);\n }\n case \"tabs\": {\n const tabKey = node.id || LayoutBuilderFactory.tabsNodeKey(node);\n for (const tab of node.tabs) {\n const result = this.walkLayout(tab.layout, segments, fieldScope);\n if (result !== null) {\n return [{ tabKey, tabId: tab.id }, ...result];\n }\n }\n break;\n }\n }\n }\n return null;\n }\n\n private diveIntoField(\n fieldName: string,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = field.getInnerLayout();\n if (!inner) {\n return [];\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private diveIntoObjectNode(\n node: IObjectNode,\n segments: string[],\n fieldScope: Map<string, IField>\n ): TabActivation[] | null {\n if (segments.length === 1) {\n return [];\n }\n const field = fieldScope.get(node.fieldName);\n if (!field || !isObjectField(field)) {\n return [];\n }\n const childScope = this.resolveChildScope(field, segments);\n if (!childScope) {\n return [];\n }\n const inner = Array.isArray(node.inner)\n ? node.inner\n : field.activeTemplateId\n ? (node.inner[field.activeTemplateId] ?? null)\n : null;\n if (!inner) {\n const stored = field.getInnerLayout();\n if (!stored) {\n return [];\n }\n return this.walkLayout(stored, childScope.segments, childScope.children);\n }\n return this.walkLayout(inner, childScope.segments, childScope.children);\n }\n\n private resolveChildScope(\n field: IObjectField,\n segments: string[]\n ): { segments: string[]; children: Map<string, IField> } | null {\n const nextSegment = segments[1];\n if (field.isList) {\n // A list field is followed by an item selector: a numeric index, or a stable\n // alphanumeric `_id` (matched against each item's hidden `_id` child value).\n if (/^\\d+$/.test(nextSegment)) {\n const item = field.items[parseInt(nextSegment, 10)];\n if (!item) {\n return null;\n }\n return { segments: segments.slice(2), children: item.children };\n }\n const item = field.items.find(candidate => {\n const idField = candidate.children.get(\"_id\");\n return idField ? idField.getValue() === nextSegment : false;\n });\n if (item) {\n return { segments: segments.slice(2), children: item.children };\n }\n // No item matched — treat the segment as a child field name (legacy locators).\n }\n return { segments: segments.slice(1), children: field.children };\n }\n}\n"],"names":["FocusManager","_fields","name","layout","segments","fieldScope","target","node","tabKey","LayoutBuilderFactory","tab","result","fieldName","field","isObjectField","childScope","inner","Array","stored","nextSegment","item","parseInt","candidate","idField"],"mappings":"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"}
@@ -89,15 +89,13 @@ class FormModel {
89
89
  let current = this._fields.get(parts[0]);
90
90
  for(let i = 1; i < parts.length && current; i++)if (isObjectField(current)) {
91
91
  if (current.isList) {
92
- const index = parseInt(parts[i], 10);
93
- if (!isNaN(index)) {
94
- const item = current.items[index];
95
- if (item && i + 1 < parts.length) {
96
- current = item.children.get(parts[i + 1]);
97
- i++;
98
- } else current = void 0;
99
- continue;
100
- }
92
+ const selector = parts[i];
93
+ const item = /^\d+$/.test(selector) ? current.items[parseInt(selector, 10)] : current.items.find((candidate)=>candidate.children.get("_id")?.getValue() === selector);
94
+ if (item && i + 1 < parts.length) {
95
+ current = item.children.get(parts[i + 1]);
96
+ i++;
97
+ } else current = void 0;
98
+ continue;
101
99
  }
102
100
  current = current.getChild(parts[i]);
103
101
  } else current = void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"features/formModel/FormModel.js","sources":["../../../src/features/formModel/FormModel.ts"],"sourcesContent":["import { makeAutoObservable, computed, toJS, runInAction, observable } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { ObjectField, isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport { LayoutMutator } from \"./LayoutMutator.js\";\nimport { LayoutResolver } from \"./LayoutResolver.js\";\nimport { FocusManager } from \"./FocusManager.js\";\nimport type {\n IFormModel,\n IField,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldConfig,\n IFormVM,\n IFormError,\n IFormModelConfig,\n ILayoutBuilder,\n ILayoutNodeBuilder,\n ILayoutModifier,\n IPositionedLayoutNode,\n ILayoutNodeAccessHandle,\n IRule,\n IRuleEvaluator,\n LayoutNode,\n LayoutNodeVM,\n FormRule,\n FormRuleFn\n} from \"./abstractions.js\";\n\nexport class FormModel implements IFormModel {\n private _fields = new Map<string, IField>();\n private _builders = new Map<string, IFieldBuilder>();\n private _layout: LayoutNode[] = [];\n private _baseline = new Map<string, unknown>();\n private _submitted = false;\n private _submitCount = 0;\n private _validateOnChange = false;\n private _isValid: boolean | null = null;\n private _formRuleErrors: IFormError[] = [];\n private _activeTabs = observable.map<string, string>();\n private _ruleEvaluators: IRuleEvaluator[] = [];\n private _warnedRuleTypes = new Set<string>();\n private _formRules: FormRule[] = [];\n private _lastFocusedField: IField | null = null;\n private _registry: IFieldBuilderRegistry;\n\n private _layoutMutator = new LayoutMutator();\n private _layoutResolver: LayoutResolver = null!;\n private _focusManager: FocusManager = null!;\n\n constructor(config: IFormModelConfig, registry: IFieldBuilderRegistry) {\n this._registry = registry;\n this._ruleEvaluators = config.ruleEvaluators ?? [];\n\n const builders = config.fields(registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n this._fields.set(name, field);\n }\n\n if (config.layout) {\n this._layout = LayoutBuilderFactory.buildNodes(\n config.layout(LayoutBuilderFactory.create())\n );\n this._warnOrphanFields();\n } else {\n this._layout = this._generateDefaultLayout();\n }\n\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n\n this._validateOnChange = config.validateOnSubmit === false;\n this._snapshotBaseline();\n\n makeAutoObservable(\n this,\n {\n vm: computed,\n _builders: false,\n _layoutMutator: false,\n _layoutResolver: false,\n _focusManager: false\n } as any,\n { autoBind: true }\n );\n\n this._layoutResolver = new LayoutResolver(\n this._fields,\n this._activeTabs,\n this.evaluateRules.bind(this)\n );\n this._focusManager = new FocusManager(this._fields);\n }\n\n evaluateRules(rules: IRule[] | undefined): { visible: boolean; disabled: boolean } {\n let visible = true;\n let disabled = false;\n if (!rules || rules.length === 0) {\n return { visible, disabled };\n }\n\n for (const rule of rules) {\n const evaluator = this._ruleEvaluators.find(e => e.canEvaluate(rule));\n if (!evaluator) {\n if (\n process.env.NODE_ENV === \"development\" &&\n !this._warnedRuleTypes.has(rule.type)\n ) {\n this._warnedRuleTypes.add(rule.type);\n console.warn(\n `[FormModel] No evaluator registered for rule type \"${rule.type}\". Rule is ignored.`\n );\n }\n continue;\n }\n const matched = evaluator.evaluate(rule, this);\n if (!matched) {\n continue;\n }\n if (rule.action === \"hide\") {\n visible = false;\n } else if (rule.action === \"disable\") {\n disabled = true;\n }\n }\n\n return { visible, disabled };\n }\n\n field(name: string): IField {\n const field = this._fields.get(name);\n if (field) {\n return field;\n }\n\n const parts = name.split(\".\");\n if (parts.length > 1) {\n let current: IField | undefined = this._fields.get(parts[0]);\n for (let i = 1; i < parts.length && current; i++) {\n if (isObjectField(current)) {\n if (current.isList) {\n const index = parseInt(parts[i], 10);\n if (!isNaN(index)) {\n const item = current.items[index];\n if (item && i + 1 < parts.length) {\n current = item.children.get(parts[i + 1]);\n i++;\n } else {\n current = undefined;\n }\n continue;\n }\n }\n current = current.getChild(parts[i]);\n } else {\n current = undefined;\n }\n }\n if (current) {\n return current;\n }\n }\n\n throw new Error(`Field \"${name}\" not found.`);\n }\n\n focusField(name: string): void {\n if (this._lastFocusedField) {\n this._lastFocusedField.clearFocusRequest();\n this._lastFocusedField = null;\n }\n\n const activations = this._focusManager.buildFocusPath(name, this._layout);\n let field: IField | undefined;\n try {\n field = this.field(name);\n } catch {\n // Field not found — no-op.\n }\n\n runInAction(() => {\n if (activations) {\n for (const act of activations) {\n this._activeTabs.set(act.tabKey, act.tabId);\n }\n }\n if (field) {\n field.requestFocus();\n this._lastFocusedField = field;\n }\n });\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n const builders = factory(this._registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._builders.delete(name);\n this.removeField(name);\n continue;\n }\n\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n\n this._fields.set(name, field);\n }\n\n this._snapshotBaseline();\n this._propagateAncestorRules();\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._layoutMutator.accessNode(this._layout, factoryOrNodeId);\n }\n\n this._layout = this._layoutMutator.applyModifications(this._layout, factoryOrNodeId);\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n removeField(name: string): void {\n this._fields.delete(name);\n this._baseline.delete(name);\n this._layout = this._layoutMutator.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 if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n }\n\n setData(data: Record<string, unknown>, options?: { dirty?: boolean }): 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 if (!options?.dirty) {\n this._snapshotBaseline();\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\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._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n }\n\n get isDirty(): boolean {\n for (const [name, field] of this._fields) {\n const baseline = this._baseline.get(name);\n const current = isObjectField(field) ? field.getData() : field.getValue();\n if (JSON.stringify(toJS(current)) !== JSON.stringify(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 submitted(): boolean {\n return this._submitted;\n }\n\n get submitCount(): number {\n return this._submitCount;\n }\n\n get errors(): IFormError[] {\n if (!this._submitted) {\n return [];\n }\n const ruleErrorPaths = new Set(this._formRuleErrors.filter(e => e.path).map(e => e.path));\n const errors: IFormError[] = [];\n\n const collectErrors = (\n fields: Map<string, IField>,\n pathPrefix: string,\n trail: string[]\n ) => {\n for (const [, field] of fields) {\n const path = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;\n const segment = field.config.label || field.name;\n if (isObjectField(field)) {\n if (!field.visible) {\n continue;\n }\n if (\n field.vm.validation.isValid === false &&\n field.vm.validation.message &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message\n });\n }\n const skipBreadcrumb =\n field.config.renderer === \"passthrough\" && !field.config.label;\n const childTrail = skipBreadcrumb ? trail : [...trail, segment];\n\n if (field.config.isList) {\n for (const [index, item] of field.items.entries()) {\n collectErrors(item.children, `${path}.${index}`, [...childTrail]);\n }\n } else {\n collectErrors(field.children, path, childTrail);\n }\n } else if (\n field.visible &&\n field.vm.validation.isValid === false &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message || \"Invalid value.\"\n });\n }\n }\n };\n\n collectErrors(this._fields, \"\", []);\n return [...errors, ...this._formRuleErrors];\n }\n\n addRule(rule: FormRule): void {\n this._formRules.push(rule);\n }\n\n setLayout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): void {\n this._layout = LayoutBuilderFactory.buildNodes(factory(LayoutBuilderFactory.create()));\n this._warnOrphanFields();\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n async validate(): Promise<boolean> {\n let allFieldsValid = true;\n\n for (const [, field] of this._fields) {\n const valid = await field.validate({ force: true });\n if (!valid) {\n allFieldsValid = false;\n }\n }\n\n const ruleErrors: IFormError[] = [];\n for (const rule of this._formRules) {\n const errors = await this._runFormRule(rule);\n for (const err of errors) {\n ruleErrors.push(err);\n if (err.path) {\n const target = this._tryGetField(err.path);\n if (target) {\n target.setValidation({ isValid: false, message: err.message });\n }\n }\n }\n }\n\n const isValid = allFieldsValid && ruleErrors.length === 0;\n runInAction(() => {\n this._formRuleErrors = ruleErrors;\n this._isValid = isValid;\n this._submitted = true;\n this._submitCount++;\n });\n return isValid;\n }\n\n async submit<T = Record<string, unknown>>(options?: {\n skipValidation?: boolean;\n }): Promise<T | false> {\n if (options?.skipValidation) {\n return this.getData() as T;\n }\n\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._layoutResolver.resolve(this._layout),\n errors: this.errors,\n hasErrors: this.errors.length > 0,\n isDirty: this.isDirty,\n isValid: this._isValid,\n submitCount: this._submitCount,\n focusField: (path: string) => this.focusField(path),\n getData: () => this.getData() as Record<string, unknown>,\n setData: (data: Record<string, unknown>, options?: { dirty?: boolean }) =>\n this.setData(data, options)\n };\n }\n\n get registry(): IFieldBuilderRegistry {\n return this._registry;\n }\n\n public resolveChildLayout(layout: LayoutNode[], children: Map<string, IField>): LayoutNodeVM[] {\n return this._layoutResolver.resolveChildLayout(layout, children);\n }\n\n getField(name: string): IField | undefined {\n return this._fields.get(name);\n }\n\n getFields(): Map<string, IField> {\n return this._fields;\n }\n\n getFieldBuilders(predicate?: (builder: IFieldBuilder) => boolean): IFieldBuilder[] {\n const pred = predicate ?? (() => true);\n const result: IFieldBuilder[] = [];\n LayoutBuilderFactory.collectBuilders(this._fields, this._builders, pred, result);\n return result;\n }\n\n traverse(callback: (builder: IFieldBuilder) => void): void {\n this._traverseBuilders(this._fields, this._builders, callback);\n }\n\n private _traverseBuilders(\n fields: { get(name: string): IField | undefined },\n builders: Map<string, IFieldBuilder> | Record<string, IFieldBuilder>,\n callback: (builder: IFieldBuilder) => void\n ): void {\n const entries = builders instanceof Map ? builders.entries() : Object.entries(builders);\n for (const [name, builder] of entries) {\n if (!builder || typeof builder !== \"object\") {\n continue;\n }\n callback(builder);\n const field = fields.get(name);\n if (field && isObjectField(field)) {\n this._traverseBuilders(field.children, field.config.childBuilders, callback);\n const templates = (field.config as IObjectFieldConfig).templates;\n if (templates) {\n for (const tpl of templates) {\n for (const tplBuilder of Object.values(tpl.childBuilders)) {\n if (!tplBuilder || typeof tplBuilder !== \"object\") {\n continue;\n }\n callback(tplBuilder);\n }\n }\n }\n }\n }\n }\n\n private async _runFormRule(rule: FormRule): Promise<IFormError[]> {\n if (typeof rule === \"function\") {\n const fn = rule as FormRuleFn;\n const result = await fn(this);\n return Array.isArray(result) ? result : [];\n }\n const data = this.getData();\n const result = await rule.safeParseAsync(data);\n if (result.success) {\n return [];\n }\n return result.error.issues.map(issue => {\n const path = issue.path.map(String).join(\".\");\n const field = path ? this._tryGetField(path) : undefined;\n return {\n path,\n label: field?.config.label,\n message: issue.message || \"Invalid value.\"\n };\n });\n }\n\n private _tryGetField(path: string): IField | undefined {\n try {\n return this.field(path);\n } catch {\n return undefined;\n }\n }\n\n private _registerObjectNodeLayouts(layout: LayoutNode[]): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const field = this._fields.get(node.fieldName);\n if (field && isObjectField(field)) {\n field.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._registerObjectNodeLayouts(tab.layout);\n }\n }\n }\n }\n\n private _propagateAncestorRules(): void {\n const ancestry = new Map<string, IRule[]>();\n const walk = (nodes: LayoutNode[], rules: IRule[]) => {\n for (const node of nodes) {\n if (node.type === \"row\") {\n for (const id of node.fieldIds) {\n const existing = ancestry.get(id) ?? [];\n ancestry.set(id, [...existing, ...rules]);\n }\n } else if (node.type === \"tabs\") {\n const containerRules = [...rules, ...(node.rules ?? [])];\n for (const tab of node.tabs) {\n const tabRules = [...containerRules, ...(tab.rules ?? [])];\n walk(tab.layout, tabRules);\n }\n } else if (node.type === \"object\") {\n const existing = ancestry.get(node.fieldName) ?? [];\n ancestry.set(node.fieldName, [...existing, ...rules]);\n }\n }\n };\n\n walk(this._layout, []);\n\n for (const [, field] of this._fields) {\n field.setAncestorRules(ancestry.get(field.name) ?? []);\n }\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(LayoutBuilderFactory.collectFieldIds(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 private _createField(config: any): IField {\n if (config.childBuilders) {\n return new ObjectField(config as IObjectFieldConfig);\n }\n return new Field(config);\n }\n}\n"],"names":["FormModel","config","registry","Map","observable","Set","LayoutMutator","builders","name","builder","Object","fieldConfig","field","LayoutBuilderFactory","makeAutoObservable","computed","LayoutResolver","FocusManager","rules","visible","disabled","rule","evaluator","e","process","console","matched","parts","current","i","isObjectField","index","parseInt","isNaN","item","undefined","Error","activations","runInAction","act","factory","factoryOrNodeId","data","toJS","options","value","baselineValue","baseline","JSON","ruleErrorPaths","errors","collectErrors","fields","pathPrefix","trail","path","segment","skipBreadcrumb","childTrail","allFieldsValid","valid","ruleErrors","err","target","isValid","layout","children","predicate","pred","result","callback","entries","templates","tpl","tplBuilder","fn","Array","issue","String","node","tab","ancestry","walk","nodes","id","existing","containerRules","tabRules","layoutFieldIds","ObjectField","Field"],"mappings":"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"}
1
+ {"version":3,"file":"features/formModel/FormModel.js","sources":["../../../src/features/formModel/FormModel.ts"],"sourcesContent":["import { makeAutoObservable, computed, toJS, runInAction, observable } from \"mobx\";\nimport { Field } from \"./Field.js\";\nimport { ObjectField, isObjectField } from \"./ObjectField.js\";\nimport { LayoutBuilderFactory } from \"./LayoutBuilderFactory.js\";\nimport { LayoutMutator } from \"./LayoutMutator.js\";\nimport { LayoutResolver } from \"./LayoutResolver.js\";\nimport { FocusManager } from \"./FocusManager.js\";\nimport type {\n IFormModel,\n IField,\n IFieldBuilder,\n IFieldBuilderRegistry,\n IObjectFieldConfig,\n IFormVM,\n IFormError,\n IFormModelConfig,\n ILayoutBuilder,\n ILayoutNodeBuilder,\n ILayoutModifier,\n IPositionedLayoutNode,\n ILayoutNodeAccessHandle,\n IRule,\n IRuleEvaluator,\n LayoutNode,\n LayoutNodeVM,\n FormRule,\n FormRuleFn\n} from \"./abstractions.js\";\n\nexport class FormModel implements IFormModel {\n private _fields = new Map<string, IField>();\n private _builders = new Map<string, IFieldBuilder>();\n private _layout: LayoutNode[] = [];\n private _baseline = new Map<string, unknown>();\n private _submitted = false;\n private _submitCount = 0;\n private _validateOnChange = false;\n private _isValid: boolean | null = null;\n private _formRuleErrors: IFormError[] = [];\n private _activeTabs = observable.map<string, string>();\n private _ruleEvaluators: IRuleEvaluator[] = [];\n private _warnedRuleTypes = new Set<string>();\n private _formRules: FormRule[] = [];\n private _lastFocusedField: IField | null = null;\n private _registry: IFieldBuilderRegistry;\n\n private _layoutMutator = new LayoutMutator();\n private _layoutResolver: LayoutResolver = null!;\n private _focusManager: FocusManager = null!;\n\n constructor(config: IFormModelConfig, registry: IFieldBuilderRegistry) {\n this._registry = registry;\n this._ruleEvaluators = config.ruleEvaluators ?? [];\n\n const builders = config.fields(registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n this._fields.set(name, field);\n }\n\n if (config.layout) {\n this._layout = LayoutBuilderFactory.buildNodes(\n config.layout(LayoutBuilderFactory.create())\n );\n this._warnOrphanFields();\n } else {\n this._layout = this._generateDefaultLayout();\n }\n\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n\n this._validateOnChange = config.validateOnSubmit === false;\n this._snapshotBaseline();\n\n makeAutoObservable(\n this,\n {\n vm: computed,\n _builders: false,\n _layoutMutator: false,\n _layoutResolver: false,\n _focusManager: false\n } as any,\n { autoBind: true }\n );\n\n this._layoutResolver = new LayoutResolver(\n this._fields,\n this._activeTabs,\n this.evaluateRules.bind(this)\n );\n this._focusManager = new FocusManager(this._fields);\n }\n\n evaluateRules(rules: IRule[] | undefined): { visible: boolean; disabled: boolean } {\n let visible = true;\n let disabled = false;\n if (!rules || rules.length === 0) {\n return { visible, disabled };\n }\n\n for (const rule of rules) {\n const evaluator = this._ruleEvaluators.find(e => e.canEvaluate(rule));\n if (!evaluator) {\n if (\n process.env.NODE_ENV === \"development\" &&\n !this._warnedRuleTypes.has(rule.type)\n ) {\n this._warnedRuleTypes.add(rule.type);\n console.warn(\n `[FormModel] No evaluator registered for rule type \"${rule.type}\". Rule is ignored.`\n );\n }\n continue;\n }\n const matched = evaluator.evaluate(rule, this);\n if (!matched) {\n continue;\n }\n if (rule.action === \"hide\") {\n visible = false;\n } else if (rule.action === \"disable\") {\n disabled = true;\n }\n }\n\n return { visible, disabled };\n }\n\n field(name: string): IField {\n const field = this._fields.get(name);\n if (field) {\n return field;\n }\n\n const parts = name.split(\".\");\n if (parts.length > 1) {\n let current: IField | undefined = this._fields.get(parts[0]);\n for (let i = 1; i < parts.length && current; i++) {\n if (isObjectField(current)) {\n if (current.isList) {\n // A list field is followed by an item selector: a numeric index, or a\n // stable alphanumeric `_id` (matched against each item's hidden `_id`).\n const selector = parts[i];\n const item = /^\\d+$/.test(selector)\n ? current.items[parseInt(selector, 10)]\n : current.items.find(\n candidate =>\n candidate.children.get(\"_id\")?.getValue() === selector\n );\n if (item && i + 1 < parts.length) {\n current = item.children.get(parts[i + 1]);\n i++;\n } else {\n current = undefined;\n }\n continue;\n }\n current = current.getChild(parts[i]);\n } else {\n current = undefined;\n }\n }\n if (current) {\n return current;\n }\n }\n\n throw new Error(`Field \"${name}\" not found.`);\n }\n\n focusField(name: string): void {\n if (this._lastFocusedField) {\n this._lastFocusedField.clearFocusRequest();\n this._lastFocusedField = null;\n }\n\n const activations = this._focusManager.buildFocusPath(name, this._layout);\n let field: IField | undefined;\n try {\n field = this.field(name);\n } catch {\n // Field not found — no-op.\n }\n\n runInAction(() => {\n if (activations) {\n for (const act of activations) {\n this._activeTabs.set(act.tabKey, act.tabId);\n }\n }\n if (field) {\n field.requestFocus();\n this._lastFocusedField = field;\n }\n });\n }\n\n fields(\n factory: (registry: IFieldBuilderRegistry) => Record<string, IFieldBuilder | undefined>\n ): void {\n const builders = factory(this._registry);\n\n for (const [name, builder] of Object.entries(builders)) {\n if (builder === undefined) {\n this._builders.delete(name);\n this.removeField(name);\n continue;\n }\n\n this._builders.set(name, builder);\n const fieldConfig = builder.build(name);\n const field = this._createField(fieldConfig);\n field.setForm(this);\n\n this._fields.set(name, field);\n }\n\n this._snapshotBaseline();\n this._propagateAncestorRules();\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._layoutMutator.accessNode(this._layout, factoryOrNodeId);\n }\n\n this._layout = this._layoutMutator.applyModifications(this._layout, factoryOrNodeId);\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n removeField(name: string): void {\n this._fields.delete(name);\n this._baseline.delete(name);\n this._layout = this._layoutMutator.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 if (isObjectField(field)) {\n data[name] = toJS(field.getData());\n } else {\n data[name] = toJS(field.getValue());\n }\n }\n return data;\n }\n\n setData(data: Record<string, unknown>, options?: { dirty?: boolean }): 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 if (!options?.dirty) {\n this._snapshotBaseline();\n }\n this._resetAllValidation();\n this._submitted = false;\n this._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\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._submitCount = 0;\n this._isValid = null;\n this._formRuleErrors = [];\n }\n\n get isDirty(): boolean {\n for (const [name, field] of this._fields) {\n const baseline = this._baseline.get(name);\n const current = isObjectField(field) ? field.getData() : field.getValue();\n if (JSON.stringify(toJS(current)) !== JSON.stringify(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 submitted(): boolean {\n return this._submitted;\n }\n\n get submitCount(): number {\n return this._submitCount;\n }\n\n get errors(): IFormError[] {\n if (!this._submitted) {\n return [];\n }\n const ruleErrorPaths = new Set(this._formRuleErrors.filter(e => e.path).map(e => e.path));\n const errors: IFormError[] = [];\n\n const collectErrors = (\n fields: Map<string, IField>,\n pathPrefix: string,\n trail: string[]\n ) => {\n for (const [, field] of fields) {\n const path = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;\n const segment = field.config.label || field.name;\n if (isObjectField(field)) {\n if (!field.visible) {\n continue;\n }\n if (\n field.vm.validation.isValid === false &&\n field.vm.validation.message &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message\n });\n }\n const skipBreadcrumb =\n field.config.renderer === \"passthrough\" && !field.config.label;\n const childTrail = skipBreadcrumb ? trail : [...trail, segment];\n\n if (field.config.isList) {\n for (const [index, item] of field.items.entries()) {\n collectErrors(item.children, `${path}.${index}`, [...childTrail]);\n }\n } else {\n collectErrors(field.children, path, childTrail);\n }\n } else if (\n field.visible &&\n field.vm.validation.isValid === false &&\n !ruleErrorPaths.has(path)\n ) {\n errors.push({\n path,\n label: field.config.label,\n breadcrumb: [...trail, segment],\n message: field.vm.validation.message || \"Invalid value.\"\n });\n }\n }\n };\n\n collectErrors(this._fields, \"\", []);\n return [...errors, ...this._formRuleErrors];\n }\n\n addRule(rule: FormRule): void {\n this._formRules.push(rule);\n }\n\n setLayout(factory: (layout: ILayoutBuilder) => ILayoutNodeBuilder[]): void {\n this._layout = LayoutBuilderFactory.buildNodes(factory(LayoutBuilderFactory.create()));\n this._warnOrphanFields();\n this._registerObjectNodeLayouts(this._layout);\n this._propagateAncestorRules();\n }\n\n async validate(): Promise<boolean> {\n let allFieldsValid = true;\n\n for (const [, field] of this._fields) {\n const valid = await field.validate({ force: true });\n if (!valid) {\n allFieldsValid = false;\n }\n }\n\n const ruleErrors: IFormError[] = [];\n for (const rule of this._formRules) {\n const errors = await this._runFormRule(rule);\n for (const err of errors) {\n ruleErrors.push(err);\n if (err.path) {\n const target = this._tryGetField(err.path);\n if (target) {\n target.setValidation({ isValid: false, message: err.message });\n }\n }\n }\n }\n\n const isValid = allFieldsValid && ruleErrors.length === 0;\n runInAction(() => {\n this._formRuleErrors = ruleErrors;\n this._isValid = isValid;\n this._submitted = true;\n this._submitCount++;\n });\n return isValid;\n }\n\n async submit<T = Record<string, unknown>>(options?: {\n skipValidation?: boolean;\n }): Promise<T | false> {\n if (options?.skipValidation) {\n return this.getData() as T;\n }\n\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._layoutResolver.resolve(this._layout),\n errors: this.errors,\n hasErrors: this.errors.length > 0,\n isDirty: this.isDirty,\n isValid: this._isValid,\n submitCount: this._submitCount,\n focusField: (path: string) => this.focusField(path),\n getData: () => this.getData() as Record<string, unknown>,\n setData: (data: Record<string, unknown>, options?: { dirty?: boolean }) =>\n this.setData(data, options)\n };\n }\n\n get registry(): IFieldBuilderRegistry {\n return this._registry;\n }\n\n public resolveChildLayout(layout: LayoutNode[], children: Map<string, IField>): LayoutNodeVM[] {\n return this._layoutResolver.resolveChildLayout(layout, children);\n }\n\n getField(name: string): IField | undefined {\n return this._fields.get(name);\n }\n\n getFields(): Map<string, IField> {\n return this._fields;\n }\n\n getFieldBuilders(predicate?: (builder: IFieldBuilder) => boolean): IFieldBuilder[] {\n const pred = predicate ?? (() => true);\n const result: IFieldBuilder[] = [];\n LayoutBuilderFactory.collectBuilders(this._fields, this._builders, pred, result);\n return result;\n }\n\n traverse(callback: (builder: IFieldBuilder) => void): void {\n this._traverseBuilders(this._fields, this._builders, callback);\n }\n\n private _traverseBuilders(\n fields: { get(name: string): IField | undefined },\n builders: Map<string, IFieldBuilder> | Record<string, IFieldBuilder>,\n callback: (builder: IFieldBuilder) => void\n ): void {\n const entries = builders instanceof Map ? builders.entries() : Object.entries(builders);\n for (const [name, builder] of entries) {\n if (!builder || typeof builder !== \"object\") {\n continue;\n }\n callback(builder);\n const field = fields.get(name);\n if (field && isObjectField(field)) {\n this._traverseBuilders(field.children, field.config.childBuilders, callback);\n const templates = (field.config as IObjectFieldConfig).templates;\n if (templates) {\n for (const tpl of templates) {\n for (const tplBuilder of Object.values(tpl.childBuilders)) {\n if (!tplBuilder || typeof tplBuilder !== \"object\") {\n continue;\n }\n callback(tplBuilder);\n }\n }\n }\n }\n }\n }\n\n private async _runFormRule(rule: FormRule): Promise<IFormError[]> {\n if (typeof rule === \"function\") {\n const fn = rule as FormRuleFn;\n const result = await fn(this);\n return Array.isArray(result) ? result : [];\n }\n const data = this.getData();\n const result = await rule.safeParseAsync(data);\n if (result.success) {\n return [];\n }\n return result.error.issues.map(issue => {\n const path = issue.path.map(String).join(\".\");\n const field = path ? this._tryGetField(path) : undefined;\n return {\n path,\n label: field?.config.label,\n message: issue.message || \"Invalid value.\"\n };\n });\n }\n\n private _tryGetField(path: string): IField | undefined {\n try {\n return this.field(path);\n } catch {\n return undefined;\n }\n }\n\n private _registerObjectNodeLayouts(layout: LayoutNode[]): void {\n for (const node of layout) {\n if (node.type === \"object\") {\n const field = this._fields.get(node.fieldName);\n if (field && isObjectField(field)) {\n field.setInnerLayout(node.inner);\n }\n } else if (node.type === \"tabs\") {\n for (const tab of node.tabs) {\n this._registerObjectNodeLayouts(tab.layout);\n }\n }\n }\n }\n\n private _propagateAncestorRules(): void {\n const ancestry = new Map<string, IRule[]>();\n const walk = (nodes: LayoutNode[], rules: IRule[]) => {\n for (const node of nodes) {\n if (node.type === \"row\") {\n for (const id of node.fieldIds) {\n const existing = ancestry.get(id) ?? [];\n ancestry.set(id, [...existing, ...rules]);\n }\n } else if (node.type === \"tabs\") {\n const containerRules = [...rules, ...(node.rules ?? [])];\n for (const tab of node.tabs) {\n const tabRules = [...containerRules, ...(tab.rules ?? [])];\n walk(tab.layout, tabRules);\n }\n } else if (node.type === \"object\") {\n const existing = ancestry.get(node.fieldName) ?? [];\n ancestry.set(node.fieldName, [...existing, ...rules]);\n }\n }\n };\n\n walk(this._layout, []);\n\n for (const [, field] of this._fields) {\n field.setAncestorRules(ancestry.get(field.name) ?? []);\n }\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(LayoutBuilderFactory.collectFieldIds(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 private _createField(config: any): IField {\n if (config.childBuilders) {\n return new ObjectField(config as IObjectFieldConfig);\n }\n return new Field(config);\n }\n}\n"],"names":["FormModel","config","registry","Map","observable","Set","LayoutMutator","builders","name","builder","Object","fieldConfig","field","LayoutBuilderFactory","makeAutoObservable","computed","LayoutResolver","FocusManager","rules","visible","disabled","rule","evaluator","e","process","console","matched","parts","current","i","isObjectField","selector","item","parseInt","candidate","undefined","Error","activations","runInAction","act","factory","factoryOrNodeId","data","toJS","options","value","baselineValue","baseline","JSON","ruleErrorPaths","errors","collectErrors","fields","pathPrefix","trail","path","segment","skipBreadcrumb","childTrail","index","allFieldsValid","valid","ruleErrors","err","target","isValid","layout","children","predicate","pred","result","callback","entries","templates","tpl","tplBuilder","fn","Array","issue","String","node","tab","ancestry","walk","nodes","id","existing","containerRules","tabRules","layoutFieldIds","ObjectField","Field"],"mappings":"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"}