@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.
- package/dist/components/auto-complete/auto-complete.js +1 -0
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-form.js +12 -5
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.js +8 -3
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.vue.d.ts +40 -35
- package/dist/components/batch-edit/di.js.map +1 -1
- package/dist/components/batch-edit/use-edit.js +41 -23
- package/dist/components/batch-edit/use-edit.js.map +1 -1
- package/dist/components/cascade/cascade.js +1 -0
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/checkbox/checkbox-button.js +1 -0
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +1 -0
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js +1 -0
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code-editor/code-editor.js +2 -1
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/condition-editor/core/evaluator.js +3 -3
- package/dist/components/condition-editor/core/evaluator.js.map +1 -1
- package/dist/components/date-picker/date-picker.js +1 -0
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +2 -0
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js +1 -0
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/file-picker/file-picker.js +1 -0
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue.d.ts +11 -19
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +24 -26
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form/index.d.ts +0 -3
- package/dist/components/form/use-form-fields.js +88 -0
- package/dist/components/form/use-form-fields.js.map +1 -0
- package/dist/components/form/use-node-interceptor.js +19 -30
- package/dist/components/form/use-node-interceptor.js.map +1 -1
- package/dist/components/form-item/form-item.js.map +1 -1
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js +44 -18
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form-item/helper.js +4 -1
- package/dist/components/form-item/helper.js.map +1 -1
- package/dist/components/form-item/validate.js +97 -0
- package/dist/components/form-item/validate.js.map +1 -0
- package/dist/components/group-input/group-input.js +1 -0
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/index.d.ts +0 -3
- package/dist/components/index.js +0 -7
- package/dist/components/input/input.vue.d.ts +4 -4
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/multi-select/multi-select.js +1 -0
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.js +1 -0
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/number-input/number-input.js +1 -0
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.js +1 -0
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.vue.d.ts +1 -1
- package/dist/components/palette/palette.js +1 -0
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.js +1 -0
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/radio/radio.js +1 -0
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio-group/radio-group.js +1 -0
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.js +3 -2
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/toolbar.js +10 -7
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/select/select.js +6 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/slider/slider.js +15 -2
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/switch/switch.js +1 -0
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +2 -2
- package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
- package/dist/components/tabs/tabs.vue.d.ts +2 -2
- package/dist/components/textarea/textarea.js +1 -0
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/tip/tip.vue.d.ts +3 -3
- package/dist/components/tree-select/tree-select.js +1 -0
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.js +1 -4
- package/dist/types/batch-edit.d.ts +4 -5
- package/dist/types/form.d.ts +9 -48
- package/dist/types/index.d.ts +2 -2
- package/package.json +6 -6
- package/src/components/batch-edit/batch-edit-form.vue +20 -13
- package/src/components/batch-edit/batch-edit.vue +7 -8
- package/src/components/batch-edit/di.ts +1 -2
- package/src/components/batch-edit/use-edit.ts +58 -36
- package/src/components/date-range-picker/date-range-picker.vue +2 -0
- package/src/components/form/form.vue +22 -38
- package/src/components/form/index.ts +0 -6
- package/src/components/form/use-form-fields.ts +126 -0
- package/src/components/form/use-node-interceptor.ts +27 -56
- package/src/components/form-item/form-item.vue +69 -18
- package/src/components/form-item/helper.ts +5 -1
- package/src/components/form-item/validate.ts +131 -0
- package/src/components/rich-text-editor/rich-text-editor.vue +28 -25
- package/src/components/rich-text-editor/toolbar.vue +23 -19
- package/src/components/select/select.vue +6 -4
- package/src/components/slider/slider.vue +12 -2
- package/src/types/auto-complete.ts +1 -1
- package/src/types/batch-edit.ts +4 -5
- package/src/types/form.ts +9 -82
- package/src/types/radio-group.ts +1 -0
- package/src/types/radio.ts +1 -0
- package/src/types/tree-select.ts +1 -1
- package/dist/components/form/dynamic-form-model.d.ts +0 -73
- package/dist/components/form/dynamic-form-model.js +0 -184
- package/dist/components/form/dynamic-form-model.js.map +0 -1
- package/dist/components/form/form-model.d.ts +0 -73
- package/dist/components/form/form-model.js +0 -179
- package/dist/components/form/form-model.js.map +0 -1
- package/dist/components/form/helper.d.ts +0 -16
- package/dist/components/form/helper.js +0 -20
- package/dist/components/form/helper.js.map +0 -1
- package/src/components/form/__test__/form-model.test.ts +0 -190
- package/src/components/form/dynamic-form-model.ts +0 -258
- package/src/components/form/form-model.ts +0 -255
- package/src/components/form/helper.ts +0 -23
|
@@ -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 {
|
|
2
|
-
import {
|
|
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(
|
|
12
|
-
const { props } = options;
|
|
9
|
+
function useNodeInterceptor() {
|
|
13
10
|
const slots = useSlots();
|
|
14
|
-
const formId = id();
|
|
15
11
|
function getSlotsNodes() {
|
|
16
|
-
const
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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 {
|
|
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',
|
|
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 {
|
|
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", !!
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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",
|
|
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(
|
|
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(() => [!!
|
|
108
|
+
default: withCtx(() => [!!errorTip.value ? (openBlock(), createElementBlock("span", {
|
|
83
109
|
key: 0,
|
|
84
110
|
class: normalizeClass(unref(formItemCls).e("error-text"))
|
|
85
|
-
}, toDisplayString(
|
|
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',
|
|
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":"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"}
|
|
@@ -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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"}
|
|
@@ -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":"
|
|
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";
|
package/dist/components/index.js
CHANGED
|
@@ -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;
|