UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

1,762 lines (1,480 loc) 120 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.addDataSetField = addDataSetField; exports.addRecordField = addRecordField; exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _tslib = require("tslib"); var _mobx = require("mobx"); var _axios = _interopRequireDefault(require("axios")); var _unionBy = _interopRequireDefault(require("lodash/unionBy")); var _omit = _interopRequireDefault(require("lodash/omit")); var _flatMap = _interopRequireDefault(require("lodash/flatMap")); var _isNumber = _interopRequireDefault(require("lodash/isNumber")); var _isArray = _interopRequireDefault(require("lodash/isArray")); var _isObject = _interopRequireDefault(require("lodash/isObject")); var _isNil = _interopRequireDefault(require("lodash/isNil")); var _defer = _interopRequireDefault(require("lodash/defer")); var _isString = _interopRequireDefault(require("lodash/isString")); var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject")); var _debounce = _interopRequireDefault(require("lodash/debounce")); var _warning = _interopRequireDefault(require("../../../lib/_util/warning")); var _configure = require("../../../lib/configure"); var _localeContext = _interopRequireWildcard(require("../locale-context")); var _axios2 = _interopRequireDefault(require("../axios")); var _Record = _interopRequireDefault(require("./Record")); var _Field = _interopRequireDefault(require("./Field")); var _utils = require("./utils"); var _EventManager2 = _interopRequireDefault(require("../_util/EventManager")); var _DataSetSnapshot = _interopRequireDefault(require("./DataSetSnapshot")); var _confirm = _interopRequireDefault(require("../modal/confirm")); var _enum = require("./enum"); var _isEmpty = _interopRequireDefault(require("../_util/isEmpty")); var ObjectChainValue = _interopRequireWildcard(require("../_util/ObjectChainValue")); var _Transport = _interopRequireDefault(require("./Transport")); var _PromiseQueue = _interopRequireDefault(require("../_util/PromiseQueue")); var _DataSetRequestError = _interopRequireDefault(require("./DataSetRequestError")); var _FeedBack = _interopRequireDefault(require("./FeedBack")); var _treeUtils = require("../_util/treeUtils"); function _createSuper(Derived) { function isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } return function () { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (isNativeReflectConstruct()) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } var ALL_PAGE_SELECTION = '__ALL_PAGE_SELECTION__'; // TODO:Symbol var QUERY_PARAMETER = '__QUERY_PARAMETER__'; // TODO:Symbol function addDataSetField(dataSet, name) { var fieldProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; return (0, _utils.processIntlField)(name, fieldProps, function (langName, langProps) { var field = new _Field["default"](langProps, dataSet); dataSet.fields.set(langName, field); return field; }, dataSet); } function addRecordField(record, name) { var fieldProps = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var dataSet = record.dataSet; fieldProps.name = name; return (0, _utils.processIntlField)(name, fieldProps, function (langName, langProps) { var field = new _Field["default"](langProps, dataSet, record); record.fields.set(langName, field); return field; }, dataSet); } var DataSet = /*#__PURE__*/ function (_EventManager) { (0, _inherits2["default"])(DataSet, _EventManager); var _super = _createSuper(DataSet); function DataSet(props) { var _this; (0, _classCallCheck2["default"])(this, DataSet); _this = _super.call(this); _this.children = {}; _this.prepareForReport = {}; _this.pending = new _PromiseQueue["default"](); _this.performance = { timing: { fetchStart: 0, fetchEnd: 0, loadStart: 0, loadEnd: 0 } }; _this.originalData = []; _this.resetInBatch = false; _this.validating = false; _this.inBatchSelection = false; _this.syncChildrenRemote = (0, _debounce["default"])(function (remoteKeys, current) { var _assertThisInitialize = (0, _assertThisInitialized2["default"])(_this), children = _assertThisInitialize.children; remoteKeys.forEach(function (childName) { return _this.syncChild(children[childName], current, childName); }); }, 300); (0, _mobx.runInAction)(function () { props = (0, _objectSpread3["default"])({}, DataSet.defaultProps, {}, props); _this.props = props; var _props = props, data = _props.data, fields = _props.fields, queryFields = _props.queryFields, queryDataSet = _props.queryDataSet, autoQuery = _props.autoQuery, autoCreate = _props.autoCreate, pageSize = _props.pageSize, selection = _props.selection, events = _props.events, id = _props.id, name = _props.name, children = _props.children, _props$queryParameter = _props.queryParameter, queryParameter = _props$queryParameter === void 0 ? {} : _props$queryParameter, dataToJSON = _props.dataToJSON, selectionStrategy = _props.selectionStrategy; _this.name = name; _this.selectionStrategy = selectionStrategy; _this.dataToJSON = dataToJSON; _this.records = []; _this.state = _mobx.observable.map(); _this.fields = _mobx.observable.map(); _this.totalCount = 0; _this.status = _enum.DataSetStatus.ready; _this.currentPage = 1; _this.cachedSelected = []; _this.queryParameter = queryParameter; _this.pageSize = pageSize; _this.selection = selection; _this.processListener(); if (id) { _this.id = id; } if (children) { _this.initChildren(children); } if (events) { _this.initEvents(events); } if (fields) { _this.initFields(fields); } _this.initQueryDataSet(queryDataSet, queryFields); if (data) { var length = data.length; if (length) { _this.loadData(data, length); } } // ssr do not auto query if (autoQuery && typeof window !== 'undefined') { _this.query(); } else if (autoCreate && _this.records.length === 0) { _this.create(); } }); return _this; } (0, _createClass2["default"])(DataSet, [{ key: "processListener", value: function processListener() { this.addEventListener(_enum.DataSetEvents.indexChange, this.handleCascade); } }, { key: "destroy", value: function destroy() { this.clear(); } }, { key: "setState", value: function setState(item, value) { if ((0, _isString["default"])(item)) { this.state.set(item, value); } else if ((0, _isPlainObject["default"])(item)) { this.state.merge(item); } return this; } }, { key: "getState", value: function getState(key) { return this.state.get(key); } }, { key: "snapshot", value: function snapshot() { return new _DataSetSnapshot["default"](this); } }, { key: "restore", value: function restore(snapshot) { if (snapshot.dataSet !== this) { this.events = {}; } else if (snapshot.events) { this.events = snapshot.events; } this.records = snapshot.records; this.originalData = snapshot.originalData; this.totalCount = snapshot.totalCount; this.currentPage = snapshot.currentPage; this.pageSize = snapshot.pageSize; this.cachedSelected = snapshot.cachedSelected; this.dataToJSON = snapshot.dataToJSON; this.children = snapshot.children; this.current = snapshot.current; return this; } }, { key: "setAllPageSelection", value: function setAllPageSelection(enable) { if (this.selection === _enum.DataSetSelection.multiple) { if (enable) { this.currentSelected.forEach(function (record) { return record.isSelected = false; }); } else { this.currentUnSelected.forEach(function (record) { return record.isSelected = true; }); } this.clearCachedSelected(); this.setState(ALL_PAGE_SELECTION, enable); if (enable) { this.records.forEach(function (record) { if (!record.selectable) { record.isSelected = false; } }); } } } }, { key: "toData", value: function toData() { return (0, _utils.generateData)(this.records).data; } /** * 对应参数后续会废弃 * @param isSelected * @param noCascade */ }, { key: "toJSONData", value: function toJSONData(isSelected, noCascade) { var dataToJSON = (0, _utils.adapterDataToJSON)(isSelected, noCascade) || this.dataToJSON; var records = (0, _utils.useSelected)(dataToJSON) ? this.selected : this.records; return (0, _utils.generateJSONData)(this, records).data; } /** * 等待选中或者所有记录准备就绪 * @returns Promise */ }, { key: "ready", value: function ready(_isSelect) { // return Promise.all([ // this.pending.ready(), // ...(isSelect || useSelected(this.dataToJSON) ? this.selected : this.data).map(record => // record.ready(), // ), // ...[...this.fields.values()].map(field => field.ready()), // ]); return this.pending.ready(); } /** * 查询记录 * @param page 页码 * @param params 查询参数 * @return Promise */ }, { key: "query", value: function query(page, params) { return this.pending.add(this.doQuery(page, params)); } /** * 查询更多记录,查询到的结果会拼接到原有数据之后 * @param page 页码 * @param params 查询参数 * @return Promise */ }, { key: "queryMore", value: function queryMore(page, params) { return this.pending.add(this.doQueryMore(page, params)); } }, { key: "queryMoreChild", value: function queryMoreChild(parent, page) { var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var _this$props = this.props, idField = _this$props.idField, parentField = _this$props.parentField; if (idField && parentField && !parent.children) { var id = parent.get(idField); if (!(0, _isEmpty["default"])(id)) { if (parentField) { params[parentField] = id; } return this.pending.add(this.doQueryMoreChild(parent, page, (0, _objectSpread3["default"])({}, params, (0, _defineProperty2["default"])({}, parentField, id)))); } } return Promise.resolve(); } }, { key: "doQuery", value: function () { var _doQuery = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee(page, params) { var data; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return this.read(page, params); case 2: data = _context.sent; this.loadDataFromResponse(data); return _context.abrupt("return", data); case 5: case "end": return _context.stop(); } } }, _callee, this); })); function doQuery(_x, _x2) { return _doQuery.apply(this, arguments); } return doQuery; }() }, { key: "doQueryMore", value: function () { var _doQueryMore = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee2(page, params) { var data; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return this.read(page, params); case 2: data = _context2.sent; this.appendDataFromResponse(data); return _context2.abrupt("return", data); case 5: case "end": return _context2.stop(); } } }, _callee2, this); })); function doQueryMore(_x3, _x4) { return _doQueryMore.apply(this, arguments); } return doQueryMore; }() }, { key: "doQueryMoreChild", value: function () { var _doQueryMoreChild = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee3(parent, page, params) { var data; return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this.read(page, params); case 2: data = _context3.sent; this.appendDataFromResponse(data, parent); return _context3.abrupt("return", data); case 5: case "end": return _context3.stop(); } } }, _callee3, this); })); function doQueryMoreChild(_x5, _x6, _x7) { return _doQueryMoreChild.apply(this, arguments); } return doQueryMoreChild; }() /** * TODO 参数废弃 * 将数据集中的增删改的记录进行远程提交 * @param isSelect 如果为true,则只提交选中记录 * @param noCascade 如果为true,则不提交级联数据 * @return Promise */ }, { key: "submit", value: function () { var _submit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee4(isSelect, noCascade) { var dataToJSON; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: dataToJSON = (0, _utils.adapterDataToJSON)(isSelect, noCascade) || this.dataToJSON; _context4.next = 3; return this.ready(); case 3: _context4.next = 5; return this.validate(); case 5: if (!_context4.sent) { _context4.next = 7; break; } return _context4.abrupt("return", this.pending.add(this.write((0, _utils.useSelected)(dataToJSON) ? this.selected : this.records))); case 7: return _context4.abrupt("return", false); case 8: case "end": return _context4.stop(); } } }, _callee4, this); })); function submit(_x8, _x9) { return _submit.apply(this, arguments); } return submit; }() /** * 导出数据 * @param object columns 导出的列 * @param number exportQuantity 导出数量 */ }, { key: "export", value: function () { var _export2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee5() { var columns, exportQuantity, data, totalCount, totalKey, params, newConfig, ExportQuantity, _args5 = arguments; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: columns = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : {}; exportQuantity = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : 0; _context5.t0 = this.checkReadable(this.parent); if (!_context5.t0) { _context5.next = 7; break; } _context5.next = 6; return this.ready(); case 6: _context5.t0 = _context5.sent; case 7: if (!_context5.t0) { _context5.next = 27; break; } _context5.next = 10; return this.generateQueryParameter(); case 10: data = _context5.sent; data._HAP_EXCEL_EXPORT_COLUMNS = columns; totalCount = this.totalCount, totalKey = this.totalKey; params = (0, _objectSpread3["default"])({ _r: Date.now() }, this.generateOrderQueryString()); ObjectChainValue.set(params, totalKey, totalCount); newConfig = (0, _utils.axiosConfigAdapter)('exports', this, data, params); if (!(newConfig.url || this.exportMode === _enum.ExportMode.client)) { _context5.next = 26; break; } _context5.next = 19; return this.fireEvent(_enum.DataSetEvents["export"], { dataSet: this, params: newConfig.params, data: newConfig.data }); case 19: _context5.t1 = _context5.sent; if (!(_context5.t1 !== false)) { _context5.next = 24; break; } ExportQuantity = exportQuantity > 1000 ? 1000 : exportQuantity; if (this.exportMode !== _enum.ExportMode.client) { (0, _utils.doExport)(this.axios.getUri(newConfig), newConfig.data, newConfig.method); } return _context5.abrupt("return", this.doClientExport(data, ExportQuantity, false)); case 24: _context5.next = 27; break; case 26: (0, _warning["default"])(false, 'Unable to execute the export method of dataset, please check the '); case 27: case "end": return _context5.stop(); } } }, _callee5, this); })); function _export() { return _export2.apply(this, arguments); } return _export; }() /** * 可以把json数组通过ds配置转化成可以直接浏览的数据信息 * @param result 需要转化内容 * @param columnsExport 表头信息 */ }, { key: "displayDataTransform", value: function displayDataTransform(result, columnsExport) { var _this2 = this; var newResult = []; if (result && result.length > 0) { // check: 这里做性能优化去掉实例化为record 从demo来看没啥问题 // toJS(this.processData(result)).map((item) => item.data); var processData = result; processData.forEach(function (itemValue) { var dataItem = {}; var columnsExportkeys = Object.keys(columnsExport); for (var i = 0; i < columnsExportkeys.length; i += 1) { var firstRecord = _this2.records[0] || _this2; var exportField = firstRecord.getField(columnsExportkeys[i]); var processItemValue = (0, _utils.getSplitValue)((0, _mobx.toJS)(itemValue), columnsExportkeys[i]); // 处理bind 情况 没有需要链式bind 没有处理反向bind 后面可能根据需求增加 if (exportField && (0, _isNil["default"])(processItemValue) && exportField.get('bind')) { processItemValue = (0, _utils.getSplitValue)((0, _utils.getSplitValue)((0, _mobx.toJS)(itemValue), exportField.get('bind')), columnsExportkeys[i], false); } dataItem[columnsExportkeys[i]] = (0, _utils.processExportValue)(processItemValue, exportField); } newResult.push(dataItem); }); } return newResult; } /** * 客户端导出方法 * @param data 表头数据 * @param quantity 输入一次导出数量 * @param isFile 是否导出为文件 */ }, { key: "doClientExport", value: function () { var _doClientExport = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee6(data, quantity) { var _this3 = this; var isFile, columnsExport, totalCount, newResult, queryTime, queryExportList, _loop, i, _args6 = arguments; return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: isFile = _args6.length > 2 && _args6[2] !== undefined ? _args6[2] : true; columnsExport = data._HAP_EXCEL_EXPORT_COLUMNS; delete data._HAP_EXCEL_EXPORT_COLUMNS; totalCount = this.totalCount; (0, _mobx.runInAction)(function () { _this3.exportProgress = 0; _this3.exportStatus = _enum.DataSetExportStatus.start; }); newResult = []; if (!(totalCount > 0)) { _context6.next = 13; break; } queryTime = Math.ceil(totalCount / quantity); // 处理超并发问题 在超大数据量下一口气发出了几千个请求造成数据丢失 queryExportList = []; (0, _mobx.runInAction)(function () { _this3.exportStatus = _enum.DataSetExportStatus.exporting; }); _loop = function _loop(i) { var params = (0, _objectSpread3["default"])({}, _this3.generateQueryString(1 + i, quantity)); var newConfig = (0, _utils.axiosConfigAdapter)('read', _this3, data, params); queryExportList.push({ getPromise: function getPromise() { return _this3.axios(newConfig); } }); }; for (i = 0; i < queryTime; i++) { _loop(i); } return _context6.abrupt("return", (0, _utils.concurrentPromise)(queryExportList, function (currentPromiseIndex) { // 下面还有一段处理所以设置最大值为99 (0, _mobx.runInAction)(function () { _this3.exportProgress = Math.min(99, Math.floor(currentPromiseIndex / queryExportList.length * 100)); }); return _this3.exportStatus === undefined; }).then(function (resultValue) { var reducer = function reducer(accumulator, currentValue) { return [].concat((0, _toConsumableArray2["default"])(accumulator), (0, _toConsumableArray2["default"])(currentValue)); }; var todataList = function todataList(item) { return item ? item[_this3.dataKey] : []; }; (0, _mobx.runInAction)(function () { _this3.exportStatus = _enum.DataSetExportStatus.progressing; }); var exportAlldate = resultValue.map(todataList).reduce(reducer); newResult = _this3.displayDataTransform(exportAlldate, columnsExport); newResult.unshift(columnsExport); (0, _mobx.runInAction)(function () { _this3.exportStatus = _enum.DataSetExportStatus.success; }); if (isFile) { (0, _utils.exportExcel)(newResult, _this3.name); } else { return newResult; } })["catch"](function (err) { console.warn(err); (0, _mobx.runInAction)(function () { _this3.exportStatus = _enum.DataSetExportStatus.failed; _this3.exportProgress = 0; }); })); case 13: case "end": return _context6.stop(); } } }, _callee6, this); })); function doClientExport(_x10, _x11) { return _doClientExport.apply(this, arguments); } return doClientExport; }() /** * 重置更改 */ }, { key: "reset", value: function reset() { this.resetInBatch = true; try { this.records = this.originalData.map(function (record) { return record.reset(); }); } finally { this.resetInBatch = false; } if (this.props.autoCreate && this.records.length === 0) { this.create(); } this.fireEvent(_enum.DataSetEvents.reset, { dataSet: this, records: this.records }); return this; } /** * 定位到指定页码,如果paging为true或`server`,则做远程查询,约定当为Tree 状态的server时候 跳转到下一页也就是index为当前的index加上1 * @param page 页码 * @return Promise */ }, { key: "page", value: function page(_page) { if (_page > 0 && this.paging) { return this.locate((_page - 1) * this.pageSize + (_page > this.currentPage ? this.created.length - this.destroyed.length : 0)); } (0, _warning["default"])(_page > 0, 'Page number is incorrect.'); (0, _warning["default"])(!!this.paging, 'Can not paging query util the property<paging> of DataSet is true or `server`.'); return Promise.resolve(); } /** * 变更检查,当有变更时会弹确认框 * @param message 提示信息或者是confirm的参数 * @return Promise */ }, { key: "modifiedCheck", value: function modifiedCheck(message) { var _this$props2 = this.props, modifiedCheck = _this$props2.modifiedCheck, modifiedCheckMessage = _this$props2.modifiedCheckMessage; if (!modifiedCheck || !this.dirty) { return Promise.resolve(true); } return (0, _confirm["default"])(message || modifiedCheckMessage || (0, _localeContext.$l)('DataSet', 'unsaved_data_confirm')).then(function (result) { return result !== 'cancel'; }); } /** * 定位记录 * @param index 索引 * @return Promise */ }, { key: "locate", value: function () { var _locate = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee7(index) { var paging, pageSize, totalCount, autoLocateFirst, currentRecord; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: paging = this.paging, pageSize = this.pageSize, totalCount = this.totalCount; autoLocateFirst = this.props.autoLocateFirst; currentRecord = this.findInAllPage(index); if (!currentRecord) { _context7.next = 6; break; } this.current = currentRecord; return _context7.abrupt("return", currentRecord); case 6: if (!(paging === true || paging === 'server')) { _context7.next = 17; break; } if (!(index >= 0 && index < totalCount + this.created.length - this.destroyed.length)) { _context7.next = 17; break; } _context7.next = 10; return this.modifiedCheck(); case 10: if (!_context7.sent) { _context7.next = 17; break; } _context7.next = 13; return this.query(Math.floor(index / pageSize) + 1); case 13: currentRecord = this.findInAllPage(index); if (!currentRecord) { _context7.next = 17; break; } this.current = autoLocateFirst ? currentRecord : undefined; return _context7.abrupt("return", currentRecord); case 17: (0, _warning["default"])(false, 'Located index of Record is out of boundary.'); return _context7.abrupt("return", Promise.resolve(undefined)); case 19: case "end": return _context7.stop(); } } }, _callee7, this); })); function locate(_x12) { return _locate.apply(this, arguments); } return locate; }() /** * 定位到第一条记录 * @return Promise */ }, { key: "first", value: function first() { return this.locate(0); } /** * 定位到最后一条记录 * @return Promise */ }, { key: "last", value: function last() { return this.locate((this.paging ? this.totalCount : this.length) - 1); } /** * 定位到当前记录的上一条记录 * 若当前页中当前记录为第一条记录且有上一页,则会查询上一页并定位到上一页的最后一条记录 * @return Promise */ }, { key: "pre", value: function pre() { return this.locate(this.currentIndex - 1); } /** * 定位到当前记录的下一条记录 * 若当前页中当前记录为最后一条记录且有下一页,则会查询下一页并定位到下一页的第一条记录 * @return Promise */ }, { key: "next", value: function next() { return this.locate(this.currentIndex + 1); } /** * 定位到首页 * @return Promise */ }, { key: "firstPage", value: function firstPage() { return this.page(1); } /** * 定位到上一页 * @return Promise */ }, { key: "prePage", value: function prePage() { return this.page(this.currentPage - 1); } /** * 定位到下一页 * @return Promise */ }, { key: "nextPage", value: function nextPage() { return this.page(this.currentPage + 1); } /** * 定位到尾页 * @return Promise */ }, { key: "lastPage", value: function lastPage() { return this.page(this.totalPage); } /** * 创建一条记录 * @param data 数据对象 * @param dataIndex 记录所在的索引 * @return 新建的记录 */ }, { key: "create", value: function create() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var dataIndex = arguments.length > 1 ? arguments[1] : undefined; if (data === null) { data = {}; } var record = new _Record["default"](data, this); var objectFieldsList = []; var normalFields = []; (0, _toConsumableArray2["default"])(record.fields.entries()).forEach(function (_ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), name = _ref2[0], field = _ref2[1]; var fieldDefaultValue = field.get('defaultValue'); var multiple = field.get('multiple'); var defaultValue = multiple && (0, _isNil["default"])(fieldDefaultValue) ? [] : fieldDefaultValue; if (!(0, _isNil["default"])(defaultValue) && (0, _isNil["default"])(record.get(name))) { var type = field.get('type'); if (type === _enum.FieldType.object) { var level = name.split('.').length - 1; objectFieldsList[level] = (objectFieldsList[level] || []).concat([[name, defaultValue]]); } else { normalFields.push([name, defaultValue]); } } }); [].concat(objectFieldsList, [normalFields]).forEach(function (items) { if (items) { items.forEach(function (_ref3) { var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2), name = _ref4[0], defaultValue = _ref4[1]; return record.init(name, (0, _mobx.toJS)(defaultValue)); }); } }); if ((0, _isNumber["default"])(dataIndex)) { this.splice(dataIndex, 0, record); } else { this.push(record); } if (this.props.autoLocateAfterCreate) { this.current = record; } this.fireEvent(_enum.DataSetEvents.create, { dataSet: this, record: record }); return record; } /** * 立即删除记录 * @param records 记录或者记录数组,默认当前记录 * @param confirmMessage 提示信息或弹窗的属性 * @return Promise */ }, { key: "delete", value: function () { var _delete2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee8(records, confirmMessage) { var res, current, record; return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: if (!records) { _context8.next = 25; break; } records = [].concat(records); _context8.t1 = records.length > 0; if (!_context8.t1) { _context8.next = 8; break; } _context8.next = 6; return this.fireEvent(_enum.DataSetEvents.beforeDelete, { dataSet: this, records: records }); case 6: _context8.t2 = _context8.sent; _context8.t1 = _context8.t2 !== false; case 8: _context8.t0 = _context8.t1; if (!_context8.t0) { _context8.next = 17; break; } _context8.t3 = confirmMessage === false; if (_context8.t3) { _context8.next = 16; break; } _context8.next = 14; return (0, _confirm["default"])(confirmMessage && confirmMessage !== true ? confirmMessage : (0, _localeContext.$l)('DataSet', 'delete_selected_row_confirm')); case 14: _context8.t4 = _context8.sent; _context8.t3 = _context8.t4 !== 'cancel'; case 16: _context8.t0 = _context8.t3; case 17: if (!_context8.t0) { _context8.next = 25; break; } this.remove(records, false); _context8.next = 21; return this.pending.add(this.write(this.destroyed, true)); case 21: res = _context8.sent; // 处理自动定位 current = this.current; if (current) { if (this.props.autoLocateAfterRemove) { record = this.get(0); if (record) { (0, _mobx.runInAction)(function () { record.isCurrent = true; }); } } if (current !== record) { this.fireEvent(_enum.DataSetEvents.indexChange, { dataSet: this, record: record, previous: current }); } } return _context8.abrupt("return", res); case 25: case "end": return _context8.stop(); } } }, _callee8, this); })); function _delete(_x13, _x14) { return _delete2.apply(this, arguments); } return _delete; }() /** * 临时删除记录 * @param records 记录或者记录数组 * @param locate 是否需要进行定位操作 */ }, { key: "remove", value: function remove(records, locate) { if (records) { var data = (0, _mobx.isArrayLike)(records) ? records.slice() : [records]; if (data.length && this.fireEventSync(_enum.DataSetEvents.beforeRemove, { dataSet: this, records: data }) !== false) { var current = this.current; data.forEach(this.deleteRecord, this); this.fireEvent(_enum.DataSetEvents.remove, { dataSet: this, records: data }); if (!this.current) { var record; if (locate !== false && this.props.autoLocateAfterRemove) { record = this.get(0); if (record) { record.isCurrent = true; } } if (locate !== false && current !== record) { this.fireEvent(_enum.DataSetEvents.indexChange, { dataSet: this, record: record, previous: current }); } } } } } /** * 临时删除所有记录 */ }, { key: "removeAll", value: function removeAll() { var current = this.current, data = this.data; if (data.length) { data.forEach(this.deleteRecord, this); this.fireEvent(_enum.DataSetEvents.remove, { dataSet: this, records: data }); if (current) { this.fireEvent(_enum.DataSetEvents.indexChange, { dataSet: this, previous: current }); } } } /** * 删除所有记录 * @param confirmMessage 提示信息或弹窗的属性 */ }, { key: "deleteAll", value: function () { var _deleteAll = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee9(confirmMessage) { return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: _context9.t0 = this.records.length > 0; if (!_context9.t0) { _context9.next = 9; break; } _context9.t1 = confirmMessage === false; if (_context9.t1) { _context9.next = 8; break; } _context9.next = 6; return (0, _confirm["default"])(confirmMessage && confirmMessage !== true ? confirmMessage : (0, _localeContext.$l)('DataSet', 'delete_all_row_confirm')); case 6: _context9.t2 = _context9.sent; _context9.t1 = _context9.t2 !== 'cancel'; case 8: _context9.t0 = _context9.t1; case 9: if (!_context9.t0) { _context9.next = 12; break; } this.removeAll(); return _context9.abrupt("return", this.pending.add(this.write(this.destroyed, true))); case 12: case "end": return _context9.stop(); } } }, _callee9, this); })); function deleteAll(_x15) { return _deleteAll.apply(this, arguments); } return deleteAll; }() /** * 将若干数据记录插入记录堆栈顶部 * @param records 数据集 * @return 堆栈数量 */ }, { key: "push", value: function push() { var _this$records; (0, _utils.checkParentByInsert)(this); for (var _len = arguments.length, records = new Array(_len), _key = 0; _key < _len; _key++) { records[_key] = arguments[_key]; } return (_this$records = this.records).push.apply(_this$records, (0, _toConsumableArray2["default"])(this.transferRecords(records))); } /** * 将若干数据记录插入记录堆栈底部 * @param records 数据集 * @return 堆栈数量 */ }, { key: "unshift", value: function unshift() { var _this$records2; (0, _utils.checkParentByInsert)(this); for (var _len2 = arguments.length, records = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { records[_key2] = arguments[_key2]; } return (_this$records2 = this.records).unshift.apply(_this$records2, (0, _toConsumableArray2["default"])(this.transferRecords(records))); } /** * 从记录堆栈顶部获取记录 * @return 记录 */ }, { key: "pop", value: function pop() { return this.deleteRecord(this.data.pop()); } /** * 从记录堆栈底部获取记录 * @return 记录 */ }, { key: "shift", value: function shift() { return this.deleteRecord(this.data.shift()); } /** * 删除指定索引的若干记录,并可插入若干新记录 * @param from 索引开始的位置 * @default 0 * @param deleteCount 删除的数量 * @default 0 * @param records 插入的若干新记录 * @return 被删除的记录集 */ }, { key: "splice", value: function splice(from, deleteCount) { var fromRecord = this.get(from); var deleted = this.slice(from, from + deleteCount).map(this.deleteRecord, this); for (var _len3 = arguments.length, items = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { items[_key3 - 2] = arguments[_key3]; } if (items.length) { (0, _utils.checkParentByInsert)(this); var records = this.records; var spliceRecord = (0, _utils.getSpliceRecord)(records, items, fromRecord); var transformedRecords = this.transferRecords(items); if (spliceRecord) { records.splice.apply(records, [records.indexOf(spliceRecord), 0].concat((0, _toConsumableArray2["default"])(transformedRecords))); } else { records.push.apply(records, (0, _toConsumableArray2["default"])(transformedRecords)); } } return deleted; } /** * 切换记录的顺序 */ }, { key: "move", value: function move(from, to) { (0, _utils.arrayMove)(this.records, from, to); } /** * 截取指定索引范围的记录集,不改变原记录堆栈 * @param start 开始索引 * @default 0 * @param end 结束索引 * @default 记录堆栈长度 * @return 被删除的记录集 */ }, { key: "slice", value: function slice() { var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.length; return this.data.slice(start, end); } /** * 获取记录所在的索引 * @param record 记录 * @param fromIndex 开始检索的索引 * @return 索引 */ }, { key: "indexOf", value: function indexOf(record, fromIndex) { return this.data.indexOf(record, fromIndex); } /** * 根据函数查找记录 * @param fn 查询函数 * @returns 记录 */ }, { key: "find", value: function find(fn) { return this.data.find(fn); } /** * 根据函数查找记录所在的索引 * @param fn 查询函数 * @returns 索引 */ }, { key: "findIndex", value: function findIndex(fn) { return this.data.findIndex(fn); } /** * 根据函数遍历 * @param fn 遍历函数 * @param thisArg this对象 */ }, { key: "forEach", value: function forEach(fn, thisArg) { this.data.forEach(fn, thisArg); } /** * 根据函数遍历并输出新数组 * @param fn 遍历函数 * @param thisArg this对象 * @returns 输出新数组 */ }, { key: "map", value: function map(fn, thisArg) { return this.data.map(fn, thisArg); } /** * 根据函数遍历,当有返回值为true时,输出true * @param fn 遍历函数 * @param thisArg this对象 * @returns boolean */ }, { key: "some", value: function some(fn, thisArg) { return this.data.some(fn, thisArg); } /** * 根据函数遍历,当有返回值为false时,输出false * @param fn 遍历函数 * @param thisArg this对象 * @returns boolean */ }, { key: "every", value: function every(fn, thisArg) { return this.data.every(fn, thisArg); } /** * 根据函数过滤并返回记录集 * @param fn 过滤函数 * @param thisArg this对象 * @returns {Record[]} */ }, { key: "filter", value: function filter(fn, thisArg) { return this.data.filter(fn, thisArg); } /** * 为数组中的所有元素调用指定的回调函数。 回调函数的返回值是累计结果,并在下次调用回调函数时作为参数提供。 * @param fn 累计函数 * @param initialValue 初始值 * @returns {U} */ }, { key: "reduce", value: function reduce(fn, initialValue) { return this.data.reduce(fn, initialValue); } /** * 按降序调用数组中所有元素的指定回调函数。 回调函数的返回值是累计结果,并在下次调用回调函数时作为参数提供。 * @param fn 累计函数 * @param initialValue 初始值 * @returns {U} */ }, { key: "reduceRight", value: function reduceRight(fn, initialValue) { return this.data.reduceRight(fn, initialValue); } /** * 反转记录的顺序。 */ }, { key: "reverse", value: function reverse() { return this.records = this.records.reverse(); } /** * 服务端排序 * * @param fieldName */ }, { key: "sort", value: function sort(fieldName) { var combineSort = this.props.combineSort; var field = this.getField(fieldName); if (field) { var currents = (0, _utils.getOrderFields)(this.fields); if (!combineSort) { currents.forEach(function (current) { if (current !== field) { current.order = undefined; } }); } switch (field.order) { case _enum.SortOrder.asc: field.order = _enum.SortOrder.desc; break; case _enum.SortOrder.desc: field.order = undefined; break; default: field.order = _enum.SortOrder.asc; } if (this.paging || !field.order) { this.query(); } else { this.records = this.records.sort((0, _utils.getFieldSorter)(field)); } } } /** * 选中记录 * @param recordOrIndex 记录或记录索引 */ }, { key: "select", value: function select(recordOrIndex) { var selection = this.selection; if (selection) { var record = recordOrIndex; if ((0, _isNumber["default"])(recordOrIndex)) { record = this.get(recordOrIndex); } if (record && record.selectable && !record.isSelected) { var previous; if (selection === _enum.DataSetSelection.single) { this.selected.forEach(function (selected) { selected.isSelected = false; previous = selected; }); } record.isSelected = true; if (!this.inBatchSelection) { if (this.isAllPageSelection) { var cachedIndex = this.cachedSelected.indexOf(record); if (cachedIndex !== -1) { this.cachedSelected.splice(cachedIndex, 1); } } this.fireEvent(_enum.DataSetEvents.select, { dataSet: this, record: record, previous: previous }); this.fireEvent(_enum.DataSetEvents.batchSelect, { dataSet: this, records: [record] }); } } } } /** * 取消选中记录 * @param recordOrIndex 记录或记录索引 */ }, { key: "unSelect", value: function unSelect(recordOrIndex) { if (this.selection) { var record = recordOrIndex; if ((0, _isNumber["default"])(recordOrIndex)) { record = this.get(recordOrIndex); } if (record && record.selectable && record.isSelected) { record.isSelected = false; if (!this.inBatchSelection) { if (!this.isAllPageSelection) { var cachedIndex = this.cachedSelected.indexOf(record); if (cachedIndex !== -1) { this.cachedSelected.splice(cachedIndex, 1); } } this.fireEvent(_enum.DataSetEvents.unSelect, { dataSet: this, record: record }); this.fireEvent(_enum.DataSetEvents.batchUnSelect, { dataSet: this, records: [record] }); } } } } /** * 全选 */ }, { key: "selectAl