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.
- package/es/index.css +1 -1
- package/es/index.min.css +1 -1
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/table/src/methods.js +246 -44
- package/es/table/src/props.js +2 -1
- package/es/table/src/scrollbar.js +54 -0
- package/es/table/src/table.js +266 -64
- 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 +1 -1
- 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 +337 -66
- package/lib/index.umd.min.js +1 -1
- 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 +2 -1
- 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 +249 -52
- 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 +1 -1
- 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/table/src/methods.ts +258 -44
- package/packages/table/src/props.ts +2 -1
- package/packages/table/src/scrollbar.ts +57 -0
- package/packages/table/src/table.ts +300 -69
- package/packages/table/src/util.ts +15 -2
- package/styles/components/table.scss +65 -0
- /package/es/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/es/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
- /package/es/{iconfont.1791954189007.woff2 → iconfont.1792035018941.woff2} +0 -0
- /package/lib/{iconfont.1791954189007.ttf → iconfont.1792035018941.ttf} +0 -0
- /package/lib/{iconfont.1791954189007.woff → iconfont.1792035018941.woff} +0 -0
- /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.
|
|
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.
|
|
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
|
|
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
|
|
1059
|
-
const
|
|
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 =
|
|
1064
|
-
if (
|
|
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
|
|
1074
|
-
if (
|
|
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 (
|
|
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
|
|
3171
|
-
const
|
|
3172
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
12692
|
-
|
|
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 =
|
|
12700
|
-
const bodyWidth =
|
|
12701
|
-
const scrollHeight =
|
|
12702
|
-
const 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 (!
|
|
12839
|
-
|
|
12840
|
-
|
|
12841
|
-
|
|
12842
|
-
|
|
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 =
|
|
12850
|
-
let 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
|
|
13004
|
-
const
|
|
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 (
|
|
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 (
|
|
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
|
+
}
|