You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.5 KiB
215 lines
6.5 KiB
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((err) => {
|
|
console.error(`${key}:`, err);
|
|
});
|
|
// 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,
|
|
};
|
|
}
|
|
|