UNPKG

vxe-table-demonic

Version:

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...

862 lines (861 loc) 42.9 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import { reactive, nextTick } from 'vue'; import XEUtils from 'xe-utils'; import GlobalConfig from '../../v-x-e-table/src/conf'; import { renderer } from '../../v-x-e-table'; import { isEnableConf } from '../../tools/utils'; import { getCellValue, setCellValue, getRowid } from '../../table/src/util'; import { browse, removeClass, addClass } from '../../tools/dom'; import { warnLog, errLog, getLog } from '../../tools/log'; var tableEditMethodKeys = ['insert', 'insertAt', 'insertNextAt', 'remove', 'removeCheckboxRow', 'removeRadioRow', 'removeCurrentRow', 'getRecordset', 'getInsertRecords', 'getRemoveRecords', 'getUpdateRecords', 'getEditRecord', 'getActiveRecord', 'getSelectedCell', 'clearEdit', 'clearActived', 'clearSelected', 'isEditByRow', 'isActiveByRow', 'setEditRow', 'setActiveRow', 'setEditCell', 'setActiveCell', 'setSelectCell']; var editHook = { setupTable: function ($xetable) { var props = $xetable.props, reactData = $xetable.reactData, internalData = $xetable.internalData; var refElem = $xetable.getRefMaps().refElem; var _a = $xetable.getComputeMaps(), computeMouseOpts = _a.computeMouseOpts, computeEditOpts = _a.computeEditOpts, computeCheckboxOpts = _a.computeCheckboxOpts, computeTreeOpts = _a.computeTreeOpts; var editMethods = {}; var editPrivateMethods = {}; var getEditColumnModel = function (row, column) { var model = column.model, editRender = column.editRender; if (editRender) { model.value = getCellValue(row, column); model.update = false; } }; var setEditColumnModel = function (row, column) { var model = column.model, editRender = column.editRender; if (editRender && model.update) { setCellValue(row, column, model.value); model.update = false; model.value = null; } }; var removeCellSelectedClass = function () { var el = refElem.value; if (el) { var cell = el.querySelector('.col--selected'); if (cell) { removeClass(cell, 'col--selected'); } } }; function syncActivedCell() { var editStore = reactData.editStore, tableColumn = reactData.tableColumn; var editOpts = computeEditOpts.value; var actived = editStore.actived; var row = actived.row, column = actived.column; if (row || column) { if (editOpts.mode === 'row') { tableColumn.forEach(function (column) { return setEditColumnModel(row, column); }); } else { setEditColumnModel(row, column); } } } function insertTreeRow(newRecords, isAppend) { var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, fullDataRowIdData = internalData.fullDataRowIdData, fullAllDataRowIdData = internalData.fullAllDataRowIdData; var treeOpts = computeTreeOpts.value; var rowField = treeOpts.rowField, parentField = treeOpts.parentField, mapChildrenField = treeOpts.mapChildrenField; var childrenField = treeOpts.children || treeOpts.childrenField; var funcName = isAppend ? 'push' : 'unshift'; newRecords.forEach(function (item) { var parentRowId = item[parentField]; var rowid = getRowid($xetable, item); var matchObj = parentRowId ? XEUtils.findTree(tableFullTreeData, function (item) { return parentRowId === item[rowField]; }, { children: mapChildrenField }) : null; if (matchObj) { var parentRow = matchObj.item; var parentRest = fullAllDataRowIdData[getRowid($xetable, parentRow)]; var parentLevel = parentRest ? parentRest.level : 0; var parentChilds = parentRow[childrenField]; var mapChilds = parentRow[mapChildrenField]; if (!XEUtils.isArray(parentChilds)) { parentChilds = parentRow[childrenField] = []; } if (!XEUtils.isArray(mapChilds)) { mapChilds = parentRow[childrenField] = []; } parentChilds[funcName](item); mapChilds[funcName](item); var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: parentChilds, parent: parentRow, level: parentLevel + 1 }; fullDataRowIdData[rowid] = rest; fullAllDataRowIdData[rowid] = rest; } else { if (process.env.NODE_ENV === 'development') { if (parentRowId) { warnLog('vxe.error.unableInsert'); } } afterFullData[funcName](item); tableFullTreeData[funcName](item); var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: tableFullTreeData, parent: null, level: 0 }; fullDataRowIdData[rowid] = rest; fullAllDataRowIdData[rowid] = rest; } }); } var handleInsertRowAt = function (records, row, isInsertNextRow) { var treeConfig = props.treeConfig; var mergeList = reactData.mergeList, editStore = reactData.editStore; var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData, fullDataRowIdData = internalData.fullDataRowIdData, fullAllDataRowIdData = internalData.fullAllDataRowIdData; var treeOpts = computeTreeOpts.value; var transform = treeOpts.transform, rowField = treeOpts.rowField, mapChildrenField = treeOpts.mapChildrenField; var childrenField = treeOpts.children || treeOpts.childrenField; if (!XEUtils.isArray(records)) { records = [records]; } var newRecords = reactive($xetable.defineField(records.map(function (record) { var _a; return Object.assign(treeConfig && transform ? (_a = {}, _a[mapChildrenField] = [], _a[childrenField] = [], _a) : {}, record); }))); if (XEUtils.eqNull(row)) { // 如果为虚拟树 if (treeConfig && transform) { insertTreeRow(newRecords, false); } else { afterFullData.unshift.apply(afterFullData, newRecords); tableFullData.unshift.apply(tableFullData, newRecords); // 刷新单元格合并 mergeList.forEach(function (mergeItem) { var mergeRowIndex = mergeItem.row; if (mergeRowIndex > 0) { mergeItem.row = mergeRowIndex + newRecords.length; } }); } } else { if (row === -1) { // 如果为虚拟树 if (treeConfig && transform) { insertTreeRow(newRecords, true); } else { afterFullData.push.apply(afterFullData, newRecords); tableFullData.push.apply(tableFullData, 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 && transform) { var matchMapObj_1 = XEUtils.findTree(tableFullTreeData, function (item) { return row[rowField] === item[rowField]; }, { children: mapChildrenField }); if (matchMapObj_1) { var parentRow_1 = matchMapObj_1.parent; var parentMapChilds_1 = parentRow_1 ? parentRow_1[mapChildrenField] : tableFullTreeData; var parentRest = fullAllDataRowIdData[getRowid($xetable, parentRow_1)]; var parentLevel_1 = parentRest ? parentRest.level : 0; newRecords.forEach(function (item, i) { var rowid = getRowid($xetable, item); if (process.env.NODE_ENV === 'development') { if (item[treeOpts.parentField]) { if (parentRow_1 && item[treeOpts.parentField] !== parentRow_1[rowField]) { errLog('vxe.error.errProp', ["".concat(treeOpts.parentField, "=").concat(item[treeOpts.parentField]), "".concat(treeOpts.parentField, "=").concat(parentRow_1[rowField])]); } } } if (parentRow_1) { item[treeOpts.parentField] = parentRow_1[rowField]; } var targetIndex = matchMapObj_1.index + i; if (isInsertNextRow) { targetIndex = targetIndex + 1; } parentMapChilds_1.splice(targetIndex, 0, item); var rest = { row: item, rowid: rowid, seq: -1, index: -1, _index: -1, $index: -1, items: parentMapChilds_1, parent: parentRow_1, level: parentLevel_1 + 1 }; fullDataRowIdData[rowid] = rest; fullAllDataRowIdData[rowid] = rest; }); // 源 if (parentRow_1) { var matchObj = XEUtils.findTree(tableFullTreeData, function (item) { return row[rowField] === item[rowField]; }, { children: childrenField }); if (matchObj) { var parentChilds = matchObj.items; var targetIndex = matchObj.index; if (isInsertNextRow) { targetIndex = targetIndex + 1; } parentChilds.splice.apply(parentChilds, __spreadArray([targetIndex, 0], newRecords, false)); } } } else { if (process.env.NODE_ENV === 'development') { warnLog('vxe.error.unableInsert'); } insertTreeRow(newRecords, true); } } else { if (treeConfig) { throw new Error(getLog('vxe.error.noTree', ['insert'])); } var afIndex_1 = -1; // 如果是可视索引 if (XEUtils.isNumber(row)) { if (row < afterFullData.length) { afIndex_1 = row; } } else { afIndex_1 = $xetable.findRowIndexOf(afterFullData, row); } // 如果是插入指定行的下一行 if (isInsertNextRow) { afIndex_1 = Math.min(afterFullData.length, afIndex_1 + 1); } if (afIndex_1 === -1) { throw new Error(errLog('vxe.error.unableInsert')); } afterFullData.splice.apply(afterFullData, __spreadArray([afIndex_1, 0], newRecords, false)); tableFullData.splice.apply(tableFullData, __spreadArray([$xetable.findRowIndexOf(tableFullData, row), 0], newRecords, false)); // 刷新单元格合并 mergeList.forEach(function (mergeItem) { var mergeRowIndex = mergeItem.row, mergeRowspan = mergeItem.rowspan; if (mergeRowIndex > afIndex_1) { mergeItem.row = mergeRowIndex + newRecords.length; } else if (mergeRowIndex + mergeRowspan > afIndex_1) { mergeItem.rowspan = mergeRowspan + newRecords.length; } }); } } } var insertMaps = editStore.insertMaps; newRecords.forEach(function (newRow) { var rowid = getRowid($xetable, newRow); insertMaps[rowid] = newRow; }); $xetable.cacheRowMap(); $xetable.updateScrollYStatus(); $xetable.handleTableData(treeConfig && transform); if (!(treeConfig && transform)) { $xetable.updateAfterDataIndex(); } $xetable.updateFooter(); $xetable.checkSelectionStatus(); if (reactData.scrollYLoad) { $xetable.updateScrollYSpace(); } return nextTick().then(function () { $xetable.updateCellAreas(); return $xetable.recalculate(); }).then(function () { return { row: newRecords.length ? newRecords[newRecords.length - 1] : null, rows: newRecords }; }); }; editMethods = { /** * 往表格中插入临时数据 * * @param {*} records */ insert: function (records) { return handleInsertRowAt(records, null); }, /** * 往表格指定行中插入临时数据 * 如果 row 为空则从插入到顶部,如果为树结构,则插入到目标节点顶部 * 如果 row 为 -1 则从插入到底部,如果为树结构,则插入到目标节点底部 * 如果 row 为有效行则插入到该行的位置,如果为树结构,则有插入到效的目标节点该行的位置 * @param {Object/Array} records 新的数据 * @param {Row} row 指定行 */ insertAt: function (records, row) { return handleInsertRowAt(records, row); }, insertNextAt: function (records, row) { return handleInsertRowAt(records, row, true); }, /** * 删除指定行数据 * 如果传 row 则删除一行 * 如果传 rows 则删除多行 * 如果为空则删除所有 */ remove: function (rows) { var treeConfig = props.treeConfig; var mergeList = reactData.mergeList, editStore = reactData.editStore, selectCheckboxMaps = reactData.selectCheckboxMaps; var tableFullTreeData = internalData.tableFullTreeData, afterFullData = internalData.afterFullData, tableFullData = internalData.tableFullData; var checkboxOpts = computeCheckboxOpts.value; var treeOpts = computeTreeOpts.value; var transform = treeOpts.transform, mapChildrenField = treeOpts.mapChildrenField; var childrenField = treeOpts.children || treeOpts.childrenField; var actived = editStore.actived, removeMaps = editStore.removeMaps, insertMaps = editStore.insertMaps; var checkField = checkboxOpts.checkField; var delList = []; if (!rows) { rows = tableFullData; } else if (!XEUtils.isArray(rows)) { rows = [rows]; } // 如果是新增,则保存记录 rows.forEach(function (row) { if (!$xetable.isInsertByRow(row)) { var rowid = getRowid($xetable, row); removeMaps[rowid] = row; } }); // 如果绑定了多选属性,则更新状态 if (!checkField) { var selectRowMaps_1 = __assign({}, selectCheckboxMaps); rows.forEach(function (row) { var rowid = getRowid($xetable, row); if (selectRowMaps_1[rowid]) { delete selectRowMaps_1[rowid]; } }); reactData.selectCheckboxMaps = selectRowMaps_1; } // 从数据源中移除 if (tableFullData === rows) { rows = delList = tableFullData.slice(0); internalData.tableFullData = []; internalData.afterFullData = []; $xetable.clearMergeCells(); } else { // 如果为虚拟树 if (treeConfig && transform) { rows.forEach(function (row) { var rowid = getRowid($xetable, row); var matchMapObj = XEUtils.findTree(tableFullTreeData, function (item) { return rowid === getRowid($xetable, item); }, { children: mapChildrenField }); if (matchMapObj) { var rItems = matchMapObj.items.splice(matchMapObj.index, 1); delList.push(rItems[0]); } var matchObj = XEUtils.findTree(tableFullTreeData, function (item) { return rowid === getRowid($xetable, item); }, { children: childrenField }); if (matchObj) { matchObj.items.splice(matchObj.index, 1); } var afIndex = $xetable.findRowIndexOf(afterFullData, row); if (afIndex > -1) { afterFullData.splice(afIndex, 1); } }); } else { rows.forEach(function (row) { var tfIndex = $xetable.findRowIndexOf(tableFullData, row); if (tfIndex > -1) { var rItems = tableFullData.splice(tfIndex, 1); delList.push(rItems[0]); } var afIndex = $xetable.findRowIndexOf(afterFullData, 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 && $xetable.findRowIndexOf(rows, actived.row) > -1) { editMethods.clearEdit(); } // 从新增中移除已删除的数据 rows.forEach(function (row) { var rowid = getRowid($xetable, row); if (insertMaps[rowid]) { delete insertMaps[rowid]; } }); $xetable.updateFooter(); $xetable.cacheRowMap(); $xetable.handleTableData(treeConfig && transform); if (!(treeConfig && transform)) { $xetable.updateAfterDataIndex(); } $xetable.checkSelectionStatus(); if (reactData.scrollYLoad) { $xetable.updateScrollYSpace(); } return nextTick().then(function () { $xetable.updateCellAreas(); return $xetable.recalculate(); }).then(function () { return { row: delList.length ? delList[delList.length - 1] : null, rows: delList }; }); }, /** * 删除复选框选中的数据 */ removeCheckboxRow: function () { return editMethods.remove($xetable.getCheckboxRecords()).then(function (params) { $xetable.clearCheckboxRow(); return params; }); }, /** * 删除单选框选中的数据 */ removeRadioRow: function () { var radioRecord = $xetable.getRadioRecord(); return editMethods.remove(radioRecord || []).then(function (params) { $xetable.clearRadioRow(); return params; }); }, /** * 删除当前行选中的数据 */ removeCurrentRow: function () { var currentRecord = $xetable.getCurrentRecord(); return editMethods.remove(currentRecord || []).then(function (params) { $xetable.clearCurrentRow(); return params; }); }, /** * 获取表格数据集,包含新增、删除、修改、标记 */ getRecordset: function () { return { insertRecords: editMethods.getInsertRecords(), removeRecords: editMethods.getRemoveRecords(), updateRecords: editMethods.getUpdateRecords(), pendingRecords: $xetable.getPendingRecords() }; }, /** * 获取新增的临时数据 */ getInsertRecords: function () { var editStore = reactData.editStore; var fullAllDataRowIdData = internalData.fullAllDataRowIdData; var insertMaps = editStore.insertMaps; var insertRecords = []; XEUtils.each(insertMaps, function (row, rowid) { if (fullAllDataRowIdData[rowid]) { insertRecords.push(row); } }); return insertRecords; }, /** * 获取已删除的数据 */ getRemoveRecords: function () { var editStore = reactData.editStore; var removeMaps = editStore.removeMaps; var removeRecords = []; XEUtils.each(removeMaps, function (row) { removeRecords.push(row); }); return removeRecords; }, /** * 获取更新数据 * 只精准匹配 row 的更改 * 如果是树表格,子节点更改状态不会影响父节点的更新状态 */ getUpdateRecords: function () { var keepSource = props.keepSource, treeConfig = props.treeConfig; var tableFullData = internalData.tableFullData; var treeOpts = computeTreeOpts.value; if (keepSource) { syncActivedCell(); if (treeConfig) { return XEUtils.filterTree(tableFullData, function (row) { return $xetable.isUpdateByRow(row); }, treeOpts); } return tableFullData.filter(function (row) { return $xetable.isUpdateByRow(row); }); } return []; }, getActiveRecord: function () { return this.getEditRecord(); }, getEditRecord: function () { var editStore = reactData.editStore; var afterFullData = internalData.afterFullData; var el = refElem.value; var _a = editStore.actived, args = _a.args, row = _a.row; if (args && $xetable.findRowIndexOf(afterFullData, row) > -1 && el.querySelectorAll('.vxe-body--column.col--active').length) { return Object.assign({}, args); } return null; }, /** * 获取选中的单元格 */ getSelectedCell: function () { var editStore = reactData.editStore; var _a = editStore.selected, args = _a.args, column = _a.column; if (args && column) { return Object.assign({}, args); } return null; }, clearActived: function (evnt) { // if (process.env.NODE_ENV === 'development') { // warnLog('vxe.error.delFunc', ['clearActived', 'clearEdit']) // } // 即将废弃 return this.clearEdit(evnt); }, /** * 清除激活的编辑 */ clearEdit: function (evnt) { var editStore = reactData.editStore; var actived = editStore.actived; var row = actived.row, column = actived.column; if (row || column) { syncActivedCell(); actived.args = null; actived.row = null; actived.column = null; $xetable.updateFooter(); $xetable.dispatchEvent('edit-closed', { row: row, rowIndex: $xetable.getRowIndex(row), $rowIndex: $xetable.getVMRowIndex(row), column: column, columnIndex: $xetable.getColumnIndex(column), $columnIndex: $xetable.getVMColumnIndex(column) }, evnt || null); } if (GlobalConfig.cellVaildMode === 'obsolete') { if ($xetable.clearValidate) { return $xetable.clearValidate(); } } return nextTick(); }, /** * 清除所选中源状态 */ clearSelected: function () { var editStore = reactData.editStore; var selected = editStore.selected; selected.row = null; selected.column = null; removeCellSelectedClass(); return nextTick(); }, isActiveByRow: function (row) { // if (process.env.NODE_ENV === 'development') { // warnLog('vxe.error.delFunc', ['isActiveByRow', 'isEditByRow']) // } // 即将废弃 return this.isEditByRow(row); }, /** * 判断行是否为激活编辑状态 * @param {Row} row 行对象 */ isEditByRow: function (row) { var editStore = reactData.editStore; return editStore.actived.row === row; }, setActiveRow: function (row) { // if (process.env.NODE_ENV === 'development') { // warnLog('vxe.error.delFunc', ['setActiveRow', 'setEditRow']) // } // 即将废弃 return editMethods.setEditRow(row); }, /** * 激活行编辑 */ setEditRow: function (row, fieldOrColumn) { var visibleColumn = internalData.visibleColumn; var column = XEUtils.find(visibleColumn, function (column) { return isEnableConf(column.editRender); }); if (fieldOrColumn) { column = XEUtils.isString(fieldOrColumn) ? $xetable.getColumnByField(fieldOrColumn) : fieldOrColumn; } return $xetable.setEditCell(row, column); }, setActiveCell: function (row, fieldOrColumn) { // if (process.env.NODE_ENV === 'development') { // warnLog('vxe.error.delFunc', ['setActiveCell', 'setEditCell']) // } // 即将废弃 return editMethods.setEditCell(row, fieldOrColumn); }, /** * 激活单元格编辑 */ setEditCell: function (row, fieldOrColumn) { var editConfig = props.editConfig; var column = XEUtils.isString(fieldOrColumn) ? $xetable.getColumnByField(fieldOrColumn) : fieldOrColumn; if (row && column && isEnableConf(editConfig) && isEnableConf(column.editRender)) { return $xetable.scrollToRow(row, column).then(function () { var cell = $xetable.getCell(row, column); if (cell) { editPrivateMethods.handleActived({ row: row, rowIndex: $xetable.getRowIndex(row), column: column, columnIndex: $xetable.getColumnIndex(column), cell: cell, $table: $xetable }); internalData._lastCallTime = Date.now(); } return nextTick(); }); } return nextTick(); }, /** * 只对 trigger=dblclick 有效,选中单元格 */ setSelectCell: function (row, fieldOrColumn) { var tableData = reactData.tableData; var editOpts = computeEditOpts.value; var column = XEUtils.isString(fieldOrColumn) ? $xetable.getColumnByField(fieldOrColumn) : fieldOrColumn; if (row && column && editOpts.trigger !== 'manual') { var rowIndex = $xetable.findRowIndexOf(tableData, row); if (rowIndex > -1 && column) { var cell = $xetable.getCell(row, column); var params = { row: row, rowIndex: rowIndex, column: column, columnIndex: $xetable.getColumnIndex(column), cell: cell }; $xetable.handleSelected(params, {}); } } return nextTick(); } }; editPrivateMethods = { /** * 处理激活编辑 */ handleActived: function (params, evnt) { var editConfig = props.editConfig, mouseConfig = props.mouseConfig; var editStore = reactData.editStore, tableColumn = reactData.tableColumn; var editOpts = computeEditOpts.value; var mode = editOpts.mode; var actived = editStore.actived; var row = params.row, column = params.column; var editRender = column.editRender; var cell = (params.cell || $xetable.getCell(row, column)); var beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod; params.cell = cell; if (isEnableConf(editConfig) && isEnableConf(editRender) && !$xetable.hasPendingByRow(row) && cell) { if (actived.row !== row || (mode === 'cell' ? actived.column !== column : false)) { // 判断是否禁用编辑 var type = 'edit-disabled'; if (!beforeEditMethod || beforeEditMethod(__assign(__assign({}, params), { $table: $xetable, $grid: $xetable.xegrid }))) { if (mouseConfig) { editMethods.clearSelected(); if ($xetable.clearCellAreas) { $xetable.clearCellAreas(); $xetable.clearCopyCellArea(); } } $xetable.closeTooltip(); if (actived.column) { editMethods.clearEdit(evnt); } type = 'edit-activated'; column.renderHeight = cell.offsetHeight; actived.args = params; actived.row = row; actived.column = column; if (mode === 'row') { tableColumn.forEach(function (column) { return getEditColumnModel(row, column); }); } else { getEditColumnModel(row, column); } nextTick(function () { editPrivateMethods.handleFocus(params, evnt); }); } $xetable.dispatchEvent(type, { row: row, rowIndex: $xetable.getRowIndex(row), $rowIndex: $xetable.getVMRowIndex(row), column: column, columnIndex: $xetable.getColumnIndex(column), $columnIndex: $xetable.getVMColumnIndex(column) }, evnt); // v4已废弃 if (type === 'edit-activated') { $xetable.dispatchEvent('edit-actived', { row: row, rowIndex: $xetable.getRowIndex(row), $rowIndex: $xetable.getVMRowIndex(row), column: column, columnIndex: $xetable.getColumnIndex(column), $columnIndex: $xetable.getVMColumnIndex(column) }, evnt); } } else { var oldColumn = actived.column; if (mouseConfig) { editMethods.clearSelected(); if ($xetable.clearCellAreas) { $xetable.clearCellAreas(); $xetable.clearCopyCellArea(); } } if (oldColumn !== column) { var oldModel = oldColumn.model; if (oldModel.update) { setCellValue(row, oldColumn, oldModel.value); } if ($xetable.clearValidate) { $xetable.clearValidate(row, column); } } column.renderHeight = cell.offsetHeight; actived.args = params; actived.column = column; setTimeout(function () { editPrivateMethods.handleFocus(params, evnt); }); } $xetable.focus(); } return nextTick(); }, /** * 处理聚焦 */ handleFocus: function (params) { var row = params.row, column = params.column, cell = params.cell; var editRender = column.editRender; if (isEnableConf(editRender)) { var compRender = renderer.get(editRender.name); var autofocus = editRender.autofocus, autoselect = editRender.autoselect; var inputElem = void 0; if (!autofocus && compRender) { autofocus = compRender.autofocus; } if (!autoselect && compRender) { autoselect = compRender.autoselect; } // 如果指定了聚焦 class if (XEUtils.isFunction(autofocus)) { inputElem = autofocus.call(this, params); } else if (autofocus) { inputElem = cell.querySelector(autofocus); if (inputElem) { inputElem.focus(); } } if (inputElem) { if (autoselect) { inputElem.select(); } else { // 保持一致行为,光标移到末端 if (browse.msie) { var textRange = inputElem.createTextRange(); textRange.collapse(false); textRange.select(); } } } else { // 显示到可视区中 $xetable.scrollToRow(row, column); } } }, /** * 处理选中源 */ handleSelected: function (params, evnt) { var mouseConfig = props.mouseConfig; var editStore = reactData.editStore; var mouseOpts = computeMouseOpts.value; var editOpts = computeEditOpts.value; var actived = editStore.actived, selected = editStore.selected; var row = params.row, column = params.column; var isMouseSelected = mouseConfig && mouseOpts.selected; var selectMethod = function () { if (isMouseSelected && (selected.row !== row || selected.column !== column)) { if (actived.row !== row || (editOpts.mode === 'cell' ? actived.column !== column : false)) { editMethods.clearEdit(evnt); editMethods.clearSelected(); if ($xetable.clearCellAreas) { $xetable.clearCellAreas(); $xetable.clearCopyCellArea(); } selected.args = params; selected.row = row; selected.column = column; if (isMouseSelected) { editPrivateMethods.addCellSelectedClass(); } $xetable.focus(); if (evnt) { $xetable.dispatchEvent('cell-selected', params, evnt); } } } return nextTick(); }; return selectMethod(); }, addCellSelectedClass: function () { var editStore = reactData.editStore; var selected = editStore.selected; var row = selected.row, column = selected.column; removeCellSelectedClass(); if (row && column) { var cell = $xetable.getCell(row, column); if (cell) { addClass(cell, 'col--selected'); } } } }; return __assign(__assign({}, editMethods), editPrivateMethods); }, setupGrid: function ($xegrid) { return $xegrid.extendTableMethods(tableEditMethodKeys); } }; export default editHook;