vxe-table 3.25.0-beta.1 → 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 (52) hide show
  1. package/es/index.css +1 -1
  2. package/es/index.min.css +1 -1
  3. package/es/style.css +1 -1
  4. package/es/style.min.css +1 -1
  5. package/es/table/src/methods.js +246 -44
  6. package/es/table/src/props.js +2 -1
  7. package/es/table/src/scrollbar.js +54 -0
  8. package/es/table/src/table.js +266 -64
  9. package/es/table/src/util.js +11 -2
  10. package/es/table/style.css +30 -0
  11. package/es/table/style.min.css +1 -1
  12. package/es/ui/index.js +1 -1
  13. package/es/ui/src/log.js +1 -1
  14. package/es/vxe-table/style.css +30 -0
  15. package/es/vxe-table/style.min.css +1 -1
  16. package/lib/index.css +1 -1
  17. package/lib/index.min.css +1 -1
  18. package/lib/index.umd.js +337 -66
  19. package/lib/index.umd.min.js +1 -1
  20. package/lib/style.css +1 -1
  21. package/lib/style.min.css +1 -1
  22. package/lib/table/src/methods.js +21 -11
  23. package/lib/table/src/methods.min.js +1 -1
  24. package/lib/table/src/props.js +2 -1
  25. package/lib/table/src/props.min.js +1 -1
  26. package/lib/table/src/scrollbar.js +63 -0
  27. package/lib/table/src/scrollbar.min.js +1 -0
  28. package/lib/table/src/table.js +249 -52
  29. package/lib/table/src/table.min.js +1 -1
  30. package/lib/table/src/util.js +11 -2
  31. package/lib/table/src/util.min.js +1 -1
  32. package/lib/table/style/style.css +30 -0
  33. package/lib/table/style/style.min.css +1 -1
  34. package/lib/ui/index.js +1 -1
  35. package/lib/ui/index.min.js +1 -1
  36. package/lib/ui/src/log.js +1 -1
  37. package/lib/ui/src/log.min.js +1 -1
  38. package/lib/vxe-table/style/style.css +30 -0
  39. package/lib/vxe-table/style/style.min.css +1 -1
  40. package/package.json +2 -2
  41. package/packages/table/src/methods.ts +258 -44
  42. package/packages/table/src/props.ts +2 -1
  43. package/packages/table/src/scrollbar.ts +57 -0
  44. package/packages/table/src/table.ts +300 -69
  45. package/packages/table/src/util.ts +15 -2
  46. package/styles/components/table.scss +65 -0
  47. /package/es/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
  48. /package/es/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
  49. /package/es/{iconfont.1791954189007.woff2 → iconfont.1792035018941.woff2} +0 -0
  50. /package/lib/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
  51. /package/lib/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
  52. /package/lib/{iconfont.1791954189007.woff2 → iconfont.1792035018941.woff2} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vxe-table",
3
- "version": "3.25.0-beta.1",
3
+ "version": "3.25.0-beta.2",
4
4
  "description": "A PC-end table component based on Vxe UI, supporting copy-paste, data pivot table, and high-performance virtual list table solution.",
5
5
  "scripts": {
6
6
  "update": "npm install --legacy-peer-deps",
@@ -65,7 +65,7 @@
65
65
  "vue-i18n": "^8.15.1",
66
66
  "vue-router": "^3.5.1",
67
67
  "vue-template-compiler": "2.6.14",
68
- "vxe-pc-ui": "3.20.1"
68
+ "vxe-pc-ui": "3.20.2"
69
69
  },
70
70
  "vetur": {
71
71
  "tags": "helper/vetur/tags.json",
@@ -1,11 +1,12 @@
1
1
  import XEUtils from 'xe-utils'
2
2
  import { getTpImg, isPx, isScale, hasClass, addClass, removeClass, wheelScrollLeftTo, wheelScrollTopTo, getEventTargetNode, getPaddingTopBottomSize, setScrollTop, setScrollLeft, toCssUnit, hasControlKey, checkTargetElement, hasAxternalInputTarget } from '../../ui/src/dom'
3
- import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf, getDefaultConfig } from '../../ui/src/utils'
3
+ import { getLastZIndex, nextZIndex, hasChildrenList, getFuncText, isEnableConf, formatText, eqEmptyValue, hasEnableConf } from '../../ui/src/utils'
4
4
  import { VxeUI } from '../../ui'
5
5
  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
 
@@ -1055,13 +1056,13 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1055
1056
  emptyPlaceholderElem.style.height = bodyWrapperElem ? `${bodyWrapperElem.offsetHeight - osbHeight}px` : ''
1056
1057
  }
1057
1058
 
1058
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts
1059
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts
1059
+ const scrollXVisible = $xeTable.computeScrollXVisible
1060
+ const scrollYVisible = $xeTable.computeScrollYVisible
1060
1061
  const scrollbarYToLeft = $xeTable.computeScrollbarYToLeft
1061
1062
 
1062
1063
  let xScrollbarVisible = overflowX ? 'visible' : 'hidden'
1063
- const hideXScroll = scrollbarXOpts.visible === false || scrollbarXOpts.visible === 'hidden'
1064
- if (!hideXScroll || $xeGanttView) {
1064
+ const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden'
1065
+ if (scrollXVisible === 'visible' || $xeGanttView) {
1065
1066
  osbHeight = scrollbarHeight
1066
1067
  xScrollbarVisible = 'visible'
1067
1068
  } else if (hideXScroll) {
@@ -1070,11 +1071,11 @@ function updateStyle ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
1070
1071
  }
1071
1072
 
1072
1073
  let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
1073
- const showYScroll = !(scrollbarYOpts.visible === false || scrollbarYOpts.visible === 'hidden')
1074
- if (!showYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1074
+ const hideYScroll = scrollYVisible === false || scrollYVisible === 'hidden'
1075
+ if (hideYScroll || (($xeGantt && $xeGanttView && $xeGantt.reactData.showRightView) && !scrollbarYToLeft)) {
1075
1076
  osbWidth = 0
1076
1077
  yScrollbarVisible = 'hidden'
1077
- } else if (showYScroll) {
1078
+ } else if (scrollYVisible === 'visible') {
1078
1079
  osbWidth = scrollbarWidth
1079
1080
  yScrollbarVisible = 'visible'
1080
1081
  }
@@ -2441,14 +2442,6 @@ function autoCellWidth ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
2441
2442
  if (!bodyWrapperElem) {
2442
2443
  return
2443
2444
  }
2444
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
2445
- if (!yHandleEl) {
2446
- return
2447
- }
2448
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
2449
- if (!xHandleEl) {
2450
- return
2451
- }
2452
2445
  const columnOpts = $xeTable.computeColumnOpts
2453
2446
  let tWidth = 0
2454
2447
  const minCellWidth = 40 // 列宽最少限制 40px
@@ -3148,13 +3141,11 @@ function computeScrollLoad ($xeTable: VxeTableConstructor & VxeTablePrivateMetho
3148
3141
  }
3149
3142
 
3150
3143
  function calcScrollbar ($xeTable: VxeTableConstructor & VxeTablePrivateMethods) {
3151
- const scrollDefaultConf = ($xeTable as any).scrollDefaultConf
3152
3144
  const reactData = $xeTable as unknown as TableReactData
3153
3145
  const internalData = $xeTable as unknown as TableInternalData
3154
3146
 
3155
3147
  const { scrollXWidth, scrollYHeight } = reactData
3156
3148
  const { elemStore } = internalData
3157
- const scrollbarOpts = $xeTable.computeScrollbarOpts
3158
3149
  const el = $xeTable.$refs.refElem as HTMLDivElement
3159
3150
  if (!el || !el.clientWidth) {
3160
3151
  return
@@ -3164,24 +3155,30 @@ function calcScrollbar ($xeTable: VxeTableConstructor & VxeTablePrivateMethods)
3164
3155
  const footerTableElem = getRefElem(elemStore['main-footer-table'])
3165
3156
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
3166
3157
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
3158
+ const thumbXElem = $xeTable.$refs.refThumbXElem as HTMLDivElement
3159
+ const thumbYElem = $xeTable.$refs.refThumbYElem as HTMLDivElement
3167
3160
  let overflowY = false
3168
3161
  let overflowX = false
3169
3162
  if (bodyWrapperElem) {
3170
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts
3171
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts
3172
- const barWidth = XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarYOpts.width, scrollbarOpts.width), scrollDefaultConf.width))
3173
- const barHeight = XEUtils.toNumber(getDefaultConfig(getDefaultConfig(scrollbarXOpts.height, scrollbarOpts.height), scrollDefaultConf.height))
3163
+ const scrollbarOpts = $xeTable.computeScrollbarOpts
3164
+ const barWidth = $xeTable.computeScrollYWidth
3165
+ const barHeight = $xeTable.computeScrollXHeight
3174
3166
  overflowY = scrollYHeight > bodyWrapperElem.clientHeight
3175
- if (yHandleEl) {
3167
+ // 如果是虚拟滚动条
3168
+ if (thumbYElem) {
3169
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbYElem.offsetWidth : 0
3170
+ } else if (yHandleEl) {
3176
3171
  reactData.scrollbarWidth = (barWidth || barHeight) || (yHandleEl.offsetWidth - yHandleEl.clientWidth) || 14
3177
3172
  }
3178
3173
  reactData.overflowY = overflowY
3179
3174
 
3180
3175
  overflowX = scrollXWidth > bodyWrapperElem.clientWidth
3181
- if (xHandleEl) {
3176
+ // 如果是虚拟滚动条
3177
+ if (thumbXElem) {
3178
+ reactData.scrollbarHeight = scrollbarOpts.padding ? thumbXElem.offsetHeight : 0
3179
+ } else if (xHandleEl) {
3182
3180
  reactData.scrollbarHeight = (barHeight || barWidth) || (xHandleEl.offsetHeight - xHandleEl.clientHeight) || 14
3183
3181
  }
3184
- reactData.overflowX = overflowX
3185
3182
 
3186
3183
  const hHeight = headerTableElem ? headerTableElem.clientHeight : 0
3187
3184
  const fHeight = footerTableElem ? footerTableElem.clientHeight : 0
@@ -3276,6 +3273,7 @@ function handleLazyRecalculate ($xeTable: VxeTableConstructor & VxeTablePrivateM
3276
3273
  const refreshDelay = resizeOpts.refreshDelay || 30
3277
3274
  const reDelay = rceDelay + refreshDelay
3278
3275
  const el = $xeTable.$refs.refElem as HTMLElement
3276
+ $xeTable.updateScrollbar()
3279
3277
  if (el && el.clientWidth) {
3280
3278
  autoCellWidth($xeTable)
3281
3279
  updateRowExpandStyle($xeTable)
@@ -10271,6 +10269,14 @@ const tableMethods: any = {
10271
10269
  }
10272
10270
  return $xeTable.$nextTick()
10273
10271
  },
10272
+ /**
10273
+ * @private
10274
+ */
10275
+ updateScrollbar () {
10276
+ const $xeTable = this
10277
+ $xeTable.updateThumbSize()
10278
+ $xeTable.updateThumbOffset()
10279
+ },
10274
10280
  /**
10275
10281
  * 表头单元格按下事件
10276
10282
  */
@@ -12687,19 +12693,18 @@ const tableMethods: any = {
12687
12693
  const internalData = $xeTable as unknown as TableInternalData
12688
12694
 
12689
12695
  const { highlightHoverRow } = props
12690
- const { lastScrollLeft, lastScrollTop } = internalData
12691
- const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
12692
- const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
12693
- if (!xHandleEl || !yHandleEl) {
12696
+ const { elemStore, lastScrollLeft, lastScrollTop } = internalData
12697
+ const bodyScrollElem = getRefElem(elemStore['main-body-scroll'])
12698
+ if (!bodyScrollElem) {
12694
12699
  return
12695
12700
  }
12696
12701
  const rowOpts = $xeTable.computeRowOpts
12697
12702
  const validTip = $xeTable.$refs.refValidTooltip as VxeTooltipInstance
12698
12703
  const tooltip = $xeTable.$refs.refTooltip as VxeTooltipInstance
12699
- const bodyHeight = yHandleEl.clientHeight
12700
- const bodyWidth = xHandleEl.clientWidth
12701
- const scrollHeight = yHandleEl.scrollHeight
12702
- const scrollWidth = xHandleEl.scrollWidth
12704
+ const bodyHeight = bodyScrollElem.clientHeight
12705
+ const bodyWidth = bodyScrollElem.clientWidth
12706
+ const scrollHeight = bodyScrollElem.scrollHeight
12707
+ const scrollWidth = bodyScrollElem.scrollWidth
12703
12708
  let isTop = false
12704
12709
  let isBottom = false
12705
12710
  let isLeft = false
@@ -12766,6 +12771,7 @@ const tableMethods: any = {
12766
12771
  direction,
12767
12772
  ...params
12768
12773
  }
12774
+ $xeTable.updateThumbOffset()
12769
12775
  updateRowExpandStyle($xeTable)
12770
12776
  checkLastSyncScroll($xeTable, isRollX, isRollY)
12771
12777
  if (isRollX) {
@@ -12813,9 +12819,11 @@ const tableMethods: any = {
12813
12819
  },
12814
12820
  triggerBodyScrollEvent (evnt: Event, fixedType: '' | 'left' | 'right') {
12815
12821
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
12822
+ const props = $xeTable
12816
12823
  const reactData = $xeTable as unknown as TableReactData
12817
12824
  const internalData = $xeTable as unknown as TableInternalData
12818
12825
 
12826
+ const { useScrollbar } = props
12819
12827
  const { scrollYLoad, scrollXLoad } = reactData
12820
12828
  const { elemStore, intoRunScroll, lastScrollTop, lastScrollLeft, inWheelScroll, inVirtualScroll, inHeaderScroll, inBodyScroll, scrollRenderType, inFooterScroll } = internalData
12821
12829
  if (inWheelScroll || inVirtualScroll || inHeaderScroll || inFooterScroll) {
@@ -12835,19 +12843,21 @@ const tableMethods: any = {
12835
12843
  if (!bodyScrollElem) {
12836
12844
  return
12837
12845
  }
12838
- if (!xHandleEl) {
12839
- return
12840
- }
12841
- if (!yHandleEl) {
12842
- return
12846
+ if (!useScrollbar) {
12847
+ if (!xHandleEl) {
12848
+ return
12849
+ }
12850
+ if (!yHandleEl) {
12851
+ return
12852
+ }
12843
12853
  }
12844
12854
  if (inBodyScroll) {
12845
12855
  if (scrollRenderType !== fixedType) {
12846
12856
  return
12847
12857
  }
12848
12858
  }
12849
- let scrollTop = yHandleEl.scrollTop
12850
- let scrollLeft = xHandleEl.scrollLeft
12859
+ let scrollTop = 0
12860
+ let scrollLeft = 0
12851
12861
  if (leftScrollElem && fixedType === 'left') {
12852
12862
  scrollTop = leftScrollElem.scrollTop
12853
12863
  } else if (rightScrollElem && fixedType === 'right') {
@@ -13000,8 +13010,8 @@ const tableMethods: any = {
13000
13010
 
13001
13011
  const { elemStore, lastScrollTop, lastScrollLeft } = internalData
13002
13012
  const rowOpts = $xeTable.computeRowOpts
13003
- const scrollbarXOpts = $xeTable.computeScrollbarXOpts
13004
- const scrollbarYOpts = $xeTable.computeScrollbarYOpts
13013
+ const scrollXVisible = $xeTable.computeScrollXVisible
13014
+ const scrollYVisible = $xeTable.computeScrollYVisible
13005
13015
  const xHandleEl = $xeTable.$refs.refScrollXHandleElem as HTMLDivElement
13006
13016
  const yHandleEl = $xeTable.$refs.refScrollYHandleElem as HTMLDivElement
13007
13017
  const leftScrollElem = getRefElem(elemStore['left-body-scroll'])
@@ -13028,14 +13038,14 @@ const tableMethods: any = {
13028
13038
 
13029
13039
  if (isRollX) {
13030
13040
  // 如果禁用滚动
13031
- if (scrollbarXOpts.visible === false || scrollbarXOpts.visible === 'hidden') {
13041
+ if (scrollXVisible === false || scrollXVisible === 'hidden') {
13032
13042
  evnt.preventDefault()
13033
13043
  return
13034
13044
  }
13035
13045
  }
13036
13046
  if (isRollY) {
13037
13047
  // 如果禁用滚动
13038
- if (scrollbarYOpts.visible === false || scrollbarYOpts.visible === 'hidden') {
13048
+ if (scrollYVisible === false || scrollYVisible === 'hidden') {
13039
13049
  evnt.preventDefault()
13040
13050
  return
13041
13051
  }
@@ -14040,6 +14050,210 @@ const tableMethods: any = {
14040
14050
 
14041
14051
  return $xeTable.handleClearStack()
14042
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
+ // 滚动条
14043
14257
  dispatchEvent (type: ValueOf<VxeTableEmits>, params: Record<string, any>, evnt: Event | null) {
14044
14258
  const $xeTable = this as VxeTableConstructor & VxeTablePrivateMethods
14045
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
 
@@ -300,7 +301,7 @@ export const tableProps = {
300
301
  virtualYConfig: Object as PropType<VxeTablePropTypes.VirtualYConfig>,
301
302
  useScrollbar: {
302
303
  type: Boolean as PropType<VxeTablePropTypes.UseScrollbar>,
303
- default: () => getConfig().table.useScrollbar
304
+ default: () => getDefaultConfig(getConfig().table.useScrollbar, getConfig().useScrollbar)
304
305
  },
305
306
  // 滚动条配置项
306
307
  scrollbarConfig: Object as PropType<VxeTablePropTypes.ScrollbarConfig>,
@@ -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
+ }