amis
Version:
一种MIS页面生成工具
428 lines (427 loc) • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var mobx_state_tree_1 = require("mobx-state-tree");
var debounce = require("lodash/debounce");
var service_1 = require("./service");
var formItem_1 = require("./formItem");
exports.IFormItemStore = formItem_1.IFormItemStore;
var helper_1 = require("../utils/helper");
var isEqual = require("lodash/isEqual");
var ServerError = /** @class */ (function (_super) {
tslib_1.__extends(ServerError, _super);
function ServerError() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.type = 'ServerError';
return _this;
}
return ServerError;
}(Error));
exports.FormStore = service_1.ServiceStore.named('FormStore')
.props({
inited: false,
validated: false,
submited: false,
submiting: false,
validating: false,
items: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.late(function () { return formItem_1.FormItemStore; })), []),
canAccessSuperData: true,
persistData: false
})
.views(function (self) { return ({
get loading() {
return self.saving || self.fetching;
},
get errors() {
var errors = {};
self.items.forEach(function (item) {
if (!item.valid) {
errors[item.name] = Array.isArray(errors[item.name])
? errors[item.name].concat(item.errors)
: item.errors.concat();
}
});
return errors;
},
getValueByName: function (name) {
return helper_1.getVariable(self.data, name, self.canAccessSuperData);
},
getPristineValueByName: function (name) {
return helper_1.getVariable(self.pristine, name);
},
getItemById: function (id) {
return self.items.find(function (item) { return item.id === id; });
},
getItemByName: function (name) {
return self.items.find(function (item) { return item.name === name; });
},
getItemsByName: function (name) {
return self.items.filter(function (item) { return item.name === name; });
},
get valid() {
return self.items.every(function (item) { return item.valid; });
},
get isPristine() {
return isEqual(self.pristine, self.data);
}
}); })
.actions(function (self) {
function setValues(values, tag) {
self.updateData(values, tag);
// 同步 options
syncOptions();
}
function setValueByName(name, value, isPristine, force) {
if (isPristine === void 0) { isPristine = false; }
if (force === void 0) { force = false; }
// 没有变化就不跑了。
var origin = helper_1.getVariable(self.data, name, false);
var prev = self.data;
var data = helper_1.cloneObject(self.data);
if (value !== origin) {
if (prev.__prev) {
// 基于之前的 __prev 改
var prevData = helper_1.cloneObject(prev.__prev);
helper_1.setVariable(prevData, name, origin);
Object.defineProperty(data, '__prev', {
value: prevData,
enumerable: false,
configurable: false,
writable: false
});
}
else {
Object.defineProperty(data, '__prev', {
value: tslib_1.__assign({}, prev),
enumerable: false,
configurable: false,
writable: false
});
}
}
else if (!force) {
return;
}
helper_1.setVariable(data, name, value);
if (isPristine) {
var pristine = helper_1.cloneObject(self.pristine);
helper_1.setVariable(pristine, name, value);
self.pristine = pristine;
}
if (!data.__pristine) {
Object.defineProperty(data, '__pristine', {
value: self.pristine,
enumerable: false,
configurable: false,
writable: false
});
}
self.data = data;
if (self.persistData) {
setPersistData();
}
// 同步 options
syncOptions();
}
function deleteValueByName(name) {
var prev = self.data;
var data = helper_1.cloneObject(self.data);
if (prev.__prev) {
// 基于之前的 __prev 改
var prevData = helper_1.cloneObject(prev.__prev);
helper_1.setVariable(prevData, name, helper_1.getVariable(prev, name));
Object.defineProperty(data, '__prev', {
value: prevData,
enumerable: false,
configurable: false,
writable: false
});
}
else {
Object.defineProperty(data, '__prev', {
value: tslib_1.__assign({}, prev),
enumerable: false,
configurable: false,
writable: false
});
}
helper_1.deleteVariable(data, name);
self.data = data;
}
function trimValues() {
var data = helper_1.mapObject(self.data, function (item) { return (typeof item === 'string' ? item.trim() : item); });
self.updateData(data);
}
function syncOptions() {
self.items.forEach(function (item) { return item.syncOptions(); });
}
var saveRemote = mobx_state_tree_1.flow(function saveRemote(api, data, options) {
var ret, json, errors_1, ret, e_1;
if (options === void 0) { options = {}; }
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 9, , 10]);
options = tslib_1.__assign({ method: 'post' }, options);
if (!(options && options.beforeSend)) return [3 /*break*/, 3];
ret = options.beforeSend(data);
if (!(ret && ret.then)) return [3 /*break*/, 2];
return [4 /*yield*/, ret];
case 1:
ret = _a.sent();
_a.label = 2;
case 2:
if (ret === false) {
return [2 /*return*/];
}
_a.label = 3;
case 3:
self.markSaving(true);
return [4 /*yield*/, mobx_state_tree_1.getRoot(self).fetcher(api, data, options)];
case 4:
json = _a.sent();
// 失败也同样 merge,如果有数据的话。
if (!helper_1.isEmpty(json.data) || json.ok) {
setValues(json.data, {
__saved: Date.now()
});
self.updatedAt = Date.now();
}
if (!!json.ok) return [3 /*break*/, 5];
// 验证错误
if (json.status === 422 && json.errors) {
errors_1 = json.errors;
Object.keys(errors_1).forEach(function (key) {
var item = self.getItemById(key);
if (item) {
item.setError(errors_1[key]);
}
else {
self.getItemsByName(key).forEach(function (item) { return item.setError(errors_1[key]); });
}
});
self.updateMessage(json.msg || (options && options.errorMessage) || '验证错误', true);
}
else {
self.updateMessage(json.msg || (options && options.errorMessage), true);
}
throw new ServerError(self.msg);
case 5:
if (!(options && options.onSuccess)) return [3 /*break*/, 7];
ret = options.onSuccess(json);
if (!(ret && ret.then)) return [3 /*break*/, 7];
return [4 /*yield*/, ret];
case 6:
_a.sent();
_a.label = 7;
case 7:
self.markSaving(false);
self.updateMessage(json.msg || (options && options.successMessage));
self.msg && mobx_state_tree_1.getRoot(self).notify('success', self.msg);
return [2 /*return*/, json.data];
case 8: return [3 /*break*/, 10];
case 9:
e_1 = _a.sent();
if (mobx_state_tree_1.getRoot(self).storeType !== 'RendererStore') {
// 已经销毁了,不管这些数据了。
return [2 /*return*/];
}
self.markSaving(false);
// console.error(e.stack);`
mobx_state_tree_1.getRoot(self).notify('error', e_1.message);
throw e_1;
case 10: return [2 /*return*/];
}
});
});
var submit = mobx_state_tree_1.flow(function submit(fn, hooks, failedMessage) {
var valid, diff;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
self.submited = true;
self.submiting = true;
_a.label = 1;
case 1:
_a.trys.push([1, , 5, 6]);
return [4 /*yield*/, validate(hooks)];
case 2:
valid = _a.sent();
if (!valid) {
mobx_state_tree_1.getRoot(self).notify('error', failedMessage || '表单验证失败,请仔细检查');
throw new Error('验证失败');
}
if (!fn) return [3 /*break*/, 4];
diff = helper_1.difference(self.data, self.pristine);
return [4 /*yield*/, fn(helper_1.createObject(helper_1.createObject(self.data.__super, {
diff: diff,
__diff: diff,
pristine: self.pristine
}), self.data))];
case 3:
_a.sent();
_a.label = 4;
case 4: return [3 /*break*/, 6];
case 5:
self.submiting = false;
return [7 /*endfinally*/];
case 6: return [2 /*return*/, self.data];
}
});
});
var validate = mobx_state_tree_1.flow(function validate(hooks, forceValidate) {
var items, i, len, item, i, len;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
self.validating = true;
self.validated = true;
items = self.items.concat();
i = 0, len = items.length;
_a.label = 1;
case 1:
if (!(i < len)) return [3 /*break*/, 4];
item = items[i];
if (!(!item.validated || forceValidate)) return [3 /*break*/, 3];
return [4 /*yield*/, item.validate()];
case 2:
_a.sent();
_a.label = 3;
case 3:
i++;
return [3 /*break*/, 1];
case 4:
if (!(hooks && hooks.length)) return [3 /*break*/, 8];
i = 0, len = hooks.length;
_a.label = 5;
case 5:
if (!(i < len)) return [3 /*break*/, 8];
return [4 /*yield*/, hooks[i]()];
case 6:
_a.sent();
_a.label = 7;
case 7:
i++;
return [3 /*break*/, 5];
case 8:
self.validating = false;
return [2 /*return*/, self.valid];
}
});
});
var validateFields = mobx_state_tree_1.flow(function validateFields(fields) {
var items, result, i, len, item, _a, _b;
return tslib_1.__generator(this, function (_c) {
switch (_c.label) {
case 0:
self.validating = true;
items = self.items.concat();
result = [];
i = 0, len = items.length;
_c.label = 1;
case 1:
if (!(i < len)) return [3 /*break*/, 4];
item = items[i];
if (!~fields.indexOf(item.name)) return [3 /*break*/, 3];
_b = (_a = result).push;
return [4 /*yield*/, item.validate()];
case 2:
_b.apply(_a, [_c.sent()]);
_c.label = 3;
case 3:
i++;
return [3 /*break*/, 1];
case 4:
self.validating = false;
return [2 /*return*/, result.every(function (item) { return item; })];
}
});
});
function clearErrors() {
var items = self.items.concat();
items.forEach(function (item) { return item.reset(); });
}
function reset(cb, resetData) {
if (resetData === void 0) { resetData = true; }
if (resetData) {
self.data = self.pristine;
}
// 值可能变了,重新验证一次。
self.validated = false;
self.submited = false;
self.items.forEach(function (item) { return item.reset(); });
cb && cb(self.data);
}
function registryItem(name, options) {
var item;
self.items.push({
identifier: helper_1.guid(),
name: name
});
item = self.items[self.items.length - 1];
// 默认值可能在原型上,把他挪到当前对象上。
setValueByName(item.name, item.value, false, false);
options && item.config(options);
return item;
}
function unRegistryItem(item) {
mobx_state_tree_1.detach(item);
}
function beforeDetach() {
// 本来是想在组件销毁的时候处理,
// 但是 componentWillUnmout 是父级先执行,form 都销毁了 formItem 就取不到 父级就不是 combo 了。
if (self.parentStore && self.parentStore.storeType === 'ComboStore') {
var combo_1 = self.parentStore;
self.items.forEach(function (item) {
if (item.unique) {
combo_1.unBindUniuqueItem(item);
}
});
combo_1.removeForm(self);
combo_1.forms.forEach(function (item) { return item.items.forEach(function (item) { return item.unique && item.syncOptions(); }); });
}
self.items.forEach(function (item) { return mobx_state_tree_1.detach(item); });
}
function setCanAccessSuperData(value) {
if (value === void 0) { value = true; }
self.canAccessSuperData = value;
}
function setInited(value) {
self.inited = value;
}
var setPersistData = debounce(function () {
localStorage.setItem(location.pathname + self.path, JSON.stringify(self.data));
}, 250);
function getPersistData() {
self.persistData = true;
var data = localStorage.getItem(location.pathname + self.path);
if (data) {
self.updateData(JSON.parse(data));
}
}
function clearPersistData() {
localStorage.removeItem(location.pathname + self.path);
}
return {
setInited: setInited,
setValues: setValues,
setValueByName: setValueByName,
trimValues: trimValues,
submit: submit,
validate: validate,
validateFields: validateFields,
clearErrors: clearErrors,
saveRemote: saveRemote,
reset: reset,
registryItem: registryItem,
unRegistryItem: unRegistryItem,
beforeDetach: beforeDetach,
syncOptions: syncOptions,
setCanAccessSuperData: setCanAccessSuperData,
deleteValueByName: deleteValueByName,
getPersistData: getPersistData,
setPersistData: setPersistData,
clearPersistData: clearPersistData
};
});
//# sourceMappingURL=./store/form.js.map