@innoways/hooks 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +171 -0
- package/README.md +162 -0
- package/build-info/index.stats.html +2648 -0
- package/dist/index.js +1279 -0
- package/package.json +45 -0
- package/rollup.config.js +13 -0
- package/tsconfig.dist.json +7 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,1279 @@
|
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import { useState, useCallback, useRef, useEffect, createContext, useContext, useMemo } from 'react';
|
|
3
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
4
|
+
import _useDebounceFn2 from 'ahooks/es/useDebounceFn';
|
|
5
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
6
|
+
import produce, { produce as produce$1 } from 'immer';
|
|
7
|
+
import _typeof from '@babel/runtime/helpers/typeof';
|
|
8
|
+
import moment from 'moment';
|
|
9
|
+
import { isEmpty, typeCheck, generateReg, fetchFnJsonKey } from '@jdfed/utils';
|
|
10
|
+
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
11
|
+
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
12
|
+
|
|
13
|
+
var useModal = function useModal(defaultStatus) {
|
|
14
|
+
var _useState = useState(defaultStatus),
|
|
15
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
16
|
+
visible = _useState2[0],
|
|
17
|
+
setVisible = _useState2[1];
|
|
18
|
+
|
|
19
|
+
var showModal = useCallback(function () {
|
|
20
|
+
setVisible(true);
|
|
21
|
+
}, []);
|
|
22
|
+
var hideModal = useCallback(function () {
|
|
23
|
+
setVisible(false);
|
|
24
|
+
}, []);
|
|
25
|
+
return [visible, showModal, hideModal];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* @Author: jiangxiaowei
|
|
30
|
+
* @Date: 2020-05-14 11:08:36
|
|
31
|
+
* @Last Modified by: jiangxiaowei
|
|
32
|
+
* @Last Modified time: 2020-06-23 16:25:02
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
var useRefProp = function useRefProp(props) {
|
|
36
|
+
var ref = useRef(null);
|
|
37
|
+
useEffect(function () {
|
|
38
|
+
ref.current = props;
|
|
39
|
+
});
|
|
40
|
+
return ref;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/*
|
|
44
|
+
* @Author: jiangxiaowei
|
|
45
|
+
* @Date: 2020-05-14 11:08:53
|
|
46
|
+
* @Last Modified by: jiangxiaowei
|
|
47
|
+
* @Last Modified time: 2020-06-23 16:24:55
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
var usePrevious = function usePrevious(value) {
|
|
51
|
+
var ref = useRef();
|
|
52
|
+
useEffect(function () {
|
|
53
|
+
ref.current = value;
|
|
54
|
+
});
|
|
55
|
+
return ref.current;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 重写useCallback(保证函数即使dependencies依赖改变。也不会重新生成)
|
|
60
|
+
* 解决因为useCallback的依赖频繁变化导致useCallback缓存效果很差甚至影响性能的问题
|
|
61
|
+
* fn 函数
|
|
62
|
+
* dependencies 依赖数组
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
var useEventCallback = function useEventCallback(fn, dependencies) {
|
|
66
|
+
var ref = useRef(function () {
|
|
67
|
+
throw new Error('Cannot call an event handler while rendering.');
|
|
68
|
+
});
|
|
69
|
+
useEffect(function () {
|
|
70
|
+
ref.current = fn; // eslint-disable-next-line react-hooks/exhaustive-deps
|
|
71
|
+
}, [fn].concat(_toConsumableArray(dependencies)));
|
|
72
|
+
return useCallback(function () {
|
|
73
|
+
var fn = ref.current;
|
|
74
|
+
return fn.apply(void 0, arguments);
|
|
75
|
+
}, [ref]);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
* 按钮只可以点击一次
|
|
80
|
+
* @Author: jiangxiaowei
|
|
81
|
+
* @Date: 2020-05-14 16:54:56
|
|
82
|
+
* @Last Modified by: jiangxiaowei
|
|
83
|
+
* @Last Modified time: 2020-06-21 18:40:08
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
var useClickOne = function useClickOne() {
|
|
87
|
+
var ref = useRef(true);
|
|
88
|
+
var startClick = useCallback(function () {
|
|
89
|
+
ref.current = false;
|
|
90
|
+
}, []);
|
|
91
|
+
var stopClick = useCallback(function () {
|
|
92
|
+
ref.current = true;
|
|
93
|
+
}, []);
|
|
94
|
+
return [ref.current, startClick, stopClick];
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
function ownKeys$4(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
98
|
+
|
|
99
|
+
function _objectSpread$4(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$4(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$4(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
*
|
|
103
|
+
* @param {json} schema 校验数据的json schema
|
|
104
|
+
* @param {object} formData 校验数据
|
|
105
|
+
* @param {Ajv} ajv 校验器
|
|
106
|
+
* @param visibleFieldKey
|
|
107
|
+
* return {
|
|
108
|
+
* pass {bol} 是否校验通过
|
|
109
|
+
* error {} 校验错误信息
|
|
110
|
+
* }
|
|
111
|
+
*/
|
|
112
|
+
var validate = function validate(_ref) {
|
|
113
|
+
var schema = _ref.schema,
|
|
114
|
+
formData = _ref.formData,
|
|
115
|
+
ajv = _ref.ajv,
|
|
116
|
+
visibleFieldKey = _ref.visibleFieldKey,
|
|
117
|
+
customProps = _ref.customProps;
|
|
118
|
+
|
|
119
|
+
try {
|
|
120
|
+
var ignoreKeywords = (customProps === null || customProps === void 0 ? void 0 : customProps.filter(function (item) {
|
|
121
|
+
return !ajv.RULES.keywords[item];
|
|
122
|
+
})) || [];
|
|
123
|
+
|
|
124
|
+
if ((ignoreKeywords === null || ignoreKeywords === void 0 ? void 0 : ignoreKeywords.length) > 0) {
|
|
125
|
+
ajv.addVocabulary(ignoreKeywords);
|
|
126
|
+
} // 编译ajv
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
if (schema && schema.themeColor) {
|
|
130
|
+
delete schema.themeColor;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
var validateFuc = ajv.compile(schema); // 校验是否通过
|
|
134
|
+
|
|
135
|
+
var pass = false; // 因为ajv会改动formData数据。而formData是不可变的,我们通过immer生成新的数据
|
|
136
|
+
|
|
137
|
+
var newFormData = produce(formData, function (draft) {
|
|
138
|
+
if (schema && schema.properties && schema.properties && Object.keys(schema.properties).length) {
|
|
139
|
+
for (var i in schema.properties) {
|
|
140
|
+
if (schema.properties[i].dateChecking && schema.properties[i].dateChecking.earlierDateChecking && schema.properties[i].dateChecking.authModeDateChecking) {
|
|
141
|
+
draft = _objectSpread$4(_objectSpread$4({}, draft), {}, _defineProperty({}, i, _defineProperty({
|
|
142
|
+
self: formData[i]
|
|
143
|
+
}, schema.properties[i].dateChecking.earlierDateChecking, formData[schema.properties[i].dateChecking.earlierDateChecking])));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
pass = validateFuc(draft);
|
|
149
|
+
}); // 未通过校验的数据,结构如下
|
|
150
|
+
// [{
|
|
151
|
+
// instancePath: '/e/0/1', // 这是一个嵌套表单,数据结构为 { e: [[]] }
|
|
152
|
+
// schemaPath: '#/properties/e/items/items/1/errorMessage',
|
|
153
|
+
// keyword: 'errorMessage',
|
|
154
|
+
// params: { errors: [Array] },
|
|
155
|
+
// message: '类型错误!应为number',
|
|
156
|
+
// schema: { type: '类型错误!应为number' },
|
|
157
|
+
// parentSchema: { type: 'number', title: '手机', minimum: 1, errorMessage: [Object] },
|
|
158
|
+
// data: '231'
|
|
159
|
+
// }, ...]
|
|
160
|
+
|
|
161
|
+
var errors = (validateFuc === null || validateFuc === void 0 ? void 0 : validateFuc.errors) || []; // 当前数据错误映射
|
|
162
|
+
|
|
163
|
+
var errorsMap = {}; // 只处理 dataSchema 中 errorMessage 给出具体错误内容的错误
|
|
164
|
+
|
|
165
|
+
errors = errors.filter(function (err) {
|
|
166
|
+
return err.keyword === 'errorMessage';
|
|
167
|
+
}); // 解析错误信息
|
|
168
|
+
|
|
169
|
+
errors.forEach(function (error) {
|
|
170
|
+
// 由于获取的instancePath前面会带有/,此处移除首项的
|
|
171
|
+
var key = error === null || error === void 0 ? void 0 : error.instancePath.replace(/^\//, '').replace(/\//g, '.'); // TODO 错误兜底逻辑优化,过滤error.message上不存在的错误
|
|
172
|
+
|
|
173
|
+
if (key) {
|
|
174
|
+
// 数组嵌套对象必填校验 只区instacePath不行,还需加上 error.params.errors[0].params.missingProperty
|
|
175
|
+
errorsMap["".concat(String(key)).concat(error.params.errors[0].params.missingProperty ? '.' + error.params.errors[0].params.missingProperty : '')] = error.message || '未知错误';
|
|
176
|
+
} else {
|
|
177
|
+
// 根目录required错误
|
|
178
|
+
errorsMap[error.params.errors[0].params.missingProperty] = error.message || '未知错误';
|
|
179
|
+
}
|
|
180
|
+
}); // 如果该字段不展示在界面上,比如通过开关控制显隐的一些必填项
|
|
181
|
+
// 则从校验中移除这些错误
|
|
182
|
+
|
|
183
|
+
Object.keys(errorsMap).map(function (key) {
|
|
184
|
+
if (visibleFieldKey && !(visibleFieldKey !== null && visibleFieldKey !== void 0 && visibleFieldKey.includes(key))) {
|
|
185
|
+
delete errorsMap[key];
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return {
|
|
189
|
+
pass: pass,
|
|
190
|
+
errors: errors,
|
|
191
|
+
errorsMap: errorsMap,
|
|
192
|
+
formData: newFormData
|
|
193
|
+
};
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error(error);
|
|
196
|
+
return {
|
|
197
|
+
pass: false,
|
|
198
|
+
errors: [],
|
|
199
|
+
formData: formData,
|
|
200
|
+
errorsMap: {}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
/**
|
|
205
|
+
*
|
|
206
|
+
* @param delay 校验防抖,延迟多少ms校验
|
|
207
|
+
* @returns
|
|
208
|
+
*/
|
|
209
|
+
|
|
210
|
+
var useValidate = function useValidate() {
|
|
211
|
+
var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
|
|
212
|
+
|
|
213
|
+
var _useDebounceFn = _useDebounceFn2(function (_ref2) {
|
|
214
|
+
var dataSchema = _ref2.dataSchema,
|
|
215
|
+
formData = _ref2.formData,
|
|
216
|
+
dispatch = _ref2.dispatch,
|
|
217
|
+
visibleFieldKey = _ref2.visibleFieldKey,
|
|
218
|
+
ajv = _ref2.ajv;
|
|
219
|
+
|
|
220
|
+
/*
|
|
221
|
+
因为ajv中有option配置可以改变formData(useDefaults:true)修改默认值
|
|
222
|
+
或者类似ajv-keywords的自定义关键字transform等情况会修改formData。
|
|
223
|
+
所以需要在在validate中使用immer,并重新返回新的formData。在此需要对formData重新dispatch设置
|
|
224
|
+
*/
|
|
225
|
+
var _validate = validate({
|
|
226
|
+
schema: dataSchema,
|
|
227
|
+
formData: formData,
|
|
228
|
+
ajv: ajv,
|
|
229
|
+
visibleFieldKey: visibleFieldKey
|
|
230
|
+
}),
|
|
231
|
+
errorsMap = _validate.errorsMap,
|
|
232
|
+
newFormData = _validate.formData;
|
|
233
|
+
|
|
234
|
+
dispatch({
|
|
235
|
+
type: 'setAjvErr',
|
|
236
|
+
action: {
|
|
237
|
+
errors: errorsMap
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
dispatch({
|
|
241
|
+
type: 'setData',
|
|
242
|
+
action: {
|
|
243
|
+
formData: newFormData
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
dispatch({
|
|
247
|
+
type: 'setChecking',
|
|
248
|
+
checking: false
|
|
249
|
+
});
|
|
250
|
+
}, {
|
|
251
|
+
wait: delay
|
|
252
|
+
}),
|
|
253
|
+
run = _useDebounceFn.run;
|
|
254
|
+
|
|
255
|
+
return run;
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
/*
|
|
259
|
+
* @Author: jiangxiaowei
|
|
260
|
+
* @Date: 2022-03-08 17:48:49
|
|
261
|
+
* @Last Modified by: jiangxiaowei
|
|
262
|
+
* @Last Modified time: 2022-03-09 17:10:13
|
|
263
|
+
*/
|
|
264
|
+
|
|
265
|
+
var RequiredModeContext = /*#__PURE__*/createContext('default'); // 返回上一次的value值
|
|
266
|
+
|
|
267
|
+
var useRequiredModeContext = function useRequiredModeContext() {
|
|
268
|
+
var requiredMode = useContext(RequiredModeContext);
|
|
269
|
+
return requiredMode;
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
function ownKeys$3(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
273
|
+
|
|
274
|
+
function _objectSpread$3(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$3(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$3(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* 格式化Moment类型数据
|
|
278
|
+
* @param {array|string} value
|
|
279
|
+
* @param {string} format 格式化模板
|
|
280
|
+
* @returns {string|array}
|
|
281
|
+
*/
|
|
282
|
+
function formatMomentData(_ref) {
|
|
283
|
+
var value = _ref.value,
|
|
284
|
+
format = _ref.format;
|
|
285
|
+
|
|
286
|
+
if (value) {
|
|
287
|
+
if (Array.isArray(value)) {
|
|
288
|
+
return [value[0].format(format), value[1].format(format)];
|
|
289
|
+
} else {
|
|
290
|
+
return moment(value).format(format);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return value;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* 格式化颜色选择器数据
|
|
298
|
+
* @param {object|string} value 颜色选择器表单值
|
|
299
|
+
*/
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
function formatColor(_ref2) {
|
|
303
|
+
var _value$rgb, _value$rgb2, _value$rgb3, _value$rgb4;
|
|
304
|
+
|
|
305
|
+
var value = _ref2.value;
|
|
306
|
+
|
|
307
|
+
if (_typeof(value) === 'object') {
|
|
308
|
+
switch (value.source) {
|
|
309
|
+
case 'rgb':
|
|
310
|
+
return "rgba(".concat((value === null || value === void 0 ? void 0 : (_value$rgb = value.rgb) === null || _value$rgb === void 0 ? void 0 : _value$rgb.r) || 0, ",").concat((value === null || value === void 0 ? void 0 : (_value$rgb2 = value.rgb) === null || _value$rgb2 === void 0 ? void 0 : _value$rgb2.g) || 0, ",").concat((value === null || value === void 0 ? void 0 : (_value$rgb3 = value.rgb) === null || _value$rgb3 === void 0 ? void 0 : _value$rgb3.b) || 0, ",").concat((value === null || value === void 0 ? void 0 : (_value$rgb4 = value.rgb) === null || _value$rgb4 === void 0 ? void 0 : _value$rgb4.a) || 1, ")");
|
|
311
|
+
|
|
312
|
+
default:
|
|
313
|
+
return (value === null || value === void 0 ? void 0 : value.hex) || '#ffffff';
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return value;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* 格式化uploader数据
|
|
321
|
+
*/
|
|
322
|
+
// function formatUploader({ value }: { value: { fileList?: any } }) {
|
|
323
|
+
// if (typeCheck(value) === 'Object') {
|
|
324
|
+
// return value?.fileList || value
|
|
325
|
+
// }
|
|
326
|
+
// return value
|
|
327
|
+
// }
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* 扁平化treeselect结构
|
|
331
|
+
* @param options treeselect的options 非treeDataSimpleMode(简单)模式
|
|
332
|
+
*/
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
function loop(options) {
|
|
336
|
+
return options.reduce(function (prev, cur) {
|
|
337
|
+
if (cur.children) {
|
|
338
|
+
var childrenArr = loop(cur.children);
|
|
339
|
+
return prev.concat(childrenArr).concat(cur);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return prev.concat(cur);
|
|
343
|
+
}, []);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* treeselect默认只保存当前选中的id。使用此方法将treeselect改成使用withPidDelimiter分隔符拼接的包括父级id的格式 类似 ‘0#1#2’
|
|
347
|
+
* @param param0 {
|
|
348
|
+
* value 需要更改的初始值
|
|
349
|
+
* options treeselect非treeDataSimpleMode格式的数据
|
|
350
|
+
* withPidDelimiter 分隔符
|
|
351
|
+
* }
|
|
352
|
+
*/
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
function formatWithPid(_ref3) {
|
|
356
|
+
var value = _ref3.value,
|
|
357
|
+
options = _ref3.options,
|
|
358
|
+
withPidDelimiter = _ref3.withPidDelimiter;
|
|
359
|
+
var newOptions = loop(options);
|
|
360
|
+
/**
|
|
361
|
+
* 循环获取父元素id并合并当前id值
|
|
362
|
+
* @param val 当前选择的id值
|
|
363
|
+
* @param withPidValue 带父元素id的值 默认为空
|
|
364
|
+
*/
|
|
365
|
+
|
|
366
|
+
var newValue = value.map(function (curVal) {
|
|
367
|
+
var loops = function loops(val, withPidValue) {
|
|
368
|
+
var index = newOptions.findIndex(function (item) {
|
|
369
|
+
return item.value === val;
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
if (index != -1) {
|
|
373
|
+
var parentValue = newOptions[index].parentValue;
|
|
374
|
+
withPidValue = "".concat(parentValue).concat(withPidDelimiter).concat(withPidValue || val);
|
|
375
|
+
return loops(parentValue, withPidValue);
|
|
376
|
+
} else {
|
|
377
|
+
return withPidValue;
|
|
378
|
+
}
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
var withPidValue = loops(curVal);
|
|
382
|
+
return withPidValue;
|
|
383
|
+
});
|
|
384
|
+
return newValue;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* value格式化
|
|
388
|
+
* @param param0 {
|
|
389
|
+
* value 表单值
|
|
390
|
+
* disabled_input 禁止输入的值
|
|
391
|
+
* }
|
|
392
|
+
*/
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
function formatValue(_ref4) {
|
|
396
|
+
var value = _ref4.value,
|
|
397
|
+
disabled_input = _ref4.disabled_input;
|
|
398
|
+
|
|
399
|
+
if (disabled_input) {
|
|
400
|
+
var regStr = disabled_input.join('|');
|
|
401
|
+
var regExp = new RegExp(regStr, 'g');
|
|
402
|
+
|
|
403
|
+
if (regExp.test(value)) {
|
|
404
|
+
return value.replace(regExp, '');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return value;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* 针对select+text表单项的format
|
|
412
|
+
* @param value
|
|
413
|
+
* @param subFieldKey
|
|
414
|
+
* @param prevFieldData
|
|
415
|
+
*/
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
function formatSelectText(_ref5) {
|
|
419
|
+
var value = _ref5.value,
|
|
420
|
+
subFieldKey = _ref5.subFieldKey,
|
|
421
|
+
prevFieldData = _ref5.prevFieldData;
|
|
422
|
+
return Object.assign({
|
|
423
|
+
select: [],
|
|
424
|
+
text: ''
|
|
425
|
+
}, typeCheck(prevFieldData) === 'Object' ? prevFieldData : {}, _defineProperty({}, subFieldKey, value));
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
var formatMap = {
|
|
429
|
+
isMoment: formatMomentData,
|
|
430
|
+
isColor: formatColor,
|
|
431
|
+
// 移除uploader组件的格式化处理,因为入参需要为 {file, fileList} 格式
|
|
432
|
+
// isUploader: formatUploader,
|
|
433
|
+
isWithPid: formatWithPid,
|
|
434
|
+
isFormat: formatValue,
|
|
435
|
+
isSelectText: formatSelectText
|
|
436
|
+
};
|
|
437
|
+
/* 例子
|
|
438
|
+
import { useField } from 'hooks'
|
|
439
|
+
const myComponent = ({fieldKey,onChange})=>{
|
|
440
|
+
const onchange = useField(fieldKey,onChange)
|
|
441
|
+
<Input
|
|
442
|
+
onChange={_onChange}
|
|
443
|
+
/>
|
|
444
|
+
}
|
|
445
|
+
*/
|
|
446
|
+
|
|
447
|
+
var useField = function useField(_ref6, dispatch) {
|
|
448
|
+
var fieldKey = _ref6.fieldKey,
|
|
449
|
+
onChange = _ref6.onChange,
|
|
450
|
+
_ref6$options = _ref6.options,
|
|
451
|
+
options = _ref6$options === void 0 ? {} : _ref6$options,
|
|
452
|
+
asyncValidate = _ref6.asyncValidate,
|
|
453
|
+
prevFieldData = _ref6.prevFieldData,
|
|
454
|
+
fieldData = _ref6.fieldData,
|
|
455
|
+
getKey = _ref6.getKey;
|
|
456
|
+
var requiredMode = useRequiredModeContext(); // onChange 回调 debounce
|
|
457
|
+
|
|
458
|
+
var _useDebounceFn = _useDebounceFn2(function (val, dispatch) {
|
|
459
|
+
if (onChange) {
|
|
460
|
+
try {
|
|
461
|
+
// 如果为函数,则直接执行
|
|
462
|
+
if (typeof onChange === 'function') {
|
|
463
|
+
onChange({
|
|
464
|
+
val: val,
|
|
465
|
+
dispatch: dispatch,
|
|
466
|
+
fieldKey: fieldKey,
|
|
467
|
+
prevFieldData: prevFieldData,
|
|
468
|
+
fieldData: fieldData,
|
|
469
|
+
getKey: getKey
|
|
470
|
+
});
|
|
471
|
+
} else {
|
|
472
|
+
var onChangeFuc = new Function('props', onChange);
|
|
473
|
+
onChangeFuc && onChangeFuc({
|
|
474
|
+
val: val,
|
|
475
|
+
dispatch: dispatch,
|
|
476
|
+
fieldKey: fieldKey,
|
|
477
|
+
prevFieldData: prevFieldData,
|
|
478
|
+
fieldData: fieldData,
|
|
479
|
+
getKey: getKey
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
} catch (error) {
|
|
483
|
+
console.error('onChange函数体错误');
|
|
484
|
+
console.error(error);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
if (asyncValidate && asyncValidate.type === 'change') {
|
|
489
|
+
var asyncValidateResult = asyncValidate.fn(val);
|
|
490
|
+
|
|
491
|
+
if (asyncValidateResult !== null && asyncValidateResult !== void 0 && asyncValidateResult.then) {
|
|
492
|
+
asyncValidateResult.then(function (res) {
|
|
493
|
+
if (res) {
|
|
494
|
+
dispatch({
|
|
495
|
+
type: 'setErr',
|
|
496
|
+
action: {
|
|
497
|
+
set: _defineProperty({}, fieldKey, res)
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
} else {
|
|
501
|
+
dispatch({
|
|
502
|
+
type: 'setErr',
|
|
503
|
+
action: {
|
|
504
|
+
deleteKeys: fieldKey
|
|
505
|
+
}
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
} else {
|
|
510
|
+
if (asyncValidateResult) {
|
|
511
|
+
dispatch({
|
|
512
|
+
type: 'setErr',
|
|
513
|
+
action: {
|
|
514
|
+
set: _defineProperty({}, fieldKey, asyncValidateResult)
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
} else {
|
|
518
|
+
dispatch({
|
|
519
|
+
type: 'setErr',
|
|
520
|
+
action: {
|
|
521
|
+
deleteKeys: fieldKey
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
} // onChange && onChange(val,dispatch)
|
|
527
|
+
|
|
528
|
+
}, {
|
|
529
|
+
wait: 300
|
|
530
|
+
}),
|
|
531
|
+
run = _useDebounceFn.run;
|
|
532
|
+
|
|
533
|
+
return useEventCallback(function (e) {
|
|
534
|
+
var _e$target;
|
|
535
|
+
|
|
536
|
+
// 针对 babel-ui中的radio的checkbox模式和所有主题包的switch,由于获取不到正确的e.target,需要通过自身的fieldData进行修改
|
|
537
|
+
// switch返回的e为true、false,因此在传入onChange时直接将fieldData取反
|
|
538
|
+
var value = isEmpty(fieldData) ? e !== null && e !== void 0 && e.target ? e === null || e === void 0 ? void 0 : (_e$target = e.target) === null || _e$target === void 0 ? void 0 : _e$target.value : e : fieldData; //uploader内部修改不可变数据特殊处理
|
|
539
|
+
|
|
540
|
+
if (options.draft) {
|
|
541
|
+
value = produce$1(value, function (draft) {
|
|
542
|
+
return draft;
|
|
543
|
+
});
|
|
544
|
+
} // 判断当前传的options配置项是否需要特殊format处理
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
var formatKeys = Object.keys(formatMap);
|
|
548
|
+
var specialFormatKeys = Object.keys(options).filter(function (item) {
|
|
549
|
+
return options[item] === true && formatKeys.includes(item);
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
if (specialFormatKeys.length === 1 && formatMap[specialFormatKeys[0]]) {
|
|
553
|
+
value = formatMap[specialFormatKeys[0]](_objectSpread$3({
|
|
554
|
+
value: value
|
|
555
|
+
}, options));
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* 数组容器中子项为空不删除
|
|
559
|
+
*/
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
if ((options.isDelete || isEmpty(value)) && getKey(fieldKey, 'dataSchema').split('.').pop() !== 'items') {
|
|
563
|
+
// 使用JSON Schema规范的required关键字校验必填
|
|
564
|
+
if (requiredMode === 'default') {
|
|
565
|
+
// 删除formData中相应表单字段(fix:表单为空之后必填校验失效)
|
|
566
|
+
dispatch({
|
|
567
|
+
type: 'setData',
|
|
568
|
+
action: {
|
|
569
|
+
deleteKeys: fieldKey
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
} else {
|
|
573
|
+
// 通过minLength、minItems控制必填
|
|
574
|
+
dispatch({
|
|
575
|
+
type: 'setData',
|
|
576
|
+
action: {
|
|
577
|
+
set: _defineProperty({}, fieldKey, value)
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
} // 删除dataSchema中相应default(fix: text默认值后续删除不自动添加)
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
dispatch({
|
|
584
|
+
type: 'setValidate',
|
|
585
|
+
action: {
|
|
586
|
+
deleteKeys: "".concat(getKey(fieldKey, 'dataSchema'), ".default")
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
} else {
|
|
590
|
+
dispatch({
|
|
591
|
+
type: 'setData',
|
|
592
|
+
action: {
|
|
593
|
+
set: _defineProperty({}, fieldKey, value)
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
dispatch({
|
|
599
|
+
type: 'setChecking',
|
|
600
|
+
checking: true
|
|
601
|
+
});
|
|
602
|
+
run(value, dispatch);
|
|
603
|
+
}, [dispatch, onChange, fieldKey]);
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
var useQuery = function useQuery(_ref, dispatch) {
|
|
607
|
+
var options = _ref.options,
|
|
608
|
+
queryFunc = _ref.queryFunc,
|
|
609
|
+
_ref$requestCache = _ref.requestCache,
|
|
610
|
+
requestCache = _ref$requestCache === void 0 ? true : _ref$requestCache,
|
|
611
|
+
fieldKey = _ref.fieldKey,
|
|
612
|
+
getKey = _ref.getKey;
|
|
613
|
+
return useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
614
|
+
var data,
|
|
615
|
+
_args = arguments;
|
|
616
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
617
|
+
while (1) {
|
|
618
|
+
switch (_context.prev = _context.next) {
|
|
619
|
+
case 0:
|
|
620
|
+
if (!((options.length === 0 || !requestCache) && queryFunc)) {
|
|
621
|
+
_context.next = 5;
|
|
622
|
+
break;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
_context.next = 3;
|
|
626
|
+
return queryFunc.apply(void 0, _args);
|
|
627
|
+
|
|
628
|
+
case 3:
|
|
629
|
+
data = _context.sent;
|
|
630
|
+
dispatch({
|
|
631
|
+
type: 'setUi',
|
|
632
|
+
action: {
|
|
633
|
+
set: _defineProperty({}, "".concat(getKey(fieldKey, 'uiSchema'), ".options"), data)
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
case 5:
|
|
638
|
+
case "end":
|
|
639
|
+
return _context.stop();
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}, _callee);
|
|
643
|
+
})), [dispatch, fieldKey, getKey, options.length, queryFunc, requestCache]);
|
|
644
|
+
};
|
|
645
|
+
|
|
646
|
+
var useArray = function useArray(_ref) {
|
|
647
|
+
var fieldKey = _ref.fieldKey,
|
|
648
|
+
dispatch = _ref.dispatch,
|
|
649
|
+
fieldData = _ref.fieldData;
|
|
650
|
+
// 新增一项
|
|
651
|
+
var addItem = useCallback(function (order, item) {
|
|
652
|
+
dispatch({
|
|
653
|
+
type: 'setArrayKey',
|
|
654
|
+
action: {
|
|
655
|
+
fieldKey: fieldKey,
|
|
656
|
+
order: order
|
|
657
|
+
}
|
|
658
|
+
});
|
|
659
|
+
dispatch({
|
|
660
|
+
type: 'setData',
|
|
661
|
+
action: {
|
|
662
|
+
set: _defineProperty({}, fieldKey, produce(fieldData || [], function (draft) {
|
|
663
|
+
draft.splice(order, 0, item);
|
|
664
|
+
}))
|
|
665
|
+
}
|
|
666
|
+
});
|
|
667
|
+
}, [dispatch, fieldData, fieldKey]); // 删除一项
|
|
668
|
+
|
|
669
|
+
var deltItem = useCallback(function (order) {
|
|
670
|
+
dispatch({
|
|
671
|
+
type: 'setArrayKey',
|
|
672
|
+
action: {
|
|
673
|
+
fieldKey: fieldKey,
|
|
674
|
+
order: order,
|
|
675
|
+
isDelete: true
|
|
676
|
+
}
|
|
677
|
+
}); // 删除自定义错误
|
|
678
|
+
|
|
679
|
+
dispatch({
|
|
680
|
+
type: 'setErr',
|
|
681
|
+
action: {
|
|
682
|
+
deleteKeys: "".concat(fieldKey, ".").concat(order)
|
|
683
|
+
}
|
|
684
|
+
});
|
|
685
|
+
dispatch({
|
|
686
|
+
type: 'setData',
|
|
687
|
+
action: {
|
|
688
|
+
deleteKeys: "".concat(fieldKey, ".").concat(order)
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
}, [dispatch, fieldKey]); // 切换顺序
|
|
692
|
+
|
|
693
|
+
var arrayMove = useCallback(function (oldIndex, newIndex) {
|
|
694
|
+
dispatch({
|
|
695
|
+
type: 'setData',
|
|
696
|
+
action: {
|
|
697
|
+
set: _defineProperty({}, fieldKey, produce(fieldData || [], function (draft) {
|
|
698
|
+
draft.splice(newIndex, 0, draft.splice(oldIndex, 1)[0]);
|
|
699
|
+
}))
|
|
700
|
+
}
|
|
701
|
+
});
|
|
702
|
+
dispatch({
|
|
703
|
+
type: 'setArrayKey',
|
|
704
|
+
action: {
|
|
705
|
+
fieldKey: fieldKey,
|
|
706
|
+
move: [oldIndex, newIndex]
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
}, [dispatch, fieldData, fieldKey]);
|
|
710
|
+
return {
|
|
711
|
+
addItem: addItem,
|
|
712
|
+
deltItem: deltItem,
|
|
713
|
+
arrayMove: arrayMove
|
|
714
|
+
};
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
/*
|
|
718
|
+
* container容器通用逻辑
|
|
719
|
+
* @Author: jiangxiaowei
|
|
720
|
+
* @Date: 2021-08-05 11:18:43
|
|
721
|
+
* @Last Modified by: jiangxiaowei
|
|
722
|
+
* @Last Modified time: 2022-01-26 17:58:40
|
|
723
|
+
*/
|
|
724
|
+
|
|
725
|
+
var useContainer = function useContainer(_ref) {
|
|
726
|
+
var fieldKey = _ref.fieldKey,
|
|
727
|
+
dispatch = _ref.dispatch;
|
|
728
|
+
//container容器加载的时候将当前表单fieldKey加入到visibleFieldKey中
|
|
729
|
+
useEffect(function () {
|
|
730
|
+
dispatch({
|
|
731
|
+
type: 'setVisibleKey',
|
|
732
|
+
action: {
|
|
733
|
+
fieldKey: fieldKey
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
return function () {
|
|
737
|
+
dispatch({
|
|
738
|
+
type: 'setVisibleKey',
|
|
739
|
+
action: {
|
|
740
|
+
deleteKeys: fieldKey
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
};
|
|
744
|
+
}, [dispatch, fieldKey]);
|
|
745
|
+
};
|
|
746
|
+
|
|
747
|
+
/*
|
|
748
|
+
* 获取fieldKey相对uiSchema、dataSchema、typeMap路径
|
|
749
|
+
* @Author: jiangxiaowei
|
|
750
|
+
* @Date: 2021-08-11 11:39:48
|
|
751
|
+
* @Last Modified by: jiangxiaowei
|
|
752
|
+
* @Last Modified time: 2022-08-12 12:46:46
|
|
753
|
+
*/
|
|
754
|
+
|
|
755
|
+
var useGetKey = function useGetKey(typeMap) {
|
|
756
|
+
// 获取fieldKey相对typeMap的路径
|
|
757
|
+
var getTypeKey = useCallback(function (fieldKey) {
|
|
758
|
+
var fieldKeyToTypeMap = Object.keys(typeMap).find(function (item) {
|
|
759
|
+
return generateReg(fieldKey.split('.')).test(item);
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
if (!fieldKeyToTypeMap) {
|
|
763
|
+
console.error(fieldKey, typeMap);
|
|
764
|
+
throw "\u65E0\u6CD5\u5728typeMap\u4E2D\u627E\u5230\u4E0E".concat(fieldKey, "\u5BF9\u5E94\u7684key,");
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
return fieldKeyToTypeMap;
|
|
768
|
+
}, [typeMap]); // 获取fieldKey相对uiSchema、dataSchema路径
|
|
769
|
+
|
|
770
|
+
var getKey = useCallback(function (fieldKey, type) {
|
|
771
|
+
if (type === 'data') return fieldKey;
|
|
772
|
+
if (type === 'unitedSchema') return typeMap[getTypeKey(fieldKey)].unitedSchemaKey;
|
|
773
|
+
return getTypeKey(fieldKey).split('.').reduce(function (prev, cur, index, arr) {
|
|
774
|
+
switch (index === 0 ? 'object' : typeMap[arr.slice(0, index).join('.')].type) {
|
|
775
|
+
case 'array':
|
|
776
|
+
if (cur === '$container') {
|
|
777
|
+
// 普通数组
|
|
778
|
+
return type === 'uiSchema' ? "".concat(prev ? "".concat(prev, ".") : '', "properties.").concat(cur) : "".concat(prev ? "".concat(prev, ".") : '', "items");
|
|
779
|
+
} else {
|
|
780
|
+
// 元祖
|
|
781
|
+
return type === 'uiSchema' ? "".concat(prev ? "".concat(prev, ".") : '', "properties.").concat(cur) : "".concat(prev ? "".concat(prev, ".") : '', "items.").concat(cur);
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
case 'object':
|
|
785
|
+
// 对象
|
|
786
|
+
return "".concat(prev ? "".concat(prev, ".") : '', "properties.").concat(cur);
|
|
787
|
+
|
|
788
|
+
default:
|
|
789
|
+
return "".concat(prev ? "".concat(prev, ".") : '', "properties.").concat(cur);
|
|
790
|
+
}
|
|
791
|
+
}, '');
|
|
792
|
+
}, [getTypeKey, typeMap]);
|
|
793
|
+
return {
|
|
794
|
+
getTypeKey: getTypeKey,
|
|
795
|
+
getKey: getKey
|
|
796
|
+
};
|
|
797
|
+
};
|
|
798
|
+
|
|
799
|
+
function ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
800
|
+
|
|
801
|
+
function _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$2(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
802
|
+
|
|
803
|
+
var useSchema = function useSchema(_ref) {
|
|
804
|
+
var uiSchema = _ref.uiSchema,
|
|
805
|
+
dataSchema = _ref.dataSchema,
|
|
806
|
+
typeMap = _ref.typeMap,
|
|
807
|
+
formData = _ref.formData,
|
|
808
|
+
dispatch = _ref.dispatch,
|
|
809
|
+
prevFormData = _ref.prevFormData,
|
|
810
|
+
prevUiSchema = _ref.prevUiSchema,
|
|
811
|
+
prevDataSchema = _ref.prevDataSchema,
|
|
812
|
+
prevTypeMap = _ref.prevTypeMap;
|
|
813
|
+
|
|
814
|
+
var _useGetKey = useGetKey(typeMap),
|
|
815
|
+
getTypeKey = _useGetKey.getTypeKey,
|
|
816
|
+
getKey = _useGetKey.getKey;
|
|
817
|
+
|
|
818
|
+
var get = useCallback(function (fieldKey) {
|
|
819
|
+
var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
820
|
+
isPrev: false
|
|
821
|
+
};
|
|
822
|
+
var isPrev = option === null || option === void 0 ? void 0 : option.isPrev;
|
|
823
|
+
var newFormData = isPrev ? prevFormData : formData;
|
|
824
|
+
var newTypeMap = isPrev ? prevTypeMap : typeMap;
|
|
825
|
+
var newUiSchema = isPrev ? prevUiSchema : uiSchema;
|
|
826
|
+
var newDataSchema = isPrev ? prevDataSchema : dataSchema;
|
|
827
|
+
|
|
828
|
+
try {
|
|
829
|
+
// 找不到则获取根目录
|
|
830
|
+
if (!fieldKey) {
|
|
831
|
+
return {
|
|
832
|
+
uiSchema: newUiSchema,
|
|
833
|
+
dataSchema: newDataSchema,
|
|
834
|
+
data: newFormData
|
|
835
|
+
};
|
|
836
|
+
} else {
|
|
837
|
+
var fieldKeyMap = fieldKey.split('.');
|
|
838
|
+
var arr = getTypeKey(fieldKey).split('.');
|
|
839
|
+
return arr.reduce(function (prev, cur, index, arr) {
|
|
840
|
+
if (cur === '') {
|
|
841
|
+
// 返回根目录的dataSchema、uiSchema、formData
|
|
842
|
+
return prev;
|
|
843
|
+
} else if (index === 0 || newTypeMap[arr.slice(0, index).join('.')].type === 'object') {
|
|
844
|
+
// 对象类型
|
|
845
|
+
return {
|
|
846
|
+
uiSchema: prev.uiSchema.properties[cur],
|
|
847
|
+
dataSchema: prev.dataSchema.properties[cur],
|
|
848
|
+
data: prev.data ? prev.data[cur] : undefined
|
|
849
|
+
};
|
|
850
|
+
} else if (newTypeMap[arr.slice(0, index).join('.')].type === 'array') {
|
|
851
|
+
// 数组类型
|
|
852
|
+
if (cur === '$container') {
|
|
853
|
+
// 普通数组
|
|
854
|
+
return {
|
|
855
|
+
uiSchema: prev.uiSchema.properties.$container,
|
|
856
|
+
dataSchema: prev.dataSchema[index === 0 ? 'properties' : 'items'],
|
|
857
|
+
data: prev.data ? prev.data[fieldKeyMap[index]] : undefined
|
|
858
|
+
};
|
|
859
|
+
} else {
|
|
860
|
+
// 元祖
|
|
861
|
+
return {
|
|
862
|
+
uiSchema: prev.uiSchema.properties[cur],
|
|
863
|
+
dataSchema: prev.dataSchema[index === 0 ? 'properties' : 'items'][cur],
|
|
864
|
+
data: prev.data ? prev.data[cur] : undefined
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
} else {
|
|
868
|
+
return {
|
|
869
|
+
uiSchema: prev.uiSchema,
|
|
870
|
+
dataSchema: prev.dataSchema,
|
|
871
|
+
data: prev.data
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
}, {
|
|
875
|
+
data: newFormData,
|
|
876
|
+
uiSchema: newUiSchema,
|
|
877
|
+
dataSchema: newDataSchema
|
|
878
|
+
});
|
|
879
|
+
}
|
|
880
|
+
} catch (error) {
|
|
881
|
+
return {
|
|
882
|
+
data: undefined,
|
|
883
|
+
uiSchema: undefined,
|
|
884
|
+
dataSchema: undefined
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
}, [dataSchema, formData, getTypeKey, prevDataSchema, prevFormData, prevTypeMap, prevUiSchema, typeMap, uiSchema]);
|
|
888
|
+
/**
|
|
889
|
+
* 获取当前value值
|
|
890
|
+
* @param fieldKey 表单项路径,a.b.c
|
|
891
|
+
* @param value 待替换值
|
|
892
|
+
* @param type 类型
|
|
893
|
+
*/
|
|
894
|
+
|
|
895
|
+
var handleFn = useCallback(function (fieldKey, value, type) {
|
|
896
|
+
var mode = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'set';
|
|
897
|
+
var typeMap = {
|
|
898
|
+
data: formData,
|
|
899
|
+
uiSchema: uiSchema,
|
|
900
|
+
dataSchema: dataSchema
|
|
901
|
+
}; // 根据FieldKey和type,获取在schema中的真实位置,如在ui中的a.properties.b.properties.c
|
|
902
|
+
// 生成解析映射树 ''在set中代表根路径,所以直接返回
|
|
903
|
+
|
|
904
|
+
var oldData;
|
|
905
|
+
|
|
906
|
+
if (fieldKey === '') {
|
|
907
|
+
oldData = typeMap[type];
|
|
908
|
+
} else {
|
|
909
|
+
var key = getKey(fieldKey, type);
|
|
910
|
+
oldData = key.split('.').reduce(function (prev, cur) {
|
|
911
|
+
return prev[cur];
|
|
912
|
+
}, typeMap[type]);
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
switch (typeCheck(value)) {
|
|
916
|
+
case 'Function':
|
|
917
|
+
return produce(oldData, value);
|
|
918
|
+
|
|
919
|
+
case 'Object':
|
|
920
|
+
if (mode === 'set') {
|
|
921
|
+
return value;
|
|
922
|
+
} else {
|
|
923
|
+
var recursionFn = function recursionFn(oldData, value) {
|
|
924
|
+
return produce(oldData, function (draft) {
|
|
925
|
+
for (var i in value) {
|
|
926
|
+
if (typeCheck(value[i]) === 'Object') {
|
|
927
|
+
// 如果存在,继续递归遍历设置对象的每个属性类似webpack-merge方式
|
|
928
|
+
if (draft[i]) {
|
|
929
|
+
draft[i] = recursionFn(draft[i], value[i]);
|
|
930
|
+
} else {
|
|
931
|
+
// 不存在直接设置
|
|
932
|
+
draft[i] = value[i];
|
|
933
|
+
}
|
|
934
|
+
} else {
|
|
935
|
+
draft[i] = value[i];
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
});
|
|
939
|
+
};
|
|
940
|
+
|
|
941
|
+
return recursionFn(oldData, value);
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
default:
|
|
945
|
+
return value;
|
|
946
|
+
}
|
|
947
|
+
}, [dataSchema, formData, getKey, uiSchema]); // TODO 多个set合并
|
|
948
|
+
|
|
949
|
+
var set = useCallback(function (key, type, value) {
|
|
950
|
+
switch (type) {
|
|
951
|
+
case 'data':
|
|
952
|
+
dispatch({
|
|
953
|
+
type: 'setData',
|
|
954
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
955
|
+
formData: handleFn(key, value, 'data')
|
|
956
|
+
}), key !== '' && {
|
|
957
|
+
set: _defineProperty({}, key, handleFn(key, value, 'data'))
|
|
958
|
+
})
|
|
959
|
+
});
|
|
960
|
+
break;
|
|
961
|
+
|
|
962
|
+
case 'uiSchema':
|
|
963
|
+
dispatch({
|
|
964
|
+
type: 'setUi',
|
|
965
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
966
|
+
uiSchema: handleFn(key, value, 'uiSchema')
|
|
967
|
+
}), key !== '' && {
|
|
968
|
+
set: _defineProperty({}, getKey(key, 'uiSchema'), handleFn(key, value, 'uiSchema'))
|
|
969
|
+
})
|
|
970
|
+
});
|
|
971
|
+
break;
|
|
972
|
+
|
|
973
|
+
case 'dataSchema':
|
|
974
|
+
dispatch({
|
|
975
|
+
type: 'setValidate',
|
|
976
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
977
|
+
dataSchema: handleFn(key, value, 'dataSchema')
|
|
978
|
+
}), key !== '' && {
|
|
979
|
+
set: _defineProperty({}, getKey(key, 'dataSchema'), handleFn(key, value, 'dataSchema'))
|
|
980
|
+
})
|
|
981
|
+
});
|
|
982
|
+
break;
|
|
983
|
+
}
|
|
984
|
+
}, [dispatch, getKey, handleFn]); // 支持深度merge,类似webpack-merge方式
|
|
985
|
+
|
|
986
|
+
var merge = useCallback(function (key, type, value) {
|
|
987
|
+
switch (type) {
|
|
988
|
+
case 'data':
|
|
989
|
+
dispatch({
|
|
990
|
+
type: 'setData',
|
|
991
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
992
|
+
formData: handleFn(key, value, 'data', 'merge')
|
|
993
|
+
}), key !== '' && {
|
|
994
|
+
set: _defineProperty({}, key, handleFn(key, value, 'data', 'merge'))
|
|
995
|
+
})
|
|
996
|
+
});
|
|
997
|
+
break;
|
|
998
|
+
|
|
999
|
+
case 'uiSchema':
|
|
1000
|
+
dispatch({
|
|
1001
|
+
type: 'setUi',
|
|
1002
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
1003
|
+
uiSchema: handleFn(key, value, 'uiSchema', 'merge')
|
|
1004
|
+
}), key !== '' && {
|
|
1005
|
+
set: _defineProperty({}, getKey(key, 'uiSchema'), handleFn(key, value, 'uiSchema', 'merge'))
|
|
1006
|
+
})
|
|
1007
|
+
});
|
|
1008
|
+
break;
|
|
1009
|
+
|
|
1010
|
+
case 'dataSchema':
|
|
1011
|
+
dispatch({
|
|
1012
|
+
type: 'setValidate',
|
|
1013
|
+
action: _objectSpread$2(_objectSpread$2({}, key === '' && {
|
|
1014
|
+
dataSchema: handleFn(key, value, 'dataSchema', 'merge')
|
|
1015
|
+
}), key !== '' && {
|
|
1016
|
+
set: _defineProperty({}, getKey(key, 'dataSchema'), handleFn(key, value, 'dataSchema', 'merge'))
|
|
1017
|
+
})
|
|
1018
|
+
});
|
|
1019
|
+
break;
|
|
1020
|
+
}
|
|
1021
|
+
}, [dispatch, getKey, handleFn]);
|
|
1022
|
+
/**
|
|
1023
|
+
* 删除一个表单项(同步删除uiSchema、dataSchema中的配置)
|
|
1024
|
+
*/
|
|
1025
|
+
|
|
1026
|
+
var deleteField = useCallback(function (key, cb) {
|
|
1027
|
+
dispatch({
|
|
1028
|
+
type: 'deleteField',
|
|
1029
|
+
action: {
|
|
1030
|
+
fieldKey: key,
|
|
1031
|
+
get: get,
|
|
1032
|
+
getKey: getKey,
|
|
1033
|
+
getTypeKey: getTypeKey
|
|
1034
|
+
}
|
|
1035
|
+
});
|
|
1036
|
+
cb && cb();
|
|
1037
|
+
}, [dispatch, get, getKey, getTypeKey]);
|
|
1038
|
+
/**
|
|
1039
|
+
* 添加一个表单项
|
|
1040
|
+
*/
|
|
1041
|
+
|
|
1042
|
+
var addField = useCallback(function (_ref2) {
|
|
1043
|
+
var fieldKey = _ref2.fieldKey,
|
|
1044
|
+
closestEdge = _ref2.closestEdge,
|
|
1045
|
+
unitedSchema = _ref2.unitedSchema,
|
|
1046
|
+
overFieldKey = _ref2.overFieldKey,
|
|
1047
|
+
cb = _ref2.cb,
|
|
1048
|
+
shouldDelete = _ref2.shouldDelete;
|
|
1049
|
+
dispatch({
|
|
1050
|
+
type: 'addField',
|
|
1051
|
+
action: {
|
|
1052
|
+
fieldKey: fieldKey,
|
|
1053
|
+
closestEdge: closestEdge,
|
|
1054
|
+
unitedSchema: unitedSchema,
|
|
1055
|
+
overFieldKey: overFieldKey,
|
|
1056
|
+
get: get,
|
|
1057
|
+
getKey: getKey,
|
|
1058
|
+
getTypeKey: getTypeKey,
|
|
1059
|
+
shouldDelete: shouldDelete
|
|
1060
|
+
}
|
|
1061
|
+
});
|
|
1062
|
+
cb && cb();
|
|
1063
|
+
}, [dispatch, get, getKey, getTypeKey]);
|
|
1064
|
+
return {
|
|
1065
|
+
get: get,
|
|
1066
|
+
set: set,
|
|
1067
|
+
deleteField: deleteField,
|
|
1068
|
+
addField: addField,
|
|
1069
|
+
merge: merge
|
|
1070
|
+
};
|
|
1071
|
+
};
|
|
1072
|
+
|
|
1073
|
+
function ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
1074
|
+
|
|
1075
|
+
function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$1(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
1076
|
+
|
|
1077
|
+
/**
|
|
1078
|
+
* title margin的基础数值,分别对应title在不同方位的布局
|
|
1079
|
+
*/
|
|
1080
|
+
var baseTitleMargin = {
|
|
1081
|
+
top: ['0', '0', '5px', '0'],
|
|
1082
|
+
right: ['0', '0', '0', '10px'],
|
|
1083
|
+
bottom: ['5px', '0', '0', '0'],
|
|
1084
|
+
left: ['0', '10px', '0', '0']
|
|
1085
|
+
};
|
|
1086
|
+
/**
|
|
1087
|
+
* margin中index对应margin方向的映射
|
|
1088
|
+
*/
|
|
1089
|
+
|
|
1090
|
+
var indexToMarginP = ['marginTop', 'marginRight', 'marginBottom', 'marginLeft'];
|
|
1091
|
+
function calcTitleMargin(titleUi, titlePlacement) {
|
|
1092
|
+
// 根据title布局确认基础margin,默认使用
|
|
1093
|
+
var marginRes = baseTitleMargin[titlePlacement || 'left'];
|
|
1094
|
+
|
|
1095
|
+
if (Object.hasOwnProperty.call(titleUi, 'margin')) {
|
|
1096
|
+
var _titleUi$margin;
|
|
1097
|
+
|
|
1098
|
+
// 解析margin,并映射到数组对应字段,数组顺序与margin原书写顺序一致
|
|
1099
|
+
var tmpMargin = (titleUi === null || titleUi === void 0 ? void 0 : (_titleUi$margin = titleUi.margin) === null || _titleUi$margin === void 0 ? void 0 : _titleUi$margin.split(' ')) || [];
|
|
1100
|
+
tmpMargin = tmpMargin.filter(function (item) {
|
|
1101
|
+
return !!item;
|
|
1102
|
+
});
|
|
1103
|
+
|
|
1104
|
+
if (tmpMargin.length === 1) {
|
|
1105
|
+
marginRes = marginRes.map(function () {
|
|
1106
|
+
return tmpMargin[0];
|
|
1107
|
+
});
|
|
1108
|
+
} else if (tmpMargin.length === 2) {
|
|
1109
|
+
marginRes = marginRes.map(function (item, idx) {
|
|
1110
|
+
return idx % 2 === 0 ? tmpMargin[0] : tmpMargin[1];
|
|
1111
|
+
});
|
|
1112
|
+
} else if (tmpMargin.length === 3) {
|
|
1113
|
+
marginRes = marginRes.map(function (item, idx) {
|
|
1114
|
+
return idx === 3 ? tmpMargin[1] : tmpMargin[idx];
|
|
1115
|
+
});
|
|
1116
|
+
} else {
|
|
1117
|
+
marginRes = tmpMargin;
|
|
1118
|
+
}
|
|
1119
|
+
} // 如果配置了marginRight等字段,则优先级更高,可覆盖base配置
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
marginRes = marginRes.map(function (item, idx) {
|
|
1123
|
+
var part = indexToMarginP[idx];
|
|
1124
|
+
var hasPartMargin = Object.hasOwnProperty.call(titleUi, part);
|
|
1125
|
+
var value = hasPartMargin && titleUi !== null ? Object.hasOwnProperty.call(titleUi, part) && titleUi[part] !== undefined ? titleUi[part] : item : item;
|
|
1126
|
+
return Number.isNaN(Number(value)) ? "".concat(value) : "".concat(value, "px");
|
|
1127
|
+
});
|
|
1128
|
+
return {
|
|
1129
|
+
// 用于覆写style
|
|
1130
|
+
style: marginRes.join(' '),
|
|
1131
|
+
// 用于计算其他元素的宽度或padding
|
|
1132
|
+
stringArr: marginRes
|
|
1133
|
+
};
|
|
1134
|
+
}
|
|
1135
|
+
|
|
1136
|
+
/**
|
|
1137
|
+
*
|
|
1138
|
+
* @param titleUi ui中的title字段
|
|
1139
|
+
* @param type ui的type类型
|
|
1140
|
+
* @returns
|
|
1141
|
+
*/
|
|
1142
|
+
var useTitle = function useTitle(titleUi, type) {
|
|
1143
|
+
// title的margin样式
|
|
1144
|
+
var _useState = useState(function () {
|
|
1145
|
+
return calcTitleMargin(titleUi, titleUi === null || titleUi === void 0 ? void 0 : titleUi.placement);
|
|
1146
|
+
}),
|
|
1147
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
1148
|
+
titleMargin = _useState2[0],
|
|
1149
|
+
onChangeTitleMargin = _useState2[1];
|
|
1150
|
+
|
|
1151
|
+
useEffect(function () {
|
|
1152
|
+
onChangeTitleMargin(calcTitleMargin(titleUi, titleUi === null || titleUi === void 0 ? void 0 : titleUi.placement));
|
|
1153
|
+
}, [titleUi]); // 标题宽度
|
|
1154
|
+
|
|
1155
|
+
var titleWidth = useMemo(function () {
|
|
1156
|
+
if (type === 'object') return '100%';
|
|
1157
|
+
return typeCheck((titleUi === null || titleUi === void 0 ? void 0 : titleUi.width) || 82) === 'Number' ? "".concat((titleUi === null || titleUi === void 0 ? void 0 : titleUi.width) || 82, "px") : (titleUi === null || titleUi === void 0 ? void 0 : titleUi.width) || '82px';
|
|
1158
|
+
}, [titleUi === null || titleUi === void 0 ? void 0 : titleUi.width, type]);
|
|
1159
|
+
return _objectSpread$1(_objectSpread$1({}, titleUi), {}, {
|
|
1160
|
+
margin: titleMargin.style,
|
|
1161
|
+
width: titleWidth,
|
|
1162
|
+
marginTop: titleMargin.stringArr[0],
|
|
1163
|
+
marginRight: titleMargin.stringArr[1],
|
|
1164
|
+
marginBottom: titleMargin.stringArr[2],
|
|
1165
|
+
marginLeft: titleMargin.stringArr[3]
|
|
1166
|
+
});
|
|
1167
|
+
};
|
|
1168
|
+
|
|
1169
|
+
// 默认全局配置
|
|
1170
|
+
var defaultGlobalOptions = {
|
|
1171
|
+
reload: true,
|
|
1172
|
+
ajvValidateDelay: 0,
|
|
1173
|
+
undefinedComponent: {
|
|
1174
|
+
type: 'tips',
|
|
1175
|
+
value: function value(_ref) {
|
|
1176
|
+
var theme = _ref.theme,
|
|
1177
|
+
type = _ref.type,
|
|
1178
|
+
fieldKey = _ref.fieldKey;
|
|
1179
|
+
|
|
1180
|
+
if (theme && type) {
|
|
1181
|
+
return "Unable to find ".concat(type, " component in theme ").concat(theme, ", please confirm whether to import it");
|
|
1182
|
+
} else {
|
|
1183
|
+
return "Unable to find custom component ".concat(fieldKey, ", please confirm whether to import it");
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
},
|
|
1187
|
+
fieldTitleEditable: false,
|
|
1188
|
+
selectedFieldKey: null,
|
|
1189
|
+
setFieldTitleChange: function setFieldTitleChange() {},
|
|
1190
|
+
showTitleWithIcon: null,
|
|
1191
|
+
getDeletedColumnsIndex: null
|
|
1192
|
+
};
|
|
1193
|
+
var globalOptionsContext = /*#__PURE__*/createContext(defaultGlobalOptions); // 返回上一次的value值
|
|
1194
|
+
|
|
1195
|
+
var useGlobalOptions = function useGlobalOptions() {
|
|
1196
|
+
return useContext(globalOptionsContext);
|
|
1197
|
+
};
|
|
1198
|
+
|
|
1199
|
+
/*
|
|
1200
|
+
* 全局状态
|
|
1201
|
+
* @Author: linjunchen5
|
|
1202
|
+
*/
|
|
1203
|
+
// 默认全局状态
|
|
1204
|
+
var defaultGlobalState = {
|
|
1205
|
+
stageErrors: {},
|
|
1206
|
+
apiJson: {}
|
|
1207
|
+
};
|
|
1208
|
+
var globalStateContext = /*#__PURE__*/createContext(defaultGlobalState); // 返回上一次的value值
|
|
1209
|
+
|
|
1210
|
+
var useGlobalState = function useGlobalState() {
|
|
1211
|
+
return useContext(globalStateContext);
|
|
1212
|
+
};
|
|
1213
|
+
|
|
1214
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
1215
|
+
|
|
1216
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
1217
|
+
|
|
1218
|
+
var useCountryStateCityOptions = function useCountryStateCityOptions(selectedOptions, countryConfig, stateConfig, cityConfig) {
|
|
1219
|
+
var _useState = useState([]),
|
|
1220
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
1221
|
+
countryOption = _useState2[0],
|
|
1222
|
+
setCountryOption = _useState2[1];
|
|
1223
|
+
|
|
1224
|
+
var _useState3 = useState([]),
|
|
1225
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
1226
|
+
stateOption = _useState4[0],
|
|
1227
|
+
setStateOption = _useState4[1];
|
|
1228
|
+
|
|
1229
|
+
var _useState5 = useState([]),
|
|
1230
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
1231
|
+
cityOption = _useState6[0],
|
|
1232
|
+
setCityOption = _useState6[1];
|
|
1233
|
+
|
|
1234
|
+
useEffect(function () {
|
|
1235
|
+
if (countryConfig) {
|
|
1236
|
+
fetchFnJsonKey({
|
|
1237
|
+
config: countryConfig,
|
|
1238
|
+
dataHandler: setCountryOption
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
}, [countryConfig]);
|
|
1242
|
+
useEffect(function () {
|
|
1243
|
+
if (selectedOptions.country && stateConfig) {
|
|
1244
|
+
var temp = _objectSpread({}, stateConfig);
|
|
1245
|
+
|
|
1246
|
+
temp.url = temp.url.replace(':countryCode', selectedOptions.country);
|
|
1247
|
+
fetchFnJsonKey({
|
|
1248
|
+
config: temp,
|
|
1249
|
+
dataHandler: setStateOption
|
|
1250
|
+
});
|
|
1251
|
+
}
|
|
1252
|
+
}, [selectedOptions.country, stateConfig]);
|
|
1253
|
+
useEffect(function () {
|
|
1254
|
+
if (selectedOptions.state && stateConfig && cityConfig) {
|
|
1255
|
+
var temp = _objectSpread({}, cityConfig);
|
|
1256
|
+
|
|
1257
|
+
temp.url = temp.url.replace(':stateCode', selectedOptions.state);
|
|
1258
|
+
fetchFnJsonKey({
|
|
1259
|
+
config: temp,
|
|
1260
|
+
dataHandler: setCityOption
|
|
1261
|
+
});
|
|
1262
|
+
} else if (selectedOptions.country && countryConfig && cityConfig && !stateConfig) {
|
|
1263
|
+
var _temp = _objectSpread({}, cityConfig);
|
|
1264
|
+
|
|
1265
|
+
_temp.url = _temp.url.replace(':countryCode', selectedOptions.country);
|
|
1266
|
+
fetchFnJsonKey({
|
|
1267
|
+
config: _temp,
|
|
1268
|
+
dataHandler: setCityOption
|
|
1269
|
+
});
|
|
1270
|
+
}
|
|
1271
|
+
}, [selectedOptions.country, countryConfig, selectedOptions.state, stateConfig, cityConfig]);
|
|
1272
|
+
return {
|
|
1273
|
+
countryOption: countryOption,
|
|
1274
|
+
stateOption: stateOption,
|
|
1275
|
+
cityOption: cityOption
|
|
1276
|
+
};
|
|
1277
|
+
};
|
|
1278
|
+
|
|
1279
|
+
export { RequiredModeContext, defaultGlobalOptions, defaultGlobalState, globalOptionsContext, globalStateContext, useArray, useClickOne, useContainer, useCountryStateCityOptions, useEventCallback, useField, useGetKey, useGlobalOptions, useGlobalState, useModal, usePrevious, useQuery, useRefProp, useRequiredModeContext, useSchema, useTitle, useValidate, validate };
|