UNPKG

react-admin-kit

Version:

A react based UI components for admin system

352 lines (335 loc) 15.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.SchemaFormSelfType = exports.SchemaFormOriginType = exports.FormColumnTypeComponent = void 0; var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); 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 _proForm = require("@ant-design/pro-form"); var _immer = require("immer"); var _react = _interopRequireWildcard(require("react")); var _antd = require("antd"); var _context2 = require("../SettingProvider/context"); var _genItems = require("./genItems"); var _ProForm = require("../ProForm"); var _context3 = require("../context"); var _utils = require("./utils"); var _utils2 = require("../utils"); var _omit = _interopRequireDefault(require("omit.js")); var _DescriptionsTable = _interopRequireDefault(require("./DescriptionsTable")); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["embed", "readonly", "readonlyType", "submitter", "valueBaseName", "initialValues", "descriptionsProps"]; var SchemaForm = function SchemaForm(props) { // 全局默认设置 var setting = (0, _react.useContext)(_context2.SchemaFormContext) || {}; var safeProps = (0, _omit.default)(props, ['form', 'formRef', 'innerRef', 'onFinish', 'columns']); var mergedProps = (0, _utils2.myMergeOptions)(setting, safeProps || {}, {}); var _mergedProps$embed = mergedProps.embed, embed = _mergedProps$embed === void 0 ? false : _mergedProps$embed, readonly = mergedProps.readonly, _mergedProps$readonly = mergedProps.readonlyType, readonlyType = _mergedProps$readonly === void 0 ? 'form' : _mergedProps$readonly, _mergedProps$submitte = mergedProps.submitter, submitter = _mergedProps$submitte === void 0 ? false : _mergedProps$submitte, valueBaseName = mergedProps.valueBaseName, initialValues = mergedProps.initialValues, descriptionsProps = mergedProps.descriptionsProps, rest = (0, _objectWithoutProperties2.default)(mergedProps, _excluded); var propsForm = props.form, propsFormRef = props.formRef, propsInnerRef = props.innerRef, onFinish = props.onFinish, columns = props.columns; // 当 innerRef 不传时提供一个内部默认值, 保证 innerRef 不为空 var innerRef = (0, _react.useRef)((0, _context3.CreateBaseInner)()); var parentInnerRef = (0, _react.useContext)(_ProForm.InnerRefContext); var getInnerRef = function getInnerRef() { // 以最近的 InnerRefContext 为优先 // ProForm -> SchemaForm // -> ModalForm -> SchemaForm return parentInnerRef || innerRef; }; var embedColumnsRef = (0, _react.useContext)(_ProForm.EmbedColumnContext); var formContainerRef = (0, _react.useRef)(null); (0, _react.useImperativeHandle)(propsInnerRef, function () { return getInnerRef().current; }, []); // 包装 form 实例方法, 用于约定式赋值 var wrapForm = function wrapForm(form) { var setFieldsValue = form.setFieldsValue; form.setFieldsValue = function (values) { var _getInnerRef$current; var $values = (0, _utils.transformValuesForConvention)(values, (0, _utils.collectDataIndex)(columns, values, valueBaseName)); setFieldsValue($values); /** 将赋值的值额外存在 innerRef 里, 在 render 函数(只读模式), 表单提交等场景里可用 */ (_getInnerRef$current = getInnerRef().current) === null || _getInnerRef$current === void 0 || _getInnerRef$current.setData($values || {}); }; return form; }; var _Form$useForm = _antd.Form.useForm(), _Form$useForm2 = (0, _slicedToArray2.default)(_Form$useForm, 1), form = _Form$useForm2[0]; var formInstance = _antd.Form.useFormInstance(); var formInstanceRef = (0, _react.useRef)(embed ? null : wrapForm(propsForm || formInstance || form)); var formRef = (0, _react.useRef)(); var initialValuesRef = (0, _react.useRef)((0, _utils.transformValuesForConvention)(initialValues, (0, _utils.collectDataIndex)(columns, initialValues, valueBaseName))); (0, _react.useEffect)(function () { if (embed) { embedColumnsRef.current.push({ columns: columns, baseName: valueBaseName }); } }, [embed]); (0, _react.useImperativeHandle)(propsFormRef, function () { if (formRef.current) { var _formRef$current = formRef.current, _getFieldsValue = _formRef$current.getFieldsValue, _validateFields = _formRef$current.validateFields, _getFieldsFormatValue = _formRef$current.getFieldsFormatValue, _validateFieldsReturnFormatValue = _formRef$current.validateFieldsReturnFormatValue; return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, formRef.current), {}, { getFieldsValue: function getFieldsValue() { // @ts-ignore return (0, _utils.splitValues)(_getFieldsValue.apply(void 0, arguments)); }, getFieldsFormatValue: function getFieldsFormatValue() { // @ts-ignore return (0, _utils.splitValues)(_getFieldsFormatValue.apply(void 0, arguments)); }, validateFields: function validateFields() { return _validateFields.apply(void 0, arguments).then(function (res) { return (0, _utils.splitValues)(res); }); }, validateFieldsReturnFormatValue: function validateFieldsReturnFormatValue() { // @ts-ignore return _validateFieldsReturnFormatValue.apply(void 0, arguments).then(function (res) { return (0, _utils.splitValues)(res); }); } }); } }, [formRef.current]); var handleOnFinish = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(values) { return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: if (!onFinish) { _context.next = 2; break; } return _context.abrupt("return", onFinish((0, _utils.splitValues)(values))); case 2: case "end": return _context.stop(); } }, _callee); })); return function handleOnFinish(_x) { return _ref.apply(this, arguments); }; }(); /** * 给 fieldProps 和 renderFormItem 注入 innerRef * 给一些约定的字段加上属性:required: true => formItemProps */ var patchColumn = function patchColumn($cols) { var $innerRef = getInnerRef(); return (0, _immer.produce)($cols, function (cols) { cols.forEach(function (col) { var renderFormItem = col.renderFormItem, fieldProps = col.fieldProps, valueType = col.valueType, columns = col.columns, _col$formItemProps = col.formItemProps, formItemProps = _col$formItemProps === void 0 ? {} : _col$formItemProps, required = col.required, render = col.render; // 增加 required: true 简写 if (required) { if (typeof formItemProps === 'function') { col.formItemProps = function (_form, _config) { var _formItemProps = formItemProps(_form, _config); if (!_formItemProps.rules) { _formItemProps.rules = []; } _formItemProps.rules.push({ required: true }); return _formItemProps; }; } else { var _formItemProps = formItemProps || {}; if (!_formItemProps.rules) { _formItemProps.rules = []; } _formItemProps.rules.push({ required: true }); col.formItemProps = _formItemProps; } } // 给fieldProps增加ref参数 if (fieldProps && typeof fieldProps === 'function') { col.fieldProps = function (form, config) { return fieldProps(form, $innerRef, config); }; } // 给renderFormItem增加ref参数 if (renderFormItem) { col.renderFormItem = function (a, b, c) { return renderFormItem(a, b, c, $innerRef); }; } // 针对只读模式, 扩展 entity if (render) { col.render = function (dom, entity) { var _formRef$current2, _formRef$current2$get, _getInnerRef$current2; var values = ((_formRef$current2 = formRef.current) === null || _formRef$current2 === void 0 || (_formRef$current2$get = _formRef$current2.getFieldsFormatValue) === null || _formRef$current2$get === void 0 ? void 0 : _formRef$current2$get.call(_formRef$current2)) || {}; var innerRefData = ((_getInnerRef$current2 = getInnerRef().current) === null || _getInnerRef$current2 === void 0 ? void 0 : _getInnerRef$current2.data) || {}; /** entity 中原有的 id, value 等属性会有被 values 中同名的值覆盖的可能 */ for (var _len = arguments.length, rest = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { rest[_key - 2] = arguments[_key]; } return render.apply(void 0, [dom, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, entity), initialValues || {}), innerRefData), values)].concat(rest)); }; } // 处理 columns 的套嵌, 例如 valueType 为 group if (columns && Array.isArray(columns)) { col.columns = patchColumn(columns); } // 处理 dependency 的套嵌 if (valueType === 'dependency' && columns && typeof columns === 'function') { col.columns = function (values) { return patchColumn(columns(values)); }; } }); }); }; /** * 在原来的 submitter dom 上增加一层 div, 方便在 div 上增加样式 */ var patchSubmitter = function patchSubmitter() { if ((0, _typeof2.default)(submitter) === 'object') { var render = submitter.render, _submitter$style = submitter.style, style = _submitter$style === void 0 ? {} : _submitter$style, className = submitter.className; /* istanbul ignore next */ if (render) { return submitter; } else { submitter.render = function (options, dom) { return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: className, style: (0, _objectSpread2.default)({ display: 'flex', alignItems: 'center', gap: '8px' }, style), children: dom }); }; return submitter; } } return submitter; }; /** * embed模式下只是用来生成formItem项, 所以不需要传任何Form的属性 */ if (embed) { var grid = mergedProps.grid, rowProps = mergedProps.rowProps, colProps = mergedProps.colProps, labelCol = mergedProps.labelCol; var parentReadonly = (0, _react.useContext)(_ProForm.ReadonlyContext); var activeReadonly = readonly === undefined ? parentReadonly : readonly; var activeReadonlyType = props.readonlyType === undefined ? (0, _react.useContext)(_ProForm.ReadonlyTypeContext) : readonlyType; var activeDescriptionsProps = descriptionsProps === undefined ? (0, _react.useContext)(_ProForm.DescriptionsPropsContext) : descriptionsProps; return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", { className: "form-item-wrapper", ref: formContainerRef, style: { display: activeReadonly && activeReadonlyType === 'descriptions' ? 'none' : 'block' }, children: grid ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.GridContext.Provider, { value: { grid: true, colProps: colProps }, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Row, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rowProps), {}, { children: (0, _genItems.genItems)(patchColumn(columns), 'form', formInstance, { labelCol: labelCol, valueBaseName: valueBaseName, colProps: colProps, readonly: activeReadonly }) })) }) : (0, _genItems.genItems)(patchColumn(columns), 'form', formInstance, { labelCol: labelCol, valueBaseName: valueBaseName, readonly: activeReadonly }) }), activeReadonly && activeReadonlyType === 'descriptions' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescriptionsTable.default, { formContainerRef: formContainerRef, grid: grid, embed: true, descriptionsProps: activeDescriptionsProps, layout: (0, _react.useContext)(_ProForm.LayoutContext) === 'horizontal' ? 'horizontal' : 'vertical' // 保持与 ProForm 的默认 layout 一致 })] }); } return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", { ref: formContainerRef, style: { display: readonly && readonlyType === 'descriptions' ? 'none' : 'block' }, children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_proForm.BetaSchemaForm, (0, _objectSpread2.default)((0, _objectSpread2.default)({ onFinish: handleOnFinish //@ts-ignore 说不能传true, 但是试了下 true 是可以给的 , submitter: patchSubmitter(), readonly: readonly, initialValues: initialValuesRef.current, formRef: formRef }, rest), {}, { // @ts-ignore form: formInstanceRef.current, columns: patchColumn(columns), layoutType: 'Form' })) }), readonly && readonlyType === 'descriptions' && /*#__PURE__*/(0, _jsxRuntime.jsx)(_DescriptionsTable.default, { formContainerRef: formContainerRef, grid: mergedProps.grid, descriptionsProps: descriptionsProps, layout: mergedProps.layout || 'vertical' // SchemaForm 的 layout 默认是 vertical })] }); }; var _default = exports.default = SchemaForm; // 用于生成api文档 /* istanbul ignore next */ var SchemaFormSelfType = exports.SchemaFormSelfType = function SchemaFormSelfType() { return null; }; // 用于生成api文档 /* istanbul ignore next */ var SchemaFormOriginType = exports.SchemaFormOriginType = function SchemaFormOriginType() { return null; }; // 用于生成api文档 /* istanbul ignore next */ var FormColumnTypeComponent = exports.FormColumnTypeComponent = function FormColumnTypeComponent() { return null; };