vxe-table
Version:
一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...
745 lines (609 loc) • 22 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _ctor = _interopRequireDefault(require("xe-utils/ctor"));
var _vXETable = _interopRequireDefault(require("../../v-x-e-table"));
var _tools = require("../../tools");
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; }
var _default = {
methods: {
/**
* 往表格中插入临时数据
*
* @param {*} records
*/
_insert: function _insert(records) {
return this.insertAt(records);
},
/**
* 往表格指定行中插入临时数据
* 如果 row 为空则从插入到顶部
* 如果 row 为 -1 则从插入到底部
* 如果 row 为有效行则插入到该行的位置
* @param {Object/Array} records 新的数据
* @param {Row} row 指定行
*/
_insertAt: function _insertAt(records, row) {
var _this = this,
_editStore$insertList;
var mergeList = this.mergeList,
afterFullData = this.afterFullData,
editStore = this.editStore,
sYOpts = this.sYOpts,
scrollYLoad = this.scrollYLoad,
tableFullData = this.tableFullData,
treeConfig = this.treeConfig;
if (!_ctor.default.isArray(records)) {
records = [records];
}
var newRecords = records.map(function (record) {
return _this.defineField(Object.assign({}, record));
});
if (!row) {
afterFullData.unshift.apply(afterFullData, _toConsumableArray(newRecords));
tableFullData.unshift.apply(tableFullData, _toConsumableArray(newRecords)); // 刷新单元格合并
mergeList.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row;
if (mergeRowIndex > 0) {
mergeItem.row = mergeRowIndex + newRecords.length;
}
});
} else {
if (row === -1) {
afterFullData.push.apply(afterFullData, _toConsumableArray(newRecords));
tableFullData.push.apply(tableFullData, _toConsumableArray(newRecords)); // 刷新单元格合并
mergeList.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row,
mergeRowspan = mergeItem.rowspan;
if (mergeRowIndex + mergeRowspan > afterFullData.length) {
mergeItem.rowspan = mergeRowspan + newRecords.length;
}
});
} else {
if (treeConfig) {
throw new Error(_tools.UtilTools.getLog('vxe.error.noTree', ['insert']));
}
var afIndex = afterFullData.indexOf(row);
if (afIndex === -1) {
throw new Error(_tools.UtilTools.error('vxe.error.unableInsert'));
}
afterFullData.splice.apply(afterFullData, [afIndex, 0].concat(_toConsumableArray(newRecords)));
tableFullData.splice.apply(tableFullData, [tableFullData.indexOf(row), 0].concat(_toConsumableArray(newRecords))); // 刷新单元格合并
mergeList.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row,
mergeRowspan = mergeItem.rowspan;
if (mergeRowIndex > afIndex) {
mergeItem.row = mergeRowIndex + newRecords.length;
} else if (mergeRowIndex + mergeRowspan > afIndex) {
mergeItem.rowspan = mergeRowspan + newRecords.length;
}
});
}
}
(_editStore$insertList = editStore.insertList).unshift.apply(_editStore$insertList, _toConsumableArray(newRecords));
this.scrollYLoad = !treeConfig && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length;
this.handleTableData();
this.updateFooter();
this.updateCache();
this.checkSelectionStatus();
if (scrollYLoad) {
this.updateScrollYSpace();
}
return this.$nextTick().then(function () {
_this.recalculate();
return {
row: newRecords.length ? newRecords[newRecords.length - 1] : null,
rows: newRecords
};
});
},
/**
* 删除指定行数据
* 如果传 row 则删除一行
* 如果传 rows 则删除多行
* 如果为空则删除所有
*/
_remove: function _remove(rows) {
var _this2 = this;
var afterFullData = this.afterFullData,
tableFullData = this.tableFullData,
treeConfig = this.treeConfig,
mergeList = this.mergeList,
editStore = this.editStore,
checkboxOpts = this.checkboxOpts,
selection = this.selection,
isInsertByRow = this.isInsertByRow,
sYOpts = this.sYOpts,
scrollYLoad = this.scrollYLoad;
var actived = editStore.actived,
removeList = editStore.removeList,
insertList = editStore.insertList;
var property = checkboxOpts.checkField;
var rest = [];
if (!rows) {
rows = tableFullData;
} else if (!_ctor.default.isArray(rows)) {
rows = [rows];
} // 如果是新增,则保存记录
rows.forEach(function (row) {
if (!isInsertByRow(row)) {
removeList.push(row);
}
}); // 如果绑定了多选属性,则更新状态
if (!property) {
rows.forEach(function (row) {
var sIndex = selection.indexOf(row);
if (sIndex > -1) {
selection.splice(sIndex, 1);
}
});
} // 从数据源中移除
if (tableFullData === rows) {
rows = rest = tableFullData.slice(0);
this.tableFullData = [];
this.afterFullData = [];
this.clearMergeCells();
} else {
rows.forEach(function (row) {
var tfIndex = tableFullData.indexOf(row);
if (tfIndex > -1) {
var rItems = tableFullData.splice(tfIndex, 1);
rest.push(rItems[0]);
}
var afIndex = afterFullData.indexOf(row);
if (afIndex > -1) {
// 刷新单元格合并
mergeList.forEach(function (mergeItem) {
var mergeRowIndex = mergeItem.row,
mergeRowspan = mergeItem.rowspan;
if (mergeRowIndex > afIndex) {
mergeItem.row = mergeRowIndex - 1;
} else if (mergeRowIndex + mergeRowspan > afIndex) {
mergeItem.rowspan = mergeRowspan - 1;
}
});
afterFullData.splice(afIndex, 1);
}
});
} // 如果当前行被激活编辑,则清除激活状态
if (actived.row && rows.indexOf(actived.row) > -1) {
this.clearActived();
} // 从新增中移除已删除的数据
rows.forEach(function (row) {
var iIndex = insertList.indexOf(row);
if (iIndex > -1) {
insertList.splice(iIndex, 1);
}
});
this.scrollYLoad = !treeConfig && sYOpts.gt > -1 && sYOpts.gt < tableFullData.length;
this.handleTableData();
this.updateFooter();
this.updateCache();
this.checkSelectionStatus();
if (scrollYLoad) {
this.updateScrollYSpace();
}
return this.$nextTick().then(function () {
_this2.recalculate();
return {
row: rest.length ? rest[rest.length - 1] : null,
rows: rest
};
});
},
/**
* 删除复选框选中的数据
*/
_removeCheckboxRow: function _removeCheckboxRow() {
var _this3 = this;
return this.remove(this.getCheckboxRecords()).then(function (params) {
_this3.clearCheckboxRow();
return params;
});
},
/**
* 删除单选框选中的数据
*/
_removeRadioRow: function _removeRadioRow() {
var _this4 = this;
var radioRecord = this.getRadioRecord();
return this.remove(radioRecord || []).then(function (params) {
_this4.clearRadioRow();
return params;
});
},
/**
* 删除当前行选中的数据
*/
_removeCurrentRow: function _removeCurrentRow() {
var _this5 = this;
var currentRecord = this.getCurrentRecord();
return this.remove(currentRecord || []).then(function (params) {
_this5.clearCurrentRow();
return params;
});
},
/**
* 获取表格数据集,包含新增、删除、修改
*/
_getRecordset: function _getRecordset() {
return {
insertRecords: this.getInsertRecords(),
removeRecords: this.getRemoveRecords(),
updateRecords: this.getUpdateRecords()
};
},
/**
* 获取新增的临时数据
*/
_getInsertRecords: function _getInsertRecords() {
var insertList = this.editStore.insertList;
var insertRecords = [];
if (insertList.length) {
this.tableFullData.forEach(function (row) {
if (insertList.indexOf(row) > -1) {
insertRecords.push(row);
}
});
}
return insertRecords;
},
/**
* 获取已删除的数据
*/
_getRemoveRecords: function _getRemoveRecords() {
return this.editStore.removeList;
},
/**
* 获取更新数据
* 只精准匹配 row 的更改
* 如果是树表格,子节点更改状态不会影响父节点的更新状态
*/
_getUpdateRecords: function _getUpdateRecords() {
var keepSource = this.keepSource,
tableFullData = this.tableFullData,
isUpdateByRow = this.isUpdateByRow,
treeConfig = this.treeConfig,
treeOpts = this.treeOpts;
if (keepSource) {
if (treeConfig) {
return _ctor.default.filterTree(tableFullData, function (row) {
return isUpdateByRow(row);
}, treeOpts);
}
return tableFullData.filter(function (row) {
return isUpdateByRow(row);
});
}
return [];
},
/**
* 处理激活编辑
*/
handleActived: function handleActived(params, evnt) {
var _this6 = this;
var editStore = this.editStore,
editOpts = this.editOpts,
tableColumn = this.tableColumn,
mouseConfig = this.mouseConfig;
var mode = editOpts.mode,
activeMethod = editOpts.activeMethod;
var actived = editStore.actived;
var row = params.row,
column = params.column,
cell = params.cell;
var editRender = column.editRender;
if (editRender && cell) {
if (actived.row !== row || (mode === 'cell' ? actived.column !== column : false)) {
// 判断是否禁用编辑
var type = 'edit-disabled';
if (!activeMethod || activeMethod(params)) {
if (mouseConfig) {
this.clearSelected(evnt);
this.clearCellAreas(evnt);
this.clearCopyCellArea(evnt);
}
this.clostTooltip();
this.clearActived(evnt);
type = 'edit-actived';
column.renderHeight = cell.offsetHeight;
actived.args = params;
actived.row = row;
actived.column = column;
if (mode === 'row') {
tableColumn.forEach(function (column) {
return _this6._getColumnModel(row, column);
});
} else {
this._getColumnModel(row, column);
}
this.$nextTick(function () {
_this6.handleFocus(params, evnt);
});
}
this.emitEvent(type, params, evnt);
} else {
var oldColumn = actived.column;
if (mouseConfig) {
this.clearSelected(evnt);
this.clearCellAreas(evnt);
this.clearCopyCellArea(evnt);
}
if (oldColumn !== column) {
var oldModel = oldColumn.model;
if (oldModel.update) {
_tools.UtilTools.setCellValue(row, oldColumn, oldModel.value);
}
this.clearValidate();
}
column.renderHeight = cell.offsetHeight;
actived.args = params;
actived.column = column;
setTimeout(function () {
_this6.handleFocus(params, evnt);
});
}
this.focus();
}
return this.$nextTick();
},
_getColumnModel: function _getColumnModel(row, column) {
var model = column.model,
editRender = column.editRender;
if (editRender) {
model.value = _tools.UtilTools.getCellValue(row, column);
model.update = false;
}
},
_setColumnModel: function _setColumnModel(row, column) {
var model = column.model,
editRender = column.editRender;
if (editRender && model.update) {
_tools.UtilTools.setCellValue(row, column, model.value);
model.update = false;
model.value = null;
}
},
/**
* 清除激活的编辑
*/
_clearActived: function _clearActived(evnt) {
var _this7 = this;
var tableColumn = this.tableColumn,
editStore = this.editStore,
editOpts = this.editOpts;
var actived = editStore.actived;
var args = actived.args,
row = actived.row,
column = actived.column;
if (row || column) {
if (editOpts.mode === 'row') {
tableColumn.forEach(function (column) {
return _this7._setColumnModel(row, column);
});
} else {
this._setColumnModel(row, column);
}
this.updateFooter();
this.emitEvent('edit-closed', args, evnt);
}
actived.args = null;
actived.row = null;
actived.column = null;
return (_vXETable.default._valid ? this.clearValidate() : this.$nextTick()).then(this.recalculate);
},
_getActiveRecord: function _getActiveRecord() {
var $el = this.$el,
editStore = this.editStore,
afterFullData = this.afterFullData;
var _editStore$actived = editStore.actived,
args = _editStore$actived.args,
row = _editStore$actived.row;
if (args && afterFullData.indexOf(row) > -1 && $el.querySelectorAll('.vxe-body--column.col--actived').length) {
return Object.assign({}, args);
}
return null;
},
/**
* 判断行是否为激活编辑状态
* @param {Row} row 行对象
*/
_isActiveByRow: function _isActiveByRow(row) {
return this.editStore.actived.row === row;
},
/**
* 处理聚焦
*/
handleFocus: function handleFocus(params) {
var row = params.row,
column = params.column,
cell = params.cell;
var editRender = column.editRender;
if (editRender) {
var compRender = _vXETable.default.renderer.get(editRender.name);
var autofocus = editRender.autofocus,
autoselect = editRender.autoselect;
var inputElem; // 如果指定了聚焦 class
if (autofocus) {
inputElem = cell.querySelector(autofocus);
} // 渲染器的聚焦处理
if (!inputElem && compRender && compRender.autofocus) {
inputElem = cell.querySelector(compRender.autofocus);
}
if (inputElem) {
inputElem.focus();
if (autoselect) {
inputElem.select();
} else {
// 保持一致行为,光标移到末端
if (_tools.DomTools.browse.msie) {
var textRange = inputElem.createTextRange();
textRange.collapse(false);
textRange.select();
}
}
} else {
// 显示到可视区中
this.scrollToRow(row, column);
}
}
},
/**
* 激活行编辑
*/
_setActiveRow: function _setActiveRow(row) {
return this.setActiveCell(row, _ctor.default.find(this.visibleColumn, function (column) {
return column.editRender;
}).property);
},
/**
* 激活单元格编辑
*/
_setActiveCell: function _setActiveCell(row, field) {
var _this8 = this;
return this.scrollToRow(row, true).then(function () {
if (row && field) {
var column = _ctor.default.find(_this8.visibleColumn, function (column) {
return column.property === field;
});
if (column && column.editRender) {
var cell = _this8.getCell(row, column);
if (cell) {
_this8.handleActived({
row: row,
rowIndex: _this8.getRowIndex(row),
column: column,
columnIndex: _this8.getColumnIndex(column),
cell: cell,
$table: _this8
});
_this8.lastCallTime = Date.now();
}
}
}
return _this8.$nextTick();
});
},
/**
* 只对 trigger=dblclick 有效,选中单元格
*/
_setSelectCell: function _setSelectCell(row, field) {
var tableData = this.tableData,
editOpts = this.editOpts,
visibleColumn = this.visibleColumn;
if (row && field && editOpts.trigger !== 'manual') {
var column = _ctor.default.find(visibleColumn, function (column) {
return column.property === field;
});
var rowIndex = tableData.indexOf(row);
if (rowIndex > -1 && column) {
var cell = this.getCell(row, column);
var params = {
row: row,
rowIndex: rowIndex,
column: column,
columnIndex: visibleColumn.indexOf(column),
cell: cell
};
this.handleSelected(params, {});
}
}
return this.$nextTick();
},
/**
* 处理选中源
*/
handleSelected: function handleSelected(params, evnt) {
var _this9 = this;
var mouseConfig = this.mouseConfig,
mouseOpts = this.mouseOpts,
editOpts = this.editOpts,
editStore = this.editStore;
var actived = editStore.actived,
selected = editStore.selected;
var row = params.row,
column = params.column;
var isMouseSelected = mouseConfig && mouseOpts.selected;
var selectMethod = function selectMethod() {
if (isMouseSelected && (selected.row !== row || selected.column !== column)) {
if (actived.row !== row || (editOpts.mode === 'cell' ? actived.column !== column : false)) {
_this9.clearActived(evnt);
_this9.clearSelected(evnt);
_this9.clearCellAreas(evnt);
_this9.clearCopyCellArea(evnt);
selected.args = params;
selected.row = row;
selected.column = column;
if (isMouseSelected) {
_this9.addColSdCls();
}
_this9.focus();
if (evnt) {
_this9.emitEvent('cell-selected', params, evnt);
}
}
}
return _this9.$nextTick();
};
return selectMethod();
},
/**
* 获取选中的单元格
*/
_getSelectedCell: function _getSelectedCell() {
var _this$editStore$selec = this.editStore.selected,
args = _this$editStore$selec.args,
column = _this$editStore$selec.column;
if (args && column) {
return Object.assign({}, args);
}
return null;
},
/**
* 清除所选中源状态
*/
_clearSelected: function _clearSelected() {
var selected = this.editStore.selected;
selected.row = null;
selected.column = null;
this.reColTitleSdCls();
this.reColSdCls();
return this.$nextTick();
},
reColTitleSdCls: function reColTitleSdCls() {
var headerElem = this.elemStore['main-header-list'];
if (headerElem) {
_ctor.default.arrayEach(headerElem.querySelectorAll('.col--title-selected'), function (elem) {
return _tools.DomTools.removeClass(elem, 'col--title-selected');
});
}
},
reColSdCls: function reColSdCls() {
var cell = this.$el.querySelector('.col--selected');
if (cell) {
_tools.DomTools.removeClass(cell, 'col--selected');
}
},
addColSdCls: function addColSdCls() {
var selected = this.editStore.selected;
var row = selected.row,
column = selected.column;
this.reColSdCls();
if (row && column) {
var cell = this.getCell(row, column);
if (cell) {
_tools.DomTools.addClass(cell, 'col--selected');
}
}
}
}
};
exports.default = _default;