@veltra/desktop 1.1.36 → 1.2.1

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 (129) hide show
  1. package/dist/components/auto-complete/auto-complete.js +1 -0
  2. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  3. package/dist/components/batch-edit/batch-edit-form.js +12 -5
  4. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  5. package/dist/components/batch-edit/batch-edit.js +8 -3
  6. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  7. package/dist/components/batch-edit/batch-edit.vue.d.ts +40 -35
  8. package/dist/components/batch-edit/di.js.map +1 -1
  9. package/dist/components/batch-edit/use-edit.js +41 -23
  10. package/dist/components/batch-edit/use-edit.js.map +1 -1
  11. package/dist/components/cascade/cascade.js +1 -0
  12. package/dist/components/cascade/cascade.js.map +1 -1
  13. package/dist/components/checkbox/checkbox-button.js +1 -0
  14. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  15. package/dist/components/checkbox/checkbox.js +1 -0
  16. package/dist/components/checkbox/checkbox.js.map +1 -1
  17. package/dist/components/checkbox-group/checkbox-group.js +1 -0
  18. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  19. package/dist/components/code-editor/code-editor.js +2 -1
  20. package/dist/components/code-editor/code-editor.js.map +1 -1
  21. package/dist/components/condition-editor/core/evaluator.js +3 -3
  22. package/dist/components/condition-editor/core/evaluator.js.map +1 -1
  23. package/dist/components/date-picker/date-picker.js +1 -0
  24. package/dist/components/date-picker/date-picker.js.map +1 -1
  25. package/dist/components/date-range-picker/date-range-picker.js +2 -0
  26. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  27. package/dist/components/expression-editor/expression-editor.js +1 -0
  28. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  29. package/dist/components/file-picker/file-picker.js +1 -0
  30. package/dist/components/file-picker/file-picker.js.map +1 -1
  31. package/dist/components/form/form.js.map +1 -1
  32. package/dist/components/form/form.vue.d.ts +11 -19
  33. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +24 -26
  34. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  35. package/dist/components/form/index.d.ts +0 -3
  36. package/dist/components/form/use-form-fields.js +88 -0
  37. package/dist/components/form/use-form-fields.js.map +1 -0
  38. package/dist/components/form/use-node-interceptor.js +19 -30
  39. package/dist/components/form/use-node-interceptor.js.map +1 -1
  40. package/dist/components/form-item/form-item.js.map +1 -1
  41. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +44 -18
  42. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/form-item/helper.js +4 -1
  44. package/dist/components/form-item/helper.js.map +1 -1
  45. package/dist/components/form-item/validate.js +97 -0
  46. package/dist/components/form-item/validate.js.map +1 -0
  47. package/dist/components/group-input/group-input.js +1 -0
  48. package/dist/components/group-input/group-input.js.map +1 -1
  49. package/dist/components/index.d.ts +0 -3
  50. package/dist/components/index.js +0 -7
  51. package/dist/components/input/input.vue.d.ts +4 -4
  52. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +1 -0
  53. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/multi-select/multi-select.js +1 -0
  55. package/dist/components/multi-select/multi-select.js.map +1 -1
  56. package/dist/components/multi-tree-select/multi-tree-select.js +1 -0
  57. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  58. package/dist/components/number-input/number-input.js +1 -0
  59. package/dist/components/number-input/number-input.js.map +1 -1
  60. package/dist/components/number-range-input/number-range-input.js +1 -0
  61. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  62. package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
  63. package/dist/components/palette/palette.js +1 -0
  64. package/dist/components/palette/palette.js.map +1 -1
  65. package/dist/components/password-input/password-input.js +1 -0
  66. package/dist/components/password-input/password-input.js.map +1 -1
  67. package/dist/components/radio/radio.js +1 -0
  68. package/dist/components/radio/radio.js.map +1 -1
  69. package/dist/components/radio-group/radio-group.js +1 -0
  70. package/dist/components/radio-group/radio-group.js.map +1 -1
  71. package/dist/components/rich-text-editor/rich-text-editor.js +3 -2
  72. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  73. package/dist/components/rich-text-editor/toolbar.js +10 -7
  74. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  75. package/dist/components/select/select.js +6 -3
  76. package/dist/components/select/select.js.map +1 -1
  77. package/dist/components/slider/slider.js +15 -2
  78. package/dist/components/slider/slider.js.map +1 -1
  79. package/dist/components/switch/switch.js +1 -0
  80. package/dist/components/switch/switch.js.map +1 -1
  81. package/dist/components/tabs/tabs-horizontal.vue.d.ts +2 -2
  82. package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
  83. package/dist/components/tabs/tabs.vue.d.ts +2 -2
  84. package/dist/components/textarea/textarea.js +1 -0
  85. package/dist/components/textarea/textarea.js.map +1 -1
  86. package/dist/components/tip/tip.vue.d.ts +3 -3
  87. package/dist/components/tree-select/tree-select.js +1 -0
  88. package/dist/components/tree-select/tree-select.js.map +1 -1
  89. package/dist/index.d.ts +3 -6
  90. package/dist/index.js +1 -4
  91. package/dist/types/batch-edit.d.ts +4 -5
  92. package/dist/types/form.d.ts +9 -48
  93. package/dist/types/index.d.ts +2 -2
  94. package/package.json +6 -6
  95. package/src/components/batch-edit/batch-edit-form.vue +20 -13
  96. package/src/components/batch-edit/batch-edit.vue +7 -8
  97. package/src/components/batch-edit/di.ts +1 -2
  98. package/src/components/batch-edit/use-edit.ts +58 -36
  99. package/src/components/date-range-picker/date-range-picker.vue +2 -0
  100. package/src/components/form/form.vue +22 -38
  101. package/src/components/form/index.ts +0 -6
  102. package/src/components/form/use-form-fields.ts +126 -0
  103. package/src/components/form/use-node-interceptor.ts +27 -56
  104. package/src/components/form-item/form-item.vue +69 -18
  105. package/src/components/form-item/helper.ts +5 -1
  106. package/src/components/form-item/validate.ts +131 -0
  107. package/src/components/rich-text-editor/rich-text-editor.vue +28 -25
  108. package/src/components/rich-text-editor/toolbar.vue +23 -19
  109. package/src/components/select/select.vue +6 -4
  110. package/src/components/slider/slider.vue +12 -2
  111. package/src/types/auto-complete.ts +1 -1
  112. package/src/types/batch-edit.ts +4 -5
  113. package/src/types/form.ts +9 -82
  114. package/src/types/radio-group.ts +1 -0
  115. package/src/types/radio.ts +1 -0
  116. package/src/types/tree-select.ts +1 -1
  117. package/dist/components/form/dynamic-form-model.d.ts +0 -73
  118. package/dist/components/form/dynamic-form-model.js +0 -184
  119. package/dist/components/form/dynamic-form-model.js.map +0 -1
  120. package/dist/components/form/form-model.d.ts +0 -73
  121. package/dist/components/form/form-model.js +0 -179
  122. package/dist/components/form/form-model.js.map +0 -1
  123. package/dist/components/form/helper.d.ts +0 -16
  124. package/dist/components/form/helper.js +0 -20
  125. package/dist/components/form/helper.js.map +0 -1
  126. package/src/components/form/__test__/form-model.test.ts +0 -190
  127. package/src/components/form/dynamic-form-model.ts +0 -258
  128. package/src/components/form/form-model.ts +0 -255
  129. package/src/components/form/helper.ts +0 -23
@@ -1,4 +1 @@
1
- import { NestedFieldMarker, formField, nestField } from "./helper.js";
2
- import { DynamicFormModel } from "./dynamic-form-model.js";
3
- import { FormModel } from "./form-model.js";
4
1
  import { _default } from "./form.vue.js";
@@ -0,0 +1,88 @@
1
+ import { nextTick, watch } from "vue";
2
+ import { o } from "@cat-kit/core";
3
+ //#region src/components/form/use-form-fields.ts
4
+ /** 深拷贝 model,保留 undefined 等 o().copy() 会丢弃的值 */
5
+ function snapshotModel(model) {
6
+ const result = {};
7
+ for (const key of Object.keys(model)) {
8
+ const value = model[key];
9
+ if (Array.isArray(value)) result[key] = value.map((item) => item !== null && typeof item === "object" ? snapshotModel(item) : item);
10
+ else if (value !== null && typeof value === "object") result[key] = snapshotModel(value);
11
+ else result[key] = value;
12
+ }
13
+ return result;
14
+ }
15
+ /** 按快照逐字段写回 model,支持 undefined 与嵌套对象 */
16
+ function applySnapshot(target, source) {
17
+ for (const key of Object.keys(source)) {
18
+ const sourceValue = source[key];
19
+ const targetValue = target[key];
20
+ if (sourceValue !== null && typeof sourceValue === "object" && !Array.isArray(sourceValue) && targetValue !== null && typeof targetValue === "object" && !Array.isArray(targetValue)) {
21
+ applySnapshot(targetValue, sourceValue);
22
+ continue;
23
+ }
24
+ if (Array.isArray(sourceValue)) {
25
+ o(target).set(key, sourceValue.map((item) => item !== null && typeof item === "object" ? snapshotModel(item) : item));
26
+ continue;
27
+ }
28
+ o(target).set(key, sourceValue);
29
+ }
30
+ }
31
+ function useFormFields(options) {
32
+ const { props } = options;
33
+ const fields = {};
34
+ let willValidate = true;
35
+ /** model 初始快照,供 reset 恢复 */
36
+ let initialSnapshot;
37
+ function runWithoutChangeValidate(fn) {
38
+ willValidate = false;
39
+ fn();
40
+ nextTick(() => {
41
+ willValidate = true;
42
+ });
43
+ }
44
+ function shouldValidate() {
45
+ return willValidate;
46
+ }
47
+ watch(() => props.model, (model) => {
48
+ initialSnapshot = model ? snapshotModel(model) : void 0;
49
+ }, {
50
+ immediate: true,
51
+ deep: false
52
+ });
53
+ function registerField(field, item) {
54
+ fields[field] = item;
55
+ }
56
+ function unregisterField(field) {
57
+ delete fields[field];
58
+ }
59
+ function clearValidate() {
60
+ Object.values(fields).forEach((item) => item.clearValidate?.());
61
+ }
62
+ async function validate(keys) {
63
+ let validList;
64
+ if (keys) validList = await Promise.all(keys.map((key) => fields[key]?.validate() ?? Promise.resolve(true)));
65
+ else validList = await Promise.all(Object.values(fields).map((field) => field.validate()));
66
+ return validList.every((valid) => valid);
67
+ }
68
+ function reset() {
69
+ if (!props.model || !initialSnapshot) return;
70
+ runWithoutChangeValidate(() => {
71
+ applySnapshot(props.model, initialSnapshot);
72
+ Object.values(fields).forEach((item) => item.clearValidate?.());
73
+ });
74
+ }
75
+ return {
76
+ fields,
77
+ registerField,
78
+ validate,
79
+ unregisterField,
80
+ clearValidate,
81
+ reset,
82
+ shouldValidate
83
+ };
84
+ }
85
+ //#endregion
86
+ export { useFormFields };
87
+
88
+ //# sourceMappingURL=use-form-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-form-fields.js","names":[],"sources":["../../../src/components/form/use-form-fields.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport type { FormFieldItem } from '@veltra/utils'\nimport { nextTick, watch } from 'vue'\n\nimport type { FormProps } from '../../types/form'\n\ninterface Options {\n props: FormProps\n}\n\n/** 深拷贝 model,保留 undefined 等 o().copy() 会丢弃的值 */\nfunction snapshotModel(model: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(model)) {\n const value = model[key]\n if (Array.isArray(value)) {\n result[key] = value.map((item) =>\n item !== null && typeof item === 'object' ? snapshotModel(item) : item\n )\n } else if (value !== null && typeof value === 'object') {\n result[key] = snapshotModel(value)\n } else {\n result[key] = value\n }\n }\n\n return result\n}\n\n/** 按快照逐字段写回 model,支持 undefined 与嵌套对象 */\nfunction applySnapshot(target: Record<string, any>, source: Record<string, any>) {\n for (const key of Object.keys(source)) {\n const sourceValue = source[key]\n const targetValue = target[key]\n\n if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n applySnapshot(targetValue, sourceValue)\n continue\n }\n\n if (Array.isArray(sourceValue)) {\n o(target).set(\n key,\n sourceValue.map((item) =>\n item !== null && typeof item === 'object' ? snapshotModel(item) : item\n )\n )\n continue\n }\n\n o(target).set(key, sourceValue)\n }\n}\n\nexport function useFormFields(options: Options) {\n const { props } = options\n const fields: Record<string, FormFieldItem> = {}\n\n let willValidate = true\n\n /** model 初始快照,供 reset 恢复 */\n let initialSnapshot: Record<string, any> | undefined\n\n function runWithoutChangeValidate(fn: () => void) {\n willValidate = false\n fn()\n nextTick(() => {\n willValidate = true\n })\n }\n\n function shouldValidate() {\n return willValidate\n }\n\n watch(\n () => props.model,\n (model) => {\n initialSnapshot = model ? snapshotModel(model) : undefined\n },\n { immediate: true, deep: false }\n )\n\n function registerField(field: string, item: FormFieldItem) {\n fields[field] = item\n }\n\n function unregisterField(field: string) {\n delete fields[field]\n }\n\n function clearValidate() {\n Object.values(fields).forEach((item) => item.clearValidate?.())\n }\n\n async function validate(keys?: string[]) {\n let validList: boolean[]\n if (keys) {\n validList = await Promise.all(\n keys.map((key) => fields[key]?.validate() ?? Promise.resolve(true))\n )\n } else {\n validList = await Promise.all(Object.values(fields).map((field) => field.validate()))\n }\n return validList.every((valid) => valid)\n }\n\n function reset() {\n if (!props.model || !initialSnapshot) return\n\n runWithoutChangeValidate(() => {\n applySnapshot(props.model!, initialSnapshot!)\n Object.values(fields).forEach((item) => item.clearValidate?.())\n })\n }\n\n return { fields, registerField, validate, unregisterField, clearValidate, reset, shouldValidate }\n}\n"],"mappings":";;;;AAWA,SAAS,cAAc,OAAiD;CACtE,MAAM,SAA8B,CAAC;CAErC,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG;EACpC,MAAM,QAAQ,MAAM;EACpB,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,OAAO,MAAM,KAAK,SACvB,SAAS,QAAQ,OAAO,SAAS,WAAW,cAAc,IAAI,IAAI,IACpE;OACK,IAAI,UAAU,QAAQ,OAAO,UAAU,UAC5C,OAAO,OAAO,cAAc,KAAK;OAEjC,OAAO,OAAO;CAElB;CAEA,OAAO;AACT;;AAGA,SAAS,cAAc,QAA6B,QAA6B;CAC/E,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG;EACrC,MAAM,cAAc,OAAO;EAC3B,MAAM,cAAc,OAAO;EAE3B,IACE,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,KAC1B,gBAAgB,QAChB,OAAO,gBAAgB,YACvB,CAAC,MAAM,QAAQ,WAAW,GAC1B;GACA,cAAc,aAAa,WAAW;GACtC;EACF;EAEA,IAAI,MAAM,QAAQ,WAAW,GAAG;GAC9B,EAAE,MAAM,EAAE,IACR,KACA,YAAY,KAAK,SACf,SAAS,QAAQ,OAAO,SAAS,WAAW,cAAc,IAAI,IAAI,IACpE,CACF;GACA;EACF;EAEA,EAAE,MAAM,EAAE,IAAI,KAAK,WAAW;CAChC;AACF;AAEA,SAAgB,cAAc,SAAkB;CAC9C,MAAM,EAAE,UAAU;CAClB,MAAM,SAAwC,CAAC;CAE/C,IAAI,eAAe;;CAGnB,IAAI;CAEJ,SAAS,yBAAyB,IAAgB;EAChD,eAAe;EACf,GAAG;EACH,eAAe;GACb,eAAe;EACjB,CAAC;CACH;CAEA,SAAS,iBAAiB;EACxB,OAAO;CACT;CAEA,YACQ,MAAM,QACX,UAAU;EACT,kBAAkB,QAAQ,cAAc,KAAK,IAAI,KAAA;CACnD,GACA;EAAE,WAAW;EAAM,MAAM;CAAM,CACjC;CAEA,SAAS,cAAc,OAAe,MAAqB;EACzD,OAAO,SAAS;CAClB;CAEA,SAAS,gBAAgB,OAAe;EACtC,OAAO,OAAO;CAChB;CAEA,SAAS,gBAAgB;EACvB,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,KAAK,gBAAgB,CAAC;CAChE;CAEA,eAAe,SAAS,MAAiB;EACvC,IAAI;EACJ,IAAI,MACF,YAAY,MAAM,QAAQ,IACxB,KAAK,KAAK,QAAQ,OAAO,MAAM,SAAS,KAAK,QAAQ,QAAQ,IAAI,CAAC,CACpE;OAEA,YAAY,MAAM,QAAQ,IAAI,OAAO,OAAO,MAAM,EAAE,KAAK,UAAU,MAAM,SAAS,CAAC,CAAC;EAEtF,OAAO,UAAU,OAAO,UAAU,KAAK;CACzC;CAEA,SAAS,QAAQ;EACf,IAAI,CAAC,MAAM,SAAS,CAAC,iBAAiB;EAEtC,+BAA+B;GAC7B,cAAc,MAAM,OAAQ,eAAgB;GAC5C,OAAO,OAAO,MAAM,EAAE,SAAS,SAAS,KAAK,gBAAgB,CAAC;EAChE,CAAC;CACH;CAEA,OAAO;EAAE;EAAQ;EAAe;EAAU;EAAiB;EAAe;EAAO;CAAe;AAClG"}
@@ -1,54 +1,43 @@
1
- import { onBeforeUnmount, useSlots } from "vue";
2
- import { createIncrease, extractNormalVNodes } from "@veltra/utils";
1
+ import { useSlots } from "vue";
2
+ import { extractNormalVNodes } from "@veltra/utils";
3
3
  import { o } from "@cat-kit/core";
4
4
  //#region src/components/form/use-node-interceptor.ts
5
- const id = createIncrease(1);
6
5
  /**
7
6
  * 虚拟node拦截
8
- * @param options 选项
9
7
  * @returns
10
8
  */
11
- function useNodeInterceptor(options) {
12
- const { props } = options;
9
+ function useNodeInterceptor() {
13
10
  const slots = useSlots();
14
- const formId = id();
15
11
  function getSlotsNodes() {
16
- const { model } = props;
17
- const nodes = slots.default?.({
18
- model,
19
- data: model?.data
20
- });
12
+ const nodes = slots.default?.();
21
13
  if (!nodes?.length) return null;
22
14
  const flattedNodes = extractNormalVNodes(nodes);
23
15
  const results = [];
24
- const fields = [];
25
16
  let i = 0;
26
17
  while (i < flattedNodes.length) {
27
18
  const node = flattedNodes[i];
28
19
  i++;
29
20
  const { props, type } = node;
30
- const item = {
31
- isFormItem: type?.name === "FormItem",
32
- formItemProps: o(props ?? {}).pick([
33
- "label",
34
- "field",
35
- "span",
36
- "tips",
37
- "readonly"
38
- ]),
21
+ const field = props?.field;
22
+ const isFormItem = type?.name === "FormItem";
23
+ const formItemProps = o(props ?? {}).pick([
24
+ "label",
25
+ "rules",
26
+ "span",
27
+ "tips",
28
+ "readonly",
29
+ "field"
30
+ ]);
31
+ results.push({
32
+ isFormItem,
33
+ formItemProps,
39
34
  node,
40
- field: props?.field,
35
+ field,
41
36
  modelValue: props?.["model-value"] ?? props?.modelValue
42
- };
43
- item.field && fields.push(item.field);
44
- results.push(item);
37
+ });
45
38
  }
46
- model.formKeys.set(formId, fields);
47
39
  return results;
48
40
  }
49
- onBeforeUnmount(() => {
50
- props.model?.formKeys.delete(formId);
51
- });
52
41
  return { getSlotsNodes };
53
42
  }
54
43
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"use-node-interceptor.js","names":[],"sources":["../../../src/components/form/use-node-interceptor.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { createIncrease, extractNormalVNodes } from '@veltra/utils'\nimport { onBeforeUnmount, useSlots, type VNode } from 'vue'\n\nimport type { FormProps } from '../../types'\n\ninterface Options {\n props: FormProps\n}\n\nexport type SlotRenderItem =\n | {\n isFormItem: true\n formItemProps: Record<string, any>\n node: VNode\n field: undefined\n modelValue?: any\n }\n | {\n isFormItem: false\n formItemProps: Record<string, any>\n node: VNode\n field: string\n modelValue?: any\n }\n\nconst id = createIncrease(1)\n\n/**\n * 虚拟node拦截\n * @param options 选项\n * @returns\n */\nexport function useNodeInterceptor(options: Options): {\n getSlotsNodes: () => SlotRenderItem[] | null\n} {\n const { props } = options\n const slots = useSlots()\n\n const formId = id()\n\n function getSlotsNodes() {\n const { model } = props\n const nodes = slots.default?.({ model, data: model?.data })\n if (!nodes?.length) return null\n\n const flattedNodes = extractNormalVNodes(nodes)\n\n const results: SlotRenderItem[] = []\n\n // 渲染表单后得到的应当校验的字段\n const fields: string[] = []\n\n let i = 0\n while (i < flattedNodes.length) {\n const node = flattedNodes[i]!\n i++\n\n const { props, type } = node\n const item = {\n isFormItem: (type as any)?.name === 'FormItem',\n formItemProps: o((props ?? {}) as Record<string, any>).pick([\n 'label',\n 'field',\n 'span',\n 'tips',\n 'readonly'\n ]),\n node,\n field: props?.field,\n modelValue: props?.['model-value'] ?? props?.modelValue\n }\n\n item.field && fields.push(item.field)\n results.push(item)\n }\n\n model.formKeys.set(formId, fields)\n return results\n }\n\n onBeforeUnmount(() => {\n props.model?.formKeys.delete(formId)\n })\n\n return { getSlotsNodes }\n}\n"],"mappings":";;;;AA0BA,MAAM,KAAK,eAAe,CAAC;;;;;;AAO3B,SAAgB,mBAAmB,SAEjC;CACA,MAAM,EAAE,UAAU;CAClB,MAAM,QAAQ,SAAS;CAEvB,MAAM,SAAS,GAAG;CAElB,SAAS,gBAAgB;EACvB,MAAM,EAAE,UAAU;EAClB,MAAM,QAAQ,MAAM,UAAU;GAAE;GAAO,MAAM,OAAO;EAAK,CAAC;EAC1D,IAAI,CAAC,OAAO,QAAQ,OAAO;EAE3B,MAAM,eAAe,oBAAoB,KAAK;EAE9C,MAAM,UAA4B,CAAC;EAGnC,MAAM,SAAmB,CAAC;EAE1B,IAAI,IAAI;EACR,OAAO,IAAI,aAAa,QAAQ;GAC9B,MAAM,OAAO,aAAa;GAC1B;GAEA,MAAM,EAAE,OAAO,SAAS;GACxB,MAAM,OAAO;IACX,YAAa,MAAc,SAAS;IACpC,eAAe,EAAG,SAAS,CAAC,CAAyB,EAAE,KAAK;KAC1D;KACA;KACA;KACA;KACA;IACF,CAAC;IACD;IACA,OAAO,OAAO;IACd,YAAY,QAAQ,kBAAkB,OAAO;GAC/C;GAEA,KAAK,SAAS,OAAO,KAAK,KAAK,KAAK;GACpC,QAAQ,KAAK,IAAI;EACnB;EAEA,MAAM,SAAS,IAAI,QAAQ,MAAM;EACjC,OAAO;CACT;CAEA,sBAAsB;EACpB,MAAM,OAAO,SAAS,OAAO,MAAM;CACrC,CAAC;CAED,OAAO,EAAE,cAAc;AACzB"}
1
+ {"version":3,"file":"use-node-interceptor.js","names":[],"sources":["../../../src/components/form/use-node-interceptor.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { extractNormalVNodes } from '@veltra/utils'\nimport { useSlots, type VNode } from 'vue'\n\nexport type SlotRenderItem = {\n isFormItem: boolean\n formItemProps?: Record<string, any>\n node: VNode\n field?: string\n modelValue?: any\n}\n\n/**\n * 虚拟node拦截\n * @returns\n */\nexport function useNodeInterceptor(): { getSlotsNodes: () => SlotRenderItem[] | null } {\n const slots = useSlots()\n\n function getSlotsNodes() {\n const nodes = slots.default?.()\n if (!nodes?.length) return null\n\n const flattedNodes = extractNormalVNodes(nodes)\n\n const results: SlotRenderItem[] = []\n\n let i = 0\n while (i < flattedNodes.length) {\n const node = flattedNodes[i]!\n i++\n\n const { props, type } = node\n const field = props?.field as string | undefined\n const isFormItem = (type as any)?.name === 'FormItem'\n const formItemProps = o((props ?? {}) as Record<string, any>).pick([\n 'label',\n 'rules',\n 'span',\n 'tips',\n 'readonly',\n 'field'\n ]) as Record<string, any>\n\n results.push({\n isFormItem,\n formItemProps,\n node,\n field,\n modelValue: props?.['model-value'] ?? props?.modelValue\n })\n }\n\n return results\n }\n\n return { getSlotsNodes }\n}\n"],"mappings":";;;;;;;;AAgBA,SAAgB,qBAAuE;CACrF,MAAM,QAAQ,SAAS;CAEvB,SAAS,gBAAgB;EACvB,MAAM,QAAQ,MAAM,UAAU;EAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO;EAE3B,MAAM,eAAe,oBAAoB,KAAK;EAE9C,MAAM,UAA4B,CAAC;EAEnC,IAAI,IAAI;EACR,OAAO,IAAI,aAAa,QAAQ;GAC9B,MAAM,OAAO,aAAa;GAC1B;GAEA,MAAM,EAAE,OAAO,SAAS;GACxB,MAAM,QAAQ,OAAO;GACrB,MAAM,aAAc,MAAc,SAAS;GAC3C,MAAM,gBAAgB,EAAG,SAAS,CAAC,CAAyB,EAAE,KAAK;IACjE;IACA;IACA;IACA;IACA;IACA;GACF,CAAC;GAED,QAAQ,KAAK;IACX;IACA;IACA;IACA;IACA,YAAY,QAAQ,kBAAkB,OAAO;GAC/C,CAAC;EACH;EAEA,OAAO;CACT;CAEA,OAAO,EAAE,cAAc;AACzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-item.js","names":[],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', fieldRequired)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!formProps?.readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTips\">\n {{ errorTips }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls } from './helper'\n\ndefineOptions({ name: 'FormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps } = injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('error', !!errorTips.value)].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\n/** 错误提示 */\nconst errorTips = computed<string | undefined>(() => {\n if (!props.field) return undefined\n return formProps?.model?.errors.get(props.field)?.[0]\n})\n\n/** 字段是否必须 */\nconst fieldRequired = computed<boolean>(() => {\n const { field } = props\n if (!field || readonly.value) return false\n const required = formProps?.model?.fields[field]?.required\n return Boolean(required)\n})\n</script>\n"],"mappings":""}
1
+ {"version":3,"file":"form-item.js","names":[],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'FormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate } = injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('error', !!errorTip.value)].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n () => {\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":""}
@@ -1,9 +1,11 @@
1
1
  import _sfc_main from "../tip/tip.js";
2
2
  import _sfc_main$1 from "../grid/grid-item.js";
3
- import { formItemCls } from "./helper.js";
4
- import { Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderSlot, toDisplayString, unref, withCtx } from "vue";
3
+ import { defineField, formItemCls } from "./helper.js";
4
+ import { validateField } from "./validate.js";
5
+ import { Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, renderSlot, shallowRef, toDisplayString, unref, watch, withCtx } from "vue";
5
6
  import { useConfig, useFallbackProps } from "@veltra/compositions";
6
7
  import { bem, injectFormContext, withUnit } from "@veltra/utils";
8
+ import { o } from "@cat-kit/core";
7
9
  //#region src/components/form-item/form-item.vue?vue&type=script&setup=true&lang.tsx
8
10
  var form_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
11
  name: "FormItem",
@@ -19,39 +21,63 @@ var form_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
19
21
  type: Boolean,
20
22
  default: void 0
21
23
  },
24
+ rules: {},
22
25
  size: {}
23
26
  },
24
27
  setup(__props) {
25
28
  const props = __props;
26
29
  /** 表单组件上下文 */
27
- const { formProps } = injectFormContext();
30
+ const { formProps, registerField, unregisterField, shouldValidate } = injectFormContext();
28
31
  const { config } = useConfig();
29
32
  const { size, readonly } = useFallbackProps([formProps ?? {}, props], {
30
33
  size: "default",
31
34
  readonly: false
32
35
  });
36
+ const errorTip = shallowRef();
37
+ /** 递增序号,丢弃过期的异步校验结果 */
38
+ let validateSeq = 0;
39
+ /** 最近一次 validate 的 Promise,供过期调用等待最新结果 */
40
+ let latestValidatePromise = Promise.resolve(true);
33
41
  const className = computed(() => {
34
42
  return [
35
43
  formItemCls.b,
36
44
  formItemCls.m(size.value),
37
- bem.is("error", !!errorTips.value)
45
+ bem.is("error", !!errorTip.value)
38
46
  ].join(" ");
39
47
  });
40
48
  /** label样式 */
41
49
  const labelStyles = computed(() => {
42
50
  return { width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, "px") };
43
51
  });
44
- /** 错误提示 */
45
- const errorTips = computed(() => {
46
- if (!props.field) return void 0;
47
- return formProps?.model?.errors.get(props.field)?.[0];
52
+ const fieldItem = defineField({
53
+ clearValidate() {
54
+ errorTip.value = "";
55
+ },
56
+ async validate() {
57
+ if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true;
58
+ const seq = ++validateSeq;
59
+ latestValidatePromise = validateField(formProps.model, props.field, props.rules).then((tip) => {
60
+ if (seq !== validateSeq) return latestValidatePromise;
61
+ errorTip.value = tip;
62
+ return !errorTip.value;
63
+ });
64
+ return latestValidatePromise;
65
+ }
48
66
  });
49
- /** 字段是否必须 */
50
- const fieldRequired = computed(() => {
51
- const { field } = props;
52
- if (!field || readonly.value) return false;
53
- const required = formProps?.model?.fields[field]?.required;
54
- return Boolean(required);
67
+ watch(() => props.field, (field, oldField) => {
68
+ if (oldField) unregisterField?.(oldField);
69
+ if (field) registerField?.(field, fieldItem);
70
+ }, { immediate: true });
71
+ let stopWatchFieldValue;
72
+ watch([() => formProps?.model, () => props.field], ([model, field]) => {
73
+ stopWatchFieldValue?.();
74
+ if (!field || !model) return;
75
+ stopWatchFieldValue = watch(() => o(model).get(field), () => {
76
+ fieldItem.validate();
77
+ });
78
+ }, { immediate: true });
79
+ onBeforeUnmount(() => {
80
+ props.field && unregisterField?.(props.field);
55
81
  });
56
82
  return (_ctx, _cache) => {
57
83
  return openBlock(), createBlock(unref(_sfc_main$1), {
@@ -60,7 +86,7 @@ var form_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
60
86
  }, {
61
87
  default: withCtx(() => [props.label || _ctx.$slots.label ? (openBlock(), createElementBlock("label", {
62
88
  key: 0,
63
- class: normalizeClass([unref(formItemCls).e("label"), unref(bem).is("required", fieldRequired.value)]),
89
+ class: normalizeClass([unref(formItemCls).e("label"), unref(bem).is("required", !!__props.rules?.required)]),
64
90
  style: normalizeStyle(labelStyles.value)
65
91
  }, [__props.tips ? (openBlock(), createBlock(unref(_sfc_main), {
66
92
  key: 0,
@@ -72,17 +98,17 @@ var form_item_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
72
98
  }, 8, ["content", "class"])) : renderSlot(_ctx.$slots, "label", { key: 1 }, () => [createTextVNode(toDisplayString(__props.label) + ":", 1)])], 6)) : createCommentVNode("v-if", true), createElementVNode("section", { class: normalizeClass(unref(formItemCls).e("wrapper")) }, [
73
99
  createElementVNode("div", { class: normalizeClass(unref(formItemCls).e("content")) }, [renderSlot(_ctx.$slots, "default")], 2),
74
100
  createCommentVNode(" 只有表单控件处于非只读状态时,才显示错误提示 "),
75
- !unref(formProps)?.readonly && !unref(formProps)?.noTips ? (openBlock(), createElementBlock("section", {
101
+ !unref(readonly) && !unref(formProps)?.noTips ? (openBlock(), createElementBlock("section", {
76
102
  key: 0,
77
103
  class: normalizeClass(unref(formItemCls).e("error"))
78
104
  }, [createVNode(Transition, {
79
105
  name: "form-item-tips",
80
106
  mode: "out-in"
81
107
  }, {
82
- default: withCtx(() => [!!errorTips.value ? (openBlock(), createElementBlock("span", {
108
+ default: withCtx(() => [!!errorTip.value ? (openBlock(), createElementBlock("span", {
83
109
  key: 0,
84
110
  class: normalizeClass(unref(formItemCls).e("error-text"))
85
- }, toDisplayString(errorTips.value), 3)) : createCommentVNode("v-if", true)]),
111
+ }, toDisplayString(errorTip.value), 3)) : createCommentVNode("v-if", true)]),
86
112
  _: 1
87
113
  })], 2)) : createCommentVNode("v-if", true)
88
114
  ], 2)]),
@@ -1 +1 @@
1
- {"version":3,"file":"form-item.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', fieldRequired)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!formProps?.readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTips\">\n {{ errorTips }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls } from './helper'\n\ndefineOptions({ name: 'FormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps } = injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('error', !!errorTips.value)].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\n/** 错误提示 */\nconst errorTips = computed<string | undefined>(() => {\n if (!props.field) return undefined\n return formProps?.model?.errors.get(props.field)?.[0]\n})\n\n/** 字段是否必须 */\nconst fieldRequired = computed<boolean>(() => {\n const { field } = props\n if (!field || readonly.value) return false\n const required = formProps?.model?.fields[field]?.required\n return Boolean(required)\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;;EASd,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,WAAW,UAAU;EAE7B,MAAM,EAAE,MAAM,aAAa,iBAAiB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GACpE,MAAM;GACN,UAAU;EACZ,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,YAAI;IAAG,YAAI,EAAE,KAAK,KAAK;IAAG,IAAI,GAAG,SAAS,CAAC,CAAC,UAAU,KAAK;GAAC,EAAE,KAAK,GAAG;EAChF,CAAC;;EAGD,MAAM,cAAc,eAA8B;GAChD,OAAO,EACL,OAAO,SAAS,MAAM,cAAc,WAAW,cAAc,OAAO,KAAK,YAAY,IAAI,EAC3F;EACF,CAAC;;EAGD,MAAM,YAAY,eAAmC;GACnD,IAAI,CAAC,MAAM,OAAO,OAAO,KAAA;GACzB,OAAO,WAAW,OAAO,OAAO,IAAI,MAAM,KAAK,IAAI;EACrD,CAAC;;EAGD,MAAM,gBAAgB,eAAwB;GAC5C,MAAM,EAAE,UAAU;GAClB,IAAI,CAAC,SAAS,SAAS,OAAO,OAAO;GACrC,MAAM,WAAW,WAAW,OAAO,OAAO,QAAQ;GAClD,OAAO,QAAQ,QAAQ;EACzB,CAAC;;uBAvFC,YA8Bc,MAAA,WAAA,GAAA;IA9BA,MAAM,QAAA;IAAO,OAAK,eAAE,UAAA,KAAS;;2BAcjC,CAZA,MAAM,SAASA,KAAAA,OAAO,SAAA,UAAA,GAD9B,mBAaQ,SAAA;;KAXL,OAAK,eAAA,CAAG,MAAA,WAAA,EAAI,EAAC,OAAA,GAAW,MAAA,GAAA,EAAI,GAAE,YAAa,cAAA,KAAa,CAAA,CAAA;KACxD,OAAK,eAAE,YAAA,KAAW;QAEN,QAAA,QAAA,UAAA,GAAb,YAIQ,MAAA,SAAA,GAAA;;KAJY,SAAS,QAAA;KAAO,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,MAAA,CAAA;;4BAGvC,CAFP,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,WAAA,CAAA,EAAA,GAAA,CACjB,WAAsC,KAAA,QAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,gBAAhB,QAAA,KAAK,IAAG,KAAC,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;mCAIjC,WAAsC,KAAA,QAAA,SAAA,EAAA,KAAA,EAAA,SAAA,CAAA,gBAAA,gBAAhB,QAAA,KAAK,IAAG,KAAC,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAInC,mBAaU,WAAA,EAbA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA;KACpB,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA,CAChB,WAAa,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGf,mBAAA,0BAAA;MACwC,MAAA,SAAA,GAAW,YAAQ,CAAK,MAAA,SAAA,GAAW,UAAA,UAAA,GAA3E,mBAMU,WAAA;;MANA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,OAAA,CAAA;SACpB,YAIa,YAAA;MAJD,MAAK;MAAiB,MAAK;;6BAG9B,CAAA,CAAA,CAFoC,UAAA,SAAA,UAAA,GAA3C,mBAEO,QAAA;;OAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,YAAA,CAAA;yBACd,UAAA,KAAS,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"form-item.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/form-item/form-item.vue"],"sourcesContent":["<template>\n <u-grid-item :span=\"span\" :class=\"className\">\n <label\n v-if=\"props.label || $slots.label\"\n :class=\"[cls.e('label'), bem.is('required', !!rules?.required)]\"\n :style=\"labelStyles\"\n >\n <u-tip v-if=\"tips\" :content=\"tips\" :class=\"cls.e('tips')\">\n <span :class=\"cls.e('tip-label')\">\n <slot name=\"label\">{{ label }}:</slot>\n </span>\n </u-tip>\n <template v-else>\n <slot name=\"label\">{{ label }}:</slot>\n </template>\n </label>\n\n <section :class=\"cls.e('wrapper')\">\n <div :class=\"cls.e('content')\">\n <slot></slot>\n </div>\n\n <!-- 只有表单控件处于非只读状态时,才显示错误提示 -->\n <section :class=\"cls.e('error')\" v-if=\"!readonly && !formProps?.noTips\">\n <transition name=\"form-item-tips\" mode=\"out-in\">\n <span :class=\"cls.e('error-text')\" v-if=\"!!errorTip\">\n {{ errorTip }}\n </span>\n </transition>\n </section>\n </section>\n </u-grid-item>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { o } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { type CSSProperties, computed, onBeforeUnmount, shallowRef, watch } from 'vue'\n\nimport type { FormItemProps, ComponentSize } from '../../types'\nimport { UGridItem } from '../grid'\nimport { UTip } from '../tip'\nimport { formItemCls as cls, defineField } from './helper'\nimport { validateField } from './validate'\n\ndefineOptions({ name: 'FormItem' })\n\nconst props = withDefaults(defineProps<FormItemProps>(), { readonly: undefined })\n\ndefineSlots<{\n /** 标签插槽 */\n label?: () => any\n default?: () => any\n}>()\n\n/** 表单组件上下文 */\nconst { formProps, registerField, unregisterField, shouldValidate } = injectFormContext()\n\nconst { config } = useConfig()\n\nconst { size, readonly } = useFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n readonly: false\n})\n\nconst errorTip = shallowRef<string>()\n/** 递增序号,丢弃过期的异步校验结果 */\nlet validateSeq = 0\n/** 最近一次 validate 的 Promise,供过期调用等待最新结果 */\nlet latestValidatePromise: Promise<boolean> = Promise.resolve(true)\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('error', !!errorTip.value)].join(' ')\n})\n\n/** label样式 */\nconst labelStyles = computed<CSSProperties>(() => {\n return {\n width: withUnit(props.labelWidth ?? formProps?.labelWidth ?? config.form.labelWidth, 'px')\n }\n})\n\nconst fieldItem = defineField({\n clearValidate() {\n errorTip.value = ''\n },\n async validate() {\n if (!props.field || !formProps?.model || !props.rules || !shouldValidate?.()) return true\n\n const seq = ++validateSeq\n\n latestValidatePromise = validateField(formProps.model!, props.field!, props.rules!).then(\n (tip) => {\n if (seq !== validateSeq) return latestValidatePromise\n\n errorTip.value = tip\n return !errorTip.value\n }\n )\n return latestValidatePromise\n }\n})\n\nwatch(\n () => props.field,\n (field, oldField) => {\n if (oldField) {\n unregisterField?.(oldField)\n }\n if (field) {\n registerField?.(field, fieldItem)\n }\n },\n { immediate: true }\n)\n\nlet stopWatchFieldValue: (() => void) | undefined\n\nwatch(\n [() => formProps?.model, () => props.field],\n ([model, field]) => {\n stopWatchFieldValue?.()\n\n if (!field || !model) return\n\n stopWatchFieldValue = watch(\n () => o(model).get(field),\n () => {\n fieldItem.validate()\n }\n )\n },\n { immediate: true }\n)\n\nonBeforeUnmount(() => {\n props.field && unregisterField?.(props.field)\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;EAiDA,MAAM,QAAQ;;EASd,MAAM,EAAE,WAAW,eAAe,iBAAiB,mBAAmB,kBAAkB;EAExF,MAAM,EAAE,WAAW,UAAU;EAE7B,MAAM,EAAE,MAAM,aAAa,iBAAiB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GACpE,MAAM;GACN,UAAU;EACZ,CAAC;EAED,MAAM,WAAW,WAAmB;;EAEpC,IAAI,cAAc;;EAElB,IAAI,wBAA0C,QAAQ,QAAQ,IAAI;EAElE,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,YAAI;IAAG,YAAI,EAAE,KAAK,KAAK;IAAG,IAAI,GAAG,SAAS,CAAC,CAAC,SAAS,KAAK;GAAC,EAAE,KAAK,GAAG;EAC/E,CAAC;;EAGD,MAAM,cAAc,eAA8B;GAChD,OAAO,EACL,OAAO,SAAS,MAAM,cAAc,WAAW,cAAc,OAAO,KAAK,YAAY,IAAI,EAC3F;EACF,CAAC;EAED,MAAM,YAAY,YAAY;GAC5B,gBAAgB;IACd,SAAS,QAAQ;GACnB;GACA,MAAM,WAAW;IACf,IAAI,CAAC,MAAM,SAAS,CAAC,WAAW,SAAS,CAAC,MAAM,SAAS,CAAC,iBAAiB,GAAG,OAAO;IAErF,MAAM,MAAM,EAAE;IAEd,wBAAwB,cAAc,UAAU,OAAQ,MAAM,OAAQ,MAAM,KAAM,EAAE,MACjF,QAAQ;KACP,IAAI,QAAQ,aAAa,OAAO;KAEhC,SAAS,QAAQ;KACjB,OAAO,CAAC,SAAS;IACnB,CACF;IACA,OAAO;GACT;EACF,CAAC;EAED,YACQ,MAAM,QACX,OAAO,aAAa;GACnB,IAAI,UACF,kBAAkB,QAAQ;GAE5B,IAAI,OACF,gBAAgB,OAAO,SAAS;EAEpC,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,IAAI;EAEJ,MACE,OAAO,WAAW,aAAa,MAAM,KAAK,IACzC,CAAC,OAAO,WAAW;GAClB,sBAAsB;GAEtB,IAAI,CAAC,SAAS,CAAC,OAAO;GAEtB,sBAAsB,YACd,EAAE,KAAK,EAAE,IAAI,KAAK,SAClB;IACJ,UAAU,SAAS;GACrB,CACF;EACF,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,sBAAsB;GACpB,MAAM,SAAS,kBAAkB,MAAM,KAAK;EAC9C,CAAC;;uBA1IC,YA8Bc,MAAA,WAAA,GAAA;IA9BA,MAAM,QAAA;IAAO,OAAK,eAAE,UAAA,KAAS;;2BAcjC,CAZA,MAAM,SAASA,KAAAA,OAAO,SAAA,UAAA,GAD9B,mBAaQ,SAAA;;KAXL,OAAK,eAAA,CAAG,MAAA,WAAA,EAAI,EAAC,OAAA,GAAW,MAAA,GAAA,EAAI,GAAE,YAAA,CAAA,CAAe,QAAA,OAAO,QAAQ,CAAA,CAAA;KAC5D,OAAK,eAAE,YAAA,KAAW;QAEN,QAAA,QAAA,UAAA,GAAb,YAIQ,MAAA,SAAA,GAAA;;KAJY,SAAS,QAAA;KAAO,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,MAAA,CAAA;;4BAGvC,CAFP,mBAEO,QAAA,EAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,WAAA,CAAA,EAAA,GAAA,CACjB,WAAsC,KAAA,QAAA,SAAA,CAAA,SAAA,CAAA,gBAAA,gBAAhB,QAAA,KAAK,IAAG,KAAC,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;mCAIjC,WAAsC,KAAA,QAAA,SAAA,EAAA,KAAA,EAAA,SAAA,CAAA,gBAAA,gBAAhB,QAAA,KAAK,IAAG,KAAC,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAInC,mBAaU,WAAA,EAbA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA;KACpB,mBAEM,OAAA,EAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,SAAA,CAAA,EAAA,GAAA,CAChB,WAAa,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGf,mBAAA,0BAAA;MACwC,MAAA,QAAA,KAAQ,CAAK,MAAA,SAAA,GAAW,UAAA,UAAA,GAAhE,mBAMU,WAAA;;MANA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,OAAA,CAAA;SACpB,YAIa,YAAA;MAJD,MAAK;MAAiB,MAAK;;6BAG9B,CAAA,CAAA,CAFoC,SAAA,SAAA,UAAA,GAA3C,mBAEO,QAAA;;OAFA,OAAK,eAAE,MAAA,WAAA,EAAI,EAAC,YAAA,CAAA;yBACd,SAAA,KAAQ,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,CAAA,CAAA"}
@@ -2,7 +2,10 @@ import { bem } from "@veltra/utils";
2
2
  import "@cat-kit/core";
3
3
  //#region src/components/form-item/helper.ts
4
4
  const formItemCls = bem("form-item");
5
+ function defineField(field) {
6
+ return field;
7
+ }
5
8
  //#endregion
6
- export { formItemCls };
9
+ export { defineField, formItemCls };
7
10
 
8
11
  //# sourceMappingURL=helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/form-item/helper.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM, type FormComponentProps } from '@veltra/utils'\n\n/**\n * 获取表单项的属性\n * @param props 表单系列组件的属性\n * @returns\n */\nexport function getFormItemProps(\n props: FormComponentProps\n): Pick<FormComponentProps, 'label' | 'field' | 'readonly' | 'span' | 'tips'> {\n return o(props).pick(['label', 'field', 'readonly', 'span', 'tips']) as Pick<\n FormComponentProps,\n 'label' | 'field' | 'readonly' | 'span' | 'tips'\n >\n}\n\nexport const formItemCls: BEM<'form-item'> = bem('form-item')\n"],"mappings":";;;AAiBA,MAAa,cAAgC,IAAI,WAAW"}
1
+ {"version":3,"file":"helper.js","names":[],"sources":["../../../src/components/form-item/helper.ts"],"sourcesContent":["import { o } from '@cat-kit/core'\nimport { bem, type BEM, type FormComponentProps, type FormFieldItem } from '@veltra/utils'\n\n/**\n * 获取表单项的属性\n * @param props 表单系列组件的属性\n * @returns\n */\nexport function getFormItemProps(\n props: FormComponentProps\n): Pick<FormComponentProps, 'label' | 'field' | 'readonly' | 'span' | 'tips'> {\n return o(props).pick(['label', 'field', 'readonly', 'span', 'tips']) as Pick<\n FormComponentProps,\n 'label' | 'field' | 'readonly' | 'span' | 'tips'\n >\n}\n\nexport const formItemCls: BEM<'form-item'> = bem('form-item')\n\nexport function defineField(field: FormFieldItem) {\n return field\n}\n"],"mappings":";;;AAiBA,MAAa,cAAgC,IAAI,WAAW;AAE5D,SAAgB,YAAY,OAAsB;CAChD,OAAO;AACT"}
@@ -0,0 +1,97 @@
1
+ import { isEmpty, o } from "@cat-kit/core";
2
+ //#region src/components/form-item/validate.ts
3
+ const presetRules = {
4
+ email(v) {
5
+ if (!/^([\w_-]+)@([\w-]+[.]?)*[\w]+\.[a-zA-Z]{2,10}$/.test(v)) return "邮箱格式不正确";
6
+ },
7
+ phone(v) {
8
+ if (!/^\d{11}$/.test(v)) return "手机号格式不正确";
9
+ },
10
+ num(v) {
11
+ if (!/^\d+$/.test(v)) return "数字格式不正确";
12
+ },
13
+ url(v) {
14
+ if (!/^(ftp|https?):\/\/([\w_-]+)\.([\w-]+[.]?)*[\w]+\.[a-zA-Z]{2,10}(.*)/.test(v)) return "链接格式不正确";
15
+ },
16
+ idCard(v) {
17
+ if (!/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/.test(v)) return "身份证格式不正确";
18
+ }
19
+ };
20
+ /** 预设规则 */
21
+ const ruleTypes = {
22
+ required(value, required) {
23
+ if (required === false) return;
24
+ const errMsg = typeof required === "string" ? required : "该项不能为空";
25
+ if (isEmpty(value)) return errMsg;
26
+ if (Array.isArray(value) && !value.length) return errMsg;
27
+ if (typeof value === "string" && !value) return errMsg;
28
+ },
29
+ min(value, rule) {
30
+ if (isEmpty(value)) return;
31
+ let _rule = Array.isArray(rule) ? rule[0] : rule;
32
+ let errMsg = Array.isArray(rule) ? rule[1] : `该项必须大于等于${_rule}`;
33
+ if (typeof value !== "number") return `${value}不是一个数字`;
34
+ if (value < _rule) return errMsg;
35
+ },
36
+ max(value, rule) {
37
+ if (isEmpty(value)) return;
38
+ let _rule = Array.isArray(rule) ? rule[0] : rule;
39
+ let errMsg = Array.isArray(rule) ? rule[1] : `该项必须小于等于${_rule}`;
40
+ if (typeof value !== "number") return `${value}不是一个数字`;
41
+ if (value > _rule) return errMsg;
42
+ },
43
+ minLen(value, rule) {
44
+ if (isEmpty(value)) return;
45
+ let _rule = Array.isArray(rule) ? rule[0] : rule;
46
+ let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须大于等于${_rule}`;
47
+ if (!Array.isArray(value) && typeof value !== "string") return `${value}不是一个字符串或数组`;
48
+ if (value.length < _rule) return errMsg;
49
+ },
50
+ maxLen(value, rule) {
51
+ if (isEmpty(value)) return;
52
+ let _rule = Array.isArray(rule) ? rule[0] : rule;
53
+ let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须小于等于:${_rule}`;
54
+ if (!Array.isArray(value) && typeof value !== "string") return `${value}不是一个字符串或数组`;
55
+ if (value.length > _rule) return errMsg;
56
+ },
57
+ match(value, rule) {
58
+ if (isEmpty(value) || value === "") return;
59
+ if (typeof rule === "string") {
60
+ if (!rule) return;
61
+ rule = new RegExp(rule);
62
+ }
63
+ let _rule = Array.isArray(rule) ? rule[0] : rule;
64
+ let errMsg = Array.isArray(rule) ? rule[1] : `该项不匹配正则:${_rule}`;
65
+ if (typeof value !== "string") return `${value}不是一个字符串`;
66
+ if (!_rule.test(value)) return errMsg;
67
+ },
68
+ preset(value, rule) {
69
+ if (isEmpty(value) || value === "" || !rule) return;
70
+ if (typeof value !== "string") return `${value}不是一个字符串`;
71
+ const ruleValidator = presetRules[rule];
72
+ return ruleValidator(value);
73
+ }
74
+ };
75
+ async function validateField(formData, field, rules) {
76
+ const value = o(formData).get(field);
77
+ if (!rules) return;
78
+ const { validator, required, ...normalRules } = rules;
79
+ if (required) {
80
+ const err = ruleTypes.required(value, required);
81
+ if (err) return err;
82
+ }
83
+ for (const ruleKey in normalRules) {
84
+ const validate = ruleTypes[ruleKey];
85
+ if (!validate) continue;
86
+ const err = validate(value, normalRules[ruleKey]);
87
+ if (err) return err;
88
+ }
89
+ if (validator) {
90
+ const err = await validator(value, formData);
91
+ if (err) return err;
92
+ }
93
+ }
94
+ //#endregion
95
+ export { validateField };
96
+
97
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","names":[],"sources":["../../../src/components/form-item/validate.ts"],"sourcesContent":["import { isEmpty, o } from '@cat-kit/core'\nimport type { PresetRule, Undef, ValidateRule } from '@veltra/utils'\n\nconst presetRules: Record<PresetRule, (value: string) => string | undefined> = {\n email(v) {\n const re = /^([\\w_-]+)@([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}$/\n if (!re.test(v)) {\n return '邮箱格式不正确'\n }\n },\n phone(v) {\n const re = /^\\d{11}$/\n if (!re.test(v)) {\n return '手机号格式不正确'\n }\n },\n num(v) {\n const re = /^\\d+$/\n if (!re.test(v)) {\n return '数字格式不正确'\n }\n },\n url(v) {\n const re = /^(ftp|https?):\\/\\/([\\w_-]+)\\.([\\w-]+[.]?)*[\\w]+\\.[a-zA-Z]{2,10}(.*)/\n if (!re.test(v)) {\n return '链接格式不正确'\n }\n },\n\n idCard(v) {\n const re = /^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$/\n if (!re.test(v)) {\n return '身份证格式不正确'\n }\n }\n}\n\n/** 预设规则 */\nconst ruleTypes = {\n required(value: any, required: ValidateRule['required']): Undef<string> {\n if (required === false) return\n\n const errMsg = typeof required === 'string' ? required : '该项不能为空'\n if (isEmpty(value)) return errMsg\n\n if (Array.isArray(value) && !value.length) return errMsg\n if (typeof value === 'string' && !value) return errMsg\n },\n min(value: any, rule: ValidateRule['min']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须大于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value < _rule) return errMsg\n },\n max(value: any, rule: ValidateRule['max']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项必须小于等于${_rule}`\n if (typeof value !== 'number') return `${value}不是一个数字`\n if (value > _rule) return errMsg\n },\n\n minLen(value: any, rule: ValidateRule['minLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须大于等于${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length < _rule) return errMsg\n },\n maxLen(value: any, rule: ValidateRule['maxLen']): Undef<string> {\n if (isEmpty(value)) return\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项长度必须小于等于:${_rule}`\n if (!Array.isArray(value) && typeof value !== 'string') return `${value}不是一个字符串或数组`\n if (value.length > _rule) return errMsg\n },\n match(value: any, rule: ValidateRule['match']): Undef<string> {\n if (isEmpty(value) || value === '') return\n if (typeof rule === 'string') {\n if (!rule) return\n rule = new RegExp(rule)\n }\n let _rule = Array.isArray(rule) ? rule[0] : rule!\n let errMsg = Array.isArray(rule) ? rule[1] : `该项不匹配正则:${_rule}`\n if (typeof value !== 'string') return `${value}不是一个字符串`\n if (!_rule.test(value)) return errMsg\n },\n preset(value: any, rule: ValidateRule['preset']): Undef<string> {\n if (isEmpty(value) || value === '' || !rule) return\n if (typeof value !== 'string') return `${value}不是一个字符串`\n const ruleValidator = presetRules[rule]\n return ruleValidator(value)\n }\n}\n\nexport async function validateField(\n formData: Record<string, any>,\n field: string,\n rules: ValidateRule\n): Promise<Undef<string>> {\n const value = o(formData).get(field)\n\n if (!rules) return\n\n const { validator, required, ...normalRules } = rules\n\n // 必填要先去校验\n if (required) {\n const err = ruleTypes.required(value, required)\n if (err) return err\n }\n\n // 校验规则\n for (const ruleKey in normalRules) {\n const validate = ruleTypes[ruleKey as keyof typeof ruleTypes]\n if (!validate) continue\n\n const err = validate(value, normalRules[ruleKey])\n\n if (err) return err\n }\n\n // 自定义校验最火校验\n if (validator) {\n const err = await validator(value, formData)\n if (err) return err\n }\n\n return\n}\n"],"mappings":"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"}
@@ -36,6 +36,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
36
36
  type: Boolean,
37
37
  default: void 0
38
38
  },
39
+ rules: {},
39
40
  size: {}
40
41
  },
41
42
  emits: ["update:modelValue"],
@@ -1 +1 @@
1
- {"version":3,"file":"group-input.js","names":[],"sources":["../../../src/components/group-input/group-input.vue"],"sourcesContent":["<template>\n <ul :class=\"[cls.b, cls.m(size)]\" v-if=\"!readonly\">\n <li v-if=\"isEmpty && creatable\">\n <u-button style=\"width: 100%\" :icon=\"Plus\" @click=\"handleAdd(0)\" :size=\"size\">\n 新增\n </u-button>\n </li>\n <li v-for=\"(item, index) of items\" :key=\"item.id\" :class=\"cls.e('item')\" :style=\"itemStyle\">\n <slot v-bind=\"{ item: item.data, index }\" />\n <span :class=\"cls.e('actions')\">\n <u-button\n :icon=\"Minus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n @click=\"handleRemove(index)\"\n />\n <u-button\n :icon=\"Plus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n type=\"primary\"\n @click=\"handleAdd(index)\"\n />\n </span>\n </li>\n </ul>\n\n <template v-else-if=\"items?.length\">\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li v-for=\"item of items\" :key=\"item.id\" :class=\"cls.e('item')\">\n <span v-for=\"v in item.data\">{{ v }}</span>\n </li>\n </ul>\n </template>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup generic=\"GroupItem extends Record<string, any>\">\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Minus, Plus } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { GroupInputEmits, GroupInputProps } from '../../types'\nimport { UButton } from '../button'\nimport { useGroupItems } from './use-group-items'\n\ndefineOptions({ name: 'GroupInput' })\n\nconst props = withDefaults(defineProps<GroupInputProps<GroupItem>>(), {\n modelValue: () => [],\n disabled: undefined,\n readonly: undefined,\n creatable: true\n})\n\nconst emit = defineEmits<GroupInputEmits>()\n\nconst cls = bem('group-input')\n\nconst { formProps } = injectFormContext()\nconst { disabled, size, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst { items, createItem, runByEvent } = useGroupItems({ props, emit })\n\nconst isEmpty = computed(() => {\n return !items.value.length\n})\n\nfunction handleAdd(index: number) {\n runByEvent(() => {\n items.value = [\n ...items.value.slice(0, index + 1),\n createItem({}),\n ...items.value.slice(index + 1)\n ]\n })\n}\n\nfunction handleRemove(index: number) {\n runByEvent(() => {\n items.value = [...items.value.slice(0, index), ...items.value.slice(index + 1)]\n })\n}\n</script>\n"],"mappings":"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"}
1
+ {"version":3,"file":"group-input.js","names":[],"sources":["../../../src/components/group-input/group-input.vue"],"sourcesContent":["<template>\n <ul :class=\"[cls.b, cls.m(size)]\" v-if=\"!readonly\">\n <li v-if=\"isEmpty && creatable\">\n <u-button style=\"width: 100%\" :icon=\"Plus\" @click=\"handleAdd(0)\" :size=\"size\">\n 新增\n </u-button>\n </li>\n <li v-for=\"(item, index) of items\" :key=\"item.id\" :class=\"cls.e('item')\" :style=\"itemStyle\">\n <slot v-bind=\"{ item: item.data, index }\" />\n <span :class=\"cls.e('actions')\">\n <u-button\n :icon=\"Minus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n @click=\"handleRemove(index)\"\n />\n <u-button\n :icon=\"Plus\"\n circle\n :disabled=\"disabled\"\n :size=\"size\"\n type=\"primary\"\n @click=\"handleAdd(index)\"\n />\n </span>\n </li>\n </ul>\n\n <template v-else-if=\"items?.length\">\n <ul :class=\"[cls.b, cls.m(size)]\">\n <li v-for=\"item of items\" :key=\"item.id\" :class=\"cls.e('item')\">\n <span v-for=\"v in item.data\">{{ v }}</span>\n </li>\n </ul>\n </template>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup generic=\"GroupItem extends Record<string, any>\">\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Minus, Plus } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { GroupInputEmits, GroupInputProps } from '../../types'\nimport { UButton } from '../button'\nimport { useGroupItems } from './use-group-items'\n\ndefineOptions({ name: 'GroupInput' })\n\nconst props = withDefaults(defineProps<GroupInputProps<GroupItem>>(), {\n modelValue: () => [],\n disabled: undefined,\n readonly: undefined,\n creatable: true\n})\n\nconst emit = defineEmits<GroupInputEmits>()\n\nconst cls = bem('group-input')\n\nconst { formProps } = injectFormContext()\nconst { disabled, size, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst { items, createItem, runByEvent } = useGroupItems({ props, emit })\n\nconst isEmpty = computed(() => {\n return !items.value.length\n})\n\nfunction handleAdd(index: number) {\n runByEvent(() => {\n items.value = [\n ...items.value.slice(0, index + 1),\n createItem({}),\n ...items.value.slice(index + 1)\n ]\n })\n}\n\nfunction handleRemove(index: number) {\n runByEvent(() => {\n items.value = [...items.value.slice(0, index), ...items.value.slice(index + 1)]\n })\n}\n</script>\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import { NestedFieldMarker, formField, nestField } from "./form/helper.js";
2
1
  import { _default } from "./condition-editor/condition-editor.vue.js";
3
2
  import { EvaluateOptions, createEmptyGroup, createEmptyLeaf, evaluate } from "./condition-editor/core/evaluator.js";
4
3
  import { _default as _default$1 } from "./tabs/tabs.vue.js";
@@ -9,8 +8,6 @@ import { _default as _default$5 } from "./tree-select/tree-select.vue.js";
9
8
  import { _default as _default$6 } from "./code-editor/code-editor.vue.js";
10
9
  import { _default as _default$7 } from "./dropdown/dropdown.vue.js";
11
10
  import { _default as _default$8 } from "./drawer/drawer.vue.js";
12
- import { DynamicFormModel } from "./form/dynamic-form-model.js";
13
- import { FormModel } from "./form/form-model.js";
14
11
  import { _default as _default$9 } from "./form/form.vue.js";
15
12
  import { _default as _default$10 } from "./message-confirm/message-confirm.vue.js";
16
13
  import { _default as _default$11 } from "./message-confirm/message-confirm.js";
@@ -21,9 +21,6 @@ import _sfc_main$15 from "./grid/grid.js";
21
21
  import _sfc_main$16 from "./grid/grid-item.js";
22
22
  import form_item_default from "./form-item/form-item.js";
23
23
  import form_default from "./form/form.js";
24
- import { formField, nestField } from "./form/helper.js";
25
- import { FormModel } from "./form/form-model.js";
26
- import { DynamicFormModel } from "./form/dynamic-form-model.js";
27
24
  import _sfc_main$17 from "./button/button.js";
28
25
  import _sfc_main$18 from "./button/button-group.js";
29
26
  import _sfc_main$19 from "./message-confirm/message-confirm.js";
@@ -100,8 +97,6 @@ import _sfc_main$81 from "./float-button/float-button.js";
100
97
  import _sfc_main$82 from "./badge/badge.js";
101
98
  //#region src/components/index.ts
102
99
  var components_exports = /* @__PURE__ */ __exportAll({
103
- DynamicFormModel: () => DynamicFormModel,
104
- FormModel: () => FormModel,
105
100
  MessageConfirm: () => MessageConfirm,
106
101
  Notification: () => Notification,
107
102
  UAction: () => _sfc_main$57,
@@ -198,9 +193,7 @@ var components_exports = /* @__PURE__ */ __exportAll({
198
193
  defineBatchEditColumns: () => defineBatchEditColumns,
199
194
  defineTableColumns: () => defineTableColumns,
200
195
  evaluateConditionExpression: () => evaluate,
201
- formField: () => formField,
202
196
  message: () => message,
203
- nestField: () => nestField,
204
197
  vLoading: () => vLoading
205
198
  });
206
199
  //#endregion
@@ -17,19 +17,19 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, _Inpu
17
17
  "update:modelValue": (value: string) => any;
18
18
  clear: () => any;
19
19
  change: (value: string) => any;
20
- focus: (value?: string | undefined) => any;
21
- blur: (value?: string | undefined) => any;
22
20
  "suffix:click": (value?: string | undefined) => any;
23
21
  "prefix:click": (value?: string | undefined) => any;
22
+ focus: (value?: string | undefined) => any;
23
+ blur: (value?: string | undefined) => any;
24
24
  "native:input": (ev: Event) => any;
25
25
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
26
26
  "onUpdate:modelValue"?: ((value: string) => any) | undefined;
27
27
  onClear?: (() => any) | undefined;
28
28
  onChange?: ((value: string) => any) | undefined;
29
- onFocus?: ((value?: string | undefined) => any) | undefined;
30
- onBlur?: ((value?: string | undefined) => any) | undefined;
31
29
  "onSuffix:click"?: ((value?: string | undefined) => any) | undefined;
32
30
  "onPrefix:click"?: ((value?: string | undefined) => any) | undefined;
31
+ onFocus?: ((value?: string | undefined) => any) | undefined;
32
+ onBlur?: ((value?: string | undefined) => any) | undefined;
33
33
  "onNative:input"?: ((ev: Event) => any) | undefined;
34
34
  }>, {
35
35
  placeholder: string;