wms-antdvue/.svn/pristine/9b/9b2237a0da161fd5d6cee27a48d8de381131e7db.svn-base
2024-11-07 16:33:03 +08:00

137 lines
3.4 KiB
Plaintext

import type { ComputedRef, Ref } from 'vue';
import type { FormProps, FormSchema, FormActionType } from '../types/form';
import { unref, toRaw } from 'vue';
import { isDef, isFunction } from '@/utils/is';
declare type EmitType = (event: string, ...args: any[]) => void;
interface UseFormActionContext {
emit: EmitType;
getProps: ComputedRef<FormProps>;
getSchema: ComputedRef<FormSchema[]>;
formModel: Recordable;
formElRef: Ref<FormActionType>;
defaultFormModel: Recordable;
loadingSub: Ref<boolean>;
handleFormValues: Function;
}
export function useFormEvents({
emit,
getProps,
formModel,
getSchema,
formElRef,
defaultFormModel,
loadingSub,
handleFormValues,
}: UseFormActionContext) {
// 验证
async function validate() {
return unref(formElRef)?.validate();
}
// 提交
async function handleSubmit(e?: Event): Promise<object | boolean> {
e && e.preventDefault();
loadingSub.value = true;
const { submitFunc } = unref(getProps);
if (submitFunc && isFunction(submitFunc)) {
await submitFunc();
loadingSub.value = false;
return false;
}
const formEl = unref(formElRef);
if (!formEl) return false;
try {
await validate();
const values = getFieldsValue();
loadingSub.value = false;
emit('submit', values);
return values;
} catch (error: any) {
emit('submit', false);
loadingSub.value = false;
console.error(error);
return false;
}
}
//清空校验
async function clearValidate(name?) {
await unref(formElRef as any)?.clearValidate(name);
}
//重置表单
async function resetFieldsForm() {
await unref(formElRef as any)?.resetFields();
}
//重置
async function resetFields(): Promise<void> {
const { resetFunc, submitOnReset } = unref(getProps);
resetFunc && isFunction(resetFunc) && (await resetFunc());
const formEl = unref(formElRef);
if (!formEl) return;
Object.keys(formModel).forEach((key) => {
formModel[key] = unref(defaultFormModel)[key] || null;
});
await resetFieldsForm();
const fromValues = handleFormValues(toRaw(unref(formModel)));
emit('reset', fromValues);
submitOnReset && (await handleSubmit());
}
//获取表单值
function getFieldsValue(): Recordable {
const formEl = unref(formElRef);
if (!formEl) return {};
return handleFormValues(toRaw(unref(formModel)));
}
//设置表单字段值
function setFieldsValue(values: Recordable): void {
const fields = unref(getSchema)
.map((item) => item.name)
.filter(Boolean);
// 兼容 a.b.c 写法
const decimal = '.';
const decimalKeyList = fields.filter((item) => item.indexOf(decimal) >= 0);
Object.keys(values).forEach((key) => {
const value = values[key];
const isKey = Reflect.has(values, key);
if (isKey && fields.includes(key)) {
formModel[key] = value;
} else {
decimalKeyList.forEach((itemKey: string) => {
try {
const value = eval('values' + decimal + itemKey);
if (isDef(value)) {
formModel[itemKey] = value;
}
} catch (e) {
console.error(e);
}
});
}
});
}
function setLoadingSub(value: boolean): void {
loadingSub.value = value;
}
return {
handleSubmit,
validate,
resetFields,
getFieldsValue,
clearValidate,
setFieldsValue,
setLoadingSub,
};
}