vxe-table 3.14.5 → 3.15.0-beta.0

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 (46) hide show
  1. package/es/style.css +1 -1
  2. package/es/table/module/edit/mixin.js +10 -9
  3. package/es/table/module/export/mixin.js +14 -11
  4. package/es/table/src/body.js +11 -13
  5. package/es/table/src/footer.js +3 -16
  6. package/es/table/src/methods.js +202 -67
  7. package/es/table/src/table.js +40 -23
  8. package/es/table/src/util.js +0 -13
  9. package/es/ui/index.js +2 -2
  10. package/es/ui/src/log.js +1 -1
  11. package/lib/index.umd.js +318 -183
  12. package/lib/index.umd.min.js +1 -1
  13. package/lib/style.css +1 -1
  14. package/lib/table/module/edit/mixin.js +9 -9
  15. package/lib/table/module/edit/mixin.min.js +1 -1
  16. package/lib/table/module/export/mixin.js +15 -11
  17. package/lib/table/module/export/mixin.min.js +1 -1
  18. package/lib/table/src/body.js +14 -15
  19. package/lib/table/src/body.min.js +1 -1
  20. package/lib/table/src/footer.js +4 -27
  21. package/lib/table/src/footer.min.js +1 -1
  22. package/lib/table/src/methods.js +231 -71
  23. package/lib/table/src/methods.min.js +1 -1
  24. package/lib/table/src/table.js +42 -23
  25. package/lib/table/src/table.min.js +1 -1
  26. package/lib/table/src/util.js +0 -25
  27. package/lib/table/src/util.min.js +1 -1
  28. package/lib/ui/index.js +2 -2
  29. package/lib/ui/index.min.js +1 -1
  30. package/lib/ui/src/log.js +1 -1
  31. package/lib/ui/src/log.min.js +1 -1
  32. package/package.json +2 -2
  33. package/packages/table/module/edit/mixin.ts +10 -9
  34. package/packages/table/module/export/mixin.ts +14 -11
  35. package/packages/table/src/body.ts +11 -13
  36. package/packages/table/src/footer.ts +3 -17
  37. package/packages/table/src/methods.ts +218 -78
  38. package/packages/table/src/table.ts +40 -23
  39. package/packages/table/src/util.ts +0 -14
  40. package/packages/ui/index.ts +1 -1
  41. /package/es/{iconfont.1743479120369.ttf → iconfont.1743578536739.ttf} +0 -0
  42. /package/es/{iconfont.1743479120369.woff → iconfont.1743578536739.woff} +0 -0
  43. /package/es/{iconfont.1743479120369.woff2 → iconfont.1743578536739.woff2} +0 -0
  44. /package/lib/{iconfont.1743479120369.ttf → iconfont.1743578536739.ttf} +0 -0
  45. /package/lib/{iconfont.1743479120369.woff → iconfont.1743578536739.woff} +0 -0
  46. /package/lib/{iconfont.1743479120369.woff2 → iconfont.1743578536739.woff2} +0 -0
@@ -1256,32 +1256,67 @@ function calculateMergerOffsetIndex(list, offsetItem, type) {
1256
1256
  }
1257
1257
  }
1258
1258
  }
1259
- function setMerges($xeTable, merges, mList, rowList) {
1260
- // const props = $xeTable
1259
+ function buildMergeData(mergeConfigs) {
1260
+ const mergeMaps = {};
1261
+ if (mergeConfigs && mergeConfigs.length) {
1262
+ for (let mIndex = 0; mIndex < mergeConfigs.length; mIndex++) {
1263
+ const { row: _rowIndex, col: _columnIndex, rowspan: mergeRowspan, colspan: mergeColspan } = mergeConfigs[mIndex];
1264
+ for (let i = 0; i < mergeRowspan; i++) {
1265
+ for (let j = 0; j < mergeColspan; j++) {
1266
+ mergeMaps[`${_rowIndex + i}:${_columnIndex + j}`] = !i && !j
1267
+ ? {
1268
+ rowspan: mergeRowspan,
1269
+ colspan: mergeColspan
1270
+ }
1271
+ : {
1272
+ rowspan: 0,
1273
+ colspan: 0
1274
+ };
1275
+ }
1276
+ }
1277
+ }
1278
+ }
1279
+ return mergeMaps;
1280
+ }
1281
+ const handleBodyMerge = ($xeTable, merges) => {
1261
1282
  const internalData = $xeTable;
1283
+ const { fullAllDataRowIdData, fullColumnIdData, visibleColumn, afterFullData, mergeBodyList, mergeBodyMaps } = internalData;
1262
1284
  if (merges) {
1263
- // const { treeConfig } = props
1264
- const { visibleColumn } = internalData;
1285
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1265
1286
  if (!XEUtils.isArray(merges)) {
1266
1287
  merges = [merges];
1267
1288
  }
1268
- // if (treeConfig && merges.length) {
1269
- // errLog('vxe.error.noTree', ['merge-cells | merge-footer-items'])
1270
- // }
1271
1289
  merges.forEach((item) => {
1272
1290
  let { row, col, rowspan, colspan } = item;
1273
- if (rowList && XEUtils.isNumber(row)) {
1274
- row = rowList[row];
1291
+ let mergeRowIndex = -1;
1292
+ let mergeColumnIndex = -1;
1293
+ if (XEUtils.isNumber(row)) {
1294
+ mergeRowIndex = row;
1295
+ }
1296
+ else {
1297
+ const rowid = row ? handleGetRowId(row) : null;
1298
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null;
1299
+ if (rowRest) {
1300
+ mergeRowIndex = rowRest._index;
1301
+ }
1275
1302
  }
1276
1303
  if (XEUtils.isNumber(col)) {
1277
- col = visibleColumn[col];
1304
+ mergeColumnIndex = col;
1305
+ }
1306
+ else {
1307
+ const colid = col ? col.id : null;
1308
+ const colRest = colid ? fullColumnIdData[colid] : null;
1309
+ if (colRest) {
1310
+ mergeColumnIndex = colRest._index;
1311
+ }
1278
1312
  }
1279
- if ((rowList ? row : XEUtils.isNumber(row)) && col && (rowspan || colspan)) {
1313
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1280
1314
  rowspan = XEUtils.toNumber(rowspan) || 1;
1281
1315
  colspan = XEUtils.toNumber(colspan) || 1;
1282
1316
  if (rowspan > 1 || colspan > 1) {
1283
- const mcIndex = XEUtils.findIndexOf(mList, item => item._row === row && item._col === col);
1284
- const mergeItem = mList[mcIndex];
1317
+ const row = afterFullData[mergeRowIndex];
1318
+ const column = visibleColumn[mergeColumnIndex];
1319
+ let mergeItem = mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1285
1320
  if (mergeItem) {
1286
1321
  mergeItem.rowspan = rowspan;
1287
1322
  mergeItem.colspan = colspan;
@@ -1289,24 +1324,73 @@ function setMerges($xeTable, merges, mList, rowList) {
1289
1324
  mergeItem._colspan = colspan;
1290
1325
  }
1291
1326
  else {
1292
- const mergeRowIndex = rowList ? rowList.indexOf(row) : row;
1293
- const mergeColIndex = visibleColumn.indexOf(col);
1294
- mList.push({
1327
+ mergeItem = {
1295
1328
  row: mergeRowIndex,
1296
- col: mergeColIndex,
1329
+ col: mergeColumnIndex,
1297
1330
  rowspan,
1298
1331
  colspan,
1299
1332
  _row: row,
1300
- _col: col,
1333
+ _col: column,
1301
1334
  _rowspan: rowspan,
1302
1335
  _colspan: colspan
1303
- });
1336
+ };
1337
+ mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1338
+ mergeBodyList.push(mergeItem);
1304
1339
  }
1305
1340
  }
1306
1341
  }
1307
1342
  });
1308
1343
  }
1309
- }
1344
+ };
1345
+ const handleFooterMerge = ($xeTable, merges) => {
1346
+ const reactData = $xeTable;
1347
+ const internalData = $xeTable;
1348
+ const { footerTableData } = reactData;
1349
+ const { mergeFooterList, mergeFooterMaps } = internalData;
1350
+ if (merges) {
1351
+ const { visibleColumn } = internalData;
1352
+ if (!XEUtils.isArray(merges)) {
1353
+ merges = [merges];
1354
+ }
1355
+ merges.forEach((item) => {
1356
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item;
1357
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1;
1358
+ let mergeColumnIndex = -1;
1359
+ if (XEUtils.isNumber(margeCol)) {
1360
+ mergeColumnIndex = margeCol;
1361
+ }
1362
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1363
+ rowspan = XEUtils.toNumber(rowspan) || 1;
1364
+ colspan = XEUtils.toNumber(colspan) || 1;
1365
+ if (rowspan > 1 || colspan > 1) {
1366
+ const row = footerTableData[mergeRowIndex];
1367
+ const column = visibleColumn[mergeColumnIndex];
1368
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1369
+ if (mergeItem) {
1370
+ mergeItem.rowspan = rowspan;
1371
+ mergeItem.colspan = colspan;
1372
+ mergeItem._rowspan = rowspan;
1373
+ mergeItem._colspan = colspan;
1374
+ }
1375
+ else {
1376
+ mergeItem = {
1377
+ row: mergeRowIndex,
1378
+ col: mergeColumnIndex,
1379
+ rowspan,
1380
+ colspan,
1381
+ _row: row,
1382
+ _col: column,
1383
+ _rowspan: rowspan,
1384
+ _colspan: colspan
1385
+ };
1386
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1387
+ mergeFooterList.push(mergeItem);
1388
+ }
1389
+ }
1390
+ }
1391
+ });
1392
+ }
1393
+ };
1310
1394
  function removeMerges($xeTable, merges, mList, rowList) {
1311
1395
  // const props = $xeTable
1312
1396
  const internalData = $xeTable;
@@ -1965,8 +2049,8 @@ function handleUpdateColumn($xeTable) {
1965
2049
  function loadScrollXData($xeTable) {
1966
2050
  const reactData = $xeTable;
1967
2051
  const internalData = $xeTable;
1968
- const { mergeList, mergeFooterList, isScrollXBig } = reactData;
1969
- const { scrollXStore } = internalData;
2052
+ const { isScrollXBig } = reactData;
2053
+ const { mergeBodyList, mergeFooterList, scrollXStore } = internalData;
1970
2054
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollXStore;
1971
2055
  const { toVisibleIndex, visibleSize } = handleVirtualXVisible($xeTable);
1972
2056
  const offsetItem = {
@@ -1975,7 +2059,7 @@ function loadScrollXData($xeTable) {
1975
2059
  };
1976
2060
  scrollXStore.visibleStartIndex = toVisibleIndex - 1;
1977
2061
  scrollXStore.visibleEndIndex = toVisibleIndex + visibleSize + 1;
1978
- calculateMergerOffsetIndex(mergeList.concat(mergeFooterList), offsetItem, 'col');
2062
+ calculateMergerOffsetIndex(mergeBodyList.concat(mergeFooterList), offsetItem, 'col');
1979
2063
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem;
1980
2064
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
1981
2065
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -2184,8 +2268,8 @@ function handleColumn($xeTable, collectColumn) {
2184
2268
  function loadScrollYData($xeTable) {
2185
2269
  const reactData = $xeTable;
2186
2270
  const internalData = $xeTable;
2187
- const { mergeList, isAllOverflow, isScrollYBig } = reactData;
2188
- const { scrollYStore } = internalData;
2271
+ const { isAllOverflow, isScrollYBig } = reactData;
2272
+ const { mergeBodyList, scrollYStore } = internalData;
2189
2273
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollYStore;
2190
2274
  const autoOffsetYSize = isAllOverflow ? offsetSize : offsetSize + 1;
2191
2275
  const { toVisibleIndex, visibleSize } = handleVirtualYVisible($xeTable);
@@ -2195,7 +2279,7 @@ function loadScrollYData($xeTable) {
2195
2279
  };
2196
2280
  scrollYStore.visibleStartIndex = toVisibleIndex - 1;
2197
2281
  scrollYStore.visibleEndIndex = toVisibleIndex + visibleSize + 1;
2198
- calculateMergerOffsetIndex(mergeList, offsetItem, 'row');
2282
+ calculateMergerOffsetIndex(mergeBodyList, offsetItem, 'row');
2199
2283
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem;
2200
2284
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
2201
2285
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -2584,7 +2668,7 @@ const Methods = {
2584
2668
  * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到
2585
2669
  */
2586
2670
  syncData() {
2587
- warnLog('vxe.error.delFunc', ['syncData', 'getData']);
2671
+ errLog('vxe.error.delFunc', ['syncData', 'getData']);
2588
2672
  return this.$nextTick().then(() => {
2589
2673
  this.tableData = [];
2590
2674
  return this.$nextTick().then(() => this.loadTableData(this.tableFullData, true));
@@ -2595,30 +2679,35 @@ const Methods = {
2595
2679
  * 对于手动更改了排序、筛选...等条件后需要重新处理数据时可能会用到
2596
2680
  */
2597
2681
  updateData() {
2598
- const { scrollXLoad, scrollYLoad } = this;
2599
- return this.handleTableData(true).then(() => {
2600
- this.updateFooter();
2682
+ const $xeTable = this;
2683
+ const reactData = $xeTable;
2684
+ const { scrollXLoad, scrollYLoad } = reactData;
2685
+ return $xeTable.handleTableData(true).then(() => {
2686
+ $xeTable.updateFooter();
2601
2687
  if (scrollXLoad || scrollYLoad) {
2602
2688
  if (scrollXLoad) {
2603
- this.updateScrollXSpace();
2689
+ $xeTable.updateScrollXSpace();
2604
2690
  }
2605
2691
  if (scrollYLoad) {
2606
- this.updateScrollYSpace();
2692
+ $xeTable.updateScrollYSpace();
2607
2693
  }
2608
- return this.refreshScroll();
2694
+ return $xeTable.refreshScroll();
2609
2695
  }
2610
2696
  }).then(() => {
2611
- this.updateCellAreas();
2612
- return this.recalculate(true);
2697
+ $xeTable.updateCellAreas();
2698
+ return $xeTable.recalculate(true);
2613
2699
  }).then(() => {
2614
2700
  // 存在滚动行为未结束情况
2615
- setTimeout(() => this.recalculate(), 50);
2701
+ setTimeout(() => $xeTable.recalculate(), 50);
2616
2702
  });
2617
2703
  },
2618
2704
  handleTableData(force) {
2619
2705
  const $xeTable = this;
2620
- const { scrollYLoad, scrollYStore, fullDataRowIdData, afterFullData } = this;
2621
- let fullList = afterFullData;
2706
+ const reactData = $xeTable;
2707
+ const internalData = $xeTable;
2708
+ const { scrollYLoad } = reactData;
2709
+ const { scrollYStore, fullDataRowIdData } = internalData;
2710
+ let fullList = internalData.afterFullData;
2622
2711
  // 是否进行数据处理
2623
2712
  if (force) {
2624
2713
  // 更新数据,处理筛选和排序
@@ -2627,14 +2716,17 @@ const Methods = {
2627
2716
  fullList = handleVirtualTreeToList($xeTable);
2628
2717
  }
2629
2718
  const tableData = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
2719
+ const visibleDataRowIdMaps = {};
2630
2720
  tableData.forEach((row, $index) => {
2631
2721
  const rowid = getRowid(this, row);
2632
2722
  const rest = fullDataRowIdData[rowid];
2633
2723
  if (rest) {
2634
2724
  rest.$index = $index;
2635
2725
  }
2726
+ visibleDataRowIdMaps[rowid] = row;
2636
2727
  });
2637
2728
  this.tableData = tableData;
2729
+ internalData.visibleDataRowIdData = visibleDataRowIdMaps;
2638
2730
  return this.$nextTick();
2639
2731
  },
2640
2732
  /**
@@ -2708,7 +2800,7 @@ const Methods = {
2708
2800
  internalData.tableFullData = fullData;
2709
2801
  internalData.tableFullTreeData = treeData;
2710
2802
  // 缓存数据
2711
- $xeTable.cacheRowMap(true);
2803
+ $xeTable.cacheRowMap(isReset);
2712
2804
  // 原始数据
2713
2805
  internalData.tableSynchData = datas;
2714
2806
  if (isReset) {
@@ -2726,6 +2818,7 @@ const Methods = {
2726
2818
  $xeTable.clearMergeFooterItems();
2727
2819
  $xeTable.handleTableData(true);
2728
2820
  $xeTable.updateFooter();
2821
+ $xeTable.handleUpdateBodyMerge();
2729
2822
  return $xeTable.$nextTick().then(() => {
2730
2823
  updateHeight($xeTable);
2731
2824
  updateStyle($xeTable);
@@ -2901,7 +2994,7 @@ const Methods = {
2901
2994
  /**
2902
2995
  * 更新数据行的 Map
2903
2996
  */
2904
- cacheRowMap() {
2997
+ cacheRowMap(isReset) {
2905
2998
  const $xeTable = this;
2906
2999
  const props = $xeTable;
2907
3000
  const reactData = $xeTable;
@@ -2912,7 +3005,7 @@ const Methods = {
2912
3005
  const childrenField = treeOpts.children || treeOpts.childrenField;
2913
3006
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
2914
3007
  const { lazy } = treeOpts;
2915
- const fullAllDataRowIdMaps = Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
3008
+ const fullAllDataRowIdMaps = isReset ? {} : Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
2916
3009
  const fullDataRowIdMaps = {};
2917
3010
  const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
2918
3011
  const handleRowCache = (row, index, items, currIndex, parentRow, rowid, level, seq) => {
@@ -5520,6 +5613,25 @@ const Methods = {
5520
5613
  this.updateCellAreas();
5521
5614
  this.recalculate(true);
5522
5615
  },
5616
+ /**
5617
+ * 处理合并
5618
+ */
5619
+ handleUpdateBodyMerge() {
5620
+ const $xeTable = this;
5621
+ const reactData = $xeTable;
5622
+ const internalData = $xeTable;
5623
+ const { mergeBodyList } = internalData;
5624
+ internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList);
5625
+ reactData.mergeBodyFlag++;
5626
+ },
5627
+ handleUpdateFooterMerge() {
5628
+ const $xeTable = this;
5629
+ const reactData = $xeTable;
5630
+ const internalData = $xeTable;
5631
+ const { mergeFooterList } = internalData;
5632
+ internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList);
5633
+ reactData.mergeFootFlag++;
5634
+ },
5523
5635
  handleTargetLeaveEvent() {
5524
5636
  const $xeTable = this;
5525
5637
  const internalData = $xeTable;
@@ -9066,17 +9178,22 @@ const Methods = {
9066
9178
  */
9067
9179
  updateFooter() {
9068
9180
  const $xeTable = this;
9181
+ const props = $xeTable;
9182
+ const reactData = $xeTable;
9183
+ const internalData = $xeTable;
9069
9184
  const $xeGrid = $xeTable.$xeGrid;
9070
- const { showFooter, visibleColumn, footerData, footerMethod } = this;
9185
+ const { showFooter, footerData, footerMethod } = props;
9186
+ const { visibleColumn, afterFullData } = internalData;
9071
9187
  let footData = [];
9072
9188
  if (showFooter && footerData && footerData.length) {
9073
9189
  footData = footerData.slice(0);
9074
9190
  }
9075
9191
  else if (showFooter && footerMethod) {
9076
- footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: this.afterFullData, $table: $xeTable, $grid: $xeGrid }) : [];
9192
+ footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: afterFullData, $table: $xeTable, $grid: $xeGrid }) : [];
9077
9193
  }
9078
- this.footerTableData = footData;
9079
- return this.$nextTick();
9194
+ reactData.footerTableData = footData;
9195
+ $xeTable.handleUpdateFooterMerge();
9196
+ return $xeTable.$nextTick();
9080
9197
  },
9081
9198
  /**
9082
9199
  * 更新列状态 updateStatus({ row, column }, cellValue)
@@ -9099,12 +9216,14 @@ const Methods = {
9099
9216
  */
9100
9217
  setMergeCells(merges) {
9101
9218
  const $xeTable = this;
9102
- if (this.spanMethod) {
9219
+ const props = $xeTable;
9220
+ if (props.spanMethod) {
9103
9221
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method']);
9104
9222
  }
9105
- setMerges(this, merges, this.mergeList, this.afterFullData);
9106
- return this.$nextTick().then(() => {
9107
- this.updateCellAreas();
9223
+ handleBodyMerge($xeTable, merges);
9224
+ $xeTable.handleUpdateBodyMerge();
9225
+ return $xeTable.$nextTick().then(() => {
9226
+ $xeTable.updateCellAreas();
9108
9227
  return updateStyle($xeTable);
9109
9228
  });
9110
9229
  },
@@ -9114,12 +9233,14 @@ const Methods = {
9114
9233
  */
9115
9234
  removeMergeCells(merges) {
9116
9235
  const $xeTable = this;
9117
- if (this.spanMethod) {
9236
+ const props = $xeTable;
9237
+ const internalData = $xeTable;
9238
+ if (props.spanMethod) {
9118
9239
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method']);
9119
9240
  }
9120
- const rest = removeMerges(this, merges, this.mergeList, this.afterFullData);
9121
- return this.$nextTick().then(() => {
9122
- this.updateCellAreas();
9241
+ const rest = removeMerges($xeTable, merges, internalData.mergeBodyList, internalData.afterFullData);
9242
+ return $xeTable.$nextTick().then(() => {
9243
+ $xeTable.updateCellAreas();
9123
9244
  updateStyle($xeTable);
9124
9245
  return rest;
9125
9246
  });
@@ -9128,37 +9249,46 @@ const Methods = {
9128
9249
  * 获取所有被合并的单元格
9129
9250
  */
9130
9251
  getMergeCells() {
9131
- return this.mergeList.slice(0);
9252
+ const $xeTable = this;
9253
+ const internalData = $xeTable;
9254
+ return internalData.mergeBodyList.slice(0);
9132
9255
  },
9133
9256
  /**
9134
9257
  * 清除所有单元格合并
9135
9258
  */
9136
9259
  clearMergeCells() {
9137
9260
  const $xeTable = this;
9138
- this.mergeList = [];
9139
- return this.$nextTick().then(() => {
9261
+ const internalData = $xeTable;
9262
+ internalData.mergeBodyList = [];
9263
+ internalData.mergeBodyMaps = {};
9264
+ internalData.mergeBodyCellMaps = {};
9265
+ return $xeTable.$nextTick().then(() => {
9140
9266
  return updateStyle($xeTable);
9141
9267
  });
9142
9268
  },
9143
9269
  setMergeFooterItems(merges) {
9144
9270
  const $xeTable = this;
9145
- if (this.footerSpanMethod) {
9271
+ const props = $xeTable;
9272
+ if (props.footerSpanMethod) {
9146
9273
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
9147
9274
  }
9148
- setMerges(this, merges, this.mergeFooterList);
9149
- return this.$nextTick().then(() => {
9150
- this.updateCellAreas();
9275
+ handleFooterMerge($xeTable, merges);
9276
+ $xeTable.handleUpdateFooterMerge();
9277
+ return $xeTable.$nextTick().then(() => {
9278
+ $xeTable.updateCellAreas();
9151
9279
  return updateStyle($xeTable);
9152
9280
  });
9153
9281
  },
9154
9282
  removeMergeFooterItems(merges) {
9155
9283
  const $xeTable = this;
9156
- if (this.footerSpanMethod) {
9284
+ const props = $xeTable;
9285
+ const internalData = $xeTable;
9286
+ if (props.footerSpanMethod) {
9157
9287
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
9158
9288
  }
9159
- const rest = removeMerges(this, merges, this.mergeFooterList, null);
9160
- return this.$nextTick().then(() => {
9161
- this.updateCellAreas();
9289
+ const rest = removeMerges($xeTable, merges, internalData.mergeFooterList);
9290
+ return $xeTable.$nextTick().then(() => {
9291
+ $xeTable.updateCellAreas();
9162
9292
  updateStyle($xeTable);
9163
9293
  return rest;
9164
9294
  });
@@ -9167,15 +9297,20 @@ const Methods = {
9167
9297
  * 获取所有被合并的表尾
9168
9298
  */
9169
9299
  getMergeFooterItems() {
9170
- return this.mergeFooterList.slice(0);
9300
+ const $xeTable = this;
9301
+ const internalData = $xeTable;
9302
+ return internalData.mergeFooterList.slice(0);
9171
9303
  },
9172
9304
  /**
9173
9305
  * 清除所有表尾合并
9174
9306
  */
9175
9307
  clearMergeFooterItems() {
9176
9308
  const $xeTable = this;
9177
- this.mergeFooterList = [];
9178
- return this.$nextTick().then(() => {
9309
+ const internalData = $xeTable;
9310
+ internalData.mergeFooterList = [];
9311
+ internalData.mergeFooterMaps = {};
9312
+ internalData.mergeFooterCellMaps = {};
9313
+ return $xeTable.$nextTick().then(() => {
9179
9314
  return updateStyle($xeTable);
9180
9315
  });
9181
9316
  },
@@ -199,21 +199,23 @@ function renderRowExpandedVNs(h, $xeTable) {
199
199
  const { transform, seqMode } = treeOpts;
200
200
  const cellStyle = {};
201
201
  const rowid = handleGetRowId(row);
202
- const rest = fullAllDataRowIdData[rowid];
202
+ const rowRest = fullAllDataRowIdData[rowid];
203
203
  let rowLevel = 0;
204
204
  let seq = -1;
205
- let _rowIndex = 0;
206
- const rowIndex = $xeTable.getRowIndex(row);
207
- const $rowIndex = $xeTable.getVMRowIndex(row);
208
- if (rest) {
209
- rowLevel = rest.level;
205
+ let _rowIndex = -1;
206
+ let rowIndex = -1;
207
+ let $rowIndex = -1;
208
+ if (rowRest) {
209
+ rowLevel = rowRest.level;
210
210
  if (treeConfig && transform && seqMode === 'increasing') {
211
- seq = rest._index + 1;
211
+ seq = rowRest._index + 1;
212
212
  }
213
213
  else {
214
- seq = rest.seq;
214
+ seq = rowRest.seq;
215
215
  }
216
- _rowIndex = rest._index;
216
+ rowIndex = rowRest.index;
217
+ $rowIndex = rowRest.$index;
218
+ _rowIndex = rowRest._index;
217
219
  }
218
220
  if (expandHeight) {
219
221
  cellStyle.height = `${expandHeight}px`;
@@ -453,10 +455,6 @@ export default {
453
455
  hasFixedColumn: false,
454
456
  // 树节点列信息
455
457
  treeNodeColumn: null,
456
- // 合并单元格的对象集
457
- mergeList: [],
458
- // 合并表尾数据的对象集
459
- mergeFooterList: [],
460
458
  // 初始化标识
461
459
  initStore: {
462
460
  filter: false,
@@ -606,6 +604,10 @@ export default {
606
604
  treeExpandedFlag: 1,
607
605
  updateCheckboxFlag: 1,
608
606
  pendingRowFlag: 1,
607
+ insertRowFlag: 1,
608
+ removeRowFlag: 1,
609
+ mergeBodyFlag: 1,
610
+ mergeFootFlag: 1,
609
611
  rowHeightStore: {
610
612
  default: 48,
611
613
  medium: 44,
@@ -1031,19 +1033,21 @@ export default {
1031
1033
  },
1032
1034
  computeTableRowExpandedList() {
1033
1035
  const $xeTable = this;
1036
+ const props = $xeTable;
1034
1037
  const reactData = $xeTable;
1035
1038
  const internalData = $xeTable;
1036
- const { rowExpandedFlag, tableData, expandColumn } = reactData;
1037
- const { rowExpandedMaps } = internalData;
1038
- const { handleGetRowId } = createHandleGetRowId($xeTable);
1039
+ const { treeConfig } = props;
1040
+ const { rowExpandedFlag, expandColumn } = reactData;
1041
+ const { visibleDataRowIdData, rowExpandedMaps } = internalData;
1042
+ const treeOpts = $xeTable.computeTreeOpts;
1043
+ const { transform } = treeOpts;
1039
1044
  const expandList = [];
1040
1045
  if (expandColumn && rowExpandedFlag) {
1041
- const rowKeys = {};
1042
- tableData.forEach(row => {
1043
- rowKeys[handleGetRowId(row)] = true;
1044
- });
1046
+ if (treeConfig && !transform) {
1047
+ return XEUtils.values(rowExpandedMaps);
1048
+ }
1045
1049
  XEUtils.each(rowExpandedMaps, (row, rowid) => {
1046
- if (rowKeys[rowid]) {
1050
+ if (visibleDataRowIdData[rowid]) {
1047
1051
  expandList.push(row);
1048
1052
  }
1049
1053
  });
@@ -1302,13 +1306,26 @@ export default {
1302
1306
  tableFullColumn: [],
1303
1307
  // 渲染所有列
1304
1308
  visibleColumn: [],
1305
- // 总的缓存数据集
1309
+ // 全量数据集(包括当前和已删除)
1306
1310
  fullAllDataRowIdData: {},
1311
+ // 数据集(仅当前)
1312
+ fullDataRowIdData: {},
1313
+ // 数据集(仅可视)
1314
+ visibleDataRowIdData: {},
1307
1315
  // 渲染中缓存数据
1308
1316
  sourceDataRowIdData: {},
1309
- fullDataRowIdData: {},
1310
1317
  fullColumnIdData: {},
1311
1318
  fullColumnFieldData: {},
1319
+ // 合并单元格的数据
1320
+ mergeBodyList: [],
1321
+ mergeBodyMaps: {},
1322
+ // 合并表尾的数据
1323
+ mergeFooterList: [],
1324
+ mergeFooterMaps: {},
1325
+ // 已合并单元格数据集合
1326
+ mergeBodyCellMaps: {},
1327
+ // 已合并表尾数据集合
1328
+ mergeFooterCellMaps: {},
1312
1329
  // 已展开的行集合
1313
1330
  rowExpandedMaps: {},
1314
1331
  // 懒加载中的展开行的集合
@@ -353,19 +353,6 @@ export function calcTreeLine(params, prevRow) {
353
353
  }
354
354
  return cellHeight * expandSize - (prevRow ? 1 : (12 - getOffsetSize($table)));
355
355
  }
356
- export function mergeBodyMethod(mergeList, _rowIndex, _columnIndex) {
357
- for (let mIndex = 0; mIndex < mergeList.length; mIndex++) {
358
- const { row: mergeRowIndex, col: mergeColIndex, rowspan: mergeRowspan, colspan: mergeColspan } = mergeList[mIndex];
359
- if (mergeColIndex > -1 && mergeRowIndex > -1 && mergeRowspan && mergeColspan) {
360
- if (mergeRowIndex === _rowIndex && mergeColIndex === _columnIndex) {
361
- return { rowspan: mergeRowspan, colspan: mergeColspan };
362
- }
363
- if (_rowIndex >= mergeRowIndex && _rowIndex < mergeRowIndex + mergeRowspan && _columnIndex >= mergeColIndex && _columnIndex < mergeColIndex + mergeColspan) {
364
- return { rowspan: 0, colspan: 0 };
365
- }
366
- }
367
- }
368
- }
369
356
  export function getCellValue(row, column) {
370
357
  return XEUtils.get(row, column.field);
371
358
  }
package/es/ui/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  import { getFuncText } from './src/utils';
3
- export const version = "3.14.5";
3
+ export const version = "3.15.0-beta.0";
4
4
  VxeUI.version = version;
5
5
  VxeUI.tableVersion = version;
6
6
  VxeUI.setConfig({
@@ -192,7 +192,7 @@ VxeUI.setConfig({
192
192
  },
193
193
  virtualXConfig: {
194
194
  enabled: true,
195
- gt: 60,
195
+ gt: 28,
196
196
  preSize: 0,
197
197
  oSize: 1
198
198
  },
package/es/ui/src/log.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { VxeUI } from '@vxe-ui/core';
2
2
  const { log } = VxeUI;
3
- const version = `table v${"3.14.5"}`;
3
+ const version = `table v${"3.15.0-beta.0"}`;
4
4
  export const warnLog = log.create('warn', version);
5
5
  export const errLog = log.create('error', version);