vxe-table 4.12.4 → 4.13.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 (139) hide show
  1. package/es/grid/src/grid.js +2 -2
  2. package/es/locale/lang/ar-EG.js +3 -1
  3. package/es/locale/lang/de-DE.js +3 -1
  4. package/es/locale/lang/en-US.js +7 -5
  5. package/es/locale/lang/es-ES.js +3 -1
  6. package/es/locale/lang/fr-FR.js +3 -1
  7. package/es/locale/lang/hu-HU.js +3 -1
  8. package/es/locale/lang/hy-AM.js +3 -1
  9. package/es/locale/lang/id-ID.js +3 -1
  10. package/es/locale/lang/it-IT.js +3 -1
  11. package/es/locale/lang/ja-JP.js +3 -1
  12. package/es/locale/lang/ko-KR.js +3 -1
  13. package/es/locale/lang/nb-NO.js +3 -1
  14. package/es/locale/lang/pt-BR.js +3 -1
  15. package/es/locale/lang/ru-RU.js +3 -1
  16. package/es/locale/lang/th-TH.js +3 -1
  17. package/es/locale/lang/ug-CN.js +3 -1
  18. package/es/locale/lang/uk-UA.js +3 -1
  19. package/es/locale/lang/vi-VN.js +3 -1
  20. package/es/locale/lang/zh-CHT.js +3 -1
  21. package/es/locale/lang/zh-CN.js +3 -1
  22. package/es/style.css +1 -1
  23. package/es/table/module/edit/hook.js +10 -9
  24. package/es/table/module/export/export-panel.js +31 -19
  25. package/es/table/module/export/hook.js +16 -12
  26. package/es/table/src/body.js +11 -13
  27. package/es/table/src/footer.js +3 -16
  28. package/es/table/src/table.js +243 -107
  29. package/es/table/src/util.js +0 -13
  30. package/es/ui/index.js +2 -2
  31. package/es/ui/src/log.js +1 -1
  32. package/lib/grid/src/grid.js +2 -2
  33. package/lib/grid/src/grid.min.js +1 -1
  34. package/lib/index.umd.js +8540 -8566
  35. package/lib/index.umd.min.js +1 -1
  36. package/lib/locale/lang/ar-EG.js +3 -1
  37. package/lib/locale/lang/ar-EG.min.js +1 -1
  38. package/lib/locale/lang/de-DE.js +3 -1
  39. package/lib/locale/lang/de-DE.min.js +1 -1
  40. package/lib/locale/lang/en-US.js +7 -5
  41. package/lib/locale/lang/en-US.min.js +1 -1
  42. package/lib/locale/lang/en-US.umd.js +7 -5
  43. package/lib/locale/lang/es-ES.js +3 -1
  44. package/lib/locale/lang/es-ES.min.js +1 -1
  45. package/lib/locale/lang/es-ES.umd.js +3 -1
  46. package/lib/locale/lang/fr-FR.js +3 -1
  47. package/lib/locale/lang/fr-FR.min.js +1 -1
  48. package/lib/locale/lang/hu-HU.js +3 -1
  49. package/lib/locale/lang/hu-HU.min.js +1 -1
  50. package/lib/locale/lang/hu-HU.umd.js +3 -1
  51. package/lib/locale/lang/hy-AM.js +3 -1
  52. package/lib/locale/lang/hy-AM.min.js +1 -1
  53. package/lib/locale/lang/id-ID.js +3 -1
  54. package/lib/locale/lang/id-ID.min.js +1 -1
  55. package/lib/locale/lang/it-IT.js +3 -1
  56. package/lib/locale/lang/it-IT.min.js +1 -1
  57. package/lib/locale/lang/ja-JP.js +3 -1
  58. package/lib/locale/lang/ja-JP.min.js +1 -1
  59. package/lib/locale/lang/ja-JP.umd.js +3 -1
  60. package/lib/locale/lang/ko-KR.js +3 -1
  61. package/lib/locale/lang/ko-KR.min.js +1 -1
  62. package/lib/locale/lang/ko-KR.umd.js +3 -1
  63. package/lib/locale/lang/nb-NO.js +3 -1
  64. package/lib/locale/lang/nb-NO.min.js +1 -1
  65. package/lib/locale/lang/pt-BR.js +3 -1
  66. package/lib/locale/lang/pt-BR.min.js +1 -1
  67. package/lib/locale/lang/pt-BR.umd.js +3 -1
  68. package/lib/locale/lang/ru-RU.js +3 -1
  69. package/lib/locale/lang/ru-RU.min.js +1 -1
  70. package/lib/locale/lang/ru-RU.umd.js +3 -1
  71. package/lib/locale/lang/th-TH.js +3 -1
  72. package/lib/locale/lang/th-TH.min.js +1 -1
  73. package/lib/locale/lang/ug-CN.js +3 -1
  74. package/lib/locale/lang/ug-CN.min.js +1 -1
  75. package/lib/locale/lang/uk-UA.js +3 -1
  76. package/lib/locale/lang/uk-UA.min.js +1 -1
  77. package/lib/locale/lang/uk-UA.umd.js +3 -1
  78. package/lib/locale/lang/vi-VN.js +3 -1
  79. package/lib/locale/lang/vi-VN.min.js +1 -1
  80. package/lib/locale/lang/zh-CHT.js +3 -1
  81. package/lib/locale/lang/zh-CHT.min.js +1 -1
  82. package/lib/locale/lang/zh-CN.js +3 -1
  83. package/lib/locale/lang/zh-CN.min.js +1 -1
  84. package/lib/locale/lang/zh-CN.umd.js +3 -1
  85. package/lib/style.css +1 -1
  86. package/lib/table/module/edit/hook.js +9 -9
  87. package/lib/table/module/edit/hook.min.js +1 -1
  88. package/lib/table/module/export/export-panel.js +26 -19
  89. package/lib/table/module/export/export-panel.min.js +1 -1
  90. package/lib/table/module/export/hook.js +19 -14
  91. package/lib/table/module/export/hook.min.js +1 -1
  92. package/lib/table/src/body.js +14 -15
  93. package/lib/table/src/body.min.js +1 -1
  94. package/lib/table/src/footer.js +4 -27
  95. package/lib/table/src/footer.min.js +1 -1
  96. package/lib/table/src/table.js +271 -108
  97. package/lib/table/src/table.min.js +1 -1
  98. package/lib/table/src/util.js +0 -25
  99. package/lib/table/src/util.min.js +1 -1
  100. package/lib/ui/index.js +2 -2
  101. package/lib/ui/index.min.js +1 -1
  102. package/lib/ui/src/log.js +1 -1
  103. package/lib/ui/src/log.min.js +1 -1
  104. package/package.json +2 -2
  105. package/packages/grid/src/grid.ts +2 -2
  106. package/packages/locale/lang/ar-EG.ts +3 -1
  107. package/packages/locale/lang/de-DE.ts +3 -1
  108. package/packages/locale/lang/en-US.ts +7 -5
  109. package/packages/locale/lang/es-ES.ts +3 -1
  110. package/packages/locale/lang/fr-FR.ts +3 -1
  111. package/packages/locale/lang/hu-HU.ts +3 -1
  112. package/packages/locale/lang/hy-AM.ts +3 -1
  113. package/packages/locale/lang/id-ID.ts +3 -1
  114. package/packages/locale/lang/it-IT.ts +3 -1
  115. package/packages/locale/lang/ja-JP.ts +3 -1
  116. package/packages/locale/lang/ko-KR.ts +3 -1
  117. package/packages/locale/lang/nb-NO.ts +3 -1
  118. package/packages/locale/lang/pt-BR.ts +3 -1
  119. package/packages/locale/lang/ru-RU.ts +3 -1
  120. package/packages/locale/lang/th-TH.ts +3 -1
  121. package/packages/locale/lang/ug-CN.ts +3 -1
  122. package/packages/locale/lang/uk-UA.ts +3 -1
  123. package/packages/locale/lang/vi-VN.ts +3 -1
  124. package/packages/locale/lang/zh-CHT.ts +3 -1
  125. package/packages/locale/lang/zh-CN.ts +3 -1
  126. package/packages/table/module/edit/hook.ts +10 -9
  127. package/packages/table/module/export/export-panel.ts +31 -19
  128. package/packages/table/module/export/hook.ts +18 -14
  129. package/packages/table/src/body.ts +11 -13
  130. package/packages/table/src/footer.ts +3 -17
  131. package/packages/table/src/table.ts +240 -107
  132. package/packages/table/src/util.ts +0 -14
  133. package/packages/ui/index.ts +1 -1
  134. /package/es/{iconfont.1743394011765.ttf → iconfont.1743578564396.ttf} +0 -0
  135. /package/es/{iconfont.1743394011765.woff → iconfont.1743578564396.woff} +0 -0
  136. /package/es/{iconfont.1743394011765.woff2 → iconfont.1743578564396.woff2} +0 -0
  137. /package/lib/{iconfont.1743394011765.ttf → iconfont.1743578564396.ttf} +0 -0
  138. /package/lib/{iconfont.1743394011765.woff → iconfont.1743578564396.woff} +0 -0
  139. /package/lib/{iconfont.1743394011765.woff2 → iconfont.1743578564396.woff2} +0 -0
@@ -82,10 +82,6 @@ export default defineComponent({
82
82
  // 树节点列信息
83
83
  treeNodeColumn: null,
84
84
  hasFixedColumn: false,
85
- // 合并单元格的对象集
86
- mergeList: [],
87
- // 合并表尾数据的对象集
88
- mergeFooterList: [],
89
85
  // 刷新列标识,当列筛选被改变时,触发表格刷新数据
90
86
  upDataFlag: 0,
91
87
  // 刷新列标识,当列的特定属性被改变时,触发表格刷新列
@@ -229,6 +225,7 @@ export default defineComponent({
229
225
  original: false,
230
226
  message: true,
231
227
  isHeader: false,
228
+ isTitle: false,
232
229
  isFooter: false
233
230
  },
234
231
  rowExpandedFlag: 1,
@@ -237,6 +234,8 @@ export default defineComponent({
237
234
  pendingRowFlag: 1,
238
235
  insertRowFlag: 1,
239
236
  removeRowFlag: 1,
237
+ mergeBodyFlag: 1,
238
+ mergeFootFlag: 1,
240
239
  rowHeightStore: {
241
240
  default: 48,
242
241
  medium: 44,
@@ -329,13 +328,26 @@ export default defineComponent({
329
328
  tableFullColumn: [],
330
329
  // 渲染所有列
331
330
  visibleColumn: [],
332
- // 总的缓存数据集
331
+ // 全量数据集(包括当前和已删除)
333
332
  fullAllDataRowIdData: {},
333
+ // 数据集(仅当前)
334
+ fullDataRowIdData: {},
335
+ // 数据集(仅可视)
336
+ visibleDataRowIdData: {},
334
337
  // 渲染中缓存数据
335
338
  sourceDataRowIdData: {},
336
- fullDataRowIdData: {},
337
339
  fullColumnIdData: {},
338
340
  fullColumnFieldData: {},
341
+ // 合并单元格的数据
342
+ mergeBodyList: [],
343
+ mergeBodyMaps: {},
344
+ // 合并表尾的数据
345
+ mergeFooterList: [],
346
+ mergeFooterMaps: {},
347
+ // 已合并单元格数据集合
348
+ mergeBodyCellMaps: {},
349
+ // 已合并表尾数据集合
350
+ mergeFooterCellMaps: {},
339
351
  // 已展开的行集合
340
352
  rowExpandedMaps: {},
341
353
  // 懒加载中的展开行的集合
@@ -642,17 +654,18 @@ export default defineComponent({
642
654
  return Object.assign({}, getConfig().table.customConfig, props.customConfig);
643
655
  });
644
656
  const computeTableRowExpandedList = computed(() => {
645
- const { rowExpandedFlag, tableData, expandColumn } = reactData;
646
- const { rowExpandedMaps } = internalData;
647
- const { handleGetRowId } = createHandleGetRowId($xeTable);
657
+ const { treeConfig } = props;
658
+ const { rowExpandedFlag, expandColumn } = reactData;
659
+ const { visibleDataRowIdData, rowExpandedMaps } = internalData;
660
+ const treeOpts = computeTreeOpts.value;
661
+ const { transform } = treeOpts;
648
662
  const expandList = [];
649
663
  if (expandColumn && rowExpandedFlag) {
650
- const rowKeys = {};
651
- tableData.forEach(row => {
652
- rowKeys[handleGetRowId(row)] = true;
653
- });
664
+ if (treeConfig && !transform) {
665
+ return XEUtils.values(rowExpandedMaps);
666
+ }
654
667
  XEUtils.each(rowExpandedMaps, (row, rowid) => {
655
- if (rowKeys[rowid]) {
668
+ if (visibleDataRowIdData[rowid]) {
656
669
  expandList.push(row);
657
670
  }
658
671
  });
@@ -1023,30 +1036,66 @@ export default defineComponent({
1023
1036
  }
1024
1037
  }
1025
1038
  };
1026
- const setMerges = (merges, mList, rowList) => {
1039
+ function buildMergeData(mergeConfigs) {
1040
+ const mergeMaps = {};
1041
+ if (mergeConfigs && mergeConfigs.length) {
1042
+ for (let mIndex = 0; mIndex < mergeConfigs.length; mIndex++) {
1043
+ const { row: _rowIndex, col: _columnIndex, rowspan: mergeRowspan, colspan: mergeColspan } = mergeConfigs[mIndex];
1044
+ for (let i = 0; i < mergeRowspan; i++) {
1045
+ for (let j = 0; j < mergeColspan; j++) {
1046
+ mergeMaps[`${_rowIndex + i}:${_columnIndex + j}`] = !i && !j
1047
+ ? {
1048
+ rowspan: mergeRowspan,
1049
+ colspan: mergeColspan
1050
+ }
1051
+ : {
1052
+ rowspan: 0,
1053
+ colspan: 0
1054
+ };
1055
+ }
1056
+ }
1057
+ }
1058
+ }
1059
+ return mergeMaps;
1060
+ }
1061
+ const handleBodyMerge = (merges) => {
1062
+ const { fullAllDataRowIdData, fullColumnIdData, visibleColumn, afterFullData, mergeBodyList, mergeBodyMaps } = internalData;
1027
1063
  if (merges) {
1028
- // const { treeConfig } = props
1029
- const { visibleColumn } = internalData;
1064
+ const { handleGetRowId } = createHandleGetRowId($xeTable);
1030
1065
  if (!XEUtils.isArray(merges)) {
1031
1066
  merges = [merges];
1032
1067
  }
1033
- // if (treeConfig && merges.length) {
1034
- // errLog('vxe.error.noTree', ['merge-cells | merge-footer-items'])
1035
- // }
1036
1068
  merges.forEach((item) => {
1037
- let { row, col, rowspan, colspan } = item;
1038
- if (rowList && XEUtils.isNumber(row)) {
1039
- row = rowList[row];
1069
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item;
1070
+ let mergeRowIndex = -1;
1071
+ let mergeColumnIndex = -1;
1072
+ if (XEUtils.isNumber(margeRow)) {
1073
+ mergeRowIndex = margeRow;
1040
1074
  }
1041
- if (XEUtils.isNumber(col)) {
1042
- col = visibleColumn[col];
1075
+ else {
1076
+ const rowid = margeRow ? handleGetRowId(margeRow) : null;
1077
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null;
1078
+ if (rowRest) {
1079
+ mergeRowIndex = rowRest._index;
1080
+ }
1081
+ }
1082
+ if (XEUtils.isNumber(margeCol)) {
1083
+ mergeColumnIndex = margeCol;
1084
+ }
1085
+ else {
1086
+ const colid = margeCol ? margeCol.id : null;
1087
+ const colRest = colid ? fullColumnIdData[colid] : null;
1088
+ if (colRest) {
1089
+ mergeColumnIndex = colRest._index;
1090
+ }
1043
1091
  }
1044
- if ((rowList ? row : XEUtils.isNumber(row)) && col && (rowspan || colspan)) {
1092
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1045
1093
  rowspan = XEUtils.toNumber(rowspan) || 1;
1046
1094
  colspan = XEUtils.toNumber(colspan) || 1;
1047
1095
  if (rowspan > 1 || colspan > 1) {
1048
- const mcIndex = XEUtils.findIndexOf(mList, item => (item._row === row || getRowid($xeTable, item._row) === getRowid($xeTable, row)) && (item._col.id === col || item._col.id === col.id));
1049
- const mergeItem = mList[mcIndex];
1096
+ const row = afterFullData[mergeRowIndex];
1097
+ const column = visibleColumn[mergeColumnIndex];
1098
+ let mergeItem = mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1050
1099
  if (mergeItem) {
1051
1100
  mergeItem.rowspan = rowspan;
1052
1101
  mergeItem.colspan = colspan;
@@ -1054,18 +1103,65 @@ export default defineComponent({
1054
1103
  mergeItem._colspan = colspan;
1055
1104
  }
1056
1105
  else {
1057
- const mergeRowIndex = rowList ? $xeTable.findRowIndexOf(rowList, row) : row;
1058
- const mergeColIndex = tableMethods.getVTColumnIndex(col);
1059
- mList.push({
1106
+ mergeItem = {
1060
1107
  row: mergeRowIndex,
1061
- col: mergeColIndex,
1108
+ col: mergeColumnIndex,
1062
1109
  rowspan,
1063
1110
  colspan,
1064
1111
  _row: row,
1065
- _col: col,
1112
+ _col: column,
1066
1113
  _rowspan: rowspan,
1067
1114
  _colspan: colspan
1068
- });
1115
+ };
1116
+ mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1117
+ mergeBodyList.push(mergeItem);
1118
+ }
1119
+ }
1120
+ }
1121
+ });
1122
+ }
1123
+ };
1124
+ const handleFooterMerge = (merges) => {
1125
+ const { footerTableData } = reactData;
1126
+ const { mergeFooterList, mergeFooterMaps } = internalData;
1127
+ if (merges) {
1128
+ const { visibleColumn } = internalData;
1129
+ if (!XEUtils.isArray(merges)) {
1130
+ merges = [merges];
1131
+ }
1132
+ merges.forEach((item) => {
1133
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item;
1134
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1;
1135
+ let mergeColumnIndex = -1;
1136
+ if (XEUtils.isNumber(margeCol)) {
1137
+ mergeColumnIndex = margeCol;
1138
+ }
1139
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1140
+ rowspan = XEUtils.toNumber(rowspan) || 1;
1141
+ colspan = XEUtils.toNumber(colspan) || 1;
1142
+ if (rowspan > 1 || colspan > 1) {
1143
+ const row = footerTableData[mergeRowIndex];
1144
+ const column = visibleColumn[mergeColumnIndex];
1145
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`];
1146
+ if (mergeItem) {
1147
+ mergeItem.rowspan = rowspan;
1148
+ mergeItem.colspan = colspan;
1149
+ mergeItem._rowspan = rowspan;
1150
+ mergeItem._colspan = colspan;
1151
+ }
1152
+ else {
1153
+ mergeItem = {
1154
+ row: mergeRowIndex,
1155
+ col: mergeColumnIndex,
1156
+ rowspan,
1157
+ colspan,
1158
+ _row: row,
1159
+ _col: column,
1160
+ _rowspan: rowspan,
1161
+ _colspan: colspan
1162
+ };
1163
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem;
1164
+ mergeFooterList.push(mergeItem);
1069
1165
  }
1070
1166
  }
1071
1167
  }
@@ -1209,6 +1305,7 @@ export default defineComponent({
1209
1305
  const expandOpts = computeExpandOpts.value;
1210
1306
  const columnOpts = computeColumnOpts.value;
1211
1307
  const columnDragOpts = computeColumnDragOpts.value;
1308
+ const virtualYOpts = computeVirtualYOpts.value;
1212
1309
  const { isCrossDrag, isSelfToChildDrag } = columnDragOpts;
1213
1310
  const customOpts = computeCustomOpts.value;
1214
1311
  const { storage } = customOpts;
@@ -1242,41 +1339,35 @@ export default defineComponent({
1242
1339
  htmlColumn = column;
1243
1340
  }
1244
1341
  if (treeNode) {
1245
- if (process.env.NODE_ENV === 'development') {
1246
- if (treeNodeColumn) {
1247
- warnLog('vxe.error.colRepet', ['tree-node', treeNode]);
1248
- }
1342
+ if (treeNodeColumn) {
1343
+ warnLog('vxe.error.colRepet', ['tree-node', treeNode]);
1249
1344
  }
1250
1345
  if (!treeNodeColumn) {
1251
1346
  treeNodeColumn = column;
1252
1347
  }
1253
1348
  }
1254
1349
  else if (type === 'expand') {
1255
- if (process.env.NODE_ENV === 'development') {
1256
- if (expandColumn) {
1257
- warnLog('vxe.error.colRepet', ['type', type]);
1258
- }
1350
+ if (expandColumn) {
1351
+ warnLog('vxe.error.colRepet', ['type', type]);
1259
1352
  }
1260
1353
  if (!expandColumn) {
1261
1354
  expandColumn = column;
1262
1355
  }
1263
1356
  }
1264
- if (process.env.NODE_ENV === 'development') {
1265
- if (type === 'checkbox') {
1266
- if (checkboxColumn) {
1267
- warnLog('vxe.error.colRepet', ['type', type]);
1268
- }
1269
- if (!checkboxColumn) {
1270
- checkboxColumn = column;
1271
- }
1357
+ if (type === 'checkbox') {
1358
+ if (checkboxColumn) {
1359
+ warnLog('vxe.error.colRepet', ['type', type]);
1272
1360
  }
1273
- else if (type === 'radio') {
1274
- if (radioColumn) {
1275
- warnLog('vxe.error.colRepet', ['type', type]);
1276
- }
1277
- if (!radioColumn) {
1278
- radioColumn = column;
1279
- }
1361
+ if (!checkboxColumn) {
1362
+ checkboxColumn = column;
1363
+ }
1364
+ }
1365
+ else if (type === 'radio') {
1366
+ if (radioColumn) {
1367
+ warnLog('vxe.error.colRepet', ['type', type]);
1368
+ }
1369
+ if (!radioColumn) {
1370
+ radioColumn = column;
1280
1371
  }
1281
1372
  }
1282
1373
  if (isAllOverflow && column.showOverflow === false) {
@@ -1296,6 +1387,9 @@ export default defineComponent({
1296
1387
  else {
1297
1388
  tableFullColumn.forEach(handleFunc);
1298
1389
  }
1390
+ if (expandColumn && expandOpts.mode !== 'fixed' && virtualYOpts.enabled) {
1391
+ warnLog('vxe.error.notConflictProp', ['column.type="expand', 'virtual-y-config.enabled=false']);
1392
+ }
1299
1393
  if ((expandColumn && expandOpts.mode !== 'fixed') && mouseOpts.area) {
1300
1394
  errLog('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand']);
1301
1395
  }
@@ -2611,6 +2705,7 @@ export default defineComponent({
2611
2705
  const { scrollYLoad: oldScrollYLoad } = reactData;
2612
2706
  const { scrollYStore, scrollXStore, lastScrollLeft, lastScrollTop } = internalData;
2613
2707
  const treeOpts = computeTreeOpts.value;
2708
+ const expandOpts = computeExpandOpts.value;
2614
2709
  const { transform } = treeOpts;
2615
2710
  const childrenField = treeOpts.children || treeOpts.childrenField;
2616
2711
  let treeData = [];
@@ -2668,7 +2763,7 @@ export default defineComponent({
2668
2763
  internalData.tableFullData = fullData;
2669
2764
  internalData.tableFullTreeData = treeData;
2670
2765
  // 缓存数据
2671
- $xeTable.cacheRowMap(true);
2766
+ $xeTable.cacheRowMap(isReset);
2672
2767
  // 原始数据
2673
2768
  internalData.tableSynchData = datas;
2674
2769
  if (isReset) {
@@ -2686,6 +2781,7 @@ export default defineComponent({
2686
2781
  $xeTable.clearMergeFooterItems();
2687
2782
  $xeTable.handleTableData(true);
2688
2783
  $xeTable.updateFooter();
2784
+ $xeTable.handleUpdateBodyMerge();
2689
2785
  return nextTick().then(() => {
2690
2786
  updateHeight();
2691
2787
  updateStyle();
@@ -2697,6 +2793,9 @@ export default defineComponent({
2697
2793
  scrollYStore.endIndex = scrollYStore.visibleSize;
2698
2794
  }
2699
2795
  if (sYLoad) {
2796
+ if (reactData.expandColumn && expandOpts.mode !== 'fixed') {
2797
+ errLog('vxe.error.notConflictProp', ['column.type="expand', 'expand-config.mode="fixed"']);
2798
+ }
2700
2799
  // if (showOverflow) {
2701
2800
  // if (!rowOpts.height) {
2702
2801
  // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
@@ -2795,8 +2894,8 @@ export default defineComponent({
2795
2894
  cacheColumnMap();
2796
2895
  };
2797
2896
  const loadScrollXData = () => {
2798
- const { mergeList, mergeFooterList, isScrollXBig } = reactData;
2799
- const { scrollXStore } = internalData;
2897
+ const { isScrollXBig } = reactData;
2898
+ const { mergeBodyList, mergeFooterList, scrollXStore } = internalData;
2800
2899
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollXStore;
2801
2900
  const { toVisibleIndex, visibleSize } = handleVirtualXVisible();
2802
2901
  const offsetItem = {
@@ -2805,7 +2904,7 @@ export default defineComponent({
2805
2904
  };
2806
2905
  scrollXStore.visibleStartIndex = toVisibleIndex - 1;
2807
2906
  scrollXStore.visibleEndIndex = toVisibleIndex + visibleSize + 1;
2808
- calculateMergerOffsetIndex(mergeList.concat(mergeFooterList), offsetItem, 'col');
2907
+ calculateMergerOffsetIndex(mergeBodyList.concat(mergeFooterList), offsetItem, 'col');
2809
2908
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem;
2810
2909
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
2811
2910
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -3115,8 +3214,8 @@ export default defineComponent({
3115
3214
  * 纵向 Y 可视渲染处理
3116
3215
  */
3117
3216
  const loadScrollYData = () => {
3118
- const { mergeList, isAllOverflow, isScrollYBig } = reactData;
3119
- const { scrollYStore } = internalData;
3217
+ const { isAllOverflow, isScrollYBig } = reactData;
3218
+ const { mergeBodyList, scrollYStore } = internalData;
3120
3219
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollYStore;
3121
3220
  const autoOffsetYSize = isAllOverflow ? offsetSize : offsetSize + 1;
3122
3221
  const { toVisibleIndex, visibleSize } = handleVirtualYVisible();
@@ -3126,7 +3225,7 @@ export default defineComponent({
3126
3225
  };
3127
3226
  scrollYStore.visibleStartIndex = toVisibleIndex - 1;
3128
3227
  scrollYStore.visibleEndIndex = toVisibleIndex + visibleSize + 1;
3129
- calculateMergerOffsetIndex(mergeList, offsetItem, 'row');
3228
+ calculateMergerOffsetIndex(mergeBodyList, offsetItem, 'row');
3130
3229
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem;
3131
3230
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
3132
3231
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -3421,7 +3520,7 @@ export default defineComponent({
3421
3520
  * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到
3422
3521
  */
3423
3522
  syncData() {
3424
- warnLog('vxe.error.delFunc', ['syncData', 'getData']);
3523
+ errLog('vxe.error.delFunc', ['syncData', 'getData']);
3425
3524
  return nextTick().then(() => {
3426
3525
  reactData.tableData = [];
3427
3526
  emit('update:data', internalData.tableFullData);
@@ -4095,6 +4194,7 @@ export default defineComponent({
4095
4194
  */
4096
4195
  getCheckboxRecords(isFull) {
4097
4196
  const { treeConfig } = props;
4197
+ const { updateCheckboxFlag } = reactData;
4098
4198
  const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps, selectCheckboxMaps } = internalData;
4099
4199
  const treeOpts = computeTreeOpts.value;
4100
4200
  const checkboxOpts = computeCheckboxOpts.value;
@@ -4102,29 +4202,31 @@ export default defineComponent({
4102
4202
  const { checkField } = checkboxOpts;
4103
4203
  const childrenField = treeOpts.children || treeOpts.childrenField;
4104
4204
  let rowList = [];
4105
- if (checkField) {
4106
- if (treeConfig) {
4107
- const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
4108
- rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField });
4205
+ if (updateCheckboxFlag) {
4206
+ if (checkField) {
4207
+ if (treeConfig) {
4208
+ const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData);
4209
+ rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField });
4210
+ }
4211
+ else {
4212
+ const currTableData = isFull ? tableFullData : afterFullData;
4213
+ rowList = currTableData.filter((row) => XEUtils.get(row, checkField));
4214
+ }
4109
4215
  }
4110
4216
  else {
4111
- const currTableData = isFull ? tableFullData : afterFullData;
4112
- rowList = currTableData.filter((row) => XEUtils.get(row, checkField));
4113
- }
4114
- }
4115
- else {
4116
- XEUtils.each(selectCheckboxMaps, (row, rowid) => {
4117
- if (isFull) {
4118
- if (fullDataRowIdData[rowid]) {
4119
- rowList.push(fullDataRowIdData[rowid].row);
4217
+ XEUtils.each(selectCheckboxMaps, (row, rowid) => {
4218
+ if (isFull) {
4219
+ if (fullDataRowIdData[rowid]) {
4220
+ rowList.push(fullDataRowIdData[rowid].row);
4221
+ }
4120
4222
  }
4121
- }
4122
- else {
4123
- if (afterFullRowMaps[rowid]) {
4124
- rowList.push(afterFullRowMaps[rowid]);
4223
+ else {
4224
+ if (afterFullRowMaps[rowid]) {
4225
+ rowList.push(afterFullRowMaps[rowid]);
4226
+ }
4125
4227
  }
4126
- }
4127
- });
4228
+ });
4229
+ }
4128
4230
  }
4129
4231
  return rowList;
4130
4232
  },
@@ -5693,6 +5795,7 @@ export default defineComponent({
5693
5795
  footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: afterFullData, $table: $xeTable, $grid: $xeGrid }) : [];
5694
5796
  }
5695
5797
  reactData.footerTableData = footData;
5798
+ $xeTable.handleUpdateFooterMerge();
5696
5799
  return nextTick();
5697
5800
  },
5698
5801
  /**
@@ -5716,9 +5819,10 @@ export default defineComponent({
5716
5819
  if (props.spanMethod) {
5717
5820
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method']);
5718
5821
  }
5719
- setMerges(merges, reactData.mergeList, internalData.afterFullData);
5822
+ handleBodyMerge(merges);
5823
+ $xeTable.handleUpdateBodyMerge();
5720
5824
  return nextTick().then(() => {
5721
- tableMethods.updateCellAreas();
5825
+ $xeTable.updateCellAreas();
5722
5826
  return updateStyle();
5723
5827
  });
5724
5828
  },
@@ -5730,9 +5834,9 @@ export default defineComponent({
5730
5834
  if (props.spanMethod) {
5731
5835
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method']);
5732
5836
  }
5733
- const rest = removeMerges(merges, reactData.mergeList, internalData.afterFullData);
5837
+ const rest = removeMerges(merges, internalData.mergeBodyList, internalData.afterFullData);
5734
5838
  return nextTick().then(() => {
5735
- tableMethods.updateCellAreas();
5839
+ $xeTable.updateCellAreas();
5736
5840
  updateStyle();
5737
5841
  return rest;
5738
5842
  });
@@ -5741,13 +5845,15 @@ export default defineComponent({
5741
5845
  * 获取所有被合并的单元格
5742
5846
  */
5743
5847
  getMergeCells() {
5744
- return reactData.mergeList.slice(0);
5848
+ return internalData.mergeBodyList.slice(0);
5745
5849
  },
5746
5850
  /**
5747
5851
  * 清除所有单元格合并
5748
5852
  */
5749
5853
  clearMergeCells() {
5750
- reactData.mergeList = [];
5854
+ internalData.mergeBodyList = [];
5855
+ internalData.mergeBodyMaps = {};
5856
+ internalData.mergeBodyCellMaps = {};
5751
5857
  return nextTick().then(() => {
5752
5858
  return updateStyle();
5753
5859
  });
@@ -5756,7 +5862,8 @@ export default defineComponent({
5756
5862
  if (props.footerSpanMethod) {
5757
5863
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
5758
5864
  }
5759
- setMerges(merges, reactData.mergeFooterList);
5865
+ handleFooterMerge(merges);
5866
+ $xeTable.handleUpdateFooterMerge();
5760
5867
  return nextTick().then(() => {
5761
5868
  tableMethods.updateCellAreas();
5762
5869
  return updateStyle();
@@ -5766,7 +5873,7 @@ export default defineComponent({
5766
5873
  if (props.footerSpanMethod) {
5767
5874
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method']);
5768
5875
  }
5769
- const rest = removeMerges(merges, reactData.mergeFooterList);
5876
+ const rest = removeMerges(merges, internalData.mergeFooterList);
5770
5877
  return nextTick().then(() => {
5771
5878
  tableMethods.updateCellAreas();
5772
5879
  updateStyle();
@@ -5777,13 +5884,15 @@ export default defineComponent({
5777
5884
  * 获取所有被合并的表尾
5778
5885
  */
5779
5886
  getMergeFooterItems() {
5780
- return reactData.mergeFooterList.slice(0);
5887
+ return internalData.mergeFooterList.slice(0);
5781
5888
  },
5782
5889
  /**
5783
5890
  * 清除所有表尾合并
5784
5891
  */
5785
5892
  clearMergeFooterItems() {
5786
- reactData.mergeFooterList = [];
5893
+ internalData.mergeFooterList = [];
5894
+ internalData.mergeFooterMaps = {};
5895
+ internalData.mergeFooterCellMaps = {};
5787
5896
  return nextTick().then(() => {
5788
5897
  return updateStyle();
5789
5898
  });
@@ -6820,27 +6929,30 @@ export default defineComponent({
6820
6929
  fullList = handleVirtualTreeToList();
6821
6930
  }
6822
6931
  const tableData = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0);
6932
+ const visibleDataRowIdMaps = {};
6823
6933
  tableData.forEach((row, $index) => {
6824
6934
  const rowid = getRowid($xeTable, row);
6825
6935
  const rest = fullDataRowIdData[rowid];
6826
6936
  if (rest) {
6827
6937
  rest.$index = $index;
6828
6938
  }
6939
+ visibleDataRowIdMaps[rowid] = row;
6829
6940
  });
6830
6941
  reactData.tableData = tableData;
6942
+ internalData.visibleDataRowIdData = visibleDataRowIdMaps;
6831
6943
  return nextTick();
6832
6944
  },
6833
6945
  /**
6834
6946
  * 更新数据行的 Map
6835
6947
  */
6836
- cacheRowMap() {
6948
+ cacheRowMap(isReset) {
6837
6949
  const { treeConfig } = props;
6838
6950
  const { fullAllDataRowIdData, tableFullData, tableFullTreeData, treeExpandedMaps } = internalData;
6839
6951
  const treeOpts = computeTreeOpts.value;
6840
6952
  const childrenField = treeOpts.children || treeOpts.childrenField;
6841
6953
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField;
6842
6954
  const { lazy } = treeOpts;
6843
- const fullAllDataRowIdMaps = Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
6955
+ const fullAllDataRowIdMaps = isReset ? {} : Object.assign({}, fullAllDataRowIdData); // 存在已删除数据
6844
6956
  const fullDataRowIdMaps = {};
6845
6957
  const { handleUpdateRowId } = createHandleUpdateRowId($xeTable);
6846
6958
  const handleRowCache = (row, index, items, currIndex, parentRow, rowid, level, seq) => {
@@ -7621,6 +7733,19 @@ export default defineComponent({
7621
7733
  handleSelectRow({ row }, checked, isForce) {
7622
7734
  $xeTable.handleBatchSelectRows([row], checked, isForce);
7623
7735
  },
7736
+ /**
7737
+ * 处理合并
7738
+ */
7739
+ handleUpdateBodyMerge() {
7740
+ const { mergeBodyList } = internalData;
7741
+ internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList);
7742
+ reactData.mergeBodyFlag++;
7743
+ },
7744
+ handleUpdateFooterMerge() {
7745
+ const { mergeFooterList } = internalData;
7746
+ internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList);
7747
+ reactData.mergeFootFlag++;
7748
+ },
7624
7749
  triggerHeaderTitleEvent(evnt, iconParams, params) {
7625
7750
  const tipContent = iconParams.content || iconParams.message;
7626
7751
  if (tipContent) {
@@ -9665,21 +9790,23 @@ export default defineComponent({
9665
9790
  const { transform, seqMode } = treeOpts;
9666
9791
  const cellStyle = {};
9667
9792
  const rowid = handleGetRowId(row);
9668
- const rest = fullAllDataRowIdData[rowid];
9793
+ const rowRest = fullAllDataRowIdData[rowid];
9669
9794
  let rowLevel = 0;
9670
9795
  let seq = -1;
9671
- let _rowIndex = 0;
9672
- const rowIndex = $xeTable.getRowIndex(row);
9673
- const $rowIndex = $xeTable.getVMRowIndex(row);
9674
- if (rest) {
9675
- rowLevel = rest.level;
9796
+ let _rowIndex = -1;
9797
+ let rowIndex = -1;
9798
+ let $rowIndex = -1;
9799
+ if (rowRest) {
9800
+ rowLevel = rowRest.level;
9676
9801
  if (treeConfig && transform && seqMode === 'increasing') {
9677
- seq = rest._index + 1;
9802
+ seq = rowRest._index + 1;
9678
9803
  }
9679
9804
  else {
9680
- seq = rest.seq;
9805
+ seq = rowRest.seq;
9681
9806
  }
9682
- _rowIndex = rest._index;
9807
+ rowIndex = rowRest.index;
9808
+ $rowIndex = rowRest.$index;
9809
+ _rowIndex = rowRest._index;
9683
9810
  }
9684
9811
  if (expandHeight) {
9685
9812
  cellStyle.height = `${expandHeight}px`;
@@ -10272,6 +10399,8 @@ export default defineComponent({
10272
10399
  if (columnOpts.drag || rowOpts.drag || customOpts.allowSort) {
10273
10400
  initTpImg();
10274
10401
  }
10402
+ ;
10403
+ window.aa = $xeTable;
10275
10404
  nextTick(() => {
10276
10405
  const { data, exportConfig, importConfig, treeConfig, showOverflow, highlightCurrentRow, highlightCurrentColumn } = props;
10277
10406
  const { scrollXStore, scrollYStore } = internalData;
@@ -10289,6 +10418,7 @@ export default defineComponent({
10289
10418
  const currentColumnOpts = computeCurrentColumnOpts.value;
10290
10419
  const virtualXOpts = computeVirtualXOpts.value;
10291
10420
  const virtualYOpts = computeVirtualYOpts.value;
10421
+ const keyboardOpts = computeKeyboardOpts.value;
10292
10422
  if (props.rowId) {
10293
10423
  warnLog('vxe.error.delProp', ['row-id', 'row-config.keyField']);
10294
10424
  }
@@ -10328,6 +10458,12 @@ export default defineComponent({
10328
10458
  if (props.highlightHoverColumn) {
10329
10459
  warnLog('vxe.error.delProp', ['highlight-hover-column', 'column-config.isHover']);
10330
10460
  }
10461
+ // if (props.scrollY) {
10462
+ // warnLog('vxe.error.delProp', ['scroll-y', 'virtual-y-config'])
10463
+ // }
10464
+ // if (props.scrollX) {
10465
+ // warnLog('vxe.error.delProp', ['scroll-x', 'virtual-x-config'])
10466
+ // }
10331
10467
  // 检查导入导出类型,如果自定义导入导出方法,则不校验类型
10332
10468
  if (importConfig && importOpts.types && !importOpts.importMethod && !XEUtils.includeArrays(XEUtils.keys(importOpts._typeMaps), importOpts.types)) {
10333
10469
  warnLog('vxe.error.errProp', [`export-config.types=${importOpts.types.join(',')}`, importOpts.types.filter((type) => XEUtils.includes(XEUtils.keys(importOpts._typeMaps), type)).join(',') || XEUtils.keys(importOpts._typeMaps).join(',')]);
@@ -10388,10 +10524,10 @@ export default defineComponent({
10388
10524
  if (checkboxOpts.halfField) {
10389
10525
  warnLog('vxe.error.delProp', ['checkbox-config.halfField', 'checkbox-config.indeterminateField']);
10390
10526
  }
10391
- if ((rowOpts.isCurrent || highlightCurrentRow) && !XEUtils.isBoolean(currentRowOpts.isFollowSelected)) {
10527
+ if ((rowOpts.isCurrent || highlightCurrentRow) && props.keyboardConfig && keyboardOpts.isArrow && !XEUtils.isBoolean(currentRowOpts.isFollowSelected)) {
10392
10528
  warnLog('vxe.error.notConflictProp', ['row-config.isCurrent', 'current-row-config.isFollowSelected']);
10393
10529
  }
10394
- if ((columnOpts.isCurrent || highlightCurrentColumn) && !XEUtils.isBoolean(currentColumnOpts.isFollowSelected)) {
10530
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && props.keyboardConfig && keyboardOpts.isArrow && !XEUtils.isBoolean(currentColumnOpts.isFollowSelected)) {
10395
10531
  warnLog('vxe.error.notConflictProp', ['column-config.isCurrent', 'current-column-config.isFollowSelected']);
10396
10532
  }
10397
10533
  // 如果不支持虚拟滚动