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
@@ -94,10 +94,6 @@ export default defineComponent({
94
94
  // 树节点列信息
95
95
  treeNodeColumn: null,
96
96
  hasFixedColumn: false,
97
- // 合并单元格的对象集
98
- mergeList: [],
99
- // 合并表尾数据的对象集
100
- mergeFooterList: [],
101
97
  // 刷新列标识,当列筛选被改变时,触发表格刷新数据
102
98
  upDataFlag: 0,
103
99
  // 刷新列标识,当列的特定属性被改变时,触发表格刷新列
@@ -241,6 +237,7 @@ export default defineComponent({
241
237
  original: false,
242
238
  message: true,
243
239
  isHeader: false,
240
+ isTitle: false,
244
241
  isFooter: false
245
242
  },
246
243
 
@@ -250,6 +247,8 @@ export default defineComponent({
250
247
  pendingRowFlag: 1,
251
248
  insertRowFlag: 1,
252
249
  removeRowFlag: 1,
250
+ mergeBodyFlag: 1,
251
+ mergeFootFlag: 1,
253
252
 
254
253
  rowHeightStore: {
255
254
  default: 48,
@@ -349,14 +348,27 @@ export default defineComponent({
349
348
  tableFullColumn: [],
350
349
  // 渲染所有列
351
350
  visibleColumn: [],
352
- // 总的缓存数据集
351
+ // 全量数据集(包括当前和已删除)
353
352
  fullAllDataRowIdData: {},
353
+ // 数据集(仅当前)
354
+ fullDataRowIdData: {},
355
+ // 数据集(仅可视)
356
+ visibleDataRowIdData: {},
354
357
  // 渲染中缓存数据
355
358
  sourceDataRowIdData: {},
356
- fullDataRowIdData: {},
357
359
  fullColumnIdData: {},
358
360
  fullColumnFieldData: {},
359
361
 
362
+ // 合并单元格的数据
363
+ mergeBodyList: [],
364
+ mergeBodyMaps: {},
365
+ // 合并表尾的数据
366
+ mergeFooterList: [],
367
+ mergeFooterMaps: {},
368
+ // 已合并单元格数据集合
369
+ mergeBodyCellMaps: {},
370
+ // 已合并表尾数据集合
371
+ mergeFooterCellMaps: {},
360
372
  // 已展开的行集合
361
373
  rowExpandedMaps: {},
362
374
  // 懒加载中的展开行的集合
@@ -728,17 +740,18 @@ export default defineComponent({
728
740
  })
729
741
 
730
742
  const computeTableRowExpandedList = computed(() => {
731
- const { rowExpandedFlag, tableData, expandColumn } = reactData
732
- const { rowExpandedMaps } = internalData
733
- const { handleGetRowId } = createHandleGetRowId($xeTable)
743
+ const { treeConfig } = props
744
+ const { rowExpandedFlag, expandColumn } = reactData
745
+ const { visibleDataRowIdData, rowExpandedMaps } = internalData
746
+ const treeOpts = computeTreeOpts.value
747
+ const { transform } = treeOpts
734
748
  const expandList: any[] = []
735
749
  if (expandColumn && rowExpandedFlag) {
736
- const rowKeys: Record<string, boolean> = {}
737
- tableData.forEach(row => {
738
- rowKeys[handleGetRowId(row)] = true
739
- })
750
+ if (treeConfig && !transform) {
751
+ return XEUtils.values(rowExpandedMaps)
752
+ }
740
753
  XEUtils.each(rowExpandedMaps, (row, rowid) => {
741
- if (rowKeys[rowid]) {
754
+ if (visibleDataRowIdData[rowid]) {
742
755
  expandList.push(row)
743
756
  }
744
757
  })
@@ -1128,48 +1141,130 @@ export default defineComponent({
1128
1141
  }
1129
1142
  }
1130
1143
 
1131
- const setMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[], mList: VxeTableDefines.MergeItem[], rowList?: any[]) => {
1144
+ function buildMergeData (mergeConfigs: VxeTableDefines.MergeItem[]) {
1145
+ const mergeMaps: Record<string, VxeTableDefines.MergeCacheItem> = {}
1146
+ if (mergeConfigs && mergeConfigs.length) {
1147
+ for (let mIndex = 0; mIndex < mergeConfigs.length; mIndex++) {
1148
+ const { row: _rowIndex, col: _columnIndex, rowspan: mergeRowspan, colspan: mergeColspan } = mergeConfigs[mIndex]
1149
+ for (let i = 0; i < mergeRowspan; i++) {
1150
+ for (let j = 0; j < mergeColspan; j++) {
1151
+ mergeMaps[`${_rowIndex + i}:${_columnIndex + j}`] = !i && !j
1152
+ ? {
1153
+ rowspan: mergeRowspan,
1154
+ colspan: mergeColspan
1155
+ }
1156
+ : {
1157
+ rowspan: 0,
1158
+ colspan: 0
1159
+ }
1160
+ }
1161
+ }
1162
+ }
1163
+ }
1164
+ return mergeMaps
1165
+ }
1166
+
1167
+ const handleBodyMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1168
+ const { fullAllDataRowIdData, fullColumnIdData, visibleColumn, afterFullData, mergeBodyList, mergeBodyMaps } = internalData
1132
1169
  if (merges) {
1133
- // const { treeConfig } = props
1134
- const { visibleColumn } = internalData
1170
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
1135
1171
  if (!XEUtils.isArray(merges)) {
1136
1172
  merges = [merges]
1137
1173
  }
1138
- // if (treeConfig && merges.length) {
1139
- // errLog('vxe.error.noTree', ['merge-cells | merge-footer-items'])
1140
- // }
1141
1174
  merges.forEach((item) => {
1142
- let { row, col, rowspan, colspan } = item
1143
- if (rowList && XEUtils.isNumber(row)) {
1144
- row = rowList[row]
1175
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item
1176
+ let mergeRowIndex = -1
1177
+ let mergeColumnIndex = -1
1178
+ if (XEUtils.isNumber(margeRow)) {
1179
+ mergeRowIndex = margeRow
1180
+ } else {
1181
+ const rowid = margeRow ? handleGetRowId(margeRow) : null
1182
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
1183
+ if (rowRest) {
1184
+ mergeRowIndex = rowRest._index
1185
+ }
1145
1186
  }
1146
- if (XEUtils.isNumber(col)) {
1147
- col = visibleColumn[col]
1187
+ if (XEUtils.isNumber(margeCol)) {
1188
+ mergeColumnIndex = margeCol
1189
+ } else {
1190
+ const colid = margeCol ? margeCol.id : null
1191
+ const colRest = colid ? fullColumnIdData[colid] : null
1192
+ if (colRest) {
1193
+ mergeColumnIndex = colRest._index
1194
+ }
1148
1195
  }
1149
- if ((rowList ? row : XEUtils.isNumber(row)) && col && (rowspan || colspan)) {
1196
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1150
1197
  rowspan = XEUtils.toNumber(rowspan) || 1
1151
1198
  colspan = XEUtils.toNumber(colspan) || 1
1152
1199
  if (rowspan > 1 || colspan > 1) {
1153
- const mcIndex = XEUtils.findIndexOf(mList, item => (item._row === row || getRowid($xeTable, item._row) === getRowid($xeTable, row)) && ((item as any)._col.id === col || item._col.id === (col as VxeTableDefines.ColumnInfo).id))
1154
- const mergeItem = mList[mcIndex]
1200
+ const row = afterFullData[mergeRowIndex]
1201
+ const column = visibleColumn[mergeColumnIndex]
1202
+ let mergeItem = mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1155
1203
  if (mergeItem) {
1156
1204
  mergeItem.rowspan = rowspan
1157
1205
  mergeItem.colspan = colspan
1158
1206
  mergeItem._rowspan = rowspan
1159
1207
  mergeItem._colspan = colspan
1160
1208
  } else {
1161
- const mergeRowIndex = rowList ? $xeTable.findRowIndexOf(rowList, row) : row
1162
- const mergeColIndex = tableMethods.getVTColumnIndex(col)
1163
- mList.push({
1209
+ mergeItem = {
1164
1210
  row: mergeRowIndex,
1165
- col: mergeColIndex,
1211
+ col: mergeColumnIndex,
1166
1212
  rowspan,
1167
1213
  colspan,
1168
1214
  _row: row,
1169
- _col: col,
1215
+ _col: column,
1170
1216
  _rowspan: rowspan,
1171
1217
  _colspan: colspan
1172
- })
1218
+ }
1219
+ mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1220
+ mergeBodyList.push(mergeItem)
1221
+ }
1222
+ }
1223
+ }
1224
+ })
1225
+ }
1226
+ }
1227
+
1228
+ const handleFooterMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1229
+ const { footerTableData } = reactData
1230
+ const { mergeFooterList, mergeFooterMaps } = internalData
1231
+ if (merges) {
1232
+ const { visibleColumn } = internalData
1233
+ if (!XEUtils.isArray(merges)) {
1234
+ merges = [merges]
1235
+ }
1236
+ merges.forEach((item) => {
1237
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item
1238
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
1239
+ let mergeColumnIndex = -1
1240
+ if (XEUtils.isNumber(margeCol)) {
1241
+ mergeColumnIndex = margeCol
1242
+ }
1243
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1244
+ rowspan = XEUtils.toNumber(rowspan) || 1
1245
+ colspan = XEUtils.toNumber(colspan) || 1
1246
+ if (rowspan > 1 || colspan > 1) {
1247
+ const row = footerTableData[mergeRowIndex]
1248
+ const column = visibleColumn[mergeColumnIndex]
1249
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1250
+ if (mergeItem) {
1251
+ mergeItem.rowspan = rowspan
1252
+ mergeItem.colspan = colspan
1253
+ mergeItem._rowspan = rowspan
1254
+ mergeItem._colspan = colspan
1255
+ } else {
1256
+ mergeItem = {
1257
+ row: mergeRowIndex,
1258
+ col: mergeColumnIndex,
1259
+ rowspan,
1260
+ colspan,
1261
+ _row: row,
1262
+ _col: column,
1263
+ _rowspan: rowspan,
1264
+ _colspan: colspan
1265
+ }
1266
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1267
+ mergeFooterList.push(mergeItem)
1173
1268
  }
1174
1269
  }
1175
1270
  }
@@ -1317,6 +1412,7 @@ export default defineComponent({
1317
1412
  const expandOpts = computeExpandOpts.value
1318
1413
  const columnOpts = computeColumnOpts.value
1319
1414
  const columnDragOpts = computeColumnDragOpts.value
1415
+ const virtualYOpts = computeVirtualYOpts.value
1320
1416
  const { isCrossDrag, isSelfToChildDrag } = columnDragOpts
1321
1417
  const customOpts = computeCustomOpts.value
1322
1418
  const { storage } = customOpts
@@ -1349,39 +1445,33 @@ export default defineComponent({
1349
1445
  htmlColumn = column
1350
1446
  }
1351
1447
  if (treeNode) {
1352
- if (process.env.VUE_APP_VXE_ENV === 'development') {
1353
- if (treeNodeColumn) {
1354
- warnLog('vxe.error.colRepet', ['tree-node', treeNode])
1355
- }
1448
+ if (treeNodeColumn) {
1449
+ warnLog('vxe.error.colRepet', ['tree-node', treeNode])
1356
1450
  }
1357
1451
  if (!treeNodeColumn) {
1358
1452
  treeNodeColumn = column
1359
1453
  }
1360
1454
  } else if (type === 'expand') {
1361
- if (process.env.VUE_APP_VXE_ENV === 'development') {
1362
- if (expandColumn) {
1363
- warnLog('vxe.error.colRepet', ['type', type])
1364
- }
1455
+ if (expandColumn) {
1456
+ warnLog('vxe.error.colRepet', ['type', type])
1365
1457
  }
1366
1458
  if (!expandColumn) {
1367
1459
  expandColumn = column
1368
1460
  }
1369
1461
  }
1370
- if (process.env.VUE_APP_VXE_ENV === 'development') {
1371
- if (type === 'checkbox') {
1372
- if (checkboxColumn) {
1373
- warnLog('vxe.error.colRepet', ['type', type])
1374
- }
1375
- if (!checkboxColumn) {
1376
- checkboxColumn = column
1377
- }
1378
- } else if (type === 'radio') {
1379
- if (radioColumn) {
1380
- warnLog('vxe.error.colRepet', ['type', type])
1381
- }
1382
- if (!radioColumn) {
1383
- radioColumn = column
1384
- }
1462
+ if (type === 'checkbox') {
1463
+ if (checkboxColumn) {
1464
+ warnLog('vxe.error.colRepet', ['type', type])
1465
+ }
1466
+ if (!checkboxColumn) {
1467
+ checkboxColumn = column
1468
+ }
1469
+ } else if (type === 'radio') {
1470
+ if (radioColumn) {
1471
+ warnLog('vxe.error.colRepet', ['type', type])
1472
+ }
1473
+ if (!radioColumn) {
1474
+ radioColumn = column
1385
1475
  }
1386
1476
  }
1387
1477
  if (isAllOverflow && column.showOverflow === false) {
@@ -1401,6 +1491,9 @@ export default defineComponent({
1401
1491
  tableFullColumn.forEach(handleFunc)
1402
1492
  }
1403
1493
 
1494
+ if (expandColumn && expandOpts.mode !== 'fixed' && virtualYOpts.enabled) {
1495
+ warnLog('vxe.error.notConflictProp', ['column.type="expand', 'virtual-y-config.enabled=false'])
1496
+ }
1404
1497
  if ((expandColumn && expandOpts.mode !== 'fixed') && mouseOpts.area) {
1405
1498
  errLog('vxe.error.errConflicts', ['mouse-config.area', 'column.type=expand'])
1406
1499
  }
@@ -2747,6 +2840,7 @@ export default defineComponent({
2747
2840
  const { scrollYLoad: oldScrollYLoad } = reactData
2748
2841
  const { scrollYStore, scrollXStore, lastScrollLeft, lastScrollTop } = internalData
2749
2842
  const treeOpts = computeTreeOpts.value
2843
+ const expandOpts = computeExpandOpts.value
2750
2844
  const { transform } = treeOpts
2751
2845
  const childrenField = treeOpts.children || treeOpts.childrenField
2752
2846
  let treeData = []
@@ -2803,7 +2897,7 @@ export default defineComponent({
2803
2897
  internalData.tableFullData = fullData
2804
2898
  internalData.tableFullTreeData = treeData
2805
2899
  // 缓存数据
2806
- $xeTable.cacheRowMap(true)
2900
+ $xeTable.cacheRowMap(isReset)
2807
2901
  // 原始数据
2808
2902
  internalData.tableSynchData = datas
2809
2903
  if (isReset) {
@@ -2821,6 +2915,7 @@ export default defineComponent({
2821
2915
  $xeTable.clearMergeFooterItems()
2822
2916
  $xeTable.handleTableData(true)
2823
2917
  $xeTable.updateFooter()
2918
+ $xeTable.handleUpdateBodyMerge()
2824
2919
  return nextTick().then(() => {
2825
2920
  updateHeight()
2826
2921
  updateStyle()
@@ -2833,6 +2928,9 @@ export default defineComponent({
2833
2928
  }
2834
2929
 
2835
2930
  if (sYLoad) {
2931
+ if (reactData.expandColumn && expandOpts.mode !== 'fixed') {
2932
+ errLog('vxe.error.notConflictProp', ['column.type="expand', 'expand-config.mode="fixed"'])
2933
+ }
2836
2934
  // if (showOverflow) {
2837
2935
  // if (!rowOpts.height) {
2838
2936
  // const errColumn = internalData.tableFullColumn.find(column => column.showOverflow === false)
@@ -2937,8 +3035,8 @@ export default defineComponent({
2937
3035
  }
2938
3036
 
2939
3037
  const loadScrollXData = () => {
2940
- const { mergeList, mergeFooterList, isScrollXBig } = reactData
2941
- const { scrollXStore } = internalData
3038
+ const { isScrollXBig } = reactData
3039
+ const { mergeBodyList, mergeFooterList, scrollXStore } = internalData
2942
3040
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollXStore
2943
3041
  const { toVisibleIndex, visibleSize } = handleVirtualXVisible()
2944
3042
  const offsetItem = {
@@ -2947,7 +3045,7 @@ export default defineComponent({
2947
3045
  }
2948
3046
  scrollXStore.visibleStartIndex = toVisibleIndex - 1
2949
3047
  scrollXStore.visibleEndIndex = toVisibleIndex + visibleSize + 1
2950
- calculateMergerOffsetIndex(mergeList.concat(mergeFooterList), offsetItem, 'col')
3048
+ calculateMergerOffsetIndex(mergeBodyList.concat(mergeFooterList), offsetItem, 'col')
2951
3049
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem
2952
3050
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
2953
3051
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -3260,8 +3358,8 @@ export default defineComponent({
3260
3358
  * 纵向 Y 可视渲染处理
3261
3359
  */
3262
3360
  const loadScrollYData = () => {
3263
- const { mergeList, isAllOverflow, isScrollYBig } = reactData
3264
- const { scrollYStore } = internalData
3361
+ const { isAllOverflow, isScrollYBig } = reactData
3362
+ const { mergeBodyList, scrollYStore } = internalData
3265
3363
  const { preloadSize, startIndex, endIndex, offsetSize } = scrollYStore
3266
3364
  const autoOffsetYSize = isAllOverflow ? offsetSize : offsetSize + 1
3267
3365
  const { toVisibleIndex, visibleSize } = handleVirtualYVisible()
@@ -3271,7 +3369,7 @@ export default defineComponent({
3271
3369
  }
3272
3370
  scrollYStore.visibleStartIndex = toVisibleIndex - 1
3273
3371
  scrollYStore.visibleEndIndex = toVisibleIndex + visibleSize + 1
3274
- calculateMergerOffsetIndex(mergeList, offsetItem, 'row')
3372
+ calculateMergerOffsetIndex(mergeBodyList, offsetItem, 'row')
3275
3373
  const { startIndex: offsetStartIndex, endIndex: offsetEndIndex } = offsetItem
3276
3374
  if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
3277
3375
  if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
@@ -3579,7 +3677,7 @@ export default defineComponent({
3579
3677
  * 对于某些特殊的场景,比如深层树节点元素发生变动时可能会用到
3580
3678
  */
3581
3679
  syncData () {
3582
- warnLog('vxe.error.delFunc', ['syncData', 'getData'])
3680
+ errLog('vxe.error.delFunc', ['syncData', 'getData'])
3583
3681
  return nextTick().then(() => {
3584
3682
  reactData.tableData = []
3585
3683
  emit('update:data', internalData.tableFullData)
@@ -4242,6 +4340,7 @@ export default defineComponent({
4242
4340
  */
4243
4341
  getCheckboxRecords (isFull) {
4244
4342
  const { treeConfig } = props
4343
+ const { updateCheckboxFlag } = reactData
4245
4344
  const { tableFullData, afterFullData, afterTreeFullData, tableFullTreeData, fullDataRowIdData, afterFullRowMaps, selectCheckboxMaps } = internalData
4246
4345
  const treeOpts = computeTreeOpts.value
4247
4346
  const checkboxOpts = computeCheckboxOpts.value
@@ -4249,26 +4348,28 @@ export default defineComponent({
4249
4348
  const { checkField } = checkboxOpts
4250
4349
  const childrenField = treeOpts.children || treeOpts.childrenField
4251
4350
  let rowList: any[] = []
4252
- if (checkField) {
4253
- if (treeConfig) {
4254
- const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData)
4255
- rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField })
4256
- } else {
4257
- const currTableData = isFull ? tableFullData : afterFullData
4258
- rowList = currTableData.filter((row) => XEUtils.get(row, checkField))
4259
- }
4260
- } else {
4261
- XEUtils.each(selectCheckboxMaps, (row, rowid) => {
4262
- if (isFull) {
4263
- if (fullDataRowIdData[rowid]) {
4264
- rowList.push(fullDataRowIdData[rowid].row)
4265
- }
4351
+ if (updateCheckboxFlag) {
4352
+ if (checkField) {
4353
+ if (treeConfig) {
4354
+ const currTableData = isFull ? (transform ? tableFullTreeData : tableFullData) : (transform ? afterTreeFullData : afterFullData)
4355
+ rowList = XEUtils.filterTree(currTableData, row => XEUtils.get(row, checkField), { children: transform ? mapChildrenField : childrenField })
4266
4356
  } else {
4267
- if (afterFullRowMaps[rowid]) {
4268
- rowList.push(afterFullRowMaps[rowid])
4269
- }
4357
+ const currTableData = isFull ? tableFullData : afterFullData
4358
+ rowList = currTableData.filter((row) => XEUtils.get(row, checkField))
4270
4359
  }
4271
- })
4360
+ } else {
4361
+ XEUtils.each(selectCheckboxMaps, (row, rowid) => {
4362
+ if (isFull) {
4363
+ if (fullDataRowIdData[rowid]) {
4364
+ rowList.push(fullDataRowIdData[rowid].row)
4365
+ }
4366
+ } else {
4367
+ if (afterFullRowMaps[rowid]) {
4368
+ rowList.push(afterFullRowMaps[rowid])
4369
+ }
4370
+ }
4371
+ })
4372
+ }
4272
4373
  }
4273
4374
  return rowList
4274
4375
  },
@@ -5831,6 +5932,7 @@ export default defineComponent({
5831
5932
  footData = visibleColumn.length ? footerMethod({ columns: visibleColumn, data: afterFullData, $table: $xeTable, $grid: $xeGrid }) : []
5832
5933
  }
5833
5934
  reactData.footerTableData = footData
5935
+ $xeTable.handleUpdateFooterMerge()
5834
5936
  return nextTick()
5835
5937
  },
5836
5938
  /**
@@ -5854,9 +5956,10 @@ export default defineComponent({
5854
5956
  if (props.spanMethod) {
5855
5957
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method'])
5856
5958
  }
5857
- setMerges(merges, reactData.mergeList, internalData.afterFullData)
5959
+ handleBodyMerge(merges)
5960
+ $xeTable.handleUpdateBodyMerge()
5858
5961
  return nextTick().then(() => {
5859
- tableMethods.updateCellAreas()
5962
+ $xeTable.updateCellAreas()
5860
5963
  return updateStyle()
5861
5964
  })
5862
5965
  },
@@ -5868,9 +5971,9 @@ export default defineComponent({
5868
5971
  if (props.spanMethod) {
5869
5972
  errLog('vxe.error.errConflicts', ['merge-cells', 'span-method'])
5870
5973
  }
5871
- const rest = removeMerges(merges, reactData.mergeList, internalData.afterFullData)
5974
+ const rest = removeMerges(merges, internalData.mergeBodyList, internalData.afterFullData)
5872
5975
  return nextTick().then(() => {
5873
- tableMethods.updateCellAreas()
5976
+ $xeTable.updateCellAreas()
5874
5977
  updateStyle()
5875
5978
  return rest
5876
5979
  })
@@ -5879,13 +5982,15 @@ export default defineComponent({
5879
5982
  * 获取所有被合并的单元格
5880
5983
  */
5881
5984
  getMergeCells () {
5882
- return reactData.mergeList.slice(0)
5985
+ return internalData.mergeBodyList.slice(0)
5883
5986
  },
5884
5987
  /**
5885
5988
  * 清除所有单元格合并
5886
5989
  */
5887
5990
  clearMergeCells () {
5888
- reactData.mergeList = []
5991
+ internalData.mergeBodyList = []
5992
+ internalData.mergeBodyMaps = {}
5993
+ internalData.mergeBodyCellMaps = {}
5889
5994
  return nextTick().then(() => {
5890
5995
  return updateStyle()
5891
5996
  })
@@ -5894,7 +5999,8 @@ export default defineComponent({
5894
5999
  if (props.footerSpanMethod) {
5895
6000
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
5896
6001
  }
5897
- setMerges(merges, reactData.mergeFooterList)
6002
+ handleFooterMerge(merges)
6003
+ $xeTable.handleUpdateFooterMerge()
5898
6004
  return nextTick().then(() => {
5899
6005
  tableMethods.updateCellAreas()
5900
6006
  return updateStyle()
@@ -5904,7 +6010,7 @@ export default defineComponent({
5904
6010
  if (props.footerSpanMethod) {
5905
6011
  errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
5906
6012
  }
5907
- const rest = removeMerges(merges, reactData.mergeFooterList)
6013
+ const rest = removeMerges(merges, internalData.mergeFooterList)
5908
6014
  return nextTick().then(() => {
5909
6015
  tableMethods.updateCellAreas()
5910
6016
  updateStyle()
@@ -5915,13 +6021,15 @@ export default defineComponent({
5915
6021
  * 获取所有被合并的表尾
5916
6022
  */
5917
6023
  getMergeFooterItems () {
5918
- return reactData.mergeFooterList.slice(0)
6024
+ return internalData.mergeFooterList.slice(0)
5919
6025
  },
5920
6026
  /**
5921
6027
  * 清除所有表尾合并
5922
6028
  */
5923
6029
  clearMergeFooterItems () {
5924
- reactData.mergeFooterList = []
6030
+ internalData.mergeFooterList = []
6031
+ internalData.mergeFooterMaps = {}
6032
+ internalData.mergeFooterCellMaps = {}
5925
6033
  return nextTick().then(() => {
5926
6034
  return updateStyle()
5927
6035
  })
@@ -6940,27 +7048,30 @@ export default defineComponent({
6940
7048
  fullList = handleVirtualTreeToList()
6941
7049
  }
6942
7050
  const tableData = scrollYLoad ? fullList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : fullList.slice(0)
7051
+ const visibleDataRowIdMaps: Record<string, any> = {}
6943
7052
  tableData.forEach((row, $index) => {
6944
7053
  const rowid = getRowid($xeTable, row)
6945
7054
  const rest = fullDataRowIdData[rowid]
6946
7055
  if (rest) {
6947
7056
  rest.$index = $index
6948
7057
  }
7058
+ visibleDataRowIdMaps[rowid] = row
6949
7059
  })
6950
7060
  reactData.tableData = tableData
7061
+ internalData.visibleDataRowIdData = visibleDataRowIdMaps
6951
7062
  return nextTick()
6952
7063
  },
6953
7064
  /**
6954
7065
  * 更新数据行的 Map
6955
7066
  */
6956
- cacheRowMap () {
7067
+ cacheRowMap (isReset) {
6957
7068
  const { treeConfig } = props
6958
7069
  const { fullAllDataRowIdData, tableFullData, tableFullTreeData, treeExpandedMaps } = internalData
6959
7070
  const treeOpts = computeTreeOpts.value
6960
7071
  const childrenField = treeOpts.children || treeOpts.childrenField
6961
7072
  const hasChildField = treeOpts.hasChild || treeOpts.hasChildField
6962
7073
  const { lazy } = treeOpts
6963
- const fullAllDataRowIdMaps: Record<string, VxeTableDefines.RowCacheItem> = { ...fullAllDataRowIdData } // 存在已删除数据
7074
+ const fullAllDataRowIdMaps: Record<string, VxeTableDefines.RowCacheItem> = isReset ? {} : { ...fullAllDataRowIdData } // 存在已删除数据
6964
7075
  const fullDataRowIdMaps: Record<string, VxeTableDefines.RowCacheItem> = {}
6965
7076
 
6966
7077
  const { handleUpdateRowId } = createHandleUpdateRowId($xeTable)
@@ -7735,6 +7846,19 @@ export default defineComponent({
7735
7846
  handleSelectRow ({ row }, checked, isForce) {
7736
7847
  $xeTable.handleBatchSelectRows([row], checked, isForce)
7737
7848
  },
7849
+ /**
7850
+ * 处理合并
7851
+ */
7852
+ handleUpdateBodyMerge () {
7853
+ const { mergeBodyList } = internalData
7854
+ internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList)
7855
+ reactData.mergeBodyFlag++
7856
+ },
7857
+ handleUpdateFooterMerge () {
7858
+ const { mergeFooterList } = internalData
7859
+ internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList)
7860
+ reactData.mergeFootFlag++
7861
+ },
7738
7862
  triggerHeaderTitleEvent (evnt, iconParams, params) {
7739
7863
  const tipContent = iconParams.content || (iconParams as any).message
7740
7864
  if (tipContent) {
@@ -9793,7 +9917,6 @@ export default defineComponent({
9793
9917
  ref: refRowExpandYSpaceElem
9794
9918
  })
9795
9919
  ]
9796
-
9797
9920
  if (expandColumn) {
9798
9921
  const { handleGetRowId } = createHandleGetRowId($xeTable)
9799
9922
  tableRowExpandedList.forEach((row) => {
@@ -9804,20 +9927,22 @@ export default defineComponent({
9804
9927
  const { transform, seqMode } = treeOpts
9805
9928
  const cellStyle: Record<string, string> = {}
9806
9929
  const rowid = handleGetRowId(row)
9807
- const rest = fullAllDataRowIdData[rowid]
9930
+ const rowRest = fullAllDataRowIdData[rowid]
9808
9931
  let rowLevel = 0
9809
9932
  let seq: string | number = -1
9810
- let _rowIndex = 0
9811
- const rowIndex = $xeTable.getRowIndex(row)
9812
- const $rowIndex = $xeTable.getVMRowIndex(row)
9813
- if (rest) {
9814
- rowLevel = rest.level
9933
+ let _rowIndex = -1
9934
+ let rowIndex = -1
9935
+ let $rowIndex = -1
9936
+ if (rowRest) {
9937
+ rowLevel = rowRest.level
9815
9938
  if (treeConfig && transform && seqMode === 'increasing') {
9816
- seq = rest._index + 1
9939
+ seq = rowRest._index + 1
9817
9940
  } else {
9818
- seq = rest.seq
9941
+ seq = rowRest.seq
9819
9942
  }
9820
- _rowIndex = rest._index
9943
+ rowIndex = rowRest.index
9944
+ $rowIndex = rowRest.$index
9945
+ _rowIndex = rowRest._index
9821
9946
  }
9822
9947
  if (expandHeight) {
9823
9948
  cellStyle.height = `${expandHeight}px`
@@ -10439,6 +10564,7 @@ export default defineComponent({
10439
10564
  initTpImg()
10440
10565
  }
10441
10566
 
10567
+ ;(window as any).aa = $xeTable
10442
10568
  nextTick(() => {
10443
10569
  const { data, exportConfig, importConfig, treeConfig, showOverflow, highlightCurrentRow, highlightCurrentColumn } = props
10444
10570
  const { scrollXStore, scrollYStore } = internalData
@@ -10456,6 +10582,7 @@ export default defineComponent({
10456
10582
  const currentColumnOpts = computeCurrentColumnOpts.value
10457
10583
  const virtualXOpts = computeVirtualXOpts.value
10458
10584
  const virtualYOpts = computeVirtualYOpts.value
10585
+ const keyboardOpts = computeKeyboardOpts.value
10459
10586
 
10460
10587
  if (props.rowId) {
10461
10588
  warnLog('vxe.error.delProp', ['row-id', 'row-config.keyField'])
@@ -10496,6 +10623,12 @@ export default defineComponent({
10496
10623
  if (props.highlightHoverColumn) {
10497
10624
  warnLog('vxe.error.delProp', ['highlight-hover-column', 'column-config.isHover'])
10498
10625
  }
10626
+ // if (props.scrollY) {
10627
+ // warnLog('vxe.error.delProp', ['scroll-y', 'virtual-y-config'])
10628
+ // }
10629
+ // if (props.scrollX) {
10630
+ // warnLog('vxe.error.delProp', ['scroll-x', 'virtual-x-config'])
10631
+ // }
10499
10632
  // 检查导入导出类型,如果自定义导入导出方法,则不校验类型
10500
10633
  if (importConfig && importOpts.types && !importOpts.importMethod && !XEUtils.includeArrays(XEUtils.keys(importOpts._typeMaps), importOpts.types)) {
10501
10634
  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(',')])
@@ -10558,10 +10691,10 @@ export default defineComponent({
10558
10691
  warnLog('vxe.error.delProp', ['checkbox-config.halfField', 'checkbox-config.indeterminateField'])
10559
10692
  }
10560
10693
 
10561
- if ((rowOpts.isCurrent || highlightCurrentRow) && !XEUtils.isBoolean(currentRowOpts.isFollowSelected)) {
10694
+ if ((rowOpts.isCurrent || highlightCurrentRow) && props.keyboardConfig && keyboardOpts.isArrow && !XEUtils.isBoolean(currentRowOpts.isFollowSelected)) {
10562
10695
  warnLog('vxe.error.notConflictProp', ['row-config.isCurrent', 'current-row-config.isFollowSelected'])
10563
10696
  }
10564
- if ((columnOpts.isCurrent || highlightCurrentColumn) && !XEUtils.isBoolean(currentColumnOpts.isFollowSelected)) {
10697
+ if ((columnOpts.isCurrent || highlightCurrentColumn) && props.keyboardConfig && keyboardOpts.isArrow && !XEUtils.isBoolean(currentColumnOpts.isFollowSelected)) {
10565
10698
  warnLog('vxe.error.notConflictProp', ['column-config.isCurrent', 'current-column-config.isFollowSelected'])
10566
10699
  }
10567
10700