UNPKG

@m-materials/form-item

Version:

基于antd中form表单,加入了自定义组件,以简化代码为模板。

185 lines (145 loc) 6.56 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.FormRowWrapper = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _antd = require("antd"); var _lodash = _interopRequireDefault(require("lodash")); var _propTypes = _interopRequireDefault(require("prop-types")); var _react = _interopRequireDefault(require("react")); var _excluded = ["children"]; function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } // 检查是否需要克隆组件,减少渲染 function checkNeedClone(_ref) { var item = _ref.item, props = _ref.props; // 如果明显不能操作,也设置了必填,组件纠错 if (item.props.disabled === !!item.props.required || item.props.hidden === !!item.props.required) { return true; } if (props.isDetail !== item.props.disabled) { return true; } // 如果是明细,需要把必填给取消掉 var isDetail = props.isDetail; if (isDetail) { if (item.props.rules && item.props.rules.required) { return true; } } else { // 不是明细,有校验规则也需要克隆 if (item.props.validator) { return true; } } return false; } function handleAddItem(item) { // 将用span包含的子元素取出来 if (item.type && (item.type === 'span' || item.type === 'Row' || item.type === 'Tooltip')) { for (var _iterator = _createForOfIteratorHelperLoose(item.props.children), _step; !(_step = _iterator()).done;) { var childItem = _step.value; if (childItem) { return childItem; } } } else { return item; } } var FormRowWrapper = /*#__PURE__*/_react["default"].forwardRef(function (props, ref) { var contentArray = []; var children = props.children, others = (0, _objectWithoutPropertiesLoose2["default"])(props, _excluded); var content = children; var _Form$useForm = _antd.Form.useForm(), form = _Form$useForm[0]; // 将FormItem分组并重新渲染 if (_lodash["default"].isArray(content)) { for (var _iterator2 = _createForOfIteratorHelperLoose(content), _step2; !(_step2 = _iterator2()).done;) { var item = _step2.value; if (_lodash["default"].isArray(item)) { for (var k = 0; k < item.length; k++) { contentArray.push(handleAddItem(item[k])); } } else if (item) { contentArray.push(handleAddItem(item)); } } } else { contentArray.push(handleAddItem(content)); } // 实现span超过24自动加Row换行 var renderContent = []; var lineSpanSum = 0; for (var i = 0; i < contentArray.length; i++) { if (contentArray[i].props.hidden || _lodash["default"].isArray(contentArray[i])) { lineSpanSum += 0; } else { var span = contentArray[i].props.span || 8; var addNumber = 0; if (parseInt((lineSpanSum + span - 1) / 24) - parseInt(lineSpanSum / 24) === 1) { addNumber = parseInt((lineSpanSum + span) / 24) * 24 - lineSpanSum; } lineSpanSum += contentArray[i].props.span || 8; lineSpanSum += addNumber; } var j = parseInt((lineSpanSum - 1) / 24); if (!renderContent[j]) { renderContent[j] = []; } renderContent[j].push(contentArray[i]); } return /*#__PURE__*/_react["default"].createElement(_antd.Form, (0, _extends2["default"])({}, others, { ref: ref, form: form }), /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, renderContent.map(function (renderItem, index) { return /*#__PURE__*/_react["default"].createElement(_antd.Row, { key: index }, renderItem.map(function (item) { // 为每个元素设置唯一key if (item.props && item.props.code) { item = /*#__PURE__*/_react["default"].cloneElement(item, { form: form, key: item.props.code }); } // 合法的组件才需要这个步骤 // 代理组件的明细的处理 // 如果是ignoreDetail为true则忽略明细的代理 if (!item.props.ignoreDetail) { if (checkNeedClone({ item: item, props: props })) { item = /*#__PURE__*/_react["default"].cloneElement(item, { disabled: props.isDetail || item.props.disabled, rules: props.isDetail || item.props.disabled || item.props.hidden ? [{ required: false, message: '' }] : item.props.rules || [{ required: false, message: '' }], validator: props.isDetail || item.props.disabled ? null : item.props.validator || null }); } } if (item.props.disabled === !!item.props.required || item.props.hidden === !!item.props.required) { return /*#__PURE__*/_react["default"].cloneElement(item, { rules: item.props.disabled || item.props.hidden ? [{ required: false, message: '' }] : item.props.rules || [{ required: false, message: '' }] }); } return item; })); }))); }); exports.FormRowWrapper = FormRowWrapper; FormRowWrapper.propTypes = { isDetail: _propTypes["default"].bool };