vxe-table 4.16.1 → 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 (65) 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/src/column.js +2 -0
  7. package/es/table/src/columnInfo.js +1 -0
  8. package/es/table/src/emits.js +3 -0
  9. package/es/table/src/header.js +47 -16
  10. package/es/table/src/props.js +11 -3
  11. package/es/table/src/table.js +257 -51
  12. package/es/table/src/util.js +70 -2
  13. package/es/table/style.css +11 -17
  14. package/es/table/style.min.css +1 -1
  15. package/es/ui/index.js +2 -2
  16. package/es/ui/src/log.js +1 -1
  17. package/es/vxe-table/style.css +11 -17
  18. package/es/vxe-table/style.min.css +1 -1
  19. package/lib/grid/src/grid.js +1 -1
  20. package/lib/grid/src/grid.min.js +1 -1
  21. package/lib/index.css +1 -1
  22. package/lib/index.min.css +1 -1
  23. package/lib/index.umd.js +181 -38
  24. package/lib/index.umd.min.js +1 -1
  25. package/lib/style.css +1 -1
  26. package/lib/style.min.css +1 -1
  27. package/lib/table/src/column.js +2 -0
  28. package/lib/table/src/column.min.js +1 -1
  29. package/lib/table/src/columnInfo.js +1 -0
  30. package/lib/table/src/columnInfo.min.js +1 -1
  31. package/lib/table/src/emits.js +1 -1
  32. package/lib/table/src/emits.min.js +1 -1
  33. package/lib/table/src/header.js +62 -13
  34. package/lib/table/src/header.min.js +1 -1
  35. package/lib/table/src/props.js +11 -3
  36. package/lib/table/src/props.min.js +1 -1
  37. package/lib/table/src/table.js +24 -13
  38. package/lib/table/src/table.min.js +1 -1
  39. package/lib/table/src/util.js +74 -2
  40. package/lib/table/src/util.min.js +1 -1
  41. package/lib/table/style/style.css +11 -17
  42. package/lib/table/style/style.min.css +1 -1
  43. package/lib/ui/index.js +2 -2
  44. package/lib/ui/index.min.js +1 -1
  45. package/lib/ui/src/log.js +1 -1
  46. package/lib/ui/src/log.min.js +1 -1
  47. package/lib/vxe-table/style/style.css +11 -17
  48. package/lib/vxe-table/style/style.min.css +1 -1
  49. package/package.json +2 -2
  50. package/packages/grid/src/grid.ts +1 -1
  51. package/packages/table/src/column.ts +2 -0
  52. package/packages/table/src/columnInfo.ts +1 -0
  53. package/packages/table/src/emits.ts +4 -0
  54. package/packages/table/src/header.ts +49 -17
  55. package/packages/table/src/props.ts +11 -3
  56. package/packages/table/src/table.ts +258 -50
  57. package/packages/table/src/util.ts +76 -2
  58. package/packages/ui/index.ts +1 -1
  59. package/styles/components/table.scss +33 -55
  60. /package/es/{iconfont.1756272578850.ttf → iconfont.1756452373591.ttf} +0 -0
  61. /package/es/{iconfont.1756272578850.woff → iconfont.1756452373591.woff} +0 -0
  62. /package/es/{iconfont.1756272578850.woff2 → iconfont.1756452373591.woff2} +0 -0
  63. /package/lib/{iconfont.1756272578850.ttf → iconfont.1756452373591.ttf} +0 -0
  64. /package/lib/{iconfont.1756272578850.woff → iconfont.1756452373591.woff} +0 -0
  65. /package/lib/{iconfont.1756272578850.woff2 → iconfont.1756452373591.woff2} +0 -0
@@ -260,6 +260,7 @@ export default defineVxeComponent({
260
260
  pendingRowFlag: 1,
261
261
  insertRowFlag: 1,
262
262
  removeRowFlag: 1,
263
+ mergeHeadFlag: 1,
263
264
  mergeBodyFlag: 1,
264
265
  mergeFootFlag: 1,
265
266
  rowHeightStore: {
@@ -1126,15 +1127,62 @@ export default defineVxeComponent({
1126
1127
  });
1127
1128
  }
1128
1129
  };
1129
- const handleUpdateMergeFooterCells = (merges) => {
1130
- internalData.mergeFooterList = [];
1131
- internalData.mergeFooterMaps = {};
1132
- internalData.mergeFooterCellMaps = {};
1133
- $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;
1134
1176
  };
1135
- 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) => {
1136
1184
  const { footerTableData } = reactData;
1137
- const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData;
1185
+ const { mergeHeaderList, mergeHeaderMaps, fullColumnIdData } = internalData;
1138
1186
  if (merges) {
1139
1187
  const { visibleColumn } = internalData;
1140
1188
  if (!XEUtils.isArray(merges)) {
@@ -1160,7 +1208,7 @@ export default defineVxeComponent({
1160
1208
  if (rowspan > 1 || colspan > 1) {
1161
1209
  const row = footerTableData[mergeRowIndex];
1162
1210
  const column = visibleColumn[mergeColumnIndex];
1163
- let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1211
+ let mergeItem = mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1164
1212
  if (mergeItem) {
1165
1213
  mergeItem.rowspan = rowspan;
1166
1214
  mergeItem.colspan = colspan;
@@ -1178,36 +1226,25 @@ export default defineVxeComponent({
1178
1226
  _rowspan: rowspan,
1179
1227
  _colspan: colspan
1180
1228
  };
1181
- mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1182
- mergeFooterList.push(mergeItem);
1229
+ mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1230
+ mergeHeaderList.push(mergeItem);
1183
1231
  }
1184
1232
  }
1185
1233
  }
1186
1234
  });
1187
1235
  }
1188
1236
  };
1189
- const removeBodyMerges = (merges) => {
1190
- const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData;
1237
+ const removeHeaderMerges = (merges) => {
1238
+ const { mergeHeaderList, fullColumnIdData, mergeHeaderMaps } = internalData;
1191
1239
  const rest = [];
1192
1240
  if (merges) {
1193
- const { handleGetRowId } = createHandleGetRowId($xeTable);
1194
1241
  if (!XEUtils.isArray(merges)) {
1195
1242
  merges = [merges];
1196
1243
  }
1197
1244
  merges.forEach((item) => {
1198
1245
  const { row: margeRow, col: margeCol } = item;
1199
- let mergeRowIndex = -1;
1246
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1;
1200
1247
  let mergeColumnIndex = -1;
1201
- if (XEUtils.isNumber(margeRow)) {
1202
- mergeRowIndex = margeRow;
1203
- }
1204
- else {
1205
- const rowid = margeRow ? handleGetRowId(margeRow) : null;
1206
- const rowRest = rowid ? fullAllDataRowIdData[rowid] : null;
1207
- if (rowRest) {
1208
- mergeRowIndex = rowRest._index;
1209
- }
1210
- }
1211
1248
  if (XEUtils.isNumber(margeCol)) {
1212
1249
  mergeColumnIndex = margeCol;
1213
1250
  }
@@ -1218,14 +1255,14 @@ export default defineVxeComponent({
1218
1255
  mergeColumnIndex = colRest._index;
1219
1256
  }
1220
1257
  }
1221
- 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);
1222
1259
  if (mcIndex > -1) {
1223
- const rItems = mergeBodyList.splice(mcIndex, 1);
1260
+ const rItems = mergeHeaderList.splice(mcIndex, 1);
1224
1261
  const item = rItems[0];
1225
1262
  if (item) {
1226
- rest.push(rItems[0]);
1227
- if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1228
- delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1263
+ rest.push(item);
1264
+ if (mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1265
+ delete mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1229
1266
  }
1230
1267
  }
1231
1268
  }
@@ -1233,6 +1270,66 @@ export default defineVxeComponent({
1233
1270
  }
1234
1271
  return rest;
1235
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
+ };
1236
1333
  const removeFooterMerges = (merges) => {
1237
1334
  const { mergeFooterList, fullColumnIdData, mergeFooterMaps } = internalData;
1238
1335
  const rest = [];
@@ -1338,8 +1435,23 @@ export default defineVxeComponent({
1338
1435
  });
1339
1436
  };
1340
1437
  const calcTableHeight = (key) => {
1438
+ const { editConfig } = props;
1341
1439
  const { parentHeight } = reactData;
1342
- 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
+ }
1343
1455
  let num = 0;
1344
1456
  if (val) {
1345
1457
  if (val === '100%' || val === 'auto') {
@@ -2253,7 +2365,7 @@ export default defineVxeComponent({
2253
2365
  }
2254
2366
  if (xRightCornerEl) {
2255
2367
  xRightCornerEl.style.width = scrollbarXToTop ? '' : `${osbWidth}px`;
2256
- xRightCornerEl.style.display = scrollbarXToTop ? '' : (overflowX && osbHeight ? 'block' : '');
2368
+ xRightCornerEl.style.display = scrollbarXToTop ? '' : (xScrollbarVisible === 'visible' ? 'block' : '');
2257
2369
  }
2258
2370
  const scrollYVirtualEl = refScrollYVirtualElem.value;
2259
2371
  if (scrollYVirtualEl) {
@@ -2264,7 +2376,7 @@ export default defineVxeComponent({
2264
2376
  const yTopCornerEl = refScrollYTopCornerElem.value;
2265
2377
  if (yTopCornerEl) {
2266
2378
  yTopCornerEl.style.height = `${tHeaderHeight}px`;
2267
- yTopCornerEl.style.display = overflowY && tHeaderHeight ? 'block' : '';
2379
+ yTopCornerEl.style.display = tHeaderHeight && yScrollbarVisible === 'visible' ? 'block' : '';
2268
2380
  }
2269
2381
  const yWrapperEl = refScrollYWrapperElem.value;
2270
2382
  if (yWrapperEl) {
@@ -2275,7 +2387,7 @@ export default defineVxeComponent({
2275
2387
  if (yBottomCornerEl) {
2276
2388
  yBottomCornerEl.style.height = `${tFooterHeight}px`;
2277
2389
  yBottomCornerEl.style.top = `${tHeaderHeight + tbHeight}px`;
2278
- yBottomCornerEl.style.display = overflowY && tFooterHeight ? 'block' : '';
2390
+ yBottomCornerEl.style.display = tFooterHeight && yScrollbarVisible === 'visible' ? 'block' : '';
2279
2391
  }
2280
2392
  const rowExpandEl = refRowExpandElem.value;
2281
2393
  if (rowExpandEl) {
@@ -2965,10 +3077,17 @@ export default defineVxeComponent({
2965
3077
  $xeTable.setMergeCells(mergeCells);
2966
3078
  }
2967
3079
  };
3080
+ const handleDefaultMergeHeaderItems = () => {
3081
+ const { mergeHeaderCells } = props;
3082
+ if (mergeHeaderCells) {
3083
+ $xeTable.setMergeHeaderCells(mergeHeaderCells);
3084
+ }
3085
+ };
2968
3086
  const handleDefaultMergeFooterItems = () => {
2969
- const { mergeFooterItems } = props;
2970
- if (mergeFooterItems) {
2971
- $xeTable.setMergeFooterItems(mergeFooterItems);
3087
+ const { mergeFooterCells, mergeFooterItems } = props;
3088
+ const mFooterCells = mergeFooterCells || mergeFooterItems;
3089
+ if (mFooterCells) {
3090
+ $xeTable.setMergeFooterCells(mFooterCells);
2972
3091
  }
2973
3092
  };
2974
3093
  // 计算可视渲染相关数据
@@ -3405,6 +3524,10 @@ export default defineVxeComponent({
3405
3524
  }
3406
3525
  handleReserveStatus();
3407
3526
  $xeTable.checkSelectionStatus();
3527
+ $xeTable.dispatchEvent('data-change', {
3528
+ visibleColumn: internalData.visibleColumn,
3529
+ visibleData: internalData.afterFullData
3530
+ }, null);
3408
3531
  return new Promise(resolve => {
3409
3532
  nextTick()
3410
3533
  .then(() => handleRecalculateStyle(false, false, false))
@@ -3467,6 +3590,7 @@ export default defineVxeComponent({
3467
3590
  handleDefaultTreeExpand();
3468
3591
  handleDefaultRowGroupExpand();
3469
3592
  handleDefaultMergeCells();
3593
+ handleDefaultMergeHeaderItems();
3470
3594
  handleDefaultMergeFooterItems();
3471
3595
  nextTick(() => setTimeout(() => $xeTable.recalculate()));
3472
3596
  };
@@ -6785,6 +6909,10 @@ export default defineVxeComponent({
6785
6909
  }
6786
6910
  reactData.footerTableData = footData;
6787
6911
  $xeTable.handleUpdateFooterMerge();
6912
+ $xeTable.dispatchEvent('footer-data-change', {
6913
+ visibleColumn: internalData.visibleColumn,
6914
+ footData
6915
+ }, null);
6788
6916
  return nextTick();
6789
6917
  },
6790
6918
  /**
@@ -6852,39 +6980,85 @@ export default defineVxeComponent({
6852
6980
  return updateStyle();
6853
6981
  });
6854
6982
  },
6855
- 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) {
6856
7020
  if (props.footerSpanMethod) {
6857
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
7021
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method']);
6858
7022
  }
6859
7023
  handleFooterMerge(merges);
6860
7024
  $xeTable.handleUpdateFooterMerge();
6861
7025
  return nextTick().then(() => {
6862
- $xeTable.updateCellAreas();
6863
7026
  return updateStyle();
6864
7027
  });
6865
7028
  },
6866
- removeMergeFooterItems(merges) {
7029
+ setMergeFooterItems(merges) {
7030
+ // errLog('vxe.error.delFunc', ['setMergeFooterItems', 'setMergeFooterCells'])
7031
+ return $xeTable.setMergeFooterCells(merges);
7032
+ },
7033
+ removeMergeFooterCells(merges) {
6867
7034
  if (props.footerSpanMethod) {
6868
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
7035
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method']);
6869
7036
  }
6870
7037
  const rest = removeFooterMerges(merges);
6871
7038
  $xeTable.handleUpdateFooterMerge();
6872
7039
  return nextTick().then(() => {
6873
- $xeTable.updateCellAreas();
6874
7040
  updateStyle();
6875
7041
  return rest;
6876
7042
  });
6877
7043
  },
7044
+ removeMergeFooterItems(merges) {
7045
+ // errLog('vxe.error.delFunc', ['removeMergeFooterItems', 'removeMergeFooterCells'])
7046
+ return $xeTable.removeMergeFooterCells(merges);
7047
+ },
6878
7048
  /**
6879
7049
  * 获取所有被合并的表尾
6880
7050
  */
6881
- getMergeFooterItems() {
7051
+ getMergeFooterCells() {
6882
7052
  return internalData.mergeFooterList.slice(0);
6883
7053
  },
7054
+ getMergeFooterItems() {
7055
+ // errLog('vxe.error.delFunc', ['getMergeFooterItems', 'getMergeFooterCells'])
7056
+ return $xeTable.getMergeFooterCells();
7057
+ },
6884
7058
  /**
6885
7059
  * 清除所有表尾合并
6886
7060
  */
6887
- clearMergeFooterItems() {
7061
+ clearMergeFooterCells() {
6888
7062
  internalData.mergeFooterList = [];
6889
7063
  internalData.mergeFooterMaps = {};
6890
7064
  internalData.mergeFooterCellMaps = {};
@@ -6893,6 +7067,10 @@ export default defineVxeComponent({
6893
7067
  return updateStyle();
6894
7068
  });
6895
7069
  },
7070
+ clearMergeFooterItems() {
7071
+ // errLog('vxe.error.delFunc', ['clearMergeFooterItems', 'clearMergeFooterCells'])
7072
+ return $xeTable.clearMergeFooterCells();
7073
+ },
6896
7074
  updateCellAreas() {
6897
7075
  const { mouseConfig } = props;
6898
7076
  const mouseOpts = computeMouseOpts.value;
@@ -8956,6 +9134,11 @@ export default defineVxeComponent({
8956
9134
  internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList);
8957
9135
  reactData.mergeBodyFlag++;
8958
9136
  },
9137
+ handleUpdateHeaderMerge() {
9138
+ const { mergeHeaderList } = internalData;
9139
+ internalData.mergeHeaderCellMaps = buildMergeData(mergeHeaderList);
9140
+ reactData.mergeHeadFlag++;
9141
+ },
8959
9142
  handleUpdateFooterMerge() {
8960
9143
  const { mergeFooterList } = internalData;
8961
9144
  internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList);
@@ -11714,7 +11897,10 @@ export default defineVxeComponent({
11714
11897
  ref: refScrollXSpaceElem,
11715
11898
  class: 'vxe-table--scroll-x-space'
11716
11899
  })
11717
- ])
11900
+ ]),
11901
+ h('div', {
11902
+ class: 'vxe-table--scroll-x-handle-appearance'
11903
+ })
11718
11904
  ]),
11719
11905
  h('div', {
11720
11906
  ref: refScrollXRightCornerElem,
@@ -11744,7 +11930,10 @@ export default defineVxeComponent({
11744
11930
  ref: refScrollYSpaceElem,
11745
11931
  class: 'vxe-table--scroll-y-space'
11746
11932
  })
11747
- ])
11933
+ ]),
11934
+ h('div', {
11935
+ class: 'vxe-table--scroll-y-handle-appearance'
11936
+ })
11748
11937
  ]),
11749
11938
  h('div', {
11750
11939
  ref: refScrollYBottomCornerElem,
@@ -12221,15 +12410,32 @@ export default defineVxeComponent({
12221
12410
  watch(mergeCellFlag, () => {
12222
12411
  handleUpdateMergeBodyCells(props.mergeCells || []);
12223
12412
  });
12224
- 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
+ });
12225
12430
  watch(() => props.mergeFooterItems ? props.mergeFooterItems.length : -1, () => {
12226
- mergeFooterItemFlag.value++;
12431
+ mergeFooteCellFlag.value++;
12227
12432
  });
12228
12433
  watch(() => props.mergeFooterItems, () => {
12229
- mergeFooterItemFlag.value++;
12434
+ mergeFooteCellFlag.value++;
12230
12435
  });
12231
- watch(mergeFooterItemFlag, () => {
12232
- handleUpdateMergeFooterCells(props.mergeFooterItems || []);
12436
+ watch(mergeFooteCellFlag, () => {
12437
+ const mFooterCells = props.mergeFooterCells || props.mergeFooterItems;
12438
+ handleUpdateMergeFooterCells(mFooterCells || []);
12233
12439
  });
12234
12440
  watch(computeRowGroupFields, (val) => {
12235
12441
  handleUpdateRowGroup(val);
@@ -80,14 +80,19 @@ export function createInternalData() {
80
80
  sourceDataRowIdData: {},
81
81
  fullColumnIdData: {},
82
82
  fullColumnFieldData: {},
83
+ // 合并表头单元格的数据
84
+ mergeHeaderList: [],
85
+ mergeHeaderMaps: {},
86
+ // 已合并单元格数据集合
87
+ mergeHeaderCellMaps: {},
83
88
  // 合并单元格的数据
84
89
  mergeBodyList: [],
85
90
  mergeBodyMaps: {},
91
+ // 已合并单元格数据集合
92
+ mergeBodyCellMaps: {},
86
93
  // 合并表尾的数据
87
94
  mergeFooterList: [],
88
95
  mergeFooterMaps: {},
89
- // 已合并单元格数据集合
90
- mergeBodyCellMaps: {},
91
96
  // 已合并表尾数据集合
92
97
  mergeFooterCellMaps: {},
93
98
  // 已展开的行集合
@@ -181,6 +186,69 @@ export const convertHeaderColumnToRows = (originColumns) => {
181
186
  });
182
187
  return rows;
183
188
  };
189
+ export function convertHeaderToGridRows(spanColumns) {
190
+ const rSize = spanColumns.length;
191
+ const cSize = spanColumns[0].reduce((sum, cell) => sum + cell.colSpan, 0);
192
+ const occupiedRows = [];
193
+ const fullRows = [];
194
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
195
+ const oCols = [];
196
+ const dCols = [];
197
+ for (let cIndex = 0; cIndex < cSize; cIndex++) {
198
+ oCols.push(false);
199
+ dCols.push('');
200
+ }
201
+ occupiedRows.push(oCols);
202
+ fullRows.push(dCols);
203
+ }
204
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
205
+ let currColIndex = 0;
206
+ for (const column of spanColumns[rIndex]) {
207
+ const { colSpan, rowSpan } = column;
208
+ let startColIndex = -1;
209
+ for (let ccIndex = currColIndex; ccIndex <= cSize - colSpan; ccIndex++) {
210
+ let oFlag = true;
211
+ for (let csIndex = 0; csIndex < colSpan; csIndex++) {
212
+ if (occupiedRows[rIndex][ccIndex + csIndex]) {
213
+ oFlag = false;
214
+ break;
215
+ }
216
+ }
217
+ if (oFlag) {
218
+ startColIndex = ccIndex;
219
+ break;
220
+ }
221
+ }
222
+ if (startColIndex === -1) {
223
+ for (let j = 0; j <= cSize - colSpan; j++) {
224
+ let oFlag = true;
225
+ for (let k = 0; k < colSpan; k++) {
226
+ if (occupiedRows[rIndex][j + k]) {
227
+ oFlag = false;
228
+ break;
229
+ }
230
+ }
231
+ if (oFlag) {
232
+ startColIndex = j;
233
+ break;
234
+ }
235
+ }
236
+ if (startColIndex === -1) {
237
+ // error
238
+ break;
239
+ }
240
+ }
241
+ for (let srIndex = rIndex; srIndex < rIndex + rowSpan; srIndex++) {
242
+ for (let scIndex = startColIndex; scIndex < startColIndex + colSpan; scIndex++) {
243
+ occupiedRows[srIndex][scIndex] = true;
244
+ fullRows[srIndex][scIndex] = column;
245
+ }
246
+ }
247
+ currColIndex = startColIndex + colSpan;
248
+ }
249
+ }
250
+ return fullRows;
251
+ }
184
252
  export function restoreScrollLocation($xeTable, scrollLeft, scrollTop) {
185
253
  const internalData = $xeTable.internalData;
186
254
  if (scrollLeft || scrollTop) {