提交 | 用户 | age
|
ca4f1a
|
1 |
import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is'; |
3509eb
|
2 |
import { dateUtil } from '/@/utils/dateUtil'; |
2882d6
|
3 |
import { unref } from 'vue'; |
84c9d7
|
4 |
import type { Ref, ComputedRef } from 'vue'; |
3ff70b
|
5 |
import type { FormProps, FormSchema } from '../types/form'; |
d21578
|
6 |
import { cloneDeep, set } from 'lodash-es'; |
ec3d51
|
7 |
|
84c9d7
|
8 |
interface UseFormValuesContext { |
V |
9 |
defaultValueRef: Ref<any>; |
|
10 |
getSchema: ComputedRef<FormSchema[]>; |
3ff70b
|
11 |
getProps: ComputedRef<FormProps>; |
4ff1c4
|
12 |
formModel: Recordable; |
84c9d7
|
13 |
} |
79eb90
|
14 |
|
L |
15 |
/** |
|
16 |
* @desription deconstruct array-link key. This method will mutate the target. |
|
17 |
*/ |
|
18 |
function tryDeconstructArray(key: string, value: any, target: Recordable) { |
|
19 |
const pattern = /^\[(.+)\]$/; |
|
20 |
if (pattern.test(key)) { |
|
21 |
const match = key.match(pattern); |
|
22 |
if (match && match[1]) { |
|
23 |
const keys = match[1].split(','); |
|
24 |
value = Array.isArray(value) ? value : [value]; |
|
25 |
keys.forEach((k, index) => { |
|
26 |
set(target, k.trim(), value[index]); |
|
27 |
}); |
|
28 |
return true; |
|
29 |
} |
|
30 |
} |
|
31 |
} |
|
32 |
|
|
33 |
/** |
|
34 |
* @desription deconstruct object-link key. This method will mutate the target. |
|
35 |
*/ |
|
36 |
function tryDeconstructObject(key: string, value: any, target: Recordable) { |
|
37 |
const pattern = /^\{(.+)\}$/; |
|
38 |
if (pattern.test(key)) { |
|
39 |
const match = key.match(pattern); |
|
40 |
if (match && match[1]) { |
|
41 |
const keys = match[1].split(','); |
|
42 |
value = isObject(value) ? value : {}; |
|
43 |
keys.forEach((k) => { |
|
44 |
set(target, k.trim(), value[k.trim()]); |
|
45 |
}); |
|
46 |
return true; |
|
47 |
} |
|
48 |
} |
|
49 |
} |
|
50 |
|
84c9d7
|
51 |
export function useFormValues({ |
V |
52 |
defaultValueRef, |
|
53 |
getSchema, |
|
54 |
formModel, |
3ff70b
|
55 |
getProps, |
84c9d7
|
56 |
}: UseFormValuesContext) { |
46e087
|
57 |
// Processing form values |
4ff1c4
|
58 |
function handleFormValues(values: Recordable) { |
2f6253
|
59 |
if (!isObject(values)) { |
陈 |
60 |
return {}; |
|
61 |
} |
4ff1c4
|
62 |
const res: Recordable = {}; |
2f6253
|
63 |
for (const item of Object.entries(values)) { |
陈 |
64 |
let [, value] = item; |
|
65 |
const [key] = item; |
791b32
|
66 |
if (!key || (isArray(value) && value.length === 0) || isFunction(value)) { |
2f6253
|
67 |
continue; |
陈 |
68 |
} |
3ff70b
|
69 |
const transformDateFunc = unref(getProps).transformDateFunc; |
2f6253
|
70 |
if (isObject(value)) { |
3ff70b
|
71 |
value = transformDateFunc?.(value); |
2f6253
|
72 |
} |
3fcfac
|
73 |
|
V |
74 |
if (isArray(value) && value[0]?.format && value[1]?.format) { |
3ff70b
|
75 |
value = value.map((item) => transformDateFunc?.(item)); |
2f6253
|
76 |
} |
46e087
|
77 |
// Remove spaces |
2f6253
|
78 |
if (isString(value)) { |
a1b9bb
|
79 |
// remove params from URL |
ba2415
|
80 |
if (value === '') { |
a1b9bb
|
81 |
value = undefined; |
ba2415
|
82 |
} else { |
a1b9bb
|
83 |
value = value.trim(); |
Z |
84 |
} |
2f6253
|
85 |
} |
79eb90
|
86 |
if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) { |
L |
87 |
// 没有解构成功的,按原样赋值 |
|
88 |
set(res, key, value); |
|
89 |
} |
2f6253
|
90 |
} |
4ff1c4
|
91 |
return handleRangeTimeValue(res); |
2f6253
|
92 |
} |
84c9d7
|
93 |
|
2f6253
|
94 |
/** |
46e087
|
95 |
* @description: Processing time interval parameters |
2f6253
|
96 |
*/ |
4ff1c4
|
97 |
function handleRangeTimeValue(values: Recordable) { |
3ff70b
|
98 |
const fieldMapToTime = unref(getProps).fieldMapToTime; |
2f6253
|
99 |
|
陈 |
100 |
if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) { |
|
101 |
return values; |
|
102 |
} |
|
103 |
|
612995
|
104 |
for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) { |
c8b169
|
105 |
if (!field || !startTimeKey || !endTimeKey) { |
SW |
106 |
continue; |
|
107 |
} |
|
108 |
// If the value to be converted is empty, remove the field |
|
109 |
if (!values[field]) { |
|
110 |
Reflect.deleteProperty(values, field); |
2f6253
|
111 |
continue; |
陈 |
112 |
} |
|
113 |
|
|
114 |
const [startTime, endTime]: string[] = values[field]; |
|
115 |
|
bc4997
|
116 |
const [startTimeFormat, endTimeFormat] = Array.isArray(format) ? format : [format, format]; |
S |
117 |
|
|
118 |
values[startTimeKey] = dateUtil(startTime).format(startTimeFormat); |
|
119 |
values[endTimeKey] = dateUtil(endTime).format(endTimeFormat); |
4ff1c4
|
120 |
Reflect.deleteProperty(values, field); |
2f6253
|
121 |
} |
陈 |
122 |
|
|
123 |
return values; |
|
124 |
} |
84c9d7
|
125 |
|
V |
126 |
function initDefault() { |
|
127 |
const schemas = unref(getSchema); |
4ff1c4
|
128 |
const obj: Recordable = {}; |
84c9d7
|
129 |
schemas.forEach((item) => { |
a065de
|
130 |
const { defaultValue, defaultValueObj } = item; |
L |
131 |
const fieldKeys = Object.keys(defaultValueObj || {}); |
|
132 |
if (fieldKeys.length) { |
|
133 |
fieldKeys.map((field) => { |
|
134 |
obj[field] = defaultValueObj![field]; |
|
135 |
if (formModel[field] === undefined) { |
|
136 |
formModel[field] = defaultValueObj![field]; |
|
137 |
} |
|
138 |
}); |
|
139 |
} |
ca4f1a
|
140 |
if (!isNullOrUnDef(defaultValue)) { |
V |
141 |
obj[item.field] = defaultValue; |
b41e39
|
142 |
|
HR |
143 |
if (formModel[item.field] === undefined) { |
|
144 |
formModel[item.field] = defaultValue; |
|
145 |
} |
84c9d7
|
146 |
} |
V |
147 |
}); |
d21578
|
148 |
defaultValueRef.value = cloneDeep(obj); |
84c9d7
|
149 |
} |
V |
150 |
|
|
151 |
return { handleFormValues, initDefault }; |
2f6253
|
152 |
} |