Files
SaaS-lib/lib/component/form/form/use-form-model.ts
xuziqiang d0155dbe3c push
2024-05-15 17:29:42 +08:00

216 lines
6.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { UnwrapRef, Ref } from 'vue';
import { unref, nextTick, toRaw } from 'vue';
import { get, isArray, isNil, isUndefined, isPlainObject, forEach, isFunction } from 'lodash-es';
import { isDateType, transformDate } from '/nerv-lib/component/form/form-util';
interface useFormModelType {
schemas: Ref<UnwrapRef<FormSchema[]>>;
formModel: Ref<Recordable>;
formElRef: any;
emit: Function;
}
export function useFormModel({ schemas, formModel, formElRef, emit }: useFormModelType) {
/**
* 序列化传参 去除viewOnly单个值转多个时间范围、经纬度)
* @param formSchema
*/
function handleFormModel(formSchema = schemas) {
// console.log('formSchema', formSchema.value, formModel.value);
return unref(formSchema).reduce((prev: Recordable, cur: FormSchema) => {
const { field, fieldMap, keepField, format, addModel = [] } = cur;
if (cur.viewOnly !== true) {
let value = getFormModel(field);
if (isFunction(format)) {
value = format(value);
}
if (cur?.componentProps?.schemas) {
Object.assign(prev, handleFormModel(cur.componentProps.schemas));
} else if (fieldMap && !isNil(value)) {
if (fieldMap === true) {
Object.keys(value).forEach((key: string) => {
Object.assign(prev, { [key]: value[key] });
});
} else if (isArray(fieldMap)) {
if (!isArray(value) && ![null, undefined, ''].includes(value)) {
console.error(`Field value isn't Array`);
} else {
fieldMap.forEach((item: string, index) => {
Object.assign(prev, { [item]: value[index] });
});
}
} else if (isPlainObject(fieldMap)) {
if (!isPlainObject(value) && ![null, undefined, ''].includes(value)) {
console.error(`Field value isn't Object`);
} else {
Object.keys(fieldMap).forEach((key: string) => {
Object.assign(prev, { [key]: get(value, (<Props>fieldMap)[key]) });
});
}
}
//保留原值
if (keepField === true) {
Object.assign(prev, { [field]: value });
}
} else {
Object.assign(prev, { [field]: value });
if (isArray(addModel)) {
addModel.forEach((item: string) => {
Object.assign(prev, { [item]: unref(formModel)[item] });
});
} else {
// @ts-ignore
forEach(addModel as any, (value, key) => {
Object.assign(prev, { [key]: unref(formModel)[key] });
});
}
}
}
return prev;
}, {});
}
/**
* 设置默认值, formModel > defaultValue
*/
function initFormModel() {
unref(schemas).forEach((schema: FormSchema) => {
const { field, component, defaultValue, componentProps } = schema;
if (schema.component) {
if (!isUndefined(defaultValue) && isUndefined(getFormModel(field))) {
if (defaultValue && isDateType(component)) {
setFormModel(
field,
transformDate(component as string, defaultValue, componentProps.valueFormat),
);
} else {
setFormModel(field, defaultValue);
}
} else if (isDateType(component) && !isUndefined(getFormModel(field))) {
setFormModel(
field,
transformDate(component as string, getFormModel(field), componentProps.valueFormat),
);
}
} else {
setFormModel(field, defaultValue);
}
});
}
/**
* 恢复默认值 defaultValue
*/
function resetFormModel() {
Object.keys(formModel.value).forEach((key) => {
unsetFormModel(key);
});
console.log(formModel.value);
unref(schemas).forEach((schema: FormSchema) => {
const { field, component, defaultValue, componentProps } = schema;
setFormModel(field, defaultValue);
if (schema.component) {
if (defaultValue && isDateType(component)) {
setFormModel(
field,
transformDate(component as string, defaultValue, componentProps.valueFormat),
);
} else {
setFormModel(field, defaultValue);
}
} else {
setFormModel(field, defaultValue);
}
});
emit('reset', toRaw(formModel.value));
}
async function validateFields(nameList?: string[] | undefined) {
await nextTick();
return unref(formElRef)?.validateFields(nameList);
}
// function fieldRules(field: string) {
// if (field === 'fieldLink') return undefined;
// console.log('field', field, getNamePath.value);
// return getNamePath.value[field]?.rules || undefined;
// }
// function setNamePath(schemas: FormSchema[], namePathList: Recordable = {}) {
// unref(schemas).forEach((schema: FormSchema) => {
// if (schema.rules) {
// namePathList[schema.field] = {
// state: false,
// rules: schema.rules,
// };
// }
// if (schema?.componentProps?.schemas) {
// setNamePath(schema?.componentProps?.schemas, namePathList);
// }
// });
// console.log('namePathList', namePathList);
// return namePathList;
// }
// const getNamePath = computed(() => {
// return setNamePath(unref(schemas));
// });
/**
* 设置表单值
* @param key
* @param value
*/
function setFormModel(key: string, value?: any) {
if (value === null) {
delete unref(formModel)[key];
} else {
//select allowClear时值被设为undefined
unref(formModel)[key] = value;
}
validateFields([key]).catch(() => {});
// console.log('formModel', key, value, formModel.value);
// if (fieldRules(key)) {
// console.log('getNamePath', getNamePath.value);
// validateFields([key])
// .then((data) => {
// console.log('validateFields then', key, data);
// })
// .catch((e) => {
// console.log('validateFields catch', key, e);
// });
// }
}
/**
* 清除表单值
* @param key
*/
function unsetFormModel(key: string) {
console.log('unsetFormModel', key);
delete unref(formModel)[key];
}
/**
* 获得表单值
* @param key
*/
function getFormModel(key: string) {
return unref(formModel)[key];
}
return {
handleFormModel,
initFormModel,
resetFormModel,
setFormModel,
unsetFormModel,
getFormModel,
};
}