vxe-table 4.18.13 → 4.19.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/README.md +2 -2
  2. package/es/grid/src/grid.js +1 -1
  3. package/es/index.css +1 -1
  4. package/es/index.min.css +1 -1
  5. package/es/style.css +1 -1
  6. package/es/style.min.css +1 -1
  7. package/es/table/module/edit/hook.js +36 -12
  8. package/es/table/module/keyboard/hook.js +2 -2
  9. package/es/table/src/emits.js +2 -0
  10. package/es/table/src/props.js +2 -2
  11. package/es/table/src/table.js +325 -141
  12. package/es/table/src/util.js +12 -3
  13. package/es/ui/index.js +3 -3
  14. package/es/ui/src/dom.js +4 -0
  15. package/es/ui/src/log.js +1 -1
  16. package/lib/grid/src/grid.js +1 -1
  17. package/lib/grid/src/grid.min.js +1 -1
  18. package/lib/index.css +1 -1
  19. package/lib/index.min.css +1 -1
  20. package/lib/index.umd.js +108 -55
  21. package/lib/index.umd.min.js +1 -1
  22. package/lib/style.css +1 -1
  23. package/lib/style.min.css +1 -1
  24. package/lib/table/module/edit/hook.js +42 -12
  25. package/lib/table/module/edit/hook.min.js +1 -1
  26. package/lib/table/module/keyboard/hook.js +2 -2
  27. package/lib/table/module/keyboard/hook.min.js +1 -1
  28. package/lib/table/src/emits.js +1 -1
  29. package/lib/table/src/emits.min.js +1 -1
  30. package/lib/table/src/props.js +2 -2
  31. package/lib/table/src/props.min.js +1 -1
  32. package/lib/table/src/table.js +39 -30
  33. package/lib/table/src/table.min.js +1 -1
  34. package/lib/table/src/util.js +12 -3
  35. package/lib/table/src/util.min.js +1 -1
  36. package/lib/ui/index.js +3 -3
  37. package/lib/ui/index.min.js +1 -1
  38. package/lib/ui/src/dom.js +5 -0
  39. package/lib/ui/src/dom.min.js +1 -1
  40. package/lib/ui/src/log.js +1 -1
  41. package/lib/ui/src/log.min.js +1 -1
  42. package/package.json +3 -3
  43. package/packages/grid/src/grid.ts +1 -1
  44. package/packages/table/module/edit/hook.ts +44 -12
  45. package/packages/table/module/keyboard/hook.ts +2 -2
  46. package/packages/table/src/emits.ts +2 -0
  47. package/packages/table/src/props.ts +2 -2
  48. package/packages/table/src/table.ts +320 -136
  49. package/packages/table/src/util.ts +15 -5
  50. package/packages/ui/index.ts +2 -2
  51. package/packages/ui/src/dom.ts +5 -0
  52. /package/es/{iconfont.1776926463538.ttf → iconfont.1777796358891.ttf} +0 -0
  53. /package/es/{iconfont.1776926463538.woff → iconfont.1777796358891.woff} +0 -0
  54. /package/es/{iconfont.1776926463538.woff2 → iconfont.1777796358891.woff2} +0 -0
  55. /package/lib/{iconfont.1776926463538.ttf → iconfont.1777796358891.ttf} +0 -0
  56. /package/lib/{iconfont.1776926463538.woff → iconfont.1777796358891.woff} +0 -0
  57. /package/lib/{iconfont.1776926463538.woff2 → iconfont.1777796358891.woff2} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { h, reactive, ref, provide, inject, nextTick, Teleport, onActivated, onDeactivated, onBeforeUnmount, onUnmounted, watch, computed, onMounted } from 'vue';
2
2
  import { defineVxeComponent } from '../../ui/src/comp';
3
3
  import XEUtils from 'xe-utils';
4
- import { initTpImg, getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollTopTo, wheelScrollLeftTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement } from '../../ui/src/dom';
4
+ import { initTpImg, getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollTopTo, wheelScrollLeftTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement, hasEventInputTarget } from '../../ui/src/dom';
5
5
  import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue } from '../../ui/src/utils';
6
6
  import { VxeUI } from '../../ui';
7
7
  import { createReactData, createInternalData, getRowUniqueId, createRowId, clearTableAllStatus, getColumnList, toFilters, hasDeepKey, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getRefElem, getColReMinWidth, createHandleUpdateRowId, createHandleGetRowId, getCalcHeight, getCellRestHeight, getLastChildColumn } from './util';
@@ -332,8 +332,8 @@ export default defineVxeComponent({
332
332
  const computeClipOpts = computed(() => {
333
333
  return Object.assign({}, getConfig().table.clipConfig, props.clipConfig);
334
334
  });
335
- const computeUndoHistoryOpts = computed(() => {
336
- return Object.assign({}, getConfig().table.undoHistoryConfig, props.undoHistoryConfig);
335
+ const computeUndoRedoHistoryOpts = computed(() => {
336
+ return Object.assign({}, getConfig().table.undoRedoHistoryConfig, props.undoRedoHistoryConfig);
337
337
  });
338
338
  const computeFNROpts = computed(() => {
339
339
  const fnrOpts = computeFnrOpts.value;
@@ -768,7 +768,7 @@ export default defineVxeComponent({
768
768
  computeRowGroupFields,
769
769
  computeRowGroupColumns,
770
770
  computeAggFuncColumns,
771
- computeUndoHistoryOpts,
771
+ computeUndoRedoHistoryOpts,
772
772
  computeFNROpts,
773
773
  computeSXOpts,
774
774
  computeSYOpts
@@ -1720,7 +1720,7 @@ export default defineVxeComponent({
1720
1720
  errLog('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand']);
1721
1721
  }
1722
1722
  if (expandOpts.mode !== 'inside' && (treeConfig && !treeOpts.transform)) {
1723
- errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=fixed']);
1723
+ errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=inside']);
1724
1724
  }
1725
1725
  if (props.spanMethod) {
1726
1726
  warnLog('vxe.error.notSupportProp', ['column.type=expand', 'span-method', 'span-method=null']);
@@ -3642,6 +3642,7 @@ export default defineVxeComponent({
3642
3642
  }
3643
3643
  $xeTable.clearMergeCells();
3644
3644
  $xeTable.clearMergeFooterItems();
3645
+ $xeTable.handleClearStack();
3645
3646
  $xeTable.handleTableData(true);
3646
3647
  $xeTable.updateFooter();
3647
3648
  $xeTable.handleUpdateBodyMerge();
@@ -7623,6 +7624,12 @@ export default defineVxeComponent({
7623
7624
  }
7624
7625
  return nextTick();
7625
7626
  },
7627
+ undo() {
7628
+ return $xeTable.handleUndoStackEvent(null);
7629
+ },
7630
+ redo() {
7631
+ return $xeTable.handleRedoStackEvent(null);
7632
+ },
7626
7633
  getCustomStoreData() {
7627
7634
  const { id } = props;
7628
7635
  const customOpts = computeCustomOpts.value;
@@ -8024,6 +8031,8 @@ export default defineVxeComponent({
8024
8031
  const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT);
8025
8032
  const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN);
8026
8033
  const hasDeleteKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE);
8034
+ const isY = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Y);
8035
+ const isZ = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Z);
8027
8036
  const isF2 = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.F2);
8028
8037
  const isContextMenu = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.CONTEXT_MENU);
8029
8038
  const isControlKey = hasControlKey(evnt);
@@ -8033,6 +8042,7 @@ export default defineVxeComponent({
8033
8042
  const operCtxMenu = isContentMenu && ctxMenuStore.visible && (isEnter || isSpacebar || operArrow);
8034
8043
  const isEditStatus = isEnableConf(editConfig) && actived.column && actived.row;
8035
8044
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod;
8045
+ const selectColumn = selected.column;
8036
8046
  if (operCtxMenu) {
8037
8047
  // 如果配置了右键菜单; 支持方向键操作、回车
8038
8048
  evnt.preventDefault();
@@ -8064,10 +8074,10 @@ export default defineVxeComponent({
8064
8074
  }
8065
8075
  }
8066
8076
  }
8067
- else if (isSpacebar && keyboardConfig && keyboardOpts.isChecked && selected.row && selected.column && (selected.column.type === 'checkbox' || selected.column.type === 'radio')) {
8077
+ else if (isSpacebar && keyboardConfig && keyboardOpts.isChecked && selected.row && selectColumn && (selectColumn.type === 'checkbox' || selectColumn.type === 'radio')) {
8068
8078
  // 空格键支持选中复选框
8069
8079
  evnt.preventDefault();
8070
- if (selected.column.type === 'checkbox') {
8080
+ if (selectColumn.type === 'checkbox') {
8071
8081
  $xeTable.handleToggleCheckRowEvent(evnt, selected.args);
8072
8082
  }
8073
8083
  else {
@@ -8077,7 +8087,7 @@ export default defineVxeComponent({
8077
8087
  else if (isF2 && isEnableConf(editConfig)) {
8078
8088
  if (!isEditStatus) {
8079
8089
  // 如果按下了 F2 键
8080
- if (selected.row && selected.column) {
8090
+ if (selected.row && selectColumn) {
8081
8091
  evnt.preventDefault();
8082
8092
  $xeTable.handleEdit(selected.args, evnt);
8083
8093
  }
@@ -8085,7 +8095,7 @@ export default defineVxeComponent({
8085
8095
  }
8086
8096
  else if (isContextMenu) {
8087
8097
  // 如果按下上下文键
8088
- internalData._keyCtx = selected.row && selected.column && bodyMenu.length;
8098
+ internalData._keyCtx = selected.row && selectColumn && bodyMenu.length;
8089
8099
  clearTimeout(internalData.keyCtxTimeout);
8090
8100
  internalData.keyCtxTimeout = setTimeout(() => {
8091
8101
  internalData._keyCtx = false;
@@ -8110,89 +8120,91 @@ export default defineVxeComponent({
8110
8120
  // 如果是激活状态,退则出到上一行/下一行
8111
8121
  if (selected.row || actived.row) {
8112
8122
  const activeRow = selected.row || actived.row;
8113
- const activeColumn = selected.column || actived.column;
8114
- const activeParams = selected.row ? selected.args : actived.args;
8115
- if (hasShiftKey) {
8116
- if (keyboardOpts.enterToTab) {
8117
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8123
+ const activeColumn = selectColumn || actived.column;
8124
+ if (activeColumn) {
8125
+ const activeParams = selected.row ? selected.args : actived.args;
8126
+ if (hasShiftKey) {
8127
+ if (keyboardOpts.enterToTab) {
8128
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8129
+ }
8130
+ else {
8131
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
8132
+ }
8118
8133
  }
8119
8134
  else {
8120
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt);
8121
- }
8122
- }
8123
- else {
8124
- const _rowIndex = $xeTable.getVTRowIndex(activeRow);
8125
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
8126
- if (keyboardOpts.enterToTab) {
8127
- const ttrParams = {
8128
- row: activeRow,
8129
- rowIndex: $xeTable.getRowIndex(activeRow),
8130
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
8131
- _rowIndex,
8132
- column: activeColumn,
8133
- columnIndex: $xeTable.getColumnIndex(activeColumn),
8134
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8135
- _columnIndex,
8136
- $table: $xeTable
8137
- };
8138
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
8139
- evnt.preventDefault();
8140
- // 最后一行按下Tab键,自动追加一行
8141
- if (isLastTabAppendRow) {
8142
- const newColumn = visibleColumn[0];
8143
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
8144
- if (actived.row) {
8145
- $xeTable.handleClearEdit(evnt);
8135
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow);
8136
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
8137
+ if (keyboardOpts.enterToTab) {
8138
+ const ttrParams = {
8139
+ row: activeRow,
8140
+ rowIndex: $xeTable.getRowIndex(activeRow),
8141
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
8142
+ _rowIndex,
8143
+ column: activeColumn,
8144
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
8145
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8146
+ _columnIndex,
8147
+ $table: $xeTable
8148
+ };
8149
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
8150
+ evnt.preventDefault();
8151
+ // 最后一行按下Tab键,自动追加一行
8152
+ if (isLastTabAppendRow) {
8153
+ const newColumn = visibleColumn[0];
8154
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
8155
+ if (actived.row) {
8156
+ $xeTable.handleClearEdit(evnt);
8157
+ }
8158
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8159
+ $xeTable.scrollToRow(newRow, newColumn);
8160
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
8161
+ });
8162
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
8163
+ return;
8146
8164
  }
8147
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8148
- $xeTable.scrollToRow(newRow, newColumn);
8149
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
8150
- });
8151
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
8152
- return;
8153
8165
  }
8154
- }
8155
- if (tabMethod) {
8156
- tabMethod(ttrParams);
8157
- }
8158
- else {
8159
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8166
+ if (tabMethod) {
8167
+ tabMethod(ttrParams);
8168
+ }
8169
+ else {
8170
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8171
+ }
8160
8172
  }
8161
8173
  }
8162
- }
8163
- else {
8164
- const etrParams = {
8165
- row: activeRow,
8166
- rowIndex: $xeTable.getRowIndex(activeRow),
8167
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
8168
- _rowIndex,
8169
- column: activeColumn,
8170
- columnIndex: $xeTable.getColumnIndex(activeColumn),
8171
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8172
- _columnIndex,
8173
- $table: $xeTable
8174
- };
8175
- if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
8176
- evnt.preventDefault();
8177
- // 最后一行按下回车键,自动追加一行
8178
- if (isLastEnterAppendRow) {
8179
- if (_rowIndex >= afterFullData.length - 1) {
8180
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8181
- $xeTable.scrollToRow(newRow, activeColumn);
8182
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow }), evnt);
8183
- });
8184
- $xeTable.dispatchEvent('enter-append-row', etrParams, evnt);
8185
- return;
8174
+ else {
8175
+ const etrParams = {
8176
+ row: activeRow,
8177
+ rowIndex: $xeTable.getRowIndex(activeRow),
8178
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
8179
+ _rowIndex,
8180
+ column: activeColumn,
8181
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
8182
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8183
+ _columnIndex,
8184
+ $table: $xeTable
8185
+ };
8186
+ if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
8187
+ evnt.preventDefault();
8188
+ // 最后一行按下回车键,自动追加一行
8189
+ if (isLastEnterAppendRow) {
8190
+ if (_rowIndex >= afterFullData.length - 1) {
8191
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8192
+ $xeTable.scrollToRow(newRow, activeColumn);
8193
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow }), evnt);
8194
+ });
8195
+ $xeTable.dispatchEvent('enter-append-row', etrParams, evnt);
8196
+ return;
8197
+ }
8186
8198
  }
8187
- }
8188
- if (enterMethod) {
8189
- enterMethod(etrParams);
8190
- }
8191
- else {
8192
- if (actived.row) {
8193
- $xeTable.handleClearEdit(evnt);
8199
+ if (enterMethod) {
8200
+ enterMethod(etrParams);
8201
+ }
8202
+ else {
8203
+ if (actived.row) {
8204
+ $xeTable.handleClearEdit(evnt);
8205
+ }
8206
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
8194
8207
  }
8195
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt);
8196
8208
  }
8197
8209
  }
8198
8210
  }
@@ -8220,7 +8232,7 @@ export default defineVxeComponent({
8220
8232
  else if (operArrow && keyboardConfig && keyboardOpts.isArrow) {
8221
8233
  if (!isEditStatus) {
8222
8234
  // 如果按下了方向键
8223
- if (mouseOpts.selected && selected.row && selected.column) {
8235
+ if (mouseOpts.selected && selected.row && selectColumn) {
8224
8236
  $xeTable.moveArrowSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt);
8225
8237
  }
8226
8238
  else {
@@ -8239,59 +8251,61 @@ export default defineVxeComponent({
8239
8251
  // 如果按下了 Tab 键切换
8240
8252
  if (selected.row || actived.row) {
8241
8253
  const activeRow = selected.row || actived.row;
8242
- const activeColumn = selected.column || actived.column;
8243
- const activeParams = selected.row ? selected.args : actived.args;
8244
- const _rowIndex = $xeTable.getVTRowIndex(activeRow);
8245
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
8246
- const ttrParams = {
8247
- row: activeRow,
8248
- rowIndex: $xeTable.getRowIndex(activeRow),
8249
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
8250
- _rowIndex,
8251
- column: activeColumn,
8252
- columnIndex: $xeTable.getColumnIndex(activeColumn),
8253
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8254
- _columnIndex,
8255
- $table: $xeTable
8256
- };
8257
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
8258
- evnt.preventDefault();
8259
- // 最后一行按下Tab键,自动追加一行
8260
- if (isLastTabAppendRow) {
8261
- const newColumn = visibleColumn[0];
8262
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
8254
+ const activeColumn = selectColumn || actived.column;
8255
+ if (activeColumn) {
8256
+ const activeParams = selected.row ? selected.args : actived.args;
8257
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow);
8258
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn);
8259
+ const ttrParams = {
8260
+ row: activeRow,
8261
+ rowIndex: $xeTable.getRowIndex(activeRow),
8262
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
8263
+ _rowIndex,
8264
+ column: activeColumn,
8265
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
8266
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
8267
+ _columnIndex,
8268
+ $table: $xeTable
8269
+ };
8270
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
8271
+ evnt.preventDefault();
8272
+ // 最后一行按下Tab键,自动追加一行
8273
+ if (isLastTabAppendRow) {
8274
+ const newColumn = visibleColumn[0];
8275
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
8276
+ if (actived.row) {
8277
+ $xeTable.handleClearEdit(evnt);
8278
+ }
8279
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8280
+ $xeTable.scrollToRow(newRow, newColumn);
8281
+ $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
8282
+ });
8283
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
8284
+ return;
8285
+ }
8286
+ }
8287
+ if (tabMethod) {
8288
+ tabMethod(ttrParams);
8289
+ }
8290
+ else {
8263
8291
  if (actived.row) {
8264
8292
  $xeTable.handleClearEdit(evnt);
8265
8293
  }
8266
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
8267
- $xeTable.scrollToRow(newRow, newColumn);
8268
- $xeTable.handleSelected(Object.assign(Object.assign({}, activeParams), { row: newRow, column: newColumn }), evnt);
8269
- });
8270
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt);
8271
- return;
8272
- }
8273
- }
8274
- if (tabMethod) {
8275
- tabMethod(ttrParams);
8276
- }
8277
- else {
8278
- if (actived.row) {
8279
- $xeTable.handleClearEdit(evnt);
8294
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8280
8295
  }
8281
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt);
8282
8296
  }
8283
8297
  }
8284
8298
  }
8285
8299
  }
8286
- else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selected.column)) {
8300
+ else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selectColumn)) {
8287
8301
  // 如果是删除键
8288
8302
  if (!isEditStatus) {
8289
8303
  const { delMethod } = keyboardOpts;
8290
8304
  const params = {
8291
8305
  row: selected.row,
8292
8306
  rowIndex: $xeTable.getRowIndex(selected.row),
8293
- column: selected.column,
8294
- columnIndex: $xeTable.getColumnIndex(selected.column),
8307
+ column: selectColumn,
8308
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
8295
8309
  $table: $xeTable,
8296
8310
  $grid: $xeGrid,
8297
8311
  $gantt: $xeGantt
@@ -8302,7 +8316,11 @@ export default defineVxeComponent({
8302
8316
  delMethod(params);
8303
8317
  }
8304
8318
  else {
8305
- setCellValue(selected.row, selected.column, null);
8319
+ const selectCellValue = getCellValue(selected.row, selectColumn);
8320
+ if (selectCellValue !== null) {
8321
+ $xeTable.handlePushStack();
8322
+ setCellValue(selected.row, selectColumn, null);
8323
+ }
8306
8324
  }
8307
8325
  // 如果按下 del 键,更新表尾数据
8308
8326
  $xeTable.updateFooter();
@@ -8310,16 +8328,16 @@ export default defineVxeComponent({
8310
8328
  }
8311
8329
  }
8312
8330
  }
8313
- else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selected.column)) {
8331
+ else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selectColumn)) {
8314
8332
  if (!isEditStatus) {
8315
8333
  const { backMethod } = keyboardOpts;
8316
8334
  // 如果是删除键
8317
- if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selected.column)) {
8335
+ if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selectColumn)) {
8318
8336
  const params = {
8319
8337
  row: selected.row,
8320
8338
  rowIndex: $xeTable.getRowIndex(selected.row),
8321
- column: selected.column,
8322
- columnIndex: $xeTable.getColumnIndex(selected.column),
8339
+ column: selectColumn,
8340
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
8323
8341
  $table: $xeTable,
8324
8342
  $grid: $xeGrid,
8325
8343
  $gantt: $xeGantt
@@ -8330,8 +8348,9 @@ export default defineVxeComponent({
8330
8348
  backMethod(params);
8331
8349
  }
8332
8350
  else {
8333
- setCellValue(selected.row, selected.column, null);
8334
- $xeTable.handleEdit(selected.args, evnt);
8351
+ $xeTable.handleEdit(params, evnt, {
8352
+ isClear: true
8353
+ });
8335
8354
  }
8336
8355
  dispatchEvent('cell-backspace-value', params, evnt);
8337
8356
  }
@@ -8356,6 +8375,20 @@ export default defineVxeComponent({
8356
8375
  .then(() => $xeTable.triggerCurrentRowEvent(evnt, params));
8357
8376
  }
8358
8377
  }
8378
+ else if (keyboardConfig && keyboardOpts.isUndoRedo && isControlKey && (isZ || isY) && !hasEventInputTarget(evnt.target)) {
8379
+ if (evnt.target) {
8380
+ if (isY || (hasShiftKey && isZ)) {
8381
+ // 恢复被撤销的操作:Ctrl + Y 或 Ctrl + Shift + Z
8382
+ evnt.preventDefault();
8383
+ $xeTable.handleRedoStackEvent(evnt);
8384
+ }
8385
+ else if (isZ) {
8386
+ // ‌撤销上一步操作‌:Ctrl + Z
8387
+ evnt.preventDefault();
8388
+ $xeTable.handleUndoStackEvent(evnt);
8389
+ }
8390
+ }
8391
+ }
8359
8392
  else if (keyboardConfig && isEnableConf(editConfig) && keyboardOpts.isEdit && !isControlKey && (isSpacebar || (keyCode >= 48 && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 96 && keyCode <= 111) || (keyCode >= 186 && keyCode <= 192) || (keyCode >= 219 && keyCode <= 222))) {
8360
8393
  const { editMode, editMethod } = keyboardOpts;
8361
8394
  // 启用编辑后,空格键功能将失效
@@ -8363,27 +8396,30 @@ export default defineVxeComponent({
8363
8396
  // evnt.preventDefault()
8364
8397
  // }
8365
8398
  // 如果是按下非功能键之外允许直接编辑
8366
- if (selected.column && selected.row && isEnableConf(selected.column.editRender)) {
8399
+ if (selectColumn && selected.row && isEnableConf(selectColumn.editRender)) {
8367
8400
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod;
8368
8401
  const params = {
8369
8402
  row: selected.row,
8370
8403
  rowIndex: $xeTable.getRowIndex(selected.row),
8371
- column: selected.column,
8372
- columnIndex: $xeTable.getColumnIndex(selected.column),
8404
+ column: selectColumn,
8405
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
8373
8406
  $table: $xeTable,
8374
8407
  $grid: $xeGrid,
8375
8408
  $gantt: $xeGantt
8376
8409
  };
8377
- if (!beforeEditMethod || beforeEditMethod(Object.assign(Object.assign({}, selected.args), { $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt }))) {
8410
+ if (!beforeEditMethod || beforeEditMethod(params)) {
8378
8411
  if (editMethod) {
8379
8412
  editMethod(params);
8380
8413
  }
8381
8414
  else {
8415
+ let isClearValue = false;
8382
8416
  // 追加方式与覆盖式
8383
8417
  if (editMode !== 'insert') {
8384
- setCellValue(selected.row, selected.column, null);
8418
+ isClearValue = true;
8385
8419
  }
8386
- $xeTable.handleEdit(selected.args, evnt);
8420
+ $xeTable.handleEdit(params, evnt, {
8421
+ isClear: isClearValue
8422
+ });
8387
8423
  }
8388
8424
  }
8389
8425
  }
@@ -8736,6 +8772,97 @@ export default defineVxeComponent({
8736
8772
  }
8737
8773
  return nextTick();
8738
8774
  };
8775
+ const truncateStackHistory = () => {
8776
+ const { stackHistoryStore } = internalData;
8777
+ const { undoStacks } = stackHistoryStore;
8778
+ const undoRedoHistoryOpts = computeUndoRedoHistoryOpts.value;
8779
+ const { stackSize } = undoRedoHistoryOpts;
8780
+ if (undoStacks.length > XEUtils.toNumber(stackSize)) {
8781
+ undoStacks.shift();
8782
+ }
8783
+ };
8784
+ /**
8785
+ * 生成快照数据
8786
+ */
8787
+ const getSnapshotStackData = () => {
8788
+ const { editStore } = reactData;
8789
+ const { afterFullData } = internalData;
8790
+ const { selected, actived } = editStore;
8791
+ const { row: selectRow, column: selectColumn } = selected;
8792
+ const { row: editRow, column: editColumn } = actived;
8793
+ const stackObj = {
8794
+ selectActiveInfo: selectRow && selectColumn
8795
+ ? {
8796
+ rowid: getRowid($xeTable, selectRow),
8797
+ colid: selectColumn.id
8798
+ }
8799
+ : undefined,
8800
+ editActiveInfo: editRow && editColumn
8801
+ ? {
8802
+ rowid: getRowid($xeTable, editRow),
8803
+ colid: editColumn.id
8804
+ }
8805
+ : undefined,
8806
+ visibleData: XEUtils.clone(afterFullData, true),
8807
+ visibleColumn: []
8808
+ };
8809
+ return $xeTable.getCellAreaPushStackObj ? $xeTable.getCellAreaPushStackObj(stackObj) : stackObj;
8810
+ };
8811
+ /**
8812
+ * 刷新栈视图
8813
+ */
8814
+ const handleUpdateSnapshotStackData = (stackObj) => {
8815
+ const { editStore } = reactData;
8816
+ const { fullAllDataRowIdData, fullColumnIdData } = internalData;
8817
+ if (!stackObj) {
8818
+ return;
8819
+ }
8820
+ const { visibleData, editActiveInfo, selectActiveInfo } = stackObj;
8821
+ const afterFullList = visibleData.map(item => {
8822
+ const rowid = getRowid($xeTable, item);
8823
+ const rest = fullAllDataRowIdData[rowid];
8824
+ let row = item;
8825
+ if (rest) {
8826
+ row = rest.row;
8827
+ Object.assign(row, item);
8828
+ }
8829
+ return row;
8830
+ });
8831
+ internalData.afterFullData = afterFullList;
8832
+ if ($xeTable.handleCellAreaSnapshotStackData) {
8833
+ $xeTable.handleCellAreaSnapshotStackData(stackObj);
8834
+ }
8835
+ else {
8836
+ const { selected } = editStore;
8837
+ const mouseOpts = computeMouseOpts.value;
8838
+ let selectRowid = '';
8839
+ let selectColid = '';
8840
+ if (editActiveInfo) {
8841
+ selectRowid = editActiveInfo.rowid;
8842
+ selectColid = editActiveInfo.colid;
8843
+ }
8844
+ else if (selectActiveInfo) {
8845
+ selectRowid = selectActiveInfo.rowid;
8846
+ selectColid = selectActiveInfo.colid;
8847
+ }
8848
+ if (selectRowid && selectColid && mouseOpts.selected) {
8849
+ const editRow = fullAllDataRowIdData[selectRowid] ? fullAllDataRowIdData[selectRowid].row : null;
8850
+ const editColumn = fullColumnIdData[selectColid] ? fullColumnIdData[selectColid].column : null;
8851
+ if (editRow && editColumn) {
8852
+ const params = {
8853
+ row: editRow,
8854
+ column: editColumn
8855
+ };
8856
+ selected.row = editRow;
8857
+ selected.column = editColumn;
8858
+ selected.args = params;
8859
+ nextTick(() => {
8860
+ $xeTable.addCellSelectedClass();
8861
+ });
8862
+ }
8863
+ }
8864
+ }
8865
+ };
8739
8866
  const callSlot = (slotFunc, params) => {
8740
8867
  if (slotFunc) {
8741
8868
  if ($xeGGWrapper) {
@@ -10758,6 +10885,7 @@ export default defineVxeComponent({
10758
10885
  afterFullData.splice(nafIndex, 0, dragRow);
10759
10886
  tableFullData.splice(ntfIndex, 0, dragRow);
10760
10887
  }
10888
+ $xeTable.handleClearStack();
10761
10889
  $xeTable.handleTableData(treeConfig && transform);
10762
10890
  $xeTable.cacheRowMap(false);
10763
10891
  updateScrollYStatus();
@@ -11418,6 +11546,7 @@ export default defineVxeComponent({
11418
11546
  column.renderSortNumber = sortIndex;
11419
11547
  }
11420
11548
  });
11549
+ $xeTable.handleClearStack();
11421
11550
  if (mouseConfig) {
11422
11551
  if ($xeTable.clearSelected) {
11423
11552
  $xeTable.clearSelected();
@@ -12413,6 +12542,54 @@ export default defineVxeComponent({
12413
12542
  handleUpdateAggData() {
12414
12543
  return loadTableData(internalData.tableSynchData, false, true);
12415
12544
  },
12545
+ handlePushStack() {
12546
+ const keyboardOpts = computeKeyboardOpts.value;
12547
+ if (!keyboardOpts.isUndoRedo) {
12548
+ return;
12549
+ }
12550
+ const { stackHistoryStore } = internalData;
12551
+ const stackObj = getSnapshotStackData();
12552
+ stackHistoryStore.undoStacks.push(stackObj);
12553
+ stackHistoryStore.redoStacks = [];
12554
+ truncateStackHistory();
12555
+ },
12556
+ handleUndoStackEvent(evnt) {
12557
+ const { stackHistoryStore } = internalData;
12558
+ const { undoStacks, redoStacks } = stackHistoryStore;
12559
+ if (undoStacks.length) {
12560
+ const stackObj = getSnapshotStackData();
12561
+ redoStacks.push(stackObj);
12562
+ handleUpdateSnapshotStackData(undoStacks.pop());
12563
+ if (evnt) {
12564
+ dispatchEvent('undo', {}, evnt);
12565
+ }
12566
+ return nextTick(() => {
12567
+ return { status: true };
12568
+ });
12569
+ }
12570
+ return Promise.resolve({ status: false });
12571
+ },
12572
+ handleRedoStackEvent(evnt) {
12573
+ const { stackHistoryStore } = internalData;
12574
+ const { undoStacks, redoStacks } = stackHistoryStore;
12575
+ if (redoStacks.length) {
12576
+ const stackObj = getSnapshotStackData();
12577
+ undoStacks.push(stackObj);
12578
+ handleUpdateSnapshotStackData(redoStacks.pop());
12579
+ if (evnt) {
12580
+ dispatchEvent('redo', {}, evnt);
12581
+ }
12582
+ return nextTick(() => {
12583
+ return { status: true };
12584
+ });
12585
+ }
12586
+ return Promise.resolve({ status: false });
12587
+ },
12588
+ handleClearStack() {
12589
+ const { stackHistoryStore } = internalData;
12590
+ stackHistoryStore.undoStacks = [];
12591
+ stackHistoryStore.redoStacks = [];
12592
+ },
12416
12593
  updateZindex() {
12417
12594
  if (props.zIndex) {
12418
12595
  internalData.tZindex = props.zIndex;
@@ -13465,7 +13642,7 @@ export default defineVxeComponent({
13465
13642
  $xeTable.preventEvent(null, 'deactivated', { $table: $xeTable });
13466
13643
  });
13467
13644
  onMounted(() => {
13468
- const { exportConfig, importConfig, treeConfig, minHeight } = props;
13645
+ const { editConfig, exportConfig, importConfig, treeConfig, minHeight, keepSource } = props;
13469
13646
  const { scrollXStore, scrollYStore } = internalData;
13470
13647
  const columnOpts = computeColumnOpts.value;
13471
13648
  const columnDragOpts = computeColumnDragOpts.value;
@@ -13518,8 +13695,15 @@ export default defineVxeComponent({
13518
13695
  if (!(props.rowId || rowOpts.keyField) && (checkboxOpts.reserve || checkboxOpts.checkRowKeys || radioOpts.reserve || radioOpts.checkRowKey || expandOpts.expandRowKeys || treeOpts.expandRowKeys)) {
13519
13696
  warnLog('vxe.error.reqProp', ['row-config.keyField']);
13520
13697
  }
13521
- if (props.editConfig && (editOpts.showStatus || editOpts.showUpdateStatus || editOpts.showInsertStatus) && !props.keepSource) {
13522
- warnLog('vxe.error.reqProp', ['keep-source']);
13698
+ if (editConfig) {
13699
+ if (!keepSource) {
13700
+ if (editOpts.showStatus || editOpts.showUpdateStatus || editOpts.showInsertStatus) {
13701
+ warnLog('vxe.error.reqSupportProp', ['edit-config.showStatus | showUpdateStatus | showInsertStatus', 'keep-source']);
13702
+ }
13703
+ // if (keyboardOpts.isUndoRedo) {
13704
+ // warnLog('vxe.error.reqSupportProp', ['keyboard-config.isUndoRedo', 'keep-source'])
13705
+ // }
13706
+ }
13523
13707
  }
13524
13708
  // if (treeConfig && (treeOpts.showLine || treeOpts.line) && !showOverflow) {
13525
13709
  // warnLog('vxe.error.reqProp', ['show-overflow'])
@@ -13589,7 +13773,7 @@ export default defineVxeComponent({
13589
13773
  if (rowOpts.height && !props.showOverflow) {
13590
13774
  warnLog('vxe.error.notProp', ['table.show-overflow']);
13591
13775
  }
13592
- if (!$xeTable.triggerClAreaModnEvent) {
13776
+ if (!$xeTable.triggerCelllAreaMnEvent) {
13593
13777
  if (props.areaConfig) {
13594
13778
  warnLog('vxe.error.notProp', ['area-config']);
13595
13779
  }