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'
@@ -12,7 +12,7 @@ import { getCrossTableDragRowInfo } from './store'
12
12
  import type { VxeTooltipInstance, ValueOf } from 'vxe-pc-ui'
13
13
  import type { VxeTableDefines, VxeColumnPropTypes, VxeTableEmits, TableReactData, VxeTableConstructor, VxeToolbarConstructor, VxeToolbarInstance, TableInternalData, VxeGridConstructor, VxeTablePrivateMethods, VxeTablePropTypes, VxeGridPrivateMethods } from '../../../types'
14
14
 
15
- const { getConfig, getI18n, renderer, formats, interceptor, createEvent } = VxeUI
15
+ const { getConfig, getI18n, renderer, formats, interceptor, createEvent, globalEvents, GLOBAL_EVENT_KEYS } = VxeUI
16
16
 
17
17
  const browseObj = XEUtils.browse()
18
18
 
@@ -395,7 +395,7 @@ function cacheColumnMap ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
395
395
  errLog('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand'])
396
396
  }
397
397
  if (expandOpts.mode !== 'inside' && (treeConfig && !treeOpts.transform)) {
398
- errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=fixed'])
398
+ errLog('vxe.error.notConflictProp', ['tree-config.transform=false', 'expand-config.mode=inside'])
399
399
  }
400
400
  if (props.spanMethod) {
401
401
  warnLog('vxe.error.notSupportProp', ['column.type=expand', 'span-method', 'span-method=null'])
@@ -3501,6 +3501,7 @@ function loadTableData ($xeTable: VxeTableConstructor & VxeTablePrivateMethods,
3501
3501
  }
3502
3502
  $xeTable.clearMergeCells()
3503
3503
  $xeTable.clearMergeFooterItems()
3504
+ $xeTable.handleClearStack()
3504
3505
  $xeTable.handleTableData(true)
3505
3506
  $xeTable.updateFooter()
3506
3507
  $xeTable.handleUpdateBodyMerge()
@@ -4477,6 +4478,107 @@ function reUpdateCustomStyleEvent ($xeTable: VxeTableConstructor & VxeTablePriva
4477
4478
  }
4478
4479
  }
4479
4480
 
4481
+ function truncateStackHistory ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
4482
+ const internalData = $xeTable as unknown as TableInternalData
4483
+
4484
+ const { stackHistoryStore } = internalData
4485
+ const { undoStacks } = stackHistoryStore
4486
+ const undoRedoHistoryOpts = $xeTable.computeUndoRedoHistoryOpts
4487
+ const { stackSize } = undoRedoHistoryOpts
4488
+ if (undoStacks.length > XEUtils.toNumber(stackSize)) {
4489
+ undoStacks.shift()
4490
+ }
4491
+ }
4492
+
4493
+ /**
4494
+ * 生成快照数据
4495
+ */
4496
+ function getSnapshotStackData ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
4497
+ const reactData = $xeTable as unknown as TableReactData
4498
+ const internalData = $xeTable as unknown as TableInternalData
4499
+
4500
+ const { editStore } = reactData
4501
+ const { afterFullData } = internalData
4502
+ const { selected, actived } = editStore
4503
+ const { row: selectRow, column: selectColumn } = selected
4504
+ const { row: editRow, column: editColumn } = actived
4505
+ const stackObj: VxeTableDefines.HistoryStackObj = {
4506
+ selectActiveInfo: selectRow && selectColumn
4507
+ ? {
4508
+ rowid: getRowid($xeTable, selectRow),
4509
+ colid: selectColumn.id
4510
+ }
4511
+ : undefined,
4512
+ editActiveInfo: editRow && editColumn
4513
+ ? {
4514
+ rowid: getRowid($xeTable, editRow),
4515
+ colid: editColumn.id
4516
+ }
4517
+ : undefined,
4518
+ visibleData: XEUtils.clone(afterFullData, true),
4519
+ visibleColumn: []
4520
+ }
4521
+ return $xeTable.getCellAreaPushStackObj ? $xeTable.getCellAreaPushStackObj(stackObj) : stackObj
4522
+ }
4523
+
4524
+ /**
4525
+ * 刷新栈视图
4526
+ */
4527
+ function handleUpdateSnapshotStackData ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, stackObj: VxeTableDefines.HistoryStackObj | null | undefined) {
4528
+ const reactData = $xeTable as unknown as TableReactData
4529
+ const internalData = $xeTable as unknown as TableInternalData
4530
+
4531
+ const { editStore } = reactData
4532
+ const { fullAllDataRowIdData, fullColumnIdData } = internalData
4533
+ if (!stackObj) {
4534
+ return
4535
+ }
4536
+ const { visibleData, editActiveInfo, selectActiveInfo } = stackObj
4537
+ const afterFullList = visibleData.map(item => {
4538
+ const rowid = getRowid($xeTable, item)
4539
+ const rest = fullAllDataRowIdData[rowid]
4540
+ let row = item
4541
+ if (rest) {
4542
+ row = rest.row
4543
+ Object.assign(row, item)
4544
+ }
4545
+ return row
4546
+ })
4547
+
4548
+ internalData.afterFullData = afterFullList
4549
+ if ($xeTable.handleCellAreaSnapshotStackData) {
4550
+ $xeTable.handleCellAreaSnapshotStackData(stackObj)
4551
+ } else {
4552
+ const { selected } = editStore
4553
+ const mouseOpts = $xeTable.computeMouseOpts
4554
+ let selectRowid = ''
4555
+ let selectColid = ''
4556
+ if (editActiveInfo) {
4557
+ selectRowid = editActiveInfo.rowid
4558
+ selectColid = editActiveInfo.colid
4559
+ } else if (selectActiveInfo) {
4560
+ selectRowid = selectActiveInfo.rowid
4561
+ selectColid = selectActiveInfo.colid
4562
+ }
4563
+ if (selectRowid && selectColid && mouseOpts.selected) {
4564
+ const editRow = fullAllDataRowIdData[selectRowid] ? fullAllDataRowIdData[selectRowid].row : null
4565
+ const editColumn = fullColumnIdData[selectColid] ? fullColumnIdData[selectColid].column : null
4566
+ if (editRow && editColumn) {
4567
+ const params = {
4568
+ row: editRow,
4569
+ column: editColumn
4570
+ }
4571
+ selected.row = editRow
4572
+ selected.column = editColumn
4573
+ selected.args = params
4574
+ $xeTable.$nextTick(() => {
4575
+ $xeTable.addCellSelectedClass()
4576
+ })
4577
+ }
4578
+ }
4579
+ }
4580
+ }
4581
+
4480
4582
  const tableMethods: any = {
4481
4583
  callSlot (slotFunc: any, params: any, h: any, vNodes: any) {
4482
4584
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -4781,7 +4883,7 @@ const tableMethods: any = {
4781
4883
  * 对于表格列需要重载、局部递增场景下可能会用到
4782
4884
  * @param {ColumnInfo} columns 列配置
4783
4885
  */
4784
- loadColumn (columns: any) {
4886
+ loadColumn (columns: (VxeTableDefines.ColumnInfo | VxeTableDefines.ColumnOptions)[]) {
4785
4887
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
4786
4888
  const internalData = $xeTable as unknown as TableInternalData
4787
4889
 
@@ -7283,18 +7385,20 @@ const tableMethods: any = {
7283
7385
  const { isLastEnterAppendRow, beforeEnterMethod, enterMethod, isLastTabAppendRow, beforeTabMethod, tabMethod } = keyboardOpts
7284
7386
  const { selected, actived } = editStore
7285
7387
  const { keyCode } = evnt
7286
- const hasBackspaceKey = keyCode === 8
7287
- const isTab = keyCode === 9
7288
- const isEnter = keyCode === 13
7289
- const isEsc = keyCode === 27
7290
- const isSpacebar = keyCode === 32
7291
- const isLeftArrow = keyCode === 37
7292
- const isUpArrow = keyCode === 38
7293
- const isRightArrow = keyCode === 39
7294
- const isDwArrow = keyCode === 40
7295
- const hasDeleteKey = keyCode === 46
7296
- const isF2 = keyCode === 113
7297
- const isContextMenu = keyCode === 93
7388
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
7389
+ const hasBackspaceKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.BACKSPACE)
7390
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
7391
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
7392
+ const isSpacebar = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR)
7393
+ const isLeftArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_LEFT)
7394
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
7395
+ const isRightArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_RIGHT)
7396
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
7397
+ const hasDeleteKey = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
7398
+ const isY = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Y)
7399
+ const isZ = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.Z)
7400
+ const isF2 = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.F2)
7401
+ const isContextMenu = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.CONTEXT_MENU)
7298
7402
  const isControlKey = hasControlKey(evnt)
7299
7403
  const hasShiftKey = evnt.shiftKey
7300
7404
  const hasAltKey = evnt.altKey
@@ -7303,6 +7407,7 @@ const tableMethods: any = {
7303
7407
  const isEditStatus = isEnableConf(editConfig) && actived.column && actived.row
7304
7408
  const childrenField = treeOpts.children || treeOpts.childrenField
7305
7409
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod
7410
+ const selectColumn = selected.column
7306
7411
  if (operCtxMenu) {
7307
7412
  // 如果配置了右键菜单; 支持方向键操作、回车
7308
7413
  evnt.preventDefault()
@@ -7330,10 +7435,10 @@ const tableMethods: any = {
7330
7435
  }
7331
7436
  }
7332
7437
  }
7333
- } else if (keyboardConfig && isSpacebar && keyboardOpts.isChecked && selected.row && selected.column && (selected.column.type === 'checkbox' || selected.column.type === 'radio')) {
7438
+ } else if (keyboardConfig && isSpacebar && keyboardOpts.isChecked && selected.row && selectColumn && (selectColumn.type === 'checkbox' || selectColumn.type === 'radio')) {
7334
7439
  // 空格键支持选中复选框
7335
7440
  evnt.preventDefault()
7336
- if (selected.column.type === 'checkbox') {
7441
+ if (selectColumn.type === 'checkbox') {
7337
7442
  $xeTable.handleToggleCheckRowEvent(evnt, selected.args)
7338
7443
  } else {
7339
7444
  $xeTable.triggerRadioRowEvent(evnt, selected.args)
@@ -7341,15 +7446,14 @@ const tableMethods: any = {
7341
7446
  } else if (isF2 && isEnableConf(editConfig)) {
7342
7447
  if (!isEditStatus) {
7343
7448
  // 如果按下了 F2 键
7344
- if (selected.row && selected.column) {
7345
- evnt.stopPropagation()
7449
+ if (selected.row && selectColumn) {
7346
7450
  evnt.preventDefault()
7347
7451
  $xeTable.handleEdit(selected.args, evnt)
7348
7452
  }
7349
7453
  }
7350
7454
  } else if (isContextMenu) {
7351
7455
  // 如果按下上下文键
7352
- internalData._keyCtx = selected.row && selected.column && bodyMenu.length
7456
+ internalData._keyCtx = selected.row && selectColumn && bodyMenu.length
7353
7457
  clearTimeout(internalData.keyCtxTimeout)
7354
7458
  internalData.keyCtxTimeout = setTimeout(() => {
7355
7459
  internalData._keyCtx = false
@@ -7370,84 +7474,86 @@ const tableMethods: any = {
7370
7474
  // 如果是激活状态,退则出到上一行/下一行
7371
7475
  if (selected.row || actived.row) {
7372
7476
  const activeRow = selected.row || actived.row
7373
- const activeColumn = selected.column || actived.column
7374
- const activeParams = selected.row ? selected.args : actived.args
7375
- if (hasShiftKey) {
7376
- if (keyboardOpts.enterToTab) {
7377
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7378
- } else {
7379
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt)
7380
- }
7381
- } else {
7382
- const _rowIndex = $xeTable.getVTRowIndex(activeRow)
7383
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn)
7384
- if (keyboardOpts.enterToTab) {
7385
- const ttrParams = {
7386
- row: activeRow,
7387
- rowIndex: $xeTable.getRowIndex(activeRow),
7388
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7389
- _rowIndex,
7390
- column: activeColumn,
7391
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7392
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7393
- _columnIndex,
7394
- $table: $xeTable
7477
+ const activeColumn = selectColumn || actived.column
7478
+ if (activeColumn) {
7479
+ const activeParams = selected.row ? selected.args : actived.args
7480
+ if (hasShiftKey) {
7481
+ if (keyboardOpts.enterToTab) {
7482
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7483
+ } else {
7484
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, true, isRightArrow, false, evnt)
7395
7485
  }
7396
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7397
- evnt.preventDefault()
7398
- // 最后一行按下Tab键,自动追加一行
7399
- if (isLastTabAppendRow) {
7400
- const newColumn = visibleColumn[0]
7401
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7402
- if (actived.row) {
7403
- $xeTable.handleClearEdit(evnt)
7486
+ } else {
7487
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow)
7488
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn)
7489
+ if (keyboardOpts.enterToTab) {
7490
+ const ttrParams = {
7491
+ row: activeRow,
7492
+ rowIndex: $xeTable.getRowIndex(activeRow),
7493
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7494
+ _rowIndex,
7495
+ column: activeColumn,
7496
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7497
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7498
+ _columnIndex,
7499
+ $table: $xeTable
7500
+ }
7501
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7502
+ evnt.preventDefault()
7503
+ // 最后一行按下Tab键,自动追加一行
7504
+ if (isLastTabAppendRow) {
7505
+ const newColumn = visibleColumn[0]
7506
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7507
+ if (actived.row) {
7508
+ $xeTable.handleClearEdit(evnt)
7509
+ }
7510
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7511
+ $xeTable.scrollToRow(newRow, newColumn)
7512
+ $xeTable.handleSelected({ ...activeParams, row: newRow, column: newColumn }, evnt)
7513
+ })
7514
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt)
7515
+ return
7404
7516
  }
7405
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7406
- $xeTable.scrollToRow(newRow, newColumn)
7407
- $xeTable.handleSelected({ ...activeParams, row: newRow, column: newColumn }, evnt)
7408
- })
7409
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt)
7410
- return
7517
+ }
7518
+ if (tabMethod) {
7519
+ tabMethod(ttrParams)
7520
+ } else {
7521
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7411
7522
  }
7412
7523
  }
7413
- if (tabMethod) {
7414
- tabMethod(ttrParams)
7415
- } else {
7416
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7524
+ } else {
7525
+ const etrParams = {
7526
+ row: activeRow,
7527
+ rowIndex: $xeTable.getRowIndex(activeRow),
7528
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7529
+ _rowIndex,
7530
+ column: activeColumn,
7531
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7532
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7533
+ _columnIndex,
7534
+ $table: $xeTable
7417
7535
  }
7418
- }
7419
- } else {
7420
- const etrParams = {
7421
- row: activeRow,
7422
- rowIndex: $xeTable.getRowIndex(activeRow),
7423
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7424
- _rowIndex,
7425
- column: activeColumn,
7426
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7427
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7428
- _columnIndex,
7429
- $table: $xeTable
7430
- }
7431
- if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
7432
- evnt.preventDefault()
7433
- // 最后一行按下回车键,自动追加一行
7434
- if (isLastEnterAppendRow) {
7435
- if (_rowIndex >= afterFullData.length - 1) {
7436
- $xeTable.insertAt({}, -1).then(({ row: newRow }: any) => {
7437
- $xeTable.scrollToRow(newRow, selected.column)
7438
- $xeTable.handleSelected({ ...activeParams, row: newRow }, evnt)
7439
- })
7440
- $xeTable.dispatchEvent('enter-append-row', etrParams, evnt)
7441
- return
7536
+ if (!beforeEnterMethod || beforeEnterMethod(etrParams) !== false) {
7537
+ evnt.preventDefault()
7538
+ // 最后一行按下回车键,自动追加一行
7539
+ if (isLastEnterAppendRow) {
7540
+ if (_rowIndex >= afterFullData.length - 1) {
7541
+ $xeTable.insertAt({}, -1).then(({ row: newRow }: any) => {
7542
+ $xeTable.scrollToRow(newRow, selectColumn)
7543
+ $xeTable.handleSelected({ ...activeParams, row: newRow }, evnt)
7544
+ })
7545
+ $xeTable.dispatchEvent('enter-append-row', etrParams, evnt)
7546
+ return
7547
+ }
7442
7548
  }
7443
- }
7444
- if (enterMethod) {
7445
- enterMethod(etrParams)
7446
- } else {
7447
- if (actived.row) {
7448
- $xeTable.handleClearEdit(evnt)
7549
+ if (enterMethod) {
7550
+ enterMethod(etrParams)
7551
+ } else {
7552
+ if (actived.row) {
7553
+ $xeTable.handleClearEdit(evnt)
7554
+ }
7555
+ $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt)
7449
7556
  }
7450
- $xeTable.moveEnterSelected(activeParams, isLeftArrow, false, isRightArrow, true, evnt)
7451
7557
  }
7452
7558
  }
7453
7559
  }
@@ -7473,7 +7579,7 @@ const tableMethods: any = {
7473
7579
  } else if (operArrow && keyboardConfig && keyboardOpts.isArrow) {
7474
7580
  if (!isEditStatus) {
7475
7581
  // 如果按下了方向键
7476
- if (mouseOpts.selected && selected.row && selected.column) {
7582
+ if (mouseOpts.selected && selected.row && selectColumn) {
7477
7583
  $xeTable.moveArrowSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt)
7478
7584
  } else {
7479
7585
  // 当前行按键上下移动
@@ -7490,57 +7596,59 @@ const tableMethods: any = {
7490
7596
  // 如果按下了 Tab 键切换
7491
7597
  if (selected.row || actived.row) {
7492
7598
  const activeRow = selected.row || actived.row
7493
- const activeColumn = selected.column || actived.column
7494
- const activeParams = selected.row ? selected.args : actived.args
7495
- const _rowIndex = $xeTable.getVTRowIndex(activeRow)
7496
- const _columnIndex = $xeTable.getVTColumnIndex(activeColumn)
7497
- const ttrParams = {
7498
- row: activeRow,
7499
- rowIndex: $xeTable.getRowIndex(activeRow),
7500
- $rowIndex: $xeTable.getVMRowIndex(activeRow),
7501
- _rowIndex,
7502
- column: activeColumn,
7503
- columnIndex: $xeTable.getColumnIndex(activeColumn),
7504
- $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7505
- _columnIndex,
7506
- $table: $xeTable
7507
- }
7508
- if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7509
- evnt.preventDefault()
7510
- // 最后一行按下Tab键,自动追加一行
7511
- if (isLastTabAppendRow) {
7512
- const newColumn = visibleColumn[0]
7513
- if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7599
+ const activeColumn = selectColumn || actived.column
7600
+ if (activeColumn) {
7601
+ const activeParams = selected.row ? selected.args : actived.args
7602
+ const _rowIndex = $xeTable.getVTRowIndex(activeRow)
7603
+ const _columnIndex = $xeTable.getVTColumnIndex(activeColumn)
7604
+ const ttrParams = {
7605
+ row: activeRow,
7606
+ rowIndex: $xeTable.getRowIndex(activeRow),
7607
+ $rowIndex: $xeTable.getVMRowIndex(activeRow),
7608
+ _rowIndex,
7609
+ column: activeColumn,
7610
+ columnIndex: $xeTable.getColumnIndex(activeColumn),
7611
+ $columnIndex: $xeTable.getVMColumnIndex(activeColumn),
7612
+ _columnIndex,
7613
+ $table: $xeTable
7614
+ }
7615
+ if (!beforeTabMethod || beforeTabMethod(ttrParams) !== false) {
7616
+ evnt.preventDefault()
7617
+ // 最后一行按下Tab键,自动追加一行
7618
+ if (isLastTabAppendRow) {
7619
+ const newColumn = visibleColumn[0]
7620
+ if (_rowIndex >= afterFullData.length - 1 && _columnIndex >= visibleColumn.length - 1) {
7621
+ if (actived.row) {
7622
+ $xeTable.handleClearEdit(evnt)
7623
+ }
7624
+ $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7625
+ $xeTable.scrollToRow(newRow, newColumn)
7626
+ $xeTable.handleSelected({ ...activeParams, row: newRow, column: newColumn }, evnt)
7627
+ })
7628
+ $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt)
7629
+ return
7630
+ }
7631
+ }
7632
+ if (tabMethod) {
7633
+ tabMethod(ttrParams)
7634
+ } else {
7514
7635
  if (actived.row) {
7515
7636
  $xeTable.handleClearEdit(evnt)
7516
7637
  }
7517
- $xeTable.insertAt({}, -1).then(({ row: newRow }) => {
7518
- $xeTable.scrollToRow(newRow, newColumn)
7519
- $xeTable.handleSelected({ ...activeParams, row: newRow, column: newColumn }, evnt)
7520
- })
7521
- $xeTable.dispatchEvent('tab-append-row', ttrParams, evnt)
7522
- return
7523
- }
7524
- }
7525
- if (tabMethod) {
7526
- tabMethod(ttrParams)
7527
- } else {
7528
- if (actived.row) {
7529
- $xeTable.handleClearEdit(evnt)
7638
+ $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7530
7639
  }
7531
- $xeTable.moveTabSelected(activeParams, hasShiftKey, evnt)
7532
7640
  }
7533
7641
  }
7534
7642
  }
7535
- } else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selected.column)) {
7643
+ } else if (keyboardConfig && keyboardOpts.isDel && hasDeleteKey && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7536
7644
  // 如果是删除键
7537
7645
  if (!isEditStatus) {
7538
7646
  const { delMethod } = keyboardOpts
7539
7647
  const params = {
7540
7648
  row: selected.row,
7541
7649
  rowIndex: $xeTable.getRowIndex(selected.row),
7542
- column: selected.column,
7543
- columnIndex: $xeTable.getColumnIndex(selected.column),
7650
+ column: selectColumn as VxeTableDefines.ColumnInfo,
7651
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7544
7652
  $table: $xeTable,
7545
7653
  $grid: $xeGrid,
7546
7654
  $gantt: $xeGantt
@@ -7550,23 +7658,27 @@ const tableMethods: any = {
7550
7658
  if (delMethod) {
7551
7659
  delMethod(params)
7552
7660
  } else {
7553
- setCellValue(selected.row, selected.column, null)
7661
+ const selectCellValue = getCellValue(selected.row, selectColumn)
7662
+ if (selectCellValue !== null) {
7663
+ $xeTable.handlePushStack()
7664
+ setCellValue(selected.row, selectColumn, null)
7665
+ }
7554
7666
  }
7555
7667
  // 如果按下 del 键,更新表尾数据
7556
7668
  $xeTable.updateFooter()
7557
7669
  $xeTable.dispatchEvent('cell-delete-value', params, evnt)
7558
7670
  }
7559
7671
  }
7560
- } else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selected.column)) {
7672
+ } else if (hasBackspaceKey && keyboardConfig && keyboardOpts.isBack && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7561
7673
  if (!isEditStatus) {
7562
- const { editMode, backMethod } = keyboardOpts
7674
+ const { backMethod } = keyboardOpts
7563
7675
  // 如果是删除键
7564
- if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selected.column)) {
7676
+ if (keyboardOpts.isDel && isEnableConf(editConfig) && (selected.row || selectColumn)) {
7565
7677
  const params = {
7566
7678
  row: selected.row,
7567
7679
  rowIndex: $xeTable.getRowIndex(selected.row),
7568
- column: selected.column,
7569
- columnIndex: $xeTable.getColumnIndex(selected.column),
7680
+ column: selectColumn as VxeTableDefines.ColumnInfo,
7681
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7570
7682
  $table: $xeTable,
7571
7683
  $grid: $xeGrid,
7572
7684
  $gantt: $xeGantt
@@ -7576,11 +7688,9 @@ const tableMethods: any = {
7576
7688
  if (backMethod) {
7577
7689
  backMethod(params)
7578
7690
  } else {
7579
- // 追加方式与覆盖式
7580
- if (editMode !== 'insert') {
7581
- setCellValue(selected.row, selected.column, null)
7582
- }
7583
- $xeTable.handleEdit(selected.args, evnt)
7691
+ $xeTable.handleEdit(params, evnt, {
7692
+ isClear: true
7693
+ })
7584
7694
  }
7585
7695
  $xeTable.dispatchEvent('cell-backspace-value', params, evnt)
7586
7696
  }
@@ -7603,20 +7713,30 @@ const tableMethods: any = {
7603
7713
  .then(() => $xeTable.scrollToRow(parentRow))
7604
7714
  .then(() => $xeTable.triggerCurrentRowEvent(evnt, params))
7605
7715
  }
7716
+ } else if (keyboardConfig && keyboardOpts.isUndoRedo && isControlKey && (isZ || isY) && !hasEventInputTarget(evnt.target)) {
7717
+ if (isY || (hasShiftKey && isZ)) {
7718
+ // 恢复被撤销的操作:Ctrl + Y 或 Ctrl + Shift + Z
7719
+ evnt.preventDefault()
7720
+ $xeTable.handleRedoStackEvent(evnt)
7721
+ } else if (isZ) {
7722
+ // ‌撤销上一步操作‌:Ctrl + Z
7723
+ evnt.preventDefault()
7724
+ $xeTable.handleUndoStackEvent(evnt)
7725
+ }
7606
7726
  } 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))) {
7607
- const { editMethod } = keyboardOpts
7727
+ const { editMode, editMethod } = keyboardOpts
7608
7728
  // 启用编辑后,空格键功能将失效
7609
7729
  // if (isSpacebar) {
7610
7730
  // evnt.preventDefault()
7611
7731
  // }
7612
7732
  // 如果是按下非功能键之外允许直接编辑
7613
- if (selected.column && selected.row && isEnableConf(selected.column.editRender)) {
7733
+ if (selectColumn && selected.row && isEnableConf(selectColumn.editRender)) {
7614
7734
  const beforeEditMethod = editOpts.beforeEditMethod || editOpts.activeMethod
7615
7735
  const params = {
7616
7736
  row: selected.row,
7617
7737
  rowIndex: $xeTable.getRowIndex(selected.row),
7618
- column: selected.column,
7619
- columnIndex: $xeTable.getColumnIndex(selected.column),
7738
+ column: selectColumn,
7739
+ columnIndex: $xeTable.getColumnIndex(selectColumn),
7620
7740
  $table: $xeTable,
7621
7741
  $grid: $xeGrid,
7622
7742
  $gantt: $xeGantt
@@ -7625,8 +7745,14 @@ const tableMethods: any = {
7625
7745
  if (editMethod) {
7626
7746
  editMethod(params)
7627
7747
  } else {
7628
- setCellValue(selected.row, selected.column, null)
7629
- $xeTable.handleEdit(selected.args, evnt)
7748
+ let isClearValue = false
7749
+ // 追加方式与覆盖式
7750
+ if (editMode !== 'insert') {
7751
+ isClearValue = true
7752
+ }
7753
+ $xeTable.handleEdit(params, evnt, {
7754
+ isClear: isClearValue
7755
+ })
7630
7756
  }
7631
7757
  }
7632
7758
  }
@@ -9521,6 +9647,7 @@ const tableMethods: any = {
9521
9647
  tableFullData.splice(ntfIndex, 0, dragRow)
9522
9648
  }
9523
9649
 
9650
+ $xeTable.handleClearStack()
9524
9651
  $xeTable.handleTableData(treeConfig && transform)
9525
9652
  $xeTable.cacheRowMap(false)
9526
9653
  updateScrollYStatus($xeTable)
@@ -10236,6 +10363,7 @@ const tableMethods: any = {
10236
10363
  }
10237
10364
  })
10238
10365
 
10366
+ $xeTable.handleClearStack()
10239
10367
  if (mouseConfig) {
10240
10368
  if ($xeTable.clearSelected) {
10241
10369
  $xeTable.clearSelected()
@@ -12859,11 +12987,75 @@ const tableMethods: any = {
12859
12987
 
12860
12988
  return loadTableData($xeTable, internalData.tableSynchData, false, true)
12861
12989
  },
12990
+ handlePushStack () {
12991
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
12992
+ const internalData = $xeTable as unknown as TableInternalData
12993
+
12994
+ const keyboardOpts = $xeTable.computeKeyboardOpts
12995
+ if (!keyboardOpts.isUndoRedo) {
12996
+ return
12997
+ }
12998
+ const { stackHistoryStore } = internalData
12999
+ const stackObj = getSnapshotStackData($xeTable)
13000
+ stackHistoryStore.undoStacks.push(stackObj)
13001
+ stackHistoryStore.redoStacks = []
13002
+ truncateStackHistory($xeTable)
13003
+ },
13004
+ handleUndoStackEvent (evnt: KeyboardEvent) {
13005
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13006
+ const internalData = $xeTable as unknown as TableInternalData
13007
+
13008
+ const { stackHistoryStore } = internalData
13009
+ const { undoStacks, redoStacks } = stackHistoryStore
13010
+ if (undoStacks.length) {
13011
+ const stackObj = getSnapshotStackData($xeTable)
13012
+ redoStacks.push(stackObj)
13013
+ handleUpdateSnapshotStackData($xeTable, undoStacks.pop())
13014
+ if (evnt) {
13015
+ $xeTable.dispatchEvent('undo', {}, evnt)
13016
+ }
13017
+ return $xeTable.$nextTick(() => {
13018
+ return { status: true }
13019
+ })
13020
+ }
13021
+ return Promise.resolve({ status: false })
13022
+ },
13023
+ handleRedoStackEvent (evnt: KeyboardEvent) {
13024
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13025
+ const internalData = $xeTable as unknown as TableInternalData
13026
+
13027
+ const { stackHistoryStore } = internalData
13028
+ const { undoStacks, redoStacks } = stackHistoryStore
13029
+ if (redoStacks.length) {
13030
+ const stackObj = getSnapshotStackData($xeTable)
13031
+ undoStacks.push(stackObj)
13032
+ handleUpdateSnapshotStackData($xeTable, redoStacks.pop())
13033
+ if (evnt) {
13034
+ $xeTable.dispatchEvent('redo', {}, evnt)
13035
+ }
13036
+ return $xeTable.$nextTick(() => {
13037
+ return { status: true }
13038
+ })
13039
+ }
13040
+ return Promise.resolve({ status: false })
13041
+ },
13042
+ handleClearStack () {
13043
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13044
+ const internalData = $xeTable as unknown as TableInternalData
13045
+
13046
+ const { stackHistoryStore } = internalData
13047
+ stackHistoryStore.undoStacks = []
13048
+ stackHistoryStore.redoStacks = []
13049
+ },
12862
13050
  updateZindex () {
12863
- if (this.zIndex) {
12864
- this.tZindex = this.zIndex
12865
- } else if (this.tZindex < getLastZIndex()) {
12866
- this.tZindex = nextZIndex()
13051
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13052
+ const props = $xeTable
13053
+ const internalData = $xeTable as unknown as TableInternalData
13054
+
13055
+ if (props.zIndex) {
13056
+ internalData.tZindex = props.zIndex
13057
+ } else if (internalData.tZindex < getLastZIndex()) {
13058
+ internalData.tZindex = nextZIndex()
12867
13059
  }
12868
13060
  },
12869
13061
  updateCellAreas () {
@@ -12877,6 +13069,16 @@ const tableMethods: any = {
12877
13069
  }
12878
13070
  return $xeTable.$nextTick()
12879
13071
  },
13072
+ undo () {
13073
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13074
+
13075
+ return $xeTable.handleUndoStackEvent(null)
13076
+ },
13077
+ redo () {
13078
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13079
+
13080
+ return $xeTable.handleRedoStackEvent(null)
13081
+ },
12880
13082
  dispatchEvent (type: ValueOf<VxeTableEmits>, params: Record<string, any>, evnt: Event | null) {
12881
13083
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
12882
13084
  const $xeGrid = $xeTable.$xeGrid
@@ -12891,19 +13093,27 @@ const tableMethods: any = {
12891
13093
  $xeTable.dispatchEvent(type, params, evnt)
12892
13094
  },
12893
13095
  focus () {
12894
- this.isActivated = true
12895
- return this.$nextTick()
13096
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13097
+ const internalData = $xeTable as unknown as TableInternalData
13098
+
13099
+ internalData.isActivated = true
13100
+ return $xeTable.$nextTick()
12896
13101
  },
12897
13102
  blur () {
12898
- this.isActivated = false
12899
- return this.$nextTick()
13103
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13104
+ const internalData = $xeTable as unknown as TableInternalData
13105
+
13106
+ internalData.isActivated = false
13107
+ return $xeTable.$nextTick()
12900
13108
  },
12901
13109
  /**
12902
13110
  * 已废弃,被 connectToolbar 替换
12903
13111
  * @deprecated
12904
13112
  */
12905
13113
  connect ($toolbar: VxeToolbarConstructor | VxeToolbarInstance) {
12906
- return this.connectToolbar($toolbar)
13114
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13115
+
13116
+ return $xeTable.connectToolbar($toolbar)
12907
13117
  },
12908
13118
  /**
12909
13119
  * 连接工具栏
@@ -12911,14 +13121,15 @@ const tableMethods: any = {
12911
13121
  */
12912
13122
  connectToolbar ($toolbar: VxeToolbarConstructor | VxeToolbarInstance) {
12913
13123
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13124
+ const internalData = $xeTable as unknown as TableInternalData
12914
13125
 
12915
13126
  if ($toolbar && $toolbar.syncUpdate) {
12916
- $toolbar.syncUpdate({ collectColumn: this.collectColumn, $table: $xeTable })
13127
+ $toolbar.syncUpdate({ collectColumn: internalData.collectColumn, $table: $xeTable })
12917
13128
  this.$toolbar = $toolbar
12918
13129
  } else {
12919
13130
  errLog('vxe.error.barUnableLink')
12920
13131
  }
12921
- return this.$nextTick()
13132
+ return $xeTable.$nextTick()
12922
13133
  },
12923
13134
  handleConnectGanttView ($ganttView: any) {
12924
13135
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -12939,17 +13150,21 @@ const tableMethods: any = {
12939
13150
  * @deprecated
12940
13151
  */
12941
13152
  getCell (row: any, column: any) {
12942
- return this.getCellElement(row, column)
13153
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13154
+
13155
+ return $xeTable.getCellElement(row, column)
12943
13156
  },
12944
13157
  findRowIndexOf (list: any, row: any) {
12945
13158
  return row ? XEUtils.findIndexOf(list, item => this.eqRow(item, row)) : -1
12946
13159
  },
12947
13160
  eqRow (row1: any, row2: any) {
13161
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
13162
+
12948
13163
  if (row1 && row2) {
12949
13164
  if (row1 === row2) {
12950
13165
  return true
12951
13166
  }
12952
- return getRowid(this, row1) === getRowid(this, row2)
13167
+ return getRowid($xeTable, row1) === getRowid($xeTable, row2)
12953
13168
  }
12954
13169
  return false
12955
13170
  },