vxe-pc-ui 3.19.8 → 3.20.0
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/icon/style.css +1 -1
- package/es/list/src/list.js +354 -17
- package/es/list/style.css +26 -0
- package/es/list/style.min.css +1 -1
- package/es/scrollbar/style.css +1 -0
- package/es/style.css +1 -1
- package/es/style.min.css +1 -1
- package/es/ui/index.js +1 -1
- package/es/ui/src/log.js +1 -1
- package/es/ui/src/utils.js +9 -0
- package/es/vxe-list/style.css +26 -0
- package/es/vxe-list/style.min.css +1 -1
- package/es/vxe-scrollbar/style.css +1 -0
- package/lib/icon/style/style.css +1 -1
- package/lib/icon/style/style.min.css +1 -1
- package/lib/index.umd.js +348 -19
- package/lib/index.umd.min.js +1 -1
- package/lib/list/src/list.js +340 -20
- package/lib/list/src/list.min.js +1 -1
- package/lib/list/style/style.css +26 -0
- package/lib/list/style/style.min.css +1 -1
- package/lib/scrollbar/style/style.css +1 -0
- package/lib/style.css +1 -1
- package/lib/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/ui/src/utils.js +10 -0
- package/lib/ui/src/utils.min.js +1 -1
- package/lib/vxe-list/style/style.css +26 -0
- package/lib/vxe-list/style/style.min.css +1 -1
- package/lib/vxe-scrollbar/style/style.css +1 -0
- package/package.json +1 -1
- package/packages/list/src/list.ts +382 -19
- package/packages/ui/src/utils.ts +10 -0
- package/styles/components/list.scss +51 -0
- package/styles/components/scrollbar.scss +3 -0
- package/types/components/card.d.ts +1 -1
- package/types/components/layout-aside.d.ts +1 -1
- package/types/components/layout-body.d.ts +1 -1
- package/types/components/list.d.ts +24 -2
- package/types/components/table-plugins/extend-cell-area.d.ts +1 -1
- package/types/components/table.d.ts +24 -0
- package/types/components/tabs.d.ts +1 -1
- /package/es/icon/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
- /package/es/icon/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
- /package/es/icon/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
- /package/es/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
- /package/es/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
- /package/es/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
- /package/lib/icon/style/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
- /package/lib/icon/style/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
- /package/lib/icon/style/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
- /package/lib/{iconfont.1791862954819.ttf → iconfont.1791880407207.ttf} +0 -0
- /package/lib/{iconfont.1791862954819.woff → iconfont.1791880407207.woff} +0 -0
- /package/lib/{iconfont.1791862954819.woff2 → iconfont.1791880407207.woff2} +0 -0
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import { PropType, CreateElement, VNode } from 'vue'
|
|
2
2
|
import { defineVxeComponent } from '../../ui/src/comp'
|
|
3
3
|
import XEUtils, { XEBrowse } from 'xe-utils'
|
|
4
|
-
import { VxeUI, getConfig, getIcon, getI18n, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui'
|
|
4
|
+
import { VxeUI, getConfig, getIcon, getI18n, domUtils, menus, globalEvents, globalResize, createEvent, globalMixins, renderEmptyElement } from '../../ui'
|
|
5
5
|
import { crossListDragRowGlobal, getCrossListDragRowInfo } from './store'
|
|
6
6
|
import { addClass, getTpImg, hasClass, isScale, removeClass, toCssUnit } from '../../ui/src/dom'
|
|
7
7
|
import { isEnableConf, getText, enModelValue, deModelValue } from '../../ui/src/utils'
|
|
8
8
|
import { getSlotVNs } from '../../ui/src/vn'
|
|
9
9
|
import { createComponentLog } from '../../ui/src/log'
|
|
10
10
|
import { moveRowAnimateToTb, clearRowAnimate } from '../../ui/src/anime'
|
|
11
|
+
import { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } from '../../scrollbar/src/util'
|
|
11
12
|
import { getItemCacheObj } from './util'
|
|
12
13
|
import VxeLoadingComponent from '../../loading'
|
|
13
14
|
|
|
14
|
-
import type { VxeListPropTypes, VxeListEmits, VxeComponentSizeType, ListReactData, VxeListDefines, ValueOf, ListInternalData, VxeListConstructor, VxeListPrivateMethods, VxeComponentStyleType } from '../../../types'
|
|
15
|
+
import type { VxeListPropTypes, VxeListEmits, VxeComponentSizeType, ListReactData, VxeListDefines, ValueOf, ListInternalData, VxeListConstructor, VxeListPrivateMethods, VxeComponentStyleType, VxeScrollbarPropTypes } from '../../../types'
|
|
15
16
|
|
|
16
17
|
const { warnLog, errLog } = createComponentLog('tree')
|
|
17
18
|
|
|
@@ -52,6 +53,11 @@ function createReactData (): ListReactData {
|
|
|
52
53
|
updateCheckboxFlag: 1,
|
|
53
54
|
isAllChecked: false,
|
|
54
55
|
isAllIndeterminate: false,
|
|
56
|
+
|
|
57
|
+
// 滚动条
|
|
58
|
+
yThumbHeight: 0,
|
|
59
|
+
xThumbWidth: 0,
|
|
60
|
+
|
|
55
61
|
insertRowFlag: 1,
|
|
56
62
|
removeRowFlag: 1,
|
|
57
63
|
dragRow: null,
|
|
@@ -62,13 +68,20 @@ function createReactData (): ListReactData {
|
|
|
62
68
|
|
|
63
69
|
function createInternalData (): ListInternalData {
|
|
64
70
|
return {
|
|
65
|
-
resizeObserver: undefined,
|
|
66
71
|
fullData: [],
|
|
67
72
|
afterList: [],
|
|
68
73
|
fullKeyMaps: {},
|
|
69
74
|
rowMaps: {},
|
|
70
|
-
|
|
75
|
+
|
|
76
|
+
// 滚动条
|
|
77
|
+
// resizeObserver: undefined,
|
|
78
|
+
// isThumbDrag: false,
|
|
79
|
+
thumbDragOffset: 0,
|
|
80
|
+
yThumbTop: 0,
|
|
81
|
+
xThumbLeft: 0,
|
|
71
82
|
lastScrollTop: 0,
|
|
83
|
+
lastScrollLeft: 0,
|
|
84
|
+
|
|
72
85
|
scrollYStore: {
|
|
73
86
|
startIndex: 0,
|
|
74
87
|
endIndex: 0,
|
|
@@ -125,7 +138,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
125
138
|
dragConfig: Object as PropType<VxeListPropTypes.DragConfig>,
|
|
126
139
|
menuConfig: Object as PropType<VxeListPropTypes.MenuConfig>,
|
|
127
140
|
virtualYConfig: Object as PropType<VxeListPropTypes.VirtualYConfig>,
|
|
128
|
-
scrollY: Object as PropType<VxeListPropTypes.ScrollY
|
|
141
|
+
scrollY: Object as PropType<VxeListPropTypes.ScrollY>,
|
|
142
|
+
useScrollbar: {
|
|
143
|
+
type: Boolean as PropType<VxeListPropTypes.UseScrollbar>,
|
|
144
|
+
default: () => getConfig().list.useScrollbar
|
|
145
|
+
},
|
|
146
|
+
scrollbarConfig: Object as PropType<VxeListPropTypes.ScrollbarConfig>
|
|
129
147
|
},
|
|
130
148
|
data () {
|
|
131
149
|
const xID = XEUtils.uniqueId()
|
|
@@ -208,11 +226,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
208
226
|
const $xeList = this
|
|
209
227
|
|
|
210
228
|
const rowHeight = $xeList.computeRowHeight
|
|
211
|
-
const
|
|
229
|
+
const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
|
|
230
|
+
const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
|
|
231
|
+
const stys: VxeComponentStyleType = {}
|
|
212
232
|
if (rowHeight) {
|
|
213
|
-
|
|
233
|
+
stys['--vxe-ui-list-row-height'] = toCssUnit(rowHeight)
|
|
214
234
|
}
|
|
215
|
-
|
|
235
|
+
if (scrollbarYOpts.width) {
|
|
236
|
+
stys['--vxe-ui-scrollbar-y-width'] = toCssUnit(scrollbarYOpts.width)
|
|
237
|
+
}
|
|
238
|
+
if (scrollbarXOpts.height) {
|
|
239
|
+
stys['--vxe-ui-scrollbar-x-height'] = toCssUnit(scrollbarXOpts.height)
|
|
240
|
+
}
|
|
241
|
+
return stys
|
|
216
242
|
},
|
|
217
243
|
computeVirtualStyles () {
|
|
218
244
|
const $xeList = this
|
|
@@ -229,8 +255,62 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
229
255
|
style.maxHeight = toCssUnit(Math.max(20, customMaxHeight - headHeight - footHeight))
|
|
230
256
|
}
|
|
231
257
|
return style
|
|
232
|
-
}
|
|
258
|
+
},
|
|
259
|
+
computeScrollbarOpts () {
|
|
260
|
+
const $xeList = this
|
|
261
|
+
const props = $xeList
|
|
233
262
|
|
|
263
|
+
return Object.assign({}, getConfig().list.scrollbarConfig, props.scrollbarConfig)
|
|
264
|
+
},
|
|
265
|
+
computeScrollbarXOpts () {
|
|
266
|
+
const $xeList = this
|
|
267
|
+
|
|
268
|
+
const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
|
|
269
|
+
return Object.assign({}, getConfig().scrollbar.xConfig, scrollbarOpts.xConfig)
|
|
270
|
+
},
|
|
271
|
+
computeScrollbarYOpts () {
|
|
272
|
+
const $xeList = this
|
|
273
|
+
|
|
274
|
+
const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
|
|
275
|
+
return Object.assign({}, getConfig().scrollbar.yConfig, scrollbarOpts.yConfig)
|
|
276
|
+
},
|
|
277
|
+
computeScrollbarWrapperClss () {
|
|
278
|
+
const $xeList = this
|
|
279
|
+
const reactData = $xeList.reactData
|
|
280
|
+
|
|
281
|
+
const scrollbarOpts = $xeList.computeScrollbarOpts as VxeListPropTypes.ScrollbarConfig
|
|
282
|
+
const { padding } = scrollbarOpts
|
|
283
|
+
const { yThumbHeight, xThumbWidth } = reactData
|
|
284
|
+
const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
|
|
285
|
+
const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
|
|
286
|
+
const scrollbarXToTop = $xeList.computeScrollbarXToTop
|
|
287
|
+
const scrollbarYToLeft = $xeList.computeScrollbarYToLeft
|
|
288
|
+
return domUtils.buildClass([
|
|
289
|
+
'vxe-scrollbar is--virtual',
|
|
290
|
+
`ov-x--${scrollbarXOpts.visible || 'visible'}`,
|
|
291
|
+
`ov-y--${scrollbarYOpts.visible || 'visible'}`,
|
|
292
|
+
`sx-pos--${scrollbarXToTop ? 'top' : 'bottom'}`,
|
|
293
|
+
`sy-pos--${scrollbarYToLeft ? 'left' : 'right'}`
|
|
294
|
+
], {
|
|
295
|
+
'is--padding': padding,
|
|
296
|
+
'ov-x--auto-hide': scrollbarXOpts.autoHide,
|
|
297
|
+
'ov-y--auto-hide': scrollbarYOpts.autoHide,
|
|
298
|
+
'overflow-y': yThumbHeight,
|
|
299
|
+
'overflow-x': xThumbWidth
|
|
300
|
+
})
|
|
301
|
+
},
|
|
302
|
+
computeScrollbarXToTop () {
|
|
303
|
+
const $xeList = this
|
|
304
|
+
|
|
305
|
+
const scrollbarXOpts = $xeList.computeScrollbarXOpts as VxeScrollbarPropTypes.XConfig
|
|
306
|
+
return scrollbarXOpts.position === 'top'
|
|
307
|
+
},
|
|
308
|
+
computeScrollbarYToLeft () {
|
|
309
|
+
const $xeList = this
|
|
310
|
+
|
|
311
|
+
const scrollbarYOpts = $xeList.computeScrollbarYOpts as VxeScrollbarPropTypes.YConfig
|
|
312
|
+
return scrollbarYOpts.position === 'left'
|
|
313
|
+
}
|
|
234
314
|
},
|
|
235
315
|
methods: {
|
|
236
316
|
//
|
|
@@ -573,6 +653,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
573
653
|
}
|
|
574
654
|
})
|
|
575
655
|
},
|
|
656
|
+
updateScrollbar () {
|
|
657
|
+
const $xeList = this
|
|
658
|
+
|
|
659
|
+
$xeList.updateThumbSize()
|
|
660
|
+
$xeList.updateThumbOffset()
|
|
661
|
+
},
|
|
576
662
|
/**
|
|
577
663
|
* 重新计算列表
|
|
578
664
|
*/
|
|
@@ -593,6 +679,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
593
679
|
parentHeight = parentEl.clientHeight - Math.ceil(XEUtils.toNumber(parentStyle.paddingLeft) + XEUtils.toNumber(parentStyle.paddingRight))
|
|
594
680
|
}
|
|
595
681
|
reactData.parentHeight = parentHeight
|
|
682
|
+
$xeList.updateScrollbar()
|
|
596
683
|
$xeList.updateHeight()
|
|
597
684
|
if (el.clientWidth && el.clientHeight) {
|
|
598
685
|
return $xeList.computeScrollLoad()
|
|
@@ -629,6 +716,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
629
716
|
const scrollLeft = scrollBodyElem.scrollLeft
|
|
630
717
|
const isX = scrollLeft !== internalData.lastScrollLeft
|
|
631
718
|
const isY = scrollTop !== internalData.lastScrollTop
|
|
719
|
+
$xeList.updateThumbOffset()
|
|
632
720
|
internalData.lastScrollTop = scrollTop
|
|
633
721
|
internalData.lastScrollLeft = scrollLeft
|
|
634
722
|
if (reactData.scrollYLoad) {
|
|
@@ -1951,6 +2039,200 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
1951
2039
|
}
|
|
1952
2040
|
$xeList.dispatchEvent('row-menu', { row }, evnt)
|
|
1953
2041
|
},
|
|
2042
|
+
// 滚动条
|
|
2043
|
+
updateThumbSize () {
|
|
2044
|
+
const $xeList = this
|
|
2045
|
+
const reactData = $xeList.reactData
|
|
2046
|
+
|
|
2047
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2048
|
+
if (!viewEl) {
|
|
2049
|
+
return
|
|
2050
|
+
}
|
|
2051
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
2052
|
+
return
|
|
2053
|
+
}
|
|
2054
|
+
const trackXEl = $xeList.$refs.refTrackXElem as HTMLDivElement
|
|
2055
|
+
const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
|
|
2056
|
+
const thumbXElem = $xeList.$refs.refThumbXElem as HTMLDivElement
|
|
2057
|
+
if (thumbXElem) {
|
|
2058
|
+
thumbXElem.style.width = xThumbWidth + 'px'
|
|
2059
|
+
}
|
|
2060
|
+
reactData.xThumbWidth = xThumbWidth
|
|
2061
|
+
|
|
2062
|
+
const trackYEl = $xeList.$refs.refTrackYElem as HTMLDivElement
|
|
2063
|
+
|
|
2064
|
+
const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
|
|
2065
|
+
const thumbYElem = $xeList.$refs.refThumbYElem as HTMLDivElement
|
|
2066
|
+
if (thumbYElem) {
|
|
2067
|
+
thumbYElem.style.height = yThumbHeight + 'px'
|
|
2068
|
+
}
|
|
2069
|
+
reactData.yThumbHeight = yThumbHeight
|
|
2070
|
+
},
|
|
2071
|
+
updateThumbOffset () {
|
|
2072
|
+
const $xeList = this
|
|
2073
|
+
const reactData = $xeList.reactData
|
|
2074
|
+
const internalData = $xeList.internalData
|
|
2075
|
+
|
|
2076
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2077
|
+
if (!viewEl) {
|
|
2078
|
+
return
|
|
2079
|
+
}
|
|
2080
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
2081
|
+
return
|
|
2082
|
+
}
|
|
2083
|
+
const { xThumbWidth, yThumbHeight } = reactData
|
|
2084
|
+
const trackXEl = $xeList.$refs.refTrackXElem as HTMLDivElement
|
|
2085
|
+
const thumbXElem = $xeList.$refs.refThumbXElem as HTMLDivElement
|
|
2086
|
+
const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
|
|
2087
|
+
internalData.xThumbLeft = xThumbLeft
|
|
2088
|
+
if (thumbXElem && xThumbWidth) {
|
|
2089
|
+
thumbXElem.style.width = xThumbWidth + 'px'
|
|
2090
|
+
thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
|
|
2091
|
+
}
|
|
2092
|
+
|
|
2093
|
+
const trackYEl = $xeList.$refs.refTrackYElem as HTMLDivElement
|
|
2094
|
+
const thumbYElem = $xeList.$refs.refThumbYElem as HTMLDivElement
|
|
2095
|
+
const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
|
|
2096
|
+
internalData.yThumbTop = yThumbTop
|
|
2097
|
+
if (thumbYElem && yThumbHeight) {
|
|
2098
|
+
thumbYElem.style.height = yThumbHeight + 'px'
|
|
2099
|
+
thumbYElem.style.transform = `translateY(${yThumbTop}px)`
|
|
2100
|
+
}
|
|
2101
|
+
},
|
|
2102
|
+
clickTrackXEvent (evnt: MouseEvent) {
|
|
2103
|
+
const $xeList = this
|
|
2104
|
+
const reactData = $xeList.reactData
|
|
2105
|
+
|
|
2106
|
+
const trackEl = evnt.currentTarget as HTMLDivElement
|
|
2107
|
+
if (trackEl !== evnt.target) {
|
|
2108
|
+
return
|
|
2109
|
+
}
|
|
2110
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2111
|
+
if (!viewEl) {
|
|
2112
|
+
return
|
|
2113
|
+
}
|
|
2114
|
+
const { xThumbWidth } = reactData
|
|
2115
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2116
|
+
viewEl.scrollTo({
|
|
2117
|
+
left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
|
|
2118
|
+
behavior: 'auto'
|
|
2119
|
+
})
|
|
2120
|
+
},
|
|
2121
|
+
clickTrackYEvent (evnt: MouseEvent) {
|
|
2122
|
+
const $xeList = this
|
|
2123
|
+
const reactData = $xeList.reactData
|
|
2124
|
+
|
|
2125
|
+
const trackEl = evnt.currentTarget as HTMLDivElement
|
|
2126
|
+
if (trackEl !== evnt.target) {
|
|
2127
|
+
return
|
|
2128
|
+
}
|
|
2129
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2130
|
+
if (!viewEl) {
|
|
2131
|
+
return
|
|
2132
|
+
}
|
|
2133
|
+
const { yThumbHeight } = reactData
|
|
2134
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2135
|
+
viewEl.scrollTo({
|
|
2136
|
+
top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
|
|
2137
|
+
behavior: 'auto'
|
|
2138
|
+
})
|
|
2139
|
+
},
|
|
2140
|
+
pointerdownThumbXEvent (evnt: PointerEvent) {
|
|
2141
|
+
const $xeList = this
|
|
2142
|
+
const reactData = $xeList.reactData
|
|
2143
|
+
const internalData = $xeList.internalData
|
|
2144
|
+
|
|
2145
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2146
|
+
internalData.isThumbDrag = true
|
|
2147
|
+
thumbEl.setPointerCapture(evnt.pointerId)
|
|
2148
|
+
|
|
2149
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2150
|
+
if (!viewEl) {
|
|
2151
|
+
return
|
|
2152
|
+
}
|
|
2153
|
+
const { xThumbWidth } = reactData
|
|
2154
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
2155
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2156
|
+
const pointerPosition = evnt.clientX - trackRect.left
|
|
2157
|
+
// 记录 thumb 的偏移
|
|
2158
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
|
|
2159
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset
|
|
2160
|
+
},
|
|
2161
|
+
pointermoveThumbXEvent (evnt: PointerEvent) {
|
|
2162
|
+
const $xeList = this
|
|
2163
|
+
const reactData = $xeList.reactData
|
|
2164
|
+
const internalData = $xeList.internalData
|
|
2165
|
+
|
|
2166
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2167
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
2168
|
+
return
|
|
2169
|
+
}
|
|
2170
|
+
const { isThumbDrag, thumbDragOffset } = internalData
|
|
2171
|
+
if (isThumbDrag) {
|
|
2172
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2173
|
+
if (!viewEl) {
|
|
2174
|
+
return
|
|
2175
|
+
}
|
|
2176
|
+
const { xThumbWidth } = reactData
|
|
2177
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2178
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
2179
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2180
|
+
// 更新偏移
|
|
2181
|
+
viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
|
|
2182
|
+
}
|
|
2183
|
+
},
|
|
2184
|
+
cleatPointerThumbEvent (evnt: PointerEvent) {
|
|
2185
|
+
const $xeList = this
|
|
2186
|
+
const internalData = $xeList.internalData
|
|
2187
|
+
|
|
2188
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2189
|
+
thumbEl.releasePointerCapture(evnt.pointerId)
|
|
2190
|
+
internalData.isThumbDrag = false
|
|
2191
|
+
},
|
|
2192
|
+
pointerdownThumbYEvent (evnt: PointerEvent) {
|
|
2193
|
+
const $xeList = this
|
|
2194
|
+
const reactData = $xeList.reactData
|
|
2195
|
+
const internalData = $xeList.internalData
|
|
2196
|
+
|
|
2197
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2198
|
+
internalData.isThumbDrag = true
|
|
2199
|
+
thumbEl.setPointerCapture(evnt.pointerId)
|
|
2200
|
+
|
|
2201
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2202
|
+
if (!viewEl) {
|
|
2203
|
+
return
|
|
2204
|
+
}
|
|
2205
|
+
const { yThumbHeight } = reactData
|
|
2206
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
2207
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2208
|
+
const pointerPosition = evnt.clientY - trackRect.top
|
|
2209
|
+
// 记录 thumb 的偏移
|
|
2210
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
|
|
2211
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset
|
|
2212
|
+
},
|
|
2213
|
+
pointermoveThumbYEvent (evnt: PointerEvent) {
|
|
2214
|
+
const $xeList = this
|
|
2215
|
+
const reactData = $xeList.reactData
|
|
2216
|
+
const internalData = $xeList.internalData
|
|
2217
|
+
|
|
2218
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2219
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
2220
|
+
return
|
|
2221
|
+
}
|
|
2222
|
+
const { isThumbDrag, thumbDragOffset } = internalData
|
|
2223
|
+
if (isThumbDrag) {
|
|
2224
|
+
const viewEl = $xeList.$refs.refVirtualWrapper as HTMLDivElement
|
|
2225
|
+
if (!viewEl) {
|
|
2226
|
+
return
|
|
2227
|
+
}
|
|
2228
|
+
const { yThumbHeight } = reactData
|
|
2229
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
2230
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
2231
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
2232
|
+
// 更新偏移
|
|
2233
|
+
viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
|
|
2234
|
+
}
|
|
2235
|
+
},
|
|
1954
2236
|
|
|
1955
2237
|
//
|
|
1956
2238
|
// Render
|
|
@@ -2215,7 +2497,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2215
2497
|
const reactData = $xeList.reactData
|
|
2216
2498
|
const slots = $xeList.$scopedSlots
|
|
2217
2499
|
|
|
2218
|
-
const { showCheckbox, className, loading } = props
|
|
2500
|
+
const { showCheckbox, className, loading, useScrollbar } = props
|
|
2219
2501
|
const { bodyHeight, topSpaceHeight, rowList, isAllChecked, isAllIndeterminate } = reactData
|
|
2220
2502
|
const defaultSlot = slots.default
|
|
2221
2503
|
const headerSlot = slots.header
|
|
@@ -2229,6 +2511,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2229
2511
|
const { trigger, isCrossListDrag } = dragOpts
|
|
2230
2512
|
const rowOpts = $xeList.computeRowOpts
|
|
2231
2513
|
const { isHover, padding } = rowOpts
|
|
2514
|
+
const isDrag = $xeList.computeIsDrag
|
|
2515
|
+
const scrollbarXOpts = $xeList.computeScrollbarXOpts
|
|
2516
|
+
const scrollbarYOpts = $xeList.computeScrollbarYOpts
|
|
2517
|
+
const scrollbarWrapperClss = $xeList.computeScrollbarWrapperClss
|
|
2232
2518
|
const showDefChekboxHead = showCheckbox && checkboxOpts.showHeader !== false
|
|
2233
2519
|
|
|
2234
2520
|
const leOns: {
|
|
@@ -2241,6 +2527,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2241
2527
|
ref: 'refElem',
|
|
2242
2528
|
class: ['vxe-list', className ? (XEUtils.isFunction(className) ? className({ $list: $xeList }) : className) : '', {
|
|
2243
2529
|
[`size--${vSize}`]: vSize,
|
|
2530
|
+
'is--virtual-scrollbar': useScrollbar,
|
|
2531
|
+
'ov-x--auto-hide': useScrollbar && scrollbarXOpts.autoHide,
|
|
2532
|
+
'ov-y--auto-hide': useScrollbar && scrollbarYOpts.autoHide,
|
|
2533
|
+
'is--drag': isDrag,
|
|
2244
2534
|
'is--loading': loading
|
|
2245
2535
|
}],
|
|
2246
2536
|
on: leOns,
|
|
@@ -2303,7 +2593,17 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2303
2593
|
style: {
|
|
2304
2594
|
marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
|
|
2305
2595
|
}
|
|
2306
|
-
},
|
|
2596
|
+
}, useScrollbar
|
|
2597
|
+
? (
|
|
2598
|
+
defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i))
|
|
2599
|
+
)
|
|
2600
|
+
: [
|
|
2601
|
+
h('div', {
|
|
2602
|
+
key: 'vi',
|
|
2603
|
+
ref: 'refViewInnerElem',
|
|
2604
|
+
class: 'vxe-scrollbar--view-inner'
|
|
2605
|
+
}, defaultSlot ? defaultSlot({ items: rowList, $list: $xeList }) : rowList.map((row, i) => $xeList.renderRow(h, row, i)))
|
|
2606
|
+
])
|
|
2307
2607
|
]),
|
|
2308
2608
|
footerSlot
|
|
2309
2609
|
? h('div', {
|
|
@@ -2311,6 +2611,57 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2311
2611
|
class: 'vxe-list--footer-wrapper'
|
|
2312
2612
|
}, footerSlot({ items: rowList, $list: $xeList }))
|
|
2313
2613
|
: renderEmptyElement($xeList),
|
|
2614
|
+
/**
|
|
2615
|
+
* 滚动条
|
|
2616
|
+
*/
|
|
2617
|
+
useScrollbar
|
|
2618
|
+
? h('div', {
|
|
2619
|
+
class: scrollbarWrapperClss
|
|
2620
|
+
}, [
|
|
2621
|
+
scrollbarXOpts.visible === 'hidden'
|
|
2622
|
+
? renderEmptyElement($xeList)
|
|
2623
|
+
: h('div', {
|
|
2624
|
+
ref: 'refTrackXElem',
|
|
2625
|
+
class: 'vxe-scrollbar--track-x',
|
|
2626
|
+
on: {
|
|
2627
|
+
click: $xeList.clickTrackXEvent
|
|
2628
|
+
}
|
|
2629
|
+
}, [
|
|
2630
|
+
h('div', {
|
|
2631
|
+
ref: 'refThumbXElem',
|
|
2632
|
+
class: 'vxe-scrollbar--thumb-x',
|
|
2633
|
+
on: {
|
|
2634
|
+
pointerdown: $xeList.pointerdownThumbXEvent,
|
|
2635
|
+
pointermove: $xeList.pointermoveThumbXEvent,
|
|
2636
|
+
pointerup: $xeList.cleatPointerThumbEvent,
|
|
2637
|
+
pointercancel: $xeList.cleatPointerThumbEvent,
|
|
2638
|
+
lostpointercapture: $xeList.cleatPointerThumbEvent
|
|
2639
|
+
}
|
|
2640
|
+
})
|
|
2641
|
+
]),
|
|
2642
|
+
scrollbarYOpts.visible === 'hidden'
|
|
2643
|
+
? renderEmptyElement($xeList)
|
|
2644
|
+
: h('div', {
|
|
2645
|
+
ref: 'refTrackYElem',
|
|
2646
|
+
class: 'vxe-scrollbar--track-y',
|
|
2647
|
+
on: {
|
|
2648
|
+
click: $xeList.clickTrackYEvent
|
|
2649
|
+
}
|
|
2650
|
+
}, [
|
|
2651
|
+
h('div', {
|
|
2652
|
+
ref: 'refThumbYElem',
|
|
2653
|
+
class: 'vxe-scrollbar--thumb-y',
|
|
2654
|
+
on: {
|
|
2655
|
+
pointerdown: $xeList.pointerdownThumbYEvent,
|
|
2656
|
+
pointermove: $xeList.pointermoveThumbYEvent,
|
|
2657
|
+
pointerup: $xeList.cleatPointerThumbEvent,
|
|
2658
|
+
pointercancel: $xeList.cleatPointerThumbEvent,
|
|
2659
|
+
lostpointercapture: $xeList.cleatPointerThumbEvent
|
|
2660
|
+
}
|
|
2661
|
+
})
|
|
2662
|
+
])
|
|
2663
|
+
])
|
|
2664
|
+
: renderEmptyElement($xeList),
|
|
2314
2665
|
/**
|
|
2315
2666
|
* 拖拽提示
|
|
2316
2667
|
*/
|
|
@@ -2386,7 +2737,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2386
2737
|
const props = $xeList
|
|
2387
2738
|
const internalData = $xeList.internalData
|
|
2388
2739
|
|
|
2389
|
-
const { showSeq, showRadio, showCheckbox } = props
|
|
2740
|
+
const { showSeq, showRadio, showCheckbox, autoResize, useScrollbar } = props
|
|
2390
2741
|
const rowOpts = $xeList.computeRowOpts
|
|
2391
2742
|
const { useKey, keyField } = rowOpts
|
|
2392
2743
|
const isDrag = $xeList.computeIsDrag
|
|
@@ -2407,22 +2758,34 @@ export default /* define-vxe-component start */ defineVxeComponent({
|
|
|
2407
2758
|
if (useKey && !keyField) {
|
|
2408
2759
|
errLog('vxe.error.reqSupportProp', ['row-config.useKey', 'row-config.keyField'])
|
|
2409
2760
|
}
|
|
2410
|
-
if (
|
|
2761
|
+
if (useScrollbar || autoResize) {
|
|
2411
2762
|
const el = $xeList.$refs.refElem as HTMLDivElement
|
|
2412
|
-
const
|
|
2763
|
+
const viewInnerEl = $xeList.$refs.refViewInnerElem as HTMLDivElement
|
|
2764
|
+
const resizeObserver = globalResize.create(() => {
|
|
2765
|
+
$xeList.reFlag++
|
|
2766
|
+
})
|
|
2413
2767
|
resizeObserver.observe(el)
|
|
2414
|
-
if (
|
|
2415
|
-
|
|
2768
|
+
if (autoResize) {
|
|
2769
|
+
if (el) {
|
|
2770
|
+
resizeObserver.observe(el.parentElement as HTMLDivElement)
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
if (viewInnerEl) {
|
|
2774
|
+
resizeObserver.observe(viewInnerEl)
|
|
2416
2775
|
}
|
|
2417
2776
|
internalData.resizeObserver = resizeObserver
|
|
2418
2777
|
}
|
|
2419
|
-
$xeList.
|
|
2420
|
-
globalEvents.on($xeList, 'resize',
|
|
2778
|
+
$xeList.reFlag++
|
|
2779
|
+
globalEvents.on($xeList, 'resize', () => {
|
|
2780
|
+
$xeList.reFlag++
|
|
2781
|
+
})
|
|
2421
2782
|
},
|
|
2422
2783
|
activated () {
|
|
2423
2784
|
const $xeList = this
|
|
2424
2785
|
|
|
2425
|
-
$xeList.recalculate().then(() =>
|
|
2786
|
+
$xeList.recalculate().then(() => {
|
|
2787
|
+
$xeList.refreshScroll()
|
|
2788
|
+
})
|
|
2426
2789
|
},
|
|
2427
2790
|
beforeDestroy () {
|
|
2428
2791
|
const $xeList = this
|
package/packages/ui/src/utils.ts
CHANGED
|
@@ -6,6 +6,16 @@ export function isEnableConf (conf: any): boolean {
|
|
|
6
6
|
return conf && conf.enabled !== false
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* 用于开关类型的配置项
|
|
11
|
+
* 局部启用规则:conf={}
|
|
12
|
+
* 局部禁用规则:conf={enabled:false}
|
|
13
|
+
* 全局默认启用规则:conf.enabled=true
|
|
14
|
+
*/
|
|
15
|
+
export function hasEnableConf (conf: any, opts: any): boolean {
|
|
16
|
+
return opts && (conf ? opts.enabled !== false : opts.enabled)
|
|
17
|
+
}
|
|
18
|
+
|
|
9
19
|
export function nextZIndex () {
|
|
10
20
|
return DomZIndex.getNext()
|
|
11
21
|
}
|
|
@@ -287,3 +287,54 @@
|
|
|
287
287
|
padding-right: var(--vxe-ui-list-current-padding);
|
|
288
288
|
@include baseMixin.createRadioIcon();
|
|
289
289
|
}
|
|
290
|
+
|
|
291
|
+
// 滚动条
|
|
292
|
+
.vxe-list {
|
|
293
|
+
& > .vxe-scrollbar {
|
|
294
|
+
position: unset;
|
|
295
|
+
}
|
|
296
|
+
&.is--virtual-scrollbar {
|
|
297
|
+
& > .vxe-list--virtual-wrapper {
|
|
298
|
+
scrollbar-width: none;
|
|
299
|
+
-ms-overflow-style: none;
|
|
300
|
+
}
|
|
301
|
+
& > .vxe-list--virtual-wrapper::-webkit-scrollbar {
|
|
302
|
+
display: none;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.vxe-list {
|
|
308
|
+
&.is--virtual-scrollbar {
|
|
309
|
+
&.ov-x--auto-hide {
|
|
310
|
+
&:hover {
|
|
311
|
+
& > .vxe-scrollbar {
|
|
312
|
+
& > .vxe-scrollbar--track-x {
|
|
313
|
+
opacity: 1;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
& > .vxe-scrollbar {
|
|
318
|
+
& > .vxe-scrollbar--track-x {
|
|
319
|
+
opacity: 0;
|
|
320
|
+
@include baseMixin.createAnimationTransition(opacity, 0.8s);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
&.ov-y--auto-hide {
|
|
325
|
+
&:hover {
|
|
326
|
+
& > .vxe-scrollbar {
|
|
327
|
+
& > .vxe-scrollbar--track-y {
|
|
328
|
+
opacity: 1;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
& > .vxe-scrollbar {
|
|
333
|
+
& > .vxe-scrollbar--track-y {
|
|
334
|
+
opacity: 0;
|
|
335
|
+
@include baseMixin.createAnimationTransition(opacity, 0.8s);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
@@ -27,7 +27,7 @@ export namespace VxeCardPropTypes {
|
|
|
27
27
|
export type Padding = boolean
|
|
28
28
|
export type Size = VxeComponentSizeType
|
|
29
29
|
export type UseScrollbar = boolean
|
|
30
|
-
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
30
|
+
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export type VxeCardProps = {
|
|
@@ -30,7 +30,7 @@ export namespace VxeLayoutAsidePropTypes {
|
|
|
30
30
|
animation?: boolean
|
|
31
31
|
}
|
|
32
32
|
export type UseScrollbar = boolean
|
|
33
|
-
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
33
|
+
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export interface VxeLayoutAsideProps {
|
|
@@ -25,7 +25,7 @@ export namespace VxeLayoutBodyPropTypes {
|
|
|
25
25
|
export type ShowBacktop = boolean
|
|
26
26
|
export interface BacktopConfig extends Omit<VxeBacktopProps, 'target'> {}
|
|
27
27
|
export type UseScrollbar = boolean
|
|
28
|
-
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
28
|
+
export interface ScrollbarConfig extends Pick<VxeScrollbarProps, 'native' | 'xConfig' | 'yConfig' | 'padding' | 'className' | 'viewAttrs' | 'viewClassName' | 'viewInnerClassName'> {}
|
|
29
29
|
}
|
|
30
30
|
export interface VxeLayoutBodyProps {
|
|
31
31
|
size?: VxeLayoutBodyPropTypes.Size
|