UNPKG

hc-materials

Version:

基于react的通用组件库

343 lines (290 loc) 9.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Validator = void 0; var _asyncValidator = _interopRequireDefault(require("async-validator")); var _hoistNonReactStatics = _interopRequireDefault(require("hoist-non-react-statics")); var _antd = require("antd"); var _defer = require("../../core/defer"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _extends() { _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; }; return _extends.apply(this, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * + async-validator@1.6.6 * > see: https://github.com/yiminghe/async-validator */ var Validator = /*#__PURE__*/ function () { function Validator(props, validateRules) { _classCallCheck(this, Validator); for (var key in validateRules) { validateRules[key] = this.pack(validateRules[key]); } this._validateRules = validateRules || {}; this._handleSubmit = function (errors, values) { if (errors) { return false; } else { return values; } }; this._submitting = false; this._validating = false; } _createClass(Validator, [{ key: "isSubmitting", value: function isSubmitting() { return this._submitting; } }, { key: "isValidating", value: function isValidating() { return this._validating; } }, { key: "pack", value: function pack(rule) { if (Array.isArray(rule)) { rule = rule.map(function (item) { if (typeof item.pattern === 'string') { item.pattern = Validator.templates.pattern[item.pattern]; } return item; }); } else { if (typeof rule.pattern === 'string') { rule.pattern = Validator.templates.pattern[rule.pattern]; } } return rule; } }, { key: "setForm", value: function setForm(form, validateRules, submitCallback) { this._form = form; if (submitCallback) { this._handleSubmit = submitCallback; if (validateRules) { for (var key in validateRules) { validateRules[key] = this.pack(validateRules[key]); } this._validateRules = validateRules; } } else if (validateRules) { this._handleSubmit = validateRules; } } }, { key: "reset", value: function reset() { this._form.resetFields(); } }, { key: "getProps", value: function getProps(fieldName, rule) { if (this._validateRules[fieldName]) { return assignDeep(this._validateRules[fieldName], rule && this.pack(rule)); } else { return rule && this.pack(rule); } } // #! for antd-form }, { key: "getFieldProps", value: function getFieldProps(fieldName, option) { if (!option.rules && option.rule) { option.rules = [option.rule]; } if (this._validateRules[fieldName]) { // option.rules = assignDeep([].concat(this._validateRules[fieldName]), // option.rules && this.pack(option.rules) || []); option.rules = [].concat(this._validateRules[fieldName], option.rules && this.pack(option.rules) || []); } else if (option.rules) { option.rules = this.pack(option.rules); } return this._form.getFieldProps(fieldName, option); } }, { key: "getFieldDecorator", value: function getFieldDecorator(fieldName, option) { if (!option.rules && option.rule) { option.rules = [option.rule]; } if (this._validateRules[fieldName]) { // option.rules = assignDeep([].concat(this._validateRules[fieldName]), // option.rules && this.pack(option.rules) || []); option.rules = [].concat(this._validateRules[fieldName], option.rules && this.pack(option.rules) || []); } else if (option.rules) { option.rules = this.pack(option.rules); } return this._form.getFieldDecorator(fieldName, option); } }, { key: "_validate", value: function _validate(opt) { var _this = this; var defer = new _defer.Deferred(); this._validating = true; this._form.setFields(); opt.preCallback && opt.preCallback(); var callback = function callback(errors, values) { _this._validating = false; var postCallback = function postCallback() { opt.postCallback && opt.postCallback(); _this._form.setFields(); }; if (errors) { if (opt.catchError) { opt.catchError(errors); } else { _antd.message.error('表单校验失败'); } postCallback(); return defer.reject(false); } var result = opt.callback && opt.callback(errors, values); if (result && result.then) { result.then(defer.resolve, defer.reject); } else if (result === false) { defer.reject(false); } else { defer.resolve(result); } defer.promise.then(postCallback, postCallback); }; if (opt.source) { new _asyncValidator["default"](this._validateRules).validate(opt.source, callback); } else { this._form[opt.method](callback); } return defer.promise; } }, { key: "validateFields", value: function validateFields(callback, catchError) { return this._validate({ method: 'validateFields', callback: callback, catchError: catchError }); } }, { key: "validateFieldsAndScroll", value: function validateFieldsAndScroll(callback, catchError) { return this._validate({ method: 'validateFieldsAndScroll', callback: callback, catchError: catchError }); } }, { key: "validate", value: function validate(source, callback, catchError) { return this._validate({ source: source, callback: callback, catchError: catchError }); } }, { key: "submit", value: function submit(_callback, catchError) { var _this2 = this; return this._validate({ method: 'validateFieldsAndScroll', preCallback: function preCallback() { _this2._submitting = true; }, postCallback: function postCallback() { _this2._submitting = false; }, callback: function callback(errors, values) { values = _this2._handleSubmit(errors, values); if (values === false) { return false; } else { return _callback(values); } }, catchError: catchError }); } }]); return Validator; }(); exports.Validator = Validator; Validator.enhanceForm = function (option) { return function (BaseComponent) { var Component = _antd.Form.create(_extends(option || {}, { withRef: true }))(BaseComponent); Component.prototype.getRealInstance = function () { return this.refs.wrappedComponent.refs.formWrappedComponent; }; return (0, _hoistNonReactStatics["default"])(Component, BaseComponent); }; }; Validator.validate = function (rules, source, callback) { var descriptor = {}; for (var key in rules) { if (typeof rules[key] === 'boolean') { descriptor[key] = { type: 'string', required: rules[key] }; } else { descriptor[key] = rules[key]; } } var validator = new _asyncValidator["default"](descriptor); validator.validate(source, callback); }; /* eslint-disable camelcase */ Validator.templates = { pattern: { // #! 中英字母数字下划线 legal: /^[A-Za-z0-9_\u4e00-\u9fa5]*$/, // #! 必须是字母数字、下划线、中划线以及 light_legal: /^[A-Za-z0-9._-]*$/, // #! 以字母开头,不能包含中文或特殊字符 light_light_legal: /^[a-zA-Z]\w*$/, // #! 中英字母数字下划线 dark_legal: /^[A-Za-z0-9_\u4e00-\u9fa5]*$/, // #! 必须是中英字母数字下划线以及. dark_dark_legal: /^[A-Za-z0-9._\u4e00-\u9fa5]*$/ } }; /** * + 校验规则 * ``` * fieldRules = [{ * [fieldName]: { * type: ['string', 'number', 'boolean', 'method', 'regexp', 'integer', 'float', 'array', 'object', 'enum', 'date', 'url', 'hex', 'email'], * required, * pattern, * whitespace, * transform, * message, * validator, * [range(min, max): 'string' | 'array' | 'integer'], * [length: 'string' | 'array'] * [enum: 'enum'], * [fields: 'deep rules'], * [defaultField: 'array' | 'object'] * } * },...] * ``` */ Validator.$inject = ['props', 'validateRules']; function assignDeep(obj, newObj) { if (Array.isArray(obj)) { return obj.map(function (item, index) { return assignDeep(item, newObj[index]); }); } else { return _extends(obj, newObj); } }