vxe-table
Version:
一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...
1,839 lines (1,549 loc) • 169 kB
JavaScript
"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