UNPKG

vxe-table

Version:

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

1,839 lines (1,549 loc) 169 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ctor = _interopRequireDefault(require("xe-utils/ctor")); var _conf = _interopRequireDefault(require("../../conf")); var _cell = _interopRequireDefault(require("./cell")); var _vXETable = _interopRequireDefault(require("../../v-x-e-table")); var _tools = require("../../tools"); var _util = require("./util"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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, getCellLabel = _tools.UtilTools.getCellLabel, hasChildrenList = _tools.UtilTools.hasChildrenList, getColumnList = _tools.UtilTools.getColumnList; var browse = _tools.DomTools.browse, calcHeight = _tools.DomTools.calcHeight, hasClass = _tools.DomTools.hasClass, addClass = _tools.DomTools.addClass, removeClass = _tools.DomTools.removeClass, getEventTargetNode = _tools.DomTools.getEventTargetNode; var isWebkit = browse['-webkit'] && !browse.edge; var debounceScrollYDuration = browse.msie ? 40 : 20; var resizableStorageKey = 'VXE_TABLE_CUSTOM_COLUMN_WIDTH'; var visibleStorageKey = 'VXE_TABLE_CUSTOM_COLUMN_VISIBLE'; /** * 生成行的唯一主键 */ function getRowUniqueId() { return _ctor.default.uniqueId('row_'); } /** * 单元格的值为:'' | null | undefined 时都属于空值 */ function eqCellNull(cellValue) { return cellValue === '' || _ctor.default.eqNull(cellValue); } function eqCellValue(row1, row2, field) { var val1 = _ctor.default.get(row1, field); var val2 = _ctor.default.get(row2, field); if (eqCellNull(val1) && eqCellNull(val2)) { return true; } if (_ctor.default.isString(val1) || _ctor.default.isNumber(val1)) { /* eslint-disable eqeqeq */ return val1 == val2; } return _ctor.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 = _ctor.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 = []; _ctor.default.each(reserveRowMap, function (item, rowid) { if (fullDataRowIdData[rowid] && reserveList.indexOf(fullDataRowIdData[rowid].row) === -1) { reserveList.push(fullDataRowIdData[rowid].row); } }); return reserveList; } 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 (!_ctor.default.isArray(merges)) { merges = [merges]; } merges.forEach(function (item) { var row = item.row, col = item.col, rowspan = item.rowspan, colspan = item.colspan; if (rowList && _ctor.default.isNumber(row)) { row = rowList[row]; } if (_ctor.default.isNumber(col)) { col = visibleColumn[col]; } if ((rowList ? row : _ctor.default.isNumber(row)) && col && (rowspan || colspan)) { rowspan = _ctor.default.toNumber(rowspan) || 1; colspan = _ctor.default.toNumber(colspan) || 1; if (rowspan > 1 || colspan > 1) { var mcIndex = _ctor.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 (!_ctor.default.isArray(merges)) { merges = [merges]; } merges.forEach(function (item) { var row = item.row, col = item.col; if (rowList && _ctor.default.isNumber(row)) { row = rowList[row]; } if (_ctor.default.isNumber(col)) { col = visibleColumn[col]; } var mcIndex = _ctor.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; }); } var Methods = { /** * 获取父容器元素 */ getParentElem: function getParentElem() { return this.$xegrid ? this.$xegrid.$el.parentNode : this.$el.parentNode; }, /** * 获取父容器的高度 */ getParentHeight: function getParentHeight() { return this.$xegrid ? this.$xegrid.getParentHeight() : this.getParentElem().clientHeight; }, /** * 获取需要排除的高度 * 但渲染表格高度时,需要排除工具栏或分页等相关组件的高度 * 如果存在表尾合计滚动条,则需要排除滚动条高度 */ getExcludeHeight: function getExcludeHeight() { return this.$xegrid ? this.$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; var tableFullData = datas ? datas.slice(0) : []; var scrollYLoad = !treeConfig && 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 = _ctor.default.clone(tableFullData, true); } this.scrollYLoad = scrollYLoad; if (scrollYLoad) { if (!(this.height || this.maxHeight)) { _tools.UtilTools.error('vxe.error.reqProp', ['height | max-height']); } if (!this.showOverflow) { _tools.UtilTools.warn('vxe.error.reqProp', ['show-overflow']); } if (this.spanMethod) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['span-method']); } } this.clearMergeCells(); this.clearMergeFooterItems(); this.handleTableData(true); this.updateFooter(); return this.computeScrollLoad().then(function () { // 是否加载了数据 if (scrollYLoad) { scrollYStore.endIndex = scrollYStore.visibleSize; } _this2.handleReserveStatus(); _this2.checkSelectionStatus(); return _this2.$nextTick().then(function () { return _this2.recalculate(); }).then(function () { return _this2.refreshScroll(); }); }); }, /** * 重新加载数据,不会清空表格状态 * @param {Array} datas 数据 */ loadData: function loadData(datas) { var _this3 = this; return this.loadTableData(datas).then(function () { if (!_this3.inited) { _this3.inited = true; _this3.handleDefaults(); } _this3.recalculate(); }); }, /** * 重新加载数据,会清空表格状态 * @param {Array} datas 数据 */ reloadData: function reloadData(datas) { var _this4 = this; return this.clearAll().then(function () { _this4.inited = true; return _this4.loadTableData(datas); }).then(this.handleDefaults); }, /** * 局部加载行数据并恢复到初始状态 * 对于行数据需要局部更改的场景中可能会用到 * @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) { _ctor.default.set(oRow, field, _ctor.default.get(record || row, field)); } else { if (record) { tableSourceData[rowIndex] = record; _ctor.default.clear(row, undefined); Object.assign(row, this.defineField(Object.assign({}, record))); this.updateCache(true); } else { _ctor.default.destructuring(oRow, _ctor.default.clone(row, true)); } } } this.tableData = tableData.slice(0); } else { _tools.UtilTools.warn('vxe.error.reqProp', ['keep-source']); } return this.$nextTick(); }, /** * 加载列配置 * 对于表格列需要重载、局部递增场景下可能会用到 * @param {ColumnInfo} columns 列配置 */ loadColumn: function loadColumn(columns) { var _this5 = this; var collectColumn = _ctor.default.mapTree(columns, function (column) { return _cell.default.createColumn(_this5, column); }); this.handleColumn(collectColumn); return this.$nextTick(); }, /** * 加载列配置并恢复到初始状态 * 对于表格列需要重载、局部递增场景下可能会用到 * @param {ColumnInfo} columns 列配置 */ reloadColumn: function reloadColumn(columns) { this.clearAll(); return this.loadColumn(columns); }, handleColumn: function handleColumn(collectColumn) { var _this6 = this; this.collectColumn = collectColumn; var tableFullColumn = getColumnList(collectColumn); this.tableFullColumn = tableFullColumn; this.cacheColumnMap(); this.restoreCustomStorage(); this.refreshColumn().then(function () { if (_this6.scrollXLoad) { _this6.loadScrollXData(true); } }); this.clearMergeCells(); this.clearMergeFooterItems(); this.handleTableData(true); if ((this.scrollXLoad || this.scrollYLoad) && this.expandColumn) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['column.type=expand']); } this.$nextTick(function () { if (_this6.$toolbar) { _this6.$toolbar.syncUpdate({ collectColumn: collectColumn, $table: _this6 }); } }); }, /** * 更新数据行的 Map * 牺牲数据组装的耗时,用来换取使用过程中的流畅 */ updateCache: function updateCache(source) { var _this7 = 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(_this7, row); if (!rowid) { rowid = getRowUniqueId(); _ctor.default.set(row, rowkey, rowid); } if (isLazy && row[treeOpts.hasChild] && _ctor.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) { _ctor.default.eachTree(tableFullData, handleCache, treeOpts); } else { tableFullData.forEach(handleCache); } }, appendTreeCache: function appendTreeCache(row, childs) { var _this8 = this; var keepSource = this.keepSource, tableSourceData = this.tableSourceData, treeOpts = this.treeOpts, fullDataRowIdData = this.fullDataRowIdData, fullDataRowMap = this.fullDataRowMap, fullAllDataRowMap = this.fullAllDataRowMap, fullAllDataRowIdData = this.fullAllDataRowIdData; var children = treeOpts.children, hasChild = treeOpts.hasChild; var rowkey = getRowkey(this); var rowid = getRowid(this, row); var matchObj; if (keepSource) { matchObj = _ctor.default.findTree(tableSourceData, function (item) { return rowid === getRowid(_this8, item); }, treeOpts); } _ctor.default.eachTree(childs, function (row, index, items, path, parent) { var rowid = getRowid(_this8, row); if (!rowid) { rowid = getRowUniqueId(); _ctor.default.set(row, rowkey, rowid); } if (row[hasChild] && _ctor.default.isUndefined(row[children])) { row[children] = null; } var rest = { row: row, rowid: rowid, index: -1, items: items, parent: parent }; fullDataRowIdData[rowid] = rest; fullDataRowMap.set(row, rest); fullAllDataRowIdData[rowid] = rest; fullAllDataRowMap.set(row, rest); }, treeOpts); if (matchObj) { matchObj.item[children] = _ctor.default.clone(childs, true); } }, /** * 更新数据列的 Map * 牺牲数据组装的耗时,用来换取使用过程中的流畅 */ cacheColumnMap: function cacheColumnMap() { var tableFullColumn = this.tableFullColumn, collectColumn = this.collectColumn, fullColumnMap = this.fullColumnMap; var fullColumnIdData = this.fullColumnIdData = {}; var fullColumnFieldData = this.fullColumnFieldData = {}; var isGroup = collectColumn.some(hasChildrenList); 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 (fullColumnFieldData[property]) { _tools.UtilTools.error('vxe.error.colRepet', ['field', property]); } fullColumnFieldData[property] = rest; } if (!hasFixed && fixed) { hasFixed = fixed; } if (treeNode) { if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') { if (treeNodeColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['tree-node', treeNode]); } } if (!treeNodeColumn) { treeNodeColumn = column; } } else if (type === 'expand') { if (process.env.VUE_APP_VXE_TABLE_ENV === 'development') { if (expandColumn) { _tools.UtilTools.warn('vxe.error.colRepet', ['type', type]); } } if (!expandColumn) { expandColumn = column; } } if (process.env.VUE_APP_VXE_TABLE_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 (fullColumnIdData[colid]) { _tools.UtilTools.error('vxe.error.colRepet', ['colId', colid]); } fullColumnIdData[colid] = rest; fullColumnMap.set(column, rest); }; fullColumnMap.clear(); if (isGroup) { _ctor.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 (expandColumn && hasFixed) { _tools.UtilTools.warn('vxe.error.errConflicts', ['column.fixed', 'column.type=expand']); } 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; }, /** * 根据 tr 元素获取对应的 row 信息 * @param {Element} tr 元素 */ getRowNode: function getRowNode(tr) { if (tr) { var fullAllDataRowIdData = this.fullAllDataRowIdData; var rowid = tr.getAttribute('data-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('data-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.VUE_APP_VXE_TABLE_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.VUE_APP_VXE_TABLE_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.VUE_APP_VXE_TABLE_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.VUE_APP_VXE_TABLE_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 && !_ctor.default.has(record, property)) { _ctor.default.set(record, property, editRender && !_ctor.default.isUndefined(editRender.defaultValue) ? editRender.defaultValue : null); } }); var ohterFields = [radioOpts.labelField, checkboxOpts.checkField, checkboxOpts.labelField, expandOpts.labelField]; ohterFields.forEach(function (key) { if (key && !_ctor.default.get(record, key)) { _ctor.default.set(record, key, null); } }); if (treeConfig && treeOpts.lazy && _ctor.default.isUndefined(record[treeOpts.children])) { record[treeOpts.children] = null; } // 必须有行数据的唯一主键,可以自行设置;也可以默认生成一个随机数 if (!_ctor.default.get(record, rowkey)) { _ctor.default.set(record, rowkey, getRowUniqueId()); } return record; }, /** * 创建 data 对象 * 对于某些特殊场景可能会用到,会自动对数据的字段名进行检测,如果不存在就自动定义 * @param {Array} records 新数据 */ createData: function createData(records) { var _this9 = this; var rowkey = getRowkey(this); var rows = records.map(function (record) { return _this9.defineField(Object.assign({}, record, _defineProperty({}, rowkey, null))); }); return this.$nextTick().then(function () { return rows; }); }, /** * 创建 Row|Rows 对象 * 对于某些特殊场景需要对数据进行手动插入时可能会用到 * @param {Array/Object} records 新数据 */ createRow: function createRow(records) { var _this10 = this; var isArr = _ctor.default.isArray(records); if (!isArr) { records = [records]; } return this.$nextTick().then(function () { return _this10.createData(records).then(function (rows) { return isArr ? rows : rows[0]; }); }); }, /** * 还原数据 * 如果不传任何参数,则还原整个表格 * 如果传 row 则还原一行 * 如果传 rows 则还原多行 * 如果还额外传了 field 则还原指定的单元格数据 */ revertData: function revertData(rows, field) { var _this11 = this; var keepSource = this.keepSource, tableSourceData = this.tableSourceData, treeConfig = this.treeConfig; if (keepSource) { if (arguments.length) { if (rows && !_ctor.default.isArray(rows)) { rows = [rows]; } rows.forEach(function (row) { if (!_this11.isInsertByRow(row)) { var rowIndex = _this11.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) { _ctor.default.set(row, field, _ctor.default.clone(_ctor.default.get(oRow, field), true)); } else { _ctor.default.destructuring(row, _ctor.default.clone(oRow, true)); } } } }); return this.$nextTick(); } return this.reloadData(tableSourceData); } else { _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 && !_ctor.default.isArray(rows)) { rows = [rows]; } if (field) { rows.forEach(function (row) { return _ctor.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 _this12 = 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 = _ctor.default.findTree(tableSourceData, function (item) { return rowid === getRowid(_this12, 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 arguments.length ? columns[columnIndex] : columns.slice(0); }, /** * 根据列的唯一主键获取列 * @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 arguments.length ? tableSynchData[rowIndex] : tableSynchData.slice(0); }, /** * 用于多选行,获取已选中的数据 */ 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 = _ctor.default.filterTree(tableFullData, function (row) { return _ctor.default.get(row, property); }, treeOpts); } else { rowList = tableFullData.filter(function (row) { return _ctor.default.get(row, property); }); } } else { var selection = this.selection; if (treeConfig) { rowList = _ctor.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 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, sortBy: column.sortBy, 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 filterRender = column.filterRender, property = column.property; var filterMethod = column.filterMethod; var compConf = filterRender ? _vXETable.default.renderer.get(filterRender.name) : null; if (!filterMethod && compConf && compConf.renderFilter) { filterMethod = compConf.filterMethod; } if (allFilterMethod && !filterMethod) { return allFilterMethod({ options: itemList, values: valueList, row: row, column: column }); } return filterMethod ? itemList.some(function (item) { return filterMethod({ value: item.value, option: item, row: row, column: column }); }) : valueList.indexOf(_ctor.default.get(row, 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 = _ctor.default.isArray(sortRests) ? sortRests : tableData; } else { var params = { $table: this }; // 兼容 v4 if (sortMultiple) { tableData = _ctor.default.orderBy(tableData, orderColumns.map(function (_ref3) { var column = _ref3.column, property = _ref3.property, order = _ref3.order; return { field: (column.sortBy ? _ctor.default.isArray(column.sortBy) ? column.sortBy[0] : column.sortBy : null) || (column.formatter ? function (row) { return getCellLabel(row, column, params); } : property), order: order }; })); } else { // 兼容 v2,在 v4 中废弃, sortBy 不能为数组 var sortByConfs; if (firstOrderColumn.sortBy) { sortByConfs = (_ctor.default.isArray(firstOrderColumn.sortBy) ? firstOrderColumn.sortBy : [firstOrderColumn.sortBy]).map(function (item) { return { field: item, order: firstOrderColumn.order }; }); } tableData = _ctor.default.orderBy(tableData, sortByConfs || [firstOrderColumn].map(function (_ref4) { var column = _ref4.column, property = _ref4.property, order = _ref4.order; return { field: column.formatter ? function (row) { return getCellLabel(row, column, params); } : property, order: 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, footerData = this.footerData; return { fullData: tableFullData.slice(0), visibleData: afterFullData.slice(0), tableData: tableData.slice(0), footerData: footerData.slice(0) }; }, /** * 默认行为只允许执行一次,除非被重置 */ handleDefaults: function handleDefaults() { var _this13 = this; if (this.checkboxConfig) { this.handleDefaultSelectionChecked(); } if (this.radioConfig) { this.handleDefaultRadioChecked(); } if (this.sortConfig) { this.handleDefaultSort(); } if (this.expandConfig) { this.handleDefaultRowExpand(); } if (this.treeConfig) { this.handleDefaultTreeExpand(); } if (this.mergeCells) { this.handleDefaultMergeCells(); } if (this.mergeFooterItems) { this.handleDefaultMergeFooterItems(); } this.$nextTick(function () { return requestAnimationFrame(_this13.recalculate); }); }, /** * 隐藏指定列 * @param {ColumnInfo} column 列配置 */ hideColumn: function hideColumn(column) { column.visible = false; return this.handleCustom(); }, /** * 显示指定列 * @param {ColumnInfo} column 列配置 */ showColumn: function showColumn(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) { _ctor.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 = {}; _ctor.default.eachTree(collectColumn, function (column) { var colKey = column.getKey(); if (colKey) { keyMap[colKey] = column; } }); _ctor.default.each(customMap, function (_ref5, field) { var visible = _ref5.visible, resizeWidth = _ref5.resizeWidth; var column = keyMap[field]; if (column) { if (_ctor.default.isNumber(resizeWidth)) { column.resizeWidth = resizeWidth; } if (_ctor.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; } _ctor.default.eachTree(collectColumn, function (column) { if (!checkMethod || checkMethod({ column: column })) { if (!column.visible && column.defaultVisible) { var colKey = column.getKey(); if (colKey) { colHides.push(colKey); } } else if (column.visible && !column.defaultVisible) { var _colKey = column.getKey(); if (_colKey) { colShows.push(_colKey); } } } }); columnVisibleStorageMap[id] = [colHides.join(',')].concat(colShows.length ? [colShows.join(',')] : []).join('|') || undefined; localStorage.setItem(visibleStorageKey, _ctor.default.toJSONString(columnVisibleStorageMap)); } }, saveCustomResizable: function saveCustomResizable(isReset) { 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; if (customConfig && isResizable) { var columnWidthStorageMap = getCustomStorageMap(resizableStorageKey); var columnWidthStorage; if (!id) { _tools.UtilTools.error('vxe.error.reqProp', ['id']); return; } if (!isReset) { columnWidthStorage = _ctor.default.isPlainObject(columnWidthStorageMap[id]) ? columnWidthStorageMap[id] : {}; _ctor.default.eachTree(collectColumn, function (column) { if (column.resizeWidth) { var colKey = column.getKey(); if (colKey) { columnWidthStorage[colKey] = column.renderWidth; } } }); } columnWidthStorageMap[id] = _ctor.default.isEmpty(columnWidthStorage) ? undefined : columnWidthStorage; localStorage.setItem(resizableStorageKey, _ctor.default.toJSONString(columnWidthStorageMap)); } }, /** * 刷新列信息 * 将固定的列左边、右边分别靠边 */ refreshColumn: function refreshColumn() { var _this14 = this; var leftList = []; var centerList = []; var rightList = []; var collectColumn = this.collectColumn, tableFullColumn = this.tableFullColumn, isGroup = this.isGroup, columnStore = this.columnStore, sXOpts = this.sXOpts, scrollXStore = this.scrollXStore; // 如果是分组表头,如果子列全部被隐藏,则根列也隐藏 if (isGroup) { var leftGroupList = []; var centerGroupList = []; var rightGroupList = []; _ctor.default.eachTree(collectColumn, function (column, index, items, path, parent) { var isColGroup = hasChildrenList(column); // 如果是分组,必须按组设置固定列,不允许给子列设置固定 if (parent && parent.fixed) { column.fixed = parent.fixed; } if (parent && column.fixed !== parent.fixed) { _tools.UtilTools.error('vxe.error.groupFixed'); } if (isColGroup) { column.visible = !!_ctor.default.findTree(column.children, function (subColumn) { return hasChildrenList(subColumn) ? null : subColumn.visible; }); } else if (column.visible) { if (column.fixed === 'left') { leftList.push(column); } else if (column.fixed === 'right') { rightList.push(column); } else { centerList.push(column); } } }); collectColumn.forEach(function (column) { if (column.visible) { if (column.fixed === 'left') { leftGroupList.push(column); } else if (column.fixed === 'right') { rightGroupList.push(column); } else { centerGroupList.push(column); } } }); this.tableGroupColumn = leftGroupList.concat(centerGroupList).concat(rightGroupList); } else { // 重新分配列 tableFullColumn.forEach(function (column) { if (column.visible) { if (column.fixed === 'left') { leftList.push(column); } else if (column.fixed === 'right') { rightList.push(column); } else { centerList.push(column); } } }); } var visibleColumn = leftList.concat(centerList).concat(rightList); var scrollXLoad = sXOpts.gt > -1 && sXOpts.gt < tableFullColumn.length; Object.assign(columnStore, { leftList: leftList, centerList: centerList, rightList: rightList }); if (scrollXLoad && isGroup) { scrollXLoad = false; _tools.UtilTools.warn('vxe.error.scrollXNotGroup'); } if (scrollXLoad) { if (this.showHeader && !this.showHeaderOverflow) { _tools.UtilTools.warn('vxe.error.reqProp', ['show-header-overflow']); } if (this.showFooter && !this.showFooterOverflow) { _tools.UtilTools.warn('vxe.error.reqProp', ['show-footer-overflow']); } if (this.spanMethod) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['span-method']); } if (this.footerSpanMethod) { _tools.UtilTools.warn('vxe.error.scrollErrProp', ['footer-span-method']); } var _computeVirtualX = computeVirtualX(this), visibleSize = _computeVirtualX.visibleSize; scrollXStore.startIndex = 0; scrollXStore.endIndex = visibleSize; scrollXStore.visibleSize = visibleSize; } // 如果列被显示/隐藏,则清除合并状态 // 如果列被设置为固定,则清除合并状态 if (visibleColumn.length !== this.visibleColumn.length || !thi