vxe-table 4.12.0-beta.2 → 4.12.0-beta.20

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 (152) hide show
  1. package/es/grid/src/grid.js +61 -44
  2. package/es/locale/lang/ar-EG.js +7 -1
  3. package/es/locale/lang/de-DE.js +7 -1
  4. package/es/locale/lang/en-US.js +7 -1
  5. package/es/locale/lang/es-ES.js +7 -1
  6. package/es/locale/lang/fr-FR.js +7 -1
  7. package/es/locale/lang/hu-HU.js +7 -1
  8. package/es/locale/lang/hy-AM.js +7 -1
  9. package/es/locale/lang/id-ID.js +7 -1
  10. package/es/locale/lang/it-IT.js +7 -1
  11. package/es/locale/lang/ja-JP.js +7 -1
  12. package/es/locale/lang/ko-KR.js +7 -1
  13. package/es/locale/lang/nb-NO.js +7 -1
  14. package/es/locale/lang/pt-BR.js +7 -1
  15. package/es/locale/lang/ru-RU.js +7 -1
  16. package/es/locale/lang/th-TH.js +7 -1
  17. package/es/locale/lang/ug-CN.js +7 -1
  18. package/es/locale/lang/uk-UA.js +7 -1
  19. package/es/locale/lang/vi-VN.js +7 -1
  20. package/es/locale/lang/zh-CHT.js +7 -1
  21. package/es/locale/lang/zh-CN.js +7 -1
  22. package/es/style.css +1 -1
  23. package/es/table/module/filter/panel.js +12 -2
  24. package/es/table/module/keyboard/hook.js +47 -4
  25. package/es/table/render/index.js +91 -60
  26. package/es/table/src/body.js +12 -7
  27. package/es/table/src/cell.js +10 -9
  28. package/es/table/src/footer.js +9 -4
  29. package/es/table/src/header.js +2 -2
  30. package/es/table/src/props.js +4 -0
  31. package/es/table/src/table.js +366 -182
  32. package/es/table/src/util.js +58 -3
  33. package/es/ui/index.js +1 -1
  34. package/es/ui/src/log.js +1 -1
  35. package/helper/vetur/attributes.json +1 -1
  36. package/helper/vetur/tags.json +1 -1
  37. package/lib/grid/src/grid.js +58 -48
  38. package/lib/grid/src/grid.min.js +1 -1
  39. package/lib/index.umd.js +1245 -12123
  40. package/lib/index.umd.min.js +1 -1
  41. package/lib/locale/lang/ar-EG.js +7 -1
  42. package/lib/locale/lang/ar-EG.min.js +1 -1
  43. package/lib/locale/lang/de-DE.js +7 -1
  44. package/lib/locale/lang/de-DE.min.js +1 -1
  45. package/lib/locale/lang/en-US.js +7 -1
  46. package/lib/locale/lang/en-US.min.js +1 -1
  47. package/lib/locale/lang/en-US.umd.js +7 -1
  48. package/lib/locale/lang/es-ES.js +7 -1
  49. package/lib/locale/lang/es-ES.min.js +1 -1
  50. package/lib/locale/lang/es-ES.umd.js +7 -1
  51. package/lib/locale/lang/fr-FR.js +7 -1
  52. package/lib/locale/lang/fr-FR.min.js +1 -1
  53. package/lib/locale/lang/hu-HU.js +7 -1
  54. package/lib/locale/lang/hu-HU.min.js +1 -1
  55. package/lib/locale/lang/hu-HU.umd.js +7 -1
  56. package/lib/locale/lang/hy-AM.js +7 -1
  57. package/lib/locale/lang/hy-AM.min.js +1 -1
  58. package/lib/locale/lang/id-ID.js +7 -1
  59. package/lib/locale/lang/id-ID.min.js +1 -1
  60. package/lib/locale/lang/it-IT.js +7 -1
  61. package/lib/locale/lang/it-IT.min.js +1 -1
  62. package/lib/locale/lang/ja-JP.js +7 -1
  63. package/lib/locale/lang/ja-JP.min.js +1 -1
  64. package/lib/locale/lang/ja-JP.umd.js +7 -1
  65. package/lib/locale/lang/ko-KR.js +7 -1
  66. package/lib/locale/lang/ko-KR.min.js +1 -1
  67. package/lib/locale/lang/ko-KR.umd.js +7 -1
  68. package/lib/locale/lang/nb-NO.js +7 -1
  69. package/lib/locale/lang/nb-NO.min.js +1 -1
  70. package/lib/locale/lang/pt-BR.js +7 -1
  71. package/lib/locale/lang/pt-BR.min.js +1 -1
  72. package/lib/locale/lang/pt-BR.umd.js +7 -1
  73. package/lib/locale/lang/ru-RU.js +7 -1
  74. package/lib/locale/lang/ru-RU.min.js +1 -1
  75. package/lib/locale/lang/ru-RU.umd.js +7 -1
  76. package/lib/locale/lang/th-TH.js +7 -1
  77. package/lib/locale/lang/th-TH.min.js +1 -1
  78. package/lib/locale/lang/ug-CN.js +7 -1
  79. package/lib/locale/lang/ug-CN.min.js +1 -1
  80. package/lib/locale/lang/uk-UA.js +7 -1
  81. package/lib/locale/lang/uk-UA.min.js +1 -1
  82. package/lib/locale/lang/uk-UA.umd.js +7 -1
  83. package/lib/locale/lang/vi-VN.js +7 -1
  84. package/lib/locale/lang/vi-VN.min.js +1 -1
  85. package/lib/locale/lang/zh-CHT.js +7 -1
  86. package/lib/locale/lang/zh-CHT.min.js +1 -1
  87. package/lib/locale/lang/zh-CN.js +7 -1
  88. package/lib/locale/lang/zh-CN.min.js +1 -1
  89. package/lib/locale/lang/zh-CN.umd.js +7 -1
  90. package/lib/style.css +1 -1
  91. package/lib/table/module/filter/panel.js +8 -2
  92. package/lib/table/module/filter/panel.min.js +1 -1
  93. package/lib/table/module/keyboard/hook.js +51 -4
  94. package/lib/table/module/keyboard/hook.min.js +1 -1
  95. package/lib/table/render/index.js +100 -65
  96. package/lib/table/render/index.min.js +1 -1
  97. package/lib/table/src/body.js +11 -6
  98. package/lib/table/src/body.min.js +1 -1
  99. package/lib/table/src/cell.js +15 -8
  100. package/lib/table/src/cell.min.js +1 -1
  101. package/lib/table/src/footer.js +9 -3
  102. package/lib/table/src/footer.min.js +1 -1
  103. package/lib/table/src/header.js +2 -1
  104. package/lib/table/src/header.min.js +1 -1
  105. package/lib/table/src/props.js +4 -0
  106. package/lib/table/src/props.min.js +1 -1
  107. package/lib/table/src/table.js +402 -188
  108. package/lib/table/src/table.min.js +1 -1
  109. package/lib/table/src/util.js +65 -6
  110. package/lib/table/src/util.min.js +1 -1
  111. package/lib/ui/index.js +1 -1
  112. package/lib/ui/index.min.js +1 -1
  113. package/lib/ui/src/log.js +1 -1
  114. package/lib/ui/src/log.min.js +1 -1
  115. package/package.json +2 -2
  116. package/packages/grid/src/grid.ts +65 -50
  117. package/packages/locale/lang/ar-EG.ts +7 -1
  118. package/packages/locale/lang/de-DE.ts +7 -1
  119. package/packages/locale/lang/en-US.ts +7 -1
  120. package/packages/locale/lang/es-ES.ts +7 -1
  121. package/packages/locale/lang/fr-FR.ts +7 -1
  122. package/packages/locale/lang/hu-HU.ts +7 -1
  123. package/packages/locale/lang/hy-AM.ts +7 -1
  124. package/packages/locale/lang/id-ID.ts +7 -1
  125. package/packages/locale/lang/it-IT.ts +7 -1
  126. package/packages/locale/lang/ja-JP.ts +7 -1
  127. package/packages/locale/lang/ko-KR.ts +7 -1
  128. package/packages/locale/lang/nb-NO.ts +7 -1
  129. package/packages/locale/lang/pt-BR.ts +7 -1
  130. package/packages/locale/lang/ru-RU.ts +7 -1
  131. package/packages/locale/lang/th-TH.ts +7 -1
  132. package/packages/locale/lang/ug-CN.ts +7 -1
  133. package/packages/locale/lang/uk-UA.ts +7 -1
  134. package/packages/locale/lang/vi-VN.ts +7 -1
  135. package/packages/locale/lang/zh-CHT.ts +7 -1
  136. package/packages/locale/lang/zh-CN.ts +7 -1
  137. package/packages/table/module/filter/panel.ts +12 -2
  138. package/packages/table/module/keyboard/hook.ts +47 -6
  139. package/packages/table/render/index.ts +90 -59
  140. package/packages/table/src/body.ts +11 -6
  141. package/packages/table/src/cell.ts +10 -9
  142. package/packages/table/src/footer.ts +9 -4
  143. package/packages/table/src/header.ts +2 -2
  144. package/packages/table/src/props.ts +4 -0
  145. package/packages/table/src/table.ts +373 -183
  146. package/packages/table/src/util.ts +66 -3
  147. /package/es/{iconfont.1741080000843.ttf → iconfont.1742353689933.ttf} +0 -0
  148. /package/es/{iconfont.1741080000843.woff → iconfont.1742353689933.woff} +0 -0
  149. /package/es/{iconfont.1741080000843.woff2 → iconfont.1742353689933.woff2} +0 -0
  150. /package/lib/{iconfont.1741080000843.ttf → iconfont.1742353689933.ttf} +0 -0
  151. /package/lib/{iconfont.1741080000843.woff → iconfont.1742353689933.woff} +0 -0
  152. /package/lib/{iconfont.1741080000843.woff2 → iconfont.1742353689933.woff2} +0 -0
@@ -9,7 +9,7 @@ import TableHeaderComponent from './header'
9
9
  import TableFooterComponent from './footer'
10
10
  import tableProps from './props'
11
11
  import tableEmits from './emits'
12
- import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getRefElem, getColReMinWidth } from './util'
12
+ import { getRowUniqueId, clearTableAllStatus, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getRefElem, getColReMinWidth, createHandleUpdateRowId, createHandleGetRowId } from './util'
13
13
  import { getSlotVNs } from '../../ui/src/vn'
14
14
  import { warnLog, errLog } from '../../ui/src/log'
15
15
  import TableCustomPanelComponent from '../module/custom/panel'
@@ -23,6 +23,7 @@ import type { VxeGridConstructor, VxeGridPrivateMethods, VxeTableConstructor, Ta
23
23
 
24
24
  const { getConfig, getIcon, getI18n, renderer, formats, createEvent, globalResize, interceptor, hooks, globalEvents, GLOBAL_EVENT_KEYS, useFns, renderEmptyElement } = VxeUI
25
25
 
26
+ const supportMaxRow = 5e6
26
27
  const customStorageKey = 'VXE_CUSTOM_STORE'
27
28
  const maxYHeight = 5e6
28
29
  const maxXWidth = 5e6
@@ -506,6 +507,10 @@ export default defineComponent({
506
507
  return Object.assign({}, getConfig().table.columnConfig, props.columnConfig) as VxeTablePropTypes.ColumnOpts
507
508
  })
508
509
 
510
+ const computeCurrentColumnOpts = computed(() => {
511
+ return Object.assign({}, getConfig().table.currentColumnConfig, props.currentColumnConfig)
512
+ })
513
+
509
514
  const computeCellOpts = computed(() => {
510
515
  return Object.assign({}, getConfig().table.cellConfig, props.cellConfig)
511
516
  })
@@ -519,7 +524,11 @@ export default defineComponent({
519
524
  })
520
525
 
521
526
  const computeRowOpts = computed(() => {
522
- return Object.assign({}, getConfig().table.rowConfig, props.rowConfig) as VxeTablePropTypes.RowOpts
527
+ return Object.assign({}, getConfig().table.rowConfig, props.rowConfig)
528
+ })
529
+
530
+ const computeCurrentRowOpts = computed(() => {
531
+ return Object.assign({}, getConfig().table.currentRowConfig, props.currentRowConfig)
523
532
  })
524
533
 
525
534
  const computeRowDragOpts = computed(() => {
@@ -823,6 +832,7 @@ export default defineComponent({
823
832
  computeScrollbarXToTop,
824
833
  computeScrollbarYToLeft,
825
834
  computeColumnOpts,
835
+ computeCurrentColumnOpts,
826
836
  computeScrollXThreshold,
827
837
  computeScrollYThreshold,
828
838
  computeDefaultRowHeight,
@@ -830,6 +840,7 @@ export default defineComponent({
830
840
  computeHeaderCellOpts,
831
841
  computeFooterCellOpts,
832
842
  computeRowOpts,
843
+ computeCurrentRowOpts,
833
844
  computeRowDragOpts,
834
845
  computeColumnDragOpts,
835
846
  computeResizeOpts,
@@ -1300,7 +1311,7 @@ export default defineComponent({
1300
1311
  fullColumnFieldData[field] = rest
1301
1312
  } else {
1302
1313
  if ((storage && !type) || (columnOpts.drag && (isCrossDrag || isSelfToChildDrag))) {
1303
- errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field`])
1314
+ errLog('vxe.error.reqProp', [`${column.getTitle() || type || ''} -> column.field=?`])
1304
1315
  }
1305
1316
  }
1306
1317
  if (!hasFixed && fixed) {
@@ -2367,8 +2378,11 @@ export default defineComponent({
2367
2378
  const childrenField = treeOpts.children || treeOpts.childrenField
2368
2379
  const checkboxOpts = computeCheckboxOpts.value
2369
2380
  const { checkField, reserve, checkMethod } = checkboxOpts
2381
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
2382
+ // indeterminateField 仅支持读取
2370
2383
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField
2371
2384
  const selectRowMaps: Record<string, any> = {}
2385
+
2372
2386
  /**
2373
2387
  * 绑定属性方式(高性能,有污染)
2374
2388
  * 必须在行数据存在对应的属性,否则将不响应
@@ -2405,7 +2419,8 @@ export default defineComponent({
2405
2419
  */
2406
2420
  XEUtils.eachTree(afterFullData, (row) => {
2407
2421
  if (isForce || (!checkMethod || checkMethod({ row }))) {
2408
- selectRowMaps[getRowid($xeTable, row)] = row
2422
+ const rowid = handleGetRowId(row)
2423
+ selectRowMaps[rowid] = row
2409
2424
  }
2410
2425
  }, { children: childrenField })
2411
2426
  } else {
@@ -2415,7 +2430,7 @@ export default defineComponent({
2415
2430
  */
2416
2431
  if (!isForce && checkMethod) {
2417
2432
  XEUtils.eachTree(afterFullData, (row) => {
2418
- const rowid = getRowid($xeTable, row)
2433
+ const rowid = handleGetRowId(row)
2419
2434
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
2420
2435
  selectRowMaps[rowid] = row
2421
2436
  }
@@ -2431,14 +2446,15 @@ export default defineComponent({
2431
2446
  */
2432
2447
  if (!isForce && checkMethod) {
2433
2448
  afterFullData.forEach((row) => {
2434
- const rowid = getRowid($xeTable, row)
2449
+ const rowid = handleGetRowId(row)
2435
2450
  if (selectCheckboxMaps[rowid] || checkMethod({ row })) {
2436
2451
  selectRowMaps[rowid] = row
2437
2452
  }
2438
2453
  })
2439
2454
  } else {
2440
2455
  afterFullData.forEach(row => {
2441
- selectRowMaps[getRowid($xeTable, row)] = row
2456
+ const rowid = handleGetRowId(row)
2457
+ selectRowMaps[rowid] = row
2442
2458
  })
2443
2459
  }
2444
2460
  } else {
@@ -2449,7 +2465,7 @@ export default defineComponent({
2449
2465
  */
2450
2466
  if (!isForce && checkMethod) {
2451
2467
  afterFullData.forEach((row) => {
2452
- const rowid = getRowid($xeTable, row)
2468
+ const rowid = handleGetRowId(row)
2453
2469
  if (checkMethod({ row }) ? 0 : selectCheckboxMaps[rowid]) {
2454
2470
  selectRowMaps[rowid] = row
2455
2471
  }
@@ -2780,7 +2796,10 @@ export default defineComponent({
2780
2796
  const { transform } = treeOpts
2781
2797
  const childrenField = treeOpts.children || treeOpts.childrenField
2782
2798
  let treeData = []
2783
- let fullData = reactive(datas ? datas.slice(0) : []) // 转为响应式
2799
+ let fullData = reactive(datas ? datas.slice(0) : []) // 转为响应式数据
2800
+ if (fullData.length > supportMaxRow) {
2801
+ errLog('vxe.error.errMaxRow', [supportMaxRow])
2802
+ }
2784
2803
  if (treeConfig) {
2785
2804
  if (transform) {
2786
2805
  // 树结构自动转换
@@ -2876,7 +2895,7 @@ export default defineComponent({
2876
2895
  // warnLog('vxe.error.reqProp', ['table.show-overflow'])
2877
2896
  // }
2878
2897
  if (props.spanMethod) {
2879
- warnLog('vxe.error.scrollErrProp', ['table.span-method'])
2898
+ errLog('vxe.error.scrollErrProp', ['table.span-method'])
2880
2899
  }
2881
2900
  }
2882
2901
 
@@ -3275,9 +3294,9 @@ export default defineComponent({
3275
3294
  handleCheckedAllCheckboxRow(value)
3276
3295
  if (evnt) {
3277
3296
  dispatchEvent('checkbox-all', {
3278
- records: $xeTable.getCheckboxRecords(),
3279
- reserves: $xeTable.getCheckboxReserveRecords(),
3280
- indeterminates: $xeTable.getCheckboxIndeterminateRecords(),
3297
+ records: () => $xeTable.getCheckboxRecords(),
3298
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
3299
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
3281
3300
  checked: value
3282
3301
  }, evnt)
3283
3302
  }
@@ -3589,6 +3608,9 @@ export default defineComponent({
3589
3608
 
3590
3609
  tableMethods = {
3591
3610
  dispatchEvent,
3611
+ getEl () {
3612
+ return refElem.value
3613
+ },
3592
3614
  /**
3593
3615
  * 重置表格的一切数据状态
3594
3616
  */
@@ -3889,12 +3911,14 @@ export default defineComponent({
3889
3911
  */
3890
3912
  revertData (rows: any, field) {
3891
3913
  const { keepSource, treeConfig } = props
3892
- const { fullAllDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData
3914
+ const { editStore } = reactData
3915
+ const { fullAllDataRowIdData, fullDataRowIdData, tableSourceData, sourceDataRowIdData, tableFullData, afterFullData } = internalData
3916
+ const removeTempMaps = { ...editStore.removeMaps }
3893
3917
  const treeOpts = computeTreeOpts.value
3894
3918
  const { transform } = treeOpts
3895
3919
  if (!keepSource) {
3896
3920
  if (process.env.VUE_APP_VXE_ENV === 'development') {
3897
- warnLog('vxe.error.reqProp', ['keep-source'])
3921
+ errLog('vxe.error.reqProp', ['keep-source'])
3898
3922
  }
3899
3923
  return nextTick()
3900
3924
  }
@@ -3908,22 +3932,23 @@ export default defineComponent({
3908
3932
  }
3909
3933
  let reDelFlag = false
3910
3934
  if (targetRows.length) {
3911
- targetRows.forEach((row: any) => {
3912
- if (!$xeTable.isInsertByRow(row)) {
3913
- const rowid = getRowid($xeTable, row)
3914
- const oRow = sourceDataRowIdData[rowid]
3915
- if (oRow && row) {
3916
- if (field) {
3917
- XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true))
3918
- } else {
3919
- XEUtils.destructuring(row, XEUtils.clone(oRow, true))
3920
- }
3921
- if ($xeTable.isRemoveByRow(row)) {
3922
- const rowRest = fullAllDataRowIdData[rowid]
3923
- if (rowRest) {
3924
- const reRow = rowRest.row
3925
- tableFullData.unshift(reRow)
3926
- afterFullData.unshift(reRow)
3935
+ targetRows.forEach((item: any) => {
3936
+ const rowid = getRowid($xeTable, item)
3937
+ const rowRest = fullAllDataRowIdData[rowid]
3938
+ if (rowRest) {
3939
+ const row = rowRest.row
3940
+ if (!$xeTable.isInsertByRow(row)) {
3941
+ const oRow = sourceDataRowIdData[rowid]
3942
+ if (oRow && row) {
3943
+ if (field) {
3944
+ XEUtils.set(row, field, XEUtils.clone(XEUtils.get(oRow, field), true))
3945
+ } else {
3946
+ XEUtils.destructuring(row, XEUtils.clone(oRow, true))
3947
+ }
3948
+ if (!fullDataRowIdData[rowid] && $xeTable.isRemoveByRow(row)) {
3949
+ delete removeTempMaps[rowid]
3950
+ tableFullData.unshift(row)
3951
+ afterFullData.unshift(row)
3927
3952
  reDelFlag = true
3928
3953
  }
3929
3954
  }
@@ -3933,6 +3958,7 @@ export default defineComponent({
3933
3958
  }
3934
3959
  if (rows) {
3935
3960
  if (reDelFlag) {
3961
+ editStore.removeMaps = removeTempMaps
3936
3962
  $xeTable.updateFooter()
3937
3963
  $xeTable.cacheRowMap(false)
3938
3964
  $xeTable.handleTableData(treeConfig && transform)
@@ -4080,18 +4106,20 @@ export default defineComponent({
4080
4106
  },
4081
4107
  /**
4082
4108
  * 检查行或列数据是否发生改变
4083
- * @param {Row} row 行对象
4109
+ * @param {Row} rowidOrRow 行对象、行主键
4084
4110
  * @param {String} field 字段名
4085
4111
  */
4086
- isUpdateByRow (row, field) {
4112
+ isUpdateByRow (rowidOrRow, field) {
4087
4113
  const { keepSource } = props
4088
4114
  const { tableFullColumn, fullDataRowIdData, sourceDataRowIdData } = internalData
4089
4115
  if (keepSource) {
4090
- const rowid = getRowid($xeTable, row)
4116
+ const rowid = XEUtils.isString(rowidOrRow) || XEUtils.isNumber(rowidOrRow) ? rowidOrRow : getRowid($xeTable, rowidOrRow)
4117
+ const rowRest = fullDataRowIdData[rowid]
4091
4118
  // 新增的数据不需要检测
4092
- if (!fullDataRowIdData[rowid]) {
4119
+ if (!rowRest) {
4093
4120
  return false
4094
4121
  }
4122
+ const row = rowRest.row
4095
4123
  const oRow = sourceDataRowIdData[rowid]
4096
4124
  if (oRow) {
4097
4125
  if (arguments.length > 1) {
@@ -4155,6 +4183,92 @@ export default defineComponent({
4155
4183
  tableColumn: reactData.tableColumn.slice(0)
4156
4184
  }
4157
4185
  },
4186
+ /**
4187
+ * 移动列到指定列的位置
4188
+ * @param fieldOrColumn
4189
+ * @param targetFieldOrColumn
4190
+ * @param options
4191
+ */
4192
+ moveColumnTo (fieldOrColumn, targetFieldOrColumn, options) {
4193
+ const { fullColumnIdData, visibleColumn } = internalData
4194
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options)
4195
+ const dragCol = handleFieldOrColumn($xeTable, fieldOrColumn)
4196
+ let prevDragCol: VxeTableDefines.ColumnInfo | null = null
4197
+ const colRest = dragCol ? fullColumnIdData[dragCol.id] : null
4198
+ let defPos: 'left' | 'right' = 'left'
4199
+ if (XEUtils.isNumber(targetFieldOrColumn)) {
4200
+ if (colRest && targetFieldOrColumn) {
4201
+ let currList = colRest.items
4202
+ let offsetIndex = colRest._index + targetFieldOrColumn
4203
+ if (isCrossDrag) {
4204
+ currList = visibleColumn
4205
+ offsetIndex = colRest._index + targetFieldOrColumn
4206
+ }
4207
+ if (offsetIndex > 0 && offsetIndex < currList.length - 1) {
4208
+ prevDragCol = currList[offsetIndex]
4209
+ }
4210
+ if (targetFieldOrColumn > 0) {
4211
+ defPos = 'right'
4212
+ }
4213
+ }
4214
+ } else {
4215
+ prevDragCol = handleFieldOrColumn($xeTable, targetFieldOrColumn)
4216
+ const targetColRest = prevDragCol ? fullColumnIdData[prevDragCol.id] : null
4217
+ if (colRest && targetColRest) {
4218
+ if (targetColRest._index > colRest._index) {
4219
+ defPos = 'right'
4220
+ }
4221
+ }
4222
+ }
4223
+ return $xeTable.handleColDragSwapEvent(null, true, dragCol, prevDragCol, dragPos || defPos, dragToChild === true)
4224
+ },
4225
+ /**
4226
+ * 移动行到指定行的位置
4227
+ * @param rowidOrRow
4228
+ * @param targetRowidOrRow
4229
+ * @param options
4230
+ */
4231
+ moveRowTo (rowidOrRow, targetRowidOrRow, options) {
4232
+ const { treeConfig } = props
4233
+ const { fullAllDataRowIdData, afterFullData } = internalData
4234
+ const { dragToChild, dragPos, isCrossDrag } = Object.assign({}, options)
4235
+ const treeOpts = computeTreeOpts.value
4236
+ const dragRow = handleRowidOrRow($xeTable, rowidOrRow)
4237
+ let prevDragRow: any = null
4238
+ let defPos: 'top' | 'bottom' = 'top'
4239
+ const rowRest = dragRow ? fullAllDataRowIdData[getRowid($xeTable, dragRow)] : null
4240
+ if (XEUtils.isNumber(targetRowidOrRow)) {
4241
+ if (rowRest && targetRowidOrRow) {
4242
+ let currList = afterFullData
4243
+ let offsetIndex = rowRest._index + targetRowidOrRow
4244
+ if (treeConfig) {
4245
+ currList = rowRest.items
4246
+ if (treeOpts.transform) {
4247
+ offsetIndex = rowRest.treeIndex + targetRowidOrRow
4248
+ if (isCrossDrag) {
4249
+ currList = afterFullData
4250
+ offsetIndex = rowRest._index + targetRowidOrRow
4251
+ }
4252
+ }
4253
+ }
4254
+ if (offsetIndex >= 0 && offsetIndex <= currList.length - 1) {
4255
+ prevDragRow = currList[offsetIndex]
4256
+ }
4257
+ if (targetRowidOrRow > 0) {
4258
+ defPos = 'bottom'
4259
+ }
4260
+ }
4261
+ } else {
4262
+ prevDragRow = handleRowidOrRow($xeTable, targetRowidOrRow)
4263
+ const targetRowRest = prevDragRow ? fullAllDataRowIdData[getRowid($xeTable, prevDragRow)] : null
4264
+ if (rowRest && targetRowRest) {
4265
+ if (targetRowRest._index > rowRest._index) {
4266
+ defPos = 'bottom'
4267
+ }
4268
+ }
4269
+ }
4270
+ return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true)
4271
+ },
4158
4272
  /**
4159
4273
  * 获取表格的全量列
4160
4274
  */
@@ -4174,6 +4288,7 @@ export default defineComponent({
4174
4288
  */
4175
4289
  getCheckboxRecords (isFull) {
4176
4290
  const { treeConfig } = props
4291
+ const { selectCheckboxMaps } = reactData
4177
4292
  const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps } = internalData
4178
4293
  const treeOpts = computeTreeOpts.value
4179
4294
  const checkboxOpts = computeCheckboxOpts.value
@@ -4181,15 +4296,15 @@ export default defineComponent({
4181
4296
  const { checkField } = checkboxOpts
4182
4297
  const childrenField = treeOpts.children || treeOpts.childrenField
4183
4298
  let rowList: any[] = []
4184
- const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData)
4185
4299
  if (checkField) {
4186
4300
  if (treeConfig) {
4301
+ const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData)
4187
4302
  rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField })
4188
4303
  } else {
4304
+ const currTableData = isFull ? tableFullData : afterFullData
4189
4305
  rowList = currTableData.filter((row) => XEUtils.get(row, checkField))
4190
4306
  }
4191
4307
  } else {
4192
- const { selectCheckboxMaps } = reactData
4193
4308
  XEUtils.each(selectCheckboxMaps, (row, rowid) => {
4194
4309
  if (isFull) {
4195
4310
  if (fullDataRowIdData[rowid]) {
@@ -4873,6 +4988,7 @@ export default defineComponent({
4873
4988
  const childrenField = treeOpts.children || treeOpts.childrenField
4874
4989
  const checkboxOpts = computeCheckboxOpts.value
4875
4990
  const { checkField, reserve } = checkboxOpts
4991
+ // indeterminateField 仅支持读取
4876
4992
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField
4877
4993
  if (checkField) {
4878
4994
  const handleClearChecked = (item: any) => {
@@ -5000,13 +5116,20 @@ export default defineComponent({
5000
5116
  * 用于当前列,设置某列行为高亮状态
5001
5117
  */
5002
5118
  setCurrentColumn (fieldOrColumn) {
5119
+ const { mouseConfig } = props
5120
+ const mouseOpts = computeMouseOpts.value
5121
+ const isMouseSelected = mouseConfig && mouseOpts.selected
5003
5122
  const column = handleFieldOrColumn($xeTable, fieldOrColumn)
5004
5123
  if (column) {
5005
- // tableMethods.clearCurrentRow()
5006
- tableMethods.clearCurrentColumn()
5124
+ $xeTable.clearCurrentColumn()
5007
5125
  reactData.currentColumn = column
5008
5126
  }
5009
- return nextTick()
5127
+ return nextTick().then(() => {
5128
+ // 更新状选中态
5129
+ if (isMouseSelected) {
5130
+ $xeTable.addCellSelectedClass()
5131
+ }
5132
+ })
5010
5133
  },
5011
5134
  /**
5012
5135
  * 用于当前列,手动清空当前高亮的状态
@@ -5224,7 +5347,13 @@ export default defineComponent({
5224
5347
  visible: false
5225
5348
  })
5226
5349
  if (visible) {
5227
- dispatchEvent('filter-visible', { column, property: column.field, field: column.field, filterList: $xeTable.getCheckedFilters(), visible: false }, null)
5350
+ dispatchEvent('filter-visible', {
5351
+ column,
5352
+ property: column.field,
5353
+ field: column.field,
5354
+ filterList: () => $xeTable.getCheckedFilters(),
5355
+ visible: false
5356
+ }, null)
5228
5357
  }
5229
5358
  return nextTick()
5230
5359
  },
@@ -5847,7 +5976,13 @@ export default defineComponent({
5847
5976
  const { id } = props
5848
5977
  const customOpts = computeCustomOpts.value
5849
5978
  const { collectColumn } = internalData
5850
- const { checkMethod } = customOpts
5979
+ const { storage, checkMethod } = customOpts
5980
+ const isAllCustom = storage === true
5981
+ const storageOpts: VxeTableDefines.VxeTableCustomStorageObj = isAllCustom ? {} : Object.assign({}, storage || {})
5982
+ const isCustomResizable = isAllCustom || storageOpts.resizable
5983
+ const isCustomVisible = isAllCustom || storageOpts.visible
5984
+ const isCustomFixed = isAllCustom || storageOpts.fixed
5985
+ const isCustomSort = isAllCustom || storageOpts.sort
5851
5986
  const resizableData: Record<string, number> = {}
5852
5987
  const sortData: Record<string, number> = {}
5853
5988
  const visibleData: Record<string, boolean> = {}
@@ -5867,43 +6002,33 @@ export default defineComponent({
5867
6002
  let hasFixed = 0
5868
6003
  let hasVisible = 0
5869
6004
  XEUtils.eachTree(collectColumn, (column, index, items, path, parentColumn) => {
6005
+ const colKey = column.getKey()
6006
+ if (!colKey) {
6007
+ errLog('vxe.error.reqProp', [`${column.getTitle() || column.type || ''} -> column.field=?`])
6008
+ return
6009
+ }
5870
6010
  // 只支持一级
5871
6011
  if (!parentColumn) {
5872
- collectColumn.forEach((column) => {
5873
- const colKey = column.getKey()
5874
- if (colKey) {
5875
- hasSort = 1
5876
- sortData[colKey] = column.renderSortNumber
5877
- }
5878
- })
5879
- if (column.fixed !== column.defaultFixed) {
5880
- const colKey = column.getKey()
5881
- if (colKey) {
5882
- hasFixed = 1
5883
- fixedData[colKey] = column.fixed
5884
- }
6012
+ if (isCustomSort) {
6013
+ hasSort = 1
6014
+ sortData[colKey] = column.renderSortNumber
5885
6015
  }
5886
- }
5887
- if (column.resizeWidth) {
5888
- const colKey = column.getKey()
5889
- if (colKey) {
5890
- hasResizable = 1
5891
- resizableData[colKey] = column.renderWidth
6016
+ if (isCustomFixed && column.fixed !== column.defaultFixed) {
6017
+ hasFixed = 1
6018
+ fixedData[colKey] = column.fixed
5892
6019
  }
5893
6020
  }
5894
- if (!checkMethod || checkMethod({ column })) {
6021
+ if (isCustomResizable && column.resizeWidth) {
6022
+ hasResizable = 1
6023
+ resizableData[colKey] = column.renderWidth
6024
+ }
6025
+ if (isCustomVisible && (!checkMethod || checkMethod({ column }))) {
5895
6026
  if (!column.visible && column.defaultVisible) {
5896
- const colKey = column.getKey()
5897
- if (colKey) {
5898
- hasVisible = 1
5899
- visibleData[colKey] = false
5900
- }
6027
+ hasVisible = 1
6028
+ visibleData[colKey] = false
5901
6029
  } else if (column.visible && !column.defaultVisible) {
5902
- const colKey = column.getKey()
5903
- if (colKey) {
5904
- hasVisible = 1
5905
- visibleData[colKey] = true
5906
- }
6030
+ hasVisible = 1
6031
+ visibleData[colKey] = true
5907
6032
  }
5908
6033
  }
5909
6034
  })
@@ -6146,7 +6271,7 @@ export default defineComponent({
6146
6271
  // 该行为只对当前激活的表格有效
6147
6272
  if (internalData.isActivated) {
6148
6273
  tablePrivateMethods.preventEvent(evnt, 'event.keydown', null, () => {
6149
- const { mouseConfig, keyboardConfig, treeConfig, editConfig, highlightCurrentRow } = props
6274
+ const { mouseConfig, keyboardConfig, treeConfig, editConfig, highlightCurrentRow, highlightCurrentColumn } = props
6150
6275
  const { ctxMenuStore, editStore, currentRow } = reactData
6151
6276
  const { afterFullData } = internalData
6152
6277
  const isMenu = computeIsMenu.value
@@ -6157,6 +6282,7 @@ export default defineComponent({
6157
6282
  const treeOpts = computeTreeOpts.value
6158
6283
  const menuList = computeMenuList.value
6159
6284
  const rowOpts = computeRowOpts.value
6285
+ const columnOpts = computeColumnOpts.value
6160
6286
  const { selected, actived } = editStore
6161
6287
  const childrenField = treeOpts.children || treeOpts.childrenField
6162
6288
  const keyCode = evnt.keyCode
@@ -6315,10 +6441,15 @@ export default defineComponent({
6315
6441
  // 如果按下了方向键
6316
6442
  if (selected.row && selected.column) {
6317
6443
  $xeTable.moveSelected(selected.args, isLeftArrow, isUpArrow, isRightArrow, isDwArrow, evnt)
6318
- } else if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
6319
- // 当前行按键上下移动
6444
+ }
6445
+ // 当前行按键上下移动
6446
+ if ((isUpArrow || isDwArrow) && (rowOpts.isCurrent || highlightCurrentRow)) {
6320
6447
  $xeTable.moveCurrentRow(isUpArrow, isDwArrow, evnt)
6321
6448
  }
6449
+ // 当前行按键左右移动
6450
+ if ((isLeftArrow || isRightArrow) && (columnOpts.isCurrent || highlightCurrentColumn)) {
6451
+ $xeTable.moveCurrentColumn(isLeftArrow, isRightArrow, evnt)
6452
+ }
6322
6453
  }
6323
6454
  } else if (isTab && keyboardConfig && keyboardOpts.isTab) {
6324
6455
  // 如果按下了 Tab 键切换
@@ -6766,7 +6897,15 @@ export default defineComponent({
6766
6897
  if (el) {
6767
6898
  const parentElem = el.parentNode as HTMLElement
6768
6899
  const parentPaddingSize = height === '100%' || height === 'auto' ? getPaddingTopBottomSize(parentElem) : 0
6769
- return Math.floor($xeGrid ? $xeGrid.getParentHeight() : XEUtils.toNumber(getComputedStyle(parentElem).height) - parentPaddingSize)
6900
+ let parentWrapperHeight = 0
6901
+ if (parentElem) {
6902
+ if ($xeGrid && hasClass(parentElem, 'vxe-grid--table-wrapper')) {
6903
+ parentWrapperHeight = $xeGrid.getParentHeight()
6904
+ } else {
6905
+ parentWrapperHeight = parentElem.clientHeight
6906
+ }
6907
+ }
6908
+ return Math.floor(parentWrapperHeight - parentPaddingSize)
6770
6909
  }
6771
6910
  return 0
6772
6911
  },
@@ -6857,32 +6996,18 @@ export default defineComponent({
6857
6996
  const treeOpts = computeTreeOpts.value
6858
6997
  const childrenField = treeOpts.children || treeOpts.childrenField
6859
6998
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
6860
- const rowkey = getRowkey($xeTable)
6999
+ const { lazy } = treeOpts
6861
7000
  const fullAllDataRowIdMaps: Record<string, VxeTableDefines.RowCacheItem> = { ...fullAllDataRowIdData } // 存在已删除数据
6862
7001
  const fullDataRowIdMaps: Record<string, VxeTableDefines.RowCacheItem> = {}
6863
7002
  const treeTempExpandedMaps = { ...treeExpandedMaps }
6864
- const handleRow = (row: any, index: number, items: any, path?: any[], parentRow?: any, nodes?: any[]) => {
6865
- let rowid = getRowid($xeTable, row)
6866
- const seq = treeConfig && path ? toTreePathSeq(path) : index + 1
6867
- const level = nodes ? nodes.length - 1 : 0
6868
- if (eqEmptyValue(rowid)) {
6869
- rowid = getRowUniqueId()
6870
- XEUtils.set(row, rowkey, rowid)
6871
- }
6872
- if (treeConfig && treeOpts.lazy) {
6873
- const treeExpRest = treeExpandedMaps[rowid]
6874
- if (row[hasChildField] && XEUtils.isUndefined(row[childrenField])) {
6875
- row[childrenField] = null
6876
- }
6877
- if (treeExpRest) {
6878
- if (!row[childrenField] || !row[childrenField].length) {
6879
- delete treeTempExpandedMaps[rowid]
6880
- }
6881
- }
6882
- }
6883
- let rowRest = fullAllDataRowIdData[rowid]
7003
+
7004
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable)
7005
+ const handleRowCache = (row: any, index: number, items: any, currIndex: number, parentRow: any, rowid: string, level: number, seq: string | number) => {
7006
+ let rowRest = fullAllDataRowIdMaps[rowid]
6884
7007
  if (!rowRest) {
6885
7008
  rowRest = { row, rowid, seq, index: -1, _index: -1, $index: -1, treeIndex: index, items, parent: parentRow, level, height: 0, resizeHeight: 0, oTop: 0, expandHeight: 0 }
7009
+ fullDataRowIdMaps[rowid] = rowRest
7010
+ fullAllDataRowIdMaps[rowid] = rowRest
6886
7011
  }
6887
7012
  rowRest.treeLoaded = false
6888
7013
  rowRest.expandLoaded = false
@@ -6891,15 +7016,35 @@ export default defineComponent({
6891
7016
  rowRest.items = items
6892
7017
  rowRest.parent = parentRow
6893
7018
  rowRest.level = level
6894
- rowRest.index = treeConfig && parentRow ? -1 : index
7019
+ rowRest.index = currIndex
7020
+ rowRest.treeIndex = index
7021
+
6895
7022
  fullDataRowIdMaps[rowid] = rowRest
6896
7023
  fullAllDataRowIdMaps[rowid] = rowRest
6897
7024
  }
7025
+
6898
7026
  if (treeConfig) {
6899
- XEUtils.eachTree(tableFullTreeData, handleRow, { children: childrenField })
7027
+ XEUtils.eachTree(tableFullTreeData, (row, index, items, path, parentRow, nodes) => {
7028
+ const rowid = handleUpdateRowId(row)
7029
+ if (treeConfig && lazy) {
7030
+ const treeExpRest = treeTempExpandedMaps[rowid]
7031
+ if (row[hasChildField] && row[childrenField] === undefined) {
7032
+ row[childrenField] = null
7033
+ }
7034
+ if (treeExpRest) {
7035
+ if (!row[childrenField] || !row[childrenField].length) {
7036
+ delete treeTempExpandedMaps[rowid]
7037
+ }
7038
+ }
7039
+ }
7040
+ handleRowCache(row, index, items, parentRow ? -1 : index, parentRow, rowid, nodes.length - 1, toTreePathSeq(path))
7041
+ }, { children: childrenField })
6900
7042
  } else {
6901
- tableFullData.forEach(handleRow)
7043
+ tableFullData.forEach((row, index, items) => {
7044
+ handleRowCache(row, index, items, index, null, handleUpdateRowId(row), 0, index + 1)
7045
+ })
6902
7046
  }
7047
+
6903
7048
  internalData.fullDataRowIdData = fullDataRowIdMaps
6904
7049
  internalData.fullAllDataRowIdData = fullAllDataRowIdMaps
6905
7050
  reactData.treeExpandedMaps = treeTempExpandedMaps
@@ -6907,17 +7052,12 @@ export default defineComponent({
6907
7052
  cacheSourceMap (fullData) {
6908
7053
  const { treeConfig } = props
6909
7054
  const treeOpts = computeTreeOpts.value
6910
- let { sourceDataRowIdData } = internalData
6911
7055
  const sourceData = XEUtils.clone(fullData, true)
6912
- const rowkey = getRowkey($xeTable)
6913
- sourceDataRowIdData = internalData.sourceDataRowIdData = {}
7056
+ const { handleUpdateRowId } = createHandleUpdateRowId($xeTable)
7057
+ const sourceRowIdData: Record<string, any> = {}
6914
7058
  const handleSourceRow = (row: any) => {
6915
- let rowid = getRowid($xeTable, row)
6916
- if (eqEmptyValue(rowid)) {
6917
- rowid = getRowUniqueId()
6918
- XEUtils.set(row, rowkey, rowid)
6919
- }
6920
- sourceDataRowIdData[rowid] = row
7059
+ const rowid = handleUpdateRowId(row)
7060
+ sourceRowIdData[rowid] = row
6921
7061
  }
6922
7062
  // 源数据缓存
6923
7063
  if (treeConfig) {
@@ -6926,6 +7066,7 @@ export default defineComponent({
6926
7066
  } else {
6927
7067
  sourceData.forEach(handleSourceRow)
6928
7068
  }
7069
+ internalData.sourceDataRowIdData = sourceRowIdData
6929
7070
  internalData.tableSourceData = sourceData
6930
7071
  },
6931
7072
  /**
@@ -7372,8 +7513,21 @@ export default defineComponent({
7372
7513
  }
7373
7514
  // 兼容老版本
7374
7515
 
7375
- let rest
7376
- if (!evntList.some((func) => func(Object.assign({ $grid: $xeGrid, $table: $xeTable, $event: evnt }, args)) === false)) {
7516
+ let rest = null
7517
+ let isStop = false
7518
+ for (let i = 0; i < evntList.length; i++) {
7519
+ const func = evntList[i]
7520
+ const fnRest = func(Object.assign({ $grid: $xeGrid, $table: $xeTable, $event: evnt }, args))
7521
+ if (fnRest === false) {
7522
+ isStop = true
7523
+ break
7524
+ } else if (fnRest && fnRest.status === false) {
7525
+ rest = fnRest.result
7526
+ isStop = true
7527
+ break
7528
+ }
7529
+ }
7530
+ if (!isStop) {
7377
7531
  if (next) {
7378
7532
  rest = next()
7379
7533
  }
@@ -7399,10 +7553,11 @@ export default defineComponent({
7399
7553
  }
7400
7554
  // 树结构
7401
7555
  if (treeConfig) {
7556
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
7402
7557
  const childRowMaps: Record<string, number> = {}
7403
7558
  const childRowList: any[][] = []
7404
7559
  XEUtils.eachTree(afterTreeFullData, (row) => {
7405
- const rowid = getRowid($xeTable, row)
7560
+ const rowid = handleGetRowId(row)
7406
7561
  const childList = row[transform ? mapChildrenField : childrenField]
7407
7562
  if (childList && childList.length && !childRowMaps[rowid]) {
7408
7563
  childRowMaps[rowid] = 1
@@ -7419,7 +7574,7 @@ export default defineComponent({
7419
7574
  childList.forEach(
7420
7575
  checkMethod
7421
7576
  ? (item) => {
7422
- const childRowid = getRowid($xeTable, item)
7577
+ const childRowid = handleGetRowId(item)
7423
7578
  const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid]
7424
7579
  if (checkMethod({ row: item })) {
7425
7580
  if (isSelect) {
@@ -7437,7 +7592,7 @@ export default defineComponent({
7437
7592
  }
7438
7593
  }
7439
7594
  : item => {
7440
- const childRowid = getRowid($xeTable, item)
7595
+ const childRowid = handleGetRowId(item)
7441
7596
  const isSelect = checkField ? XEUtils.get(item, checkField) : selectRowMaps[childRowid]
7442
7597
  if (isSelect) {
7443
7598
  sLen++
@@ -7484,6 +7639,7 @@ export default defineComponent({
7484
7639
  const checkboxOpts = computeCheckboxOpts.value
7485
7640
  const { checkField, checkMethod, showReserveStatus } = checkboxOpts
7486
7641
  const { afterFullData, afterTreeFullData, checkboxReserveRowMap } = internalData
7642
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
7487
7643
 
7488
7644
  let sLen = 0 // 已选
7489
7645
  let hLen = 0 // 半选
@@ -7492,7 +7648,7 @@ export default defineComponent({
7492
7648
  const rootList = (treeConfig ? afterTreeFullData : afterFullData)
7493
7649
  rootList.forEach(checkMethod
7494
7650
  ? row => {
7495
- const childRowid = getRowid($xeTable, row)
7651
+ const childRowid = handleGetRowId(row)
7496
7652
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid]
7497
7653
  if (checkMethod({ row })) {
7498
7654
  if (selected) {
@@ -7510,7 +7666,7 @@ export default defineComponent({
7510
7666
  }
7511
7667
  }
7512
7668
  : row => {
7513
- const childRowid = getRowid($xeTable, row)
7669
+ const childRowid = handleGetRowId(row)
7514
7670
  const selected = checkField ? XEUtils.get(row, checkField) : selectCheckboxMaps[childRowid]
7515
7671
  if (selected) {
7516
7672
  sLen++
@@ -7548,6 +7704,8 @@ export default defineComponent({
7548
7704
  const childrenField = treeOpts.children || treeOpts.childrenField
7549
7705
  const checkboxOpts = computeCheckboxOpts.value
7550
7706
  const { checkField, checkStrictly, checkMethod } = checkboxOpts
7707
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
7708
+ // indeterminateField 仅支持读取
7551
7709
  const indeterminateField = checkboxOpts.indeterminateField || checkboxOpts.halfField
7552
7710
  if (checkField) {
7553
7711
  // 树结构
@@ -7581,7 +7739,7 @@ export default defineComponent({
7581
7739
  if (treeConfig && !checkStrictly) {
7582
7740
  // 更新子节点状态
7583
7741
  XEUtils.eachTree(rows, (row) => {
7584
- const rowid = getRowid($xeTable, row)
7742
+ const rowid = handleGetRowId(row)
7585
7743
  if (isForce || (!checkMethod || checkMethod({ row }))) {
7586
7744
  if (checked) {
7587
7745
  selectRowMaps[rowid] = row
@@ -7599,7 +7757,7 @@ export default defineComponent({
7599
7757
 
7600
7758
  // 列表
7601
7759
  rows.forEach(row => {
7602
- const rowid = getRowid($xeTable, row)
7760
+ const rowid = handleGetRowId(row)
7603
7761
  if (isForce || (!checkMethod || checkMethod({ row }))) {
7604
7762
  if (checked) {
7605
7763
  if (!selectRowMaps[rowid]) {
@@ -7724,17 +7882,18 @@ export default defineComponent({
7724
7882
  const { _lastResizeTime } = internalData
7725
7883
  const sortOpts = computeSortOpts.value
7726
7884
  const columnOpts = computeColumnOpts.value
7885
+ const currentColumnOpts = computeCurrentColumnOpts.value
7727
7886
  const { column } = params
7728
7887
  const cell = evnt.currentTarget
7729
7888
  const triggerResizable = _lastResizeTime && _lastResizeTime > Date.now() - 300
7730
7889
  const triggerSort = getEventTargetNode(evnt, cell, 'vxe-cell--sort').flag
7731
7890
  const triggerFilter = getEventTargetNode(evnt, cell, 'vxe-cell--filter').flag
7732
7891
  if (sortOpts.trigger === 'cell' && !(triggerResizable || triggerSort || triggerFilter)) {
7733
- tablePrivateMethods.triggerSortEvent(evnt, column, getNextSortOrder(column))
7892
+ $xeTable.triggerSortEvent(evnt, column, getNextSortOrder(column))
7734
7893
  }
7735
7894
  dispatchEvent('header-cell-click', Object.assign({ triggerResizable, triggerSort, triggerFilter, cell }, params), evnt)
7736
- if (columnOpts.isCurrent || props.highlightCurrentColumn) {
7737
- tablePrivateMethods.triggerCurrentColumnEvent(evnt, params)
7895
+ if ((columnOpts.isCurrent || props.highlightCurrentColumn) && (!currentColumnOpts.trigger || ['header', 'default'].includes(currentColumnOpts.trigger))) {
7896
+ $xeTable.triggerCurrentColumnEvent(evnt, params)
7738
7897
  }
7739
7898
  },
7740
7899
  triggerHeaderCellDblclickEvent (evnt, params) {
@@ -7746,7 +7905,7 @@ export default defineComponent({
7746
7905
  * 如果是双击模式,则单击后选中状态
7747
7906
  */
7748
7907
  triggerCellClickEvent (evnt, params) {
7749
- const { highlightCurrentRow, editConfig } = props
7908
+ const { highlightCurrentRow, highlightCurrentColumn, editConfig } = props
7750
7909
  const { editStore, isDragResize } = reactData
7751
7910
  if (isDragResize) {
7752
7911
  return
@@ -7758,6 +7917,8 @@ export default defineComponent({
7758
7917
  const checkboxOpts = computeCheckboxOpts.value
7759
7918
  const keyboardOpts = computeKeyboardOpts.value
7760
7919
  const rowOpts = computeRowOpts.value
7920
+ const columnOpts = computeColumnOpts.value
7921
+ const currentColumnOpts = computeCurrentColumnOpts.value
7761
7922
  const { actived, focused } = editStore
7762
7923
  const { row, column } = params
7763
7924
  const { type, treeNode } = column
@@ -7773,29 +7934,35 @@ export default defineComponent({
7773
7934
  if (!triggerCheckbox && !triggerRadio) {
7774
7935
  // 如果是展开行
7775
7936
  if (!triggerExpandNode && (expandOpts.trigger === 'row' || (isExpandType && expandOpts.trigger === 'cell'))) {
7776
- tablePrivateMethods.triggerRowExpandEvent(evnt, params)
7937
+ $xeTable.triggerRowExpandEvent(evnt, params)
7777
7938
  }
7778
7939
  // 如果是树形表格
7779
7940
  if ((treeOpts.trigger === 'row' || (treeNode && treeOpts.trigger === 'cell'))) {
7780
- tablePrivateMethods.triggerTreeExpandEvent(evnt, params)
7941
+ $xeTable.triggerTreeExpandEvent(evnt, params)
7781
7942
  }
7782
7943
  }
7783
7944
  // 如果点击了树节点
7784
7945
  if (!triggerTreeNode) {
7785
7946
  if (!triggerExpandNode) {
7786
- // 如果是高亮行
7947
+ // 如果是当前行
7787
7948
  if (rowOpts.isCurrent || highlightCurrentRow) {
7788
7949
  if (!triggerCheckbox && !triggerRadio) {
7789
- tablePrivateMethods.triggerCurrentRowEvent(evnt, params)
7950
+ $xeTable.triggerCurrentRowEvent(evnt, params)
7951
+ }
7952
+ }
7953
+ // 如果是当前列
7954
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && (!currentColumnOpts.trigger || ['cell', 'default'].includes(currentColumnOpts.trigger))) {
7955
+ if (!triggerCheckbox && !triggerRadio) {
7956
+ $xeTable.triggerCurrentColumnEvent(evnt, params)
7790
7957
  }
7791
7958
  }
7792
7959
  // 如果是单选框
7793
7960
  if (!triggerRadio && (radioOpts.trigger === 'row' || (isRadioType && radioOpts.trigger === 'cell'))) {
7794
- tablePrivateMethods.triggerRadioRowEvent(evnt, params)
7961
+ $xeTable.triggerRadioRowEvent(evnt, params)
7795
7962
  }
7796
7963
  // 如果是复选框
7797
7964
  if (!triggerCheckbox && (checkboxOpts.trigger === 'row' || (isCheckboxType && checkboxOpts.trigger === 'cell'))) {
7798
- tablePrivateMethods.handleToggleCheckRowEvent(evnt, params)
7965
+ $xeTable.handleToggleCheckRowEvent(evnt, params)
7799
7966
  }
7800
7967
  }
7801
7968
  // 如果设置了单元格选中功能,则不会使用点击事件去处理(只能支持双击模式)
@@ -7891,36 +8058,38 @@ export default defineComponent({
7891
8058
  }
7892
8059
  },
7893
8060
  triggerCheckRowEvent (evnt: MouseEvent, params, checked) {
7894
- const checkboxOpts = computeCheckboxOpts.value
7895
8061
  const { row } = params
7896
8062
  const { afterFullData } = internalData
8063
+ const checkboxOpts = computeCheckboxOpts.value
7897
8064
  const { checkMethod, trigger } = checkboxOpts
7898
8065
  if (trigger === 'manual') {
7899
8066
  return
7900
8067
  }
7901
8068
  evnt.stopPropagation()
7902
8069
  if (checkboxOpts.isShiftKey && evnt.shiftKey && !props.treeConfig) {
7903
- const checkboxRecords = tableMethods.getCheckboxRecords()
8070
+ const checkboxRecords = $xeTable.getCheckboxRecords()
7904
8071
  if (checkboxRecords.length) {
7905
8072
  const firstRow = checkboxRecords[0]
7906
- const _rowIndex = tableMethods.getVTRowIndex(row)
7907
- const _firstRowIndex = tableMethods.getVTRowIndex(firstRow)
8073
+ const _rowIndex = $xeTable.getVTRowIndex(row)
8074
+ const _firstRowIndex = $xeTable.getVTRowIndex(firstRow)
7908
8075
  if (_rowIndex !== _firstRowIndex) {
7909
- tableMethods.setAllCheckboxRow(false)
8076
+ $xeTable.setAllCheckboxRow(false)
7910
8077
  const rangeRows = _rowIndex < _firstRowIndex ? afterFullData.slice(_rowIndex, _firstRowIndex + 1) : afterFullData.slice(_firstRowIndex, _rowIndex + 1)
7911
- handleCheckedCheckboxRow(rangeRows, true, false)
8078
+ nextTick(() => {
8079
+ handleCheckedCheckboxRow(rangeRows, true, false)
8080
+ })
7912
8081
  dispatchEvent('checkbox-range-select', Object.assign({ rangeRecords: rangeRows }, params), evnt)
7913
8082
  return
7914
8083
  }
7915
8084
  }
7916
8085
  }
7917
8086
  if (!checkMethod || checkMethod({ row })) {
7918
- tablePrivateMethods.handleBatchSelectRows([row], checked)
7919
- tablePrivateMethods.checkSelectionStatus()
8087
+ $xeTable.handleBatchSelectRows([row], checked)
8088
+ $xeTable.checkSelectionStatus()
7920
8089
  dispatchEvent('checkbox-change', Object.assign({
7921
- records: tableMethods.getCheckboxRecords(),
7922
- reserves: tableMethods.getCheckboxReserveRecords(),
7923
- indeterminates: tableMethods.getCheckboxIndeterminateRecords(),
8090
+ records: () => $xeTable.getCheckboxRecords(),
8091
+ reserves: () => $xeTable.getCheckboxReserveRecords(),
8092
+ indeterminates: () => $xeTable.getCheckboxIndeterminateRecords(),
7924
8093
  checked
7925
8094
  }, params), evnt)
7926
8095
  }
@@ -8185,6 +8354,9 @@ export default defineComponent({
8185
8354
  const { afterFullData, tableFullData } = internalData
8186
8355
  const dEndMethod = dragEndMethod || (dragConfig ? dragConfig.dragEndMethod : null)
8187
8356
  const dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
8357
+ const errRest = {
8358
+ status: false
8359
+ }
8188
8360
  if (prevDragRow && dragRow) {
8189
8361
  // 判断是否有拖动
8190
8362
  if (prevDragRow !== dragRow) {
@@ -8199,7 +8371,7 @@ export default defineComponent({
8199
8371
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
8200
8372
  return Promise.resolve(dEndMethod ? dEndMethod(dragParams) : true).then((status) => {
8201
8373
  if (!status) {
8202
- return
8374
+ return errRest
8203
8375
  }
8204
8376
 
8205
8377
  let oafIndex = -1
@@ -8230,11 +8402,11 @@ export default defineComponent({
8230
8402
  if (isPeerDrag && !isCrossDrag) {
8231
8403
  if (oldRest.row[parentField] !== newRest.row[parentField]) {
8232
8404
  // 非同级
8233
- return
8405
+ return errRest
8234
8406
  }
8235
8407
  } else {
8236
8408
  if (!isCrossDrag) {
8237
- return
8409
+ return errRest
8238
8410
  }
8239
8411
  if (oldAllMaps[newRowid]) {
8240
8412
  isSelfToChildStatus = true
@@ -8245,7 +8417,7 @@ export default defineComponent({
8245
8417
  content: getI18n('vxe.error.treeDragChild')
8246
8418
  })
8247
8419
  }
8248
- return
8420
+ return errRest
8249
8421
  }
8250
8422
  }
8251
8423
  }
@@ -8253,13 +8425,13 @@ export default defineComponent({
8253
8425
  // 子到根
8254
8426
 
8255
8427
  if (!isCrossDrag) {
8256
- return
8428
+ return errRest
8257
8429
  }
8258
8430
  } else if (newLevel) {
8259
8431
  // 根到子
8260
8432
 
8261
8433
  if (!isCrossDrag) {
8262
- return
8434
+ return errRest
8263
8435
  }
8264
8436
  if (oldAllMaps[newRowid]) {
8265
8437
  isSelfToChildStatus = true
@@ -8270,7 +8442,7 @@ export default defineComponent({
8270
8442
  content: getI18n('vxe.error.treeDragChild')
8271
8443
  })
8272
8444
  }
8273
- return
8445
+ return errRest
8274
8446
  }
8275
8447
  }
8276
8448
  } else {
@@ -8334,28 +8506,36 @@ export default defineComponent({
8334
8506
  if (reactData.scrollYLoad) {
8335
8507
  $xeTable.updateScrollYSpace()
8336
8508
  }
8337
- nextTick().then(() => {
8509
+
8510
+ if (evnt) {
8511
+ dispatchEvent('row-dragend', {
8512
+ oldRow: dragRow,
8513
+ newRow: prevDragRow,
8514
+ dragRow,
8515
+ dragPos: prevDragPos as any,
8516
+ dragToChild: isDragToChildFlag,
8517
+ offsetIndex: dragOffsetIndex,
8518
+ _index: {
8519
+ newIndex: nafIndex,
8520
+ oldIndex: oafIndex
8521
+ }
8522
+ }, evnt)
8523
+ }
8524
+
8525
+ return nextTick().then(() => {
8338
8526
  $xeTable.updateCellAreas()
8339
8527
  $xeTable.recalculate()
8340
- })
8341
-
8342
- dispatchEvent('row-dragend', {
8343
- oldRow: dragRow,
8344
- newRow: prevDragRow,
8345
- dragRow,
8346
- dragPos: prevDragPos as any,
8347
- dragToChild: isDragToChildFlag,
8348
- offsetIndex: dragOffsetIndex,
8349
- _index: {
8350
- newIndex: nafIndex,
8351
- oldIndex: oafIndex
8528
+ }).then(() => {
8529
+ return {
8530
+ status: true
8352
8531
  }
8353
- }, evnt)
8532
+ })
8354
8533
  }).catch(() => {
8534
+ return errRest
8355
8535
  })
8356
8536
  }
8357
8537
  }
8358
- return Promise.resolve()
8538
+ return Promise.resolve(errRest)
8359
8539
  },
8360
8540
  handleRowDragDragendEvent (evnt) {
8361
8541
  const { treeConfig } = props
@@ -8480,6 +8660,9 @@ export default defineComponent({
8480
8660
  const { isPeerDrag, isCrossDrag, isSelfToChildDrag, isToChildDrag, dragEndMethod, dragToChildMethod } = columnDragOpts
8481
8661
  const { collectColumn } = internalData
8482
8662
  const dragOffsetIndex = prevDragPos === 'right' ? 1 : 0
8663
+ const errRest = {
8664
+ status: false
8665
+ }
8483
8666
  if (prevDragCol && dragCol) {
8484
8667
  // 判断是否有拖动
8485
8668
  if (prevDragCol !== dragCol) {
@@ -8496,7 +8679,7 @@ export default defineComponent({
8496
8679
  const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
8497
8680
  return Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
8498
8681
  if (!status) {
8499
- return
8682
+ return errRest
8500
8683
  }
8501
8684
 
8502
8685
  let oafIndex = -1
@@ -8515,11 +8698,11 @@ export default defineComponent({
8515
8698
  if (isPeerDrag && !isCrossDrag) {
8516
8699
  if (dragColumn.parentId !== newColumn.parentId) {
8517
8700
  // 非同级
8518
- return
8701
+ return errRest
8519
8702
  }
8520
8703
  } else {
8521
8704
  if (!isCrossDrag) {
8522
- return
8705
+ return errRest
8523
8706
  }
8524
8707
 
8525
8708
  if (oldAllMaps[newColumn.id]) {
@@ -8531,7 +8714,7 @@ export default defineComponent({
8531
8714
  content: getI18n('vxe.error.treeDragChild')
8532
8715
  })
8533
8716
  }
8534
- return
8717
+ return errRest
8535
8718
  }
8536
8719
  }
8537
8720
  }
@@ -8539,13 +8722,13 @@ export default defineComponent({
8539
8722
  // 子到根
8540
8723
 
8541
8724
  if (!isCrossDrag) {
8542
- return
8725
+ return errRest
8543
8726
  }
8544
8727
  } else if (newColumn.parentId) {
8545
8728
  // 根到子
8546
8729
 
8547
8730
  if (!isCrossDrag) {
8548
- return
8731
+ return errRest
8549
8732
  }
8550
8733
  if (oldAllMaps[newColumn.id]) {
8551
8734
  isSelfToChildStatus = true
@@ -8556,7 +8739,7 @@ export default defineComponent({
8556
8739
  content: getI18n('vxe.error.treeDragChild')
8557
8740
  })
8558
8741
  }
8559
- return
8742
+ return errRest
8560
8743
  }
8561
8744
  }
8562
8745
  } else {
@@ -8620,27 +8803,34 @@ export default defineComponent({
8620
8803
  }
8621
8804
  }
8622
8805
 
8623
- dispatchEvent('column-dragend', {
8624
- oldColumn: dragColumn,
8625
- newColumn,
8626
- dragColumn,
8627
- dragPos: prevDragPos,
8628
- dragToChild: isDragToChildFlag,
8629
- offsetIndex: dragOffsetIndex,
8630
- _index: {
8631
- newIndex: nafIndex,
8632
- oldIndex: oafIndex
8633
- }
8634
- }, evnt)
8806
+ if (evnt) {
8807
+ dispatchEvent('column-dragend', {
8808
+ oldColumn: dragColumn,
8809
+ newColumn,
8810
+ dragColumn,
8811
+ dragPos: prevDragPos,
8812
+ dragToChild: isDragToChildFlag,
8813
+ offsetIndex: dragOffsetIndex,
8814
+ _index: {
8815
+ newIndex: nafIndex,
8816
+ oldIndex: oafIndex
8817
+ }
8818
+ }, evnt)
8819
+ }
8635
8820
 
8636
8821
  if (isSyncColumn) {
8637
8822
  $xeTable.handleColDragSwapColumn()
8638
8823
  }
8824
+
8825
+ return {
8826
+ status: true
8827
+ }
8639
8828
  }).catch(() => {
8829
+ return errRest
8640
8830
  })
8641
8831
  }
8642
8832
  }
8643
- return Promise.resolve()
8833
+ return Promise.resolve(errRest)
8644
8834
  },
8645
8835
  handleHeaderCellDragDragendEvent (evnt) {
8646
8836
  const { dragCol } = reactData
@@ -9033,10 +9223,10 @@ export default defineComponent({
9033
9223
  }
9034
9224
 
9035
9225
  const { highlightHoverRow } = tableProps
9036
- const { scrollXLoad, scrollYLoad } = reactData
9226
+ const { scrollXLoad, scrollYLoad, expandColumn } = reactData
9037
9227
  const leftFixedWidth = computeLeftFixedWidth.value
9038
9228
  const rightFixedWidth = computeRightFixedWidth.value
9039
- if (!(scrollYLoad || leftFixedWidth || rightFixedWidth)) {
9229
+ if (!(scrollYLoad || leftFixedWidth || rightFixedWidth || expandColumn)) {
9040
9230
  return
9041
9231
  }
9042
9232