| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is';
- import { dateUtil } from '/@/utils/dateUtil';
- import { unref } from 'vue';
- import type { Ref, ComputedRef } from 'vue';
- import type { FormProps, FormSchema } from '../types/form';
- import { set } from 'lodash-es';
- interface UseFormValuesContext {
- defaultValueRef: Ref<any>;
- getSchema: ComputedRef<FormSchema[]>;
- getProps: ComputedRef<FormProps>;
- formModel: Recordable;
- }
- /**
- * @desription deconstruct array-link key. This method will mutate the target.
- */
- function tryDeconstructArray(key: string, value: any, target: Recordable) {
- const pattern = /^\[(.+)\]$/;
- if (pattern.test(key)) {
- const match = key.match(pattern);
- if (match && match[1]) {
- const keys = match[1].split(',');
- value = Array.isArray(value) ? value : [value];
- keys.forEach((k, index) => {
- set(target, k.trim(), value[index]);
- });
- return true;
- }
- }
- }
- /**
- * @desription deconstruct object-link key. This method will mutate the target.
- */
- function tryDeconstructObject(key: string, value: any, target: Recordable) {
- const pattern = /^\{(.+)\}$/;
- if (pattern.test(key)) {
- const match = key.match(pattern);
- if (match && match[1]) {
- const keys = match[1].split(',');
- value = isObject(value) ? value : {};
- keys.forEach((k) => {
- set(target, k.trim(), value[k.trim()]);
- });
- return true;
- }
- }
- }
- export function useFormValues({
- defaultValueRef,
- getSchema,
- formModel,
- getProps,
- }: UseFormValuesContext) {
- // Processing form values
- function handleFormValues(values: Recordable) {
- if (!isObject(values)) {
- return {};
- }
- const res: Recordable = {};
- for (const item of Object.entries(values)) {
- let [, value] = item;
- const [key] = item;
- if (!key || (isArray(value) && value.length === 0) || isFunction(value)) {
- continue;
- }
- const transformDateFunc = unref(getProps).transformDateFunc;
- if (isObject(value)) {
- value = transformDateFunc?.(value);
- }
- if (isArray(value) && value[0]?.format && value[1]?.format) {
- value = value.map((item) => transformDateFunc?.(item));
- }
- // Remove spaces
- if (isString(value)) {
- value = value.trim();
- }
- if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) {
- // 没有解构成功的,按原样赋值
- set(res, key, value);
- }
- }
- return handleRangeTimeValue(res);
- }
- /**
- * @description: Processing time interval parameters
- */
- function handleRangeTimeValue(values: Recordable) {
- const fieldMapToTime = unref(getProps).fieldMapToTime;
- 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] = dateUtil(startTime).format(format);
- values[endTimeKey] = 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 (!isNullOrUnDef(defaultValue)) {
- obj[item.field] = defaultValue;
- formModel[item.field] = defaultValue;
- }
- });
- defaultValueRef.value = obj;
- }
- return { handleFormValues, initDefault };
- }
|