vxe-table 4.16.0 → 4.16.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 (73) hide show
  1. package/es/grid/src/grid.js +1 -1
  2. package/es/index.css +1 -1
  3. package/es/index.min.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/module/edit/hook.js +55 -17
  7. package/es/table/src/column.js +2 -0
  8. package/es/table/src/columnInfo.js +1 -0
  9. package/es/table/src/emits.js +5 -0
  10. package/es/table/src/header.js +47 -16
  11. package/es/table/src/props.js +11 -3
  12. package/es/table/src/store.js +8 -0
  13. package/es/table/src/table.js +579 -87
  14. package/es/table/src/util.js +70 -2
  15. package/es/table/style.css +11 -17
  16. package/es/table/style.min.css +1 -1
  17. package/es/ui/index.js +2 -2
  18. package/es/ui/src/log.js +1 -1
  19. package/es/vxe-table/style.css +11 -17
  20. package/es/vxe-table/style.min.css +1 -1
  21. package/lib/grid/src/grid.js +1 -1
  22. package/lib/grid/src/grid.min.js +1 -1
  23. package/lib/index.css +1 -1
  24. package/lib/index.min.css +1 -1
  25. package/lib/index.umd.js +265 -65
  26. package/lib/index.umd.min.js +1 -1
  27. package/lib/style.css +1 -1
  28. package/lib/style.min.css +1 -1
  29. package/lib/table/module/edit/hook.js +54 -15
  30. package/lib/table/module/edit/hook.min.js +1 -1
  31. package/lib/table/src/column.js +2 -0
  32. package/lib/table/src/column.min.js +1 -1
  33. package/lib/table/src/columnInfo.js +1 -0
  34. package/lib/table/src/columnInfo.min.js +1 -1
  35. package/lib/table/src/emits.js +1 -1
  36. package/lib/table/src/emits.min.js +1 -1
  37. package/lib/table/src/header.js +62 -13
  38. package/lib/table/src/header.min.js +1 -1
  39. package/lib/table/src/props.js +11 -3
  40. package/lib/table/src/props.min.js +1 -1
  41. package/lib/table/src/store.js +15 -0
  42. package/lib/table/src/store.min.js +1 -0
  43. package/lib/table/src/table.js +45 -25
  44. package/lib/table/src/table.min.js +1 -1
  45. package/lib/table/src/util.js +74 -2
  46. package/lib/table/src/util.min.js +1 -1
  47. package/lib/table/style/style.css +11 -17
  48. package/lib/table/style/style.min.css +1 -1
  49. package/lib/ui/index.js +2 -2
  50. package/lib/ui/index.min.js +1 -1
  51. package/lib/ui/src/log.js +1 -1
  52. package/lib/ui/src/log.min.js +1 -1
  53. package/lib/vxe-table/style/style.css +11 -17
  54. package/lib/vxe-table/style/style.min.css +1 -1
  55. package/package.json +2 -2
  56. package/packages/grid/src/grid.ts +1 -1
  57. package/packages/table/module/edit/hook.ts +55 -19
  58. package/packages/table/src/column.ts +2 -0
  59. package/packages/table/src/columnInfo.ts +1 -0
  60. package/packages/table/src/emits.ts +6 -0
  61. package/packages/table/src/header.ts +49 -17
  62. package/packages/table/src/props.ts +11 -3
  63. package/packages/table/src/store.ts +14 -0
  64. package/packages/table/src/table.ts +583 -83
  65. package/packages/table/src/util.ts +76 -2
  66. package/packages/ui/index.ts +1 -1
  67. package/styles/components/table.scss +33 -55
  68. /package/es/{iconfont.1756083655214.ttf → iconfont.1756452373591.ttf} +0 -0
  69. /package/es/{iconfont.1756083655214.woff → iconfont.1756452373591.woff} +0 -0
  70. /package/es/{iconfont.1756083655214.woff2 → iconfont.1756452373591.woff2} +0 -0
  71. /package/lib/{iconfont.1756083655214.ttf → iconfont.1756452373591.ttf} +0 -0
  72. /package/lib/{iconfont.1756083655214.woff → iconfont.1756452373591.woff} +0 -0
  73. /package/lib/{iconfont.1756083655214.woff2 → iconfont.1756452373591.woff2} +0 -0
@@ -8,6 +8,7 @@ import { createInternalData, getRowUniqueId, clearTableAllStatus, getColumnList,
8
8
  import { getSlotVNs } from '../../ui/src/vn'
9
9
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from './anime'
10
10
  import { warnLog, errLog } from '../../ui/src/log'
11
+ import { getCrossTableDragRowInfo } from './store'
11
12
  import Cell from './cell'
12
13
  import TableBodyComponent from './body'
13
14
  import TableHeaderComponent from './header'
@@ -40,6 +41,11 @@ const customStorageKey = 'VXE_CUSTOM_STORE'
40
41
  const maxYHeight = 5e6
41
42
  const maxXWidth = 5e6
42
43
 
44
+ let crossTableDragRowObj: {
45
+ $oldTable: VxeTableConstructor & VxeTablePrivateMethods
46
+ $newTable: (VxeTableConstructor & VxeTablePrivateMethods) | null
47
+ } | null = null
48
+
43
49
  export default defineVxeComponent({
44
50
  name: 'VxeTable',
45
51
  props: tableProps,
@@ -62,6 +68,8 @@ export default defineVxeComponent({
62
68
 
63
69
  const { computeSize } = useFns.useSize(props)
64
70
 
71
+ const crossTableDragRowInfo = getCrossTableDragRowInfo()
72
+
65
73
  const reactData = reactive<TableReactData>({
66
74
  // 低性能的静态列
67
75
  staticColumns: [],
@@ -274,6 +282,8 @@ export default defineVxeComponent({
274
282
  pendingRowFlag: 1,
275
283
  insertRowFlag: 1,
276
284
  removeRowFlag: 1,
285
+
286
+ mergeHeadFlag: 1,
277
287
  mergeBodyFlag: 1,
278
288
  mergeFootFlag: 1,
279
289
 
@@ -302,9 +312,9 @@ export default defineVxeComponent({
302
312
 
303
313
  isCustomStatus: false,
304
314
 
305
- isDragRowMove: false,
315
+ isCrossDragRow: false,
306
316
  dragRow: null,
307
- isDragColMove: false,
317
+ isCrossDragCol: false,
308
318
  dragCol: null,
309
319
  dragTipText: '',
310
320
 
@@ -1241,16 +1251,62 @@ export default defineVxeComponent({
1241
1251
  }
1242
1252
  }
1243
1253
 
1244
- const handleUpdateMergeFooterCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1245
- internalData.mergeFooterList = []
1246
- internalData.mergeFooterMaps = {}
1247
- internalData.mergeFooterCellMaps = {}
1248
- $xeTable.setMergeFooterItems(merges)
1254
+ const removeBodyMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1255
+ const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
1256
+ const rest: VxeTableDefines.MergeItem[] = []
1257
+ if (merges) {
1258
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
1259
+ if (!XEUtils.isArray(merges)) {
1260
+ merges = [merges]
1261
+ }
1262
+ merges.forEach((item) => {
1263
+ const { row: margeRow, col: margeCol } = item
1264
+ let mergeRowIndex = -1
1265
+ let mergeColumnIndex = -1
1266
+ if (XEUtils.isNumber(margeRow)) {
1267
+ mergeRowIndex = margeRow
1268
+ } else {
1269
+ const rowid = margeRow ? handleGetRowId(margeRow) : null
1270
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
1271
+ if (rowRest) {
1272
+ mergeRowIndex = rowRest._index
1273
+ }
1274
+ }
1275
+ if (XEUtils.isNumber(margeCol)) {
1276
+ mergeColumnIndex = margeCol
1277
+ } else {
1278
+ const colid = margeCol ? margeCol.id : null
1279
+ const colRest = colid ? fullColumnIdData[colid] : null
1280
+ if (colRest) {
1281
+ mergeColumnIndex = colRest._index
1282
+ }
1283
+ }
1284
+ const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1285
+ if (mcIndex > -1) {
1286
+ const rItems = mergeBodyList.splice(mcIndex, 1)
1287
+ const item = rItems[0]
1288
+ if (item) {
1289
+ rest.push(rItems[0])
1290
+ if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1291
+ delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1292
+ }
1293
+ }
1294
+ }
1295
+ })
1296
+ }
1297
+ return rest
1249
1298
  }
1250
1299
 
1251
- const handleFooterMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1300
+ const handleUpdateMergeHeaderCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1301
+ internalData.mergeHeaderList = []
1302
+ internalData.mergeHeaderMaps = {}
1303
+ internalData.mergeHeaderCellMaps = {}
1304
+ $xeTable.setMergeHeaderCells(merges)
1305
+ }
1306
+
1307
+ const handleHeaderMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1252
1308
  const { footerTableData } = reactData
1253
- const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
1309
+ const { mergeHeaderList, mergeHeaderMaps, fullColumnIdData } = internalData
1254
1310
  if (merges) {
1255
1311
  const { visibleColumn } = internalData
1256
1312
  if (!XEUtils.isArray(merges)) {
@@ -1275,7 +1331,7 @@ export default defineVxeComponent({
1275
1331
  if (rowspan > 1 || colspan > 1) {
1276
1332
  const row = footerTableData[mergeRowIndex]
1277
1333
  const column = visibleColumn[mergeColumnIndex]
1278
- let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1334
+ let mergeItem = mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1279
1335
  if (mergeItem) {
1280
1336
  mergeItem.rowspan = rowspan
1281
1337
  mergeItem.colspan = colspan
@@ -1292,8 +1348,8 @@ export default defineVxeComponent({
1292
1348
  _rowspan: rowspan,
1293
1349
  _colspan: colspan
1294
1350
  }
1295
- mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1296
- mergeFooterList.push(mergeItem)
1351
+ mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1352
+ mergeHeaderList.push(mergeItem)
1297
1353
  }
1298
1354
  }
1299
1355
  }
@@ -1301,27 +1357,17 @@ export default defineVxeComponent({
1301
1357
  }
1302
1358
  }
1303
1359
 
1304
- const removeBodyMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1305
- const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
1360
+ const removeHeaderMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1361
+ const { mergeHeaderList, fullColumnIdData, mergeHeaderMaps } = internalData
1306
1362
  const rest: VxeTableDefines.MergeItem[] = []
1307
1363
  if (merges) {
1308
- const { handleGetRowId } = createHandleGetRowId($xeTable)
1309
1364
  if (!XEUtils.isArray(merges)) {
1310
1365
  merges = [merges]
1311
1366
  }
1312
1367
  merges.forEach((item) => {
1313
1368
  const { row: margeRow, col: margeCol } = item
1314
- let mergeRowIndex = -1
1369
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
1315
1370
  let mergeColumnIndex = -1
1316
- if (XEUtils.isNumber(margeRow)) {
1317
- mergeRowIndex = margeRow
1318
- } else {
1319
- const rowid = margeRow ? handleGetRowId(margeRow) : null
1320
- const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
1321
- if (rowRest) {
1322
- mergeRowIndex = rowRest._index
1323
- }
1324
- }
1325
1371
  if (XEUtils.isNumber(margeCol)) {
1326
1372
  mergeColumnIndex = margeCol
1327
1373
  } else {
@@ -1331,14 +1377,14 @@ export default defineVxeComponent({
1331
1377
  mergeColumnIndex = colRest._index
1332
1378
  }
1333
1379
  }
1334
- const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1380
+ const mcIndex = XEUtils.findIndexOf(mergeHeaderList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1335
1381
  if (mcIndex > -1) {
1336
- const rItems = mergeBodyList.splice(mcIndex, 1)
1382
+ const rItems = mergeHeaderList.splice(mcIndex, 1)
1337
1383
  const item = rItems[0]
1338
1384
  if (item) {
1339
- rest.push(rItems[0])
1340
- if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1341
- delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1385
+ rest.push(item)
1386
+ if (mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1387
+ delete mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1342
1388
  }
1343
1389
  }
1344
1390
  }
@@ -1347,6 +1393,66 @@ export default defineVxeComponent({
1347
1393
  return rest
1348
1394
  }
1349
1395
 
1396
+ const handleUpdateMergeFooterCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1397
+ internalData.mergeFooterList = []
1398
+ internalData.mergeFooterMaps = {}
1399
+ internalData.mergeFooterCellMaps = {}
1400
+ $xeTable.setMergeFooterCells(merges)
1401
+ }
1402
+
1403
+ const handleFooterMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1404
+ const { footerTableData } = reactData
1405
+ const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
1406
+ if (merges) {
1407
+ const { visibleColumn } = internalData
1408
+ if (!XEUtils.isArray(merges)) {
1409
+ merges = [merges]
1410
+ }
1411
+ merges.forEach((item) => {
1412
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item
1413
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
1414
+ let mergeColumnIndex = -1
1415
+ if (XEUtils.isNumber(margeCol)) {
1416
+ mergeColumnIndex = margeCol
1417
+ } else {
1418
+ const colid = margeCol ? margeCol.id : null
1419
+ const colRest = colid ? fullColumnIdData[colid] : null
1420
+ if (colRest) {
1421
+ mergeColumnIndex = colRest._index
1422
+ }
1423
+ }
1424
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1425
+ rowspan = XEUtils.toNumber(rowspan) || 1
1426
+ colspan = XEUtils.toNumber(colspan) || 1
1427
+ if (rowspan > 1 || colspan > 1) {
1428
+ const row = footerTableData[mergeRowIndex]
1429
+ const column = visibleColumn[mergeColumnIndex]
1430
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1431
+ if (mergeItem) {
1432
+ mergeItem.rowspan = rowspan
1433
+ mergeItem.colspan = colspan
1434
+ mergeItem._rowspan = rowspan
1435
+ mergeItem._colspan = colspan
1436
+ } else {
1437
+ mergeItem = {
1438
+ row: mergeRowIndex,
1439
+ col: mergeColumnIndex,
1440
+ rowspan,
1441
+ colspan,
1442
+ _row: row,
1443
+ _col: column,
1444
+ _rowspan: rowspan,
1445
+ _colspan: colspan
1446
+ }
1447
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1448
+ mergeFooterList.push(mergeItem)
1449
+ }
1450
+ }
1451
+ }
1452
+ })
1453
+ }
1454
+ }
1455
+
1350
1456
  const removeFooterMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1351
1457
  const { mergeFooterList, fullColumnIdData, mergeFooterMaps } = internalData
1352
1458
  const rest: VxeTableDefines.MergeItem[] = []
@@ -1454,8 +1560,22 @@ export default defineVxeComponent({
1454
1560
  }
1455
1561
 
1456
1562
  const calcTableHeight = (key: 'height' | 'minHeight' | 'maxHeight') => {
1563
+ const { editConfig } = props
1457
1564
  const { parentHeight } = reactData
1458
- const val = props[key]
1565
+ let val = props[key]
1566
+ if (key === 'minHeight') {
1567
+ const defMinHeight = getConfig().table.minHeight
1568
+ if (XEUtils.eqNull(val)) {
1569
+ if (eqEmptyValue(defMinHeight)) {
1570
+ // 编辑模式默认最小高度
1571
+ if (isEnableConf(editConfig)) {
1572
+ val = 144
1573
+ }
1574
+ } else {
1575
+ val = defMinHeight
1576
+ }
1577
+ }
1578
+ }
1459
1579
  let num = 0
1460
1580
  if (val) {
1461
1581
  if (val === '100%' || val === 'auto') {
@@ -2318,22 +2438,27 @@ export default defineVxeComponent({
2318
2438
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : ''
2319
2439
  }
2320
2440
 
2441
+ const scrollbarXConf = scrollbarOpts.x || {}
2321
2442
  const scrollbarXToTop = computeScrollbarXToTop.value
2443
+ const scrollbarYConf = scrollbarOpts.y || {}
2322
2444
  const scrollbarYToLeft = computeScrollbarYToLeft.value
2323
2445
 
2324
2446
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden'
2325
- if ($xeGanttView) {
2447
+ if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
2326
2448
  osbHeight = scrollbarHeight
2327
2449
  xScrollbarVisible = 'visible'
2328
- } else if (scrollbarOpts.x && scrollbarOpts.x.visible === false) {
2450
+ } else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
2329
2451
  osbHeight = 0
2330
2452
  xScrollbarVisible = 'hidden'
2331
2453
  }
2332
2454
 
2333
2455
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
2334
- if ((scrollbarOpts.y && scrollbarOpts.y.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
2456
+ if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
2335
2457
  osbWidth = 0
2336
2458
  yScrollbarVisible = 'hidden'
2459
+ } else if (scrollbarYConf.visible === 'visible') {
2460
+ osbWidth = scrollbarWidth
2461
+ yScrollbarVisible = 'visible'
2337
2462
  }
2338
2463
 
2339
2464
  let tbHeight = 0
@@ -2375,7 +2500,7 @@ export default defineVxeComponent({
2375
2500
  }
2376
2501
  if (xRightCornerEl) {
2377
2502
  xRightCornerEl.style.width = scrollbarXToTop ? '' : `${osbWidth}px`
2378
- xRightCornerEl.style.display = scrollbarXToTop ? '' : (overflowX && osbHeight ? 'block' : '')
2503
+ xRightCornerEl.style.display = scrollbarXToTop ? '' : (xScrollbarVisible === 'visible' ? 'block' : '')
2379
2504
  }
2380
2505
 
2381
2506
  const scrollYVirtualEl = refScrollYVirtualElem.value
@@ -2387,7 +2512,7 @@ export default defineVxeComponent({
2387
2512
  const yTopCornerEl = refScrollYTopCornerElem.value
2388
2513
  if (yTopCornerEl) {
2389
2514
  yTopCornerEl.style.height = `${tHeaderHeight}px`
2390
- yTopCornerEl.style.display = overflowY && tHeaderHeight ? 'block' : ''
2515
+ yTopCornerEl.style.display = tHeaderHeight && yScrollbarVisible === 'visible' ? 'block' : ''
2391
2516
  }
2392
2517
  const yWrapperEl = refScrollYWrapperElem.value
2393
2518
  if (yWrapperEl) {
@@ -2398,7 +2523,7 @@ export default defineVxeComponent({
2398
2523
  if (yBottomCornerEl) {
2399
2524
  yBottomCornerEl.style.height = `${tFooterHeight}px`
2400
2525
  yBottomCornerEl.style.top = `${tHeaderHeight + tbHeight}px`
2401
- yBottomCornerEl.style.display = overflowY && tFooterHeight ? 'block' : ''
2526
+ yBottomCornerEl.style.display = tFooterHeight && yScrollbarVisible === 'visible' ? 'block' : ''
2402
2527
  }
2403
2528
 
2404
2529
  const rowExpandEl = refRowExpandElem.value
@@ -3106,10 +3231,18 @@ export default defineVxeComponent({
3106
3231
  }
3107
3232
  }
3108
3233
 
3234
+ const handleDefaultMergeHeaderItems = () => {
3235
+ const { mergeHeaderCells } = props
3236
+ if (mergeHeaderCells) {
3237
+ $xeTable.setMergeHeaderCells(mergeHeaderCells)
3238
+ }
3239
+ }
3240
+
3109
3241
  const handleDefaultMergeFooterItems = () => {
3110
- const { mergeFooterItems } = props
3111
- if (mergeFooterItems) {
3112
- $xeTable.setMergeFooterItems(mergeFooterItems)
3242
+ const { mergeFooterCells, mergeFooterItems } = props
3243
+ const mFooterCells = mergeFooterCells || mergeFooterItems
3244
+ if (mFooterCells) {
3245
+ $xeTable.setMergeFooterCells(mFooterCells)
3113
3246
  }
3114
3247
  }
3115
3248
 
@@ -3561,6 +3694,10 @@ export default defineVxeComponent({
3561
3694
 
3562
3695
  handleReserveStatus()
3563
3696
  $xeTable.checkSelectionStatus()
3697
+ $xeTable.dispatchEvent('data-change', {
3698
+ visibleColumn: internalData.visibleColumn,
3699
+ visibleData: internalData.afterFullData
3700
+ }, null)
3564
3701
  return new Promise<void>(resolve => {
3565
3702
  nextTick()
3566
3703
  .then(() => handleRecalculateStyle(false, false, false))
@@ -3623,6 +3760,7 @@ export default defineVxeComponent({
3623
3760
  handleDefaultTreeExpand()
3624
3761
  handleDefaultRowGroupExpand()
3625
3762
  handleDefaultMergeCells()
3763
+ handleDefaultMergeHeaderItems()
3626
3764
  handleDefaultMergeFooterItems()
3627
3765
  nextTick(() => setTimeout(() => $xeTable.recalculate()))
3628
3766
  }
@@ -5079,7 +5217,9 @@ export default defineVxeComponent({
5079
5217
  }
5080
5218
  }
5081
5219
  }
5082
- return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true)
5220
+ const rest = $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true)
5221
+ clearRowDragData()
5222
+ return rest
5083
5223
  },
5084
5224
  /**
5085
5225
  * 获取表格的全量列
@@ -6945,6 +7085,10 @@ export default defineVxeComponent({
6945
7085
  }
6946
7086
  reactData.footerTableData = footData
6947
7087
  $xeTable.handleUpdateFooterMerge()
7088
+ $xeTable.dispatchEvent('footer-data-change', {
7089
+ visibleColumn: internalData.visibleColumn,
7090
+ footData
7091
+ }, null)
6948
7092
  return nextTick()
6949
7093
  },
6950
7094
  /**
@@ -7012,39 +7156,85 @@ export default defineVxeComponent({
7012
7156
  return updateStyle()
7013
7157
  })
7014
7158
  },
7015
- setMergeFooterItems (merges) {
7159
+ setMergeHeaderCells (merges) {
7160
+ handleHeaderMerge(merges)
7161
+ $xeTable.handleUpdateHeaderMerge()
7162
+ return nextTick().then(() => {
7163
+ return updateStyle()
7164
+ })
7165
+ },
7166
+ /**
7167
+ * 移除表头单元格合并 [{row:Row|number, col:ColumnInfo|number}]
7168
+ */
7169
+ removeMergeHeaderCells (merges) {
7170
+ const rest = removeHeaderMerges(merges)
7171
+ $xeTable.handleUpdateHeaderMerge()
7172
+ return nextTick().then(() => {
7173
+ updateStyle()
7174
+ return rest
7175
+ })
7176
+ },
7177
+ /**
7178
+ * 获取所有被合并的表头单元格
7179
+ */
7180
+ getMergeHeaderCells () {
7181
+ return internalData.mergeHeaderList.slice(0)
7182
+ },
7183
+ /**
7184
+ * 清除所有表头单元格合并
7185
+ */
7186
+ clearMergeHeaderCells () {
7187
+ internalData.mergeHeaderList = []
7188
+ internalData.mergeHeaderMaps = {}
7189
+ internalData.mergeHeaderCellMaps = {}
7190
+ reactData.mergeHeadFlag++
7191
+ return nextTick().then(() => {
7192
+ return updateStyle()
7193
+ })
7194
+ },
7195
+ setMergeFooterCells (merges) {
7016
7196
  if (props.footerSpanMethod) {
7017
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
7197
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
7018
7198
  }
7019
7199
  handleFooterMerge(merges)
7020
7200
  $xeTable.handleUpdateFooterMerge()
7021
7201
  return nextTick().then(() => {
7022
- $xeTable.updateCellAreas()
7023
7202
  return updateStyle()
7024
7203
  })
7025
7204
  },
7026
- removeMergeFooterItems (merges) {
7205
+ setMergeFooterItems (merges) {
7206
+ // errLog('vxe.error.delFunc', ['setMergeFooterItems', 'setMergeFooterCells'])
7207
+ return $xeTable.setMergeFooterCells(merges)
7208
+ },
7209
+ removeMergeFooterCells (merges) {
7027
7210
  if (props.footerSpanMethod) {
7028
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
7211
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
7029
7212
  }
7030
7213
  const rest = removeFooterMerges(merges)
7031
7214
  $xeTable.handleUpdateFooterMerge()
7032
7215
  return nextTick().then(() => {
7033
- $xeTable.updateCellAreas()
7034
7216
  updateStyle()
7035
7217
  return rest
7036
7218
  })
7037
7219
  },
7220
+ removeMergeFooterItems (merges) {
7221
+ // errLog('vxe.error.delFunc', ['removeMergeFooterItems', 'removeMergeFooterCells'])
7222
+ return $xeTable.removeMergeFooterCells(merges)
7223
+ },
7038
7224
  /**
7039
7225
  * 获取所有被合并的表尾
7040
7226
  */
7041
- getMergeFooterItems () {
7227
+ getMergeFooterCells () {
7042
7228
  return internalData.mergeFooterList.slice(0)
7043
7229
  },
7230
+ getMergeFooterItems () {
7231
+ // errLog('vxe.error.delFunc', ['getMergeFooterItems', 'getMergeFooterCells'])
7232
+ return $xeTable.getMergeFooterCells()
7233
+ },
7044
7234
  /**
7045
7235
  * 清除所有表尾合并
7046
7236
  */
7047
- clearMergeFooterItems () {
7237
+ clearMergeFooterCells () {
7048
7238
  internalData.mergeFooterList = []
7049
7239
  internalData.mergeFooterMaps = {}
7050
7240
  internalData.mergeFooterCellMaps = {}
@@ -7053,6 +7243,10 @@ export default defineVxeComponent({
7053
7243
  return updateStyle()
7054
7244
  })
7055
7245
  },
7246
+ clearMergeFooterItems () {
7247
+ // errLog('vxe.error.delFunc', ['clearMergeFooterItems', 'clearMergeFooterCells'])
7248
+ return $xeTable.clearMergeFooterCells()
7249
+ },
7056
7250
  updateCellAreas () {
7057
7251
  const { mouseConfig } = props
7058
7252
  const mouseOpts = computeMouseOpts.value
@@ -7776,12 +7970,18 @@ export default defineVxeComponent({
7776
7970
  }
7777
7971
  }
7778
7972
 
7973
+ const clearCrossTableDragStatus = () => {
7974
+ crossTableDragRowObj = null
7975
+ crossTableDragRowInfo.row = null
7976
+ }
7977
+
7779
7978
  const clearDragStatus = () => {
7780
7979
  const { dragRow, dragCol } = reactData
7781
7980
  if (dragRow || dragCol) {
7782
7981
  clearColDropOrigin()
7783
7982
  clearRowDropOrigin()
7784
7983
  hideDropTip()
7984
+ clearCrossTableDragStatus()
7785
7985
  reactData.dragRow = null
7786
7986
  reactData.dragCol = null
7787
7987
  }
@@ -7973,6 +8173,25 @@ export default defineVxeComponent({
7973
8173
  }
7974
8174
  }
7975
8175
 
8176
+ const clearRowDragData = () => {
8177
+ let wrapperEl = refElem.value
8178
+ const dtClss = ['.vxe-body--row']
8179
+ if ($xeGantt) {
8180
+ const { refGanttContainerElem } = $xeGantt.getRefMaps()
8181
+ const ganttContainerElem = refGanttContainerElem.value
8182
+ if (ganttContainerElem) {
8183
+ wrapperEl = ganttContainerElem
8184
+ }
8185
+ dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row')
8186
+ }
8187
+ hideDropTip()
8188
+ clearRowDropOrigin()
8189
+ clearRowAnimate(wrapperEl, dtClss)
8190
+ internalData.prevDragToChild = false
8191
+ reactData.dragRow = null
8192
+ reactData.dragCol = null
8193
+ }
8194
+
7976
8195
  /**
7977
8196
  * 处理显示 tooltip
7978
8197
  * @param {Event} evnt 事件
@@ -9069,6 +9288,11 @@ export default defineVxeComponent({
9069
9288
  internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList)
9070
9289
  reactData.mergeBodyFlag++
9071
9290
  },
9291
+ handleUpdateHeaderMerge () {
9292
+ const { mergeHeaderList } = internalData
9293
+ internalData.mergeHeaderCellMaps = buildMergeData(mergeHeaderList)
9294
+ reactData.mergeHeadFlag++
9295
+ },
9072
9296
  handleUpdateFooterMerge () {
9073
9297
  const { mergeFooterList } = internalData
9074
9298
  internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList)
@@ -10010,6 +10234,218 @@ export default defineVxeComponent({
10010
10234
  }
10011
10235
  return Promise.resolve(errRest)
10012
10236
  },
10237
+ /**
10238
+ * 处理跨表拖拽完成
10239
+ */
10240
+ handleCrossTableRowDragFinishEvent (evnt) {
10241
+ const { tableData } = reactData
10242
+ const { fullAllDataRowIdData } = internalData
10243
+ const rowOpts = computeRowOpts.value
10244
+ const cellOpts = computeCellOpts.value
10245
+ const defaultRowHeight = computeDefaultRowHeight.value
10246
+ const rowDragOpts = computeRowDragOpts.value
10247
+ const { animation, isCrossTableDrag } = rowDragOpts
10248
+ const treeOpts = computeTreeOpts.value
10249
+ const { mapChildrenField } = treeOpts
10250
+ const el = refElem.value
10251
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
10252
+ const { row: dragRow } = crossTableDragRowInfo
10253
+ if (dragRow) {
10254
+ const dragRowid = getRowid($xeTable, dragRow)
10255
+ const dragRowRest = fullAllDataRowIdData[dragRowid]
10256
+ let dragRowHeight = 0
10257
+ let rsIndex = -1
10258
+ if (dragRowRest) {
10259
+ if (animation) {
10260
+ dragRowHeight = getCellRestHeight(dragRowRest, cellOpts, rowOpts, defaultRowHeight)
10261
+ }
10262
+ rsIndex = dragRowRest.$index
10263
+ }
10264
+ const dragRangeList = rsIndex > -1 && rsIndex < tableData.length - 1 ? tableData.slice(rsIndex + 1) : []
10265
+ const dragList = XEUtils.toTreeArray([dragRow], {
10266
+ updated: true,
10267
+ children: mapChildrenField
10268
+ })
10269
+ $xeTable.remove(dragList).then(() => {
10270
+ if (animation && dragRowHeight && dragRangeList.length) {
10271
+ const $xeGanttView = internalData.xeGanttView
10272
+ let wrapperEl = el
10273
+ if ($xeGantt && $xeGanttView) {
10274
+ const { refGanttContainerElem } = $xeGantt.getRefMaps()
10275
+ const ganttContainerElem = refGanttContainerElem.value
10276
+ if (ganttContainerElem) {
10277
+ wrapperEl = ganttContainerElem
10278
+ }
10279
+ }
10280
+
10281
+ const dtClss: string[] = []
10282
+ dragRangeList.forEach(row => {
10283
+ const rowid = getRowid($xeTable, row)
10284
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`)
10285
+ if ($xeGantt) {
10286
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`)
10287
+ }
10288
+ })
10289
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
10290
+ moveRowAnimateToTb(dtTrList, dragRowHeight)
10291
+ }
10292
+ })
10293
+ dispatchEvent('row-remove-dragend', {
10294
+ row: dragRow
10295
+ }, evnt)
10296
+ clearRowDragData()
10297
+ clearCrossTableDragStatus()
10298
+ }
10299
+ }
10300
+ },
10301
+ /**
10302
+ * 处理跨表拖至新的空表
10303
+ */
10304
+ handleCrossTableRowDragoverEmptyEvent (evnt) {
10305
+ const { tableData } = reactData
10306
+ const rowDragOpts = computeRowDragOpts.value
10307
+ const { isCrossTableDrag } = rowDragOpts
10308
+ if (isCrossTableDrag && crossTableDragRowObj && !tableData.length) {
10309
+ const { $oldTable } = crossTableDragRowObj
10310
+ if ($oldTable && $oldTable.xID !== $xeTable.xID) {
10311
+ evnt.preventDefault()
10312
+ crossTableDragRowObj.$newTable = $xeTable
10313
+ internalData.prevDragRow = null
10314
+ }
10315
+ }
10316
+ },
10317
+ /**
10318
+ * 处理跨表拖插入
10319
+ */
10320
+ handleCrossTableRowDragInsertEvent (evnt) {
10321
+ const { treeConfig } = props
10322
+ const { prevDragRow, prevDragPos, prevDragToChild } = internalData
10323
+ const rowDragOpts = computeRowDragOpts.value
10324
+ const { animation, isSelfToChildDrag, isCrossTableDrag, dragEndMethod, dragToChildMethod } = rowDragOpts
10325
+ const rowOpts = computeRowOpts.value
10326
+ const cellOpts = computeCellOpts.value
10327
+ const defaultRowHeight = computeDefaultRowHeight.value
10328
+ const treeOpts = computeTreeOpts.value
10329
+ const { parentField, mapChildrenField } = treeOpts
10330
+ const childrenField = treeOpts.children || treeOpts.childrenField
10331
+ // 跨表拖拽
10332
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
10333
+ const { row: oldRow } = crossTableDragRowInfo
10334
+ const { $oldTable } = crossTableDragRowObj
10335
+ const el = refElem.value
10336
+ if ($oldTable && oldRow) {
10337
+ const dragRow = oldRow
10338
+ let dragOffsetIndex = -1
10339
+ if (prevDragRow) {
10340
+ dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0
10341
+ }
10342
+ const dragParams = {
10343
+ oldRow: dragRow,
10344
+ newRow: prevDragRow,
10345
+ dragRow,
10346
+ dragPos: prevDragPos as 'top' | 'bottom',
10347
+ dragToChild: !!prevDragToChild,
10348
+ offsetIndex: dragOffsetIndex as 0 | 1
10349
+ }
10350
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild
10351
+ const errRest = {
10352
+ status: false
10353
+ }
10354
+ Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
10355
+ if (!status) {
10356
+ return errRest
10357
+ }
10358
+ let insertRest: Promise<any> = Promise.resolve()
10359
+ if (treeConfig) {
10360
+ const dragList = XEUtils.toTreeArray([dragRow], {
10361
+ updated: true,
10362
+ children: mapChildrenField
10363
+ })
10364
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt)
10365
+ if (prevDragRow) {
10366
+ dragRow[parentField] = prevDragRow[parentField]
10367
+ } else {
10368
+ dragRow[parentField] = null
10369
+ }
10370
+ dragList.forEach(row => {
10371
+ row[childrenField] = undefined
10372
+ row[mapChildrenField] = undefined
10373
+ })
10374
+ if (prevDragRow) {
10375
+ if (prevDragPos === 'bottom') {
10376
+ insertRest = $xeTable.insertNextAt(dragList, prevDragRow)
10377
+ } else {
10378
+ insertRest = $xeTable.insertAt(dragList, prevDragRow)
10379
+ }
10380
+ } else {
10381
+ insertRest = $xeTable.insert(dragList)
10382
+ }
10383
+ } else {
10384
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt)
10385
+ if (prevDragRow) {
10386
+ if (prevDragPos === 'bottom') {
10387
+ insertRest = $xeTable.insertNextAt(dragRow, prevDragRow)
10388
+ } else {
10389
+ insertRest = $xeTable.insertAt(dragRow, prevDragRow)
10390
+ }
10391
+ } else {
10392
+ insertRest = $xeTable.insert(dragRow)
10393
+ }
10394
+ }
10395
+ dispatchEvent('row-insert-dragend', {
10396
+ oldRow,
10397
+ newRow: prevDragRow,
10398
+ dragRow,
10399
+ dragPos: prevDragPos as any,
10400
+ dragToChild: isDragToChildFlag,
10401
+ offsetIndex: dragOffsetIndex
10402
+ }, evnt)
10403
+ clearRowDragData()
10404
+
10405
+ insertRest.then(() => {
10406
+ const { tableData } = reactData
10407
+ const { fullAllDataRowIdData } = internalData
10408
+ const oldRowid = getRowid($xeTable, dragRow)
10409
+ const oldRowRest = fullAllDataRowIdData[oldRowid]
10410
+ let dragRowHeight = 0
10411
+ let rsIndex = -1
10412
+ if (oldRowRest) {
10413
+ if (animation) {
10414
+ dragRowHeight = getCellRestHeight(oldRowRest, cellOpts, rowOpts, defaultRowHeight)
10415
+ }
10416
+ rsIndex = oldRowRest.$index
10417
+ }
10418
+ const dragRangeList = rsIndex > -1 ? tableData.slice(rsIndex) : []
10419
+ if (animation && dragRowHeight && dragRangeList.length) {
10420
+ const $xeGanttView = internalData.xeGanttView
10421
+ let wrapperEl = el
10422
+ if ($xeGantt && $xeGanttView) {
10423
+ const { refGanttContainerElem } = $xeGantt.getRefMaps()
10424
+ const ganttContainerElem = refGanttContainerElem.value
10425
+ if (ganttContainerElem) {
10426
+ wrapperEl = ganttContainerElem
10427
+ }
10428
+ }
10429
+
10430
+ const dtClss: string[] = []
10431
+ dragRangeList.forEach(row => {
10432
+ const rowid = getRowid($xeTable, row)
10433
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`)
10434
+ if ($xeGantt) {
10435
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`)
10436
+ }
10437
+ })
10438
+ const dtTrList = wrapperEl.querySelectorAll<HTMLElement>(dtClss.join(','))
10439
+ moveRowAnimateToTb(dtTrList, -dragRowHeight)
10440
+ }
10441
+ })
10442
+ })
10443
+ }
10444
+ }
10445
+ },
10446
+ hideCrossTableRowDropClearStatus () {
10447
+ hideDropTip()
10448
+ },
10013
10449
  handleRowDragDragendEvent (evnt) {
10014
10450
  const { treeConfig } = props
10015
10451
  const { fullAllDataRowIdData, prevDragToChild } = internalData
@@ -10018,7 +10454,16 @@ export default defineVxeComponent({
10018
10454
  const { lazy } = treeOpts
10019
10455
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
10020
10456
  const { prevDragRow, prevDragPos } = internalData
10021
- let wrapperEl = refElem.value
10457
+ const rowDragOpts = computeRowDragOpts.value
10458
+ const { isCrossTableDrag } = rowDragOpts
10459
+ // 跨表拖拽
10460
+ if (isCrossTableDrag && crossTableDragRowObj) {
10461
+ const { $newTable } = crossTableDragRowObj
10462
+ if ($newTable && $newTable.xID !== $xeTable.xID) {
10463
+ $newTable.handleCrossTableRowDragInsertEvent(evnt)
10464
+ return
10465
+ }
10466
+ }
10022
10467
  if (treeConfig && lazy && prevDragToChild) {
10023
10468
  // 懒加载
10024
10469
  const newRowid = getRowid($xeTable, prevDragRow)
@@ -10033,21 +10478,8 @@ export default defineVxeComponent({
10033
10478
  } else {
10034
10479
  $xeTable.handleRowDragSwapEvent(evnt, true, dragRow, prevDragRow, prevDragPos, prevDragToChild)
10035
10480
  }
10036
- const dtClss = ['.vxe-body--row']
10037
- if ($xeGantt) {
10038
- const { refGanttContainerElem } = $xeGantt.getRefMaps()
10039
- const ganttContainerElem = refGanttContainerElem.value
10040
- if (ganttContainerElem) {
10041
- wrapperEl = ganttContainerElem
10042
- }
10043
- dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row')
10044
- }
10045
- hideDropTip()
10046
- clearRowDropOrigin()
10047
- clearRowAnimate(wrapperEl, dtClss)
10048
- internalData.prevDragToChild = false
10049
- reactData.dragRow = null
10050
- reactData.dragCol = null
10481
+ clearRowDragData()
10482
+ clearCrossTableDragStatus()
10051
10483
  },
10052
10484
  handleRowDragDragoverEvent (evnt) {
10053
10485
  const { treeConfig } = props
@@ -10057,8 +10489,8 @@ export default defineVxeComponent({
10057
10489
  const { lazy, transform, parentField } = treeOpts
10058
10490
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
10059
10491
  const rowDragOpts = computeRowDragOpts.value
10060
- const { isPeerDrag, isCrossDrag, isToChildDrag } = rowDragOpts
10061
- if (!dragRow) {
10492
+ const { isPeerDrag, isCrossDrag, isToChildDrag, isCrossTableDrag } = rowDragOpts
10493
+ if (!dragRow && !(isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj)) {
10062
10494
  evnt.preventDefault()
10063
10495
  return
10064
10496
  }
@@ -10067,16 +10499,37 @@ export default defineVxeComponent({
10067
10499
  const rowid = trEl.getAttribute('rowid') || ''
10068
10500
  const rest = fullAllDataRowIdData[rowid]
10069
10501
  if (rest) {
10502
+ evnt.preventDefault()
10070
10503
  const row = rest.row
10071
10504
  const rowid = getRowid($xeTable, row)
10072
10505
  const rowRest = fullAllDataRowIdData[rowid]
10073
- evnt.preventDefault()
10074
- const { dragRow } = reactData
10075
10506
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y
10076
10507
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom'
10077
10508
  internalData.prevDragToChild = !!(treeConfig && transform && (isCrossDrag && isToChildDrag) && isControlKey)
10078
10509
  internalData.prevDragRow = row
10079
10510
  internalData.prevDragPos = dragPos
10511
+ // 跨表拖拽
10512
+ if (isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj) {
10513
+ const { $oldTable, $newTable } = crossTableDragRowObj
10514
+ if ($oldTable) {
10515
+ const oldTableReactData = $oldTable.reactData
10516
+ if ($oldTable.xID === $xeTable.xID) {
10517
+ if ($newTable) {
10518
+ $newTable.hideCrossTableRowDropClearStatus()
10519
+ }
10520
+ reactData.isCrossDragRow = false
10521
+ oldTableReactData.isCrossDragRow = false
10522
+ crossTableDragRowObj.$newTable = null
10523
+ } else {
10524
+ $oldTable.hideCrossTableRowDropClearStatus()
10525
+ oldTableReactData.isCrossDragRow = true
10526
+ reactData.dragTipText = oldTableReactData.dragTipText
10527
+ crossTableDragRowObj.$newTable = $xeTable
10528
+ showDropTip(evnt, trEl, null, true, dragPos)
10529
+ return
10530
+ }
10531
+ }
10532
+ }
10080
10533
  if ($xeTable.eqRow(dragRow, row) ||
10081
10534
  (isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded) ||
10082
10535
  (!isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level))
@@ -10096,7 +10549,7 @@ export default defineVxeComponent({
10096
10549
  evnt.stopPropagation()
10097
10550
  const { dragConfig } = props
10098
10551
  const rowDragOpts = computeRowDragOpts.value
10099
- const { trigger, dragStartMethod } = rowDragOpts
10552
+ const { isCrossTableDrag, trigger, dragStartMethod } = rowDragOpts
10100
10553
  const { row } = params
10101
10554
  const dragEl = evnt.currentTarget as HTMLElement
10102
10555
  const tdEl = trigger === 'cell' || trigger === 'row' ? dragEl : dragEl.parentElement?.parentElement as HTMLElement
@@ -10107,10 +10560,16 @@ export default defineVxeComponent({
10107
10560
  trEl.draggable = false
10108
10561
  reactData.dragRow = null
10109
10562
  reactData.dragCol = null
10563
+ clearCrossTableDragStatus()
10110
10564
  hideDropTip()
10111
10565
  return
10112
10566
  }
10567
+ if (isCrossTableDrag) {
10568
+ crossTableDragRowInfo.row = row
10569
+ crossTableDragRowObj = { $oldTable: $xeTable, $newTable: null }
10570
+ }
10113
10571
  reactData.dragRow = row
10572
+ reactData.isCrossDragRow = false
10114
10573
  reactData.dragCol = null
10115
10574
  trEl.draggable = true
10116
10575
  updateRowDropOrigin(row)
@@ -10435,6 +10894,7 @@ export default defineVxeComponent({
10435
10894
  internalData.prevDragToChild = false
10436
10895
  reactData.dragRow = null
10437
10896
  reactData.dragCol = null
10897
+ clearCrossTableDragStatus()
10438
10898
  },
10439
10899
  handleHeaderCellDragDragoverEvent (evnt) {
10440
10900
  const { dragCol } = reactData
@@ -10513,12 +10973,14 @@ export default defineVxeComponent({
10513
10973
  thEl.draggable = false
10514
10974
  reactData.dragRow = null
10515
10975
  reactData.dragCol = null
10976
+ clearCrossTableDragStatus()
10516
10977
  hideDropTip()
10517
10978
  return
10518
10979
  }
10519
10980
  reactData.dragCol = column
10520
10981
  reactData.dragRow = null
10521
10982
  thEl.draggable = true
10983
+ clearCrossTableDragStatus()
10522
10984
  updateColDropOrigin(column)
10523
10985
  updateColDropTipContent(thEl)
10524
10986
  dispatchEvent('column-dragstart', params, evnt)
@@ -10526,6 +10988,7 @@ export default defineVxeComponent({
10526
10988
  handleHeaderCellDragMouseupEvent () {
10527
10989
  clearColDropOrigin()
10528
10990
  hideDropTip()
10991
+ clearCrossTableDragStatus()
10529
10992
  reactData.dragRow = null
10530
10993
  reactData.dragCol = null
10531
10994
  },
@@ -11428,9 +11891,10 @@ export default defineVxeComponent({
11428
11891
  const rTipSlot = rowDragSlots.tip || (dragConfig && dragConfig.slots ? dragConfig.slots.rowTip : null)
11429
11892
  const columnDragSlots = columnDragOpts.slots || {}
11430
11893
  const cTipSlot = columnDragSlots.tip
11894
+ const dRow = dragRow || (rowDragOpts.isCrossTableDrag ? crossTableDragRowInfo.row : null)
11431
11895
 
11432
- if (dragRow && rTipSlot) {
11433
- return callSlot(rTipSlot, { row: dragRow })
11896
+ if (dRow && rTipSlot) {
11897
+ return callSlot(rTipSlot, { row: dRow })
11434
11898
  }
11435
11899
  if (dragCol && cTipSlot) {
11436
11900
  return callSlot(cTipSlot, { column: dragCol })
@@ -11444,6 +11908,7 @@ export default defineVxeComponent({
11444
11908
  const columnOpts = computeColumnOpts.value
11445
11909
  const rowDragOpts = computeRowDragOpts.value
11446
11910
  const columnDragOpts = computeColumnDragOpts.value
11911
+ const dRow = dragRow || (rowDragOpts.isCrossTableDrag ? crossTableDragRowInfo.row : null)
11447
11912
 
11448
11913
  if (rowOpts.drag || columnOpts.drag) {
11449
11914
  return h('div', {
@@ -11461,7 +11926,7 @@ export default defineVxeComponent({
11461
11926
  'is--guides': columnDragOpts.showGuidesStatus
11462
11927
  }]
11463
11928
  }),
11464
- (dragRow && rowDragOpts.showDragTip) || (dragCol && columnDragOpts.showDragTip)
11929
+ (dRow && rowDragOpts.showDragTip) || (dragCol && columnDragOpts.showDragTip)
11465
11930
  ? h('div', {
11466
11931
  ref: refDragTipElem,
11467
11932
  class: 'vxe-table--drag-sort-tip'
@@ -11473,7 +11938,7 @@ export default defineVxeComponent({
11473
11938
  class: 'vxe-table--drag-sort-tip-status'
11474
11939
  }, [
11475
11940
  h('span', {
11476
- class: ['vxe-table--drag-sort-tip-normal-status', dragRow ? getIcon().TABLE_DRAG_STATUS_ROW : getIcon().TABLE_DRAG_STATUS_COLUMN]
11941
+ class: ['vxe-table--drag-sort-tip-normal-status', dRow ? getIcon().TABLE_DRAG_STATUS_ROW : getIcon().TABLE_DRAG_STATUS_COLUMN]
11477
11942
  }),
11478
11943
  h('span', {
11479
11944
  class: ['vxe-table--drag-sort-tip-sub-status', getIcon().TABLE_DRAG_STATUS_SUB_ROW]
@@ -11618,7 +12083,10 @@ export default defineVxeComponent({
11618
12083
  ref: refScrollXSpaceElem,
11619
12084
  class: 'vxe-table--scroll-x-space'
11620
12085
  })
11621
- ])
12086
+ ]),
12087
+ h('div', {
12088
+ class: 'vxe-table--scroll-x-handle-appearance'
12089
+ })
11622
12090
  ]),
11623
12091
  h('div', {
11624
12092
  ref: refScrollXRightCornerElem,
@@ -11649,7 +12117,10 @@ export default defineVxeComponent({
11649
12117
  ref: refScrollYSpaceElem,
11650
12118
  class: 'vxe-table--scroll-y-space'
11651
12119
  })
11652
- ])
12120
+ ]),
12121
+ h('div', {
12122
+ class: 'vxe-table--scroll-y-handle-appearance'
12123
+ })
11653
12124
  ]),
11654
12125
  h('div', {
11655
12126
  ref: refScrollYBottomCornerElem,
@@ -11731,6 +12202,7 @@ export default defineVxeComponent({
11731
12202
  const { teleportToWrapperElem } = internalData
11732
12203
  const { leftList, rightList } = columnStore
11733
12204
  const loadingSlot = slots.loading
12205
+ const rowDragOpts = computeRowDragOpts.value
11734
12206
  const tableTipConfig = computeTableTipConfig.value
11735
12207
  const validTipConfig = computeValidTipConfig.value
11736
12208
  const validOpts = computeValidOpts.value
@@ -11750,6 +12222,11 @@ export default defineVxeComponent({
11750
12222
  const columnDragOpts = computeColumnDragOpts.value
11751
12223
  const scrollbarXToTop = computeScrollbarXToTop.value
11752
12224
  const scrollbarYToLeft = computeScrollbarYToLeft.value
12225
+ const { isCrossTableDrag } = rowDragOpts
12226
+ const rwOns: Record<string, any> = {}
12227
+ if (isCrossTableDrag && !tableData.length) {
12228
+ rwOns.onDragover = $xeTable.handleCrossTableRowDragoverEmptyEvent
12229
+ }
11753
12230
  return h('div', {
11754
12231
  ref: refElem,
11755
12232
  class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
@@ -11811,7 +12288,8 @@ export default defineVxeComponent({
11811
12288
  ]),
11812
12289
  h('div', {
11813
12290
  key: 'tw',
11814
- class: 'vxe-table--render-wrapper'
12291
+ class: 'vxe-table--render-wrapper',
12292
+ ...rwOns
11815
12293
  }, scrollbarXToTop
11816
12294
  ? [
11817
12295
  renderScrollX(),
@@ -12137,15 +12615,33 @@ export default defineVxeComponent({
12137
12615
  handleUpdateMergeBodyCells(props.mergeCells || [])
12138
12616
  })
12139
12617
 
12140
- const mergeFooterItemFlag = ref(0)
12618
+ const mergeHeaderItemFlag = ref(0)
12619
+ watch(() => props.mergeHeaderCells ? props.mergeHeaderCells.length : -1, () => {
12620
+ mergeHeaderItemFlag.value++
12621
+ })
12622
+ watch(() => props.mergeHeaderCells, () => {
12623
+ mergeHeaderItemFlag.value++
12624
+ })
12625
+ watch(mergeHeaderItemFlag, () => {
12626
+ handleUpdateMergeHeaderCells(props.mergeHeaderCells || [])
12627
+ })
12628
+
12629
+ const mergeFooteCellFlag = ref(0)
12630
+ watch(() => props.mergeFooterCells ? props.mergeFooterCells.length : -1, () => {
12631
+ mergeFooteCellFlag.value++
12632
+ })
12633
+ watch(() => props.mergeFooterCells, () => {
12634
+ mergeFooteCellFlag.value++
12635
+ })
12141
12636
  watch(() => props.mergeFooterItems ? props.mergeFooterItems.length : -1, () => {
12142
- mergeFooterItemFlag.value++
12637
+ mergeFooteCellFlag.value++
12143
12638
  })
12144
12639
  watch(() => props.mergeFooterItems, () => {
12145
- mergeFooterItemFlag.value++
12640
+ mergeFooteCellFlag.value++
12146
12641
  })
12147
- watch(mergeFooterItemFlag, () => {
12148
- handleUpdateMergeFooterCells(props.mergeFooterItems || [])
12642
+ watch(mergeFooteCellFlag, () => {
12643
+ const mFooterCells = props.mergeFooterCells || props.mergeFooterItems
12644
+ handleUpdateMergeFooterCells(mFooterCells || [])
12149
12645
  })
12150
12646
 
12151
12647
  watch(computeRowGroupFields, (val) => {
@@ -12240,6 +12736,7 @@ export default defineVxeComponent({
12240
12736
  const currentColumnOpts = computeCurrentColumnOpts.value
12241
12737
  const keyboardOpts = computeKeyboardOpts.value
12242
12738
  const aggregateOpts = computeAggregateOpts.value
12739
+ const rowDragOpts = computeRowDragOpts.value
12243
12740
 
12244
12741
  if (props.rowId) {
12245
12742
  warnLog('vxe.error.delProp', ['row-id', 'row-config.keyField'])
@@ -12344,7 +12841,10 @@ export default defineVxeComponent({
12344
12841
  }
12345
12842
  }
12346
12843
  if (treeConfig && rowOpts.drag && !treeOpts.transform) {
12347
- errLog('vxe.error.notSupportProp', ['column-config.drag', 'tree-config.transform=false', 'tree-config.transform=true'])
12844
+ errLog('vxe.error.notSupportProp', ['row-config.drag', 'tree-config.transform=false', 'tree-config.transform=true'])
12845
+ }
12846
+ if (treeConfig && rowDragOpts.isCrossTableDrag && !rowDragOpts.isCrossDrag) {
12847
+ errLog('vxe.error.reqSupportProp', ['tree-config & row-drag-config.isCrossTableDrag', 'row-drag-config.isCrossDrag'])
12348
12848
  }
12349
12849
  if (props.dragConfig) {
12350
12850
  warnLog('vxe.error.delProp', ['drag-config', 'row-drag-config'])