UNPKG

vxe-table

Version:

一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...

1,812 lines (1,518 loc) 179 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _xeUtils = _interopRequireDefault(require("xe-utils")); var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf")); var _cell = _interopRequireDefault(require("./cell")); var _vXETable = _interopRequireDefault(require("../../v-x-e-table")); var _tools = require("../../tools"); var _util = require("./util"); var _dom = require("../../tools/src/dom"); var _formats = require("../../v-x-e-table/src/formats"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var getRowid = _tools.UtilTools.getRowid, getRowkey = _tools.UtilTools.getRowkey, setCellValue = _tools.UtilTools.setCellValue, hasChildrenList = _tools.UtilTools.hasChildrenList, getColumnList = _tools.UtilTools.getColumnList; var calcHeight = _tools.DomTools.calcHeight, hasClass = _tools.DomTools.hasClass, addClass = _tools.DomTools.addClass, removeClass = _tools.DomTools.removeClass, getEventTargetNode = _tools.DomTools.getEventTargetNode; var isWebkit = _dom.browse['-webkit'] && !_dom.browse.edge; var debounceScrollYDuration = _dom.browse.msie ? 80 : 20; var resizableStorageKey = 'VXE_TABLE_CUSTOM_COLUMN_WIDTH'; var visibleStorageKey = 'VXE_TABLE_CUSTOM_COLUMN_VISIBLE'; /** * 生成行的唯一主键 */ function getRowUniqueId() { return _xeUtils.default.uniqueId('row_'); } /** * 单元格的值为:'' | null | undefined 时都属于空值 */ function eqCellNull(cellValue) { return cellValue === '' || _xeUtils.default.eqNull(cellValue); } function eqCellValue(row1, row2, field) { var val1 = _xeUtils.default.get(row1, field); var val2 = _xeUtils.default.get(row2, field); if (eqCellNull(val1) && eqCellNull(val2)) { return true; } if (_xeUtils.default.isString(val1) || _xeUtils.default.isNumber(val1)) { /* eslint-disable eqeqeq */ return val1 == val2; } return _xeUtils.default.isEqual(val1, val2); } function getNextSortOrder(_vm, column) { var orders = _vm.sortOpts.orders; var currOrder = column.order || null; var oIndex = orders.indexOf(currOrder) + 1; return orders[oIndex < orders.length ? oIndex : 0]; } function getCustomStorageMap(key) { var version = _conf.default.version; var rest = _xeUtils.default.toStringJSON(localStorage.getItem(key)); return rest && rest._v === version ? rest : { _v: version }; } function getRecoverRow(_vm, list) { var fullAllDataRowMap = _vm.fullAllDataRowMap; return list.filter(function (row) { return fullAllDataRowMap.has(row); }); } function handleReserveRow(_vm, reserveRowMap) { var fullDataRowIdData = _vm.fullDataRowIdData; var reserveList = []; _xeUtils.default.each(reserveRowMap, function (item, rowid) { if (fullDataRowIdData[rowid] && reserveList.indexOf(fullDataRowIdData[rowid].row) === -1) { reserveList.push(fullDataRowIdData[rowid].row); } }); return reserveList; } function restoreScroll(_vm, scrollLeft, scrollTop) { return _vm.clearScroll().then(function () { if (scrollLeft || scrollTop) { // 重置最后滚动状态 _vm.lastScrollLeft = 0; _vm.lastScrollTop = 0; // 还原滚动状态 return _vm.scrollTo(scrollLeft, scrollTop); } }); } function computeVirtualX(_vm) { var $refs = _vm.$refs, visibleColumn = _vm.visibleColumn; var tableBody = $refs.tableBody; var tableBodyElem = tableBody ? tableBody.$el : null; if (tableBodyElem) { var scrollLeft = tableBodyElem.scrollLeft, clientWidth = tableBodyElem.clientWidth; var endWidth = scrollLeft + clientWidth; var toVisibleIndex = -1; var cWidth = 0; var visibleSize = 0; for (var colIndex = 0, colLen = visibleColumn.length; colIndex < colLen; colIndex++) { cWidth += visibleColumn[colIndex].renderWidth; if (toVisibleIndex === -1 && scrollLeft < cWidth) { toVisibleIndex = colIndex; } if (toVisibleIndex >= 0) { visibleSize++; if (cWidth > endWidth) { break; } } } return { toVisibleIndex: Math.max(0, toVisibleIndex), visibleSize: Math.max(8, visibleSize) }; } return { toVisibleIndex: 0, visibleSize: 8 }; } function computeVirtualY(_vm) { var $refs = _vm.$refs, vSize = _vm.vSize, rowHeightMaps = _vm.rowHeightMaps; var tableHeader = $refs.tableHeader, tableBody = $refs.tableBody; var tableBodyElem = tableBody ? tableBody.$el : null; if (tableBodyElem) { var tableHeaderElem = tableHeader ? tableHeader.$el : null; var rowHeight = 0; var firstTrElem; firstTrElem = tableBodyElem.querySelector('tr'); if (!firstTrElem && tableHeaderElem) { firstTrElem = tableHeaderElem.querySelector('tr'); } if (firstTrElem) { rowHeight = firstTrElem.clientHeight; } if (!rowHeight) { rowHeight = rowHeightMaps[vSize || 'default']; } var visibleSize = Math.max(8, Math.ceil(tableBodyElem.clientHeight / rowHeight) + 2); return { rowHeight: rowHeight, visibleSize: visibleSize }; } return { rowHeight: 0, visibleSize: 8 }; } function calculateMergerOffserIndex(list, offsetItem, type) { for (var mcIndex = 0, len = list.length; mcIndex < len; mcIndex++) { var mergeItem = list[mcIndex]; var startIndex = offsetItem.startIndex, endIndex = offsetItem.endIndex; var mergeStartIndex = mergeItem[type]; var mergeSpanNumber = mergeItem[type + 'span']; var mergeEndIndex = mergeStartIndex + mergeSpanNumber; if (mergeStartIndex < startIndex && startIndex < mergeEndIndex) { offsetItem.startIndex = mergeStartIndex; } if (mergeStartIndex < endIndex && endIndex < mergeEndIndex) { offsetItem.endIndex = mergeEndIndex; } if (offsetItem.startIndex !== startIndex || offsetItem.endIndex !== endIndex) { mcIndex = -1; } } } function setMerges(_vm, merges, mList, rowList) { if (merges) { var treeConfig = _vm.treeConfig, visibleColumn = _vm.visibleColumn; if (treeConfig) { throw new Error(_tools.UtilTools.getLog('vxe.error.noTree', ['merge-footer-items'])); } if (!_xeUtils.default.isArray(merges)) { merges = [merges]; } merges.forEach(function (item) { var row = item.row, col = item.col, rowspan = item.rowspan, colspan = item.colspan; if (rowList && _xeUtils.default.isNumber(row)) { row = rowList[row]; } if (_xeUtils.default.isNumber(col)) { col = visibleColumn[col]; } if ((rowList ? row : _xeUtils.default.isNumber(row)) && col && (rowspan || colspan)) { rowspan = _xeUtils.default.toNumber(rowspan) || 1; colspan = _xeUtils.default.toNumber(colspan) || 1; if (rowspan > 1 || colspan > 1) { var mcIndex = _xeUtils.default.findIndexOf(mList, function (item) { return item._row === row && item._col === col; }); var mergeItem = mList[mcIndex]; if (mergeItem) { mergeItem.rowspan = rowspan; mergeItem.colspan = colspan; mergeItem._rowspan = rowspan; mergeItem._colspan = colspan; } else { var mergeRowIndex = rowList ? rowList.indexOf(row) : row; var mergeColIndex = visibleColumn.indexOf(col); mList.push({ row: mergeRowIndex, col: mergeColIndex, rowspan: rowspan, colspan: colspan, _row: row, _col: col, _rowspan: rowspan, _colspan: colspan }); } } } }); } } function removeMerges(_vm, merges, mList, rowList) { var rest = []; if (merges) { var treeConfig = _vm.treeConfig, visibleColumn = _vm.visibleColumn; if (treeConfig) { throw new Error(_tools.UtilTools.getLog('vxe.error.noTree', ['merge-cells'])); } if (!_xeUtils.default.isArray(merges)) { merges = [merges]; } merges.forEach(function (item) { var row = item.row, col = item.col; if (rowList && _xeUtils.default.isNumber(row)) { row = rowList[row]; } if (_xeUtils.default.isNumber(col)) { col = visibleColumn[col]; } var mcIndex = _xeUtils.default.findIndexOf(mList, function (item) { return item._row === row && item._col === col; }); if (mcIndex > -1) { var rItems = mList.splice(mcIndex, 1); rest.push(rItems[0]); } }); } return rest; } function clearAllSort(_vm) { _vm.tableFullColumn.forEach(function (column) { column.order = null; }); } function getOrderField(_vm, column) { var sortBy = column.sortBy, sortType = column.sortType; return function (row) { var cellValue; if (sortBy) { cellValue = _xeUtils.default.isFunction(sortBy) ? sortBy({ row: row, column: column }) : _xeUtils.default.get(row, sortBy); } else { cellValue = _vm.getCellLabel(row, column); } if (!sortType || sortType === 'auto') { return isNaN(cellValue) ? cellValue : _xeUtils.default.toNumber(cellValue); } else if (sortType === 'number') { return _xeUtils.default.toNumber(cellValue); } else if (sortType === 'string') { return _xeUtils.default.toValueString(cellValue); } return cellValue; }; } var Methods = { callSlot: function callSlot(slotFunc, params, h, vNodes) { if (slotFunc) { var $xegrid = this.$xegrid; if ($xegrid) { return $xegrid.callSlot(slotFunc, params, h, vNodes); } if (_xeUtils.default.isFunction(slotFunc)) { return slotFunc.call(this, params, h, vNodes); } } return []; }, /** * 获取父容器元素 */ getParentElem: function getParentElem() { var $el = this.$el, $xegrid = this.$xegrid; return $xegrid ? $xegrid.$el.parentNode : $el.parentNode; }, /** * 获取父容器的高度 */ getParentHeight: function getParentHeight() { var $el = this.$el, $xegrid = this.$xegrid, height = this.height; var parentElem = $el.parentNode; var parentPaddingSize = height === 'auto' ? (0, _dom.getPaddingTopBottomSize)(parentElem) : 0; return Math.floor($xegrid ? $xegrid.getParentHeight() : _xeUtils.default.toNumber(getComputedStyle(parentElem).height) - parentPaddingSize); }, /** * 获取需要排除的高度 * 但渲染表格高度时,需要排除工具栏或分页等相关组件的高度 * 如果存在表尾合计滚动条,则需要排除滚动条高度 */ getExcludeHeight: function getExcludeHeight() { var $xegrid = this.$xegrid; return $xegrid ? $xegrid.getExcludeHeight() : 0; }, /** * 重置表格的一切数据状态 */ clearAll: function clearAll() { return (0, _util.clearTableAllStatus)(this); }, /** * 同步 data 数据 * 如果用了该方法,那么组件将不再记录增删改的状态,只能自行实现对应逻辑 * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到 */ syncData: function syncData() { var _this = this; return this.$nextTick().then(function () { _this.tableData = []; return _this.$nextTick().then(function () { return _this.loadTableData(_this.tableFullData); }); }); }, /** * 手动处理数据 * 对于手动更改了排序、筛选...等条件后需要重新处理数据时可能会用到 */ updateData: function updateData() { return this.handleTableData(true).then(this.updateFooter).then(this.recalculate); }, handleTableData: function handleTableData(force) { var scrollYLoad = this.scrollYLoad, scrollYStore = this.scrollYStore; var fullData = force ? this.updateAfterFullData() : this.afterFullData; this.tableData = scrollYLoad ? fullData.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullData.slice(0); return this.$nextTick(); }, /** * 加载表格数据 * @param {Array} datas 数据 */ loadTableData: function loadTableData(datas) { var _this2 = this; var keepSource = this.keepSource, treeConfig = this.treeConfig, editStore = this.editStore, sYOpts = this.sYOpts, scrollYStore = this.scrollYStore, scrollXStore = this.scrollXStore, lastScrollLeft = this.lastScrollLeft, lastScrollTop = this.lastScrollTop; var tableFullData = datas ? datas.slice(0) : []; var scrollYLoad = !treeConfig && sYOpts.enabled && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length; scrollYStore.startIndex = 0; scrollYStore.endIndex = 1; scrollXStore.startIndex = 0; scrollXStore.endIndex = 1; editStore.insertList = []; editStore.removeList = []; // 全量数据 this.tableFullData = tableFullData; // 缓存数据 this.updateCache(true); // 原始数据 this.tableSynchData = datas; if (keepSource) { this.tableSourceData = _xeUtils.default.clone(tableFullData, true); } this.scrollYLoad = scrollYLoad; if (process.env.NODE_ENV === 'development') { if (scrollYLoad) { if (!(this.height || this.maxHeight)) { _tools.UtilTools.error('vxe.error.reqProp', ['table.height | table.max-height | table.scroll-y={enabled: false}']); } if (!this.showOverflow) { _tools.UtilTools.warn('vxe.error.reqProp', ['table.show-overflow']); } if (this.spanMethod) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['table.span-method']); } } } if (this.clearCellAreas && this.mouseConfig) { this.clearCellAreas(); this.clearCopyCellArea(); } this.clearMergeCells(); this.clearMergeFooterItems(); this.handleTableData(true); this.updateFooter(); return this.$nextTick().then(function () { _this2.updateHeight(); _this2.updateStyle(); }).then(function () { _this2.computeScrollLoad(); }).then(function () { // 是否加载了数据 if (scrollYLoad) { scrollYStore.endIndex = scrollYStore.visibleSize; } _this2.handleReserveStatus(); _this2.checkSelectionStatus(); return _this2.$nextTick().then(function () { return _this2.recalculate(); }).then(function () { return restoreScroll(_this2, lastScrollLeft, lastScrollTop); }); }); }, /** * 重新加载数据,不会清空表格状态 * @param {Array} datas 数据 */ loadData: function loadData(datas) { var _this3 = this; var inited = this.inited, initStatus = this.initStatus; return this.loadTableData(datas).then(function () { _this3.inited = true; _this3.initStatus = true; if (!initStatus) { _this3.handleLoadDefaults(); } if (!inited) { _this3.handleInitDefaults(); } return _this3.recalculate(); }); }, /** * 重新加载数据,会清空表格状态 * @param {Array} datas 数据 */ reloadData: function reloadData(datas) { var _this4 = this; var inited = this.inited; return this.clearAll().then(function () { _this4.inited = true; _this4.initStatus = true; return _this4.loadTableData(datas); }).then(function () { _this4.handleLoadDefaults(); if (!inited) { _this4.handleInitDefaults(); } return _this4.recalculate(); }); }, /** * 局部加载行数据并恢复到初始状态 * 对于行数据需要局部更改的场景中可能会用到 * @param {Row} row 行对象 * @param {Object} record 新数据 * @param {String} field 字段名 */ reloadRow: function reloadRow(row, record, field) { var keepSource = this.keepSource, tableSourceData = this.tableSourceData, tableData = this.tableData; if (keepSource) { var rowIndex = this.getRowIndex(row); var oRow = tableSourceData[rowIndex]; if (oRow && row) { if (field) { _xeUtils.default.set(oRow, field, _xeUtils.default.get(record || row, field)); } else { if (record) { tableSourceData[rowIndex] = record; _xeUtils.default.clear(row, undefined); Object.assign(row, this.defineField(Object.assign({}, record))); this.updateCache(true); } else { _xeUtils.default.destructuring(oRow, _xeUtils.default.clone(row, true)); } } } this.tableData = tableData.slice(0); } else { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.reqProp', ['keep-source']); } } return this.$nextTick(); }, /** * 加载列配置 * 对于表格列需要重载、局部递增场景下可能会用到 * @param {ColumnInfo} columns 列配置 */ loadColumn: function loadColumn(columns) { var _this5 = this; var collectColumn = _xeUtils.default.mapTree(columns, function (column) { return _cell.default.createColumn(_this5, column); }); this.handleColumn(collectColumn); return this.$nextTick(); }, /** * 加载列配置并恢复到初始状态 * 对于表格列需要重载、局部递增场景下可能会用到 * @param {ColumnInfo} columns 列配置 */ reloadColumn: function reloadColumn(columns) { var _this6 = this; return this.clearAll().then(function () { return _this6.loadColumn(columns); }); }, handleColumn: function handleColumn(collectColumn) { var _this7 = this; this.collectColumn = collectColumn; var tableFullColumn = getColumnList(collectColumn); this.tableFullColumn = tableFullColumn; this.cacheColumnMap(); this.restoreCustomStorage(); this.refreshColumn().then(function () { if (_this7.scrollXLoad) { _this7.loadScrollXData(true); } }); this.clearMergeCells(); this.clearMergeFooterItems(); this.handleTableData(true); if (process.env.NODE_ENV === 'development') { if ((this.scrollXLoad || this.scrollYLoad) && this.expandColumn) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['column.type=expand']); } } this.$nextTick(function () { if (_this7.$toolbar) { _this7.$toolbar.syncUpdate({ collectColumn: collectColumn, $table: _this7 }); } }); }, /** * 更新数据行的 Map * 牺牲数据组装的耗时,用来换取使用过程中的流畅 */ updateCache: function updateCache(source) { var _this8 = this; var treeConfig = this.treeConfig, treeOpts = this.treeOpts, tableFullData = this.tableFullData, fullDataRowMap = this.fullDataRowMap, fullAllDataRowMap = this.fullAllDataRowMap; var fullDataRowIdData = this.fullDataRowIdData, fullAllDataRowIdData = this.fullAllDataRowIdData; var rowkey = getRowkey(this); var isLazy = treeConfig && treeOpts.lazy; var handleCache = function handleCache(row, index, items, path, parent) { var rowid = getRowid(_this8, row); if (!rowid) { rowid = getRowUniqueId(); _xeUtils.default.set(row, rowkey, rowid); } if (isLazy && row[treeOpts.hasChild] && _xeUtils.default.isUndefined(row[treeOpts.children])) { row[treeOpts.children] = null; } var rest = { row: row, rowid: rowid, index: treeConfig && parent ? -1 : index, items: items, parent: parent }; if (source) { fullDataRowIdData[rowid] = rest; fullDataRowMap.set(row, rest); } fullAllDataRowIdData[rowid] = rest; fullAllDataRowMap.set(row, rest); }; if (source) { fullDataRowIdData = this.fullDataRowIdData = {}; fullDataRowMap.clear(); } fullAllDataRowIdData = this.fullAllDataRowIdData = {}; fullAllDataRowMap.clear(); if (treeConfig) { _xeUtils.default.eachTree(tableFullData, handleCache, treeOpts); } else { tableFullData.forEach(handleCache); } }, loadChildren: function loadChildren(row, childRecords) { var _this9 = this; return this.createData(childRecords).then(function (rows) { var keepSource = _this9.keepSource, tableSourceData = _this9.tableSourceData, treeOpts = _this9.treeOpts, fullDataRowIdData = _this9.fullDataRowIdData, fullDataRowMap = _this9.fullDataRowMap, fullAllDataRowMap = _this9.fullAllDataRowMap, fullAllDataRowIdData = _this9.fullAllDataRowIdData; var children = treeOpts.children; if (keepSource) { var rowid = getRowid(_this9, row); var matchObj = _xeUtils.default.findTree(tableSourceData, function (item) { return rowid === getRowid(_this9, item); }, treeOpts); if (matchObj) { matchObj.item[children] = _xeUtils.default.clone(rows, true); } } _xeUtils.default.eachTree(rows, function (childRow, index, items, path, parent) { var rowid = getRowid(_this9, childRow); var rest = { row: childRow, rowid: rowid, index: -1, items: items, parent: parent }; fullDataRowIdData[rowid] = rest; fullDataRowMap.set(childRow, rest); fullAllDataRowIdData[rowid] = rest; fullAllDataRowMap.set(childRow, rest); }, treeOpts); row[children] = rows; return rows; }); }, /** * 更新数据列的 Map * 牺牲数据组装的耗时,用来换取使用过程中的流畅 */ cacheColumnMap: function cacheColumnMap() { var _this10 = this; var tableFullColumn = this.tableFullColumn, collectColumn = this.collectColumn, fullColumnMap = this.fullColumnMap, showOverflow = this.showOverflow; var fullColumnIdData = this.fullColumnIdData = {}; var fullColumnFieldData = this.fullColumnFieldData = {}; var isGroup = collectColumn.some(hasChildrenList); var isAllOverflow = !!showOverflow; var expandColumn; var treeNodeColumn; var checkboxColumn; var radioColumn; var hasFixed; var handleFunc = function handleFunc(column, index, items, path, parent) { var colid = column.id, property = column.property, fixed = column.fixed, type = column.type, treeNode = column.treeNode; var rest = { column: column, colid: colid, index: index, items: items, parent: parent }; if (property) { if (process.env.NODE_ENV === 'development') { if (fullColumnFieldData[property]) { _tools.UtilTools.error('vxe.error.colRepet', ['field', property]); } } fullColumnFieldData[property] = rest; } if (!hasFixed && fixed) { hasFixed = fixed; } if (treeNode) { if (process.env.NODE_ENV === 'development') { if (treeNodeColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['tree-node', treeNode]); } } if (!treeNodeColumn) { treeNodeColumn = column; } } else if (type === 'expand') { if (process.env.NODE_ENV === 'development') { if (expandColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['type', type]); } } if (!expandColumn) { expandColumn = column; } } if (process.env.NODE_ENV === 'development') { if (type === 'checkbox') { if (checkboxColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['type', type]); } if (!checkboxColumn) { checkboxColumn = column; } } else if (type === 'radio') { if (radioColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['type', type]); } if (!radioColumn) { radioColumn = column; } } } if (process.env.NODE_ENV === 'development') { if (_this10.showOverflow && column.showOverflow === false) { _tools.UtilTools.warn('vxe.error.errConflicts', ["table.show-overflow=".concat(_this10.showOverflow), "column.show-overflow=".concat(column.showOverflow)]); } if (_this10.showHeaderOverflow && column.showHeaderOverflow === false) { _tools.UtilTools.warn('vxe.error.errConflicts', ["table.show-header-overflow=".concat(_this10.showHeaderOverflow), "column.show-header-overflow=".concat(column.showHeaderOverflow)]); } if (_this10.showFooterOverflow && column.showFooterOverflow === false) { _tools.UtilTools.warn('vxe.error.errConflicts', ["table.show-footer-overflow=".concat(_this10.showFooterOverflow), "column.show-footer-overflow=".concat(column.showFooterOverflow)]); } } if (isAllOverflow && column.showOverflow === false) { isAllOverflow = false; } if (fullColumnIdData[colid]) { _tools.UtilTools.error('vxe.error.colRepet', ['colId', colid]); } fullColumnIdData[colid] = rest; fullColumnMap.set(column, rest); }; fullColumnMap.clear(); if (isGroup) { _xeUtils.default.eachTree(collectColumn, function (column, index, items, path, parent, nodes) { column.level = nodes.length; handleFunc(column, index, items, path, parent); }); } else { tableFullColumn.forEach(handleFunc); } if (process.env.NODE_ENV === 'development') { if (expandColumn && this.mouseOpts.area) { _tools.UtilTools.error('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand']); } } this.isGroup = isGroup; this.treeNodeColumn = treeNodeColumn; this.expandColumn = expandColumn; this.isAllOverflow = isAllOverflow; }, /** * 根据 tr 元素获取对应的 row 信息 * @param {Element} tr 元素 */ getRowNode: function getRowNode(tr) { if (tr) { var fullAllDataRowIdData = this.fullAllDataRowIdData; var rowid = tr.getAttribute('rowid'); var rest = fullAllDataRowIdData[rowid]; if (rest) { return { rowid: rest.rowid, item: rest.row, index: rest.index, items: rest.items, parent: rest.parent }; } } return null; }, /** * 根据 th/td 元素获取对应的 column 信息 * @param {Element} cell 元素 */ getColumnNode: function getColumnNode(cell) { if (cell) { var fullColumnIdData = this.fullColumnIdData; var colid = cell.getAttribute('colid'); var rest = fullColumnIdData[colid]; if (rest) { return { colid: rest.colid, item: rest.column, index: rest.index, items: rest.items, parent: rest.parent }; } } return null; }, /** * 根据 row 获取相对于 data 中的索引 * @param {Row} row 行对象 */ getRowIndex: function getRowIndex(row) { return this.fullDataRowMap.has(row) ? this.fullDataRowMap.get(row).index : -1; }, /** * 根据 row 获取相对于当前数据中的索引 * @param {Row} row 行对象 */ getVTRowIndex: function getVTRowIndex(row) { return this.afterFullData.indexOf(row); }, // 在 v3 中废弃 _getRowIndex: function _getRowIndex(row) { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.delFunc', ['_getRowIndex', 'getVTRowIndex']); } return this.getVTRowIndex(row); }, /** * 根据 row 获取渲染中的虚拟索引 * @param {Row} row 行对象 */ getVMRowIndex: function getVMRowIndex(row) { return this.tableData.indexOf(row); }, // 在 v3 中废弃 $getRowIndex: function $getRowIndex(row) { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.delFunc', ['$getRowIndex', 'getVMRowIndex']); } return this.getVMRowIndex(row); }, /** * 根据 column 获取相对于 columns 中的索引 * @param {ColumnInfo} column 列配置 */ getColumnIndex: function getColumnIndex(column) { return this.fullColumnMap.has(column) ? this.fullColumnMap.get(column).index : -1; }, /** * 根据 column 获取相对于当前表格列中的索引 * @param {ColumnInfo} column 列配置 */ getVTColumnIndex: function getVTColumnIndex(column) { return this.visibleColumn.indexOf(column); }, // 在 v3 中废弃 _getColumnIndex: function _getColumnIndex(column) { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.delFunc', ['_getColumnIndex', 'getVTColumnIndex']); } return this.getVTColumnIndex(column); }, /** * 根据 column 获取渲染中的虚拟索引 * @param {ColumnInfo} column 列配置 */ getVMColumnIndex: function getVMColumnIndex(column) { return this.tableColumn.indexOf(column); }, // 在 v3 中废弃 $getColumnIndex: function $getColumnIndex(column) { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.delFunc', ['$getColumnIndex', 'getVMColumnIndex']); } return this.getVMColumnIndex(column); }, /** * 判断是否为索引列 * @param {ColumnInfo} column 列配置 */ isSeqColumn: function isSeqColumn(column) { return column && column.type === 'seq'; }, /** * 定义行数据中的列属性,如果不存在则定义 * @param {Row} record 行数据 */ defineField: function defineField(record) { var radioOpts = this.radioOpts, checkboxOpts = this.checkboxOpts, treeConfig = this.treeConfig, treeOpts = this.treeOpts, expandOpts = this.expandOpts; var rowkey = getRowkey(this); this.visibleColumn.forEach(function (_ref) { var property = _ref.property, editRender = _ref.editRender; if (property && !_xeUtils.default.has(record, property)) { _xeUtils.default.set(record, property, editRender && !_xeUtils.default.isUndefined(editRender.defaultValue) ? editRender.defaultValue : null); } }); var ohterFields = [radioOpts.labelField, checkboxOpts.checkField, checkboxOpts.labelField, expandOpts.labelField]; ohterFields.forEach(function (key) { if (key && !_xeUtils.default.get(record, key)) { _xeUtils.default.set(record, key, null); } }); if (treeConfig && treeOpts.lazy && _xeUtils.default.isUndefined(record[treeOpts.children])) { record[treeOpts.children] = null; } // 必须有行数据的唯一主键,可以自行设置;也可以默认生成一个随机数 if (!_xeUtils.default.get(record, rowkey)) { _xeUtils.default.set(record, rowkey, getRowUniqueId()); } return record; }, /** * 创建 data 对象 * 对于某些特殊场景可能会用到,会自动对数据的字段名进行检测,如果不存在就自动定义 * @param {Array} records 新数据 */ createData: function createData(records) { var _this11 = this; var treeConfig = this.treeConfig, treeOpts = this.treeOpts; var handleRrecord = function handleRrecord(record) { return _this11.defineField(Object.assign({}, record)); }; var rows = treeConfig ? _xeUtils.default.mapTree(records, handleRrecord, treeOpts) : records.map(handleRrecord); return this.$nextTick().then(function () { return rows; }); }, /** * 创建 Row|Rows 对象 * 对于某些特殊场景需要对数据进行手动插入时可能会用到 * @param {Array/Object} records 新数据 */ createRow: function createRow(records) { var _this12 = this; var isArr = _xeUtils.default.isArray(records); if (!isArr) { records = [records]; } return this.$nextTick().then(function () { return _this12.createData(records).then(function (rows) { return isArr ? rows : rows[0]; }); }); }, /** * 还原数据 * 如果不传任何参数,则还原整个表格 * 如果传 row 则还原一行 * 如果传 rows 则还原多行 * 如果还额外传了 field 则还原指定的单元格数据 */ revertData: function revertData(rows, field) { var _this13 = this; var keepSource = this.keepSource, tableSourceData = this.tableSourceData, treeConfig = this.treeConfig; if (keepSource) { if (arguments.length) { if (rows && !_xeUtils.default.isArray(rows)) { rows = [rows]; } rows.forEach(function (row) { if (!_this13.isInsertByRow(row)) { var rowIndex = _this13.getRowIndex(row); if (treeConfig && rowIndex === -1) { throw new Error(_tools.UtilTools.getLog('vxe.error.noTree', ['revertData'])); } var oRow = tableSourceData[rowIndex]; if (oRow && row) { if (field) { _xeUtils.default.set(row, field, _xeUtils.default.clone(_xeUtils.default.get(oRow, field), true)); } else { _xeUtils.default.destructuring(row, _xeUtils.default.clone(oRow, true)); } } } }); return this.$nextTick(); } return this.reloadData(tableSourceData); } else { if (process.env.NODE_ENV === 'development') { _tools.UtilTools.warn('vxe.error.reqProp', ['keep-source']); } } return this.$nextTick(); }, /** * 清空单元格内容 * 如果不创参数,则清空整个表格内容 * 如果传 row 则清空一行内容 * 如果传 rows 则清空多行内容 * 如果还额外传了 field 则清空指定单元格内容 * @param {Array/Row} rows 行数据 * @param {String} field 字段名 */ clearData: function clearData(rows, field) { var tableFullData = this.tableFullData, visibleColumn = this.visibleColumn; if (!arguments.length) { rows = tableFullData; } else if (rows && !_xeUtils.default.isArray(rows)) { rows = [rows]; } if (field) { rows.forEach(function (row) { return _xeUtils.default.set(row, field, null); }); } else { rows.forEach(function (row) { visibleColumn.forEach(function (column) { if (column.property) { setCellValue(row, column, null); } }); }); } return this.$nextTick(); }, /** * 检查是否为临时行数据 * @param {Row} row 行对象 */ isInsertByRow: function isInsertByRow(row) { return this.editStore.insertList.indexOf(row) > -1; }, /** * 检查行或列数据是否发生改变 * @param {Row} row 行对象 * @param {String} field 字段名 */ isUpdateByRow: function isUpdateByRow(row, field) { var _this14 = this; var visibleColumn = this.visibleColumn, keepSource = this.keepSource, treeConfig = this.treeConfig, treeOpts = this.treeOpts, tableSourceData = this.tableSourceData, fullDataRowIdData = this.fullDataRowIdData; if (keepSource) { var oRow, property; var rowid = getRowid(this, row); // 新增的数据不需要检测 if (!fullDataRowIdData[rowid]) { return false; } if (treeConfig) { var children = treeOpts.children; var matchObj = _xeUtils.default.findTree(tableSourceData, function (item) { return rowid === getRowid(_this14, item); }, treeOpts); row = Object.assign({}, row, _defineProperty({}, children, null)); if (matchObj) { oRow = Object.assign({}, matchObj.item, _defineProperty({}, children, null)); } } else { var oRowIndex = fullDataRowIdData[rowid].index; oRow = tableSourceData[oRowIndex]; } if (oRow) { if (arguments.length > 1) { return !eqCellValue(oRow, row, field); } for (var index = 0, len = visibleColumn.length; index < len; index++) { property = visibleColumn[index].property; if (property && !eqCellValue(oRow, row, property)) { return true; } } } } return false; }, /** * 获取表格的可视列,也可以指定索引获取列 * @param {Number} columnIndex 索引 */ getColumns: function getColumns(columnIndex) { var columns = this.visibleColumn; return _xeUtils.default.isUndefined(columnIndex) ? columns.slice(0) : columns[columnIndex]; }, /** * 根据列的唯一主键获取列 * @param {String} colid 列主键 */ getColumnById: function getColumnById(colid) { var fullColumnIdData = this.fullColumnIdData; return fullColumnIdData[colid] ? fullColumnIdData[colid].column : null; }, /** * 根据列的字段名获取列 * @param {String} field 字段名 */ getColumnByField: function getColumnByField(field) { var fullColumnFieldData = this.fullColumnFieldData; return fullColumnFieldData[field] ? fullColumnFieldData[field].column : null; }, /** * 获取当前表格的列 * 收集到的全量列、全量表头列、处理条件之后的全量表头列、当前渲染中的表头列 */ getTableColumn: function getTableColumn() { return { collectColumn: this.collectColumn.slice(0), fullColumn: this.tableFullColumn.slice(0), visibleColumn: this.visibleColumn.slice(0), tableColumn: this.tableColumn.slice(0) }; }, /** * 获取数据,和 data 的行为一致,也可以指定索引获取数据 */ getData: function getData(rowIndex) { var tableSynchData = this.data || this.tableSynchData; return _xeUtils.default.isUndefined(rowIndex) ? tableSynchData.slice(0) : tableSynchData[rowIndex]; }, /** * 用于多选行,获取已选中的数据 */ getCheckboxRecords: function getCheckboxRecords() { var tableFullData = this.tableFullData, treeConfig = this.treeConfig, treeOpts = this.treeOpts, checkboxOpts = this.checkboxOpts; var property = checkboxOpts.checkField; var rowList = []; if (property) { if (treeConfig) { rowList = _xeUtils.default.filterTree(tableFullData, function (row) { return _xeUtils.default.get(row, property); }, treeOpts); } else { rowList = tableFullData.filter(function (row) { return _xeUtils.default.get(row, property); }); } } else { var selection = this.selection; if (treeConfig) { rowList = _xeUtils.default.filterTree(tableFullData, function (row) { return selection.indexOf(row) > -1; }, treeOpts); } else { rowList = tableFullData.filter(function (row) { return selection.indexOf(row) > -1; }); } } return rowList; }, /** * 获取处理后全量的表格数据 * 如果存在筛选条件,继续处理 */ updateAfterFullData: function updateAfterFullData() { var _this15 = this; var visibleColumn = this.visibleColumn, tableFullData = this.tableFullData, filterOpts = this.filterOpts, sortOpts = this.sortOpts; var allRemoteFilter = filterOpts.remote, allFilterMethod = filterOpts.filterMethod; var allRemoteSort = sortOpts.remote, allSortMethod = sortOpts.sortMethod, sortMultiple = sortOpts.multiple; var tableData = tableFullData.slice(0); var filterColumns = []; var orderColumns = []; visibleColumn.forEach(function (column) { var sortable = column.sortable, order = column.order, filters = column.filters; if (!allRemoteFilter && filters && filters.length) { var valueList = []; var itemList = []; filters.forEach(function (item) { if (item.checked) { itemList.push(item); valueList.push(item.value); } }); if (itemList.length) { filterColumns.push({ column: column, valueList: valueList, itemList: itemList }); } } if (!allRemoteSort && sortable && order) { orderColumns.push({ column: column, property: column.property, order: order }); } }); if (filterColumns.length) { tableData = tableData.filter(function (row) { return filterColumns.every(function (_ref2) { var column = _ref2.column, valueList = _ref2.valueList, itemList = _ref2.itemList; if (valueList.length && !allRemoteFilter) { var filterMethod = column.filterMethod, filterRender = column.filterRender; var compConf = filterRender ? _vXETable.default.renderer.get(filterRender.name) : null; var compFilterMethod = compConf && compConf.renderFilter ? compConf.filterMethod : null; var cellValue = _tools.UtilTools.getCellValue(row, column); if (filterMethod) { return itemList.some(function (item) { return filterMethod({ value: item.value, option: item, cellValue: cellValue, row: row, column: column, $table: _this15 }); }); } else if (compFilterMethod) { return itemList.some(function (item) { return compFilterMethod({ value: item.value, option: item, cellValue: cellValue, row: row, column: column, $table: _this15 }); }); } else if (allFilterMethod) { return allFilterMethod({ options: itemList, values: valueList, cellValue: cellValue, row: row, column: column }); } return valueList.indexOf(_xeUtils.default.get(row, column.property)) > -1; } return true; }); }); } var firstOrderColumn = orderColumns[0]; if (!allRemoteSort && firstOrderColumn) { if (allSortMethod) { var sortRests = allSortMethod({ data: tableData, column: firstOrderColumn.column, property: firstOrderColumn.property, order: firstOrderColumn.order, sortList: orderColumns, $table: this }); tableData = _xeUtils.default.isArray(sortRests) ? sortRests : tableData; } else { // 兼容 v4 if (sortMultiple) { tableData = _xeUtils.default.orderBy(tableData, orderColumns.map(function (_ref3) { var column = _ref3.column, order = _ref3.order; return [getOrderField(_this15, column), order]; })); } else { // 兼容 v2,在 v4 中废弃, sortBy 不能为数组 var sortByConfs; if (_xeUtils.default.isArray(firstOrderColumn.sortBy)) { sortByConfs = firstOrderColumn.sortBy.map(function (item) { return [item, firstOrderColumn.order]; }); } tableData = _xeUtils.default.orderBy(tableData, sortByConfs || [firstOrderColumn].map(function (_ref4) { var column = _ref4.column, order = _ref4.order; return [getOrderField(_this15, column), order]; })); } } } this.afterFullData = tableData; return tableData; }, /** * 根据行的唯一主键获取行 * @param {String/Number} rowid 行主键 */ getRowById: function getRowById(rowid) { var fullDataRowIdData = this.fullDataRowIdData; return fullDataRowIdData[rowid] ? fullDataRowIdData[rowid].row : null; }, /** * 根据行获取行的唯一主键 * @param {Row} row 行对象 */ getRowid: function getRowid(row) { var fullAllDataRowMap = this.fullAllDataRowMap; return fullAllDataRowMap.has(row) ? fullAllDataRowMap.get(row).rowid : null; }, /** * 获取处理后的表格数据 * 如果存在筛选条件,继续处理 * 如果存在排序,继续处理 */ getTableData: function getTableData() { var tableFullData = this.tableFullData, afterFullData = this.afterFullData, tableData = this.tableData, footerTableData = this.footerTableData; return { fullData: tableFullData.slice(0), visibleData: afterFullData.slice(0), tableData: tableData.slice(0), footerData: footerTableData.slice(0) }; }, /** * 处理数据加载默认行为 * 默认执行一次,除非被重置 */ handleLoadDefaults: function handleLoadDefaults() { var _this16 = this; if (this.checkboxConfig) { this.handleDefaultSelectionChecked(); } if (this.radioConfig) { this.handleDefaultRadioChecked(); } if (this.expandConfig) { this.handleDefaultRowExpand(); } if (this.treeConfig) { this.handleDefaultTreeExpand(); } if (this.mergeCells) { this.handleDefaultMergeCells(); } if (this.mergeFooterItems) { this.handleDefaultMergeFooterItems(); } this.$nextTick(function () { return setTimeout(_this16.recalculate); }); }, /** * 处理初始化的默认行为 * 只会执行一次 */ handleInitDefaults: function handleInitDefaults() { var sortConfig = this.sortConfig; if (sortConfig) { this.handleDefaultSort(); } }, /** * 隐藏指定列 */ hideColumn: function hideColumn(fieldOrColumn) { var column = (0, _util.handleFieldOrColumn)(this, fieldOrColumn); if (column) { column.visible = false; } return this.handleCustom(); }, /** * 显示指定列 */ showColumn: function showColumn(fieldOrColumn) { var column = (0, _util.handleFieldOrColumn)(this, fieldOrColumn); if (column) { column.visible = true; } return this.handleCustom(); }, /** * 手动重置列的显示隐藏、列宽拖动的状态; * 如果为 true 则重置所有状态 * 如果已关联工具栏,则会同步更新 */ resetColumn: function resetColumn(options) { var customOpts = this.customOpts; var checkMethod = customOpts.checkMethod; var opts = Object.assign({ visible: true, resizable: options === true }, options); this.tableFullColumn.forEach(function (column) { if (opts.resizable) { column.resizeWidth = 0; } if (!checkMethod || checkMethod({ column: column })) { column.visible = column.defaultVisible; } }); if (opts.resizable) { this.saveCustomResizable(true); } return this.handleCustom(); }, handleCustom: function handleCustom() { this.saveCustomVisible(); this.analyColumnWidth(); return this.refreshColumn(); }, /** * 还原自定义列操作状态 */ restoreCustomStorage: function restoreCustomStorage() { var id = this.id, collectColumn = this.collectColumn, customConfig = this.customConfig, customOpts = this.customOpts; var storage = customOpts.storage; var isAllStorage = customOpts.storage === true; var isResizable = isAllStorage || storage && storage.resizable; var isVisible = isAllStorage || storage && storage.visible; if (customConfig && (isResizable || isVisible)) { var customMap = {}; if (!id) { _tools.UtilTools.error('vxe.error.reqProp', ['id']); return; } if (isResizable) { var columnWidthStorage = getCustomStorageMap(resizableStorageKey)[id]; if (columnWidthStorage) { _xeUtils.default.each(columnWidthStorage, function (resizeWidth, field) { customMap[field] = { field: field, resizeWidth: resizeWidth }; }); } } if (isVisible) { var columnVisibleStorage = getCustomStorageMap(visibleStorageKey)[id]; if (columnVisibleStorage) { var colVisibles = columnVisibleStorage.split('|'); var colHides = colVisibles[0] ? colVisibles[0].split(',') : []; var colShows = colVisibles[1] ? colVisibles[1].split(',') : []; colHides.forEach(function (field) { if (customMap[field]) { customMap[field].visible = false; } else { customMap[field] = { field: field, visible: false }; } }); colShows.forEach(function (field) { if (customMap[field]) { customMap[field].visible = true; } else { customMap[field] = { field: field, visible: true }; } }); } } var keyMap = {}; _xeUtils.default.eachTree(collectColumn, function (column) { var colKey = column.getKey(); if (colKey) { keyMap[colKey] = column; } }); _xeUtils.default.each(customMap, function (_ref5, field) { var visible = _ref5.visible, resizeWidth = _ref5.resizeWidth; var column = keyMap[field]; if (column) { if (_xeUtils.default.isNumber(resizeWidth)) { column.resizeWidth = resizeWidth; } if (_xeUtils.default.isBoolean(visible)) { column.visible = visible; } } }); } }, saveCustomVisible: function saveCustomVisible() { var id = this.id, collectColumn = this.collectColumn, customConfig = this.customConfig, customOpts = this.customOpts; var checkMethod = customOpts.checkMethod, storage = customOpts.storage; var isAllStorage = customOpts.storage === true; var isVisible = isAllStorage || storage && storage.visible; if (customConfig && isVisible) { var columnVisibleStorageMap = getCustomStorageMap(visibleStorageKey); var colHides = []; var colShows = []; if (!id) { _tools.UtilTools.error('vxe.error.reqProp', ['id']); return; } _xeUtils.default.