UNPKG

@innoways/drip-form

Version:

drip-form表单渲染core

1,354 lines (1,088 loc) 584 kB
import _extends$1 from '@babel/runtime/helpers/extends'; import _classCallCheck$1 from '@babel/runtime/helpers/classCallCheck'; import _createClass$1 from '@babel/runtime/helpers/createClass'; import _inherits$1 from '@babel/runtime/helpers/inherits'; import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn'; import _getPrototypeOf$1 from '@babel/runtime/helpers/getPrototypeOf'; import * as React from 'react'; import React__default, { createContext, memo, useRef, useState, useEffect, useLayoutEffect, Component, useContext, useMemo as useMemo$1, useCallback, forwardRef, useImperativeHandle, PureComponent } from 'react'; import _asyncToGenerator$1 from '@babel/runtime/helpers/asyncToGenerator'; import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties'; import _typeof$1 from '@babel/runtime/helpers/typeof'; import _defineProperty from '@babel/runtime/helpers/defineProperty'; import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; import _regeneratorRuntime from '@babel/runtime/regenerator'; import produce$1, { produce, current } from 'immer'; import { useImmerReducer } from 'use-immer'; import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray'; import { parseUnitedSchema, setDeepProp, combine, deleteDeepProp, generateArrayKeyReg, randomString, toArray as toArray$2, generateReg, upgradeTips, typeCheck, handleMargin, get as get$1, number2Chinese, addFormValue, fetchFnJsonKey, parseFlow, isEqual as isEqual$1, fetchFn, isEmpty, fetchFormValue } from '@innoways/utils'; import { useGlobalState, useScreenSize, useGlobalOptions, useContainer, useTitle, useArray, defaultGlobalOptions, defaultGlobalState, usePrevious, validate, useValidate, useSchema, useGetKey, globalOptionsContext, globalStateContext, RequiredModeContext } from '@innoways/hooks'; import ReactTooltip from 'react-tooltip'; import classNames from 'classnames'; import reactIs, { isFragment, isMemo } from 'react-is'; import _extends$2 from '@babel/runtime/helpers/esm/extends'; import _defineProperty$1 from '@babel/runtime/helpers/esm/defineProperty'; import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck'; import _createClass from '@babel/runtime/helpers/esm/createClass'; import _inherits from '@babel/runtime/helpers/esm/inherits'; import _createSuper$1 from '@babel/runtime/helpers/esm/createSuper'; import _objectSpread$7 from '@babel/runtime/helpers/esm/objectSpread2'; import _slicedToArray$1 from '@babel/runtime/helpers/esm/slicedToArray'; import _objectWithoutProperties$1 from '@babel/runtime/helpers/esm/objectWithoutProperties'; import _typeof from '@babel/runtime/helpers/esm/typeof'; import _toConsumableArray$1 from '@babel/runtime/helpers/esm/toConsumableArray'; import _assertThisInitialized from '@babel/runtime/helpers/esm/assertThisInitialized'; import _asyncToGenerator from '@babel/runtime/helpers/esm/asyncToGenerator'; import _toArray from '@babel/runtime/helpers/esm/toArray'; import ReactDOM from 'react-dom'; import { useSensors, useSensor, PointerSensor, MouseSensor, DndContext, closestCenter } from '@dnd-kit/core'; import { useSortable, SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable'; import { restrictToVerticalAxis, restrictToParentElement } from '@dnd-kit/modifiers'; import { CSS } from '@dnd-kit/utilities'; import { PlusSquare, MinusSquare } from 'react-feather'; import dripAjv from '@innoways/ajv'; var _excluded$b = ["validateTime", "requiredMode"]; function ownKeys$6(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; } function _objectSpread$6(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$6(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$6(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var addField = function addField(_ref) { var action = _ref.action, state = _ref.state; // 添加一个新的表单项 var fieldKey = action.fieldKey, closestEdge = action.closestEdge, unitedSchema = action.unitedSchema, overFieldKey = action.overFieldKey, get = action.get, getKey = action.getKey, shouldDelete = action.shouldDelete, getTypeKey = action.getTypeKey; var keyPath = overFieldKey.split('.'); // overField 父级节点的FieldKey var overParentKey = keyPath.slice(0, keyPath.length - 1).join('.'); // 待添加的父级路径 元祖 overParentKey 对象 var addParentPath = closestEdge === 'over' ? overFieldKey : overParentKey; /** 确定typePath父级的路径 start */ var addParenTypePath = addParentPath; var addParenTypePathArr = addParenTypePath.split('.'); if (addParenTypePathArr.length > 1) { var grandParentPath = addParenTypePathArr.slice(0, addParenTypePathArr.length - 1).join('.'); // 待添加的组父级表单 var _get = get(grandParentPath), addGrandParentUiSchema = _get.uiSchema; // 待添加表单 祖父级元素类型 默认对象类型 if (addGrandParentUiSchema.type === 'array') { if (['normal', 'tuple'].includes(addGrandParentUiSchema.mode)) ; else { // 自增数组 var pathArr = addParentPath.split('.'); pathArr.pop(); pathArr.push('$container'); addParenTypePath = pathArr.join('.'); } } } addParenTypePath = addParenTypePath !== '' ? getTypeKey(addParenTypePath) : ''; /** 确定typePath父级的路径 end */ // // 待添加的父级表单uiSchema、dataSchema的Path var addParentSchemaPath = { data: (addParentPath ? getKey(addParentPath, 'dataSchema') : '').split('.').filter(function (item) { return item; }), ui: (addParentPath ? getKey(addParentPath, 'uiSchema') : '').split('.').filter(function (item) { return item; }) }; // 待添加的父级表单 var _get2 = get(addParentPath), addParentDataSchema = _get2.dataSchema, addParentUiSchema = _get2.uiSchema; // 待添加表单的dataSchema、uiSchema var _parseUnitedSchema = parseUnitedSchema(unitedSchema), _parseUnitedSchema$da = _parseUnitedSchema.dataSchema; _parseUnitedSchema$da.validateTime; _parseUnitedSchema$da.requiredMode; var dataSchema = _objectWithoutProperties(_parseUnitedSchema$da, _excluded$b), uiSchema = _parseUnitedSchema.uiSchema; // 待添加表单 父级元素类型 默认对象类型 var addParentType = 'object'; if (addParentUiSchema.type === 'array') { if (['normal', 'tuple'].includes(addParentUiSchema.mode)) { // 元祖 addParentType = 'tuple'; } else { // 自增数组 addParentType = 'array'; } } var order = addParentUiSchema.order || []; switch (addParentType) { case 'object': { // 排序模式 var isSortMode = !shouldDelete && fieldKey; // 在当前元素上下左右 over添加元素 var curKey = closestEdge === 'over' || keyPath.length <= 1 ? overFieldKey : keyPath.slice(keyPath.length - 1).join(); var index = order.findIndex(function (item) { return item === curKey; }); var newOrder = closestEdge === 'over' ? [fieldKey] : produce(order, function (draft) { var oldIndex = -1; if (isSortMode) { oldIndex = draft.findIndex(function (item) { return item === fieldKey; }); } // 插入位置 var insertIndex = ['left', 'top'].includes(closestEdge) ? index : index + 1; draft.splice(insertIndex, 0, fieldKey); // 删除老的 if (oldIndex != -1) { draft.splice(insertIndex <= oldIndex ? oldIndex + 1 : oldIndex, 1); } }); // 设置order setDeepProp(addParentSchemaPath.ui.concat(['order']), state.uiSchema, newOrder); if (isSortMode) { break; } // 设置uiSchema setDeepProp(addParentSchemaPath.ui.concat(['properties', fieldKey]), state.uiSchema, uiSchema); // 设置dataSchema setDeepProp(addParentSchemaPath.data.concat(['properties', fieldKey]), state.dataSchema, _objectSpread$6(_objectSpread$6({}, dataSchema), {}, { apiKey: fieldKey || '', hideOnViewMode: false })); break; } case 'array': { var _addParentUiSchema$pr; // '$container0' var items = addParentDataSchema.items || dataSchema; var container = (addParentUiSchema === null || addParentUiSchema === void 0 ? void 0 : (_addParentUiSchema$pr = addParentUiSchema.properties) === null || _addParentUiSchema$pr === void 0 ? void 0 : _addParentUiSchema$pr.$container) || uiSchema; if (closestEdge !== 'over') { var oldFieldKey = items.fieldKey || '0'; items = produce(items, function (draft) { var _properties; return { type: 'object', title: '', properties: (_properties = {}, _defineProperty(_properties, oldFieldKey, draft), _defineProperty(_properties, fieldKey, dataSchema), _properties) }; }); container = produce(container, function (draft) { var _properties2; // 嵌套数组+嵌套数组 特殊逻辑 return { type: 'object', order: ['left', 'top'].includes(closestEdge) ? [fieldKey, oldFieldKey] : [oldFieldKey, fieldKey], properties: (_properties2 = {}, _defineProperty(_properties2, oldFieldKey, draft), _defineProperty(_properties2, fieldKey, uiSchema), _properties2) }; }); } // 设置order setDeepProp(addParentSchemaPath.ui.concat(['order']), state.uiSchema, ['$container']); // 设置uiSchema setDeepProp(addParentSchemaPath.ui.concat(['properties', '$container']), state.uiSchema, container); // 设置dataSchema setDeepProp(addParentSchemaPath.data.concat(['items']), state.dataSchema, items); break; } case 'tuple': { var _curKey = overFieldKey.split('.').pop(); // items、order当前插入位置 var addIndex = closestEdge === 'over' ? 0 : ['left', 'top'].includes(closestEdge) ? +_curKey : +_curKey + 1; // items需要删除的老的元素位置 var delIndex = Number(fieldKey); var _items = addParentDataSchema.items || []; var newItems = closestEdge === 'over' ? [dataSchema] : produce(_items, function (draft) { // 插入 draft.splice(addIndex, 0, dataSchema); // 如果是排序删除老的 if (!shouldDelete) { draft.splice(addIndex > delIndex ? delIndex : delIndex + 1, 1); } }); // 设置order var _newOrder = closestEdge === 'over' ? ['0'] : [].concat(_toConsumableArray(order), [String(order.length)]); var properties = addParentUiSchema.properties || {}; var newProperties = closestEdge === 'over' ? { '0': uiSchema } : produce(properties, function (draft) { // 排序模式,互相替换位置 if (!shouldDelete) { var changeProp; var direction; order.filter(function (key) { if (addIndex > +fieldKey) { direction = 'topToBottom'; return +key < addIndex && +key >= +fieldKey; } else { direction = 'bottomToTop'; return +key <= +fieldKey && +key >= addIndex; } }).sort(function (a, b) { return +a - +b; }).map(function (key, index) { if (index === 0) { changeProp = draft[key]; } draft[key] = draft[String(+key + 1)]; if (direction == 'topToBottom') { if (+key === addIndex - 1) { draft[key] = changeProp; } } else { if (+key === +fieldKey) { draft[key] = changeProp; } } }); } else { var arr = _newOrder.filter(function (key) { return +key >= addIndex; }).sort(function (a, b) { return +b - +a; }); arr.map(function (key) { if (+key === addIndex) { draft[key] = uiSchema; } else { draft[key] = draft[String(+key - 1)]; } }); } }); // 设置uiSchema setDeepProp(addParentSchemaPath.ui.concat(['properties']), state.uiSchema, newProperties); // 设置dataSchema setDeepProp(addParentSchemaPath.data.concat(['items']), state.dataSchema, newItems); // 非排序模式 if (shouldDelete) { setDeepProp(addParentSchemaPath.ui.concat(['order']), state.uiSchema, _newOrder); } break; } } state.typePath = parseUnitedSchema(combine(current(state.dataSchema), current(state.uiSchema))).typePath; }; var addField$1 = addField; /* eslint-disable @typescript-eslint/no-unused-vars */ var deleteField = function deleteField(_ref) { var action = _ref.action, state = _ref.state; // 删除表单项 var fieldKey = action.fieldKey, get = action.get, getKey = action.getKey; action.getTypeKey; var keyPath = fieldKey.split('.'); // overField 父级节点的FieldKey var deleteParentPath = keyPath.slice(0, keyPath.length - 1).join('.'); // 待删除的父级路径 元祖 deleteParentKey 对象 // const deleteParentPath = deleteParentKey // 待删除的父级表单 var _get = get(deleteParentPath), deleteParentUiSchema = _get.uiSchema; // 待删除表单 父级元素类型 默认对象类型 var deleteParentType = 'object'; if (deleteParentUiSchema.type === 'array') { if (['normal', 'tuple'].includes(deleteParentUiSchema.mode)) { // 元祖 deleteParentType = 'tuple'; } else { // 自增数组 deleteParentType = 'array'; } } var deleteUiSchemaPath = getKey(fieldKey, 'uiSchema').split('.'); var deleteDataSchemaPath = getKey(fieldKey, 'dataSchema').split('.'); var deleteParentUiPath = deleteParentPath ? getKey(deleteParentPath, 'uiSchema').split('.') : []; var orderPath = deleteParentPath === '' ? ['order'] : getKey(deleteParentPath, 'uiSchema').split('.').concat('order'); switch (deleteParentType) { case 'array': { var index = 0; // 删除order deleteDeepProp(orderPath.concat(index), state.uiSchema); // 删除uiSchema deleteDeepProp(deleteUiSchemaPath, state.uiSchema); // 删除dataSchema deleteDeepProp(deleteDataSchemaPath, state.dataSchema); // TODO 删除formData // TODO 删除dataSchema的其它等字段 break; } case 'object': { var order = deleteParentUiSchema.order || []; var _index = order.findIndex(function (item) { return item == fieldKey.split('.').pop(); }); // 删除order if (_index != -1) { deleteDeepProp(orderPath.concat(_index), state.uiSchema); } // 删除uiSchema deleteDeepProp(deleteUiSchemaPath, state.uiSchema); // 删除dataSchema deleteDeepProp(deleteDataSchemaPath, state.dataSchema); // TODO 删除formData // TODO 删除dataSchema的其它等字段 break; } case 'tuple': { var _order = deleteParentUiSchema.order || []; var newOrder = _order.slice(0, _order.length - 1); // 设置order setDeepProp(orderPath, state.uiSchema, newOrder); // 删除dataSchema if (_order.length === 1) { // 元祖中删除最后一个元素时,需要同步删除父级的items,否则jsonSchema会报错 deleteDeepProp(deleteDataSchemaPath.slice(0, deleteDataSchemaPath.length - 1), state.dataSchema); } else { deleteDeepProp(deleteDataSchemaPath, state.dataSchema); } var oldProperties = deleteParentUiSchema.properties; var newProperties = produce(oldProperties, function (draft) { var index = _order.findIndex(function (item) { return item == fieldKey.split('.').pop(); }); if (index != -1) { delete draft[index]; newOrder.filter(function (item) { return +item >= index; }).map(function (item) { draft[item] = draft[String(+item + 1)]; }); } }); // 设置uiSchema setDeepProp(deleteParentUiPath.concat('properties'), state.uiSchema, newProperties); // TODO 删除formData // TODO 删除dataSchema的其它等字段 break; } } state.typePath = parseUnitedSchema(combine(current(state.dataSchema), current(state.uiSchema))).typePath; }; var deleteField$1 = deleteField; var _excluded$a = ["type"], _excluded2$1 = ["type"], _excluded3 = ["type"], _excluded4 = ["type"], _excluded5 = ["type"]; function ownKeys$5(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; } function _objectSpread$5(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys$5(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys$5(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var FormDataContext = /*#__PURE__*/createContext({ globalFormDataStoreKey: '' }); var formDataReducer = function formDataReducer(state, action) { var type = action.type; switch (type) { // 即将废弃,建议使用reset case 'reload': { upgradeTips('reload', 'reset'); // eslint-disable-next-line @typescript-eslint/no-unused-vars action.type; var args = _objectWithoutProperties(action, _excluded$a); Object.assign(state, args); break; } case 'reset': { Object.assign(state, action.action.state); break; } // 即将废弃,使用setValidate case 'setDataSchema': { upgradeTips('setDataSchema', 'setValidate'); // eslint-disable-next-line @typescript-eslint/no-unused-vars action.type; var _args = _objectWithoutProperties(action, _excluded2$1); if (_args.dataSchema) { state.dataSchema = _args.dataSchema; } else { for (var i in _args) { var mapKeys = i.split('.'); if (_args !== null && _args !== void 0 && _args.isDelete) { deleteDeepProp(mapKeys, state.dataSchema); } else { setDeepProp(mapKeys, state.dataSchema, _args[i]); } } } break; } case 'setValidate': { var _action$action = action.action, set = _action$action.set, dataSchema = _action$action.dataSchema; var deleteKeys = action.action.deleteKeys; if (set) { for (var _i in set) { setDeepProp(_i.split('.'), state.dataSchema, set[_i]); } } if (deleteKeys) { deleteKeys = toArray$2(deleteKeys); deleteKeys.map(function (fieldKey) { deleteDeepProp(fieldKey.split('.'), state.dataSchema); }); } if (dataSchema) { state.dataSchema = dataSchema; } break; } // 即将废弃,建议使用setUi case 'setUiSchema': { upgradeTips('setUiSchema', 'setUi'); // eslint-disable-next-line @typescript-eslint/no-unused-vars action.type; var _args2 = _objectWithoutProperties(action, _excluded3); if (_args2.uiSchema) { state.uiSchema = _args2.uiSchema; } else { for (var _i2 in _args2) { var _mapKeys = _i2.split('.'); setDeepProp(_mapKeys, state.uiSchema, _args2[_i2]); } } break; } // 即将废弃,建议使用setUi case 'deleteUiSchema': { upgradeTips('deleteUiSchema', 'setUi'); var _mapKeys2 = action.key.split('.'); deleteDeepProp(_mapKeys2, state.uiSchema); break; } case 'setUi': { var _action$action2 = action.action, _set = _action$action2.set, uiSchema = _action$action2.uiSchema; var _deleteKeys = action.action.deleteKeys; if (_set) { for (var _i3 in _set) { setDeepProp(_i3.split('.'), state.uiSchema, _set[_i3]); } } if (_deleteKeys) { _deleteKeys = toArray$2(_deleteKeys); _deleteKeys.map(function (fieldKey) { deleteDeepProp(fieldKey.split('.'), state.uiSchema); }); } if (uiSchema) { state.uiSchema = uiSchema; } break; } // 即将废弃,建议使用setData case 'setFormData': { upgradeTips('setFormData', 'setData'); // eslint-disable-next-line @typescript-eslint/no-unused-vars action.type; var _args3 = _objectWithoutProperties(action, _excluded4); if (_args3.formData) { state.formData = _args3.formData; } else { for (var _i4 in _args3) { setDeepProp(_i4.split('.'), state.formData, _args3[_i4], state.typePath); // 将当前变化的key记录下来 state.changeKey = _i4; } } break; } // 即将废弃,建议使用setData case 'deleteFormData': { upgradeTips('setFormData', 'setData'); state.changeKey = action.key; var _mapKeys3 = action.key.split('.'); deleteDeepProp(_mapKeys3, state.formData); break; } case 'setData': { var _action$action3 = action.action, _set2 = _action$action3.set, formData = _action$action3.formData; var _deleteKeys2 = action.action.deleteKeys; if (_set2) { for (var _i5 in _set2) { setDeepProp(_i5.split('.'), state.formData, _set2[_i5], state.typePath); // 将当前变化的key记录下来 state.changeKey = _i5; } } if (_deleteKeys2) { _deleteKeys2 = toArray$2(_deleteKeys2); _deleteKeys2.map(function (fieldKey) { state.changeKey = fieldKey; deleteDeepProp(fieldKey.split('.'), state.formData); }); } if (formData) { state.formData = formData; } break; } case 'deleteField': { deleteField$1({ action: action.action, state: state }); break; } case 'addField': { addField$1({ action: action.action, state: state }); break; } case 'setAjvErr': { var _deleteKeys3 = action.action.deleteKeys; var _action$action4 = action.action, errors = _action$action4.errors, _set3 = _action$action4.set; if (_set3) { for (var _i6 in _set3) { state.ajvErrors[_i6] = _set3[_i6]; } } if (_deleteKeys3) { _deleteKeys3 = toArray$2(_deleteKeys3); _deleteKeys3.map(function (fieldKey) { delete state.ajvErrors[fieldKey]; }); } if (errors) { state.ajvErrors = errors; } break; } // 即将废弃,建议使用setErr case 'setError': { upgradeTips('setError', 'setErr'); // eslint-disable-next-line @typescript-eslint/no-unused-vars action.type; var _args4 = _objectWithoutProperties(action, _excluded5); if (_args4.errors && typeCheck(_args4.errors) === 'Object') { var ignoreErr = {}; // ignore 用来将type:change的异步校验的结果保存下来。防止被validae给清空 if (_args4.ignore && Array.isArray(_args4.ignore) || state.ignoreErrKey.length > 0) { Array.from(new Set([].concat(_toConsumableArray(_args4.ignore || []), _toConsumableArray(state.ignoreErrKey)))).map(function (item) { if (state.errors[item]) { ignoreErr[item] = state.errors[item]; } }); } state.errors = _objectSpread$5(_objectSpread$5({}, _args4.errors), ignoreErr); } else { for (var _i7 in _args4) { var _params$action; var params = _args4; if (params !== null && params !== void 0 && (_params$action = params.action) !== null && _params$action !== void 0 && _params$action.ignore) { state.ignoreErrKey = Array.from(new Set([].concat(_toConsumableArray(state.ignoreErrKey), _toConsumableArray(params.action.ignore)))); } state.errors[_i7] = _args4[_i7]; } } break; } // 即将废弃,建议使用setErr case 'deleteError': { upgradeTips('deleteError', 'setErr'); if (Array.isArray(action.key)) { action.key.map(function (item) { delete state.errors[item]; }); } else { delete state.errors[action.key]; } break; } case 'setErr': { var _deleteKeys4 = action.action.deleteKeys; var _action$action5 = action.action, _errors = _action$action5.errors, _set4 = _action$action5.set; if (_set4) { for (var _i8 in _set4) { state.customErrors[_i8] = _set4[_i8]; } } if (_deleteKeys4) { _deleteKeys4 = toArray$2(_deleteKeys4); _deleteKeys4.map(function (fieldKey) { var arr = []; Object.keys(state.customErrors).map(function (key) { var _state$typePath$field; var reg = new RegExp("^".concat(fieldKey.split('.').join('\\.'), "(\\..+)*"), 'g'); // 判断是否有嵌套,删除嵌套 if (reg.test(key)) { delete state.customErrors[key]; } var fieldKeyToTypeMap = Object.keys(state.typePath).find(function (item) { var startArr = fieldKey.split('.'); startArr.pop(); return generateReg(startArr).test(item); }); if (fieldKeyToTypeMap && ((_state$typePath$field = state.typePath[fieldKeyToTypeMap]) === null || _state$typePath$field === void 0 ? void 0 : _state$typePath$field.type) === 'array') { var fieldKeyArr = fieldKey.split('.'); var order = fieldKeyArr.pop(); var _reg = new RegExp("^".concat(fieldKeyArr.join('\\.'), "\\.(\\d)(\\..+)*"), 'g'); var res = _reg.exec(key); // 嵌套情况:需要重新设置被删除的项的后续项的arrayKey if (res !== null) { var _res = _slicedToArray(res, 3), index = _res[1], end = _res[2]; if (+index >= +order) { arr[+index] = _objectSpread$5(_objectSpread$5({}, arr[+index]), {}, _defineProperty({}, end || '', state.customErrors[key])); } } } }); // 父元素是数组,删除需要切换 if (arr.length > 0) { var fieldKeyArr = fieldKey.split('.'); fieldKeyArr.pop(); var start = fieldKeyArr.join('.'); arr.map(function (item, index) { if (!item) return; for (var _i9 in item) { if (state.customErrors["".concat(start, ".").concat(+index + 1).concat(_i9)]) { state.customErrors["".concat(start, ".").concat(index).concat(_i9)] = state.customErrors["".concat(start, ".").concat(+index + 1).concat(_i9)]; } else { delete state.customErrors["".concat(start, ".").concat(index).concat(_i9)]; } } }); } }); } if (_errors) { state.customErrors = _errors; } break; } case 'setChecking': { if ('action' in action) { state.checking = action.action.checking; } else { state.checking = action.checking; } break; } case 'setVisibleKey': { var _action$action6 = action.action, fieldKey = _action$action6.fieldKey, _deleteKeys5 = _action$action6.deleteKeys; if (fieldKey) { fieldKey = toArray$2(fieldKey); state.visibleFieldKey = Array.from(new Set([].concat(_toConsumableArray(state.visibleFieldKey), _toConsumableArray(fieldKey)))); } if (_deleteKeys5) { _deleteKeys5 = toArray$2(_deleteKeys5); state.visibleFieldKey = state.visibleFieldKey.filter(function (item) { var _deleteKeys6; return !((_deleteKeys6 = _deleteKeys5) !== null && _deleteKeys6 !== void 0 && _deleteKeys6.includes(item)); }); } break; } case 'setArrayKey': { var _action$action7 = action.action, isDelete = _action$action7.isDelete, _fieldKey = _action$action7.fieldKey, order = _action$action7.order, move = _action$action7.move; // 当前数组的所有react key var fieldKeyComKey = state.arrayKey[_fieldKey] || []; var hasOrder = Object.prototype.hasOwnProperty.call(action.action, 'order'); if (isDelete && hasOrder && typeof order === 'number') { fieldKeyComKey.splice(order, 1); // 需要交换的数据 var arr = []; // 若存在嵌套,批量切换后续嵌套 Object.keys(state.arrayKey).map(function (item) { var reg = generateArrayKeyReg(_fieldKey.split('.').concat(String(order))); var res = reg.exec(item); // 嵌套情况:需要重新设置被删除的项的后续项的arrayKey if (res !== null) { var _res2 = _slicedToArray(res, 4), index = _res2[2], end = _res2[3]; if (+index >= order) { arr[+index] = _objectSpread$5(_objectSpread$5({}, arr[+index]), {}, _defineProperty({}, end, state.arrayKey[item])); } } }); arr.map(function (item, index) { if (!item) return; for (var _i10 in item) { if (index === arr.length - 1) { delete state.arrayKey["".concat(_fieldKey, ".").concat(index).concat(_i10)]; } else { state.arrayKey["".concat(_fieldKey, ".").concat(index).concat(_i10)] = state.arrayKey["".concat(_fieldKey, ".").concat(+index + 1).concat(_i10)]; } } }); } else { if (move) { fieldKeyComKey.splice(move[1], 0, fieldKeyComKey.splice(move[0], 1)[0]); // 若存在嵌套,批量切换后续嵌套 // 需要交换的arrayKey var change; // 需要交换的customErr var changeCustomError; // 需要交换的arrayKey var _arr = []; // 需要交换的customErrors var customErrorsArr = []; // 拖拽方向 var direction = ''; Object.keys(state.arrayKey).map(function (item) { var reg = generateArrayKeyReg(_fieldKey.split('.').concat(String(order))); var res = reg.exec(item); // 嵌套情况:需要重新设置被删除的项的后续项的arrayKey if (res !== null) { var _res3 = _slicedToArray(res, 4), index = _res3[2], end = _res3[3]; // 从上往下拖拽 if (move[0] < move[1]) { direction = 'topToBottom'; if (+index >= move[0] && +index <= move[1]) { _arr[+index] = _objectSpread$5(_objectSpread$5({}, _arr[+index]), {}, _defineProperty({}, end, state.arrayKey[item])); } } else { // 从下往上拖拽 direction = 'bottomToTop'; if (+index <= move[0] && +index >= move[1]) { _arr[+index] = _objectSpread$5(_objectSpread$5({}, _arr[+index]), {}, _defineProperty({}, end, state.arrayKey[item])); } } } }); Object.keys(state.customErrors).map(function (item) { var fieldKeyArr = _fieldKey.split('.'); var reg = new RegExp("^".concat(fieldKeyArr.join('\\.'), "\\.(\\d)(\\..+)*"), 'g'); var res = reg.exec(item); // 嵌套情况:需要重新设置被删除的项的后续项的arrayKey if (res !== null) { var _res4 = _slicedToArray(res, 3), index = _res4[1], end = _res4[2]; // 从上往下拖拽 if (move[0] < move[1]) { direction = 'topToBottom'; if (+index >= move[0] && +index <= move[1]) { customErrorsArr[+index] = _objectSpread$5(_objectSpread$5({}, customErrorsArr[+index]), {}, _defineProperty({}, end || '', state.customErrors[item])); } } else { // 从下往上拖拽 direction = 'bottomToTop'; if (+index <= move[0] && +index >= move[1]) { customErrorsArr[+index] = _objectSpread$5(_objectSpread$5({}, customErrorsArr[+index]), {}, _defineProperty({}, end || '', state.customErrors[item])); } } } }); switch (direction) { case 'topToBottom': { _arr.map(function (item, index) { if (!item) return; if (+index === move[0]) { change = item; for (var _i11 in item) { state.arrayKey["".concat(_fieldKey, ".").concat(index).concat(_i11)] = state.arrayKey["".concat(_fieldKey, ".").concat(+index + 1).concat(_i11)]; } } else if (+index === move[1]) { for (var _i12 in change) { state.arrayKey["".concat(_fieldKey, ".").concat(index).concat(_i12)] = change[_i12]; } } else { for (var _i13 in item) { state.arrayKey["".concat(_fieldKey, ".").concat(index).concat(_i13)] = state.arrayKey["".concat(_fieldKey, ".").concat(+index + 1).concat(_i13)]; } } }); customErrorsArr.map(function (item, index) { if (!item) return; if (+index === move[0]) { changeCustomError = item; for (var _i14 in item) { state.customErrors["".concat(_fieldKey, ".").concat(index).concat(_i14)] = state.customErrors["".concat(_fieldKey, ".").concat(+index + 1).concat(_i14)]; } } else if (+index === move[1]) { for (var _i15 in changeCustomError) { state.customErrors["".concat(_fieldKey, ".").concat(index).concat(_i15)] = changeCustomError[_i15]; } } else { for (var _i16 in item) { state.customErrors["".concat(_fieldKey, ".").concat(index).concat(_i16)] = state.customErrors["".concat(_fieldKey, ".").concat(+index + 1).concat(_i16)]; } } }); break; } case 'bottomToTop': _arr.slice().reverse().map(function (item, index, arr) { if (!item) return; var newIndex = arr.length - 1 - +index; if (newIndex === move[0]) { change = item; for (var _i17 in item) { state.arrayKey["".concat(_fieldKey, ".").concat(newIndex).concat(_i17)] = state.arrayKey["".concat(_fieldKey, ".").concat(newIndex - 1).concat(_i17)]; } } else if (newIndex === move[1]) { for (var _i18 in change) { state.arrayKey["".concat(_fieldKey, ".").concat(newIndex).concat(_i18)] = change[_i18]; } } else { for (var _i19 in item) { state.arrayKey["".concat(_fieldKey, ".").concat(newIndex).concat(_i19)] = state.arrayKey["".concat(_fieldKey, ".").concat(newIndex - 1).concat(_i19)]; } } }); customErrorsArr.slice().reverse().map(function (item, index, arr) { if (!item) return; var newIndex = arr.length - 1 - +index; if (newIndex === move[0]) { changeCustomError = item; for (var _i20 in item) { state.customErrors["".concat(_fieldKey, ".").concat(newIndex).concat(_i20)] = state.customErrors["".concat(_fieldKey, ".").concat(newIndex - 1).concat(_i20)]; } } else if (newIndex === move[1]) { for (var _i21 in changeCustomError) { state.customErrors["".concat(_fieldKey, ".").concat(newIndex).concat(_i21)] = changeCustomError[_i21]; } } else { for (var _i22 in item) { state.customErrors["".concat(_fieldKey, ".").concat(newIndex).concat(_i22)] = state.customErrors["".concat(_fieldKey, ".").concat(newIndex - 1).concat(_i22)]; } } }); break; } } else if (hasOrder && typeof order === 'number') { fieldKeyComKey[order] = randomString(52); } else { try { var formDataKey = _fieldKey.split('.'); var fieldData = formDataKey.reduce(function (prev, cur) { if (prev[cur]) { return prev[cur]; } else { return []; } }, state.formData); fieldKeyComKey = fieldData.map(function () { return randomString(52); }); } catch (error) {// console.log(error) } } state.arrayKey[_fieldKey] = fieldKeyComKey; } } } }; var _excluded$9 = ["title"]; 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; } 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; } /*TODO 优化renderprops和container编写 区分component prop和container prop*/ var Render = function Render(_ref) { var uiComponents = _ref.uiComponents, dataSchema = _ref.dataSchema, uiSchema = _ref.uiSchema, errors = _ref.errors, formData = _ref.formData, onQuery = _ref.onQuery, onValidate = _ref.onValidate, dispatch = _ref.dispatch, customComponents = _ref.customComponents, _ref$parentUiSchemaKe = _ref.parentUiSchemaKey, parentUiSchemaKey = _ref$parentUiSchemaKe === void 0 ? ['#'] : _ref$parentUiSchemaKe, _ref$parentDataSchema = _ref.parentDataSchemaKey, parentDataSchemaKey = _ref$parentDataSchema === void 0 ? ['#'] : _ref$parentDataSchema, _ref$parentFormDataKe = _ref.parentFormDataKey, parentFormDataKey = _ref$parentFormDataKe === void 0 ? '' : _ref$parentFormDataKe, currentArrayKey = _ref.currentArrayKey, containerMap = _ref.containerMap, containerHoc = _ref.containerHoc, get = _ref.get, getKey = _ref.getKey, isRoot = _ref.isRoot, arrayKey = _ref.arrayKey, uiAddOnInArray = _ref.uiAddOnInArray; var _useGlobalState = useGlobalState(), _useGlobalState$stage = _useGlobalState.stageErrors, stageErrors = _useGlobalState$stage === void 0 ? {} : _useGlobalState$stage; var screenSize = useScreenSize(); var _uiSchema$theme = uiSchema.theme, theme = _uiSchema$theme === void 0 ? 'antd' : _uiSchema$theme, _uiSchema$title = uiSchema.title, globalTitleUi = _uiSchema$title === void 0 ? {} : _uiSchema$title, _uiSchema$formMode = uiSchema.formMode, formMode = _uiSchema$formMode === void 0 ? 'edit' : _uiSchema$formMode, globalContainerStyle = uiSchema.containerStyle; // 当前父级UiSchema var currentUiSchema = parentUiSchemaKey.reduce(function (prev, cur) { if (cur === '#') { return prev; } else { return prev[cur]; } }, uiSchema); // 当前父级dataSchema var currentDataSchema = parentDataSchemaKey.reduce(function (prev, cur) { if (cur === '#') { return prev; } else { return prev[cur]; } }, dataSchema); // 当前父级formData 只可能是对象或者数组 var currentFormData = parentFormDataKey.split('.').reduce(function (prev, cur) { if (cur === '') { return prev; } else { return prev[cur] || (currentDataSchema.type === 'array' ? [] : {}); } }, formData); // 获取父级表单ui信息 var order = currentUiSchema.order, properties = currentUiSchema.properties, parentMode = currentUiSchema.mode, _currentUiSchema$type = currentUiSchema.type, parentType = _currentUiSchema$type === void 0 ? 'object' : _currentUiSchema$type; // 表单是否在下方直接展示错误信息 var showError = dataSchema.showError ? dataSchema.showError === 'change' || dataSchema.showError === 'submit' : dataSchema.validateTime === 'change'; return (order || []).map(function (item, i) { var _currentDataSchema$pr, _properties$item, _properties$item2, _properties$item3, _properties$item5; // 当前Field ui类型 var type = properties[item].type; var hideOnViewMode = parentType !== 'array' && (currentDataSchema === null || currentDataSchema === void 0 ? void 0 : (_currentDataSchema$pr = currentDataSchema.properties[item]) === null || _currentDataSchema$pr === void 0 ? void 0 : _currentDataSchema$pr.hideOnViewMode); // 当前表单是否为普通数组(自增数组)中的每一项 var isArrayItem = parentType === 'array' && item === '$container'; // 普通数组子表单类型 // 当前key路径 (相对dataSchema) var currentDataSchemaKey = parentDataSchemaKey.concat([// array为items,object为properties parentType === 'array' ? 'items' : 'properties', // 普通数组 isArrayItem ? '' : item]).filter(function (item) { return item !== ''; }); // 当前key路径 (相对uiSchema) var currentUiSchemaParentKey = parentUiSchemaKey.concat(['properties', item]); // 当前key(相对formData)普通数组需要获取currentArraykey值 var currentFieldKey = "".concat(parentFormDataKey, ".").concat(isArrayItem ? currentArrayKey : item); currentFieldKey = currentFieldKey.replace(/^\./, ''); // 防止用户动态修改uiSchema中表单项key值,无匹配dataSchema导致白屏的问题 if (!Object.prototype.hasOwnProperty.call(properties, item)) { console.log('Render Error: no schema for', 'color: #fff; background: #ffff00;padding: 3px', item); return null; } // 必填表单 var requiredFields = currentDataSchema.required || []; // 当前Field的主题 var itemTheme = ((_properties$item = properties[item]) === null || _properties$item === void 0 ? void 0 : _properties$item.theme) || theme; // 当前Field标题 var data = currentDataSchema[parentType === 'array' ? 'items' : 'properties']; var title = item === '$container' ? data.title : data[item].title; // 若当前Field在dataSchema中未定义,则不渲染 if (parentType === 'object' && !currentDataSchema.properties[item]) return null; if (parentType === 'array') { if (item == '$container') ; else { // 元祖 if (!currentDataSchema.items[item]) return null; } } // 当前Field的query函数 var queryFunc = onQuery === null || onQuery === void 0 ? void 0 : onQuery[item]; var asyncValidate = onValidate === null || onValidate === void 0 ? void 0 : onValidate[item]; // 当前Field的错误信息 var error = dataSchema.showError === 'submit' ? stageErrors[currentFieldKey] || '' : errors[currentFieldKey] || ''; // 当前Field的数据 var cKey = isArrayItem ? currentArrayKey : item; var fieldData = currentFormData[cKey]; var newFormData = _objectSpread$4({}, currentFormData); if (fieldData === undefined) { fieldData = currentDataSchema.properties && currentDataSchema.properties[item] && currentDataSchema.properties[item]["default"] ? currentDataSchema.properties[item]["default"] : undefined; newFormData = _objectSpread$4(_objectSpread$4({}, newFormData), {}, _defineProperty({}, cKey, fieldData)); if (newFormData[cKey] !== formData[cKey]) { dispatch({ type: 'setData', action: { set: _defineProperty({}, cKey, fieldData) } }); } } // 当前Field是否展示标题 var showTitle = Object.prototype.hasOwnProperty.call(properties[item], 'showTitle') ? properties[item].showTitle : true; // 布局样式 var breakpoint = (globalContainerStyle === null || globalContainerStyle === void 0 ? void 0 : globalContainerStyle.breakpoint) || 768; var containerStyle = Object.assign(type === 'object' && ((_properties$item2 = properties[item]) === null || _properties$item2 === void 0 ? void 0 : _properties$item2.mode) === 'collapse' ? { marginBottom: 20 } : {}, isRoot ? _objectSpread$4({ width: '100%' }, globalContainerStyle) : { width: '100%' }, ((_properties$item3 = properties[item]) === null || _properties$item3 === void 0 ? void 0 : _properties$item3.containerStyle) || {}); handleMargin(containerStyle, breakpoint, screenSize); // 当前Field所接收的ui props var _properties$item4 = properties[item]; _properties$item4.title; var uiProp = _objectWithoutProperties(_properties$item4, _excluded$9); // 当前Field的标题样式, property的样式会覆盖全局标题样式 var titleUi = Object.assign({ placement: 'left', width: '82px', textAlign: 'left', verticalAlign: 'center', requiredFields: false, fontSize: 12, color: '#000000' }, globalTitleUi, ((_properties$item5 = properties[item]) === null || _properties$item5 === void 0 ? void 0 : _properties$item5.title) || {}); // 当前Field的提示信息 var description = uiProp.description || null; // Field控制函数体 var vcontrol = properties[item].vcontrol; var controlFuc; // 是否展示当前Field var isShow = false; // 解析联动控制函数函数体 if (vcontrol) { try { if (typeof vcontrol === 'function') { controlFuc = vcontrol; } else { controlFuc = new Function('props', vcontrol); } isShow = controlFuc({ formData: formData, uiSchema: uiSchema, dataSchema: dataSchema, get: get, getKey: getKey, fieldKey: currentFieldKey, fieldData: fieldData }); } catch (error) { console.error("".concat(item, "\uFF1Avcontrol\u51FD\u6570\u4F53\u9519\u8BEF\uFF0C\u8BF7\u786E\u8BA4")); console.error(error); } } else { isShow = true; } if ((!isShow || !containerMap) && formMode !== 'generator') return null; /* 结束 */ var Container = containerMap[type] || containerMap["default"]; // 组件需要的prop参数 // send formData to individual field uiProp.formData = formData; var ui = { uiProp: uiProp }; // 不同容器的特殊prop var container = { array: {}, object: {} }; // 非FieldContaienr基础容器均需要透传,并且render函数也需要传递 var render = { containerHoc: containerHoc, // 全局dataSchema dataSchema: dataSchema, // 全局uiSchema uiSchema: uiSchema, // 所有表单错误信息 errors: errors, // 所有表单数据 formData: (currentUiSchema === null || currentUiSchema === void 0 ? void 0 : currentUiSchema.formMode) !== 'generator' ? formData : newFormData, // 所有表单异步数据获取函数对象 onQuery: onQuery, // 所有表单异步校验函数对象 onValidate: onValidate, // 父级uiSchema的路径 parentUiSchemaKey: currentUiSchemaParentKey, // 父级表单的dataSchema路径 parentDataSchemaKey: currentDataSchemaKey, // 父级表单的formData路径===父级表单的fieldKey parentFormDataKey: currentFieldKey, // 容器对象 containerMap: containerMap, // vcontrol 参数get函数。用来获取指定fieldKey的formData、uiSchema、dataSchema get: get, arrayKey: arrayKey }; // 所有容器均需要传递 var common = _objectSpread$4(_objectSpread$4({ formMode: uiProp.formMode || formMode, // 当前表单标题 title: title, // 当前表单使用主题 theme: itemTheme, // 当前表单错误信息 error: error, // 当前表单必填字段 requiredFields: requiredFields, // 当前表单提示信息 description: description, // 是否展示标题 showTitle: showTitle, // 当前表单的标题样式 titleUi: titleUi, // 是否展示错误 showError: showError }, formMode != 'generator' && { containerStyle: containerStyle }), {}, { // 当前渲染表单类型 type: type, // 容器key值 key: item, // 当前表单异步数据查询接口 queryFunc: queryFunc, // 当前表单异步校验函数 asyncValidate: asyncValidate, // 当前表单的fieldKey值(相对formData) fieldKey: currentFieldKey, // 当前表单数据 fieldData: fieldData, // 全局dispatch函数 dispatch: d