UNPKG

q-antd

Version:

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

375 lines (309 loc) 14.6 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 _dec, _class, _desc, _value, _class2, _descriptor, _descriptor2, _descriptor3, _descriptor4, _descriptor5; var _antd = require('antd'); var _react = require('react'); var React = _interopRequireWildcard(_react); var _mobx = require('mobx'); var mobx = _interopRequireWildcard(_mobx); var _mobxReact = require('mobx-react'); var _asyncValidator = require('async-validator'); var _asyncValidator2 = _interopRequireDefault(_asyncValidator); var _coreDecorators = require('core-decorators'); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _flexbox = require('../../flexbox'); var _flexbox2 = _interopRequireDefault(_flexbox); var _text = require('../../text'); var _text2 = _interopRequireDefault(_text); var _view = require('../../view'); var _view2 = _interopRequireDefault(_view); var _setProps = require('set-props'); var _setProps2 = _interopRequireDefault(_setProps); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 _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, action = mobx.action, toJS = mobx.toJS; var Flex = _flexbox2.default.Flex, Block = _flexbox2.default.Block; var IconStyle = { transform: 'scale(0.85)' }; /** * fields: 用来存储一个Provider中的所有字段 * model: 用来存储一个Provider中的所有字段的值 * rules: 用来存储一个Provider中的所有字段的规则 * type: type是用来表示Term的type的,和校验规则无关 */ var FormItem = (_dec = (0, _mobxReact.inject)('fields', 'model', 'rules', 'labelStyle', 'ItemComponentLayout', 'labelWidth', 'labelPosition'), _dec(_class = (0, _mobxReact.observer)(_class = (_class2 = function (_React$Component) { _inherits(FormItem, _React$Component); function FormItem() { var _ref; var _temp, _this, _ret; _classCallCheck(this, FormItem); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = FormItem.__proto__ || Object.getPrototypeOf(FormItem)).call.apply(_ref, [this].concat(args))), _this), _initDefineProp(_this, 'validateState', _descriptor, _this), _initDefineProp(_this, 'validateMessage', _descriptor2, _this), _initDefineProp(_this, 'isRequired', _descriptor3, _this), _initDefineProp(_this, 'trigger', _descriptor4, _this), _initDefineProp(_this, 'formDuplex', _descriptor5, _this), _temp), _possibleConstructorReturn(_this, _ret); } _createClass(FormItem, [{ key: 'validateOnChange', //调用getDuplexFromElement,从表单元素中获取duplex属性 value: function validateOnChange() { this.validate('change'); } }, { key: 'validateOnBlur', value: function validateOnBlur() { this.validate('blur'); } }, { key: 'getDuplexFromElement', value: function getDuplexFromElement(duplex) { this.formDuplex = duplex; } }, { key: 'validate', value: function validate(trigger) { var _this2 = this; var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { return 1; }; var _props = this.props, rules = _props.rules, prop = _props.prop, model = _props.model; console.log('item validate'); if (prop === void 0 || rules === void 0) { return; } // debugger //从rules根据prop中获取对应的校验规则,并根据trigger进行过滤 var pureRules = toJS(rules[prop]) || []; var theRules = trigger ? pureRules.filter(function (rule) { // debugger //如果有trigger配置参数,提取对应的trigger规则,否则返回false,那么theRule就是空数组,就不进行校验 if (rule.trigger) { if (Array.isArray(rule.trigger)) { return rule.trigger.includes(trigger); } else { return rule.trigger === trigger ? true : false; } } else { return false; } }) : pureRules; if (!theRules || theRules.length === 0) { fn(); return true; } this.validateState = 'validating'; var descriptor = {}; var theModel = {}; // debugger //如果formDuplex是数组,说明是循环的,需要特殊处理 if (Array.isArray(toJS(this.formDuplex))) { var uuid = this.formDuplex[1]; descriptor[uuid] = theRules; theModel[uuid] = toJS(model[this.formDuplex[0]][this.formDuplex[1]]); } else { theModel[prop] = toJS(model[this.formDuplex]); descriptor[prop] = theRules; } var validator = new _asyncValidator2.default(descriptor); validator.validate(theModel, { firstFields: true }, function (errors) { _this2.validateState = !errors ? 'success' : 'error'; _this2.validateMessage = errors ? errors[0].message : ''; fn(_this2.validateMessage); }); this.validateDisabled = false; } }, { key: 'resetField', value: function resetField() { this.validateState = 'validating'; } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.props.fields.splice(this.props.fields.indexOf(this), 1); } }, { key: 'componentDidMount', value: function componentDidMount() { var _props2 = this.props, prop = _props2.prop, rules = _props2.rules; //如果有prop属性,才push到fields数组中 if (prop !== void 0) { this.props.fields.push(this); } var pureRules = toJS(rules[prop]); this.isRequired = prop !== void 0 && pureRules && Array.isArray(pureRules) ? pureRules.some(function (item) { return !!item.required; }) : false; console.log(this.isRequired, '99999999999'); } }, { key: 'render', value: function render() { var _props3 = this.props, children = _props3.children, labelSpan = _props3.labelSpan, align = _props3.align, label = _props3.label, fields = _props3.fields, model = _props3.model, prop = _props3.prop, labelStyle = _props3.labelStyle, noLabel = _props3.noLabel, ItemComponentLayout = _props3.ItemComponentLayout, labelWidth = _props3.labelWidth, labelPosition = _props3.labelPosition, style = _props3.style, requiredFlag = _props3.requiredFlag, remain = _objectWithoutProperties(_props3, ['children', 'labelSpan', 'align', 'label', 'fields', 'model', 'prop', 'labelStyle', 'noLabel', 'ItemComponentLayout', 'labelWidth', 'labelPosition', 'style', 'requiredFlag']); /** * labelPosition * * right - flex-start * flex-end * center * left - flex-start * flex-end * center * center - flex-start * flex-end * center */ var labelPositionArr = labelPosition.split(':'); var mainLabelPosition = labelPositionArr[0] || 'right'; var viceLabelPosition = labelPositionArr[1] || 'center'; var alignLabelPosition = labelPositionArr[2] || 'right'; return React.createElement( _mobxReact.Provider, { validateOnChange: this.validateOnChange, getDuplexFromElement: this.getDuplexFromElement, validateOnBlur: this.validateOnBlur }, React.createElement( _flexbox2.default, _extends({}, remain, { flexDirection: mainLabelPosition === 'top' ? 'column' : 'row', alignItems: viceLabelPosition }), React.createElement( _flexbox2.default, null, React.createElement( 'label', { className: (label && 'i-form-label') + ' ' + (this.isRequired && requiredFlag && 'ant-form-item-required') + ' ' + (labelPosition === 'top' && 'i-form-label-top'), style: _extends({}, labelStyle, { width: labelWidth > 0 ? labelWidth : 'auto', textAlign: alignLabelPosition }), title: label, htmlFor: prop }, label ) ), React.createElement( ItemComponentLayout, { className: 'i-form-item' }, React.createElement( 'div', { className: 'i-form-item ' + (this.validateState === 'error' ? 'has-error' : '') }, children, this.validateState === 'error' && React.createElement( 'div', { className: 'ant-form-explain' }, React.createElement( _text2.default, { size: 'small', type: 'error' }, React.createElement(_antd.Icon, { style: IconStyle, type: 'exclamation-circle-o' }), this.validateMessage ) ) ) ) ) ); } }]); return FormItem; }(React.Component), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, 'validateState', [observable], { enumerable: true, initializer: function initializer() { return ''; } }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, 'validateMessage', [observable], { enumerable: true, initializer: function initializer() { return ''; } }), _descriptor3 = _applyDecoratedDescriptor(_class2.prototype, 'isRequired', [observable], { enumerable: true, initializer: function initializer() { return false; } }), _descriptor4 = _applyDecoratedDescriptor(_class2.prototype, 'trigger', [observable], { enumerable: true, initializer: function initializer() { return 'onChange'; } }), _descriptor5 = _applyDecoratedDescriptor(_class2.prototype, 'formDuplex', [observable], { enumerable: true, initializer: function initializer() { return ''; } }), _applyDecoratedDescriptor(_class2.prototype, 'validateOnChange', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'validateOnChange'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, 'validateOnBlur', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'validateOnBlur'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, 'getDuplexFromElement', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'getDuplexFromElement'), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, 'validate', [_coreDecorators.autobind], Object.getOwnPropertyDescriptor(_class2.prototype, 'validate'), _class2.prototype)), _class2)) || _class) || _class); exports.default = FormItem; (0, _setProps2.default)(FormItem, { requiredFlag: [true, _propTypes2.default.bool] });