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.
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/locale/lang/fr-FR.js +29 -29
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/src/methods.js +248 -40
- package/es/table/src/props.js +5 -0
- package/es/table/src/scrollbar.js +54 -0
- package/es/table/src/table.js +292 -73
- package/es/table/src/util.js +11 -2
- package/es/table/style.css +30 -0
- package/es/table/style.min.css +1 -1
- package/es/ui/index.js +9 -11
- package/es/ui/src/log.js +1 -1
- package/es/vxe-table/style.css +30 -0
- package/es/vxe-table/style.min.css +1 -1
- package/lib/index.css +1 -1
- package/lib/index.min.css +1 -1
- package/lib/index.umd.js +366 -84
- package/lib/index.umd.min.js +1 -1
- package/lib/locale/lang/fr-FR.js +29 -29
- package/lib/locale/lang/fr-FR.min.js +1 -1
- package/lib/locale/lang/fr-FR.umd.js +29 -29
- package/lib/style.css +1 -1
- package/lib/style.min.css +1 -1
- package/lib/table/src/methods.js +21 -11
- package/lib/table/src/methods.min.js +1 -1
- package/lib/table/src/props.js +5 -0
- package/lib/table/src/props.min.js +1 -1
- package/lib/table/src/scrollbar.js +63 -0
- package/lib/table/src/scrollbar.min.js +1 -0
- package/lib/table/src/table.js +265 -62
- package/lib/table/src/table.min.js +1 -1
- package/lib/table/src/util.js +11 -2
- package/lib/table/src/util.min.js +1 -1
- package/lib/table/style/style.css +30 -0
- package/lib/table/style/style.min.css +1 -1
- package/lib/ui/index.js +9 -11
- package/lib/ui/index.min.js +1 -1
- package/lib/ui/src/log.js +1 -1
- package/lib/ui/src/log.min.js +1 -1
- package/lib/vxe-table/style/style.css +30 -0
- package/lib/vxe-table/style/style.min.css +1 -1
- package/package.json +2 -2
- package/packages/locale/lang/fr-FR.ts +903 -903
- package/packages/table/src/methods.ts +260 -40
- package/packages/table/src/props.ts +5 -0
- package/packages/table/src/scrollbar.ts +57 -0
- package/packages/table/src/table.ts +329 -75
- package/packages/table/src/util.ts +15 -2
- package/packages/ui/index.ts +8 -10
- package/styles/components/table.scss +65 -0
- /package/es/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/es/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
- /package/es/{iconfont.1791880417274.woff2 → iconfont.1792035018941.woff2} +0 -0
- /package/lib/{iconfont.1791880417274.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/lib/{iconfont.1791880417274.woff → iconfont.1792035018941.woff} +0 -0
- /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
|
|
1060
|
-
const
|
|
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
|
-
|
|
1064
|
+
const hideXScroll = scrollXVisible === false || scrollXVisible === 'hidden'
|
|
1065
|
+
if (scrollXVisible === 'visible' || $xeGanttView) {
|
|
1065
1066
|
osbHeight = scrollbarHeight
|
|
1066
1067
|
xScrollbarVisible = 'visible'
|
|
1067
|
-
} else if (
|
|
1068
|
+
} else if (hideXScroll) {
|
|
1068
1069
|
osbHeight = 0
|
|
1069
1070
|
xScrollbarVisible = 'hidden'
|
|
1070
1071
|
}
|
|
1071
1072
|
|
|
1072
1073
|
let yScrollbarVisible = overflowY ? 'visible' : 'hidden'
|
|
1073
|
-
|
|
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 (
|
|
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
|
-
|
|
3170
|
-
|
|
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
|
-
|
|
3176
|
-
|
|
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
|
|
12686
|
-
|
|
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 =
|
|
12694
|
-
const bodyWidth =
|
|
12695
|
-
const scrollHeight =
|
|
12696
|
-
const 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 (!
|
|
12833
|
-
|
|
12834
|
-
|
|
12835
|
-
|
|
12836
|
-
|
|
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 =
|
|
12844
|
-
let 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
|
|
12998
|
-
const
|
|
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 (
|
|
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 (
|
|
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
|
+
}
|