UNPKG

q-antd

Version:

双绑形式的antd。受控组件的双绑、Form表单验证

440 lines (369 loc) 17.4 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _class, _desc, _value, _class2, _descriptor, _descriptor2; /* * @Author: shiyong.yin * @Date: 2018-01-16 12:00:13 * @Last Modified by: shiyong.yin * @Description: 封装Provider为Form,使其具有校验功能,需配合Collect使用 * @Usage: */ /** * Form fillCount=1 labelWidth=20 layout=[flex, block,block] * Flexbox * Flex|Block * ItemWrap * Item * ... * ... * Block|Flex * Action */ var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _mobx = require('mobx'); var mobx = _interopRequireWildcard(_mobx); var _mobxReact = require('mobx-react'); var _coreDecorators = require('core-decorators'); var _flexbox = require('../flexbox'); var _flexbox2 = _interopRequireDefault(_flexbox); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _setProps = require('set-props'); var _setProps2 = _interopRequireDefault(_setProps); var _item = require('./item'); var _item2 = _interopRequireDefault(_item); var _action = require('./action'); var _action2 = _interopRequireDefault(_action); var _childrenUniKey = require('../_util/childrenUniKey'); var _childrenUniKey2 = _interopRequireDefault(_childrenUniKey); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _initDefineProp(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object['ke' + 'ys'](descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object['define' + 'Property'](target, property, desc); desc = null; } return desc; } function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that transform-class-properties is enabled.'); } var observable = mobx.observable; var Flex = _flexbox2.default.Flex, Block = _flexbox2.default.Block; var Form = (0, _mobxReact.observer)(_class = (_class2 = function (_React$Component) { _inherits(Form, _React$Component); function Form() { var _ref; var _temp, _this, _ret; _classCallCheck(this, Form); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Form.__proto__ || Object.getPrototypeOf(Form)).call.apply(_ref, [this].concat(args))), _this), _initDefineProp(_this, 'fields', _descriptor, _this), _initDefineProp(_this, 'duplexer', _descriptor2, _this), _this.initialModel = null, _temp), _possibleConstructorReturn(_this, _ret); } //如果有prop属性,才push到fields数组中 //只要有duplex属性,就push到此数组中 _createClass(Form, [{ key: 'validate', //缓存下model的初始值,用于resetFields // @observable rules = {}; //存储校验规则 value: function validate() { var _this2 = this; var fieldName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { return 1; }; return new Promise(function (resolve, reject) { //单独校验某一项 if (fieldName && typeof fieldName !== 'function') { var valid = true; _this2.fields.map(function (field) { if (fieldName === field.props.prop) { field.validate('', function (errors) { if (errors) { valid = false; } resolve(valid); fn(valid); }); } }); } else { //校验全部 var _valid = true; var count = 0; if (_this2.fields.length > 0) { _this2.fields.map(function (field) { field.validate('', function (errors) { if (errors) { _valid = false; } if (++count === _this2.fields.length) { resolve(_valid); fn(_valid); } }); }); } else { resolve(_valid); fn(_valid); } } }); } }, { key: 'resetFieldsStyle', value: function resetFieldsStyle() { this.fields.map(function (field) { field.resetField(); }); } }, { key: 'resetFields', value: function resetFields() { Object.assign(this.props.model, this.initialModel); } // componentWillReceiveProps(nextProps){ // // fix mobx warning // // MobX Provider: Provided store 'rules' has changed. Please avoid replacing stores as the change might not propagate to all children // if(this.rules !== nextProps.rules){ // this.rules = nextProps.rules; // } // } }, { key: 'componentDidMount', value: function componentDidMount() { // if (this.rules !== this.props.rules) { // this.rules = this.props.rules; // } this.initialModel = _lodash2.default.merge({}, mobx.toJS(this.props.model)); } }, { key: 'render', value: function render() { /** * actionPosition定位Action的位置 * right-flex-start * right-flex-end * right-center * bottom-flex-start * bottom-flex-end * bottom-center */ var _props = this.props, children = _props.children, layout = _props.layout, fillCount = _props.fillCount, inline = _props.inline, labelWidth = _props.labelWidth, labelPosition = _props.labelPosition, manualLayout = _props.manualLayout, actionPosition = _props.actionPosition, needCls = _props.needCls, labelStyle = _props.labelStyle, style = _props.style, remain = _objectWithoutProperties(_props, ['children', 'layout', 'fillCount', 'inline', 'labelWidth', 'labelPosition', 'manualLayout', 'actionPosition', 'needCls', 'labelStyle', 'style']); var actionPositionArr = actionPosition.split(':'); var mainActionPosition = actionPositionArr[0] || 'right'; var justifyActionPosition = actionPositionArr[1] || 'flex-start'; var alignActionPosition = actionPositionArr[2] || 'flex-end'; /** * manual: * false - 使用Form内部提供的布局,能满足绝大多数需求 * true - 不使用Form内部提供的布局,需要自己布局 */ var formItems = [], actions = [], formItem = []; var formItemTotal = 0, formItemCount = 0, formTotalCount = 0; if (!manualLayout) { _react2.default.Children.map(children, function (item, i) { if (item && item.type && item.type.name) { if (item.type.name === 'FormItem' || item.type.wrappedComponent && item.type.wrappedComponent.name === 'FormItem') { formItemTotal++; } } }); //对children内容进行重新布局,这就引起了unique key prop的warning,可使用childrenUniKey解决 _react2.default.Children.map(children, function (item, i) { if (item && item.type && item.type.name) { if (item.type.name === 'Action' || item.type.wrappedComponent && item.type.wrappedComponent.name === 'Action') { actions.push(item); } else if (item.type.name === 'FormItem' || item.type.wrappedComponent && item.type.wrappedComponent.name === 'FormItem') { formItemCount++; formTotalCount++; formItem.push(item); //将formItem进行分组,不够一组用空的FormItem进行补齐 if (fillCount === formItemCount) { formItems.push(_lodash2.default.merge([], formItem)); formItemCount = 0; formItem = []; } else if (formTotalCount === formItemTotal) { var nurse = fillCount - formItemCount; while (nurse-- > 0) { formItem.push(_react2.default.createElement(_item2.default, null)); } formItems.push(formItem); } } else { console.error('Collect\u4E2D\u51FA\u73B0\u4E86\u975EformItems,Action,FormItem\u7684\u63A7\u4EF6\uFF1A' + item.type.name); } } }); } var layoutArr = layout.split(':'); var SearchComponentLayout = layoutArr[0] && (layoutArr[0] === 'flex' || layoutArr[0] === '') || layoutArr[0] === void 0 ? Flex : Block; var ActionComponentLayout = layoutArr[1] && (layoutArr[1] === 'block' || layoutArr[1] === '') || layoutArr[1] === void 0 ? Block : Flex; var ItemComponentLayout = layoutArr[2] && (layoutArr[2] === 'block' || layoutArr[2] === '') || layoutArr[2] === void 0 ? Block : Flex; // inline && (SearchComponentLayout = Flex); var formCls = needCls ? 'i-form' : ''; var addons = {}; if (!remain.rules) { //如果用户没有传入rules属性,需要确保此属性出现在Provider上 addons.rules = {}; } return _react2.default.createElement( _mobxReact.Provider, _extends({ fields: this.fields, duplexer: this.duplexer, rules: this.props.rules, ItemComponentLayout: ItemComponentLayout, getDuplexFromElement: function getDuplexFromElement() { return 1; }, type: 'block', labelWidth: labelWidth, labelStyle: labelStyle }, remain, addons, { labelPosition: labelPosition }), manualLayout ? _react2.default.createElement( 'div', { className: formCls, style: style }, children ) : inline ? _react2.default.createElement( _flexbox2.default, { className: formCls, style: style }, (0, _childrenUniKey2.default)(formItems) ) : _react2.default.createElement( 'div', null, _react2.default.createElement( _flexbox2.default, { className: formCls, style: style, alignItems: mainActionPosition === 'right' ? alignActionPosition : 'flex-start' }, _react2.default.createElement( SearchComponentLayout, null, formItems.map(function (formItemWrap, i) { //flex的时候,需要确保i-form-item-wrap元素是个Blcok,这个FormItem中flex才能生效 return layout[2] === 'flex' ? _react2.default.createElement( Block, { key: 'form-item-wrap-' + i, className: 'i-form-item-wrap' }, (0, _childrenUniKey2.default)(formItemWrap) ) : _react2.default.createElement( _flexbox2.default, { key: 'form-item-wrap-' + i, className: 'i-form-item-wrap' }, (0, _childrenUniKey2.default)(formItemWrap) ); }) ), mainActionPosition === 'right' ? _react2.default.createElement( ActionComponentLayout, { style: { display: 'flex', alignItems: alignActionPosition, justifyContent: justifyActionPosition } }, actions ) : null ), mainActionPosition === 'bottom' ? _react2.default.createElement( _flexbox2.default, { justifyContent: justifyActionPosition, alignItems: alignActionPosition, className: 'i-form-action' }, actions ) : null ) ); } }]); return Form; }(_react2.default.Component), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, 'fields', [observable], { enumerable: true, initializer: function initializer() { return []; } }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, 'duplexer', [observable], { enumerable: true, initializer: function initializer() { return []; } }), _applyDecoratedDescriptor(_class2.prototype, 'validate', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'validate'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, 'resetFieldsStyle', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'resetFieldsStyle'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, 'resetFields', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'resetFields'), _class2.prototype)), _class2)) || _class; exports.default = Form; Form.FormItem = _item2.default; Form.Action = _action2.default; (0, _setProps2.default)(Form, { validateOnChange: [function (e) { return 1; }, _propTypes2.default.func], validateOnBlur: [function (e) { return 1; }, _propTypes2.default.func], inline: [false, _propTypes2.default.bool], layout: ['flex:block:block', _propTypes2.default.string], actionPosition: ['right:flex-start:flex-end', _propTypes2.default.string], labelPosition: ['right:center', _propTypes2.default.string], labelStyle: [null, _propTypes2.default.object], fillCount: [1, _propTypes2.default.number], manualLayout: [false, _propTypes2.default.bool], labelWidth: [0, _propTypes2.default.number], //labelWidth为0时,会将0替换为‘auto’ needCls: [true, _propTypes2.default.bool] });