@fe6/water-pro
Version:
An enterprise-class UI design language and Vue-based implementation
104 lines (95 loc) • 2.78 kB
text/typescript
/** @format */
import { unref } from 'vue';
import type { Ref, ComputedRef } from 'vue';
import {
isArray,
isFunction,
isPlainObject,
isString,
isUndefined,
isNull,
} from '@fe6/shared';
import { dateUtil } from '../date';
import type { FormSchema, FormProps } from '../types/form';
interface UseFormValuesContext {
defaultValueRef: Ref<any>;
getSchema: ComputedRef<FormSchema[]>;
formModel: Recordable;
getProps: ComputedRef<FormProps>;
}
export function useFormValues({
defaultValueRef,
getSchema,
formModel,
getProps,
}: UseFormValuesContext) {
// Processing form values
function handleFormValues(values: Recordable) {
if (!isPlainObject(values)) {
return {};
}
const { transformDateFunc } = unref(getProps);
const res: Recordable = {};
for (const item of Object.entries(values)) {
let [, value] = item;
const [key] = item;
if ((isArray(value) && value.length === 0) || isFunction(value)) {
continue;
}
const schemaItem = getSchema.value.find((gsItem: any) => gsItem.field === key);
if (isPlainObject(value)) {
value = transformDateFunc(value, schemaItem);
}
if (
isArray(value) &&
value.length > 0
) {
value = value.map((item: any) => {
return item?._isAMomentObject ? transformDateFunc(item, schemaItem) : item;
});
}
// Remove spaces
if (isString(value)) {
value = value.trim();
}
res[key] = value;
}
return handleRangeTimeValue(res);
}
/**
* @description: Processing time interval parameters
*/
function handleRangeTimeValue(values: Recordable) {
const { fieldMapToTime } = unref(getProps);
if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) {
return values;
}
for (const [
field,
[startTimeKey, endTimeKey],
format = 'YYYY-MM-DD',
] of fieldMapToTime) {
if (!field || !startTimeKey || !endTimeKey || !values[field]) {
continue;
}
const [startTime, endTime]: string[] = values[field];
values[startTimeKey] = isString(startTime) ? startTime : dateUtil(startTime).format(format);
values[endTimeKey] = isString(endTime) ? endTime : dateUtil(endTime).format(format);
Reflect.deleteProperty(values, field);
}
return values;
}
function initDefault() {
const schemas = unref(getSchema);
const obj: Recordable = {};
schemas.forEach((item) => {
const { defaultValue } = item;
if (!isUndefined(defaultValue) && !isNull(defaultValue)) {
obj[item.field] = defaultValue;
formModel[item.field] = defaultValue;
}
});
defaultValueRef.value = obj;
}
return { handleFormValues, initDefault };
}