UNPKG

@ice/form

Version:
460 lines (401 loc) 13.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread8 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _asyncValidator = _interopRequireDefault(require("async-validator")); var _lodash = _interopRequireDefault(require("lodash.isequal")); var FormCore = /*#__PURE__*/ function () { function FormCore(_ref) { var _ref$initialValues = _ref.initialValues, initialValues = _ref$initialValues === void 0 ? {} : _ref$initialValues, _ref$rules = _ref.rules, rules = _ref$rules === void 0 ? {} : _ref$rules, _ref$effects = _ref.effects, effects = _ref$effects === void 0 ? [] : _ref$effects, onSubmit = _ref.onSubmit, onChange = _ref.onChange; (0, _classCallCheck2.default)(this, FormCore); this.onSubmit = onSubmit; this.onChange = onChange; this.initialValues = (0, _objectSpread8.default)({}, initialValues); this.values = (0, _objectSpread8.default)({}, this.initialValues); this.errors = {}; this.props = {}; this.rules = (0, _objectSpread8.default)({}, rules); this.effects = (0, _toConsumableArray2.default)(effects); this.listeners = []; this.validators = {}; this.renderField = null; this.layout = {}; } (0, _createClass2.default)(FormCore, [{ key: "setConfig", value: function setConfig(prop, value) { this[prop] = value; if (prop === 'rules') { this.validators = {}; } } }, { key: "getRenderField", value: function getRenderField() { return this.renderField; } }, { key: "getLayout", value: function getLayout() { return this.layout; } }, { key: "addRules", value: function addRules(name, rules) { if (!this.rules[name]) { this.rules[name] = Array.isArray(rules) ? rules : [rules]; } else { this.rules[name] = this.rules[name].concat(rules); } } }, { key: "addEffects", value: function addEffects(name, linkage) { if (this.effects.find(function (item) { return item.field === name; })) return; linkage.field = name; this.effects.push(linkage); } }, { key: "getFieldProps", value: function getFieldProps(name) { return this.props[name] || {}; } }, { key: "setFieldProps", value: function setFieldProps(name, prop) { this.props[name] = (0, _objectSpread8.default)({}, this.props[name], {}, prop); this.notify(name); } }, { key: "subscribe", value: function subscribe(listener) { var _this = this; this.listeners.push(listener); return function () { var index = _this.listeners.indexOf(listener); if (index !== -1) _this.listeners.splice(index, 1); }; } }, { key: "notify", value: function notify(name) { this.listeners.forEach(function (listener) { return listener(name); }); } }, { key: "getFieldValue", value: function getFieldValue(name) { return this.values[name]; } }, { key: "getValues", value: function getValues() { return this.values; } }, { key: "setFieldValue", value: function () { var _setFieldValue = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee(name, value, store) { var result, errorIsNotUndefined, effects; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(typeof name === 'string')) { _context.next = 7; break; } this.values[name] = value; this.notify(name); _context.next = 5; return this.validate(name); case 5: result = _context.sent; if (result.status === 'success') { errorIsNotUndefined = this.getFieldError(name); errorIsNotUndefined && this.setFieldError(name, undefined); effects = this.effects.find(function (item) { return item.field === name; }); if (effects && store) { effects.handler(store); } } else { this.setFieldError(name, result.errors[0].message); } case 7: case "end": return _context.stop(); } } }, _callee, this); })); function setFieldValue(_x, _x2, _x3) { return _setFieldValue.apply(this, arguments); } return setFieldValue; }() }, { key: "setValues", value: function () { var _setValues = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee3(values) { var _this2 = this; var runEffects, _args3 = arguments; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: runEffects = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : false; if (!(Object.prototype.toString.call(values) !== '[object Object]')) { _context3.next = 3; break; } throw new Error('values should be an object for setValues(values)'); case 3: _context3.next = 5; return Promise.all(Object.keys(values).map( /*#__PURE__*/ function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee2(key) { return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _this2.setFieldValue(key, values[key]); case 2: case "end": return _context2.stop(); } } }, _callee2); })); return function (_x5) { return _ref2.apply(this, arguments); }; }())); case 5: runEffects && this.runEffects(); case 6: case "end": return _context3.stop(); } } }, _callee3, this); })); function setValues(_x4) { return _setValues.apply(this, arguments); } return setValues; }() }, { key: "runEffects", value: function runEffects() { var _this3 = this; this.effects.forEach(function (effect) { effect.handler(_this3); }); } }, { key: "setFieldValueWithoutNotify", value: function setFieldValueWithoutNotify(name, value) { this.values[name] = value; } }, { key: "getFieldError", value: function getFieldError(name) { return this.errors[name]; } }, { key: "getErrors", value: function getErrors() { return this.errors; } }, { key: "setFieldError", value: function setFieldError(name, errorMsg) { var notify = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; if (typeof name === 'string') { this.errors[name] = errorMsg; notify && this.notify(name); } } }, { key: "setErrors", value: function setErrors(errors) { var _this4 = this; if (Object.prototype.toString.call(errors) !== '[object Object]') { throw new Error('errors should be an object for setErrors(errors)'); } Object.keys(errors).forEach(function (key) { return _this4.setFieldError(key, errors[key]); }); } }, { key: "reset", value: function reset(initialValues) { if (initialValues) { this.initialValues = (0, _objectSpread8.default)({}, initialValues); } this.values = (0, _objectSpread8.default)({}, this.initialValues); this.errors = {}; this.notify('*'); } }, { key: "submit", value: function () { var _submit = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee4(event) { var _this5 = this; var result, hasAnyValidatingError, hasAnySettingError; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (event) { // sometimes not true, e.g. React Native if (typeof event.preventDefault === 'function') { event.preventDefault(); } if (typeof event.stopPropagation === 'function') { // prevent any outer forms from receiving the event too event.stopPropagation(); } } _context4.next = 3; return this.validate(); case 3: result = _context4.sent; // 校验值导致的 error hasAnyValidatingError = result.some(function (item) { return item.status !== 'success'; }); // setFieldError(),sometimes not included in validatingError hasAnySettingError = Object.keys(this.errors).some(function (field) { var error = _this5.errors[field]; return !!error; }); if (!hasAnyValidatingError && !hasAnySettingError) { this.onSubmit(this.getValues()); } else { result.forEach(function (res) { if (res.status === 'fail') { var field = res.errors[0].field; var errMsg = res.errors[0].message; _this5.setFieldError(field, errMsg); } }); } case 7: case "end": return _context4.stop(); } } }, _callee4, this); })); function submit(_x6) { return _submit.apply(this, arguments); } return submit; }() }, { key: "validate", value: function validate(name) { var _this6 = this; if (!name) { return Promise.all(Object.keys(this.rules).map( /*#__PURE__*/ function () { var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee5(field) { var res; return _regenerator.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return _this6.validate(field); case 2: res = _context5.sent; return _context5.abrupt("return", res); case 4: case "end": return _context5.stop(); } } }, _callee5); })); return function (_x7) { return _ref3.apply(this, arguments); }; }())); } // 不存在的 Field 不做检验,同时删除对应 field 的 error 信息 if (this.props[name] && !this.props[name].visible) { this.setFieldError(name, undefined); return new Promise(function (resolve) { return resolve({ status: 'success' }); }); } // 没有 rules 的不需校验 if (!this.rules[name]) return new Promise(function (resolve) { return resolve({ status: 'success' }); }); if (!this.validators[name]) { var descriptor = (0, _defineProperty2.default)({}, name, this.rules[name]); var validator = new _asyncValidator.default(descriptor); this.validators[name] = validator; } var value = this.getFieldValue(name); return this.validators[name].validate((0, _defineProperty2.default)({}, name, value), function () {}).then(function () { return { status: 'success' }; }).catch(function (_ref4) { var errors = _ref4.errors; return { status: 'fail', errors: errors }; }); } }, { key: "pristine", get: function get() { return (0, _lodash.default)(this.initialValues, this.values); } }]); return FormCore; }(); exports.default = FormCore;