vxe-table 3.20.13 → 3.21.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/es/style.css +1 -1
  2. package/es/table/module/edit/mixin.js +33 -12
  3. package/es/table/module/keyboard/mixin.js +2 -2
  4. package/es/table/src/cell.js +3 -3
  5. package/es/table/src/column.js +6 -3
  6. package/es/table/src/group.js +6 -3
  7. package/es/table/src/methods.js +365 -165
  8. package/es/table/src/props.js +2 -2
  9. package/es/table/src/table.js +13 -6
  10. package/es/table/src/util.js +12 -3
  11. package/es/ui/index.js +3 -3
  12. package/es/ui/src/dom.js +4 -0
  13. package/es/ui/src/log.js +1 -1
  14. package/lib/index.umd.js +364 -302
  15. package/lib/index.umd.min.js +1 -1
  16. package/lib/style.css +1 -1
  17. package/lib/table/module/edit/mixin.js +39 -12
  18. package/lib/table/module/edit/mixin.min.js +1 -1
  19. package/lib/table/module/keyboard/mixin.js +2 -2
  20. package/lib/table/module/keyboard/mixin.min.js +1 -1
  21. package/lib/table/src/cell.js +3 -3
  22. package/lib/table/src/column.js +6 -3
  23. package/lib/table/src/column.min.js +1 -1
  24. package/lib/table/src/group.js +6 -3
  25. package/lib/table/src/group.min.js +1 -1
  26. package/lib/table/src/methods.js +35 -29
  27. package/lib/table/src/methods.min.js +1 -1
  28. package/lib/table/src/props.js +2 -2
  29. package/lib/table/src/props.min.js +1 -1
  30. package/lib/table/src/table.js +15 -6
  31. package/lib/table/src/table.min.js +1 -1
  32. package/lib/table/src/util.js +12 -3
  33. package/lib/table/src/util.min.js +1 -1
  34. package/lib/ui/index.js +3 -3
  35. package/lib/ui/index.min.js +1 -1
  36. package/lib/ui/src/dom.js +5 -0
  37. package/lib/ui/src/dom.min.js +1 -1
  38. package/lib/ui/src/log.js +1 -1
  39. package/lib/ui/src/log.min.js +1 -1
  40. package/package.json +3 -3
  41. package/packages/table/module/edit/mixin.ts +47 -12
  42. package/packages/table/module/keyboard/mixin.ts +2 -2
  43. package/packages/table/src/cell.ts +5 -5
  44. package/packages/table/src/column.ts +10 -7
  45. package/packages/table/src/group.ts +10 -6
  46. package/packages/table/src/methods.ts +376 -161
  47. package/packages/table/src/props.ts +3 -3
  48. package/packages/table/src/table.ts +13 -6
  49. package/packages/table/src/util.ts +16 -6
  50. package/packages/ui/index.ts +2 -2
  51. package/packages/ui/src/dom.ts +5 -0
  52. /package/es/{iconfont.1776926445391.ttf → iconfont.1777796331871.ttf} +0 -0
  53. /package/es/{iconfont.1776926445391.woff → iconfont.1777796331871.woff} +0 -0
  54. /package/es/{iconfont.1776926445391.woff2 → iconfont.1777796331871.woff2} +0 -0
  55. /package/lib/{iconfont.1776926445391.ttf → iconfont.1777796331871.ttf} +0 -0
  56. /package/lib/{iconfont.1776926445391.woff → iconfont.1777796331871.woff} +0 -0
  57. /package/lib/{iconfont.1776926445391.woff2 → iconfont.1777796331871.woff2} +0 -0
@@ -1,5 +1,5 @@
1
1
  import XEUtils from 'xe-utils';
2
- import { getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollLeftTo, wheelScrollTopTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement } from '../../ui/src/dom';
2
+ import { getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollLeftTo, wheelScrollTopTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement, hasEventInputTarget } from '../../ui/src/dom';
3
3
  import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue } from '../../ui/src/utils';
4
4
  import { VxeUI } from '../../ui';
5
5
  import Cell from './cell';
@@ -8,7 +8,7 @@ import { getSlotVNs } from '../../ui/src/vn';
8
8
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from '../../ui/src/anime';
9
9
  import { warnLog, errLog } from '../../ui/src/log';
10
10
  import { getCrossTableDragRowInfo } from './store';
11
- const { getConfig, getI18n, renderer, formats, interceptor, createEvent } = VxeUI;
11
+ const { getConfig, getI18n, renderer, formats, interceptor, createEvent, globalEvents, GLOBAL_EVENT_KEYS } = VxeUI;
12
12
  const browseObj = XEUtils.browse();
13
13
  const supportMaxRow = 5e6;
14
14
  const customStorageKey = 'VXE_CUSTOM_STORE';
@@ -365,7 +365,7 @@ function cacheColumnMap($xeTable) {
365
365
  errLog('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand']);
366
366
  }
367
367
  if (expandOpts.mode !== 'inside' && (treeConfig && !treeOpts.transform)) {
368
- errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=fixed']);
368
+ errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=inside']);
369
369
  }
370
370
  if (props.spanMethod) {
371
371
  warnLog('vxe.error.notSupportProp', ['column.type=expand', 'span-method', 'span-method=null']);
@@ -3365,6 +3365,7 @@ function loadTableData($xeTable, datas, isReload, isReset) {
3365
3365
  }
3366
3366
  $xeTable.clearMergeCells();
3367
3367
  $xeTable.clearMergeFooterItems();
3368
+ $xeTable.handleClearStack();
3368
3369
  $xeTable.handleTableData(true);
3369
3370
  $xeTable.updateFooter();
3370
3371
  $xeTable.handleUpdateBodyMerge();
@@ -4293,6 +4294,102 @@ function reUpdateCustomStyleEvent($xeTable, evnt) {
4293
4294
  }
4294
4295
  }
4295
4296
  }
4297
+ function truncateStackHistory($xeTable) {
4298
+ const internalData = $xeTable;
4299
+ const { stackHistoryStore } = internalData;
4300
+ const { undoStacks } = stackHistoryStore;
4301
+ const undoRedoHistoryOpts = $xeTable.computeUndoRedoHistoryOpts;
4302
+ const { stackSize } = undoRedoHistoryOpts;
4303
+ if (undoStacks.length > XEUtils.toNumber(stackSize)) {
4304
+ undoStacks.shift();
4305
+ }
4306
+ }
4307
+ /**
4308
+ * 生成快照数据
4309
+ */
4310
+ function getSnapshotStackData($xeTable) {
4311
+ const reactData = $xeTable;
4312
+ const internalData = $xeTable;
4313
+ const { editStore } = reactData;
4314
+ const { afterFullData } = internalData;
4315
+ const { selected, actived } = editStore;
4316
+ const { row: selectRow, column: selectColumn } = selected;
4317
+ const { row: editRow, column: editColumn } = actived;
4318
+ const stackObj = {
4319
+ selectActiveInfo: selectRow && selectColumn
4320
+ ? {
4321
+ rowid: getRowid($xeTable, selectRow),
4322
+ colid: selectColumn.id
4323
+ }
4324
+ : undefined,
4325
+ editActiveInfo: editRow && editColumn
4326
+ ? {
4327
+ rowid: getRowid($xeTable, editRow),
4328
+ colid: editColumn.id
4329
+ }
4330
+ : undefined,
4331
+ visibleData: XEUtils.clone(afterFullData, true),
4332
+ visibleColumn: []
4333
+ };
4334
+ return $xeTable.getCellAreaPushStackObj ? $xeTable.getCellAreaPushStackObj(stackObj) : stackObj;
4335
+ }
4336
+ /**
4337
+ * 刷新栈视图
4338
+ */
4339
+ function handleUpdateSnapshotStackData($xeTable, stackObj) {
4340
+ const reactData = $xeTable;
4341
+ const internalData = $xeTable;
4342
+ const { editStore } = reactData;
4343
+ const { fullAllDataRowIdData, fullColumnIdData } = internalData;
4344
+ if (!stackObj) {
4345
+ return;
4346
+ }
4347
+ const { visibleData, editActiveInfo, selectActiveInfo } = stackObj;
4348
+ const afterFullList = visibleData.map(item => {
4349
+ const rowid = getRowid($xeTable, item);
4350
+ const rest = fullAllDataRowIdData[rowid];
4351
+ let row = item;
4352
+ if (rest) {
4353
+ row = rest.row;
4354
+ Object.assign(row, item);
4355
+ }
4356
+ return row;
4357
+ });
4358
+ internalData.afterFullData = afterFullList;
4359
+ if ($xeTable.handleCellAreaSnapshotStackData) {
4360
+ $xeTable.handleCellAreaSnapshotStackData(stackObj);
4361
+ }
4362
+ else {
4363
+ const { selected } = editStore;
4364
+ const mouseOpts = $xeTable.computeMouseOpts;
4365
+ let selectRowid = '';
4366
+ let selectColid = '';
4367
+ if (editActiveInfo) {
4368
+ selectRowid = editActiveInfo.rowid;
4369
+ selectColid = editActiveInfo.colid;
4370
+ }
4371
+ else if (selectActiveInfo) {
4372
+ selectRowid = selectActiveInfo.rowid;
4373
+ selectColid = selectActiveInfo.colid;
4374
+ }
4375
+ if (selectRowid && selectColid && mouseOpts.selected) {
4376
+ const editRow = fullAllDataRowIdData[selectRowid] ? fullAllDataRowIdData[selectRowid].row : null;
4377
+ const editColumn = fullColumnIdData[selectColid] ? fullColumnIdData[selectColid].column : null;
4378
+ if (editRow && editColumn) {
4379
+ const params = {
4380
+ row: editRow,
4381
+ column: editColumn
4382
+ };
4383
+ selected.row = editRow;
4384
+ selected.column = editColumn;
4385
+ selected.args = params;
4386
+ $xeTable.$nextTick(() => {
4387
+ $xeTable.addCellSelectedClass();
4388
+ });
4389
+ }
4390
+ }
4391
+ }
4392
+ }
4296
4393
  const tableMethods = {
4297
4394
  callSlot(slotFunc, params, h, vNodes) {
4298
4395
  const $xeTable = this;
@@ -7023,18 +7120,20 @@ const tableMethods = {
7023
7120
  const { isLastEnterAppendRow, beforeEnterMethod, enterMethod, isLastTabAppendRow, beforeTabMethod, tabMethod } = keyboardOpts;
7024
7121
  const { selected, actived } = editStore;
7025
7122
  const { keyCode } = evnt;
7026
- const hasBackspaceKey = keyCode === 8;
7027
- const isTab = keyCode === 9;
7028
- const isEnter = keyCode === 13;
7029
- const isEsc = keyCode === 27;
7030
- const isSpacebar = keyCode === 32;
7031
- const isLeftArrow = keyCode === 37;
7032
- const isUpArrow = keyCode === 38;
7033
- const isRightArrow = keyCode === 39;
7034
- const isDwArrow = keyCode === 40;
7035
- const hasDeleteKey = keyCode === 46;
7036
- const isF2 = keyCode === 113;
7037
- const isContextMenu = keyCode === 93;
7123
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE);
7124
+ const hasBackspaceKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.BACKSPACE);
7125
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB);
7126
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER);
7127
+ const isSpacebar = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR);
7128
+ const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT);
7129
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP);
7130
+ const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT);
7131
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN);
7132
+ const hasDeleteKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE);
7133
+ const isY = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Y);
7134
+ const isZ = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Z);
7135
+ const isF2 = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.F2);
7136
+ const isContextMenu = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.CONTEXT_MENU);
7038
7137
  const isControlKey = hasControlKey(evnt);
7039
7138
  const hasShiftKey = evnt.shiftKey;
7040
7139
  const hasAltKey = evnt.altKey;
@@ -7043,6 +7142,7 @@ const tableMethods = {
7043
7142
  const isEditStatus = isEnableConf(editConfig) && actived.column && actived.row;
7044
7143
  const childrenField = treeOpts.children || treeOpts.childrenField;
7045
7144
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod;
7145
+ const selectColumn = selected.column;
7046
7146
  if (operCtxMenu) {
7047
7147
  // 如果配置了右键菜单; 支持方向键操作、回车
7048
7148
  evnt.preventDefault();
@@ -7074,10 +7174,10 @@ const tableMethods = {
7074
7174
  }
7075
7175
  }
7076
7176
  }
7077
- else if (keyboardConfig && isSpacebar && keyboardOpts.isChecked && selected.row && selected.column && (selected.column.type === 'checkbox' || selected.column.type === 'radio')) {
7177
+ else if (keyboardConfig && isSpacebar && keyboardOpts.isChecked && selected.row && selectColumn && (selectColumn.type === 'checkbox' || selectColumn.type === 'radio')) {
7078
7178
  // 空格键支持选中复选框
7079
7179
  evnt.preventDefault();
7080
- if (selected.column.type === 'checkbox') {
7180
+ if (selectColumn.type === 'checkbox') {
7081
7181
  $xeTable.handleToggleCheckRowEvent(evnt, selected.args);
7082
7182
  }
7083
7183
  else {
@@ -7087,8 +7187,7 @@ const tableMethods = {
7087
7187
  else if (isF2 && isEnableConf(editConfig)) {
7088
7188
  if (!isEditStatus) {
7089
7189
  // 如果按下了 F2 键
7090
- if (selected.row && selected.column) {
7091
- evnt.stopPropagation();
7190
+ if (selected.row && selectColumn) {
7092
7191
  evnt.preventDefault();
7093
7192
  $xeTable.handleEdit(selected.args, evnt);
7094
7193
  }
@@ -7096,7 +7195,7 @@ const tableMethods = {
7096
7195
  }
7097
7196
  else if (isContextMenu) {
7098
7197
  // 如果按下上下文键
7099
- internalData._keyCtx = selected.row && selected.column && bodyMenu.length;
7198
+ internalData._keyCtx = selected.row && selectColumn && bodyMenu.length;
7100
7199
  clearTimeout(internalData.keyCtxTimeout);
7101
7200
  internalData.keyCtxTimeout = setTimeout(() => {
7102
7201
  internalData._keyCtx = false;
@@ -7119,89 +7218,91 @@ const tableMethods = {
7119
7218
  // 如果是激活状态,退则出到上一行/下一行
7120
7219
  if (selected.row || actived.row) {
7121
7220
  const activeRow = selected.row || actived.row;
7122
- const activeColumn = selected.column || actived.column;
7123
- const activeParams = selected.row ? selected.args : actived.args;
7124
- if (hasShiftKey) {
7125
- if (keyboardOpts.enterToTab) {
7126
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7221
+ const activeColumn = selectColumn || actived.column;
7222
+ if (activeColumn) {
7223
+ const activeParams = selected.row ? selected.args : actived.args;
7224
+ if (hasShiftKey) {
7225
+ if (keyboardOpts.enterToTab) {
7226
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7227
+ }
7228
+ else {
7229
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
7230
+ }
7127
7231
  }
7128
7232
  else {
7129
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
7130
- }
7131
- }
7132
- else {
7133
- const _rowIndex = $xeTable.getVTRowIndex(activeRow);
7134
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
7135
- if (keyboardOpts.enterToTab) {
7136
- const ttrParams = {
7137
- row: activeRow,
7138
- rowIndex: $xeTable.getRowIndex(activeRow),
7139
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7140
- _rowIndex,
7141
- column: activeColumn,
7142
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7143
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7144
- _columnIndex,
7145
- $table: $xeTable
7146
- };
7147
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7148
- evnt.preventDefault();
7149
- // 最后一行按下Tab键,自动追加一行
7150
- if (isLastTabAppendRow) {
7151
- const newColumn = visibleColumn[0];
7152
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7153
- if (actived.row) {
7154
- $xeTable.handleClearEdit(evnt);
7233
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow);
7234
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
7235
+ if (keyboardOpts.enterToTab) {
7236
+ const ttrParams = {
7237
+ row: activeRow,
7238
+ rowIndex: $xeTable.getRowIndex(activeRow),
7239
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7240
+ _rowIndex,
7241
+ column: activeColumn,
7242
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7243
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7244
+ _columnIndex,
7245
+ $table: $xeTable
7246
+ };
7247
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7248
+ evnt.preventDefault();
7249
+ // 最后一行按下Tab键,自动追加一行
7250
+ if (isLastTabAppendRow) {
7251
+ const newColumn = visibleColumn[0];
7252
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7253
+ if (actived.row) {
7254
+ $xeTable.handleClearEdit(evnt);
7255
+ }
7256
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7257
+ $xeTable.scrollToRow(newRow, newColumn);
7258
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
7259
+ });
7260
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
7261
+ return;
7155
7262
  }
7156
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7157
- $xeTable.scrollToRow(newRow, newColumn);
7158
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
7159
- });
7160
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
7161
- return;
7162
7263
  }
7163
- }
7164
- if (tabMethod) {
7165
- tabMethod(ttrParams);
7166
- }
7167
- else {
7168
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7264
+ if (tabMethod) {
7265
+ tabMethod(ttrParams);
7266
+ }
7267
+ else {
7268
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7269
+ }
7169
7270
  }
7170
7271
  }
7171
- }
7172
- else {
7173
- const etrParams = {
7174
- row: activeRow,
7175
- rowIndex: $xeTable.getRowIndex(activeRow),
7176
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7177
- _rowIndex,
7178
- column: activeColumn,
7179
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7180
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7181
- _columnIndex,
7182
- $table: $xeTable
7183
- };
7184
- if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
7185
- evnt.preventDefault();
7186
- // 最后一行按下回车键,自动追加一行
7187
- if (isLastEnterAppendRow) {
7188
- if (_rowIndex >= afterFullData.length - 1) {
7189
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7190
- $xeTable.scrollToRow(newRow, selected.column);
7191
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow }), evnt);
7192
- });
7193
- $xeTable.dispatchEvent('enter-append-row', etrParams, evnt);
7194
- return;
7272
+ else {
7273
+ const etrParams = {
7274
+ row: activeRow,
7275
+ rowIndex: $xeTable.getRowIndex(activeRow),
7276
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7277
+ _rowIndex,
7278
+ column: activeColumn,
7279
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7280
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7281
+ _columnIndex,
7282
+ $table: $xeTable
7283
+ };
7284
+ if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
7285
+ evnt.preventDefault();
7286
+ // 最后一行按下回车键,自动追加一行
7287
+ if (isLastEnterAppendRow) {
7288
+ if (_rowIndex >= afterFullData.length - 1) {
7289
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7290
+ $xeTable.scrollToRow(newRow, selectColumn);
7291
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow }), evnt);
7292
+ });
7293
+ $xeTable.dispatchEvent('enter-append-row', etrParams, evnt);
7294
+ return;
7295
+ }
7195
7296
  }
7196
- }
7197
- if (enterMethod) {
7198
- enterMethod(etrParams);
7199
- }
7200
- else {
7201
- if (actived.row) {
7202
- $xeTable.handleClearEdit(evnt);
7297
+ if (enterMethod) {
7298
+ enterMethod(etrParams);
7299
+ }
7300
+ else {
7301
+ if (actived.row) {
7302
+ $xeTable.handleClearEdit(evnt);
7303
+ }
7304
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
7203
7305
  }
7204
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
7205
7306
  }
7206
7307
  }
7207
7308
  }
@@ -7229,7 +7330,7 @@ const tableMethods = {
7229
7330
  else if (operArrow && keyboardConfig && keyboardOpts.isArrow) {
7230
7331
  if (!isEditStatus) {
7231
7332
  // 如果按下了方向键
7232
- if (mouseOpts.selected && selected.row && selected.column) {
7333
+ if (mouseOpts.selected && selected.row && selectColumn) {
7233
7334
  $xeTable.moveArrowSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
7234
7335
  }
7235
7336
  else {
@@ -7248,59 +7349,61 @@ const tableMethods = {
7248
7349
  // 如果按下了 Tab 键切换
7249
7350
  if (selected.row || actived.row) {
7250
7351
  const activeRow = selected.row || actived.row;
7251
- const activeColumn = selected.column || actived.column;
7252
- const activeParams = selected.row ? selected.args : actived.args;
7253
- const _rowIndex = $xeTable.getVTRowIndex(activeRow);
7254
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
7255
- const ttrParams = {
7256
- row: activeRow,
7257
- rowIndex: $xeTable.getRowIndex(activeRow),
7258
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7259
- _rowIndex,
7260
- column: activeColumn,
7261
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7262
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7263
- _columnIndex,
7264
- $table: $xeTable
7265
- };
7266
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7267
- evnt.preventDefault();
7268
- // 最后一行按下Tab键,自动追加一行
7269
- if (isLastTabAppendRow) {
7270
- const newColumn = visibleColumn[0];
7271
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7352
+ const activeColumn = selectColumn || actived.column;
7353
+ if (activeColumn) {
7354
+ const activeParams = selected.row ? selected.args : actived.args;
7355
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow);
7356
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
7357
+ const ttrParams = {
7358
+ row: activeRow,
7359
+ rowIndex: $xeTable.getRowIndex(activeRow),
7360
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7361
+ _rowIndex,
7362
+ column: activeColumn,
7363
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7364
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7365
+ _columnIndex,
7366
+ $table: $xeTable
7367
+ };
7368
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7369
+ evnt.preventDefault();
7370
+ // 最后一行按下Tab键,自动追加一行
7371
+ if (isLastTabAppendRow) {
7372
+ const newColumn = visibleColumn[0];
7373
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7374
+ if (actived.row) {
7375
+ $xeTable.handleClearEdit(evnt);
7376
+ }
7377
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7378
+ $xeTable.scrollToRow(newRow, newColumn);
7379
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
7380
+ });
7381
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
7382
+ return;
7383
+ }
7384
+ }
7385
+ if (tabMethod) {
7386
+ tabMethod(ttrParams);
7387
+ }
7388
+ else {
7272
7389
  if (actived.row) {
7273
7390
  $xeTable.handleClearEdit(evnt);
7274
7391
  }
7275
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7276
- $xeTable.scrollToRow(newRow, newColumn);
7277
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
7278
- });
7279
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
7280
- return;
7281
- }
7282
- }
7283
- if (tabMethod) {
7284
- tabMethod(ttrParams);
7285
- }
7286
- else {
7287
- if (actived.row) {
7288
- $xeTable.handleClearEdit(evnt);
7392
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7289
7393
  }
7290
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
7291
7394
  }
7292
7395
  }
7293
7396
  }
7294
7397
  }
7295
- else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selected.column)) {
7398
+ else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7296
7399
  // 如果是删除键
7297
7400
  if (!isEditStatus) {
7298
7401
  const { delMethod } = keyboardOpts;
7299
7402
  const params = {
7300
7403
  row: selected.row,
7301
7404
  rowIndex: $xeTable.getRowIndex(selected.row),
7302
- column: selected.column,
7303
- columnIndex: $xeTable.getColumnIndex(selected.column),
7405
+ column: selectColumn,
7406
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7304
7407
  $table: $xeTable,
7305
7408
  $grid: $xeGrid,
7306
7409
  $gantt: $xeGantt
@@ -7311,7 +7414,11 @@ const tableMethods = {
7311
7414
  delMethod(params);
7312
7415
  }
7313
7416
  else {
7314
- setCellValue(selected.row, selected.column, null);
7417
+ const selectCellValue = getCellValue(selected.row, selectColumn);
7418
+ if (selectCellValue !== null) {
7419
+ $xeTable.handlePushStack();
7420
+ setCellValue(selected.row, selectColumn, null);
7421
+ }
7315
7422
  }
7316
7423
  // 如果按下 del 键,更新表尾数据
7317
7424
  $xeTable.updateFooter();
@@ -7319,16 +7426,16 @@ const tableMethods = {
7319
7426
  }
7320
7427
  }
7321
7428
  }
7322
- else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selected.column)) {
7429
+ else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7323
7430
  if (!isEditStatus) {
7324
- const { editMode, backMethod } = keyboardOpts;
7431
+ const { backMethod } = keyboardOpts;
7325
7432
  // 如果是删除键
7326
- if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selected.column)) {
7433
+ if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7327
7434
  const params = {
7328
7435
  row: selected.row,
7329
7436
  rowIndex: $xeTable.getRowIndex(selected.row),
7330
- column: selected.column,
7331
- columnIndex: $xeTable.getColumnIndex(selected.column),
7437
+ column: selectColumn,
7438
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7332
7439
  $table: $xeTable,
7333
7440
  $grid: $xeGrid,
7334
7441
  $gantt: $xeGantt
@@ -7339,11 +7446,9 @@ const tableMethods = {
7339
7446
  backMethod(params);
7340
7447
  }
7341
7448
  else {
7342
- // 追加方式与覆盖式
7343
- if (editMode !== 'insert') {
7344
- setCellValue(selected.row, selected.column, null);
7345
- }
7346
- $xeTable.handleEdit(selected.args, evnt);
7449
+ $xeTable.handleEdit(params, evnt, {
7450
+ isClear: true
7451
+ });
7347
7452
  }
7348
7453
  $xeTable.dispatchEvent('cell-backspace-value', params, evnt);
7349
7454
  }
@@ -7368,20 +7473,32 @@ const tableMethods = {
7368
7473
  .then(() => $xeTable.triggerCurrentRowEvent(evnt, params));
7369
7474
  }
7370
7475
  }
7476
+ else if (keyboardConfig && keyboardOpts.isUndoRedo && isControlKey && (isZ || isY) && !hasEventInputTarget(evnt.target)) {
7477
+ if (isY || (hasShiftKey && isZ)) {
7478
+ // 恢复被撤销的操作:Ctrl + Y 或 Ctrl + Shift + Z
7479
+ evnt.preventDefault();
7480
+ $xeTable.handleRedoStackEvent(evnt);
7481
+ }
7482
+ else if (isZ) {
7483
+ // ‌撤销上一步操作‌:Ctrl + Z
7484
+ evnt.preventDefault();
7485
+ $xeTable.handleUndoStackEvent(evnt);
7486
+ }
7487
+ }
7371
7488
  else if (keyboardConfig && keyboardOpts.isEdit && !isControlKey && (isSpacebar || (keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 96 && keyCode <= 111) || (keyCode >= 186 && keyCode <= 192) || (keyCode >= 219 && keyCode <= 222))) {
7372
- const { editMethod } = keyboardOpts;
7489
+ const { editMode, editMethod } = keyboardOpts;
7373
7490
  // 启用编辑后,空格键功能将失效
7374
7491
  // if (isSpacebar) {
7375
7492
  // evnt.preventDefault()
7376
7493
  // }
7377
7494
  // 如果是按下非功能键之外允许直接编辑
7378
- if (selected.column && selected.row && isEnableConf(selected.column.editRender)) {
7495
+ if (selectColumn && selected.row && isEnableConf(selectColumn.editRender)) {
7379
7496
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod;
7380
7497
  const params = {
7381
7498
  row: selected.row,
7382
7499
  rowIndex: $xeTable.getRowIndex(selected.row),
7383
- column: selected.column,
7384
- columnIndex: $xeTable.getColumnIndex(selected.column),
7500
+ column: selectColumn,
7501
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7385
7502
  $table: $xeTable,
7386
7503
  $grid: $xeGrid,
7387
7504
  $gantt: $xeGantt
@@ -7391,8 +7508,14 @@ const tableMethods = {
7391
7508
  editMethod(params);
7392
7509
  }
7393
7510
  else {
7394
- setCellValue(selected.row, selected.column, null);
7395
- $xeTable.handleEdit(selected.args, evnt);
7511
+ let isClearValue = false;
7512
+ // 追加方式与覆盖式
7513
+ if (editMode !== 'insert') {
7514
+ isClearValue = true;
7515
+ }
7516
+ $xeTable.handleEdit(params, evnt, {
7517
+ isClear: isClearValue
7518
+ });
7396
7519
  }
7397
7520
  }
7398
7521
  }
@@ -9236,6 +9359,7 @@ const tableMethods = {
9236
9359
  afterFullData.splice(nafIndex, 0, dragRow);
9237
9360
  tableFullData.splice(ntfIndex, 0, dragRow);
9238
9361
  }
9362
+ $xeTable.handleClearStack();
9239
9363
  $xeTable.handleTableData(treeConfig && transform);
9240
9364
  $xeTable.cacheRowMap(false);
9241
9365
  updateScrollYStatus($xeTable);
@@ -9929,6 +10053,7 @@ const tableMethods = {
9929
10053
  column.renderSortNumber = sortIndex;
9930
10054
  }
9931
10055
  });
10056
+ $xeTable.handleClearStack();
9932
10057
  if (mouseConfig) {
9933
10058
  if ($xeTable.clearSelected) {
9934
10059
  $xeTable.clearSelected();
@@ -12434,12 +12559,71 @@ const tableMethods = {
12434
12559
  const internalData = $xeTable;
12435
12560
  return loadTableData($xeTable, internalData.tableSynchData, false, true);
12436
12561
  },
12562
+ handlePushStack() {
12563
+ const $xeTable = this;
12564
+ const internalData = $xeTable;
12565
+ const keyboardOpts = $xeTable.computeKeyboardOpts;
12566
+ if (!keyboardOpts.isUndoRedo) {
12567
+ return;
12568
+ }
12569
+ const { stackHistoryStore } = internalData;
12570
+ const stackObj = getSnapshotStackData($xeTable);
12571
+ stackHistoryStore.undoStacks.push(stackObj);
12572
+ stackHistoryStore.redoStacks = [];
12573
+ truncateStackHistory($xeTable);
12574
+ },
12575
+ handleUndoStackEvent(evnt) {
12576
+ const $xeTable = this;
12577
+ const internalData = $xeTable;
12578
+ const { stackHistoryStore } = internalData;
12579
+ const { undoStacks, redoStacks } = stackHistoryStore;
12580
+ if (undoStacks.length) {
12581
+ const stackObj = getSnapshotStackData($xeTable);
12582
+ redoStacks.push(stackObj);
12583
+ handleUpdateSnapshotStackData($xeTable, undoStacks.pop());
12584
+ if (evnt) {
12585
+ $xeTable.dispatchEvent('undo', {}, evnt);
12586
+ }
12587
+ return $xeTable.$nextTick(() => {
12588
+ return { status: true };
12589
+ });
12590
+ }
12591
+ return Promise.resolve({ status: false });
12592
+ },
12593
+ handleRedoStackEvent(evnt) {
12594
+ const $xeTable = this;
12595
+ const internalData = $xeTable;
12596
+ const { stackHistoryStore } = internalData;
12597
+ const { undoStacks, redoStacks } = stackHistoryStore;
12598
+ if (redoStacks.length) {
12599
+ const stackObj = getSnapshotStackData($xeTable);
12600
+ undoStacks.push(stackObj);
12601
+ handleUpdateSnapshotStackData($xeTable, redoStacks.pop());
12602
+ if (evnt) {
12603
+ $xeTable.dispatchEvent('redo', {}, evnt);
12604
+ }
12605
+ return $xeTable.$nextTick(() => {
12606
+ return { status: true };
12607
+ });
12608
+ }
12609
+ return Promise.resolve({ status: false });
12610
+ },
12611
+ handleClearStack() {
12612
+ const $xeTable = this;
12613
+ const internalData = $xeTable;
12614
+ const { stackHistoryStore } = internalData;
12615
+ stackHistoryStore.undoStacks = [];
12616
+ stackHistoryStore.redoStacks = [];
12617
+ },
12437
12618
  updateZindex() {
12438
- if (this.zIndex) {
12439
- this.tZindex = this.zIndex;
12619
+ const $xeTable = this;
12620
+ const props = $xeTable;
12621
+ const internalData = $xeTable;
12622
+ if (props.zIndex) {
12623
+ internalData.tZindex = props.zIndex;
12440
12624
  }
12441
- else if (this.tZindex < getLastZIndex()) {
12442
- this.tZindex = nextZIndex();
12625
+ else if (internalData.tZindex < getLastZIndex()) {
12626
+ internalData.tZindex = nextZIndex();
12443
12627
  }
12444
12628
  },
12445
12629
  updateCellAreas() {
@@ -12452,6 +12636,14 @@ const tableMethods = {
12452
12636
  }
12453
12637
  return $xeTable.$nextTick();
12454
12638
  },
12639
+ undo() {
12640
+ const $xeTable = this;
12641
+ return $xeTable.handleUndoStackEvent(null);
12642
+ },
12643
+ redo() {
12644
+ const $xeTable = this;
12645
+ return $xeTable.handleRedoStackEvent(null);
12646
+ },
12455
12647
  dispatchEvent(type, params, evnt) {
12456
12648
  const $xeTable = this;
12457
12649
  const $xeGrid = $xeTable.$xeGrid;
@@ -12464,19 +12656,24 @@ const tableMethods = {
12464
12656
  $xeTable.dispatchEvent(type, params, evnt);
12465
12657
  },
12466
12658
  focus() {
12467
- this.isActivated = true;
12468
- return this.$nextTick();
12659
+ const $xeTable = this;
12660
+ const internalData = $xeTable;
12661
+ internalData.isActivated = true;
12662
+ return $xeTable.$nextTick();
12469
12663
  },
12470
12664
  blur() {
12471
- this.isActivated = false;
12472
- return this.$nextTick();
12665
+ const $xeTable = this;
12666
+ const internalData = $xeTable;
12667
+ internalData.isActivated = false;
12668
+ return $xeTable.$nextTick();
12473
12669
  },
12474
12670
  /**
12475
12671
  * 已废弃,被 connectToolbar 替换
12476
12672
  * @deprecated
12477
12673
  */
12478
12674
  connect($toolbar) {
12479
- return this.connectToolbar($toolbar);
12675
+ const $xeTable = this;
12676
+ return $xeTable.connectToolbar($toolbar);
12480
12677
  },
12481
12678
  /**
12482
12679
  * 连接工具栏
@@ -12484,14 +12681,15 @@ const tableMethods = {
12484
12681
  */
12485
12682
  connectToolbar($toolbar) {
12486
12683
  const $xeTable = this;
12684
+ const internalData = $xeTable;
12487
12685
  if ($toolbar && $toolbar.syncUpdate) {
12488
- $toolbar.syncUpdate({ collectColumn: this.collectColumn, $table: $xeTable });
12686
+ $toolbar.syncUpdate({ collectColumn: internalData.collectColumn, $table: $xeTable });
12489
12687
  this.$toolbar = $toolbar;
12490
12688
  }
12491
12689
  else {
12492
12690
  errLog('vxe.error.barUnableLink');
12493
12691
  }
12494
- return this.$nextTick();
12692
+ return $xeTable.$nextTick();
12495
12693
  },
12496
12694
  handleConnectGanttView($ganttView) {
12497
12695
  const $xeTable = this;
@@ -12510,17 +12708,19 @@ const tableMethods = {
12510
12708
  * @deprecated
12511
12709
  */
12512
12710
  getCell(row, column) {
12513
- return this.getCellElement(row, column);
12711
+ const $xeTable = this;
12712
+ return $xeTable.getCellElement(row, column);
12514
12713
  },
12515
12714
  findRowIndexOf(list, row) {
12516
12715
  return row ? XEUtils.findIndexOf(list, item => this.eqRow(item, row)) : -1;
12517
12716
  },
12518
12717
  eqRow(row1, row2) {
12718
+ const $xeTable = this;
12519
12719
  if (row1 && row2) {
12520
12720
  if (row1 === row2) {
12521
12721
  return true;
12522
12722
  }
12523
- return getRowid(this, row1) === getRowid(this, row2);
12723
+ return getRowid($xeTable, row1) === getRowid($xeTable, row2);
12524
12724
  }
12525
12725
  return false;
12526
12726
  },