UNPKG

vantui-edit

Version:

一套适用于Taro3及React的vantui组件库

459 lines (396 loc) 14.2 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 _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _reactDom = require("react-dom"); /* eslint-disable @typescript-eslint/ban-ts-comment */ /* 对外接口 */ var formInstanceApi = ['setCallback', 'dispatch', 'registerValidateFields', 'resetFields', 'setFields', 'setFieldsValue', 'getFieldsValue', 'getFieldValue', 'validateFields', 'submit', 'unRegisterValidate', 'registerRequiredMessageCallback', 'validateFieldValue', 'setErrorMessage']; var isReg = function isReg(value) { return value instanceof RegExp; }; var FormStore = /*#__PURE__*/function () { function FormStore(forceUpdate, defaultFormValue) { (0, _classCallCheck2.default)(this, FormStore); this.FormUpdate = forceUpdate; this.model = {}; this.control = {}; this.isSchedule = false; this.callback = {}; this.penddingValidateQueue = []; this.defaultFormValue = defaultFormValue || {}; this.requiredMessageCallback = undefined; this.multiLevelKeys = []; } (0, _createClass2.default)(FormStore, [{ key: "getForm", value: function getForm() { var _this = this; return formInstanceApi.reduce(function (map, item) { map[item] = _this[item].bind(_this); return map; }, {}); } }, { key: "registerRequiredMessageCallback", value: function registerRequiredMessageCallback(callback) { this.requiredMessageCallback = callback; } }, { key: "setCallback", value: function setCallback(callback) { if (callback) this.callback = callback; } }, { key: "setErrorMessage", value: function setErrorMessage(name_, message) { var name = Array.isArray(name_) ? name_.join('.') : name_; if (this.model[name]) { this.model[name].message = message; this.model[name].status = 'reject'; this.FormUpdate(); } else { console.error('form warning: setErrorMessage params.name is not register'); } } }, { key: "dispatch", value: function dispatch(action) { if (!action && (0, _typeof2.default)(action) !== 'object') return null; var type = action.type; for (var _len = arguments.length, arg = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { arg[_key - 1] = arguments[_key]; } if (~formInstanceApi.indexOf(type)) { // @ts-ignore return this[type].apply(this, arg); } else if (typeof this[type] === 'function') { // @ts-ignore return this[type].apply(this, arg); } } }, { key: "registerValidateFields", value: function registerValidateFields(name_, control, model) { var name = Array.isArray(name_) ? name_.join('.') : name_; if (this.defaultFormValue[name]) { if (!this.model[name] || this.model[name].value === undefined) { model['value'] = this.defaultFormValue[name]; } } if (!model['value'] && this.model[name]) model['value'] = this.model[name].value; if (model['mutiLevel']) { if (!this.multiLevelKeys.includes(name)) { this.multiLevelKeys.push(name); } } if (!model['mutiLevel']) { var keyIndex = this.multiLevelKeys.indexOf(name); if (keyIndex > 0) { this.multiLevelKeys.splice(keyIndex, 1); } } var validate = FormStore.createValidate(model); this.model[name] = validate; this.control[name] = control; } }, { key: "unRegisterValidate", value: function unRegisterValidate(name_) { var name = Array.isArray(name_) ? name_.join('.') : name_; delete this.model[name]; delete this.control[name]; } }, { key: "notifyChange", value: function notifyChange(name_, hiddenFormChange) { var name = Array.isArray(name_) ? name_.join('.') : name_; var controller = this.control[name]; if (controller) controller === null || controller === void 0 ? void 0 : controller.changeValue(); if (!hiddenFormChange) { var onChange = this.callback.onChange; if (onChange) { var value = this.model[name].value; onChange(FormStore.transformMultilevelData((0, _defineProperty2.default)({}, name, value)), this.getFieldsValue()); } } } }, { key: "setFields", value: function setFields(object) { if ((0, _typeof2.default)(object) !== 'object') return; this.transformSingellevelData(object, this.multiLevelKeys); for (var key in this.model) { var item = this.model[key]; this.setValueClearStatus(item, key, item.value, true); // 批量更新hiddenFormChange } var onChange = this.callback.onChange; if (onChange) { onChange(object, this.getFieldsValue()); } } }, { key: "setFieldsValue", value: function setFieldsValue(name_, modelValue) { var name = Array.isArray(name_) ? name_.join('.') : name_; var model = this.model[name]; if (!model) return false; if (toString.call(modelValue) === '[Object, object]' && modelValue.value) { var message = modelValue.message, rule = modelValue.rule, value = modelValue.value; if (message) model.message = message; if (rule) model.rule = rule; if (value && model.value === undefined) model.value = value; model.status = 'pendding'; this.validateFieldValue(name, true); } else { this.setValueClearStatus(model, name, modelValue); } } }, { key: "setValueClearStatus", value: function setValueClearStatus(model, name_, value, hiddenFormChange) { var name = Array.isArray(name_) ? name_.join('.') : name_; model['value'] = value; model['status'] = 'pendding'; this.notifyChange(name, hiddenFormChange); } // 扁平数据转多层数据结构 }, { key: "transformSingellevelData", value: // 多层级数据结构扁平化 function transformSingellevelData(data, multiLevelKeys) { // eslint-disable-next-line @typescript-eslint/no-this-alias var that = this; function unitWork(curKey, dd) { if (toString.call(dd) === '[object Object]') { if (multiLevelKeys.includes(curKey)) { that.model[curKey].value = dd; } else { for (var key in dd) { var value = dd[key]; unitWork(curKey ? "".concat(curKey, ".").concat(key) : key, value); } } } else if (toString.call(dd) === '[object Array]') { if (multiLevelKeys.includes(curKey)) { that.model[curKey].value = dd; } else { for (var i = 0; i < dd.length; i++) { var _value = dd[i]; unitWork(curKey ? "".concat(curKey, ".").concat(i) : "".concat(i), _value); } } } else { if (that.model[curKey]) { that.model[curKey].value = dd; } } } unitWork('', data); } }, { key: "getFieldsValue", value: function getFieldsValue() { var _this2 = this; var formData = {}; Object.keys(this.model).forEach(function (modelName) { formData[modelName] = _this2.model[modelName].value; }); return FormStore.transformMultilevelData(formData); } }, { key: "resetFields", value: function resetFields() { var _this3 = this; Object.keys(this.model).forEach(function (modelName) { _this3.setValueClearStatus(_this3.model[modelName], modelName, null); }); } }, { key: "getFieldModel", value: function getFieldModel(name_) { var name = Array.isArray(name_) ? name_.join('.') : name_; var model = this.model[name]; return model ? model : {}; } }, { key: "getFieldValue", value: function getFieldValue(name_) { var name = Array.isArray(name_) ? name_.join('.') : name_; var model = this.model[name]; if (!model && this.defaultFormValue[name]) return this.defaultFormValue[name]; return model ? model.value : null; } }, { key: "validateFieldValue", value: function validateFieldValue(name_) { var _this4 = this; var forceUpdate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var name = Array.isArray(name_) ? name_.join('.') : name_; var model = this.model[name]; /* 记录上次状态 */ var lastStatus = model.status; if (!model) return null; var required = model.required, rules = model.rules, value = model.value; var status = 'resolve'; if (required && FormStore.isFieldNull(value)) { status = 'reject'; if (this.requiredMessageCallback) { this.model[name].message = this.requiredMessageCallback(this.model[name].label); } else { this.model[name].message = this.model[name].label + '不能为空'; } } for (var i = 0; i < rules.length; i++) { var rule = rules[i].rule; var message = rules[i].message; if (value || value === 0) { if (isReg(rule)) { status = rule.test(value) ? 'resolve' : 'reject'; if (status === 'reject') { this.model[name].message = message; break; } } else if (typeof rule === 'function') { rule(value, function (message) { _this4.model[name].message = message; status = !message ? 'resolve' : 'reject'; }); if (status === 'reject') { break; } } } } model.status = status; if (lastStatus !== status || forceUpdate) { // 校验的时候不触发form change var notify = this.notifyChange.bind(this, name, true); this.penddingValidateQueue.push(notify); } this.scheduleValidate(); return status; } }, { key: "scheduleValidate", value: function scheduleValidate() { var _this5 = this; if (this.isSchedule) return; this.isSchedule = true; Promise.resolve().then(function () { (0, _reactDom.unstable_batchedUpdates)(function () { do { var notify = _this5.penddingValidateQueue.shift(); notify && notify(); } while (_this5.penddingValidateQueue.length > 0); _this5.isSchedule = false; }); }); } }, { key: "validateFields", value: function validateFields(callback) { var _this6 = this; // 暂时异步解决更新迟缓问题 setTimeout(function () { var errorsMess = []; Object.keys(_this6.model).forEach(function (modelName) { var modelStates = _this6.validateFieldValue(modelName, true); if (modelStates === 'reject') errorsMess.push(_this6.model[modelName].message); }); callback(errorsMess, _this6.getFieldsValue()); }); } }, { key: "submit", value: function submit(cb) { var _this7 = this; this.validateFields(function (errorMess) { var _this7$callback = _this7.callback, onFinish = _this7$callback.onFinish, onFinishFailed = _this7$callback.onFinishFailed; var fieldValues = _this7.getFieldsValue(); var errs = errorMess.length ? errorMess : null; cb && cb(errs, fieldValues); if (errs) { onFinishFailed && typeof onFinishFailed === 'function' && onFinishFailed(errs); return; } onFinish && typeof onFinish === 'function' && onFinish(errs, _this7.getFieldsValue()); }); } }], [{ key: "createValidate", value: function createValidate(validateModal) { var value = validateModal.value, required = validateModal.required, rules = validateModal.rules, label = validateModal.label; return { value: value, rules: Array.isArray(rules) ? rules : [rules], required: required || false, status: 'pendding', label: label }; } }, { key: "isFieldNull", value: function isFieldNull(value) { return value === undefined || value === '' || value === null || Array.isArray(value) && value.length === 0; } }, { key: "transformMultilevelData", value: function transformMultilevelData(data) { var keys = Object.keys(data); var hasMultiLevel = keys.some(function (item) { return item.includes('.'); }); if (hasMultiLevel) { var res = {}; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key) { if (!(key !== null && key !== void 0 && key.includes('.'))) { res[key] = data[key]; } else { var ks = key.split('.'); var p = res; for (var j = 0; j < ks.length; j++) { var k = ks[j]; if (p[k] && j !== ks.length - 1) { p = p[k]; } else if (!p[k] && j !== ks.length - 1) { var nextK = ks[j + 1]; if (!isNaN(Number(nextK)) && typeof Number(nextK) === 'number') { p[k] = []; } else if (typeof nextK === 'string') { p[k] = {}; } p = p[k]; } else { p[k] = data[key]; } } } } } return res; } else { return data; } } }]); return FormStore; }(); var _default = FormStore; exports.default = _default;