UNPKG

amis

Version:

一种MIS页面生成工具

356 lines (355 loc) 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CRUDStore = void 0; var tslib_1 = require("tslib"); var file_saver_1 = require("file-saver"); var mobx_state_tree_1 = require("mobx-state-tree"); var service_1 = require("./service"); var helper_1 = require("../utils/helper"); var pick_1 = tslib_1.__importDefault(require("lodash/pick")); var tpl_builtin_1 = require("../utils/tpl-builtin"); 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.CRUDStore = service_1.ServiceStore.named('CRUDStore') .props({ pristineQuery: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.frozen(), {}), query: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.frozen(), {}), prevPage: 1, page: 1, perPage: 10, total: 0, mode: 'normal', hasNext: false, selectedAction: mobx_state_tree_1.types.frozen(), columns: mobx_state_tree_1.types.frozen(), items: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.frozen()), []), selectedItems: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.frozen()), []), unSelectedItems: mobx_state_tree_1.types.optional(mobx_state_tree_1.types.array(mobx_state_tree_1.types.frozen()), []), filterTogggable: false, filterVisible: true, hasInnerModalOpen: false }) .views(function (self) { return ({ get lastPage() { return Math.max(Math.ceil(self.total / (self.perPage < 1 ? 10 : self.perPage)), 1); }, get filterData() { return helper_1.createObject(self.data, tslib_1.__assign({}, self.query)); }, get mergedData() { return helper_1.extendObject(self.data, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, self.query), self.data), { selectedItems: self.selectedItems, unSelectedItems: self.unSelectedItems })); }, get hasModalOpened() { return self.dialogOpen || self.drawerOpen || self.hasInnerModalOpen; }, get selectedItemsAsArray() { return self.selectedItems.concat(); }, fetchCtxOf: function (data, options) { var _a; return helper_1.createObject(data, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, self.query), (_a = {}, _a[options.pageField || 'page'] = self.page, _a[options.perPageField || 'perPage'] = self.perPage, _a)), data)); } }); }) .actions(function (self) { var fetchCancel = null; function setPristineQuery() { self.pristineQuery = self.query; } function updateQuery(values, updater, pageField, perPageField, replace) { if (pageField === void 0) { pageField = 'page'; } if (perPageField === void 0) { perPageField = 'perPage'; } if (replace === void 0) { replace = false; } var originQuery = self.query; self.query = replace ? tslib_1.__assign({}, values) : tslib_1.__assign(tslib_1.__assign({}, self.query), values); if (self.query[pageField || 'page']) { self.page = parseInt(self.query[pageField || 'page'], 10); } if (self.query[perPageField || 'perPage']) { self.perPage = parseInt(self.query[perPageField || 'perPage'], 10); } updater && helper_1.isObjectShallowModified(originQuery, self.query, false) && setTimeout(updater.bind(null, "?" + helper_1.qsstringify(self.query)), 4); } var fetchInitData = mobx_state_tree_1.flow(function getInitData(api, data, options) { var items, dir, data_1, ctx, json, result, total, count, page, hasNext, oItems, oRows, columns, rest, items, rowsData, data_2, dir, e_1, env; var _a; var _b, _c, _d, _e, _f; if (options === void 0) { options = {}; } return tslib_1.__generator(this, function (_g) { switch (_g.label) { case 0: _g.trys.push([0, 2, , 3]); if (!options.forceReload && options.loadDataOnce && self.total) { items = options.source ? tpl_builtin_1.resolveVariableAndFilter(options.source, helper_1.createObject(self.mergedData, { items: self.data.itemsRaw, rows: self.data.itemsRaw }), '| raw') : self.items.concat(); if (self.query.orderBy) { dir = /desc/i.test(self.query.orderDir) ? -1 : 1; items = helper_1.sortArray(items, self.query.orderBy, dir); } data_1 = tslib_1.__assign(tslib_1.__assign({}, self.data), { total: items.length, items: items.slice((self.page - 1) * self.perPage, self.page * self.perPage) }); self.total = parseInt((_b = data_1.total) !== null && _b !== void 0 ? _b : data_1.count, 10) || 0; self.reInitData(data_1); return [2 /*return*/]; } if (fetchCancel) { fetchCancel(); fetchCancel = null; self.fetching = false; } options.silent || self.markFetching(true); ctx = helper_1.createObject(self.data, tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, self.query), (_a = {}, _a[options.pageField || 'page'] = self.page, _a[options.perPageField || 'perPage'] = self.perPage, _a)), data)); // 一次性加载不要发送 perPage 属性 if (options.loadDataOnce) { delete ctx[options.perPageField || 'perPage']; } return [4 /*yield*/, mobx_state_tree_1.getEnv(self).fetcher(api, ctx, tslib_1.__assign(tslib_1.__assign({}, options), { cancelExecutor: function (executor) { return (fetchCancel = executor); } }))]; case 1: json = _g.sent(); fetchCancel = null; if (!json.ok) { self.updateMessage((_d = (_c = json.msg) !== null && _c !== void 0 ? _c : options.errorMessage) !== null && _d !== void 0 ? _d : self.__('CRUD.fetchFailed'), true); mobx_state_tree_1.getEnv(self).notify('error', json.msg, json.msgTimeout !== undefined ? { closeButton: true, timeout: json.msgTimeout } : undefined); } else { if (!json.data) { throw new Error(self.__('CRUD.invalidData')); } self.updatedAt = Date.now(); result = json.data; if (Array.isArray(result)) { result = { items: result }; } total = result.total, count = result.count, page = result.page, hasNext = result.hasNext, oItems = result.items, oRows = result.rows, columns = result.columns, rest = tslib_1.__rest(result, ["total", "count", "page", "hasNext", "items", "rows", "columns"]); items = void 0; if (options.source) { items = tpl_builtin_1.resolveVariableAndFilter(options.source, helper_1.createObject(self.filterData, result), '| raw'); } else { items = result.items || result.rows; } if (!Array.isArray(items)) { throw new Error(self.__('CRUD.invalidArray')); } else { // 确保成员是对象。 items.map(function (item) { return typeof item === 'string' ? { text: item } : item; }); } rowsData = []; if (options.loadDataMode && Array.isArray(self.data.items)) { rowsData = self.data.items.concat(items); } else { // 第一次的时候就是直接加载请求的数据 rowsData = items; } data_2 = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, (api.replaceData ? {} : self.pristine)), { items: rowsData, count: count, total: total }), rest); if (options.loadDataOnce) { // 记录原始集合,后续可能基于原始数据做排序查找。 data_2.itemsRaw = oItems || oRows; if (self.query.orderBy) { dir = /desc/i.test(self.query.orderDir) ? -1 : 1; rowsData = helper_1.sortArray(rowsData, self.query.orderBy, dir); } data_2.items = rowsData.slice((self.page - 1) * self.perPage, self.page * self.perPage); data_2.count = data_2.total = rowsData.length; } if (Array.isArray(columns)) { self.columns = columns.concat(); } else { self.columns = undefined; } self.items.replace(rowsData); self.reInitData(data_2, !!api.replaceData); options.syncResponse2Query !== false && updateQuery(pick_1.default(rest, Object.keys(self.query)), undefined, options.pageField || 'page', options.perPageField || 'perPage'); self.total = parseInt((_e = data_2.total) !== null && _e !== void 0 ? _e : data_2.count, 10) || 0; typeof page !== 'undefined' && (self.page = parseInt(page, 10)); // 分页情况不清楚,只能知道有没有下一页。 if (typeof hasNext !== 'undefined') { self.mode = 'simple'; self.total = 0; self.hasNext = !!hasNext; } self.updateMessage((_f = json.msg) !== null && _f !== void 0 ? _f : options.successMessage); // 配置了获取成功提示后提示,默认是空不会提示。 options && options.successMessage && mobx_state_tree_1.getEnv(self).notify('success', self.msg); } self.markFetching(false); return [2 /*return*/, json]; case 2: e_1 = _g.sent(); env = mobx_state_tree_1.getEnv(self); if (!mobx_state_tree_1.isAlive(self) || self.disposed) { return [2 /*return*/]; } self.markFetching(false); if (env.isCancel(e_1)) { return [2 /*return*/]; } console.error(e_1.stack); env.notify('error', e_1.message); return [2 /*return*/]; case 3: return [2 /*return*/]; } }); }); function changePage(page, perPage) { self.page = page; perPage && (self.perPage = parseInt(perPage, 10)); } function selectAction(action) { self.selectedAction = action; } var saveRemote = mobx_state_tree_1.flow(function saveRemote(api, data, options) { var json, e_2; var _a, _b, _c; if (options === void 0) { options = {}; } return tslib_1.__generator(this, function (_d) { switch (_d.label) { case 0: _d.trys.push([0, 2, , 3]); options = tslib_1.__assign({ method: 'post' }, options); self.markSaving(true); return [4 /*yield*/, mobx_state_tree_1.getEnv(self).fetcher(api, data, options)]; case 1: json = _d.sent(); self.markSaving(false); if (!helper_1.isEmpty(json.data) || json.ok) { self.updateData(json.data, { __saved: Date.now() }, !!api && api.replaceData); self.updatedAt = Date.now(); } if (!json.ok) { self.updateMessage((_b = (_a = json.msg) !== null && _a !== void 0 ? _a : options.errorMessage) !== null && _b !== void 0 ? _b : self.__('saveFailed'), true); mobx_state_tree_1.getEnv(self).notify('error', self.msg, json.msgTimeout !== undefined ? { closeButton: true, timeout: json.msgTimeout } : undefined); throw new ServerError(self.msg); } else { self.updateMessage((_c = json.msg) !== null && _c !== void 0 ? _c : options.successMessage); self.msg && mobx_state_tree_1.getEnv(self).notify('success', self.msg, json.msgTimeout !== undefined ? { closeButton: true, timeout: json.msgTimeout } : undefined); } return [2 /*return*/, json.data]; case 2: e_2 = _d.sent(); self.markSaving(false); if (!mobx_state_tree_1.isAlive(self) || self.disposed) { return [2 /*return*/]; } e_2.type !== 'ServerError' && mobx_state_tree_1.getEnv(self).notify('error', e_2.message); throw e_2; case 3: return [2 /*return*/]; } }); }); var setFilterTogglable = function (toggable, filterVisible) { self.filterTogggable = toggable; filterVisible !== void 0 && (self.filterVisible = filterVisible); }; var setFilterVisible = function (visible) { self.filterVisible = visible; }; var setSelectedItems = function (items) { self.selectedItems.replace(items); }; var setUnSelectedItems = function (items) { self.unSelectedItems.replace(items); }; var setInnerModalOpened = function (value) { self.hasInnerModalOpen = value; }; var initFromScope = function (scope, source) { var rowsData = tpl_builtin_1.resolveVariableAndFilter(source, scope, '| raw'); if (!Array.isArray(rowsData)) { return; } var data = tslib_1.__assign(tslib_1.__assign({}, self.pristine), { items: rowsData, count: 0, total: 0 }); self.items.replace(rowsData); self.reInitData(data); }; return { setPristineQuery: setPristineQuery, updateQuery: updateQuery, fetchInitData: fetchInitData, changePage: changePage, selectAction: selectAction, saveRemote: saveRemote, setFilterTogglable: setFilterTogglable, setFilterVisible: setFilterVisible, setSelectedItems: setSelectedItems, setUnSelectedItems: setUnSelectedItems, setInnerModalOpened: setInnerModalOpened, initFromScope: initFromScope, exportAsCSV: function (options) { if (options === void 0) { options = {}; } return tslib_1.__awaiter(this, void 0, void 0, function () { var items, json; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: items = options.loadDataOnce ? self.data.itemsRaw : self.data.items; if (!(!options.loadDataOnce && options.api)) return [3 /*break*/, 2]; return [4 /*yield*/, self.fetchData(options.api, tslib_1.__assign(tslib_1.__assign({}, self.query), { page: undefined, perPage: undefined, op: 'export-csv' }), { autoAppend: true })]; case 1: json = _a.sent(); if (json.ok && (Array.isArray(json.data.items) || Array.isArray(json.data.rows))) { items = json.data.items || json.data.rows; } _a.label = 2; case 2: Promise.resolve().then(function () { return new Promise(function(resolve){require(['papaparse'], function(ret) {resolve(tslib_1.__importStar(ret));})}); }).then(function (papaparse) { var csvText = papaparse.unparse(items); if (csvText) { var blob = new Blob([csvText], { type: 'text/plain;charset=utf-8' }); file_saver_1.saveAs(blob, 'data.csv'); } }); return [2 /*return*/]; } }); }); } }; }); //# sourceMappingURL=./store/crud.js.map