@ice/form
Version:
460 lines (401 loc) • 13.9 kB
JavaScript
"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;