UNPKG

react-admin-kit

Version:

A react based UI components for admin system

244 lines (239 loc) 9.87 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.ModalFormType = exports.ModalFormInnerRefTypeComponent = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _antd = require("antd"); var _react = require("react"); var _SchemaForm = _interopRequireDefault(require("../SchemaForm")); var _utils = require("../utils"); var _context = require("../SettingProvider/context"); var _context2 = require("../context"); var _treeUtil = require("../utils/treeUtil"); var _omit = _interopRequireDefault(require("omit.js")); var _ProForm = require("../ProForm"); var _utils2 = require("../SchemaForm/utils"); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["open", "styles", "onCancel", "onOk", "formProps", "confirmLoading"], _excluded2 = ["initialValues"], _excluded3 = ["width", "initialValue"]; var ModalForm = function ModalForm(props) { // 全局默认设置 var globalLocale = (0, _react.useContext)(_context.LocaleContext); var setting = (0, _react.useContext)(_context.ModalFormContext) || {}; var safeProps = (0, _omit.default)(props, ['formRef', 'innerRef', 'onFinish', 'columns']); var mergedProps = (0, _utils.myMergeOptions)(setting, safeProps || {}, // 默认值给到这里,特别是对象类的值 { styles: { body: { maxHeight: 'calc(100vh - 240px)', overflow: 'auto', // 让滚动条贴边 marginRight: '-20px', paddingRight: '20px' } } }); var propsFormRef = props.formRef, propsInnerRef = props.innerRef, onFinish = props.onFinish, columns = props.columns; var open = mergedProps.open, styles = mergedProps.styles, onCancel = mergedProps.onCancel, onOk = mergedProps.onOk, formProps = mergedProps.formProps, propsConfirmLoading = mergedProps.confirmLoading, modalRest = (0, _objectWithoutProperties2.default)(mergedProps, _excluded); var _ref = formProps || {}, _ref$initialValues = _ref.initialValues, propsInitialValues = _ref$initialValues === void 0 ? {} : _ref$initialValues, formRest = (0, _objectWithoutProperties2.default)(_ref, _excluded2); // 这是传给 SchemaForm 组件的 var innerRef = (0, _react.useRef)((0, _context2.CreateBaseInner)()); var formRef = (0, _react.useRef)(); var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), visible = _useState2[0], setVisible = _useState2[1]; var _useState3 = (0, _react.useState)('new'), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), formType = _useState4[0], setFormType = _useState4[1]; var _useState5 = (0, _react.useState)(propsInitialValues), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), formData = _useState6[0], setFormData = _useState6[1]; var _useState7 = (0, _react.useState)(false), _useState8 = (0, _slicedToArray2.default)(_useState7, 2), confirmLoading = _useState8[0], setConfirmLoading = _useState8[1]; var _Modal$useModal = _antd.Modal.useModal(), _Modal$useModal2 = (0, _slicedToArray2.default)(_Modal$useModal, 2), modal = _Modal$useModal2[0], contextHolder = _Modal$useModal2[1]; var _Form$useForm = _antd.Form.useForm(), _Form$useForm2 = (0, _slicedToArray2.default)(_Form$useForm, 1), form = _Form$useForm2[0]; (0, _react.useEffect)(function () { if (open || visible) { if (mergedProps.onOpen) { setConfirmLoading(true); Promise.resolve(mergedProps.onOpen(formType, getFormRef(), formData)).then(function () { setConfirmLoading(false); }).catch(function () { setConfirmLoading(false); }); } } }, [open, visible]); (0, _react.useEffect)(function () { // @ts-ignore var _form$getInternalHook = form.getInternalHooks('RC_FORM_INTERNAL_HOOKS'), setInitialValues = _form$getInternalHook.setInitialValues; var $values = (0, _utils2.transformValuesForConvention)(formData, (0, _utils2.collectDataIndex)(columns, formData)); setInitialValues($values); form.resetFields(); }, [formData]); var getFormRef = function getFormRef() { return propsFormRef || formRef; }; var getOnCancel = function getOnCancel(e) { if (open) { if (onCancel) onCancel(e); } else { setVisible(false); } }; var handleOnCancel = function handleOnCancel(e) { var _mergedProps$confirmO, _current; var confirmOnCloseDefault = { title: globalLocale === null || globalLocale === void 0 ? void 0 : globalLocale.confirmOnCloseTitle, content: globalLocale === null || globalLocale === void 0 ? void 0 : globalLocale.confirmOnCloseContent }; var confirmOnClose = (_mergedProps$confirmO = mergedProps.confirmOnClose) !== null && _mergedProps$confirmO !== void 0 ? _mergedProps$confirmO : confirmOnCloseDefault; confirmOnClose = confirmOnClose === true ? confirmOnCloseDefault : confirmOnClose; var isTouched = (_current = getFormRef().current) === null || _current === void 0 ? void 0 : _current.isFieldsTouched(); if (confirmOnClose && isTouched) { modal.confirm({ title: confirmOnClose.title, content: confirmOnClose.content, centered: true, closable: true, onOk: function onOk() { getOnCancel(e); }, getContainer: mergedProps.getContainer }); } else { getOnCancel(e); } }; var handleOnOk = function handleOnOk() { if (getFormRef().current) { var _current2; (_current2 = getFormRef().current) === null || _current2 === void 0 || _current2.submit(); } }; var handleOnFinish = function handleOnFinish(values) { if (onFinish) { setConfirmLoading(true); Promise.resolve(onFinish(values, formType, formData)).then(function () { setConfirmLoading(false); getOnCancel(null); }).catch(function (e) { /* istanbul ignore next */ console.log('onFinishError', e); setConfirmLoading(false); }); } }; var getColumns = function getColumns() { var $cols = (0, _treeUtil.normalizeTree)(columns, function (item) { /** 去掉 width 属性, 因为在表单中不需要 width */ var width = item.width, initialValue = item.initialValue, rest = (0, _objectWithoutProperties2.default)(item, _excluded3); // columns 上和 SchemaForm 组件的 initialValues 上不能有相同的字段, 否则会有告警. // Form already set 'initialValues' with path 'name'. Field can not overwrite it if (typeof item.dataIndex === 'string' && formData.hasOwnProperty(item.dataIndex)) { return rest; } else { return (0, _objectSpread2.default)({ initialValue: initialValue }, rest); } }, { replace: true }); return $cols; }; var openModal = function openModal() { var formType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'new'; var initialData = arguments.length > 1 ? arguments[1] : undefined; var cb = arguments.length > 2 ? arguments[2] : undefined; // 将 formType 挂在 innerRef 上 propsInnerRef.current.formType = formType; // 合并初始值. openModal 所携带的初始值优先级更大. var initialValues = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, propsInitialValues || {}), initialData || {}); setFormType(formType); setFormData(initialValues); setVisible(true); if (cb) cb(); }; (0, _react.useImperativeHandle)(propsInnerRef, function () { return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, innerRef.current), {}, { openModal: openModal }); }, []); return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ProForm.InnerRefContext.Provider, { value: innerRef, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Modal, (0, _objectSpread2.default)((0, _objectSpread2.default)({ open: open !== null && open !== void 0 ? open : visible, styles: styles, onCancel: handleOnCancel, onOk: handleOnOk, confirmLoading: propsConfirmLoading !== null && propsConfirmLoading !== void 0 ? propsConfirmLoading : confirmLoading }, modalRest), {}, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SchemaForm.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({ scrollToFirstError: true // 默认值 , autoFocusFirstInput: true // 默认值 , isKeyPressSubmit: true // 默认值 , readonly: formType === 'read', columns: getColumns(), onFinish: handleOnFinish, formRef: getFormRef(), innerRef: innerRef, initialValues: formData }, formRest), {}, { //@ts-ignore form: form // 当外部没传 form 时使用自身的 form, 防止当 ModalForm 嵌在 ProForm 里时被它的 form 覆盖 })) })) }), contextHolder] }); }; var _default = exports.default = ModalForm; /** * 仅用于输出文档 */ /* istanbul ignore next */ var ModalFormType = exports.ModalFormType = function ModalFormType() { return null; }; /** * 仅用于输出文档 */ /* istanbul ignore next */ var ModalFormInnerRefTypeComponent = exports.ModalFormInnerRefTypeComponent = function ModalFormInnerRefTypeComponent() { return null; };