@webiny/app-admin 6.3.0-beta.2 → 6.3.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base/Base/DefaultFieldRenderers.js +69 -5
- package/base/Base/DefaultFieldRenderers.js.map +1 -1
- package/base/Base/DefaultLayoutRenderers.js +5 -1
- package/base/Base/DefaultLayoutRenderers.js.map +1 -1
- package/base/Base/FieldRenderers/CheckboxesRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js +28 -0
- package/base/Base/FieldRenderers/CheckboxesRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.d.ts +15 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js +17 -0
- package/base/Base/FieldRenderers/CodeEditorRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js +66 -0
- package/base/Base/FieldRenderers/DateTimeInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.d.ts +21 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js +46 -0
- package/base/Base/FieldRenderers/DateTimeRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js +47 -0
- package/base/Base/FieldRenderers/FilePickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js +25 -0
- package/base/Base/FieldRenderers/FileUrlPickerRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HiddenRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js +5 -0
- package/base/Base/FieldRenderers/HiddenRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.d.ts +5 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js +27 -0
- package/base/Base/FieldRenderers/HorizontalTabsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/InputRenderer.d.ts +4 -7
- package/base/Base/FieldRenderers/InputRenderer.js +2 -2
- package/base/Base/FieldRenderers/InputRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/NumberInputRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js +23 -0
- package/base/Base/FieldRenderers/NumberInputRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js +49 -0
- package/base/Base/FieldRenderers/NumberInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js +20 -0
- package/base/Base/FieldRenderers/ObjectRenderer/DynamicZoneRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js +65 -0
- package/base/Base/FieldRenderers/ObjectRenderer/KeyValueTagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js +109 -0
- package/base/Base/FieldRenderers/ObjectRenderer/MultiValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.d.ts +17 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js +55 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectAccordionMultipleRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.d.ts +7 -3
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js +15 -19
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectFieldComponents.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.d.ts +5 -8
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js +7 -50
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js +64 -0
- package/base/Base/FieldRenderers/ObjectRenderer/SingleValueDynamicZone.js.map +1 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.d.ts +10 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js +85 -0
- package/base/Base/FieldRenderers/ObjectRenderer/TemplatePicker.js.map +1 -0
- package/base/Base/FieldRenderers/PassthroughRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/PassthroughRenderer.js +9 -23
- package/base/Base/FieldRenderers/PassthroughRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/RadioButtonsRenderer.d.ts +13 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js +27 -0
- package/base/Base/FieldRenderers/RadioButtonsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/SelectRenderer.d.ts +6 -8
- package/base/Base/FieldRenderers/SelectRenderer.js +8 -5
- package/base/Base/FieldRenderers/SelectRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/SwitchRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js +19 -0
- package/base/Base/FieldRenderers/SwitchRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TagsRenderer.d.ts +12 -0
- package/base/Base/FieldRenderers/TagsRenderer.js +21 -0
- package/base/Base/FieldRenderers/TagsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js +48 -0
- package/base/Base/FieldRenderers/TextInputsRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/TextareaRenderer.d.ts +3 -6
- package/base/Base/FieldRenderers/TextareaRenderer.js +3 -4
- package/base/Base/FieldRenderers/TextareaRenderer.js.map +1 -1
- package/base/Base/FieldRenderers/TextareasRenderer.d.ts +14 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js +51 -0
- package/base/Base/FieldRenderers/TextareasRenderer.js.map +1 -0
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js +2 -2
- package/base/Base/FieldRenderers/VerticalTabsRenderer.js.map +1 -1
- package/base/Base/Menus.js +5 -64
- package/base/Base/Menus.js.map +1 -1
- package/base/Base/RoutesConfig.js +6 -0
- package/base/Base/RoutesConfig.js.map +1 -1
- package/exports/admin/build-params.d.ts +2 -0
- package/exports/admin/build-params.js +3 -0
- package/exports/admin/build-params.js.map +1 -1
- package/exports/admin/form.d.ts +5 -0
- package/exports/admin/form.js +8 -0
- package/exports/admin/form.js.map +1 -1
- package/exports/admin/ui.d.ts +1 -0
- package/exports/admin/ui.js +1 -0
- package/exports/admin/ui.js.map +1 -1
- package/exports/admin.d.ts +3 -1
- package/exports/admin.js +3 -1
- package/exports/admin.js.map +1 -1
- package/features/formModel/ConditionRuleEvaluator.d.ts +9 -0
- package/features/formModel/ConditionRuleEvaluator.js +56 -0
- package/features/formModel/ConditionRuleEvaluator.js.map +1 -0
- package/features/formModel/Field.d.ts +50 -4
- package/features/formModel/Field.js +254 -35
- package/features/formModel/Field.js.map +1 -1
- package/features/formModel/FieldBuilder.d.ts +17 -35
- package/features/formModel/FieldBuilder.js +63 -100
- package/features/formModel/FieldBuilder.js.map +1 -1
- package/features/formModel/FieldBuilder.test.js +127 -13
- package/features/formModel/FieldBuilder.test.js.map +1 -1
- package/features/formModel/FieldBuilderRegistry.d.ts +4 -0
- package/features/formModel/FieldBuilderRegistry.js +31 -0
- package/features/formModel/FieldBuilderRegistry.js.map +1 -0
- package/features/formModel/FocusManager.d.ts +14 -0
- package/features/formModel/FocusManager.js +109 -0
- package/features/formModel/FocusManager.js.map +1 -0
- package/features/formModel/FormModel.d.ts +27 -31
- package/features/formModel/FormModel.js +210 -403
- package/features/formModel/FormModel.js.map +1 -1
- package/features/formModel/FormModel.test.js +2044 -193
- package/features/formModel/FormModel.test.js.map +1 -1
- package/features/formModel/FormModelFactory.d.ts +4 -2
- package/features/formModel/FormModelFactory.js +13 -3
- package/features/formModel/FormModelFactory.js.map +1 -1
- package/features/formModel/FormView.d.ts +2 -0
- package/features/formModel/FormView.js +44 -37
- package/features/formModel/FormView.js.map +1 -1
- package/features/formModel/LayoutBuilderFactory.d.ts +61 -0
- package/features/formModel/LayoutBuilderFactory.js +386 -0
- package/features/formModel/LayoutBuilderFactory.js.map +1 -0
- package/features/formModel/LayoutMutator.d.ts +11 -0
- package/features/formModel/LayoutMutator.js +136 -0
- package/features/formModel/LayoutMutator.js.map +1 -0
- package/features/formModel/LayoutResolver.d.ts +26 -0
- package/features/formModel/LayoutResolver.js +239 -0
- package/features/formModel/LayoutResolver.js.map +1 -0
- package/features/formModel/ObjectField.d.ts +55 -4
- package/features/formModel/ObjectField.js +499 -82
- package/features/formModel/ObjectField.js.map +1 -1
- package/features/formModel/Rules.test.d.ts +1 -0
- package/features/formModel/Rules.test.js +289 -0
- package/features/formModel/Rules.test.js.map +1 -0
- package/features/formModel/abstractions.d.ts +402 -52
- package/features/formModel/abstractions.js +55 -0
- package/features/formModel/abstractions.js.map +1 -1
- package/features/formModel/createFieldRenderer.d.ts +20 -0
- package/features/formModel/createFieldRenderer.js +15 -0
- package/features/formModel/createFieldRenderer.js.map +1 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.d.ts +18 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js +225 -0
- package/features/formModel/demo/FieldRenderersDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelDemo.d.ts +4 -0
- package/features/formModel/demo/FormModelDemo.js +230 -0
- package/features/formModel/demo/FormModelDemo.js.map +1 -0
- package/features/formModel/demo/FormModelDemoPresenter.d.ts +22 -0
- package/features/formModel/demo/FormModelDemoPresenter.js +121 -0
- package/features/formModel/demo/FormModelDemoPresenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase11Presenter.d.ts +25 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js +104 -0
- package/features/formModel/demo/FormModelPhase11Presenter.js.map +1 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.d.ts +23 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js +62 -0
- package/features/formModel/demo/FormModelPhase8c1Presenter.js.map +1 -0
- package/features/formModel/feature.js +12 -0
- package/features/formModel/feature.js.map +1 -1
- package/features/formModel/fieldTypes/BooleanFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js +23 -0
- package/features/formModel/fieldTypes/BooleanFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.d.ts +173 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js +369 -0
- package/features/formModel/fieldTypes/DateTimeFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js +20 -0
- package/features/formModel/fieldTypes/FileUrlFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/NumberFieldType.d.ts +19 -0
- package/features/formModel/fieldTypes/NumberFieldType.js +27 -0
- package/features/formModel/fieldTypes/NumberFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/ObjectFieldType.d.ts +34 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js +109 -0
- package/features/formModel/fieldTypes/ObjectFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/TextFieldType.d.ts +18 -0
- package/features/formModel/fieldTypes/TextFieldType.js +20 -0
- package/features/formModel/fieldTypes/TextFieldType.js.map +1 -0
- package/features/formModel/fieldTypes/index.d.ts +7 -0
- package/features/formModel/fieldTypes/index.js +9 -0
- package/features/formModel/fieldTypes/index.js.map +1 -0
- package/features/formModel/index.d.ts +13 -4
- package/features/formModel/index.js +21 -2
- package/features/formModel/index.js.map +1 -1
- package/features/formModel/renderers.d.ts +15 -1
- package/features/formModel/renderers.js +15 -1
- package/features/formModel/renderers.js.map +1 -1
- package/features/tools/LexicalContext/LexicalContext.d.ts +14 -0
- package/features/tools/LexicalContext/LexicalContext.js +22 -0
- package/features/tools/LexicalContext/LexicalContext.js.map +1 -0
- package/features/tools/LexicalContext/abstractions.d.ts +11 -0
- package/features/tools/LexicalContext/abstractions.js +4 -0
- package/features/tools/LexicalContext/abstractions.js.map +1 -0
- package/features/tools/LexicalContext/index.d.ts +2 -0
- package/features/tools/LexicalContext/index.js +3 -0
- package/features/tools/LexicalContext/index.js.map +1 -0
- package/features/tools/feature.js +2 -0
- package/features/tools/feature.js.map +1 -1
- package/features/tools/index.d.ts +1 -0
- package/features/tools/index.js +1 -0
- package/features/tools/index.js.map +1 -1
- package/index.d.ts +8 -1
- package/index.js +7 -0
- package/index.js.map +1 -1
- package/package.json +30 -24
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js +1 -1
- package/presentation/installation/components/SystemInstaller/steps/AdminUserStep/createPasswordValidator.js.map +1 -1
- package/presentation/lexicalContext/useLexicalContext.d.ts +3 -0
- package/presentation/lexicalContext/useLexicalContext.js +14 -0
- package/presentation/lexicalContext/useLexicalContext.js.map +1 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.d.ts +3 -0
- package/presentation/textToLexicalTool/TextToLexicalTool.js +6 -2
- package/presentation/textToLexicalTool/TextToLexicalTool.js.map +1 -1
- package/presentation/textToLexicalTool/textToLexicalState.d.ts +2 -1
- package/presentation/textToLexicalTool/textToLexicalState.js +15 -3
- package/presentation/textToLexicalTool/textToLexicalState.js.map +1 -1
- package/routes.d.ts +1 -0
- package/routes.js +4 -0
- package/routes.js.map +1 -1
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.d.ts +0 -21
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js +0 -28
- package/base/Base/FieldRenderers/ObjectRenderer/ObjectListFlatRenderer.js.map +0 -1
|
@@ -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(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
266
|
+
value: this.getValue(),
|
|
137
267
|
validation: this._validation,
|
|
138
|
-
|
|
139
|
-
|
|
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: () =>
|
|
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
|
-
|
|
171
|
-
|
|
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:
|
|
176
|
-
message: this.config.requiredMessage || "This field is required."
|
|
336
|
+
isValid: null
|
|
177
337
|
};
|
|
178
|
-
|
|
179
|
-
|
|
338
|
+
});
|
|
339
|
+
return true;
|
|
180
340
|
}
|
|
341
|
+
const effectiveValue = this.getValue();
|
|
181
342
|
|
|
182
|
-
//
|
|
183
|
-
if (this.
|
|
184
|
-
const
|
|
185
|
-
if (
|
|
186
|
-
|
|
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.
|
|
198
|
-
isValid: true
|
|
199
|
-
};
|
|
351
|
+
this._validating = true;
|
|
200
352
|
});
|
|
201
|
-
|
|
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":[]}
|