vxe-table 4.16.1 → 4.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/es/grid/src/grid.js +1 -1
  2. package/es/index.css +1 -1
  3. package/es/index.min.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/src/column.js +2 -0
  7. package/es/table/src/columnInfo.js +1 -0
  8. package/es/table/src/emits.js +3 -0
  9. package/es/table/src/header.js +47 -16
  10. package/es/table/src/props.js +11 -3
  11. package/es/table/src/table.js +257 -51
  12. package/es/table/src/util.js +70 -2
  13. package/es/table/style.css +11 -17
  14. package/es/table/style.min.css +1 -1
  15. package/es/ui/index.js +2 -2
  16. package/es/ui/src/log.js +1 -1
  17. package/es/vxe-table/style.css +11 -17
  18. package/es/vxe-table/style.min.css +1 -1
  19. package/lib/grid/src/grid.js +1 -1
  20. package/lib/grid/src/grid.min.js +1 -1
  21. package/lib/index.css +1 -1
  22. package/lib/index.min.css +1 -1
  23. package/lib/index.umd.js +181 -38
  24. package/lib/index.umd.min.js +1 -1
  25. package/lib/style.css +1 -1
  26. package/lib/style.min.css +1 -1
  27. package/lib/table/src/column.js +2 -0
  28. package/lib/table/src/column.min.js +1 -1
  29. package/lib/table/src/columnInfo.js +1 -0
  30. package/lib/table/src/columnInfo.min.js +1 -1
  31. package/lib/table/src/emits.js +1 -1
  32. package/lib/table/src/emits.min.js +1 -1
  33. package/lib/table/src/header.js +62 -13
  34. package/lib/table/src/header.min.js +1 -1
  35. package/lib/table/src/props.js +11 -3
  36. package/lib/table/src/props.min.js +1 -1
  37. package/lib/table/src/table.js +24 -13
  38. package/lib/table/src/table.min.js +1 -1
  39. package/lib/table/src/util.js +74 -2
  40. package/lib/table/src/util.min.js +1 -1
  41. package/lib/table/style/style.css +11 -17
  42. package/lib/table/style/style.min.css +1 -1
  43. package/lib/ui/index.js +2 -2
  44. package/lib/ui/index.min.js +1 -1
  45. package/lib/ui/src/log.js +1 -1
  46. package/lib/ui/src/log.min.js +1 -1
  47. package/lib/vxe-table/style/style.css +11 -17
  48. package/lib/vxe-table/style/style.min.css +1 -1
  49. package/package.json +2 -2
  50. package/packages/grid/src/grid.ts +1 -1
  51. package/packages/table/src/column.ts +2 -0
  52. package/packages/table/src/columnInfo.ts +1 -0
  53. package/packages/table/src/emits.ts +4 -0
  54. package/packages/table/src/header.ts +49 -17
  55. package/packages/table/src/props.ts +11 -3
  56. package/packages/table/src/table.ts +258 -50
  57. package/packages/table/src/util.ts +76 -2
  58. package/packages/ui/index.ts +1 -1
  59. package/styles/components/table.scss +33 -55
  60. /package/es/{iconfont.1756272578850.ttf → iconfont.1756452373591.ttf} +0 -0
  61. /package/es/{iconfont.1756272578850.woff → iconfont.1756452373591.woff} +0 -0
  62. /package/es/{iconfont.1756272578850.woff2 → iconfont.1756452373591.woff2} +0 -0
  63. /package/lib/{iconfont.1756272578850.ttf → iconfont.1756452373591.ttf} +0 -0
  64. /package/lib/{iconfont.1756272578850.woff → iconfont.1756452373591.woff} +0 -0
  65. /package/lib/{iconfont.1756272578850.woff2 → iconfont.1756452373591.woff2} +0 -0
@@ -282,6 +282,8 @@ export default defineVxeComponent({
282
282
  pendingRowFlag: 1,
283
283
  insertRowFlag: 1,
284
284
  removeRowFlag: 1,
285
+
286
+ mergeHeadFlag: 1,
285
287
  mergeBodyFlag: 1,
286
288
  mergeFootFlag: 1,
287
289
 
@@ -1249,16 +1251,62 @@ export default defineVxeComponent({
1249
1251
  }
1250
1252
  }
1251
1253
 
1252
- const handleUpdateMergeFooterCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1253
- internalData.mergeFooterList = []
1254
- internalData.mergeFooterMaps = {}
1255
- internalData.mergeFooterCellMaps = {}
1256
- $xeTable.setMergeFooterItems(merges)
1254
+ const removeBodyMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1255
+ const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
1256
+ const rest: VxeTableDefines.MergeItem[] = []
1257
+ if (merges) {
1258
+ const { handleGetRowId } = createHandleGetRowId($xeTable)
1259
+ if (!XEUtils.isArray(merges)) {
1260
+ merges = [merges]
1261
+ }
1262
+ merges.forEach((item) => {
1263
+ const { row: margeRow, col: margeCol } = item
1264
+ let mergeRowIndex = -1
1265
+ let mergeColumnIndex = -1
1266
+ if (XEUtils.isNumber(margeRow)) {
1267
+ mergeRowIndex = margeRow
1268
+ } else {
1269
+ const rowid = margeRow ? handleGetRowId(margeRow) : null
1270
+ const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
1271
+ if (rowRest) {
1272
+ mergeRowIndex = rowRest._index
1273
+ }
1274
+ }
1275
+ if (XEUtils.isNumber(margeCol)) {
1276
+ mergeColumnIndex = margeCol
1277
+ } else {
1278
+ const colid = margeCol ? margeCol.id : null
1279
+ const colRest = colid ? fullColumnIdData[colid] : null
1280
+ if (colRest) {
1281
+ mergeColumnIndex = colRest._index
1282
+ }
1283
+ }
1284
+ const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1285
+ if (mcIndex > -1) {
1286
+ const rItems = mergeBodyList.splice(mcIndex, 1)
1287
+ const item = rItems[0]
1288
+ if (item) {
1289
+ rest.push(rItems[0])
1290
+ if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1291
+ delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1292
+ }
1293
+ }
1294
+ }
1295
+ })
1296
+ }
1297
+ return rest
1257
1298
  }
1258
1299
 
1259
- const handleFooterMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1300
+ const handleUpdateMergeHeaderCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1301
+ internalData.mergeHeaderList = []
1302
+ internalData.mergeHeaderMaps = {}
1303
+ internalData.mergeHeaderCellMaps = {}
1304
+ $xeTable.setMergeHeaderCells(merges)
1305
+ }
1306
+
1307
+ const handleHeaderMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1260
1308
  const { footerTableData } = reactData
1261
- const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
1309
+ const { mergeHeaderList, mergeHeaderMaps, fullColumnIdData } = internalData
1262
1310
  if (merges) {
1263
1311
  const { visibleColumn } = internalData
1264
1312
  if (!XEUtils.isArray(merges)) {
@@ -1283,7 +1331,7 @@ export default defineVxeComponent({
1283
1331
  if (rowspan > 1 || colspan > 1) {
1284
1332
  const row = footerTableData[mergeRowIndex]
1285
1333
  const column = visibleColumn[mergeColumnIndex]
1286
- let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1334
+ let mergeItem = mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1287
1335
  if (mergeItem) {
1288
1336
  mergeItem.rowspan = rowspan
1289
1337
  mergeItem.colspan = colspan
@@ -1300,8 +1348,8 @@ export default defineVxeComponent({
1300
1348
  _rowspan: rowspan,
1301
1349
  _colspan: colspan
1302
1350
  }
1303
- mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1304
- mergeFooterList.push(mergeItem)
1351
+ mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1352
+ mergeHeaderList.push(mergeItem)
1305
1353
  }
1306
1354
  }
1307
1355
  }
@@ -1309,27 +1357,17 @@ export default defineVxeComponent({
1309
1357
  }
1310
1358
  }
1311
1359
 
1312
- const removeBodyMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1313
- const { mergeBodyList, fullColumnIdData, fullAllDataRowIdData, mergeBodyMaps } = internalData
1360
+ const removeHeaderMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1361
+ const { mergeHeaderList, fullColumnIdData, mergeHeaderMaps } = internalData
1314
1362
  const rest: VxeTableDefines.MergeItem[] = []
1315
1363
  if (merges) {
1316
- const { handleGetRowId } = createHandleGetRowId($xeTable)
1317
1364
  if (!XEUtils.isArray(merges)) {
1318
1365
  merges = [merges]
1319
1366
  }
1320
1367
  merges.forEach((item) => {
1321
1368
  const { row: margeRow, col: margeCol } = item
1322
- let mergeRowIndex = -1
1369
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
1323
1370
  let mergeColumnIndex = -1
1324
- if (XEUtils.isNumber(margeRow)) {
1325
- mergeRowIndex = margeRow
1326
- } else {
1327
- const rowid = margeRow ? handleGetRowId(margeRow) : null
1328
- const rowRest = rowid ? fullAllDataRowIdData[rowid] : null
1329
- if (rowRest) {
1330
- mergeRowIndex = rowRest._index
1331
- }
1332
- }
1333
1371
  if (XEUtils.isNumber(margeCol)) {
1334
1372
  mergeColumnIndex = margeCol
1335
1373
  } else {
@@ -1339,14 +1377,14 @@ export default defineVxeComponent({
1339
1377
  mergeColumnIndex = colRest._index
1340
1378
  }
1341
1379
  }
1342
- const mcIndex = XEUtils.findIndexOf(mergeBodyList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1380
+ const mcIndex = XEUtils.findIndexOf(mergeHeaderList, item => item.row === mergeRowIndex && item.col === mergeColumnIndex)
1343
1381
  if (mcIndex > -1) {
1344
- const rItems = mergeBodyList.splice(mcIndex, 1)
1382
+ const rItems = mergeHeaderList.splice(mcIndex, 1)
1345
1383
  const item = rItems[0]
1346
1384
  if (item) {
1347
- rest.push(rItems[0])
1348
- if (mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1349
- delete mergeBodyMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1385
+ rest.push(item)
1386
+ if (mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]) {
1387
+ delete mergeHeaderMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1350
1388
  }
1351
1389
  }
1352
1390
  }
@@ -1355,6 +1393,66 @@ export default defineVxeComponent({
1355
1393
  return rest
1356
1394
  }
1357
1395
 
1396
+ const handleUpdateMergeFooterCells = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1397
+ internalData.mergeFooterList = []
1398
+ internalData.mergeFooterMaps = {}
1399
+ internalData.mergeFooterCellMaps = {}
1400
+ $xeTable.setMergeFooterCells(merges)
1401
+ }
1402
+
1403
+ const handleFooterMerge = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1404
+ const { footerTableData } = reactData
1405
+ const { mergeFooterList, mergeFooterMaps, fullColumnIdData } = internalData
1406
+ if (merges) {
1407
+ const { visibleColumn } = internalData
1408
+ if (!XEUtils.isArray(merges)) {
1409
+ merges = [merges]
1410
+ }
1411
+ merges.forEach((item) => {
1412
+ let { row: margeRow, col: margeCol, rowspan, colspan } = item
1413
+ const mergeRowIndex = XEUtils.isNumber(margeRow) ? margeRow : -1
1414
+ let mergeColumnIndex = -1
1415
+ if (XEUtils.isNumber(margeCol)) {
1416
+ mergeColumnIndex = margeCol
1417
+ } else {
1418
+ const colid = margeCol ? margeCol.id : null
1419
+ const colRest = colid ? fullColumnIdData[colid] : null
1420
+ if (colRest) {
1421
+ mergeColumnIndex = colRest._index
1422
+ }
1423
+ }
1424
+ if (mergeRowIndex > -1 && mergeColumnIndex > -1 && (rowspan || colspan)) {
1425
+ rowspan = XEUtils.toNumber(rowspan) || 1
1426
+ colspan = XEUtils.toNumber(colspan) || 1
1427
+ if (rowspan > 1 || colspan > 1) {
1428
+ const row = footerTableData[mergeRowIndex]
1429
+ const column = visibleColumn[mergeColumnIndex]
1430
+ let mergeItem = mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`]
1431
+ if (mergeItem) {
1432
+ mergeItem.rowspan = rowspan
1433
+ mergeItem.colspan = colspan
1434
+ mergeItem._rowspan = rowspan
1435
+ mergeItem._colspan = colspan
1436
+ } else {
1437
+ mergeItem = {
1438
+ row: mergeRowIndex,
1439
+ col: mergeColumnIndex,
1440
+ rowspan,
1441
+ colspan,
1442
+ _row: row,
1443
+ _col: column,
1444
+ _rowspan: rowspan,
1445
+ _colspan: colspan
1446
+ }
1447
+ mergeFooterMaps[`${mergeRowIndex}:${mergeColumnIndex}`] = mergeItem
1448
+ mergeFooterList.push(mergeItem)
1449
+ }
1450
+ }
1451
+ }
1452
+ })
1453
+ }
1454
+ }
1455
+
1358
1456
  const removeFooterMerges = (merges: VxeTableDefines.MergeOptions | VxeTableDefines.MergeOptions[]) => {
1359
1457
  const { mergeFooterList, fullColumnIdData, mergeFooterMaps } = internalData
1360
1458
  const rest: VxeTableDefines.MergeItem[] = []
@@ -1462,8 +1560,22 @@ export default defineVxeComponent({
1462
1560
  }
1463
1561
 
1464
1562
  const calcTableHeight = (key: 'height' | 'minHeight' | 'maxHeight') => {
1563
+ const { editConfig } = props
1465
1564
  const { parentHeight } = reactData
1466
- const val = props[key]
1565
+ let val = props[key]
1566
+ if (key === 'minHeight') {
1567
+ const defMinHeight = getConfig().table.minHeight
1568
+ if (XEUtils.eqNull(val)) {
1569
+ if (eqEmptyValue(defMinHeight)) {
1570
+ // 编辑模式默认最小高度
1571
+ if (isEnableConf(editConfig)) {
1572
+ val = 144
1573
+ }
1574
+ } else {
1575
+ val = defMinHeight
1576
+ }
1577
+ }
1578
+ }
1467
1579
  let num = 0
1468
1580
  if (val) {
1469
1581
  if (val === '100%' || val === 'auto') {
@@ -2388,7 +2500,7 @@ export default defineVxeComponent({
2388
2500
  }
2389
2501
  if (xRightCornerEl) {
2390
2502
  xRightCornerEl.style.width = scrollbarXToTop ? '' : `${osbWidth}px`
2391
- xRightCornerEl.style.display = scrollbarXToTop ? '' : (overflowX && osbHeight ? 'block' : '')
2503
+ xRightCornerEl.style.display = scrollbarXToTop ? '' : (xScrollbarVisible === 'visible' ? 'block' : '')
2392
2504
  }
2393
2505
 
2394
2506
  const scrollYVirtualEl = refScrollYVirtualElem.value
@@ -2400,7 +2512,7 @@ export default defineVxeComponent({
2400
2512
  const yTopCornerEl = refScrollYTopCornerElem.value
2401
2513
  if (yTopCornerEl) {
2402
2514
  yTopCornerEl.style.height = `${tHeaderHeight}px`
2403
- yTopCornerEl.style.display = overflowY && tHeaderHeight ? 'block' : ''
2515
+ yTopCornerEl.style.display = tHeaderHeight && yScrollbarVisible === 'visible' ? 'block' : ''
2404
2516
  }
2405
2517
  const yWrapperEl = refScrollYWrapperElem.value
2406
2518
  if (yWrapperEl) {
@@ -2411,7 +2523,7 @@ export default defineVxeComponent({
2411
2523
  if (yBottomCornerEl) {
2412
2524
  yBottomCornerEl.style.height = `${tFooterHeight}px`
2413
2525
  yBottomCornerEl.style.top = `${tHeaderHeight + tbHeight}px`
2414
- yBottomCornerEl.style.display = overflowY && tFooterHeight ? 'block' : ''
2526
+ yBottomCornerEl.style.display = tFooterHeight && yScrollbarVisible === 'visible' ? 'block' : ''
2415
2527
  }
2416
2528
 
2417
2529
  const rowExpandEl = refRowExpandElem.value
@@ -3119,10 +3231,18 @@ export default defineVxeComponent({
3119
3231
  }
3120
3232
  }
3121
3233
 
3234
+ const handleDefaultMergeHeaderItems = () => {
3235
+ const { mergeHeaderCells } = props
3236
+ if (mergeHeaderCells) {
3237
+ $xeTable.setMergeHeaderCells(mergeHeaderCells)
3238
+ }
3239
+ }
3240
+
3122
3241
  const handleDefaultMergeFooterItems = () => {
3123
- const { mergeFooterItems } = props
3124
- if (mergeFooterItems) {
3125
- $xeTable.setMergeFooterItems(mergeFooterItems)
3242
+ const { mergeFooterCells, mergeFooterItems } = props
3243
+ const mFooterCells = mergeFooterCells || mergeFooterItems
3244
+ if (mFooterCells) {
3245
+ $xeTable.setMergeFooterCells(mFooterCells)
3126
3246
  }
3127
3247
  }
3128
3248
 
@@ -3574,6 +3694,10 @@ export default defineVxeComponent({
3574
3694
 
3575
3695
  handleReserveStatus()
3576
3696
  $xeTable.checkSelectionStatus()
3697
+ $xeTable.dispatchEvent('data-change', {
3698
+ visibleColumn: internalData.visibleColumn,
3699
+ visibleData: internalData.afterFullData
3700
+ }, null)
3577
3701
  return new Promise<void>(resolve => {
3578
3702
  nextTick()
3579
3703
  .then(() => handleRecalculateStyle(false, false, false))
@@ -3636,6 +3760,7 @@ export default defineVxeComponent({
3636
3760
  handleDefaultTreeExpand()
3637
3761
  handleDefaultRowGroupExpand()
3638
3762
  handleDefaultMergeCells()
3763
+ handleDefaultMergeHeaderItems()
3639
3764
  handleDefaultMergeFooterItems()
3640
3765
  nextTick(() => setTimeout(() => $xeTable.recalculate()))
3641
3766
  }
@@ -6960,6 +7085,10 @@ export default defineVxeComponent({
6960
7085
  }
6961
7086
  reactData.footerTableData = footData
6962
7087
  $xeTable.handleUpdateFooterMerge()
7088
+ $xeTable.dispatchEvent('footer-data-change', {
7089
+ visibleColumn: internalData.visibleColumn,
7090
+ footData
7091
+ }, null)
6963
7092
  return nextTick()
6964
7093
  },
6965
7094
  /**
@@ -7027,39 +7156,85 @@ export default defineVxeComponent({
7027
7156
  return updateStyle()
7028
7157
  })
7029
7158
  },
7030
- setMergeFooterItems (merges) {
7159
+ setMergeHeaderCells (merges) {
7160
+ handleHeaderMerge(merges)
7161
+ $xeTable.handleUpdateHeaderMerge()
7162
+ return nextTick().then(() => {
7163
+ return updateStyle()
7164
+ })
7165
+ },
7166
+ /**
7167
+ * 移除表头单元格合并 [{row:Row|number, col:ColumnInfo|number}]
7168
+ */
7169
+ removeMergeHeaderCells (merges) {
7170
+ const rest = removeHeaderMerges(merges)
7171
+ $xeTable.handleUpdateHeaderMerge()
7172
+ return nextTick().then(() => {
7173
+ updateStyle()
7174
+ return rest
7175
+ })
7176
+ },
7177
+ /**
7178
+ * 获取所有被合并的表头单元格
7179
+ */
7180
+ getMergeHeaderCells () {
7181
+ return internalData.mergeHeaderList.slice(0)
7182
+ },
7183
+ /**
7184
+ * 清除所有表头单元格合并
7185
+ */
7186
+ clearMergeHeaderCells () {
7187
+ internalData.mergeHeaderList = []
7188
+ internalData.mergeHeaderMaps = {}
7189
+ internalData.mergeHeaderCellMaps = {}
7190
+ reactData.mergeHeadFlag++
7191
+ return nextTick().then(() => {
7192
+ return updateStyle()
7193
+ })
7194
+ },
7195
+ setMergeFooterCells (merges) {
7031
7196
  if (props.footerSpanMethod) {
7032
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
7197
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
7033
7198
  }
7034
7199
  handleFooterMerge(merges)
7035
7200
  $xeTable.handleUpdateFooterMerge()
7036
7201
  return nextTick().then(() => {
7037
- $xeTable.updateCellAreas()
7038
7202
  return updateStyle()
7039
7203
  })
7040
7204
  },
7041
- removeMergeFooterItems (merges) {
7205
+ setMergeFooterItems (merges) {
7206
+ // errLog('vxe.error.delFunc', ['setMergeFooterItems', 'setMergeFooterCells'])
7207
+ return $xeTable.setMergeFooterCells(merges)
7208
+ },
7209
+ removeMergeFooterCells (merges) {
7042
7210
  if (props.footerSpanMethod) {
7043
- errLog('vxe.error.errConflicts', ['merge-footer-items', 'footer-span-method'])
7211
+ errLog('vxe.error.errConflicts', ['merge-footer-cells | merge-footer-items', 'footer-span-method'])
7044
7212
  }
7045
7213
  const rest = removeFooterMerges(merges)
7046
7214
  $xeTable.handleUpdateFooterMerge()
7047
7215
  return nextTick().then(() => {
7048
- $xeTable.updateCellAreas()
7049
7216
  updateStyle()
7050
7217
  return rest
7051
7218
  })
7052
7219
  },
7220
+ removeMergeFooterItems (merges) {
7221
+ // errLog('vxe.error.delFunc', ['removeMergeFooterItems', 'removeMergeFooterCells'])
7222
+ return $xeTable.removeMergeFooterCells(merges)
7223
+ },
7053
7224
  /**
7054
7225
  * 获取所有被合并的表尾
7055
7226
  */
7056
- getMergeFooterItems () {
7227
+ getMergeFooterCells () {
7057
7228
  return internalData.mergeFooterList.slice(0)
7058
7229
  },
7230
+ getMergeFooterItems () {
7231
+ // errLog('vxe.error.delFunc', ['getMergeFooterItems', 'getMergeFooterCells'])
7232
+ return $xeTable.getMergeFooterCells()
7233
+ },
7059
7234
  /**
7060
7235
  * 清除所有表尾合并
7061
7236
  */
7062
- clearMergeFooterItems () {
7237
+ clearMergeFooterCells () {
7063
7238
  internalData.mergeFooterList = []
7064
7239
  internalData.mergeFooterMaps = {}
7065
7240
  internalData.mergeFooterCellMaps = {}
@@ -7068,6 +7243,10 @@ export default defineVxeComponent({
7068
7243
  return updateStyle()
7069
7244
  })
7070
7245
  },
7246
+ clearMergeFooterItems () {
7247
+ // errLog('vxe.error.delFunc', ['clearMergeFooterItems', 'clearMergeFooterCells'])
7248
+ return $xeTable.clearMergeFooterCells()
7249
+ },
7071
7250
  updateCellAreas () {
7072
7251
  const { mouseConfig } = props
7073
7252
  const mouseOpts = computeMouseOpts.value
@@ -9109,6 +9288,11 @@ export default defineVxeComponent({
9109
9288
  internalData.mergeBodyCellMaps = buildMergeData(mergeBodyList)
9110
9289
  reactData.mergeBodyFlag++
9111
9290
  },
9291
+ handleUpdateHeaderMerge () {
9292
+ const { mergeHeaderList } = internalData
9293
+ internalData.mergeHeaderCellMaps = buildMergeData(mergeHeaderList)
9294
+ reactData.mergeHeadFlag++
9295
+ },
9112
9296
  handleUpdateFooterMerge () {
9113
9297
  const { mergeFooterList } = internalData
9114
9298
  internalData.mergeFooterCellMaps = buildMergeData(mergeFooterList)
@@ -11899,7 +12083,10 @@ export default defineVxeComponent({
11899
12083
  ref: refScrollXSpaceElem,
11900
12084
  class: 'vxe-table--scroll-x-space'
11901
12085
  })
11902
- ])
12086
+ ]),
12087
+ h('div', {
12088
+ class: 'vxe-table--scroll-x-handle-appearance'
12089
+ })
11903
12090
  ]),
11904
12091
  h('div', {
11905
12092
  ref: refScrollXRightCornerElem,
@@ -11930,7 +12117,10 @@ export default defineVxeComponent({
11930
12117
  ref: refScrollYSpaceElem,
11931
12118
  class: 'vxe-table--scroll-y-space'
11932
12119
  })
11933
- ])
12120
+ ]),
12121
+ h('div', {
12122
+ class: 'vxe-table--scroll-y-handle-appearance'
12123
+ })
11934
12124
  ]),
11935
12125
  h('div', {
11936
12126
  ref: refScrollYBottomCornerElem,
@@ -12425,15 +12615,33 @@ export default defineVxeComponent({
12425
12615
  handleUpdateMergeBodyCells(props.mergeCells || [])
12426
12616
  })
12427
12617
 
12428
- const mergeFooterItemFlag = ref(0)
12618
+ const mergeHeaderItemFlag = ref(0)
12619
+ watch(() => props.mergeHeaderCells ? props.mergeHeaderCells.length : -1, () => {
12620
+ mergeHeaderItemFlag.value++
12621
+ })
12622
+ watch(() => props.mergeHeaderCells, () => {
12623
+ mergeHeaderItemFlag.value++
12624
+ })
12625
+ watch(mergeHeaderItemFlag, () => {
12626
+ handleUpdateMergeHeaderCells(props.mergeHeaderCells || [])
12627
+ })
12628
+
12629
+ const mergeFooteCellFlag = ref(0)
12630
+ watch(() => props.mergeFooterCells ? props.mergeFooterCells.length : -1, () => {
12631
+ mergeFooteCellFlag.value++
12632
+ })
12633
+ watch(() => props.mergeFooterCells, () => {
12634
+ mergeFooteCellFlag.value++
12635
+ })
12429
12636
  watch(() => props.mergeFooterItems ? props.mergeFooterItems.length : -1, () => {
12430
- mergeFooterItemFlag.value++
12637
+ mergeFooteCellFlag.value++
12431
12638
  })
12432
12639
  watch(() => props.mergeFooterItems, () => {
12433
- mergeFooterItemFlag.value++
12640
+ mergeFooteCellFlag.value++
12434
12641
  })
12435
- watch(mergeFooterItemFlag, () => {
12436
- handleUpdateMergeFooterCells(props.mergeFooterItems || [])
12642
+ watch(mergeFooteCellFlag, () => {
12643
+ const mFooterCells = props.mergeFooterCells || props.mergeFooterItems
12644
+ handleUpdateMergeFooterCells(mFooterCells || [])
12437
12645
  })
12438
12646
 
12439
12647
  watch(computeRowGroupFields, (val) => {
@@ -73,6 +73,7 @@ export function createInternalData (): TableInternalData {
73
73
  tableFullColumn: [],
74
74
  // 渲染所有列
75
75
  visibleColumn: [],
76
+
76
77
  // 全量数据集(包括当前和已删除)
77
78
  fullAllDataRowIdData: {},
78
79
  // 数据集(仅当前)
@@ -84,16 +85,22 @@ export function createInternalData (): TableInternalData {
84
85
  fullColumnIdData: {},
85
86
  fullColumnFieldData: {},
86
87
 
88
+ // 合并表头单元格的数据
89
+ mergeHeaderList: [],
90
+ mergeHeaderMaps: {},
91
+ // 已合并单元格数据集合
92
+ mergeHeaderCellMaps: {},
87
93
  // 合并单元格的数据
88
94
  mergeBodyList: [],
89
95
  mergeBodyMaps: {},
96
+ // 已合并单元格数据集合
97
+ mergeBodyCellMaps: {},
90
98
  // 合并表尾的数据
91
99
  mergeFooterList: [],
92
100
  mergeFooterMaps: {},
93
- // 已合并单元格数据集合
94
- mergeBodyCellMaps: {},
95
101
  // 已合并表尾数据集合
96
102
  mergeFooterCellMaps: {},
103
+
97
104
  // 已展开的行集合
98
105
  rowExpandedMaps: {},
99
106
  // 懒加载中的展开行的集合
@@ -194,6 +201,73 @@ export const convertHeaderColumnToRows = (originColumns: any): any[][] => {
194
201
  return rows
195
202
  }
196
203
 
204
+ export function convertHeaderToGridRows (spanColumns: VxeTableDefines.ColumnInfo[][]) {
205
+ const rSize = spanColumns.length
206
+ const cSize = spanColumns[0].reduce((sum, cell) => sum + cell.colSpan, 0)
207
+
208
+ const occupiedRows: boolean[][] = []
209
+ const fullRows: any[][] = []
210
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
211
+ const oCols: boolean[] = []
212
+ const dCols: string[] = []
213
+ for (let cIndex = 0; cIndex < cSize; cIndex++) {
214
+ oCols.push(false)
215
+ dCols.push('')
216
+ }
217
+ occupiedRows.push(oCols)
218
+ fullRows.push(dCols)
219
+ }
220
+
221
+ for (let rIndex = 0; rIndex < rSize; rIndex++) {
222
+ let currColIndex = 0
223
+ for (const column of spanColumns[rIndex]) {
224
+ const { colSpan, rowSpan } = column
225
+ let startColIndex = -1
226
+ for (let ccIndex = currColIndex; ccIndex <= cSize - colSpan; ccIndex++) {
227
+ let oFlag = true
228
+ for (let csIndex = 0; csIndex < colSpan; csIndex++) {
229
+ if (occupiedRows[rIndex][ccIndex + csIndex]) {
230
+ oFlag = false
231
+ break
232
+ }
233
+ }
234
+ if (oFlag) {
235
+ startColIndex = ccIndex
236
+ break
237
+ }
238
+ }
239
+ if (startColIndex === -1) {
240
+ for (let j = 0; j <= cSize - colSpan; j++) {
241
+ let oFlag = true
242
+ for (let k = 0; k < colSpan; k++) {
243
+ if (occupiedRows[rIndex][j + k]) {
244
+ oFlag = false
245
+ break
246
+ }
247
+ }
248
+ if (oFlag) {
249
+ startColIndex = j
250
+ break
251
+ }
252
+ }
253
+ if (startColIndex === -1) {
254
+ // error
255
+ break
256
+ }
257
+ }
258
+
259
+ for (let srIndex = rIndex; srIndex < rIndex + rowSpan; srIndex++) {
260
+ for (let scIndex = startColIndex; scIndex < startColIndex + colSpan; scIndex++) {
261
+ occupiedRows[srIndex][scIndex] = true
262
+ fullRows[srIndex][scIndex] = column
263
+ }
264
+ }
265
+ currColIndex = startColIndex + colSpan
266
+ }
267
+ }
268
+ return fullRows
269
+ }
270
+
197
271
  export function restoreScrollLocation ($xeTable: VxeTableConstructor, scrollLeft: number, scrollTop: number) {
198
272
  const internalData = $xeTable.internalData
199
273
 
@@ -17,7 +17,7 @@ VxeUI.setConfig({
17
17
  animat: true,
18
18
  delayHover: 250,
19
19
  autoResize: true,
20
- minHeight: 144,
20
+ // minHeight: null,
21
21
  // keepSource: false,
22
22
  // showOverflow: null,
23
23
  // showHeaderOverflow: null,