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';
@@ -32,6 +33,7 @@ const supportMaxRow = 5e6;
32
33
  const customStorageKey = 'VXE_CUSTOM_STORE';
33
34
  const maxYHeight = 5e6;
34
35
  const maxXWidth = 5e6;
36
+ let crossTableDragRowObj = null;
35
37
  export default defineVxeComponent({
36
38
  name: 'VxeTable',
37
39
  props: tableProps,
@@ -48,6 +50,7 @@ export default defineVxeComponent({
48
50
  const $xeGantt = inject('$xeGantt', null);
49
51
  const $xeGGWrapper = $xeGrid || $xeGantt;
50
52
  const { computeSize } = useFns.useSize(props);
53
+ const crossTableDragRowInfo = getCrossTableDragRowInfo();
51
54
  const reactData = reactive({
52
55
  // 低性能的静态列
53
56
  staticColumns: [],
@@ -257,6 +260,7 @@ export default defineVxeComponent({
257
260
  pendingRowFlag: 1,
258
261
  insertRowFlag: 1,
259
262
  removeRowFlag: 1,
263
+ mergeHeadFlag: 1,
260
264
  mergeBodyFlag: 1,
261
265
  mergeFootFlag: 1,
262
266
  rowHeightStore: {
@@ -279,9 +283,9 @@ export default defineVxeComponent({
279
283
  resizeHeightFlag: 1,
280
284
  resizeWidthFlag: 1,
281
285
  isCustomStatus: false,
282
- isDragRowMove: false,
286
+ isCrossDragRow: false,
283
287
  dragRow: null,
284
- isDragColMove: false,
288
+ isCrossDragCol: false,
285
289
  dragCol: null,
286
290
  dragTipText: '',
287
291
  isDragResize: false,
@@ -1123,15 +1127,62 @@ export default defineVxeComponent({
1123
1127
  });
1124
1128
  }
1125
1129
  };
1126
- const handleUpdateMergeFooterCells = (merges) => {
1127
- internalData.mergeFooterList = [];
1128
- internalData.mergeFooterMaps = {};
1129
- internalData.mergeFooterCellMaps = {};
1130
- $xeTable.setMergeFooterItems(merges);
1130
+ const removeBodyMerges = (merges) => {
1131
+ const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData;
1132
+ const rest = [];
1133
+ if (merges) {
1134
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1135
+ if (!XEUtils.isArray(merges)) {
1136
+ merges = [merges];
1137
+ }
1138
+ merges.forEach((item) => {
1139
+ const { row: margeRow, col: margeCol } = item;
1140
+ let mergeRowIndex = -1;
1141
+ let mergeColumnIndex = -1;
1142
+ if (XEUtils.isNumber(margeRow)) {
1143
+ mergeRowIndex = margeRow;
1144
+ }
1145
+ else {
1146
+ const rowid = margeRow ? handleGetRowId(margeRow) : null;
1147
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null;
1148
+ if (rowRest) {
1149
+ mergeRowIndex = rowRest._index;
1150
+ }
1151
+ }
1152
+ if (XEUtils.isNumber(margeCol)) {
1153
+ mergeColumnIndex = margeCol;
1154
+ }
1155
+ else {
1156
+ const colid = margeCol ? margeCol.id : null;
1157
+ const colRest = colid ? fullColumnIdData[colid] : null;
1158
+ if (colRest) {
1159
+ mergeColumnIndex = colRest._index;
1160
+ }
1161
+ }
1162
+ const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex);
1163
+ if (mcIndex > -1) {
1164
+ const rItems = mergeBodyList.splice(mcIndex, 1);
1165
+ const item = rItems[0];
1166
+ if (item) {
1167
+ rest.push(rItems[0]);
1168
+ if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1169
+ delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1170
+ }
1171
+ }
1172
+ }
1173
+ });
1174
+ }
1175
+ return rest;
1131
1176
  };
1132
- const handleFooterMerge = (merges) => {
1177
+ const handleUpdateMergeHeaderCells = (merges) => {
1178
+ internalData.mergeHeaderList = [];
1179
+ internalData.mergeHeaderMaps = {};
1180
+ internalData.mergeHeaderCellMaps = {};
1181
+ $xeTable.setMergeHeaderCells(merges);
1182
+ };
1183
+ const handleHeaderMerge = (merges) => {
1133
1184
  const { footerTableData } = reactData;
1134
- const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData;
1185
+ const { mergeHeaderList, mergeHeaderMaps, fullColumnIdData } = internalData;
1135
1186
  if (merges) {
1136
1187
  const { visibleColumn } = internalData;
1137
1188
  if (!XEUtils.isArray(merges)) {
@@ -1157,7 +1208,7 @@ export default defineVxeComponent({
1157
1208
  if (rowspan > 1 || colspan > 1) {
1158
1209
  const row = footerTableData[mergeRowIndex];
1159
1210
  const column = visibleColumn[mergeColumnIndex];
1160
- let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1211
+ let mergeItem = mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1161
1212
  if (mergeItem) {
1162
1213
  mergeItem.rowspan = rowspan;
1163
1214
  mergeItem.colspan = colspan;
@@ -1175,36 +1226,25 @@ export default defineVxeComponent({
1175
1226
  _rowspan: rowspan,
1176
1227
  _colspan: colspan
1177
1228
  };
1178
- mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1179
- mergeFooterList.push(mergeItem);
1229
+ mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1230
+ mergeHeaderList.push(mergeItem);
1180
1231
  }
1181
1232
  }
1182
1233
  }
1183
1234
  });
1184
1235
  }
1185
1236
  };
1186
- const removeBodyMerges = (merges) => {
1187
- const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData;
1237
+ const removeHeaderMerges = (merges) => {
1238
+ const { mergeHeaderList, fullColumnIdData, mergeHeaderMaps } = internalData;
1188
1239
  const rest = [];
1189
1240
  if (merges) {
1190
- const { handleGetRowId } = createHandleGetRowId($xeTable);
1191
1241
  if (!XEUtils.isArray(merges)) {
1192
1242
  merges = [merges];
1193
1243
  }
1194
1244
  merges.forEach((item) => {
1195
1245
  const { row: margeRow, col: margeCol } = item;
1196
- let mergeRowIndex = -1;
1246
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1;
1197
1247
  let mergeColumnIndex = -1;
1198
- if (XEUtils.isNumber(margeRow)) {
1199
- mergeRowIndex = margeRow;
1200
- }
1201
- else {
1202
- const rowid = margeRow ? handleGetRowId(margeRow) : null;
1203
- const rowRest = rowid ? fullAllDataRowIdData[rowid] : null;
1204
- if (rowRest) {
1205
- mergeRowIndex = rowRest._index;
1206
- }
1207
- }
1208
1248
  if (XEUtils.isNumber(margeCol)) {
1209
1249
  mergeColumnIndex = margeCol;
1210
1250
  }
@@ -1215,14 +1255,14 @@ export default defineVxeComponent({
1215
1255
  mergeColumnIndex = colRest._index;
1216
1256
  }
1217
1257
  }
1218
- const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex);
1258
+ const mcIndex = XEUtils.findIndexOf(mergeHeaderList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex);
1219
1259
  if (mcIndex > -1) {
1220
- const rItems = mergeBodyList.splice(mcIndex, 1);
1260
+ const rItems = mergeHeaderList.splice(mcIndex, 1);
1221
1261
  const item = rItems[0];
1222
1262
  if (item) {
1223
- rest.push(rItems[0]);
1224
- if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1225
- delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1263
+ rest.push(item);
1264
+ if (mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1265
+ delete mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1226
1266
  }
1227
1267
  }
1228
1268
  }
@@ -1230,6 +1270,66 @@ export default defineVxeComponent({
1230
1270
  }
1231
1271
  return rest;
1232
1272
  };
1273
+ const handleUpdateMergeFooterCells = (merges) => {
1274
+ internalData.mergeFooterList = [];
1275
+ internalData.mergeFooterMaps = {};
1276
+ internalData.mergeFooterCellMaps = {};
1277
+ $xeTable.setMergeFooterCells(merges);
1278
+ };
1279
+ const handleFooterMerge = (merges) => {
1280
+ const { footerTableData } = reactData;
1281
+ const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData;
1282
+ if (merges) {
1283
+ const { visibleColumn } = internalData;
1284
+ if (!XEUtils.isArray(merges)) {
1285
+ merges = [merges];
1286
+ }
1287
+ merges.forEach((item) => {
1288
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item;
1289
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1;
1290
+ let mergeColumnIndex = -1;
1291
+ if (XEUtils.isNumber(margeCol)) {
1292
+ mergeColumnIndex = margeCol;
1293
+ }
1294
+ else {
1295
+ const colid = margeCol ? margeCol.id : null;
1296
+ const colRest = colid ? fullColumnIdData[colid] : null;
1297
+ if (colRest) {
1298
+ mergeColumnIndex = colRest._index;
1299
+ }
1300
+ }
1301
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1302
+ rowspan = XEUtils.toNumber(rowspan) || 1;
1303
+ colspan = XEUtils.toNumber(colspan) || 1;
1304
+ if (rowspan > 1 || colspan > 1) {
1305
+ const row = footerTableData[mergeRowIndex];
1306
+ const column = visibleColumn[mergeColumnIndex];
1307
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1308
+ if (mergeItem) {
1309
+ mergeItem.rowspan = rowspan;
1310
+ mergeItem.colspan = colspan;
1311
+ mergeItem._rowspan = rowspan;
1312
+ mergeItem._colspan = colspan;
1313
+ }
1314
+ else {
1315
+ mergeItem = {
1316
+ row: mergeRowIndex,
1317
+ col: mergeColumnIndex,
1318
+ rowspan,
1319
+ colspan,
1320
+ _row: row,
1321
+ _col: column,
1322
+ _rowspan: rowspan,
1323
+ _colspan: colspan
1324
+ };
1325
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1326
+ mergeFooterList.push(mergeItem);
1327
+ }
1328
+ }
1329
+ }
1330
+ });
1331
+ }
1332
+ };
1233
1333
  const removeFooterMerges = (merges) => {
1234
1334
  const { mergeFooterList, fullColumnIdData, mergeFooterMaps } = internalData;
1235
1335
  const rest = [];
@@ -1335,8 +1435,23 @@ export default defineVxeComponent({
1335
1435
  });
1336
1436
  };
1337
1437
  const calcTableHeight = (key) => {
1438
+ const { editConfig } = props;
1338
1439
  const { parentHeight } = reactData;
1339
- const val = props[key];
1440
+ let val = props[key];
1441
+ if (key === 'minHeight') {
1442
+ const defMinHeight = getConfig().table.minHeight;
1443
+ if (XEUtils.eqNull(val)) {
1444
+ if (eqEmptyValue(defMinHeight)) {
1445
+ // 编辑模式默认最小高度
1446
+ if (isEnableConf(editConfig)) {
1447
+ val = 144;
1448
+ }
1449
+ }
1450
+ else {
1451
+ val = defMinHeight;
1452
+ }
1453
+ }
1454
+ }
1340
1455
  let num = 0;
1341
1456
  if (val) {
1342
1457
  if (val === '100%' || val === 'auto') {
@@ -2190,22 +2305,28 @@ export default defineVxeComponent({
2190
2305
  emptyPlaceholderElem.style.top = `${tHeaderHeight}px`;
2191
2306
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : '';
2192
2307
  }
2308
+ const scrollbarXConf = scrollbarOpts.x || {};
2193
2309
  const scrollbarXToTop = computeScrollbarXToTop.value;
2310
+ const scrollbarYConf = scrollbarOpts.y || {};
2194
2311
  const scrollbarYToLeft = computeScrollbarYToLeft.value;
2195
2312
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden';
2196
- if ($xeGanttView) {
2313
+ if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
2197
2314
  osbHeight = scrollbarHeight;
2198
2315
  xScrollbarVisible = 'visible';
2199
2316
  }
2200
- else if (scrollbarOpts.x && scrollbarOpts.x.visible === false) {
2317
+ else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
2201
2318
  osbHeight = 0;
2202
2319
  xScrollbarVisible = 'hidden';
2203
2320
  }
2204
2321
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden';
2205
- if ((scrollbarOpts.y && scrollbarOpts.y.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
2322
+ if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || ($xeGanttView && !scrollbarYToLeft)) {
2206
2323
  osbWidth = 0;
2207
2324
  yScrollbarVisible = 'hidden';
2208
2325
  }
2326
+ else if (scrollbarYConf.visible === 'visible') {
2327
+ osbWidth = scrollbarWidth;
2328
+ yScrollbarVisible = 'visible';
2329
+ }
2209
2330
  let tbHeight = 0;
2210
2331
  let bodyMaxHeight = 0;
2211
2332
  const bodyMinHeight = customMinHeight - tHeaderHeight - tFooterHeight - osbHeight;
@@ -2244,7 +2365,7 @@ export default defineVxeComponent({
2244
2365
  }
2245
2366
  if (xRightCornerEl) {
2246
2367
  xRightCornerEl.style.width = scrollbarXToTop ? '' : `${osbWidth}px`;
2247
- xRightCornerEl.style.display = scrollbarXToTop ? '' : (overflowX && osbHeight ? 'block' : '');
2368
+ xRightCornerEl.style.display = scrollbarXToTop ? '' : (xScrollbarVisible === 'visible' ? 'block' : '');
2248
2369
  }
2249
2370
  const scrollYVirtualEl = refScrollYVirtualElem.value;
2250
2371
  if (scrollYVirtualEl) {
@@ -2255,7 +2376,7 @@ export default defineVxeComponent({
2255
2376
  const yTopCornerEl = refScrollYTopCornerElem.value;
2256
2377
  if (yTopCornerEl) {
2257
2378
  yTopCornerEl.style.height = `${tHeaderHeight}px`;
2258
- yTopCornerEl.style.display = overflowY && tHeaderHeight ? 'block' : '';
2379
+ yTopCornerEl.style.display = tHeaderHeight && yScrollbarVisible === 'visible' ? 'block' : '';
2259
2380
  }
2260
2381
  const yWrapperEl = refScrollYWrapperElem.value;
2261
2382
  if (yWrapperEl) {
@@ -2266,7 +2387,7 @@ export default defineVxeComponent({
2266
2387
  if (yBottomCornerEl) {
2267
2388
  yBottomCornerEl.style.height = `${tFooterHeight}px`;
2268
2389
  yBottomCornerEl.style.top = `${tHeaderHeight + tbHeight}px`;
2269
- yBottomCornerEl.style.display = overflowY && tFooterHeight ? 'block' : '';
2390
+ yBottomCornerEl.style.display = tFooterHeight && yScrollbarVisible === 'visible' ? 'block' : '';
2270
2391
  }
2271
2392
  const rowExpandEl = refRowExpandElem.value;
2272
2393
  if (rowExpandEl) {
@@ -2956,10 +3077,17 @@ export default defineVxeComponent({
2956
3077
  $xeTable.setMergeCells(mergeCells);
2957
3078
  }
2958
3079
  };
3080
+ const handleDefaultMergeHeaderItems = () => {
3081
+ const { mergeHeaderCells } = props;
3082
+ if (mergeHeaderCells) {
3083
+ $xeTable.setMergeHeaderCells(mergeHeaderCells);
3084
+ }
3085
+ };
2959
3086
  const handleDefaultMergeFooterItems = () => {
2960
- const { mergeFooterItems } = props;
2961
- if (mergeFooterItems) {
2962
- $xeTable.setMergeFooterItems(mergeFooterItems);
3087
+ const { mergeFooterCells, mergeFooterItems } = props;
3088
+ const mFooterCells = mergeFooterCells || mergeFooterItems;
3089
+ if (mFooterCells) {
3090
+ $xeTable.setMergeFooterCells(mFooterCells);
2963
3091
  }
2964
3092
  };
2965
3093
  // 计算可视渲染相关数据
@@ -3396,6 +3524,10 @@ export default defineVxeComponent({
3396
3524
  }
3397
3525
  handleReserveStatus();
3398
3526
  $xeTable.checkSelectionStatus();
3527
+ $xeTable.dispatchEvent('data-change', {
3528
+ visibleColumn: internalData.visibleColumn,
3529
+ visibleData: internalData.afterFullData
3530
+ }, null);
3399
3531
  return new Promise(resolve => {
3400
3532
  nextTick()
3401
3533
  .then(() => handleRecalculateStyle(false, false, false))
@@ -3458,6 +3590,7 @@ export default defineVxeComponent({
3458
3590
  handleDefaultTreeExpand();
3459
3591
  handleDefaultRowGroupExpand();
3460
3592
  handleDefaultMergeCells();
3593
+ handleDefaultMergeHeaderItems();
3461
3594
  handleDefaultMergeFooterItems();
3462
3595
  nextTick(() => setTimeout(() => $xeTable.recalculate()));
3463
3596
  };
@@ -4903,7 +5036,9 @@ export default defineVxeComponent({
4903
5036
  }
4904
5037
  }
4905
5038
  }
4906
- return $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true);
5039
+ const rest = $xeTable.handleRowDragSwapEvent(null, true, dragRow, prevDragRow, dragPos || defPos, dragToChild === true);
5040
+ clearRowDragData();
5041
+ return rest;
4907
5042
  },
4908
5043
  /**
4909
5044
  * 获取表格的全量列
@@ -6774,6 +6909,10 @@ export default defineVxeComponent({
6774
6909
  }
6775
6910
  reactData.footerTableData = footData;
6776
6911
  $xeTable.handleUpdateFooterMerge();
6912
+ $xeTable.dispatchEvent('footer-data-change', {
6913
+ visibleColumn: internalData.visibleColumn,
6914
+ footData
6915
+ }, null);
6777
6916
  return nextTick();
6778
6917
  },
6779
6918
  /**
@@ -6841,39 +6980,85 @@ export default defineVxeComponent({
6841
6980
  return updateStyle();
6842
6981
  });
6843
6982
  },
6844
- setMergeFooterItems(merges) {
6983
+ setMergeHeaderCells(merges) {
6984
+ handleHeaderMerge(merges);
6985
+ $xeTable.handleUpdateHeaderMerge();
6986
+ return nextTick().then(() => {
6987
+ return updateStyle();
6988
+ });
6989
+ },
6990
+ /**
6991
+ * 移除表头单元格合并 [{row:Row|number, col:ColumnInfo|number}]
6992
+ */
6993
+ removeMergeHeaderCells(merges) {
6994
+ const rest = removeHeaderMerges(merges);
6995
+ $xeTable.handleUpdateHeaderMerge();
6996
+ return nextTick().then(() => {
6997
+ updateStyle();
6998
+ return rest;
6999
+ });
7000
+ },
7001
+ /**
7002
+ * 获取所有被合并的表头单元格
7003
+ */
7004
+ getMergeHeaderCells() {
7005
+ return internalData.mergeHeaderList.slice(0);
7006
+ },
7007
+ /**
7008
+ * 清除所有表头单元格合并
7009
+ */
7010
+ clearMergeHeaderCells() {
7011
+ internalData.mergeHeaderList = [];
7012
+ internalData.mergeHeaderMaps = {};
7013
+ internalData.mergeHeaderCellMaps = {};
7014
+ reactData.mergeHeadFlag++;
7015
+ return nextTick().then(() => {
7016
+ return updateStyle();
7017
+ });
7018
+ },
7019
+ setMergeFooterCells(merges) {
6845
7020
  if (props.footerSpanMethod) {
6846
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
7021
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method']);
6847
7022
  }
6848
7023
  handleFooterMerge(merges);
6849
7024
  $xeTable.handleUpdateFooterMerge();
6850
7025
  return nextTick().then(() => {
6851
- $xeTable.updateCellAreas();
6852
7026
  return updateStyle();
6853
7027
  });
6854
7028
  },
6855
- removeMergeFooterItems(merges) {
7029
+ setMergeFooterItems(merges) {
7030
+ // errLog('vxe.error.delFunc', ['setMergeFooterItems', 'setMergeFooterCells'])
7031
+ return $xeTable.setMergeFooterCells(merges);
7032
+ },
7033
+ removeMergeFooterCells(merges) {
6856
7034
  if (props.footerSpanMethod) {
6857
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
7035
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method']);
6858
7036
  }
6859
7037
  const rest = removeFooterMerges(merges);
6860
7038
  $xeTable.handleUpdateFooterMerge();
6861
7039
  return nextTick().then(() => {
6862
- $xeTable.updateCellAreas();
6863
7040
  updateStyle();
6864
7041
  return rest;
6865
7042
  });
6866
7043
  },
7044
+ removeMergeFooterItems(merges) {
7045
+ // errLog('vxe.error.delFunc', ['removeMergeFooterItems', 'removeMergeFooterCells'])
7046
+ return $xeTable.removeMergeFooterCells(merges);
7047
+ },
6867
7048
  /**
6868
7049
  * 获取所有被合并的表尾
6869
7050
  */
6870
- getMergeFooterItems() {
7051
+ getMergeFooterCells() {
6871
7052
  return internalData.mergeFooterList.slice(0);
6872
7053
  },
7054
+ getMergeFooterItems() {
7055
+ // errLog('vxe.error.delFunc', ['getMergeFooterItems', 'getMergeFooterCells'])
7056
+ return $xeTable.getMergeFooterCells();
7057
+ },
6873
7058
  /**
6874
7059
  * 清除所有表尾合并
6875
7060
  */
6876
- clearMergeFooterItems() {
7061
+ clearMergeFooterCells() {
6877
7062
  internalData.mergeFooterList = [];
6878
7063
  internalData.mergeFooterMaps = {};
6879
7064
  internalData.mergeFooterCellMaps = {};
@@ -6882,6 +7067,10 @@ export default defineVxeComponent({
6882
7067
  return updateStyle();
6883
7068
  });
6884
7069
  },
7070
+ clearMergeFooterItems() {
7071
+ // errLog('vxe.error.delFunc', ['clearMergeFooterItems', 'clearMergeFooterCells'])
7072
+ return $xeTable.clearMergeFooterCells();
7073
+ },
6885
7074
  updateCellAreas() {
6886
7075
  const { mouseConfig } = props;
6887
7076
  const mouseOpts = computeMouseOpts.value;
@@ -7627,12 +7816,17 @@ export default defineVxeComponent({
7627
7816
  }
7628
7817
  }
7629
7818
  };
7819
+ const clearCrossTableDragStatus = () => {
7820
+ crossTableDragRowObj = null;
7821
+ crossTableDragRowInfo.row = null;
7822
+ };
7630
7823
  const clearDragStatus = () => {
7631
7824
  const { dragRow, dragCol } = reactData;
7632
7825
  if (dragRow || dragCol) {
7633
7826
  clearColDropOrigin();
7634
7827
  clearRowDropOrigin();
7635
7828
  hideDropTip();
7829
+ clearCrossTableDragStatus();
7636
7830
  reactData.dragRow = null;
7637
7831
  reactData.dragCol = null;
7638
7832
  }
@@ -7821,6 +8015,24 @@ export default defineVxeComponent({
7821
8015
  cdLineEl.style.display = '';
7822
8016
  }
7823
8017
  };
8018
+ const clearRowDragData = () => {
8019
+ let wrapperEl = refElem.value;
8020
+ const dtClss = ['.vxe-body--row'];
8021
+ if ($xeGantt) {
8022
+ const { refGanttContainerElem } = $xeGantt.getRefMaps();
8023
+ const ganttContainerElem = refGanttContainerElem.value;
8024
+ if (ganttContainerElem) {
8025
+ wrapperEl = ganttContainerElem;
8026
+ }
8027
+ dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row');
8028
+ }
8029
+ hideDropTip();
8030
+ clearRowDropOrigin();
8031
+ clearRowAnimate(wrapperEl, dtClss);
8032
+ internalData.prevDragToChild = false;
8033
+ reactData.dragRow = null;
8034
+ reactData.dragCol = null;
8035
+ };
7824
8036
  /**
7825
8037
  * 处理显示 tooltip
7826
8038
  * @param {Event} evnt 事件
@@ -8922,6 +9134,11 @@ export default defineVxeComponent({
8922
9134
  internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList);
8923
9135
  reactData.mergeBodyFlag++;
8924
9136
  },
9137
+ handleUpdateHeaderMerge() {
9138
+ const { mergeHeaderList } = internalData;
9139
+ internalData.mergeHeaderCellMaps = buildMergeData(mergeHeaderList);
9140
+ reactData.mergeHeadFlag++;
9141
+ },
8925
9142
  handleUpdateFooterMerge() {
8926
9143
  const { mergeFooterList } = internalData;
8927
9144
  internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList);
@@ -9860,6 +10077,221 @@ export default defineVxeComponent({
9860
10077
  }
9861
10078
  return Promise.resolve(errRest);
9862
10079
  },
10080
+ /**
10081
+ * 处理跨表拖拽完成
10082
+ */
10083
+ handleCrossTableRowDragFinishEvent(evnt) {
10084
+ const { tableData } = reactData;
10085
+ const { fullAllDataRowIdData } = internalData;
10086
+ const rowOpts = computeRowOpts.value;
10087
+ const cellOpts = computeCellOpts.value;
10088
+ const defaultRowHeight = computeDefaultRowHeight.value;
10089
+ const rowDragOpts = computeRowDragOpts.value;
10090
+ const { animation, isCrossTableDrag } = rowDragOpts;
10091
+ const treeOpts = computeTreeOpts.value;
10092
+ const { mapChildrenField } = treeOpts;
10093
+ const el = refElem.value;
10094
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
10095
+ const { row: dragRow } = crossTableDragRowInfo;
10096
+ if (dragRow) {
10097
+ const dragRowid = getRowid($xeTable, dragRow);
10098
+ const dragRowRest = fullAllDataRowIdData[dragRowid];
10099
+ let dragRowHeight = 0;
10100
+ let rsIndex = -1;
10101
+ if (dragRowRest) {
10102
+ if (animation) {
10103
+ dragRowHeight = getCellRestHeight(dragRowRest, cellOpts, rowOpts, defaultRowHeight);
10104
+ }
10105
+ rsIndex = dragRowRest.$index;
10106
+ }
10107
+ const dragRangeList = rsIndex > -1 && rsIndex < tableData.length - 1 ? tableData.slice(rsIndex + 1) : [];
10108
+ const dragList = XEUtils.toTreeArray([dragRow], {
10109
+ updated: true,
10110
+ children: mapChildrenField
10111
+ });
10112
+ $xeTable.remove(dragList).then(() => {
10113
+ if (animation && dragRowHeight && dragRangeList.length) {
10114
+ const $xeGanttView = internalData.xeGanttView;
10115
+ let wrapperEl = el;
10116
+ if ($xeGantt && $xeGanttView) {
10117
+ const { refGanttContainerElem } = $xeGantt.getRefMaps();
10118
+ const ganttContainerElem = refGanttContainerElem.value;
10119
+ if (ganttContainerElem) {
10120
+ wrapperEl = ganttContainerElem;
10121
+ }
10122
+ }
10123
+ const dtClss = [];
10124
+ dragRangeList.forEach(row => {
10125
+ const rowid = getRowid($xeTable, row);
10126
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`);
10127
+ if ($xeGantt) {
10128
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`);
10129
+ }
10130
+ });
10131
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
10132
+ moveRowAnimateToTb(dtTrList, dragRowHeight);
10133
+ }
10134
+ });
10135
+ dispatchEvent('row-remove-dragend', {
10136
+ row: dragRow
10137
+ }, evnt);
10138
+ clearRowDragData();
10139
+ clearCrossTableDragStatus();
10140
+ }
10141
+ }
10142
+ },
10143
+ /**
10144
+ * 处理跨表拖至新的空表
10145
+ */
10146
+ handleCrossTableRowDragoverEmptyEvent(evnt) {
10147
+ const { tableData } = reactData;
10148
+ const rowDragOpts = computeRowDragOpts.value;
10149
+ const { isCrossTableDrag } = rowDragOpts;
10150
+ if (isCrossTableDrag && crossTableDragRowObj && !tableData.length) {
10151
+ const { $oldTable } = crossTableDragRowObj;
10152
+ if ($oldTable && $oldTable.xID !== $xeTable.xID) {
10153
+ evnt.preventDefault();
10154
+ crossTableDragRowObj.$newTable = $xeTable;
10155
+ internalData.prevDragRow = null;
10156
+ }
10157
+ }
10158
+ },
10159
+ /**
10160
+ * 处理跨表拖插入
10161
+ */
10162
+ handleCrossTableRowDragInsertEvent(evnt) {
10163
+ const { treeConfig } = props;
10164
+ const { prevDragRow, prevDragPos, prevDragToChild } = internalData;
10165
+ const rowDragOpts = computeRowDragOpts.value;
10166
+ const { animation, isSelfToChildDrag, isCrossTableDrag, dragEndMethod, dragToChildMethod } = rowDragOpts;
10167
+ const rowOpts = computeRowOpts.value;
10168
+ const cellOpts = computeCellOpts.value;
10169
+ const defaultRowHeight = computeDefaultRowHeight.value;
10170
+ const treeOpts = computeTreeOpts.value;
10171
+ const { parentField, mapChildrenField } = treeOpts;
10172
+ const childrenField = treeOpts.children || treeOpts.childrenField;
10173
+ // 跨表拖拽
10174
+ if (isCrossTableDrag && crossTableDragRowObj && crossTableDragRowInfo) {
10175
+ const { row: oldRow } = crossTableDragRowInfo;
10176
+ const { $oldTable } = crossTableDragRowObj;
10177
+ const el = refElem.value;
10178
+ if ($oldTable && oldRow) {
10179
+ const dragRow = oldRow;
10180
+ let dragOffsetIndex = -1;
10181
+ if (prevDragRow) {
10182
+ dragOffsetIndex = prevDragPos === 'bottom' ? 1 : 0;
10183
+ }
10184
+ const dragParams = {
10185
+ oldRow: dragRow,
10186
+ newRow: prevDragRow,
10187
+ dragRow,
10188
+ dragPos: prevDragPos,
10189
+ dragToChild: !!prevDragToChild,
10190
+ offsetIndex: dragOffsetIndex
10191
+ };
10192
+ const isDragToChildFlag = isSelfToChildDrag && dragToChildMethod ? dragToChildMethod(dragParams) : prevDragToChild;
10193
+ const errRest = {
10194
+ status: false
10195
+ };
10196
+ Promise.resolve(dragEndMethod ? dragEndMethod(dragParams) : true).then((status) => {
10197
+ if (!status) {
10198
+ return errRest;
10199
+ }
10200
+ let insertRest = Promise.resolve();
10201
+ if (treeConfig) {
10202
+ const dragList = XEUtils.toTreeArray([dragRow], {
10203
+ updated: true,
10204
+ children: mapChildrenField
10205
+ });
10206
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt);
10207
+ if (prevDragRow) {
10208
+ dragRow[parentField] = prevDragRow[parentField];
10209
+ }
10210
+ else {
10211
+ dragRow[parentField] = null;
10212
+ }
10213
+ dragList.forEach(row => {
10214
+ row[childrenField] = undefined;
10215
+ row[mapChildrenField] = undefined;
10216
+ });
10217
+ if (prevDragRow) {
10218
+ if (prevDragPos === 'bottom') {
10219
+ insertRest = $xeTable.insertNextAt(dragList, prevDragRow);
10220
+ }
10221
+ else {
10222
+ insertRest = $xeTable.insertAt(dragList, prevDragRow);
10223
+ }
10224
+ }
10225
+ else {
10226
+ insertRest = $xeTable.insert(dragList);
10227
+ }
10228
+ }
10229
+ else {
10230
+ $oldTable.handleCrossTableRowDragFinishEvent(evnt);
10231
+ if (prevDragRow) {
10232
+ if (prevDragPos === 'bottom') {
10233
+ insertRest = $xeTable.insertNextAt(dragRow, prevDragRow);
10234
+ }
10235
+ else {
10236
+ insertRest = $xeTable.insertAt(dragRow, prevDragRow);
10237
+ }
10238
+ }
10239
+ else {
10240
+ insertRest = $xeTable.insert(dragRow);
10241
+ }
10242
+ }
10243
+ dispatchEvent('row-insert-dragend', {
10244
+ oldRow,
10245
+ newRow: prevDragRow,
10246
+ dragRow,
10247
+ dragPos: prevDragPos,
10248
+ dragToChild: isDragToChildFlag,
10249
+ offsetIndex: dragOffsetIndex
10250
+ }, evnt);
10251
+ clearRowDragData();
10252
+ insertRest.then(() => {
10253
+ const { tableData } = reactData;
10254
+ const { fullAllDataRowIdData } = internalData;
10255
+ const oldRowid = getRowid($xeTable, dragRow);
10256
+ const oldRowRest = fullAllDataRowIdData[oldRowid];
10257
+ let dragRowHeight = 0;
10258
+ let rsIndex = -1;
10259
+ if (oldRowRest) {
10260
+ if (animation) {
10261
+ dragRowHeight = getCellRestHeight(oldRowRest, cellOpts, rowOpts, defaultRowHeight);
10262
+ }
10263
+ rsIndex = oldRowRest.$index;
10264
+ }
10265
+ const dragRangeList = rsIndex > -1 ? tableData.slice(rsIndex) : [];
10266
+ if (animation && dragRowHeight && dragRangeList.length) {
10267
+ const $xeGanttView = internalData.xeGanttView;
10268
+ let wrapperEl = el;
10269
+ if ($xeGantt && $xeGanttView) {
10270
+ const { refGanttContainerElem } = $xeGantt.getRefMaps();
10271
+ const ganttContainerElem = refGanttContainerElem.value;
10272
+ if (ganttContainerElem) {
10273
+ wrapperEl = ganttContainerElem;
10274
+ }
10275
+ }
10276
+ const dtClss = [];
10277
+ dragRangeList.forEach(row => {
10278
+ const rowid = getRowid($xeTable, row);
10279
+ dtClss.push(`.vxe-body--row[rowid="${rowid}"]`);
10280
+ if ($xeGantt) {
10281
+ dtClss.push(`.vxe-gantt-view--body-row[rowid="${rowid}"]`, `.vxe-gantt-view--chart-row[rowid="${rowid}"]`);
10282
+ }
10283
+ });
10284
+ const dtTrList = wrapperEl.querySelectorAll(dtClss.join(','));
10285
+ moveRowAnimateToTb(dtTrList, -dragRowHeight);
10286
+ }
10287
+ });
10288
+ });
10289
+ }
10290
+ }
10291
+ },
10292
+ hideCrossTableRowDropClearStatus() {
10293
+ hideDropTip();
10294
+ },
9863
10295
  handleRowDragDragendEvent(evnt) {
9864
10296
  const { treeConfig } = props;
9865
10297
  const { fullAllDataRowIdData, prevDragToChild } = internalData;
@@ -9868,7 +10300,16 @@ export default defineVxeComponent({
9868
10300
  const { lazy } = treeOpts;
9869
10301
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
9870
10302
  const { prevDragRow, prevDragPos } = internalData;
9871
- let wrapperEl = refElem.value;
10303
+ const rowDragOpts = computeRowDragOpts.value;
10304
+ const { isCrossTableDrag } = rowDragOpts;
10305
+ // 跨表拖拽
10306
+ if (isCrossTableDrag && crossTableDragRowObj) {
10307
+ const { $newTable } = crossTableDragRowObj;
10308
+ if ($newTable && $newTable.xID !== $xeTable.xID) {
10309
+ $newTable.handleCrossTableRowDragInsertEvent(evnt);
10310
+ return;
10311
+ }
10312
+ }
9872
10313
  if (treeConfig && lazy && prevDragToChild) {
9873
10314
  // 懒加载
9874
10315
  const newRowid = getRowid($xeTable, prevDragRow);
@@ -9885,21 +10326,8 @@ export default defineVxeComponent({
9885
10326
  else {
9886
10327
  $xeTable.handleRowDragSwapEvent(evnt, true, dragRow, prevDragRow, prevDragPos, prevDragToChild);
9887
10328
  }
9888
- const dtClss = ['.vxe-body--row'];
9889
- if ($xeGantt) {
9890
- const { refGanttContainerElem } = $xeGantt.getRefMaps();
9891
- const ganttContainerElem = refGanttContainerElem.value;
9892
- if (ganttContainerElem) {
9893
- wrapperEl = ganttContainerElem;
9894
- }
9895
- dtClss.push('.vxe-gantt-view--body-row', '.vxe-gantt-view--chart-row');
9896
- }
9897
- hideDropTip();
9898
- clearRowDropOrigin();
9899
- clearRowAnimate(wrapperEl, dtClss);
9900
- internalData.prevDragToChild = false;
9901
- reactData.dragRow = null;
9902
- reactData.dragCol = null;
10329
+ clearRowDragData();
10330
+ clearCrossTableDragStatus();
9903
10331
  },
9904
10332
  handleRowDragDragoverEvent(evnt) {
9905
10333
  const { treeConfig } = props;
@@ -9909,8 +10337,8 @@ export default defineVxeComponent({
9909
10337
  const { lazy, transform, parentField } = treeOpts;
9910
10338
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
9911
10339
  const rowDragOpts = computeRowDragOpts.value;
9912
- const { isPeerDrag, isCrossDrag, isToChildDrag } = rowDragOpts;
9913
- if (!dragRow) {
10340
+ const { isPeerDrag, isCrossDrag, isToChildDrag, isCrossTableDrag } = rowDragOpts;
10341
+ if (!dragRow && !(isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj)) {
9914
10342
  evnt.preventDefault();
9915
10343
  return;
9916
10344
  }
@@ -9919,16 +10347,38 @@ export default defineVxeComponent({
9919
10347
  const rowid = trEl.getAttribute('rowid') || '';
9920
10348
  const rest = fullAllDataRowIdData[rowid];
9921
10349
  if (rest) {
10350
+ evnt.preventDefault();
9922
10351
  const row = rest.row;
9923
10352
  const rowid = getRowid($xeTable, row);
9924
10353
  const rowRest = fullAllDataRowIdData[rowid];
9925
- evnt.preventDefault();
9926
- const { dragRow } = reactData;
9927
10354
  const offsetY = evnt.clientY - trEl.getBoundingClientRect().y;
9928
10355
  const dragPos = offsetY < trEl.clientHeight / 2 ? 'top' : 'bottom';
9929
10356
  internalData.prevDragToChild = !!(treeConfig && transform && (isCrossDrag && isToChildDrag) && isControlKey);
9930
10357
  internalData.prevDragRow = row;
9931
10358
  internalData.prevDragPos = dragPos;
10359
+ // 跨表拖拽
10360
+ if (isCrossTableDrag && (!treeConfig || isCrossDrag) && crossTableDragRowObj) {
10361
+ const { $oldTable, $newTable } = crossTableDragRowObj;
10362
+ if ($oldTable) {
10363
+ const oldTableReactData = $oldTable.reactData;
10364
+ if ($oldTable.xID === $xeTable.xID) {
10365
+ if ($newTable) {
10366
+ $newTable.hideCrossTableRowDropClearStatus();
10367
+ }
10368
+ reactData.isCrossDragRow = false;
10369
+ oldTableReactData.isCrossDragRow = false;
10370
+ crossTableDragRowObj.$newTable = null;
10371
+ }
10372
+ else {
10373
+ $oldTable.hideCrossTableRowDropClearStatus();
10374
+ oldTableReactData.isCrossDragRow = true;
10375
+ reactData.dragTipText = oldTableReactData.dragTipText;
10376
+ crossTableDragRowObj.$newTable = $xeTable;
10377
+ showDropTip(evnt, trEl, null, true, dragPos);
10378
+ return;
10379
+ }
10380
+ }
10381
+ }
9932
10382
  if ($xeTable.eqRow(dragRow, row) ||
9933
10383
  (isControlKey && treeConfig && lazy && row[hasChildField] && rowRest && !rowRest.treeLoaded) ||
9934
10384
  (!isCrossDrag && treeConfig && transform && (isPeerDrag ? dragRow[parentField] !== row[parentField] : rest.level))) {
@@ -9948,7 +10398,7 @@ export default defineVxeComponent({
9948
10398
  evnt.stopPropagation();
9949
10399
  const { dragConfig } = props;
9950
10400
  const rowDragOpts = computeRowDragOpts.value;
9951
- const { trigger, dragStartMethod } = rowDragOpts;
10401
+ const { isCrossTableDrag, trigger, dragStartMethod } = rowDragOpts;
9952
10402
  const { row } = params;
9953
10403
  const dragEl = evnt.currentTarget;
9954
10404
  const tdEl = trigger === 'cell' || trigger === 'row' ? dragEl : (_a = dragEl.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement;
@@ -9959,10 +10409,16 @@ export default defineVxeComponent({
9959
10409
  trEl.draggable = false;
9960
10410
  reactData.dragRow = null;
9961
10411
  reactData.dragCol = null;
10412
+ clearCrossTableDragStatus();
9962
10413
  hideDropTip();
9963
10414
  return;
9964
10415
  }
10416
+ if (isCrossTableDrag) {
10417
+ crossTableDragRowInfo.row = row;
10418
+ crossTableDragRowObj = { $oldTable: $xeTable, $newTable: null };
10419
+ }
9965
10420
  reactData.dragRow = row;
10421
+ reactData.isCrossDragRow = false;
9966
10422
  reactData.dragCol = null;
9967
10423
  trEl.draggable = true;
9968
10424
  updateRowDropOrigin(row);
@@ -10273,6 +10729,7 @@ export default defineVxeComponent({
10273
10729
  internalData.prevDragToChild = false;
10274
10730
  reactData.dragRow = null;
10275
10731
  reactData.dragCol = null;
10732
+ clearCrossTableDragStatus();
10276
10733
  },
10277
10734
  handleHeaderCellDragDragoverEvent(evnt) {
10278
10735
  const { dragCol } = reactData;
@@ -10351,12 +10808,14 @@ export default defineVxeComponent({
10351
10808
  thEl.draggable = false;
10352
10809
  reactData.dragRow = null;
10353
10810
  reactData.dragCol = null;
10811
+ clearCrossTableDragStatus();
10354
10812
  hideDropTip();
10355
10813
  return;
10356
10814
  }
10357
10815
  reactData.dragCol = column;
10358
10816
  reactData.dragRow = null;
10359
10817
  thEl.draggable = true;
10818
+ clearCrossTableDragStatus();
10360
10819
  updateColDropOrigin(column);
10361
10820
  updateColDropTipContent(thEl);
10362
10821
  dispatchEvent('column-dragstart', params, evnt);
@@ -10364,6 +10823,7 @@ export default defineVxeComponent({
10364
10823
  handleHeaderCellDragMouseupEvent() {
10365
10824
  clearColDropOrigin();
10366
10825
  hideDropTip();
10826
+ clearCrossTableDragStatus();
10367
10827
  reactData.dragRow = null;
10368
10828
  reactData.dragCol = null;
10369
10829
  },
@@ -11252,8 +11712,9 @@ export default defineVxeComponent({
11252
11712
  const rTipSlot = rowDragSlots.tip || (dragConfig && dragConfig.slots ? dragConfig.slots.rowTip : null);
11253
11713
  const columnDragSlots = columnDragOpts.slots || {};
11254
11714
  const cTipSlot = columnDragSlots.tip;
11255
- if (dragRow && rTipSlot) {
11256
- return callSlot(rTipSlot, { row: dragRow });
11715
+ const dRow = dragRow || (rowDragOpts.isCrossTableDrag ? crossTableDragRowInfo.row : null);
11716
+ if (dRow && rTipSlot) {
11717
+ return callSlot(rTipSlot, { row: dRow });
11257
11718
  }
11258
11719
  if (dragCol && cTipSlot) {
11259
11720
  return callSlot(cTipSlot, { column: dragCol });
@@ -11266,6 +11727,7 @@ export default defineVxeComponent({
11266
11727
  const columnOpts = computeColumnOpts.value;
11267
11728
  const rowDragOpts = computeRowDragOpts.value;
11268
11729
  const columnDragOpts = computeColumnDragOpts.value;
11730
+ const dRow = dragRow || (rowDragOpts.isCrossTableDrag ? crossTableDragRowInfo.row : null);
11269
11731
  if (rowOpts.drag || columnOpts.drag) {
11270
11732
  return h('div', {
11271
11733
  class: 'vxe-table--drag-wrapper'
@@ -11282,7 +11744,7 @@ export default defineVxeComponent({
11282
11744
  'is--guides': columnDragOpts.showGuidesStatus
11283
11745
  }]
11284
11746
  }),
11285
- (dragRow && rowDragOpts.showDragTip) || (dragCol && columnDragOpts.showDragTip)
11747
+ (dRow && rowDragOpts.showDragTip) || (dragCol && columnDragOpts.showDragTip)
11286
11748
  ? h('div', {
11287
11749
  ref: refDragTipElem,
11288
11750
  class: 'vxe-table--drag-sort-tip'
@@ -11294,7 +11756,7 @@ export default defineVxeComponent({
11294
11756
  class: 'vxe-table--drag-sort-tip-status'
11295
11757
  }, [
11296
11758
  h('span', {
11297
- class: ['vxe-table--drag-sort-tip-normal-status', dragRow ? getIcon().TABLE_DRAG_STATUS_ROW : getIcon().TABLE_DRAG_STATUS_COLUMN]
11759
+ class: ['vxe-table--drag-sort-tip-normal-status', dRow ? getIcon().TABLE_DRAG_STATUS_ROW : getIcon().TABLE_DRAG_STATUS_COLUMN]
11298
11760
  }),
11299
11761
  h('span', {
11300
11762
  class: ['vxe-table--drag-sort-tip-sub-status', getIcon().TABLE_DRAG_STATUS_SUB_ROW]
@@ -11435,7 +11897,10 @@ export default defineVxeComponent({
11435
11897
  ref: refScrollXSpaceElem,
11436
11898
  class: 'vxe-table--scroll-x-space'
11437
11899
  })
11438
- ])
11900
+ ]),
11901
+ h('div', {
11902
+ class: 'vxe-table--scroll-x-handle-appearance'
11903
+ })
11439
11904
  ]),
11440
11905
  h('div', {
11441
11906
  ref: refScrollXRightCornerElem,
@@ -11465,7 +11930,10 @@ export default defineVxeComponent({
11465
11930
  ref: refScrollYSpaceElem,
11466
11931
  class: 'vxe-table--scroll-y-space'
11467
11932
  })
11468
- ])
11933
+ ]),
11934
+ h('div', {
11935
+ class: 'vxe-table--scroll-y-handle-appearance'
11936
+ })
11469
11937
  ]),
11470
11938
  h('div', {
11471
11939
  ref: refScrollYBottomCornerElem,
@@ -11543,6 +12011,7 @@ export default defineVxeComponent({
11543
12011
  const { teleportToWrapperElem } = internalData;
11544
12012
  const { leftList, rightList } = columnStore;
11545
12013
  const loadingSlot = slots.loading;
12014
+ const rowDragOpts = computeRowDragOpts.value;
11546
12015
  const tableTipConfig = computeTableTipConfig.value;
11547
12016
  const validTipConfig = computeValidTipConfig.value;
11548
12017
  const validOpts = computeValidOpts.value;
@@ -11562,6 +12031,11 @@ export default defineVxeComponent({
11562
12031
  const columnDragOpts = computeColumnDragOpts.value;
11563
12032
  const scrollbarXToTop = computeScrollbarXToTop.value;
11564
12033
  const scrollbarYToLeft = computeScrollbarYToLeft.value;
12034
+ const { isCrossTableDrag } = rowDragOpts;
12035
+ const rwOns = {};
12036
+ if (isCrossTableDrag && !tableData.length) {
12037
+ rwOns.onDragover = $xeTable.handleCrossTableRowDragoverEmptyEvent;
12038
+ }
11565
12039
  return h('div', {
11566
12040
  ref: refElem,
11567
12041
  class: ['vxe-table', 'vxe-table--render-default', `tid_${xID}`, `border--${tableBorder}`, `sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`, `sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`, {
@@ -11621,10 +12095,7 @@ export default defineVxeComponent({
11621
12095
  class: 'vxe-table-var-mini'
11622
12096
  })
11623
12097
  ]),
11624
- h('div', {
11625
- key: 'tw',
11626
- class: 'vxe-table--render-wrapper'
11627
- }, scrollbarXToTop
12098
+ h('div', Object.assign({ key: 'tw', class: 'vxe-table--render-wrapper' }, rwOns), scrollbarXToTop
11628
12099
  ? [
11629
12100
  renderScrollX(),
11630
12101
  renderBody()
@@ -11939,15 +12410,32 @@ export default defineVxeComponent({
11939
12410
  watch(mergeCellFlag, () => {
11940
12411
  handleUpdateMergeBodyCells(props.mergeCells || []);
11941
12412
  });
11942
- const mergeFooterItemFlag = ref(0);
12413
+ const mergeHeaderItemFlag = ref(0);
12414
+ watch(() => props.mergeHeaderCells ? props.mergeHeaderCells.length : -1, () => {
12415
+ mergeHeaderItemFlag.value++;
12416
+ });
12417
+ watch(() => props.mergeHeaderCells, () => {
12418
+ mergeHeaderItemFlag.value++;
12419
+ });
12420
+ watch(mergeHeaderItemFlag, () => {
12421
+ handleUpdateMergeHeaderCells(props.mergeHeaderCells || []);
12422
+ });
12423
+ const mergeFooteCellFlag = ref(0);
12424
+ watch(() => props.mergeFooterCells ? props.mergeFooterCells.length : -1, () => {
12425
+ mergeFooteCellFlag.value++;
12426
+ });
12427
+ watch(() => props.mergeFooterCells, () => {
12428
+ mergeFooteCellFlag.value++;
12429
+ });
11943
12430
  watch(() => props.mergeFooterItems ? props.mergeFooterItems.length : -1, () => {
11944
- mergeFooterItemFlag.value++;
12431
+ mergeFooteCellFlag.value++;
11945
12432
  });
11946
12433
  watch(() => props.mergeFooterItems, () => {
11947
- mergeFooterItemFlag.value++;
12434
+ mergeFooteCellFlag.value++;
11948
12435
  });
11949
- watch(mergeFooterItemFlag, () => {
11950
- handleUpdateMergeFooterCells(props.mergeFooterItems || []);
12436
+ watch(mergeFooteCellFlag, () => {
12437
+ const mFooterCells = props.mergeFooterCells || props.mergeFooterItems;
12438
+ handleUpdateMergeFooterCells(mFooterCells || []);
11951
12439
  });
11952
12440
  watch(computeRowGroupFields, (val) => {
11953
12441
  handleUpdateRowGroup(val);
@@ -12028,6 +12516,7 @@ export default defineVxeComponent({
12028
12516
  const currentColumnOpts = computeCurrentColumnOpts.value;
12029
12517
  const keyboardOpts = computeKeyboardOpts.value;
12030
12518
  const aggregateOpts = computeAggregateOpts.value;
12519
+ const rowDragOpts = computeRowDragOpts.value;
12031
12520
  if (props.rowId) {
12032
12521
  warnLog('vxe.error.delProp', ['row-id', 'row-config.keyField']);
12033
12522
  }
@@ -12129,7 +12618,10 @@ export default defineVxeComponent({
12129
12618
  }
12130
12619
  }
12131
12620
  if (treeConfig && rowOpts.drag && !treeOpts.transform) {
12132
- errLog('vxe.error.notSupportProp', ['column-config.drag', 'tree-config.transform=false', 'tree-config.transform=true']);
12621
+ errLog('vxe.error.notSupportProp', ['row-config.drag', 'tree-config.transform=false', 'tree-config.transform=true']);
12622
+ }
12623
+ if (treeConfig && rowDragOpts.isCrossTableDrag && !rowDragOpts.isCrossDrag) {
12624
+ errLog('vxe.error.reqSupportProp', ['tree-config & row-drag-config.isCrossTableDrag', 'row-drag-config.isCrossDrag']);
12133
12625
  }
12134
12626
  if (props.dragConfig) {
12135
12627
  warnLog('vxe.error.delProp', ['drag-config', 'row-drag-config']);