vxe-table 3.18.0 → 3.18.2

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 (83) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/style.css +1 -1
  4. package/es/style.min.css +1 -1
  5. package/es/table/module/edit/mixin.js +58 -20
  6. package/es/table/module/filter/mixin.js +12 -10
  7. package/es/table/module/menu/mixin.js +16 -9
  8. package/es/table/module/validator/mixin.js +4 -2
  9. package/es/table/src/column.js +2 -0
  10. package/es/table/src/columnInfo.js +1 -0
  11. package/es/table/src/footer.js +7 -5
  12. package/es/table/src/header.js +67 -28
  13. package/es/table/src/methods.js +577 -85
  14. package/es/table/src/props.js +23 -6
  15. package/es/table/src/store.js +8 -0
  16. package/es/table/src/table.js +67 -26
  17. package/es/table/src/util.js +70 -2
  18. package/es/table/style.css +11 -17
  19. package/es/table/style.min.css +1 -1
  20. package/es/ui/index.js +1 -1
  21. package/es/ui/src/log.js +1 -1
  22. package/es/vxe-table/style.css +11 -17
  23. package/es/vxe-table/style.min.css +1 -1
  24. package/lib/index.css +1 -1
  25. package/lib/index.min.css +1 -1
  26. package/lib/index.umd.js +1002 -200
  27. package/lib/index.umd.min.js +1 -1
  28. package/lib/style.css +1 -1
  29. package/lib/style.min.css +1 -1
  30. package/lib/table/module/edit/mixin.js +55 -16
  31. package/lib/table/module/edit/mixin.min.js +1 -1
  32. package/lib/table/module/filter/mixin.js +12 -10
  33. package/lib/table/module/filter/mixin.min.js +1 -1
  34. package/lib/table/module/menu/mixin.js +20 -13
  35. package/lib/table/module/menu/mixin.min.js +1 -1
  36. package/lib/table/module/validator/mixin.js +4 -2
  37. package/lib/table/module/validator/mixin.min.js +1 -1
  38. package/lib/table/src/column.js +2 -0
  39. package/lib/table/src/column.min.js +1 -1
  40. package/lib/table/src/columnInfo.js +1 -0
  41. package/lib/table/src/columnInfo.min.js +1 -1
  42. package/lib/table/src/footer.js +7 -5
  43. package/lib/table/src/header.js +82 -25
  44. package/lib/table/src/header.min.js +1 -1
  45. package/lib/table/src/methods.js +647 -94
  46. package/lib/table/src/methods.min.js +1 -1
  47. package/lib/table/src/props.js +11 -3
  48. package/lib/table/src/props.min.js +1 -1
  49. package/lib/table/src/store.js +15 -0
  50. package/lib/table/src/store.min.js +1 -0
  51. package/lib/table/src/table.js +74 -25
  52. package/lib/table/src/table.min.js +1 -1
  53. package/lib/table/src/util.js +74 -2
  54. package/lib/table/src/util.min.js +1 -1
  55. package/lib/table/style/style.css +11 -17
  56. package/lib/table/style/style.min.css +1 -1
  57. package/lib/ui/index.js +1 -1
  58. package/lib/ui/index.min.js +1 -1
  59. package/lib/ui/src/log.js +1 -1
  60. package/lib/ui/src/log.min.js +1 -1
  61. package/lib/vxe-table/style/style.css +11 -17
  62. package/lib/vxe-table/style/style.min.css +1 -1
  63. package/package.json +1 -1
  64. package/packages/table/module/edit/mixin.ts +59 -23
  65. package/packages/table/module/filter/mixin.ts +17 -13
  66. package/packages/table/module/menu/mixin.ts +16 -9
  67. package/packages/table/module/validator/mixin.ts +8 -4
  68. package/packages/table/src/column.ts +4 -2
  69. package/packages/table/src/columnInfo.ts +1 -0
  70. package/packages/table/src/footer.ts +11 -9
  71. package/packages/table/src/header.ts +76 -34
  72. package/packages/table/src/methods.ts +607 -90
  73. package/packages/table/src/props.ts +29 -12
  74. package/packages/table/src/store.ts +15 -0
  75. package/packages/table/src/table.ts +79 -24
  76. package/packages/table/src/util.ts +76 -2
  77. package/styles/components/table.scss +33 -55
  78. /package/es/{iconfont.1756083626568.ttf → iconfont.1756452257212.ttf} +0 -0
  79. /package/es/{iconfont.1756083626568.woff → iconfont.1756452257212.woff} +0 -0
  80. /package/es/{iconfont.1756083626568.woff2 → iconfont.1756452257212.woff2} +0 -0
  81. /package/lib/{iconfont.1756083626568.ttf → iconfont.1756452257212.ttf} +0 -0
  82. /package/lib/{iconfont.1756083626568.woff → iconfont.1756452257212.woff} +0 -0
  83. /package/lib/{iconfont.1756083626568.woff2 → iconfont.1756452257212.woff2} +0 -0
@@ -7,6 +7,7 @@ import { getRowUniqueId, clearTableAllStatus, getColumnList, toFilters, getRowke
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
8
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from './anime'
9
9
  import { warnLog, errLog } from '../../ui/src/log'
10
+ import { getCrossTableDragRowInfo } from './store'
10
11
 
11
12
  import type { VxeTableDefines, VxeColumnPropTypes, VxeTableEmits, ValueOf, TableReactData, VxeTableConstructor, VxeToolbarConstructor, VxeToolbarInstance, TableInternalData, VxeGridConstructor, VxeTablePrivateMethods, VxeTooltipInstance, VxeTablePropTypes, VxeGridPrivateMethods } from '../../../types'
12
13
 
@@ -19,6 +20,11 @@ const customStorageKey = 'VXE_CUSTOM_STORE'
19
20
  const maxYHeight = 5e6
20
21
  const maxXWidth = 5e6
21
22
 
23
+ let crossTableDragRowObj: {
24
+ $oldTable: VxeTableConstructor & VxeTablePrivateMethods
25
+ $newTable: (VxeTableConstructor & VxeTablePrivateMethods) | null
26
+ } | null = null
27
+
22
28
  function eqCellValue (row1: any, row2: any, field: any) {
23
29
  const val1 = XEUtils.get(row1, field)
24
30
  const val2 = XEUtils.get(row2, field)
@@ -1001,22 +1007,27 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1001
1007
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : ''
1002
1008
  }
1003
1009
 
1010
+ const scrollbarXConf = scrollbarOpts.x || {}
1004
1011
  const scrollbarXToTop = $xeTable.computeScrollbarXToTop
1012
+ const scrollbarYConf = scrollbarOpts.y || {}
1005
1013
  const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft
1006
1014
 
1007
1015
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden'
1008
- if ($xeGanttView) {
1016
+ if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
1009
1017
  osbHeight = scrollbarHeight
1010
1018
  xScrollbarVisible = 'visible'
1011
- } else if (scrollbarOpts.x && scrollbarOpts.x.visible === false) {
1019
+ } else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
1012
1020
  osbHeight = 0
1013
1021
  xScrollbarVisible = 'hidden'
1014
1022
  }
1015
1023
 
1016
1024
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
1017
- if ((scrollbarOpts.y && scrollbarOpts.y.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
1025
+ if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
1018
1026
  osbWidth = 0
1019
1027
  yScrollbarVisible = 'hidden'
1028
+ } else if (scrollbarYConf.visible === 'visible') {
1029
+ osbWidth = scrollbarWidth
1030
+ yScrollbarVisible = 'visible'
1020
1031
  }
1021
1032
 
1022
1033
  let tbHeight = 0
@@ -1058,7 +1069,7 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1058
1069
  }
1059
1070
  if (xRightCornerEl) {
1060
1071
  xRightCornerEl.style.width = scrollbarXToTop ? '' : `${osbWidth}px`
1061
- xRightCornerEl.style.display = scrollbarXToTop ? '' : (overflowX && osbHeight ? 'block' : '')
1072
+ xRightCornerEl.style.display = scrollbarXToTop ? '' : (xScrollbarVisible === 'visible' ? 'block' : '')
1062
1073
  }
1063
1074
 
1064
1075
  const scrollYVirtualEl = $xeTable.$refs.refScrollYVirtualElem as HTMLDivElement
@@ -1070,7 +1081,7 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1070
1081
  const yTopCornerEl = $xeTable.$refs.refScrollYTopCornerElem as HTMLDivElement
1071
1082
  if (yTopCornerEl) {
1072
1083
  yTopCornerEl.style.height = `${tHeaderHeight}px`
1073
- yTopCornerEl.style.display = overflowY && tHeaderHeight ? 'block' : ''
1084
+ yTopCornerEl.style.display = tHeaderHeight && yScrollbarVisible === 'visible' ? 'block' : ''
1074
1085
  }
1075
1086
  const yWrapperEl = $xeTable.$refs.refScrollYWrapperElem as HTMLDivElement
1076
1087
  if (yWrapperEl) {
@@ -1081,7 +1092,7 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1081
1092
  if (yBottomCornerEl) {
1082
1093
  yBottomCornerEl.style.height = `${tFooterHeight}px`
1083
1094
  yBottomCornerEl.style.top = `${tHeaderHeight + tbHeight}px`
1084
- yBottomCornerEl.style.display = overflowY && tFooterHeight ? 'block' : ''
1095
+ yBottomCornerEl.style.display = tFooterHeight && yScrollbarVisible === 'visible' ? 'block' : ''
1085
1096
  }
1086
1097
 
1087
1098
  const rowExpandEl = $xeTable.$refs.refRowExpandElem as HTMLDivElement
@@ -2005,12 +2016,60 @@ function handleBodyMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMethods
2005
2016
  }
2006
2017
  }
2007
2018
 
2008
- function handleFooterMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2019
+ function removeBodyMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2020
+ const internalData = $xeTable as unknown as TableInternalData
2021
+
2022
+ const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
2023
+ const rest: VxeTableDefines.MergeItem[] = []
2024
+ if (merges) {
2025
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
2026
+ if (!XEUtils.isArray(merges)) {
2027
+ merges = [merges]
2028
+ }
2029
+ merges.forEach((item) => {
2030
+ const { row: margeRow, col: margeCol } = item
2031
+ let mergeRowIndex = -1
2032
+ let mergeColumnIndex = -1
2033
+ if (XEUtils.isNumber(margeRow)) {
2034
+ mergeRowIndex = margeRow
2035
+ } else {
2036
+ const rowid = margeRow ? handleGetRowId(margeRow) : null
2037
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
2038
+ if (rowRest) {
2039
+ mergeRowIndex = rowRest._index
2040
+ }
2041
+ }
2042
+ if (XEUtils.isNumber(margeCol)) {
2043
+ mergeColumnIndex = margeCol
2044
+ } else {
2045
+ const colid = margeCol ? margeCol.id : null
2046
+ const colRest = colid ? fullColumnIdData[colid] : null
2047
+ if (colRest) {
2048
+ mergeColumnIndex = colRest._index
2049
+ }
2050
+ }
2051
+ const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => (item.row === mergeRowIndex) && (item.col === mergeColumnIndex))
2052
+ if (mcIndex > -1) {
2053
+ const rItems = mergeBodyList.splice(mcIndex, 1)
2054
+ const item = rItems[0]
2055
+ if (item) {
2056
+ rest.push(rItems[0])
2057
+ if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
2058
+ delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2059
+ }
2060
+ }
2061
+ }
2062
+ })
2063
+ }
2064
+ return rest
2065
+ }
2066
+
2067
+ function handleHeaderMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2009
2068
  const reactData = $xeTable as unknown as TableReactData
2010
2069
  const internalData = $xeTable as unknown as TableInternalData
2011
2070
 
2012
2071
  const { footerTableData } = reactData
2013
- const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
2072
+ const { mergeHeaderList, mergeHeaderMaps, fullColumnIdData } = internalData
2014
2073
  if (merges) {
2015
2074
  const { visibleColumn } = internalData
2016
2075
  if (!XEUtils.isArray(merges)) {
@@ -2035,7 +2094,7 @@ function handleFooterMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMetho
2035
2094
  if (rowspan > 1 || colspan > 1) {
2036
2095
  const row = footerTableData[mergeRowIndex]
2037
2096
  const column = visibleColumn[mergeColumnIndex]
2038
- let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2097
+ let mergeItem = mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2039
2098
  if (mergeItem) {
2040
2099
  mergeItem.rowspan = rowspan
2041
2100
  mergeItem.colspan = colspan
@@ -2052,8 +2111,8 @@ function handleFooterMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMetho
2052
2111
  _rowspan: rowspan,
2053
2112
  _colspan: colspan
2054
2113
  }
2055
- mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
2056
- mergeFooterList.push(mergeItem)
2114
+ mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
2115
+ mergeHeaderList.push(mergeItem)
2057
2116
  }
2058
2117
  }
2059
2118
  }
@@ -2061,29 +2120,19 @@ function handleFooterMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMetho
2061
2120
  }
2062
2121
  }
2063
2122
 
2064
- function removeBodyMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2123
+ function removeHeaderMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2065
2124
  const internalData = $xeTable as unknown as TableInternalData
2066
2125
 
2067
- const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
2126
+ const { mergeHeaderList, fullColumnIdData, mergeHeaderMaps } = internalData
2068
2127
  const rest: VxeTableDefines.MergeItem[] = []
2069
2128
  if (merges) {
2070
- const { handleGetRowId } = createHandleGetRowId($xeTable)
2071
2129
  if (!XEUtils.isArray(merges)) {
2072
2130
  merges = [merges]
2073
2131
  }
2074
2132
  merges.forEach((item) => {
2075
2133
  const { row: margeRow, col: margeCol } = item
2076
- let mergeRowIndex = -1
2134
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
2077
2135
  let mergeColumnIndex = -1
2078
- if (XEUtils.isNumber(margeRow)) {
2079
- mergeRowIndex = margeRow
2080
- } else {
2081
- const rowid = margeRow ? handleGetRowId(margeRow) : null
2082
- const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
2083
- if (rowRest) {
2084
- mergeRowIndex = rowRest._index
2085
- }
2086
- }
2087
2136
  if (XEUtils.isNumber(margeCol)) {
2088
2137
  mergeColumnIndex = margeCol
2089
2138
  } else {
@@ -2093,14 +2142,14 @@ function removeBodyMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethod
2093
2142
  mergeColumnIndex = colRest._index
2094
2143
  }
2095
2144
  }
2096
- const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => (item.row === mergeRowIndex) && (item.col === mergeColumnIndex))
2145
+ const mcIndex = XEUtils.findIndexOf(mergeHeaderList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
2097
2146
  if (mcIndex > -1) {
2098
- const rItems = mergeBodyList.splice(mcIndex, 1)
2147
+ const rItems = mergeHeaderList.splice(mcIndex, 1)
2099
2148
  const item = rItems[0]
2100
2149
  if (item) {
2101
- rest.push(rItems[0])
2102
- if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
2103
- delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2150
+ rest.push(item)
2151
+ if (mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
2152
+ delete mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2104
2153
  }
2105
2154
  }
2106
2155
  }
@@ -2109,6 +2158,62 @@ function removeBodyMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethod
2109
2158
  return rest
2110
2159
  }
2111
2160
 
2161
+ function handleFooterMerge ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2162
+ const reactData = $xeTable as unknown as TableReactData
2163
+ const internalData = $xeTable as unknown as TableInternalData
2164
+
2165
+ const { footerTableData } = reactData
2166
+ const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
2167
+ if (merges) {
2168
+ const { visibleColumn } = internalData
2169
+ if (!XEUtils.isArray(merges)) {
2170
+ merges = [merges]
2171
+ }
2172
+ merges.forEach((item) => {
2173
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item
2174
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
2175
+ let mergeColumnIndex = -1
2176
+ if (XEUtils.isNumber(margeCol)) {
2177
+ mergeColumnIndex = margeCol
2178
+ } else {
2179
+ const colid = margeCol ? margeCol.id : null
2180
+ const colRest = colid ? fullColumnIdData[colid] : null
2181
+ if (colRest) {
2182
+ mergeColumnIndex = colRest._index
2183
+ }
2184
+ }
2185
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
2186
+ rowspan = XEUtils.toNumber(rowspan) || 1
2187
+ colspan = XEUtils.toNumber(colspan) || 1
2188
+ if (rowspan > 1 || colspan > 1) {
2189
+ const row = footerTableData[mergeRowIndex]
2190
+ const column = visibleColumn[mergeColumnIndex]
2191
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
2192
+ if (mergeItem) {
2193
+ mergeItem.rowspan = rowspan
2194
+ mergeItem.colspan = colspan
2195
+ mergeItem._rowspan = rowspan
2196
+ mergeItem._colspan = colspan
2197
+ } else {
2198
+ mergeItem = {
2199
+ row: mergeRowIndex,
2200
+ col: mergeColumnIndex,
2201
+ rowspan,
2202
+ colspan,
2203
+ _row: row,
2204
+ _col: column,
2205
+ _rowspan: rowspan,
2206
+ _colspan: colspan
2207
+ }
2208
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
2209
+ mergeFooterList.push(mergeItem)
2210
+ }
2211
+ }
2212
+ }
2213
+ })
2214
+ }
2215
+ }
2216
+
2112
2217
  function removeFooterMerges ($xeTable: VxeTableConstructor & VxeTablePrivateMethods, merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
2113
2218
  const internalData = $xeTable as unknown as TableInternalData
2114
2219
 
@@ -2225,8 +2330,22 @@ function calcTableHeight ($xeTable: VxeTableConstructor & VxeTablePrivateMethods
2225
2330
  const props = $xeTable
2226
2331
  const reactData = $xeTable as unknown as TableReactData
2227
2332
 
2333
+ const { editConfig } = props
2228
2334
  const { parentHeight } = reactData
2229
- const val = props[key]
2335
+ let val = props[key]
2336
+ if (key === 'minHeight') {
2337
+ const defMinHeight = getConfig().table.minHeight
2338
+ if (XEUtils.eqNull(val)) {
2339
+ if (eqEmptyValue(defMinHeight)) {
2340
+ // 编辑模式默认最小高度
2341
+ if (isEnableConf(editConfig)) {
2342
+ val = 144
2343
+ }
2344
+ } else {
2345
+ val = defMinHeight
2346
+ }
2347
+ }
2348
+ }
2230
2349
  let num = 0
2231
2350
  if (val) {
2232
2351
  if (val === '100%' || val === 'auto') {
@@ -2435,6 +2554,13 @@ function handleTargetEnterEvent ($xeTable: VxeTableConstructor, isClear: boolean
2435
2554
  }
2436
2555
  }
2437
2556
 
2557
+ function clearCrossTableDragStatus ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2558
+ const crossTableDragRowInfo = getCrossTableDragRowInfo($xeTable)
2559
+
2560
+ crossTableDragRowObj = null
2561
+ crossTableDragRowInfo.row = null
2562
+ }
2563
+
2438
2564
  function clearDragStatus ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2439
2565
  const reactData = $xeTable as unknown as TableReactData
2440
2566
 
@@ -2443,6 +2569,7 @@ function clearDragStatus ($xeTable: VxeTableConstructor & VxeTablePrivateMethods
2443
2569
  clearColDropOrigin($xeTable)
2444
2570
  clearRowDropOrigin($xeTable)
2445
2571
  hideDropTip($xeTable)
2572
+ clearCrossTableDragStatus($xeTable)
2446
2573
  reactData.dragRow = null
2447
2574
  reactData.dragCol = null
2448
2575
  }
@@ -2642,6 +2769,28 @@ function hideDropTip ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2642
2769
  }
2643
2770
  }
2644
2771
 
2772
+ function clearRowDragData ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2773
+ const $xeGantt = $xeTable.$xeGantt
2774
+ const reactData = $xeTable as unknown as TableReactData
2775
+ const internalData = $xeTable as unknown as TableInternalData
2776
+
2777
+ let wrapperEl = $xeTable.$refs.refElem as HTMLDivElement
2778
+ const dtClss = ['.vxe-body--row']
2779
+ if ($xeGantt) {
2780
+ const ganttContainerElem = $xeGantt.$refs.refGanttContainerElem as HTMLDivElement
2781
+ if (ganttContainerElem) {
2782
+ wrapperEl = ganttContainerElem
2783
+ }
2784
+ dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row')
2785
+ }
2786
+ hideDropTip($xeTable)
2787
+ clearRowDropOrigin($xeTable)
2788
+ clearRowAnimate(wrapperEl, dtClss)
2789
+ internalData.prevDragToChild = false
2790
+ reactData.dragRow = null
2791
+ reactData.dragCol = null
2792
+ }
2793
+
2645
2794
  /**
2646
2795
  * 处理显示 tooltip
2647
2796
  * @param {Event} evnt 事件
@@ -2715,12 +2864,22 @@ function handleDefaultMergeCells ($xeTable: VxeTableConstructor & VxeTablePrivat
2715
2864
  }
2716
2865
  }
2717
2866
 
2867
+ function handleDefaultMergeHeaderItems ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2868
+ const props = $xeTable
2869
+
2870
+ const { mergeHeaderCells } = props
2871
+ if (mergeHeaderCells) {
2872
+ $xeTable.setMergeHeaderCells(mergeHeaderCells)
2873
+ }
2874
+ }
2875
+
2718
2876
  function handleDefaultMergeFooterItems ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
2719
2877
  const props = $xeTable
2720
2878
 
2721
- const { mergeFooterItems } = props
2722
- if (mergeFooterItems) {
2723
- $xeTable.setMergeFooterItems(mergeFooterItems)
2879
+ const { mergeFooterCells, mergeFooterItems } = props
2880
+ const mFooterCells = mergeFooterCells || mergeFooterItems
2881
+ if (mFooterCells) {
2882
+ $xeTable.setMergeFooterCells(mFooterCells)
2724
2883
  }
2725
2884
  }
2726
2885
 
@@ -3196,6 +3355,10 @@ function loadTableData ($xeTable: VxeTableConstructor & VxeTablePrivateMethods,
3196
3355
 
3197
3356
  handleReserveStatus($xeTable)
3198
3357
  $xeTable.checkSelectionStatus()
3358
+ $xeTable.dispatchEvent('data-change', {
3359
+ visibleColumn: internalData.visibleColumn,
3360
+ visibleData: internalData.afterFullData
3361
+ }, null)
3199
3362
  return new Promise<void>(resolve => {
3200
3363
  $xeTable.$nextTick()
3201
3364
  .then(() => handleRecalculateStyle($xeTable, false, false, false))
@@ -3258,6 +3421,7 @@ function handleLoadDefaults ($xeTable: VxeTableConstructor & VxeTablePrivateMeth
3258
3421
  handleDefaultTreeExpand($xeTable)
3259
3422
  handleDefaultRowGroupExpand($xeTable)
3260
3423
  handleDefaultMergeCells($xeTable)
3424
+ handleDefaultMergeHeaderItems($xeTable)
3261
3425
  handleDefaultMergeFooterItems($xeTable)
3262
3426
  $xeTable.$nextTick(() => setTimeout(() => $xeTable.recalculate()))
3263
3427
  }
@@ -4977,7 +5141,9 @@ const Methods = {
4977
5141
  }
4978
5142
  }
4979
5143
  }
4980
- return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true)
5144
+ const rest = $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true)
5145
+ clearRowDragData($xeTable)
5146
+ return rest
4981
5147
  },
4982
5148
  /**
4983
5149
  * 获取表格的全量列
@@ -6399,7 +6565,7 @@ const Methods = {
6399
6565
  !getEventTargetNode(evnt, $el).flag
6400
6566
  ) {
6401
6567
  setTimeout(() => {
6402
- this.handleClearEdit(evnt).then(() => {
6568
+ $xeTable.handleClearEdit(evnt).then(() => {
6403
6569
  // 如果存在校验,点击了表格之外则清除
6404
6570
  if (!this.isActivated && editRules && validOpts.autoClear) {
6405
6571
  this.validErrorMaps = {}
@@ -6414,17 +6580,17 @@ const Methods = {
6414
6580
  }
6415
6581
  } else if (mouseConfig) {
6416
6582
  if (!getEventTargetNode(evnt, $el).flag && !($xeGGWrapper && getEventTargetNode(evnt, $xeGGWrapper.$el).flag) && !(tableMenu && getEventTargetNode(evnt, tableMenu.$el).flag) && !($toolbar && getEventTargetNode(evnt, $toolbar.$el).flag)) {
6417
- if (this.clearSelected) {
6418
- this.clearSelected()
6583
+ if ($xeTable.clearSelected) {
6584
+ $xeTable.clearSelected()
6419
6585
  }
6420
6586
  if (areaOpts.autoClear) {
6421
- if (this.getCellAreas) {
6422
- const cellAreas = this.getCellAreas()
6587
+ if ($xeTable.getCellAreas) {
6588
+ const cellAreas = $xeTable.getCellAreas()
6423
6589
  if (cellAreas && cellAreas.length && !getEventTargetNode(evnt, document.body, 'vxe-table--ignore-areas-clear').flag) {
6424
- this.preventEvent(evnt, 'event.clearAreas', {}, () => {
6425
- this.clearCellAreas()
6426
- this.clearCopyCellArea()
6427
- this.emitEvent('clear-cell-area-selection', { cellAreas }, evnt)
6590
+ $xeTable.preventEvent(evnt, 'event.clearAreas', {}, () => {
6591
+ $xeTable.clearCellAreas()
6592
+ $xeTable.clearCopyCellArea()
6593
+ $xeTable.dispatchEvent('clear-cell-area-selection', { cellAreas }, evnt)
6428
6594
  })
6429
6595
  }
6430
6596
  }
@@ -6461,13 +6627,15 @@ const Methods = {
6461
6627
  * 表格键盘事件
6462
6628
  */
6463
6629
  keydownEvent (evnt: any) {
6630
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
6631
+
6464
6632
  const { filterStore, ctxMenuStore, editStore, keyboardConfig, mouseConfig, mouseOpts, keyboardOpts } = this
6465
6633
  const { actived } = editStore
6466
6634
  const { keyCode } = evnt
6467
6635
  const isEsc = keyCode === 27
6468
6636
  if (isEsc) {
6469
6637
  this.preventEvent(evnt, 'event.keydown', null, () => {
6470
- this.emitEvent('keydown-start', {}, evnt)
6638
+ $xeTable.dispatchEvent('keydown-start', {}, evnt)
6471
6639
  if (keyboardConfig && mouseConfig && mouseOpts.area && this.handleKeyboardCellAreaEvent) {
6472
6640
  this.handleKeyboardCellAreaEvent(evnt)
6473
6641
  } else if (actived.row || filterStore.visible || ctxMenuStore.visible) {
@@ -6487,8 +6655,8 @@ const Methods = {
6487
6655
  }
6488
6656
  }
6489
6657
  }
6490
- this.emitEvent('keydown', {}, evnt)
6491
- this.emitEvent('keydown-end', {}, evnt)
6658
+ $xeTable.dispatchEvent('keydown', {}, evnt)
6659
+ $xeTable.dispatchEvent('keydown-end', {}, evnt)
6492
6660
  })
6493
6661
  }
6494
6662
  },
@@ -6796,6 +6964,8 @@ const Methods = {
6796
6964
  }
6797
6965
  },
6798
6966
  handleGlobalPasteEvent (evnt: any) {
6967
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
6968
+
6799
6969
  const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore, filterStore } = this
6800
6970
  const { actived } = editStore
6801
6971
  if (isActivated && !filterStore.visible) {
@@ -6804,10 +6974,12 @@ const Methods = {
6804
6974
  this.handlePasteCellAreaEvent(evnt)
6805
6975
  }
6806
6976
  }
6807
- this.emitEvent('paste', {}, evnt)
6977
+ $xeTable.dispatchEvent('paste', {}, evnt)
6808
6978
  }
6809
6979
  },
6810
6980
  handleGlobalCopyEvent (evnt: any) {
6981
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
6982
+
6811
6983
  const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore, filterStore } = this
6812
6984
  const { actived } = editStore
6813
6985
  if (isActivated && !filterStore.visible) {
@@ -6816,10 +6988,12 @@ const Methods = {
6816
6988
  this.handleCopyCellAreaEvent(evnt)
6817
6989
  }
6818
6990
  }
6819
- this.emitEvent('copy', {}, evnt)
6991
+ $xeTable.dispatchEvent('copy', {}, evnt)
6820
6992
  }
6821
6993
  },
6822
6994
  handleGlobalCutEvent (evnt: any) {
6995
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
6996
+
6823
6997
  const { isActivated, keyboardConfig, keyboardOpts, mouseConfig, mouseOpts, editStore, filterStore } = this
6824
6998
  const { actived } = editStore
6825
6999
  if (isActivated && !filterStore.visible) {
@@ -6828,7 +7002,7 @@ const Methods = {
6828
7002
  this.handleCutCellAreaEvent(evnt)
6829
7003
  }
6830
7004
  }
6831
- this.emitEvent('cut', {}, evnt)
7005
+ $xeTable.dispatchEvent('cut', {}, evnt)
6832
7006
  }
6833
7007
  },
6834
7008
  handleGlobalResizeEvent () {
@@ -6851,6 +7025,15 @@ const Methods = {
6851
7025
  internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList)
6852
7026
  reactData.mergeBodyFlag++
6853
7027
  },
7028
+ handleUpdateHeaderMerge () {
7029
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
7030
+ const reactData = $xeTable as unknown as TableReactData
7031
+ const internalData = $xeTable as unknown as TableInternalData
7032
+
7033
+ const { mergeHeaderList } = internalData
7034
+ internalData.mergeHeaderCellMaps = buildMergeData(mergeHeaderList)
7035
+ reactData.mergeHeadFlag++
7036
+ },
6854
7037
  handleUpdateFooterMerge () {
6855
7038
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
6856
7039
  const reactData = $xeTable as unknown as TableReactData
@@ -8028,7 +8211,9 @@ const Methods = {
8028
8211
  return $xeTable.$nextTick()
8029
8212
  },
8030
8213
  triggerHeaderCellDblclickEvent (evnt: any, params: any) {
8031
- this.emitEvent('header-cell-dblclick', Object.assign({ cell: evnt.currentTarget }, params), evnt)
8214
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8215
+
8216
+ $xeTable.dispatchEvent('header-cell-dblclick', Object.assign({ cell: evnt.currentTarget }, params), evnt)
8032
8217
  },
8033
8218
  getCurrentColumn () {
8034
8219
  return this.columnOpts.isCurrent || this.highlightCurrentColumn ? this.currentColumn : null
@@ -8213,7 +8398,7 @@ const Methods = {
8213
8398
  }
8214
8399
  }
8215
8400
  }
8216
- this.emitEvent('cell-dblclick', params, evnt)
8401
+ $xeTable.dispatchEvent('cell-dblclick', params, evnt)
8217
8402
  },
8218
8403
  handleColumnSortEvent (evnt: any, column: any) {
8219
8404
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -8659,12 +8844,240 @@ const Methods = {
8659
8844
  }
8660
8845
  return Promise.resolve(errRest)
8661
8846
  },
8662
- handleRowDragDragendEvent (evnt: DragEvent) {
8847
+ /**
8848
+ * 处理跨表拖拽完成
8849
+ */
8850
+ handleCrossTableRowDragFinishEvent (evnt: DragEvent) {
8851
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8852
+ const $xeGantt = $xeTable.$xeGantt
8853
+ const reactData = $xeTable as unknown as TableReactData
8854
+ const internalData = $xeTable as unknown as TableInternalData
8855
+ const crossTableDragRowInfo = getCrossTableDragRowInfo($xeTable)
8856
+
8857
+ const { tableData } = reactData
8858
+ const { fullAllDataRowIdData } = internalData
8859
+ const rowOpts = $xeTable.computeRowOpts
8860
+ const cellOpts = $xeTable.computeCellOpts
8861
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
8862
+ const rowDragOpts = $xeTable.computeRowDragOpts
8863
+ const { animation, isCrossTableDrag } = rowDragOpts
8864
+ const treeOpts = $xeTable.computeTreeOpts
8865
+ const { mapChildrenField } = treeOpts
8866
+ const el = $xeTable.$refs.refElem as HTMLDivElement
8867
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
8868
+ const { row: dragRow } = crossTableDragRowInfo
8869
+ if (dragRow) {
8870
+ const dragRowid = getRowid($xeTable, dragRow)
8871
+ const dragRowRest = fullAllDataRowIdData[dragRowid]
8872
+ let dragRowHeight = 0
8873
+ let rsIndex = -1
8874
+ if (dragRowRest) {
8875
+ if (animation) {
8876
+ dragRowHeight = getCellRestHeight(dragRowRest, cellOpts, rowOpts, defaultRowHeight)
8877
+ }
8878
+ rsIndex = dragRowRest.$index
8879
+ }
8880
+ const dragRangeList = rsIndex > -1 && rsIndex < tableData.length - 1 ? tableData.slice(rsIndex + 1) : []
8881
+ const dragList = XEUtils.toTreeArray([dragRow], {
8882
+ updated: true,
8883
+ children: mapChildrenField
8884
+ })
8885
+ $xeTable.remove(dragList).then(() => {
8886
+ if (animation && dragRowHeight && dragRangeList.length) {
8887
+ const $xeGanttView = internalData.xeGanttView
8888
+ let wrapperEl = el
8889
+ if ($xeGantt && $xeGanttView) {
8890
+ const ganttContainerElem = $xeGantt.$refs.refGanttContainerElem as HTMLDivElement
8891
+ if (ganttContainerElem) {
8892
+ wrapperEl = ganttContainerElem
8893
+ }
8894
+ }
8895
+
8896
+ const dtClss: string[] = []
8897
+ dragRangeList.forEach(row => {
8898
+ const rowid = getRowid($xeTable, row)
8899
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`)
8900
+ if ($xeGantt) {
8901
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`)
8902
+ }
8903
+ })
8904
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
8905
+ moveRowAnimateToTb(dtTrList, dragRowHeight)
8906
+ }
8907
+ })
8908
+ $xeTable.dispatchEvent('row-remove-dragend', {
8909
+ row: dragRow
8910
+ }, evnt)
8911
+ clearRowDragData($xeTable)
8912
+ clearCrossTableDragStatus($xeTable)
8913
+ }
8914
+ }
8915
+ },
8916
+ /**
8917
+ * 处理跨表拖至新的空表
8918
+ */
8919
+ handleCrossTableRowDragoverEmptyEvent (evnt: DragEvent) {
8920
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8921
+ const reactData = $xeTable as unknown as TableReactData
8922
+ const internalData = $xeTable as unknown as TableInternalData
8923
+
8924
+ const { tableData } = reactData
8925
+ const rowDragOpts = $xeTable.computeRowDragOpts
8926
+ const { isCrossTableDrag } = rowDragOpts
8927
+ if (isCrossTableDrag && crossTableDragRowObj && !tableData.length) {
8928
+ const { $oldTable } = crossTableDragRowObj
8929
+ if ($oldTable && $oldTable.xID !== $xeTable.xID) {
8930
+ evnt.preventDefault()
8931
+ crossTableDragRowObj.$newTable = $xeTable
8932
+ internalData.prevDragRow = null
8933
+ }
8934
+ }
8935
+ },
8936
+ /**
8937
+ * 处理跨表拖插入
8938
+ */
8939
+ handleCrossTableRowDragInsertEvent (evnt: DragEvent) {
8663
8940
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8664
8941
  const $xeGantt = $xeTable.$xeGantt
8665
8942
  const props = $xeTable
8666
8943
  const reactData = $xeTable as unknown as TableReactData
8667
8944
  const internalData = $xeTable as unknown as TableInternalData
8945
+ const crossTableDragRowInfo = getCrossTableDragRowInfo($xeTable)
8946
+
8947
+ const { treeConfig } = props
8948
+ const { prevDragRow, prevDragPos, prevDragToChild } = internalData
8949
+ const rowDragOpts = $xeTable.computeRowDragOpts
8950
+ const { animation, isSelfToChildDrag, isCrossTableDrag, dragEndMethod, dragToChildMethod } = rowDragOpts
8951
+ const rowOpts = $xeTable.computeRowOpts
8952
+ const cellOpts = $xeTable.computeCellOpts
8953
+ const defaultRowHeight = $xeTable.computeDefaultRowHeight
8954
+ const treeOpts = $xeTable.computeTreeOpts
8955
+ const { parentField, mapChildrenField } = treeOpts
8956
+ const childrenField = treeOpts.children || treeOpts.childrenField
8957
+ // 跨表拖拽
8958
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
8959
+ const { row: oldRow } = crossTableDragRowInfo
8960
+ const { $oldTable } = crossTableDragRowObj
8961
+ const el = $xeTable.$refs.refElem as HTMLDivElement
8962
+ if ($oldTable && oldRow) {
8963
+ const dragRow = oldRow
8964
+ let dragOffsetIndex = -1
8965
+ if (prevDragRow) {
8966
+ dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
8967
+ }
8968
+ const dragParams = {
8969
+ oldRow: dragRow,
8970
+ newRow: prevDragRow,
8971
+ dragRow,
8972
+ dragPos: prevDragPos as 'top' | 'bottom',
8973
+ dragToChild: !!prevDragToChild,
8974
+ offsetIndex: dragOffsetIndex as 0 | 1
8975
+ }
8976
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
8977
+ const errRest = {
8978
+ status: false
8979
+ }
8980
+ Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
8981
+ if (!status) {
8982
+ return errRest
8983
+ }
8984
+ let insertRest: Promise<any> = Promise.resolve()
8985
+ if (treeConfig) {
8986
+ const dragList = XEUtils.toTreeArray([dragRow], {
8987
+ updated: true,
8988
+ children: mapChildrenField
8989
+ })
8990
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt)
8991
+ if (prevDragRow) {
8992
+ dragRow[parentField] = prevDragRow[parentField]
8993
+ } else {
8994
+ dragRow[parentField] = null
8995
+ }
8996
+ dragList.forEach(row => {
8997
+ row[childrenField] = undefined
8998
+ row[mapChildrenField] = undefined
8999
+ })
9000
+ if (prevDragRow) {
9001
+ if (prevDragPos === 'bottom') {
9002
+ insertRest = $xeTable.insertNextAt(dragList, prevDragRow)
9003
+ } else {
9004
+ insertRest = $xeTable.insertAt(dragList, prevDragRow)
9005
+ }
9006
+ } else {
9007
+ insertRest = $xeTable.insert(dragList)
9008
+ }
9009
+ } else {
9010
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt)
9011
+ if (prevDragRow) {
9012
+ if (prevDragPos === 'bottom') {
9013
+ insertRest = $xeTable.insertNextAt(dragRow, prevDragRow)
9014
+ } else {
9015
+ insertRest = $xeTable.insertAt(dragRow, prevDragRow)
9016
+ }
9017
+ } else {
9018
+ insertRest = $xeTable.insert(dragRow)
9019
+ }
9020
+ }
9021
+ $xeTable.dispatchEvent('row-insert-dragend', {
9022
+ oldRow,
9023
+ newRow: prevDragRow,
9024
+ dragRow,
9025
+ dragPos: prevDragPos as any,
9026
+ dragToChild: isDragToChildFlag,
9027
+ offsetIndex: dragOffsetIndex
9028
+ }, evnt)
9029
+ clearRowDragData($xeTable)
9030
+
9031
+ insertRest.then(() => {
9032
+ const { tableData } = reactData
9033
+ const { fullAllDataRowIdData } = internalData
9034
+ const oldRowid = getRowid($xeTable, dragRow)
9035
+ const oldRowRest = fullAllDataRowIdData[oldRowid]
9036
+ let dragRowHeight = 0
9037
+ let rsIndex = -1
9038
+ if (oldRowRest) {
9039
+ if (animation) {
9040
+ dragRowHeight = getCellRestHeight(oldRowRest, cellOpts, rowOpts, defaultRowHeight)
9041
+ }
9042
+ rsIndex = oldRowRest.$index
9043
+ }
9044
+ const dragRangeList = rsIndex > -1 ? tableData.slice(rsIndex) : []
9045
+ if (animation && dragRowHeight && dragRangeList.length) {
9046
+ const $xeGanttView = internalData.xeGanttView
9047
+ let wrapperEl = el
9048
+ if ($xeGantt && $xeGanttView) {
9049
+ const ganttContainerElem = $xeGantt.$refs.refGanttContainerElem as HTMLDivElement
9050
+ if (ganttContainerElem) {
9051
+ wrapperEl = ganttContainerElem
9052
+ }
9053
+ }
9054
+
9055
+ const dtClss: string[] = []
9056
+ dragRangeList.forEach(row => {
9057
+ const rowid = getRowid($xeTable, row)
9058
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`)
9059
+ if ($xeGantt) {
9060
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`)
9061
+ }
9062
+ })
9063
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
9064
+ moveRowAnimateToTb(dtTrList, -dragRowHeight)
9065
+ }
9066
+ })
9067
+ })
9068
+ }
9069
+ }
9070
+ },
9071
+ hideCrossTableRowDropClearStatus () {
9072
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
9073
+
9074
+ hideDropTip($xeTable)
9075
+ },
9076
+ handleRowDragDragendEvent (evnt: DragEvent) {
9077
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
9078
+ const props = $xeTable
9079
+ const reactData = $xeTable as unknown as TableReactData
9080
+ const internalData = $xeTable as unknown as TableInternalData
8668
9081
 
8669
9082
  const { treeConfig } = props
8670
9083
  const { fullAllDataRowIdData, prevDragToChild } = internalData
@@ -8673,8 +9086,18 @@ const Methods = {
8673
9086
  const { lazy } = treeOpts
8674
9087
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
8675
9088
  const { prevDragRow, prevDragPos } = internalData
8676
- let wrapperEl = $xeTable.$refs.refElem as HTMLDivElement
8677
-
9089
+ const rowDragOpts = $xeTable.computeRowDragOpts
9090
+ const { isCrossTableDrag, isCrossDrag } = rowDragOpts
9091
+ // 跨表拖拽
9092
+ if (isCrossTableDrag && crossTableDragRowObj) {
9093
+ const { $newTable } = crossTableDragRowObj
9094
+ if ($newTable && $newTable.xID !== $xeTable.xID) {
9095
+ if (!treeConfig || isCrossDrag) {
9096
+ $newTable.handleCrossTableRowDragInsertEvent(evnt)
9097
+ }
9098
+ return
9099
+ }
9100
+ }
8678
9101
  if (treeConfig && lazy && prevDragToChild) {
8679
9102
  // 懒加载
8680
9103
  const newRowid = getRowid($xeTable, prevDragRow)
@@ -8689,20 +9112,8 @@ const Methods = {
8689
9112
  } else {
8690
9113
  $xeTable.handleRowDragSwapEvent(evnt, true, dragRow, prevDragRow, prevDragPos, prevDragToChild)
8691
9114
  }
8692
- const dtClss = ['.vxe-body--row']
8693
- if ($xeGantt) {
8694
- const ganttContainerElem = $xeGantt.$refs.refGanttContainerElem as HTMLDivElement
8695
- if (ganttContainerElem) {
8696
- wrapperEl = ganttContainerElem
8697
- }
8698
- dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row')
8699
- }
8700
- hideDropTip($xeTable)
8701
- clearRowDropOrigin($xeTable)
8702
- clearRowAnimate(wrapperEl, dtClss)
8703
- internalData.prevDragToChild = false
8704
- reactData.dragRow = null
8705
- reactData.dragCol = null
9115
+ clearRowDragData($xeTable)
9116
+ clearCrossTableDragStatus($xeTable)
8706
9117
  },
8707
9118
  handleRowDragDragoverEvent (evnt: DragEvent) {
8708
9119
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -8717,8 +9128,8 @@ const Methods = {
8717
9128
  const { lazy, transform, parentField } = treeOpts
8718
9129
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
8719
9130
  const rowDragOpts = $xeTable.computeRowDragOpts
8720
- const { isPeerDrag, isCrossDrag, isToChildDrag } = rowDragOpts
8721
- if (!dragRow) {
9131
+ const { isPeerDrag, isCrossDrag, isToChildDrag, isCrossTableDrag } = rowDragOpts
9132
+ if (!dragRow && !(isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj)) {
8722
9133
  evnt.preventDefault()
8723
9134
  return
8724
9135
  }
@@ -8727,19 +9138,40 @@ const Methods = {
8727
9138
  const rowid = trEl.getAttribute('rowid') || ''
8728
9139
  const rest = fullAllDataRowIdData[rowid]
8729
9140
  if (rest) {
9141
+ evnt.preventDefault()
8730
9142
  const row = rest.row
8731
9143
  const rowid = getRowid($xeTable, row)
8732
9144
  const rowRest = fullAllDataRowIdData[rowid]
8733
- evnt.preventDefault()
8734
- const { dragRow } = reactData
8735
9145
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y
8736
9146
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom'
8737
- internalData.prevDragToChild = !!(treeConfig && transform && isToChildDrag && isControlKey)
9147
+ internalData.prevDragToChild = !!(treeConfig && transform && (isCrossDrag && isToChildDrag) && isControlKey)
8738
9148
  internalData.prevDragRow = row
8739
9149
  internalData.prevDragPos = dragPos
9150
+ // 跨表拖拽
9151
+ if (isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj) {
9152
+ const { $oldTable, $newTable } = crossTableDragRowObj
9153
+ if ($oldTable) {
9154
+ const oldTableReactData = $oldTable as unknown as TableReactData
9155
+ if ($oldTable.xID === $xeTable.xID) {
9156
+ if ($newTable) {
9157
+ $newTable.hideCrossTableRowDropClearStatus()
9158
+ }
9159
+ reactData.isCrossDragRow = false
9160
+ oldTableReactData.isCrossDragRow = false
9161
+ crossTableDragRowObj.$newTable = null
9162
+ } else if (!treeConfig || isCrossDrag) {
9163
+ $oldTable.hideCrossTableRowDropClearStatus()
9164
+ oldTableReactData.isCrossDragRow = true
9165
+ reactData.dragTipText = oldTableReactData.dragTipText
9166
+ crossTableDragRowObj.$newTable = $xeTable
9167
+ showDropTip($xeTable, evnt, trEl, null, true, dragPos)
9168
+ return
9169
+ }
9170
+ }
9171
+ }
8740
9172
  if ($xeTable.eqRow(dragRow, row) ||
8741
- (isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded) ||
8742
- (!isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level))
9173
+ (isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded) ||
9174
+ (!isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level))
8743
9175
  ) {
8744
9176
  showDropTip($xeTable, evnt, trEl, null, false, dragPos)
8745
9177
  return
@@ -8752,15 +9184,19 @@ const Methods = {
8752
9184
  }, evnt)
8753
9185
  }
8754
9186
  },
8755
- handleCellDragMousedownEvent (evnt: MouseEvent, params: any) {
9187
+ handleCellDragMousedownEvent (evnt: DragEvent, params: {
9188
+ row: any;
9189
+ column: VxeTableDefines.ColumnInfo<any>;
9190
+ }) {
8756
9191
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
8757
9192
  const props = $xeTable
8758
9193
  const reactData = $xeTable as unknown as TableReactData
9194
+ const crossTableDragRowInfo = getCrossTableDragRowInfo($xeTable)
8759
9195
 
8760
9196
  evnt.stopPropagation()
8761
9197
  const { dragConfig } = props
8762
9198
  const rowDragOpts = $xeTable.computeRowDragOpts
8763
- const { trigger, dragStartMethod } = rowDragOpts
9199
+ const { isCrossTableDrag, trigger, dragStartMethod } = rowDragOpts
8764
9200
  const { row } = params
8765
9201
  const dragEl = evnt.currentTarget as HTMLElement
8766
9202
  const tdEl = trigger === 'cell' || trigger === 'row' ? dragEl : dragEl.parentElement?.parentElement as HTMLElement
@@ -8771,10 +9207,16 @@ const Methods = {
8771
9207
  trEl.draggable = false
8772
9208
  reactData.dragRow = null
8773
9209
  reactData.dragCol = null
9210
+ clearCrossTableDragStatus($xeTable)
8774
9211
  hideDropTip($xeTable)
8775
9212
  return
8776
9213
  }
9214
+ if (isCrossTableDrag) {
9215
+ crossTableDragRowInfo.row = row
9216
+ crossTableDragRowObj = { $oldTable: $xeTable, $newTable: null }
9217
+ }
8777
9218
  reactData.dragRow = row
9219
+ reactData.isCrossDragRow = false
8778
9220
  reactData.dragCol = null
8779
9221
  trEl.draggable = true
8780
9222
  updateRowDropOrigin($xeTable, row)
@@ -9113,6 +9555,7 @@ const Methods = {
9113
9555
  internalData.prevDragToChild = false
9114
9556
  reactData.dragRow = null
9115
9557
  reactData.dragCol = null
9558
+ clearCrossTableDragStatus($xeTable)
9116
9559
  },
9117
9560
  handleHeaderCellDragDragoverEvent (evnt: DragEvent) {
9118
9561
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
@@ -9199,11 +9642,13 @@ const Methods = {
9199
9642
  reactData.dragRow = null
9200
9643
  reactData.dragCol = null
9201
9644
  hideDropTip($xeTable)
9645
+ clearCrossTableDragStatus($xeTable)
9202
9646
  return
9203
9647
  }
9204
9648
  reactData.dragCol = column
9205
9649
  reactData.dragRow = null
9206
9650
  thEl.draggable = true
9651
+ clearCrossTableDragStatus($xeTable)
9207
9652
  updateColDropOrigin($xeTable, column)
9208
9653
  updateColDropTipContent($xeTable, thEl)
9209
9654
  $xeTable.dispatchEvent('column-dragstart', params, evnt)
@@ -9214,6 +9659,7 @@ const Methods = {
9214
9659
 
9215
9660
  clearColDropOrigin($xeTable)
9216
9661
  hideDropTip($xeTable)
9662
+ clearCrossTableDragStatus($xeTable)
9217
9663
  reactData.dragRow = null
9218
9664
  reactData.dragCol = null
9219
9665
  },
@@ -11204,6 +11650,10 @@ const Methods = {
11204
11650
  }
11205
11651
  reactData.footerTableData = footData
11206
11652
  $xeTable.handleUpdateFooterMerge()
11653
+ $xeTable.dispatchEvent('footer-data-change', {
11654
+ visibleColumn: internalData.visibleColumn,
11655
+ footData
11656
+ }, null)
11207
11657
  return $xeTable.$nextTick()
11208
11658
  },
11209
11659
  /**
@@ -11225,7 +11675,7 @@ const Methods = {
11225
11675
  /**
11226
11676
  * 设置合并单元格 [{ row: Row|number, column: ColumnInfo|number, rowspan: number, colspan: number }]
11227
11677
  */
11228
- setMergeCells (merges: any) {
11678
+ setMergeCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11229
11679
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11230
11680
  const props = $xeTable
11231
11681
  const reactData = $xeTable as unknown as TableReactData
@@ -11249,7 +11699,7 @@ const Methods = {
11249
11699
  /**
11250
11700
  * 移除单元格合并 [{row:Row|number, col:ColumnInfo|number}]
11251
11701
  */
11252
- removeMergeCells (merges: any) {
11702
+ removeMergeCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11253
11703
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11254
11704
  const props = $xeTable
11255
11705
 
@@ -11289,48 +11739,111 @@ const Methods = {
11289
11739
  return updateStyle($xeTable)
11290
11740
  })
11291
11741
  },
11292
- setMergeFooterItems (merges: any) {
11742
+ setMergeHeaderCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11743
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11744
+
11745
+ handleHeaderMerge($xeTable, merges)
11746
+ $xeTable.handleUpdateHeaderMerge()
11747
+ return $xeTable.$nextTick().then(() => {
11748
+ return updateStyle($xeTable)
11749
+ })
11750
+ },
11751
+ /**
11752
+ * 移除表头单元格合并 [{row:Row|number, col:ColumnInfo|number}]
11753
+ */
11754
+ removeMergeHeaderCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11755
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11756
+
11757
+ const rest = removeHeaderMerges($xeTable, merges)
11758
+ $xeTable.handleUpdateHeaderMerge()
11759
+ return $xeTable.$nextTick().then(() => {
11760
+ updateStyle($xeTable)
11761
+ return rest
11762
+ })
11763
+ },
11764
+ /**
11765
+ * 获取所有被合并的表头单元格
11766
+ */
11767
+ getMergeHeaderCells () {
11768
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11769
+ const internalData = $xeTable as unknown as TableInternalData
11770
+
11771
+ return internalData.mergeHeaderList.slice(0)
11772
+ },
11773
+ /**
11774
+ * 清除所有表头单元格合并
11775
+ */
11776
+ clearMergeHeaderCells () {
11777
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11778
+ const reactData = $xeTable as unknown as TableReactData
11779
+ const internalData = $xeTable as unknown as TableInternalData
11780
+
11781
+ internalData.mergeHeaderList = []
11782
+ internalData.mergeHeaderMaps = {}
11783
+ internalData.mergeHeaderCellMaps = {}
11784
+ reactData.mergeHeadFlag++
11785
+ return $xeTable.$nextTick().then(() => {
11786
+ return updateStyle($xeTable)
11787
+ })
11788
+ },
11789
+ setMergeFooterCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11293
11790
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11294
11791
  const props = $xeTable
11295
11792
 
11296
11793
  if (props.footerSpanMethod) {
11297
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
11794
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
11298
11795
  }
11299
11796
  handleFooterMerge($xeTable, merges)
11300
11797
  $xeTable.handleUpdateFooterMerge()
11301
11798
  return $xeTable.$nextTick().then(() => {
11302
- $xeTable.updateCellAreas()
11303
11799
  return updateStyle($xeTable)
11304
11800
  })
11305
11801
  },
11306
- removeMergeFooterItems (merges: any) {
11802
+ setMergeFooterItems (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11803
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11804
+
11805
+ // errLog('vxe.error.delFunc', ['setMergeFooterItems', 'setMergeFooterCells'])
11806
+ return $xeTable.setMergeFooterCells(merges)
11807
+ },
11808
+ removeMergeFooterCells (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11307
11809
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11308
11810
  const props = $xeTable
11309
11811
 
11310
11812
  if (props.footerSpanMethod) {
11311
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
11813
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
11312
11814
  }
11313
11815
  const rest = removeFooterMerges($xeTable, merges)
11314
11816
  $xeTable.handleUpdateFooterMerge()
11315
11817
  return $xeTable.$nextTick().then(() => {
11316
- $xeTable.updateCellAreas()
11317
11818
  updateStyle($xeTable)
11318
11819
  return rest
11319
11820
  })
11320
11821
  },
11822
+ removeMergeFooterItems (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) {
11823
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11824
+
11825
+ // errLog('vxe.error.delFunc', ['removeMergeFooterItems', 'removeMergeFooterCells'])
11826
+ return $xeTable.removeMergeFooterCells(merges)
11827
+ },
11321
11828
  /**
11322
11829
  * 获取所有被合并的表尾
11323
11830
  */
11324
- getMergeFooterItems () {
11831
+ getMergeFooterCells () {
11325
11832
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11326
11833
  const internalData = $xeTable as unknown as TableInternalData
11327
11834
 
11328
11835
  return internalData.mergeFooterList.slice(0)
11329
11836
  },
11837
+ getMergeFooterItems () {
11838
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11839
+
11840
+ // errLog('vxe.error.delFunc', ['getMergeFooterItems', 'getMergeFooterCells'])
11841
+ return $xeTable.getMergeFooterCells()
11842
+ },
11330
11843
  /**
11331
11844
  * 清除所有表尾合并
11332
11845
  */
11333
- clearMergeFooterItems () {
11846
+ clearMergeFooterCells () {
11334
11847
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11335
11848
  const reactData = $xeTable as unknown as TableReactData
11336
11849
  const internalData = $xeTable as unknown as TableInternalData
@@ -11343,6 +11856,12 @@ const Methods = {
11343
11856
  return updateStyle($xeTable)
11344
11857
  })
11345
11858
  },
11859
+ clearMergeFooterItems () {
11860
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11861
+
11862
+ // errLog('vxe.error.delFunc', ['clearMergeFooterItems', 'clearMergeFooterCells'])
11863
+ return $xeTable.clearMergeFooterCells()
11864
+ },
11346
11865
  handleUpdateAggData () {
11347
11866
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11348
11867
  const internalData = $xeTable as unknown as TableInternalData
@@ -11377,10 +11896,8 @@ const Methods = {
11377
11896
  // 已废弃,使用 dispatchEvent
11378
11897
  emitEvent (type: any, params: any, evnt: any) {
11379
11898
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
11380
- const $xeGrid = $xeTable.$xeGrid
11381
- const $xeGantt = $xeTable.$xeGantt
11382
11899
 
11383
- $xeTable.$emit(type, createEvent(evnt, { $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, $event: evnt }))
11900
+ $xeTable.dispatchEvent(type, params, evnt)
11384
11901
  },
11385
11902
  focus () {
11386
11903
  this.isActivated = true