vxe-table 3.25.0-beta.0 → 3.25.0-beta.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 (58) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/locale/lang/fr-FR.js +29 -29
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/table/src/methods.js +248 -40
  7. package/es/table/src/props.js +5 -0
  8. package/es/table/src/scrollbar.js +54 -0
  9. package/es/table/src/table.js +292 -73
  10. package/es/table/src/util.js +11 -2
  11. package/es/table/style.css +30 -0
  12. package/es/table/style.min.css +1 -1
  13. package/es/ui/index.js +9 -11
  14. package/es/ui/src/log.js +1 -1
  15. package/es/vxe-table/style.css +30 -0
  16. package/es/vxe-table/style.min.css +1 -1
  17. package/lib/index.css +1 -1
  18. package/lib/index.min.css +1 -1
  19. package/lib/index.umd.js +366 -84
  20. package/lib/index.umd.min.js +1 -1
  21. package/lib/locale/lang/fr-FR.js +29 -29
  22. package/lib/locale/lang/fr-FR.min.js +1 -1
  23. package/lib/locale/lang/fr-FR.umd.js +29 -29
  24. package/lib/style.css +1 -1
  25. package/lib/style.min.css +1 -1
  26. package/lib/table/src/methods.js +21 -11
  27. package/lib/table/src/methods.min.js +1 -1
  28. package/lib/table/src/props.js +5 -0
  29. package/lib/table/src/props.min.js +1 -1
  30. package/lib/table/src/scrollbar.js +63 -0
  31. package/lib/table/src/scrollbar.min.js +1 -0
  32. package/lib/table/src/table.js +265 -62
  33. package/lib/table/src/table.min.js +1 -1
  34. package/lib/table/src/util.js +11 -2
  35. package/lib/table/src/util.min.js +1 -1
  36. package/lib/table/style/style.css +30 -0
  37. package/lib/table/style/style.min.css +1 -1
  38. package/lib/ui/index.js +9 -11
  39. package/lib/ui/index.min.js +1 -1
  40. package/lib/ui/src/log.js +1 -1
  41. package/lib/ui/src/log.min.js +1 -1
  42. package/lib/vxe-table/style/style.css +30 -0
  43. package/lib/vxe-table/style/style.min.css +1 -1
  44. package/package.json +2 -2
  45. package/packages/locale/lang/fr-FR.ts +903 -903
  46. package/packages/table/src/methods.ts +260 -40
  47. package/packages/table/src/props.ts +5 -0
  48. package/packages/table/src/scrollbar.ts +57 -0
  49. package/packages/table/src/table.ts +329 -75
  50. package/packages/table/src/util.ts +15 -2
  51. package/packages/ui/index.ts +8 -10
  52. package/styles/components/table.scss +65 -0
  53. /package/es/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
  54. /package/es/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
  55. /package/es/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
  56. /package/lib/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
  57. /package/lib/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
  58. /package/lib/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
@@ -6,6 +6,7 @@ import Cell from './cell'
6
6
  import { getRowUniqueId, createRowId, clearTableAllStatus, getColumnList, toFilters, getRowkey, getRowid, rowToVisible, colToVisible, getCellValue, setCellValue, handleRowidOrRow, handleFieldOrColumn, toTreePathSeq, restoreScrollLocation, getRootColumn, getColReMinWidth, getColReMaxWidth, createHandleUpdateRowId, createHandleGetRowId, getRefElem, getCellRestHeight, getLastChildColumn, getRowMaxHeight, handleCustomStoreConfig, encodeRowid } from './util'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
8
  import { moveRowAnimateToTb, clearRowAnimate, moveColAnimateToLr, clearColAnimate } from '../../ui/src/anime'
9
+ import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from './scrollbar'
9
10
  import { createComponentLog } from '../../ui/src/log'
10
11
  import { getCrossTableDragRowInfo } from './store'
11
12
 
@@ -1047,7 +1048,6 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1047
1048
  const isHeaderRenderOptimize = $xeTable.computeIsHeaderRenderOptimize
1048
1049
  const isBodyRenderOptimize = $xeTable.computeIsBodyRenderOptimize
1049
1050
  const isFooterRenderOptimize = $xeTable.computeIsFooterRenderOptimize
1050
- const scrollbarOpts = $xeTable.computeScrollbarOpts
1051
1051
  const mouseOpts = $xeTable.computeMouseOpts
1052
1052
  const bodyWrapperElem = getRefElem(elemStore['main-body-wrapper'])
1053
1053
  const bodyTableElem = getRefElem(elemStore['main-body-table'])
@@ -1056,24 +1056,26 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1056
1056
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : ''
1057
1057
  }
1058
1058
 
1059
- const scrollbarXConf = scrollbarOpts.x || {}
1060
- const scrollbarYConf = scrollbarOpts.y || {}
1059
+ const scrollXVisible = $xeTable.computeScrollXVisible
1060
+ const scrollYVisible = $xeTable.computeScrollYVisible
1061
1061
  const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft
1062
1062
 
1063
1063
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden'
1064
- if (scrollbarXConf.visible === 'visible' || $xeGanttView) {
1064
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden'
1065
+ if (scrollXVisible === 'visible' || $xeGanttView) {
1065
1066
  osbHeight = scrollbarHeight
1066
1067
  xScrollbarVisible = 'visible'
1067
- } else if (scrollbarXConf.visible === 'hidden' || scrollbarXConf.visible === false) {
1068
+ } else if (hideXScroll) {
1068
1069
  osbHeight = 0
1069
1070
  xScrollbarVisible = 'hidden'
1070
1071
  }
1071
1072
 
1072
1073
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
1073
- if ((scrollbarYConf.visible === 'hidden' || scrollbarYConf.visible === false) || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1074
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden'
1075
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1074
1076
  osbWidth = 0
1075
1077
  yScrollbarVisible = 'hidden'
1076
- } else if (scrollbarYConf.visible === 'visible') {
1078
+ } else if (scrollYVisible === 'visible') {
1077
1079
  osbWidth = scrollbarWidth
1078
1080
  yScrollbarVisible = 'visible'
1079
1081
  }
@@ -2440,14 +2442,6 @@ function autoCellWidth ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
2440
2442
  if (!bodyWrapperElem) {
2441
2443
  return
2442
2444
  }
2443
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
2444
- if (!yHandleEl) {
2445
- return
2446
- }
2447
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
2448
- if (!xHandleEl) {
2449
- return
2450
- }
2451
2445
  const columnOpts = $xeTable.computeColumnOpts
2452
2446
  let tWidth = 0
2453
2447
  const minCellWidth = 40 // 列宽最少限制 40px
@@ -3152,7 +3146,6 @@ function calcScrollbar ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
3152
3146
 
3153
3147
  const { scrollXWidth, scrollYHeight } = reactData
3154
3148
  const { elemStore } = internalData
3155
- const scrollbarOpts = $xeTable.computeScrollbarOpts
3156
3149
  const el = $xeTable.$refs.refElem as HTMLDivElement
3157
3150
  if (!el || !el.clientWidth) {
3158
3151
  return
@@ -3162,20 +3155,30 @@ function calcScrollbar ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
3162
3155
  const footerTableElem = getRefElem(elemStore['main-footer-table'])
3163
3156
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
3164
3157
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
3158
+ const thumbXElem = $xeTable.$refs.refThumbXElem as HTMLDivElement
3159
+ const thumbYElem = $xeTable.$refs.refThumbYElem as HTMLDivElement
3165
3160
  let overflowY = false
3166
3161
  let overflowX = false
3167
3162
  if (bodyWrapperElem) {
3163
+ const scrollbarOpts = $xeTable.computeScrollbarOpts
3164
+ const barWidth = $xeTable.computeScrollYWidth
3165
+ const barHeight = $xeTable.computeScrollXHeight
3168
3166
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight
3169
- if (yHandleEl) {
3170
- reactData.scrollbarWidth = scrollbarOpts.width || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14
3167
+ // 如果是虚拟滚动条
3168
+ if (thumbYElem) {
3169
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0
3170
+ } else if (yHandleEl) {
3171
+ reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14
3171
3172
  }
3172
3173
  reactData.overflowY = overflowY
3173
3174
 
3174
3175
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth
3175
- if (xHandleEl) {
3176
- reactData.scrollbarHeight = scrollbarOpts.height || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14
3176
+ // 如果是虚拟滚动条
3177
+ if (thumbXElem) {
3178
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0
3179
+ } else if (xHandleEl) {
3180
+ reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14
3177
3181
  }
3178
- reactData.overflowX = overflowX
3179
3182
 
3180
3183
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0
3181
3184
  const fHeight = footerTableElem ? footerTableElem.clientHeight : 0
@@ -3270,6 +3273,7 @@ function handleLazyRecalculate ($xeTable: VxeTableConstructor & VxeTablePrivateM
3270
3273
  const refreshDelay = resizeOpts.refreshDelay || 30
3271
3274
  const reDelay = rceDelay + refreshDelay
3272
3275
  const el = $xeTable.$refs.refElem as HTMLElement
3276
+ $xeTable.updateScrollbar()
3273
3277
  if (el && el.clientWidth) {
3274
3278
  autoCellWidth($xeTable)
3275
3279
  updateRowExpandStyle($xeTable)
@@ -10265,6 +10269,14 @@ const tableMethods: any = {
10265
10269
  }
10266
10270
  return $xeTable.$nextTick()
10267
10271
  },
10272
+ /**
10273
+ * @private
10274
+ */
10275
+ updateScrollbar () {
10276
+ const $xeTable = this
10277
+ $xeTable.updateThumbSize()
10278
+ $xeTable.updateThumbOffset()
10279
+ },
10268
10280
  /**
10269
10281
  * 表头单元格按下事件
10270
10282
  */
@@ -12681,19 +12693,18 @@ const tableMethods: any = {
12681
12693
  const internalData = $xeTable as unknown as TableInternalData
12682
12694
 
12683
12695
  const { highlightHoverRow } = props
12684
- const { lastScrollLeft, lastScrollTop } = internalData
12685
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
12686
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
12687
- if (!xHandleEl || !yHandleEl) {
12696
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData
12697
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
12698
+ if (!bodyScrollElem) {
12688
12699
  return
12689
12700
  }
12690
12701
  const rowOpts = $xeTable.computeRowOpts
12691
12702
  const validTip = $xeTable.$refs.refValidTooltip as VxeTooltipInstance
12692
12703
  const tooltip = $xeTable.$refs.refTooltip as VxeTooltipInstance
12693
- const bodyHeight = yHandleEl.clientHeight
12694
- const bodyWidth = xHandleEl.clientWidth
12695
- const scrollHeight = yHandleEl.scrollHeight
12696
- const scrollWidth = xHandleEl.scrollWidth
12704
+ const bodyHeight = bodyScrollElem.clientHeight
12705
+ const bodyWidth = bodyScrollElem.clientWidth
12706
+ const scrollHeight = bodyScrollElem.scrollHeight
12707
+ const scrollWidth = bodyScrollElem.scrollWidth
12697
12708
  let isTop = false
12698
12709
  let isBottom = false
12699
12710
  let isLeft = false
@@ -12760,6 +12771,7 @@ const tableMethods: any = {
12760
12771
  direction,
12761
12772
  ...params
12762
12773
  }
12774
+ $xeTable.updateThumbOffset()
12763
12775
  updateRowExpandStyle($xeTable)
12764
12776
  checkLastSyncScroll($xeTable, isRollX, isRollY)
12765
12777
  if (isRollX) {
@@ -12807,9 +12819,11 @@ const tableMethods: any = {
12807
12819
  },
12808
12820
  triggerBodyScrollEvent (evnt: Event, fixedType: '' | 'left' | 'right') {
12809
12821
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
12822
+ const props = $xeTable
12810
12823
  const reactData = $xeTable as unknown as TableReactData
12811
12824
  const internalData = $xeTable as unknown as TableInternalData
12812
12825
 
12826
+ const { useScrollbar } = props
12813
12827
  const { scrollYLoad, scrollXLoad } = reactData
12814
12828
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData
12815
12829
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -12829,19 +12843,21 @@ const tableMethods: any = {
12829
12843
  if (!bodyScrollElem) {
12830
12844
  return
12831
12845
  }
12832
- if (!xHandleEl) {
12833
- return
12834
- }
12835
- if (!yHandleEl) {
12836
- return
12846
+ if (!useScrollbar) {
12847
+ if (!xHandleEl) {
12848
+ return
12849
+ }
12850
+ if (!yHandleEl) {
12851
+ return
12852
+ }
12837
12853
  }
12838
12854
  if (inBodyScroll) {
12839
12855
  if (scrollRenderType !== fixedType) {
12840
12856
  return
12841
12857
  }
12842
12858
  }
12843
- let scrollTop = yHandleEl.scrollTop
12844
- let scrollLeft = xHandleEl.scrollLeft
12859
+ let scrollTop = 0
12860
+ let scrollLeft = 0
12845
12861
  if (leftScrollElem && fixedType === 'left') {
12846
12862
  scrollTop = leftScrollElem.scrollTop
12847
12863
  } else if (rightScrollElem && fixedType === 'right') {
@@ -12994,8 +13010,8 @@ const tableMethods: any = {
12994
13010
 
12995
13011
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData
12996
13012
  const rowOpts = $xeTable.computeRowOpts
12997
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts
12998
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts
13013
+ const scrollXVisible = $xeTable.computeScrollXVisible
13014
+ const scrollYVisible = $xeTable.computeScrollYVisible
12999
13015
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
13000
13016
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
13001
13017
  const leftScrollElem = getRefElem(elemStore['left-body-scroll'])
@@ -13022,14 +13038,14 @@ const tableMethods: any = {
13022
13038
 
13023
13039
  if (isRollX) {
13024
13040
  // 如果禁用滚动
13025
- if (scrollbarXOpts.visible === 'hidden') {
13041
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
13026
13042
  evnt.preventDefault()
13027
13043
  return
13028
13044
  }
13029
13045
  }
13030
13046
  if (isRollY) {
13031
13047
  // 如果禁用滚动
13032
- if (scrollbarYOpts.visible === 'hidden') {
13048
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
13033
13049
  evnt.preventDefault()
13034
13050
  return
13035
13051
  }
@@ -14034,6 +14050,210 @@ const tableMethods: any = {
14034
14050
 
14035
14051
  return $xeTable.handleClearStack()
14036
14052
  },
14053
+
14054
+ // 滚动条
14055
+ updateThumbSize () {
14056
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14057
+ const reactData = $xeTable as unknown as TableReactData
14058
+ const internalData = $xeTable as unknown as TableInternalData
14059
+
14060
+ const { elemStore } = internalData
14061
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14062
+ if (!viewEl) {
14063
+ return
14064
+ }
14065
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
14066
+ return
14067
+ }
14068
+ const trackXEl = $xeTable.$refs.refTrackXElem as HTMLDivElement
14069
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
14070
+ const thumbXElem = $xeTable.$refs.refThumbXElem as HTMLDivElement
14071
+ if (thumbXElem) {
14072
+ thumbXElem.style.width = xThumbWidth + 'px'
14073
+ }
14074
+ reactData.xThumbWidth = xThumbWidth
14075
+
14076
+ const trackYEl = $xeTable.$refs.refTrackYElem as HTMLDivElement
14077
+
14078
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
14079
+ const thumbYElem = $xeTable.$refs.refThumbYElem as HTMLDivElement
14080
+ if (thumbYElem) {
14081
+ thumbYElem.style.height = yThumbHeight + 'px'
14082
+ }
14083
+ reactData.yThumbHeight = yThumbHeight
14084
+ },
14085
+ updateThumbOffset () {
14086
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14087
+ const reactData = $xeTable as unknown as TableReactData
14088
+ const internalData = $xeTable as unknown as TableInternalData
14089
+
14090
+ const { elemStore } = internalData
14091
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14092
+ if (!viewEl) {
14093
+ return
14094
+ }
14095
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
14096
+ return
14097
+ }
14098
+ const { xThumbWidth, yThumbHeight } = reactData
14099
+ const trackXEl = $xeTable.$refs.refTrackXElem as HTMLDivElement
14100
+ const thumbXElem = $xeTable.$refs.refThumbXElem as HTMLDivElement
14101
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
14102
+ internalData.xThumbLeft = xThumbLeft
14103
+ if (thumbXElem && xThumbWidth) {
14104
+ thumbXElem.style.width = xThumbWidth + 'px'
14105
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
14106
+ }
14107
+
14108
+ const trackYEl = $xeTable.$refs.refTrackYElem as HTMLDivElement
14109
+ const thumbYElem = $xeTable.$refs.refThumbYElem as HTMLDivElement
14110
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
14111
+ internalData.yThumbTop = yThumbTop
14112
+ if (thumbYElem && yThumbHeight) {
14113
+ thumbYElem.style.height = yThumbHeight + 'px'
14114
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
14115
+ }
14116
+ },
14117
+ clickTrackXEvent (evnt: MouseEvent) {
14118
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14119
+ const reactData = $xeTable as unknown as TableReactData
14120
+ const internalData = $xeTable as unknown as TableInternalData
14121
+
14122
+ const { elemStore } = internalData
14123
+ const trackEl = evnt.currentTarget as HTMLDivElement
14124
+ if (trackEl !== evnt.target) {
14125
+ return
14126
+ }
14127
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14128
+ if (!viewEl) {
14129
+ return
14130
+ }
14131
+ const { xThumbWidth } = reactData
14132
+ const trackRect = trackEl.getBoundingClientRect()
14133
+ viewEl.scrollTo({
14134
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
14135
+ behavior: 'auto'
14136
+ })
14137
+ },
14138
+ clickTrackYEvent (evnt: MouseEvent) {
14139
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14140
+ const reactData = $xeTable as unknown as TableReactData
14141
+ const internalData = $xeTable as unknown as TableInternalData
14142
+
14143
+ const trackEl = evnt.currentTarget as HTMLDivElement
14144
+ if (trackEl !== evnt.target) {
14145
+ return
14146
+ }
14147
+ const { elemStore } = internalData
14148
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14149
+ if (!viewEl) {
14150
+ return
14151
+ }
14152
+ const { yThumbHeight } = reactData
14153
+ const trackRect = trackEl.getBoundingClientRect()
14154
+ viewEl.scrollTo({
14155
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
14156
+ behavior: 'auto'
14157
+ })
14158
+ },
14159
+ pointerdownThumbXEvent (evnt: PointerEvent) {
14160
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14161
+ const reactData = $xeTable as unknown as TableReactData
14162
+ const internalData = $xeTable as unknown as TableInternalData
14163
+
14164
+ const { elemStore } = internalData
14165
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14166
+ internalData.isThumbDrag = true
14167
+ thumbEl.setPointerCapture(evnt.pointerId)
14168
+
14169
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14170
+ if (!viewEl) {
14171
+ return
14172
+ }
14173
+ const { xThumbWidth } = reactData
14174
+ const trackEl = thumbEl.parentElement as HTMLDivElement
14175
+ const trackRect = trackEl.getBoundingClientRect()
14176
+ const pointerPosition = evnt.clientX - trackRect.left
14177
+ // 记录 thumb 的偏移
14178
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
14179
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
14180
+ },
14181
+ pointermoveThumbXEvent (evnt: PointerEvent) {
14182
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14183
+ const reactData = $xeTable as unknown as TableReactData
14184
+ const internalData = $xeTable as unknown as TableInternalData
14185
+
14186
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14187
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
14188
+ return
14189
+ }
14190
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData
14191
+ if (isThumbDrag) {
14192
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14193
+ if (!viewEl) {
14194
+ return
14195
+ }
14196
+ const { xThumbWidth } = reactData
14197
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14198
+ const trackEl = thumbEl.parentElement as HTMLDivElement
14199
+ const trackRect = trackEl.getBoundingClientRect()
14200
+ // 更新偏移
14201
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
14202
+ }
14203
+ },
14204
+ cleatPointerThumbEvent (evnt: PointerEvent) {
14205
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14206
+ const internalData = $xeTable as unknown as TableInternalData
14207
+
14208
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14209
+ thumbEl.releasePointerCapture(evnt.pointerId)
14210
+ internalData.isThumbDrag = false
14211
+ },
14212
+ pointerdownThumbYEvent (evnt: PointerEvent) {
14213
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14214
+ const reactData = $xeTable as unknown as TableReactData
14215
+ const internalData = $xeTable as unknown as TableInternalData
14216
+
14217
+ const { elemStore } = internalData
14218
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14219
+ internalData.isThumbDrag = true
14220
+ thumbEl.setPointerCapture(evnt.pointerId)
14221
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14222
+ if (!viewEl) {
14223
+ return
14224
+ }
14225
+ const { yThumbHeight } = reactData
14226
+ const trackEl = thumbEl.parentElement as HTMLDivElement
14227
+ const trackRect = trackEl.getBoundingClientRect()
14228
+ const pointerPosition = evnt.clientY - trackRect.top
14229
+ // 记录 thumb 的偏移
14230
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
14231
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
14232
+ },
14233
+ pointermoveThumbYEvent (evnt: PointerEvent) {
14234
+ const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14235
+ const reactData = $xeTable as unknown as TableReactData
14236
+ const internalData = $xeTable as unknown as TableInternalData
14237
+
14238
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14239
+ if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
14240
+ return
14241
+ }
14242
+ const { elemStore, isThumbDrag, thumbDragOffset } = internalData
14243
+ if (isThumbDrag) {
14244
+ const viewEl = getRefElem(elemStore['main-body-scroll'])
14245
+ if (!viewEl) {
14246
+ return
14247
+ }
14248
+ const { yThumbHeight } = reactData
14249
+ const thumbEl = evnt.currentTarget as HTMLDivElement
14250
+ const trackEl = thumbEl.parentElement as HTMLDivElement
14251
+ const trackRect = trackEl.getBoundingClientRect()
14252
+ // 更新偏移
14253
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
14254
+ }
14255
+ },
14256
+ // 滚动条
14037
14257
  dispatchEvent (type: ValueOf<VxeTableEmits>, params: Record<string, any>, evnt: Event | null) {
14038
14258
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14039
14259
  const $xeGrid = $xeTable.$xeGrid
@@ -1,5 +1,6 @@
1
1
  import { PropType } from 'vue'
2
2
  import { VxeUI } from '../../ui'
3
+ import { getDefaultConfig } from '../../ui/src/utils'
3
4
 
4
5
  import type { VxeTablePropTypes } from '../../../types'
5
6
 
@@ -298,6 +299,10 @@ export const tableProps = {
298
299
  virtualXConfig: Object as PropType<VxeTablePropTypes.VirtualXConfig>,
299
300
  // 纵向虚拟滚动配置项
300
301
  virtualYConfig: Object as PropType<VxeTablePropTypes.VirtualYConfig>,
302
+ useScrollbar: {
303
+ type: Boolean as PropType<VxeTablePropTypes.UseScrollbar>,
304
+ default: () => getDefaultConfig(getConfig().table.useScrollbar, getConfig().useScrollbar)
305
+ },
301
306
  // 滚动条配置项
302
307
  scrollbarConfig: Object as PropType<VxeTablePropTypes.ScrollbarConfig>,
303
308
  // 撤销/恢复历史配置项
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 计算滚动条滑块的长度
3
+ */
4
+ export function getThumbSize (viewportSize: number, contentSize: number, trackSize: number) {
5
+ if (contentSize <= viewportSize) {
6
+ return 0
7
+ }
8
+ const ratio = viewportSize / contentSize
9
+ const ideal = trackSize * ratio
10
+ return Math.max(20, Math.min(ideal, trackSize))
11
+ }
12
+
13
+ /**
14
+ * 计算滚动条滑块的偏移位置
15
+ */
16
+ export function getThumbOffsetSize (offsetSize: number, viewportSize: number, contentSize: number, trackSize: number, thumbSize: number) {
17
+ const maxScroll = contentSize - viewportSize
18
+ if (maxScroll <= 0) {
19
+ return 0
20
+ }
21
+ const maxThumbOffset = trackSize - thumbSize
22
+ if (maxThumbOffset <= 0) {
23
+ return 0
24
+ }
25
+ const clamped = Math.min(Math.max(offsetSize, 0), maxScroll)
26
+ const ratio = clamped / maxScroll
27
+ return ratio * maxThumbOffset
28
+ }
29
+
30
+ /**
31
+ * 根据点击轨道的位置,计算滑块的偏移位置
32
+ */
33
+ export function getScrollFromClick (clickPosition: number, viewportSize: number, contentSize: number, trackSize: number, thumbSize: number) {
34
+ const maxThumbOffset = trackSize - thumbSize
35
+ const maxScroll = contentSize - viewportSize
36
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
37
+ return 0
38
+ }
39
+ let thumbOffset = clickPosition - thumbSize / 2
40
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset)
41
+ const scrollOffset = (thumbOffset / maxThumbOffset) * maxScroll
42
+ return scrollOffset
43
+ }
44
+
45
+ /**
46
+ * 拖拽 thumb 时,根据鼠标位置计算滑块的偏移位置
47
+ */
48
+ export function getScrollFromDrag (pointerPosition: number, dragOffset: number, viewportSize: number, contentSize: number, trackSize: number, thumbSize: number) {
49
+ const maxScroll = contentSize - viewportSize
50
+ const maxThumbOffset = trackSize - thumbSize
51
+ if (maxScroll <= 0 || maxThumbOffset <= 0) {
52
+ return 0
53
+ }
54
+ let thumbOffset = pointerPosition - dragOffset
55
+ thumbOffset = Math.min(Math.max(thumbOffset, 0), maxThumbOffset)
56
+ return (thumbOffset / maxThumbOffset) * maxScroll
57
+ }