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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/base/Base/DefaultFieldRenderers.js +69 -5
  2. package/base/Base/DefaultFieldRenderers.js.map +1 -1
  3. package/base/Base/DefaultLayoutRenderers.js +5 -1
  4. package/base/Base/DefaultLayoutRenderers.js.map +1 -1
  5. package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
  6. package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
  7. package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
  8. package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
  9. package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
  10. package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
  11. package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
  12. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
  13. package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
  14. package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
  15. package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
  16. package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
  17. package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
  18. package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
  19. package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
  20. package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
  21. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
  22. package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
  23. package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
  24. package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
  25. package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
  26. package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
  27. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
  28. package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
  29. package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
  30. package/base/Base/FieldRenderers/InputRenderer.js +2 -2
  31. package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
  32. package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
  33. package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
  34. package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
  35. package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
  36. package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
  37. package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
  38. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
  39. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
  40. package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
  41. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
  42. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
  43. package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
  44. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
  45. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
  46. package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
  47. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
  48. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
  49. package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
  50. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
  51. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
  52. package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
  53. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
  54. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
  55. package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
  56. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
  57. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
  58. package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
  59. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
  60. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
  61. package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
  62. package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
  63. package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
  64. package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
  65. package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
  66. package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
  67. package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
  68. package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
  69. package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
  70. package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
  71. package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
  72. package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
  73. package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
  74. package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
  75. package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
  76. package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
  77. package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
  78. package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
  79. package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
  80. package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
  81. package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
  82. package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
  83. package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
  84. package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
  85. package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
  86. package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
  87. package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
  88. package/base/Base/Menus.js +5 -64
  89. package/base/Base/Menus.js.map +1 -1
  90. package/base/Base/RoutesConfig.js +6 -0
  91. package/base/Base/RoutesConfig.js.map +1 -1
  92. package/exports/admin/build-params.d.ts +2 -0
  93. package/exports/admin/build-params.js +3 -0
  94. package/exports/admin/build-params.js.map +1 -1
  95. package/exports/admin/form.d.ts +5 -0
  96. package/exports/admin/form.js +8 -0
  97. package/exports/admin/form.js.map +1 -1
  98. package/exports/admin/ui.d.ts +1 -0
  99. package/exports/admin/ui.js +1 -0
  100. package/exports/admin/ui.js.map +1 -1
  101. package/exports/admin.d.ts +3 -1
  102. package/exports/admin.js +3 -1
  103. package/exports/admin.js.map +1 -1
  104. package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
  105. package/features/formModel/ConditionRuleEvaluator.js +56 -0
  106. package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
  107. package/features/formModel/Field.d.ts +50 -4
  108. package/features/formModel/Field.js +254 -35
  109. package/features/formModel/Field.js.map +1 -1
  110. package/features/formModel/FieldBuilder.d.ts +17 -35
  111. package/features/formModel/FieldBuilder.js +63 -100
  112. package/features/formModel/FieldBuilder.js.map +1 -1
  113. package/features/formModel/FieldBuilder.test.js +127 -13
  114. package/features/formModel/FieldBuilder.test.js.map +1 -1
  115. package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
  116. package/features/formModel/FieldBuilderRegistry.js +31 -0
  117. package/features/formModel/FieldBuilderRegistry.js.map +1 -0
  118. package/features/formModel/FocusManager.d.ts +14 -0
  119. package/features/formModel/FocusManager.js +109 -0
  120. package/features/formModel/FocusManager.js.map +1 -0
  121. package/features/formModel/FormModel.d.ts +27 -31
  122. package/features/formModel/FormModel.js +210 -403
  123. package/features/formModel/FormModel.js.map +1 -1
  124. package/features/formModel/FormModel.test.js +2044 -193
  125. package/features/formModel/FormModel.test.js.map +1 -1
  126. package/features/formModel/FormModelFactory.d.ts +4 -2
  127. package/features/formModel/FormModelFactory.js +13 -3
  128. package/features/formModel/FormModelFactory.js.map +1 -1
  129. package/features/formModel/FormView.d.ts +2 -0
  130. package/features/formModel/FormView.js +44 -37
  131. package/features/formModel/FormView.js.map +1 -1
  132. package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
  133. package/features/formModel/LayoutBuilderFactory.js +386 -0
  134. package/features/formModel/LayoutBuilderFactory.js.map +1 -0
  135. package/features/formModel/LayoutMutator.d.ts +11 -0
  136. package/features/formModel/LayoutMutator.js +136 -0
  137. package/features/formModel/LayoutMutator.js.map +1 -0
  138. package/features/formModel/LayoutResolver.d.ts +26 -0
  139. package/features/formModel/LayoutResolver.js +239 -0
  140. package/features/formModel/LayoutResolver.js.map +1 -0
  141. package/features/formModel/ObjectField.d.ts +55 -4
  142. package/features/formModel/ObjectField.js +499 -82
  143. package/features/formModel/ObjectField.js.map +1 -1
  144. package/features/formModel/Rules.test.d.ts +1 -0
  145. package/features/formModel/Rules.test.js +289 -0
  146. package/features/formModel/Rules.test.js.map +1 -0
  147. package/features/formModel/abstractions.d.ts +402 -52
  148. package/features/formModel/abstractions.js +55 -0
  149. package/features/formModel/abstractions.js.map +1 -1
  150. package/features/formModel/createFieldRenderer.d.ts +20 -0
  151. package/features/formModel/createFieldRenderer.js +15 -0
  152. package/features/formModel/createFieldRenderer.js.map +1 -0
  153. package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
  154. package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
  155. package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
  156. package/features/formModel/demo/FormModelDemo.d.ts +4 -0
  157. package/features/formModel/demo/FormModelDemo.js +230 -0
  158. package/features/formModel/demo/FormModelDemo.js.map +1 -0
  159. package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
  160. package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
  161. package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
  162. package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
  163. package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
  164. package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
  165. package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
  166. package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
  167. package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
  168. package/features/formModel/feature.js +12 -0
  169. package/features/formModel/feature.js.map +1 -1
  170. package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
  171. package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
  172. package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
  173. package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
  174. package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
  175. package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
  176. package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
  177. package/features/formModel/fieldTypes/FileFieldType.js +20 -0
  178. package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
  179. package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
  180. package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
  181. package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
  182. package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
  183. package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
  184. package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
  185. package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
  186. package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
  187. package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
  188. package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
  189. package/features/formModel/fieldTypes/TextFieldType.js +20 -0
  190. package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
  191. package/features/formModel/fieldTypes/index.d.ts +7 -0
  192. package/features/formModel/fieldTypes/index.js +9 -0
  193. package/features/formModel/fieldTypes/index.js.map +1 -0
  194. package/features/formModel/index.d.ts +13 -4
  195. package/features/formModel/index.js +21 -2
  196. package/features/formModel/index.js.map +1 -1
  197. package/features/formModel/renderers.d.ts +15 -1
  198. package/features/formModel/renderers.js +15 -1
  199. package/features/formModel/renderers.js.map +1 -1
  200. package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
  201. package/features/tools/LexicalContext/LexicalContext.js +22 -0
  202. package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
  203. package/features/tools/LexicalContext/abstractions.d.ts +11 -0
  204. package/features/tools/LexicalContext/abstractions.js +4 -0
  205. package/features/tools/LexicalContext/abstractions.js.map +1 -0
  206. package/features/tools/LexicalContext/index.d.ts +2 -0
  207. package/features/tools/LexicalContext/index.js +3 -0
  208. package/features/tools/LexicalContext/index.js.map +1 -0
  209. package/features/tools/feature.js +2 -0
  210. package/features/tools/feature.js.map +1 -1
  211. package/features/tools/index.d.ts +1 -0
  212. package/features/tools/index.js +1 -0
  213. package/features/tools/index.js.map +1 -1
  214. package/index.d.ts +8 -1
  215. package/index.js +7 -0
  216. package/index.js.map +1 -1
  217. package/package.json +31 -25
  218. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
  219. package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
  220. package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
  221. package/presentation/lexicalContext/useLexicalContext.js +14 -0
  222. package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
  223. package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
  224. package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
  225. package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
  226. package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
  227. package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
  228. package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
  229. package/routes.d.ts +1 -0
  230. package/routes.js +4 -0
  231. package/routes.js.map +1 -1
  232. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
  233. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
  234. package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +0 -1
@@ -0,0 +1,56 @@
1
+ import { RuleEvaluator } from "./abstractions.js";
2
+ const isEmpty = value => {
3
+ if (value === null || value === undefined || value === "") {
4
+ return true;
5
+ }
6
+ if (Array.isArray(value) && value.length === 0) {
7
+ return true;
8
+ }
9
+ return false;
10
+ };
11
+ export class ConditionRuleEvaluatorImpl {
12
+ canEvaluate(rule) {
13
+ return rule.type === "condition";
14
+ }
15
+ evaluate(rule, form) {
16
+ const field = safeGetField(form, rule.target);
17
+ const value = field?.getValue() ?? null;
18
+ switch (rule.operator) {
19
+ case "isEmpty":
20
+ return isEmpty(value);
21
+ case "isNotEmpty":
22
+ return !isEmpty(value);
23
+ case "eq":
24
+ return value === rule.value;
25
+ case "neq":
26
+ return value !== rule.value;
27
+ case "isTruthy":
28
+ return !!value;
29
+ case "isFalsy":
30
+ return !value;
31
+ case "matches":
32
+ if (typeof value !== "string" || rule.value === null) {
33
+ return false;
34
+ }
35
+ return value === rule.value;
36
+ default:
37
+ if (process.env.NODE_ENV === "development") {
38
+ console.warn(`[FormModel] Unknown operator "${rule.operator}" in condition rule. Returning false.`);
39
+ }
40
+ return false;
41
+ }
42
+ }
43
+ }
44
+ function safeGetField(form, name) {
45
+ try {
46
+ return form.field(name);
47
+ } catch {
48
+ return undefined;
49
+ }
50
+ }
51
+ export const ConditionRuleEvaluator = RuleEvaluator.createImplementation({
52
+ implementation: ConditionRuleEvaluatorImpl,
53
+ dependencies: []
54
+ });
55
+
56
+ //# sourceMappingURL=ConditionRuleEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RuleEvaluator","isEmpty","value","undefined","Array","isArray","length","ConditionRuleEvaluatorImpl","canEvaluate","rule","type","evaluate","form","field","safeGetField","target","getValue","operator","process","env","NODE_ENV","console","warn","name","ConditionRuleEvaluator","createImplementation","implementation","dependencies"],"sources":["ConditionRuleEvaluator.ts"],"sourcesContent":["import type { IFormModel } from \"./abstractions.js\";\nimport { RuleEvaluator } from \"./abstractions.js\";\n\nconst isEmpty = (value: unknown): boolean => {\n if (value === null || value === undefined || value === \"\") {\n return true;\n }\n if (Array.isArray(value) && value.length === 0) {\n return true;\n }\n return false;\n};\n\nexport class ConditionRuleEvaluatorImpl implements RuleEvaluator.Interface {\n canEvaluate(rule: RuleEvaluator.Rule): boolean {\n return rule.type === \"condition\";\n }\n\n evaluate(rule: RuleEvaluator.Rule, form: IFormModel): boolean {\n const field = safeGetField(form, rule.target);\n const value = field?.getValue() ?? null;\n\n switch (rule.operator) {\n case \"isEmpty\":\n return isEmpty(value);\n case \"isNotEmpty\":\n return !isEmpty(value);\n case \"eq\":\n return value === rule.value;\n case \"neq\":\n return value !== rule.value;\n case \"isTruthy\":\n return !!value;\n case \"isFalsy\":\n return !value;\n case \"matches\":\n if (typeof value !== \"string\" || rule.value === null) {\n return false;\n }\n return value === rule.value;\n default:\n if (process.env.NODE_ENV === \"development\") {\n console.warn(\n `[FormModel] Unknown operator \"${rule.operator}\" in condition rule. Returning false.`\n );\n }\n return false;\n }\n }\n}\n\nfunction safeGetField(form: IFormModel, name: string) {\n try {\n return form.field(name);\n } catch {\n return undefined;\n }\n}\n\nexport const ConditionRuleEvaluator = RuleEvaluator.createImplementation({\n implementation: ConditionRuleEvaluatorImpl,\n dependencies: []\n});\n"],"mappings":"AACA,SAASA,aAAa;AAEtB,MAAMC,OAAO,GAAIC,KAAc,IAAc;EACzC,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,EAAE,EAAE;IACvD,OAAO,IAAI;EACf;EACA,IAAIE,KAAK,CAACC,OAAO,CAACH,KAAK,CAAC,IAAIA,KAAK,CAACI,MAAM,KAAK,CAAC,EAAE;IAC5C,OAAO,IAAI;EACf;EACA,OAAO,KAAK;AAChB,CAAC;AAED,OAAO,MAAMC,0BAA0B,CAAoC;EACvEC,WAAWA,CAACC,IAAwB,EAAW;IAC3C,OAAOA,IAAI,CAACC,IAAI,KAAK,WAAW;EACpC;EAEAC,QAAQA,CAACF,IAAwB,EAAEG,IAAgB,EAAW;IAC1D,MAAMC,KAAK,GAAGC,YAAY,CAACF,IAAI,EAAEH,IAAI,CAACM,MAAM,CAAC;IAC7C,MAAMb,KAAK,GAAGW,KAAK,EAAEG,QAAQ,CAAC,CAAC,IAAI,IAAI;IAEvC,QAAQP,IAAI,CAACQ,QAAQ;MACjB,KAAK,SAAS;QACV,OAAOhB,OAAO,CAACC,KAAK,CAAC;MACzB,KAAK,YAAY;QACb,OAAO,CAACD,OAAO,CAACC,KAAK,CAAC;MAC1B,KAAK,IAAI;QACL,OAAOA,KAAK,KAAKO,IAAI,CAACP,KAAK;MAC/B,KAAK,KAAK;QACN,OAAOA,KAAK,KAAKO,IAAI,CAACP,KAAK;MAC/B,KAAK,UAAU;QACX,OAAO,CAAC,CAACA,KAAK;MAClB,KAAK,SAAS;QACV,OAAO,CAACA,KAAK;MACjB,KAAK,SAAS;QACV,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIO,IAAI,CAACP,KAAK,KAAK,IAAI,EAAE;UAClD,OAAO,KAAK;QAChB;QACA,OAAOA,KAAK,KAAKO,IAAI,CAACP,KAAK;MAC/B;QACI,IAAIgB,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,aAAa,EAAE;UACxCC,OAAO,CAACC,IAAI,CACR,iCAAiCb,IAAI,CAACQ,QAAQ,uCAClD,CAAC;QACL;QACA,OAAO,KAAK;IACpB;EACJ;AACJ;AAEA,SAASH,YAAYA,CAACF,IAAgB,EAAEW,IAAY,EAAE;EAClD,IAAI;IACA,OAAOX,IAAI,CAACC,KAAK,CAACU,IAAI,CAAC;EAC3B,CAAC,CAAC,MAAM;IACJ,OAAOpB,SAAS;EACpB;AACJ;AAEA,OAAO,MAAMqB,sBAAsB,GAAGxB,aAAa,CAACyB,oBAAoB,CAAC;EACrEC,cAAc,EAAEnB,0BAA0B;EAC1CoB,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { IFieldConfig, IFieldVM, IFieldValidation, IFormModel, IField, FieldTypeMap, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback } from "./abstractions.js";
1
+ import type { IFieldConfig, IFieldVM, IFieldValidation, IFormModel, IField, IRule, FieldTypeMap, BeforeChangeCallback, AfterChangeCallback, AfterSetValueCallback, OnBlurCallback, ComputedFieldCallback } from "./abstractions.js";
2
2
  /**
3
3
  * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.
4
4
  */
@@ -11,8 +11,19 @@ export declare class Field implements IField {
11
11
  private _afterChangeCallbacks;
12
12
  private _afterSetValueCallbacks;
13
13
  private _onBlurCallbacks;
14
+ private _requiredWhenCallbacks;
15
+ private _computed;
16
+ private _computedUntilDirty;
17
+ /** Set once a computedUntilDirty field receives its first user edit. */
18
+ private _computedOverridden;
19
+ private _validating;
20
+ private _validationCacheKey;
21
+ private _validationCache;
14
22
  private _isUIChange;
23
+ private _focusRequested;
24
+ private _qualifiedName;
15
25
  private _form;
26
+ private _ancestorRules;
16
27
  readonly config: IFieldConfig;
17
28
  constructor(config: IFieldConfig);
18
29
  get name(): string;
@@ -25,28 +36,63 @@ export declare class Field implements IField {
25
36
  */
26
37
  setValue(raw: unknown): void;
27
38
  /**
28
- * Set value directly without running pipelines. Used by setData().
39
+ * Set value directly without running pipelines. Used by setData() and reset().
29
40
  */
30
41
  setValueSilent(value: unknown): void;
31
42
  setDisabled(value: boolean): void;
43
+ private _evaluateRules;
32
44
  get visible(): boolean;
45
+ get disabled(): boolean;
33
46
  setVisible(value: boolean): void;
47
+ setAncestorRules(rules: IRule[]): void;
34
48
  setValidation(validation: IFieldValidation): void;
35
49
  resetValidation(): void;
36
50
  addBeforeChange(cb: BeforeChangeCallback): void;
37
51
  addAfterChange(cb: AfterChangeCallback): void;
38
52
  addAfterSetValue(cb: AfterSetValueCallback): void;
39
53
  addOnBlur(cb: OnBlurCallback): void;
54
+ addRequiredWhen(fn: (form: IFormModel) => boolean, message?: string): void;
55
+ setComputed(fn: ComputedFieldCallback): void;
56
+ setComputedUntilDirty(fn: ComputedFieldCallback): void;
57
+ /**
58
+ * Effective `required` state — true if the built-in `.required()` flag is
59
+ * set, or if any `requiredWhen()` callback returns `true` for the current
60
+ * form state. The first truthy callback wins; its message is used.
61
+ */
62
+ resolveRequired(): {
63
+ required: boolean;
64
+ message?: string;
65
+ };
66
+ private _resolveRequired;
40
67
  blur(): void;
41
- setForm(form: IFormModel): void;
68
+ setForm(form: IFormModel, parentPath?: string): void;
69
+ get qualifiedName(): string;
70
+ focus(): void;
71
+ requestFocus(): void;
72
+ clearFocusRequest(): void;
42
73
  as<T extends keyof FieldTypeMap>(type: T): FieldTypeMap[T];
43
74
  remove(): void;
44
75
  get vm(): IFieldVM;
45
76
  private _setValueFromUI;
77
+ private _applyNormalizeValue;
78
+ private _addItem;
79
+ private _removeItem;
46
80
  private _resolveOptions;
47
81
  /**
48
82
  * Validate this field. Returns true if valid.
49
83
  * Validation order: required check → zod schema.
84
+ * Hidden fields are excluded from validation.
85
+ *
86
+ * Pass `{ force: true }` to bypass the memoization cache (used by
87
+ * `form.validate()` / `form.submit()`). Blur-triggered validation
88
+ * omits the flag so unchanged values return the cached result.
50
89
  */
51
- validate(): Promise<boolean>;
90
+ validate(options?: {
91
+ force?: boolean;
92
+ }): Promise<boolean>;
93
+ private _serializeValue;
94
+ /** True if this field has any computed callback configured. */
95
+ get isComputed(): boolean;
96
+ /** True if a computedUntilDirty field has been overridden by user edit. */
97
+ get isComputedOverridden(): boolean;
52
98
  }
@@ -10,11 +10,24 @@ export class Field {
10
10
  _afterChangeCallbacks = [];
11
11
  _afterSetValueCallbacks = [];
12
12
  _onBlurCallbacks = [];
13
+ _requiredWhenCallbacks = [];
14
+ _computed = null;
15
+ _computedUntilDirty = null;
16
+ /** Set once a computedUntilDirty field receives its first user edit. */
17
+ _computedOverridden = false;
18
+ _validating = false;
19
+ _validationCacheKey = undefined;
20
+ _validationCache = undefined;
13
21
  _isUIChange = false;
22
+ _focusRequested = false;
23
+ _qualifiedName = "";
14
24
  _form = null;
25
+ _ancestorRules = [];
15
26
  constructor(config) {
16
27
  this.config = config;
17
- this._value = config.defaultValue ?? null;
28
+ this._qualifiedName = config.name;
29
+ const defaultValue = typeof config.defaultValue === "function" ? config.defaultValue() : config.defaultValue;
30
+ this._value = defaultValue ?? (config.isList ? [] : null);
18
31
  this._disabled = config.disabled;
19
32
  this._hidden = config.hidden;
20
33
  if (config.beforeChangeCallbacks) {
@@ -29,6 +42,14 @@ export class Field {
29
42
  if (config.onBlurCallbacks) {
30
43
  this._onBlurCallbacks = [...config.onBlurCallbacks];
31
44
  }
45
+ if (config.requiredWhenCallbacks) {
46
+ this._requiredWhenCallbacks = [...config.requiredWhenCallbacks];
47
+ }
48
+ if (config.computed) {
49
+ this._computed = config.computed;
50
+ } else if (config.computedUntilDirty) {
51
+ this._computedUntilDirty = config.computedUntilDirty;
52
+ }
32
53
  makeAutoObservable(this, {
33
54
  config: false,
34
55
  vm: computed
@@ -41,6 +62,12 @@ export class Field {
41
62
  return this.config.type;
42
63
  }
43
64
  getValue() {
65
+ if (this._computed && this._form) {
66
+ return this._computed(this._form);
67
+ }
68
+ if (this._computedUntilDirty && !this._computedOverridden && this._form) {
69
+ return this._computedUntilDirty(this._form);
70
+ }
44
71
  return this._value;
45
72
  }
46
73
 
@@ -50,7 +77,7 @@ export class Field {
50
77
  * afterChange only fires when value actually changed.
51
78
  */
52
79
  setValue(raw) {
53
- let transformed = raw;
80
+ let transformed = this.config.normalizeValue ? this._applyNormalizeValue(raw, this.config.normalizeValue) : raw;
54
81
  for (const cb of this._beforeChangeCallbacks) {
55
82
  transformed = cb(transformed, this._form);
56
83
  }
@@ -58,6 +85,9 @@ export class Field {
58
85
  return;
59
86
  }
60
87
  this._value = transformed;
88
+ if (this._computedUntilDirty && this._isUIChange) {
89
+ this._computedOverridden = true;
90
+ }
61
91
  for (const cb of this._afterChangeCallbacks) {
62
92
  cb(transformed, this._form);
63
93
  }
@@ -69,20 +99,55 @@ export class Field {
69
99
  }
70
100
 
71
101
  /**
72
- * Set value directly without running pipelines. Used by setData().
102
+ * Set value directly without running pipelines. Used by setData() and reset().
73
103
  */
74
104
  setValueSilent(value) {
75
- this._value = value;
105
+ const parsed = this.config.normalizeValue ? this._applyNormalizeValue(value, this.config.normalizeValue) : value;
106
+ this._value = parsed;
107
+ if (this._computedUntilDirty) {
108
+ this._computedOverridden = parsed !== null && parsed !== undefined;
109
+ }
76
110
  }
77
111
  setDisabled(value) {
78
112
  this._disabled = value;
79
113
  }
114
+ _evaluateRules() {
115
+ if (!this._form) {
116
+ return {
117
+ visible: true,
118
+ disabled: false
119
+ };
120
+ }
121
+ const own = this.config.rules ?? [];
122
+ const all = [...this._ancestorRules, ...own];
123
+ if (all.length === 0) {
124
+ return {
125
+ visible: true,
126
+ disabled: false
127
+ };
128
+ }
129
+ return this._form.evaluateRules(all);
130
+ }
80
131
  get visible() {
81
- return !this._hidden;
132
+ if (this._hidden) {
133
+ return false;
134
+ }
135
+ return this._evaluateRules().visible;
136
+ }
137
+ get disabled() {
138
+ if (this._disabled) {
139
+ return true;
140
+ }
141
+ return this._evaluateRules().disabled;
82
142
  }
83
143
  setVisible(value) {
84
144
  this._hidden = !value;
85
145
  }
146
+ setAncestorRules(rules) {
147
+ runInAction(() => {
148
+ this._ancestorRules = rules;
149
+ });
150
+ }
86
151
  setValidation(validation) {
87
152
  this._validation = validation;
88
153
  }
@@ -90,6 +155,8 @@ export class Field {
90
155
  this._validation = {
91
156
  isValid: null
92
157
  };
158
+ this._validationCacheKey = undefined;
159
+ this._validationCache = undefined;
93
160
  }
94
161
  addBeforeChange(cb) {
95
162
  this._beforeChangeCallbacks.push(cb);
@@ -103,13 +170,75 @@ export class Field {
103
170
  addOnBlur(cb) {
104
171
  this._onBlurCallbacks.push(cb);
105
172
  }
173
+ addRequiredWhen(fn, message) {
174
+ this._requiredWhenCallbacks.push({
175
+ fn,
176
+ message
177
+ });
178
+ }
179
+ setComputed(fn) {
180
+ this._computed = fn;
181
+ this._computedUntilDirty = null;
182
+ this._computedOverridden = false;
183
+ }
184
+ setComputedUntilDirty(fn) {
185
+ this._computedUntilDirty = fn;
186
+ this._computed = null;
187
+ this._computedOverridden = false;
188
+ }
189
+
190
+ /**
191
+ * Effective `required` state — true if the built-in `.required()` flag is
192
+ * set, or if any `requiredWhen()` callback returns `true` for the current
193
+ * form state. The first truthy callback wins; its message is used.
194
+ */
195
+ resolveRequired() {
196
+ return this._resolveRequired();
197
+ }
198
+ _resolveRequired() {
199
+ if (this.config.required) {
200
+ return {
201
+ required: true,
202
+ message: this.config.requiredMessage
203
+ };
204
+ }
205
+ if (this._form && this._requiredWhenCallbacks.length > 0) {
206
+ for (const cb of this._requiredWhenCallbacks) {
207
+ if (cb.fn(this._form)) {
208
+ return {
209
+ required: true,
210
+ message: cb.message
211
+ };
212
+ }
213
+ }
214
+ }
215
+ return {
216
+ required: false
217
+ };
218
+ }
106
219
  blur() {
107
220
  for (const cb of this._onBlurCallbacks) {
108
221
  cb(this._value, this._form);
109
222
  }
110
223
  }
111
- setForm(form) {
224
+ setForm(form, parentPath) {
112
225
  this._form = form;
226
+ this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;
227
+ }
228
+ get qualifiedName() {
229
+ return this._qualifiedName;
230
+ }
231
+ focus() {
232
+ if (!this._form) {
233
+ throw new Error(`Field "${this.config.name}" is not attached to a form.`);
234
+ }
235
+ this._form.focusField(this._qualifiedName);
236
+ }
237
+ requestFocus() {
238
+ this._focusRequested = true;
239
+ }
240
+ clearFocusRequest() {
241
+ this._focusRequested = false;
113
242
  }
114
243
  as(type) {
115
244
  if (this.config.type !== type) {
@@ -125,6 +254,7 @@ export class Field {
125
254
  }
126
255
  get vm() {
127
256
  const options = this._resolveOptions();
257
+ const required = this._resolveRequired().required;
128
258
  return {
129
259
  name: this.config.name,
130
260
  type: this.config.type,
@@ -133,15 +263,29 @@ export class Field {
133
263
  description: this.config.description,
134
264
  note: this.config.note,
135
265
  placeholder: this.config.placeholder,
136
- value: this._value,
266
+ value: this.getValue(),
137
267
  validation: this._validation,
138
- required: this.config.required,
139
- disabled: this._disabled,
268
+ validating: this._validating,
269
+ required,
270
+ visible: this.visible,
271
+ disabled: this.disabled,
140
272
  renderer: this.config.renderer,
141
273
  rendererSettings: this.config.rendererSettings,
274
+ isList: !!this.config.isList,
142
275
  options,
143
276
  onChange: value => this._setValueFromUI(value),
144
- onBlur: () => this.blur()
277
+ onBlur: () => {
278
+ if (this._form?.submitted) {
279
+ void this.validate();
280
+ }
281
+ this.blur();
282
+ },
283
+ addItem: value => this._addItem(value),
284
+ removeItem: index => this._removeItem(index),
285
+ focusRequested: this._focusRequested,
286
+ clearFocusRequest: () => {
287
+ this._focusRequested = false;
288
+ }
145
289
  };
146
290
  }
147
291
  _setValueFromUI(value) {
@@ -152,6 +296,20 @@ export class Field {
152
296
  this._isUIChange = false;
153
297
  }
154
298
  }
299
+ _applyNormalizeValue(value, normalizeValue) {
300
+ if (this.config.isList && Array.isArray(value)) {
301
+ return value.map(item => normalizeValue(item));
302
+ }
303
+ return normalizeValue(value);
304
+ }
305
+ _addItem(value) {
306
+ const current = Array.isArray(this._value) ? this._value : [];
307
+ this._setValueFromUI([...current, value ?? null]);
308
+ }
309
+ _removeItem(index) {
310
+ const current = Array.isArray(this._value) ? this._value : [];
311
+ this._setValueFromUI(current.filter((_, i) => i !== index));
312
+ }
155
313
  _resolveOptions() {
156
314
  if (!this.config.options) {
157
315
  return undefined;
@@ -165,40 +323,101 @@ export class Field {
165
323
  /**
166
324
  * Validate this field. Returns true if valid.
167
325
  * Validation order: required check → zod schema.
326
+ * Hidden fields are excluded from validation.
327
+ *
328
+ * Pass `{ force: true }` to bypass the memoization cache (used by
329
+ * `form.validate()` / `form.submit()`). Blur-triggered validation
330
+ * omits the flag so unchanged values return the cached result.
168
331
  */
169
- async validate() {
170
- // Required check
171
- if (this.config.required) {
172
- const value = this._value;
173
- if (value === null || value === undefined || value === "") {
332
+ async validate(options) {
333
+ if (!this.visible) {
334
+ runInAction(() => {
174
335
  this._validation = {
175
- isValid: false,
176
- message: this.config.requiredMessage || "This field is required."
336
+ isValid: null
177
337
  };
178
- return false;
179
- }
338
+ });
339
+ return true;
180
340
  }
341
+ const effectiveValue = this.getValue();
181
342
 
182
- // Zod schema check
183
- if (this.config.schema) {
184
- const result = await this.config.schema.safeParseAsync(this._value);
185
- if (!result.success) {
186
- const firstIssue = result.error.issues[0];
187
- runInAction(() => {
188
- this._validation = {
189
- isValid: false,
190
- message: firstIssue?.message || "Invalid value."
191
- };
192
- });
193
- return false;
343
+ // Memoization: return cached result when value hasn't changed.
344
+ if (!options?.force && this._validationCache !== undefined) {
345
+ const cacheKey = this._serializeValue(effectiveValue);
346
+ if (this._validationCacheKey === cacheKey) {
347
+ return this._validationCache;
194
348
  }
195
349
  }
196
350
  runInAction(() => {
197
- this._validation = {
198
- isValid: true
199
- };
351
+ this._validating = true;
200
352
  });
201
- return true;
353
+ try {
354
+ const requiredState = this._resolveRequired();
355
+
356
+ // Required check
357
+ if (requiredState.required) {
358
+ const isEmpty = effectiveValue === null || effectiveValue === undefined || effectiveValue === "" || this.config.isList && Array.isArray(effectiveValue) && effectiveValue.length === 0;
359
+ if (isEmpty) {
360
+ const cacheKey = this._serializeValue(effectiveValue);
361
+ runInAction(() => {
362
+ this._validation = {
363
+ isValid: false,
364
+ message: requiredState.message || "This field is required."
365
+ };
366
+ this._validationCacheKey = cacheKey;
367
+ this._validationCache = false;
368
+ });
369
+ return false;
370
+ }
371
+ }
372
+
373
+ // Zod schema check
374
+ if (this.config.schema) {
375
+ const result = await this.config.schema.safeParseAsync(effectiveValue);
376
+ if (!result.success) {
377
+ const firstIssue = result.error.issues[0];
378
+ const cacheKey = this._serializeValue(effectiveValue);
379
+ runInAction(() => {
380
+ this._validation = {
381
+ isValid: false,
382
+ message: firstIssue?.message || "Invalid value."
383
+ };
384
+ this._validationCacheKey = cacheKey;
385
+ this._validationCache = false;
386
+ });
387
+ return false;
388
+ }
389
+ }
390
+ const cacheKey = this._serializeValue(effectiveValue);
391
+ runInAction(() => {
392
+ this._validation = {
393
+ isValid: true
394
+ };
395
+ this._validationCacheKey = cacheKey;
396
+ this._validationCache = true;
397
+ });
398
+ return true;
399
+ } finally {
400
+ runInAction(() => {
401
+ this._validating = false;
402
+ });
403
+ }
404
+ }
405
+ _serializeValue(value) {
406
+ try {
407
+ return JSON.stringify(value);
408
+ } catch {
409
+ return String(Math.random());
410
+ }
411
+ }
412
+
413
+ /** True if this field has any computed callback configured. */
414
+ get isComputed() {
415
+ return this._computed !== null || this._computedUntilDirty !== null;
416
+ }
417
+
418
+ /** True if a computedUntilDirty field has been overridden by user edit. */
419
+ get isComputedOverridden() {
420
+ return this._computedOverridden;
202
421
  }
203
422
  }
204
423
 
@@ -1 +1 @@
1
- {"version":3,"names":["makeAutoObservable","computed","runInAction","Field","_validation","isValid","_beforeChangeCallbacks","_afterChangeCallbacks","_afterSetValueCallbacks","_onBlurCallbacks","_isUIChange","_form","constructor","config","_value","defaultValue","_disabled","disabled","_hidden","hidden","beforeChangeCallbacks","afterChangeCallbacks","afterSetValueCallbacks","onBlurCallbacks","vm","name","type","getValue","setValue","raw","transformed","cb","setValueSilent","value","setDisabled","visible","setVisible","setValidation","validation","resetValidation","addBeforeChange","push","addAfterChange","addAfterSetValue","addOnBlur","blur","setForm","form","as","Error","remove","removeField","options","_resolveOptions","label","help","description","note","placeholder","required","renderer","rendererSettings","onChange","_setValueFromUI","onBlur","undefined","validate","message","requiredMessage","schema","result","safeParseAsync","success","firstIssue","error","issues"],"sources":["Field.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport type {\n IFieldConfig,\n IFieldVM,\n IFieldValidation,\n IValueOption,\n IFormModel,\n IField,\n FieldTypeMap,\n BeforeChangeCallback,\n AfterChangeCallback,\n AfterSetValueCallback,\n OnBlurCallback\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\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 _isUIChange = false;\n private _form: IFormModel | null = null;\n\n readonly config: IFieldConfig;\n\n constructor(config: IFieldConfig) {\n this.config = config;\n this._value = config.defaultValue ?? 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\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 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 = raw;\n for (const cb of this._beforeChangeCallbacks) {\n transformed = cb(transformed, this._form!);\n }\n\n if (transformed === this._value) {\n return;\n }\n\n this._value = transformed;\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._form!);\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._form!);\n }\n }\n }\n\n /**\n * Set value directly without running pipelines. Used by setData().\n */\n setValueSilent(value: unknown): void {\n this._value = value;\n }\n\n setDisabled(value: boolean): void {\n this._disabled = value;\n }\n\n get visible(): boolean {\n return !this._hidden;\n }\n\n setVisible(value: boolean): void {\n this._hidden = !value;\n }\n\n setValidation(validation: IFieldValidation): void {\n this._validation = validation;\n }\n\n resetValidation(): void {\n this._validation = { isValid: null };\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 blur(): void {\n for (const cb of this._onBlurCallbacks) {\n cb(this._value, this._form!);\n }\n }\n\n setForm(form: IFormModel): void {\n this._form = form;\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\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._value,\n validation: this._validation,\n required: this.config.required,\n disabled: this._disabled,\n renderer: this.config.renderer,\n rendererSettings: this.config.rendererSettings,\n options,\n onChange: (value: unknown) => this._setValueFromUI(value),\n onBlur: () => this.blur()\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 _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._form!);\n }\n return this.config.options;\n }\n\n /**\n * Validate this field. Returns true if valid.\n * Validation order: required check → zod schema.\n */\n async validate(): Promise<boolean> {\n // Required check\n if (this.config.required) {\n const value = this._value;\n if (value === null || value === undefined || value === \"\") {\n this._validation = {\n isValid: false,\n message: this.config.requiredMessage || \"This field is required.\"\n };\n return false;\n }\n }\n\n // Zod schema check\n if (this.config.schema) {\n const result = await this.config.schema.safeParseAsync(this._value);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n runInAction(() => {\n this._validation = {\n isValid: false,\n message: firstIssue?.message || \"Invalid value.\"\n };\n });\n return false;\n }\n }\n\n runInAction(() => {\n this._validation = { isValid: true };\n });\n return true;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["makeAutoObservable","computed","runInAction","Field","_validation","isValid","_beforeChangeCallbacks","_afterChangeCallbacks","_afterSetValueCallbacks","_onBlurCallbacks","_requiredWhenCallbacks","_computed","_computedUntilDirty","_computedOverridden","_validating","_validationCacheKey","undefined","_validationCache","_isUIChange","_focusRequested","_qualifiedName","_form","_ancestorRules","constructor","config","name","defaultValue","_value","isList","_disabled","disabled","_hidden","hidden","beforeChangeCallbacks","afterChangeCallbacks","afterSetValueCallbacks","onBlurCallbacks","requiredWhenCallbacks","computedUntilDirty","vm","type","getValue","setValue","raw","transformed","normalizeValue","_applyNormalizeValue","cb","setValueSilent","value","parsed","setDisabled","_evaluateRules","visible","own","rules","all","length","evaluateRules","setVisible","setAncestorRules","setValidation","validation","resetValidation","addBeforeChange","push","addAfterChange","addAfterSetValue","addOnBlur","addRequiredWhen","fn","message","setComputed","setComputedUntilDirty","resolveRequired","_resolveRequired","required","requiredMessage","blur","setForm","form","parentPath","qualifiedName","focus","Error","focusField","requestFocus","clearFocusRequest","as","remove","removeField","options","_resolveOptions","label","help","description","note","placeholder","validating","renderer","rendererSettings","onChange","_setValueFromUI","onBlur","submitted","validate","addItem","_addItem","removeItem","index","_removeItem","focusRequested","Array","isArray","map","item","current","filter","_","i","effectiveValue","force","cacheKey","_serializeValue","requiredState","isEmpty","schema","result","safeParseAsync","success","firstIssue","error","issues","JSON","stringify","String","Math","random","isComputed","isComputedOverridden"],"sources":["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 ComputedFieldCallback\n} from \"./abstractions.js\";\n\n/**\n * Runtime observable field. Holds value, validation state, and exposes a VM for renderers.\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 _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 _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.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._form) as T;\n }\n if (this._computedUntilDirty && !this._computedOverridden && this._form) {\n return this._computedUntilDirty(this._form) 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._form!);\n }\n\n if (transformed === this._value) {\n return;\n }\n\n this._value = transformed;\n if (this._computedUntilDirty && this._isUIChange) {\n this._computedOverridden = true;\n }\n\n for (const cb of this._afterChangeCallbacks) {\n cb(transformed, this._form!);\n }\n\n if (!this._isUIChange) {\n for (const cb of this._afterSetValueCallbacks) {\n cb(transformed, this._form!);\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 this._computedOverridden = parsed !== null && parsed !== undefined;\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 return this._form.evaluateRules(all);\n }\n\n get visible(): boolean {\n if (this._hidden) {\n return false;\n }\n return this._evaluateRules().visible;\n }\n\n get disabled(): boolean {\n if (this._disabled) {\n return true;\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: (form: IFormModel) => 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 for (const cb of this._requiredWhenCallbacks) {\n if (cb.fn(this._form)) {\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._form!);\n }\n }\n\n setForm(form: IFormModel, parentPath?: string): void {\n this._form = form;\n this._qualifiedName = parentPath ? `${parentPath}.${this.config.name}` : this.config.name;\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._validation,\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: () => {\n this._focusRequested = false;\n }\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._form!);\n }\n return this.config.options;\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"],"mappings":"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","ignoreList":[]}