@vxe-ui/core 3.4.35 → 3.4.37

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.
@@ -1,9 +1,35 @@
1
1
  import XEUtils from 'xe-utils'
2
2
  import Vue from 'vue'
3
3
  import { handleCheckInfo } from './permission'
4
+ import { scrollbarUtils } from './scrollbar-utils'
4
5
 
5
- import { VxeComponentSizeType, VxeComponentIsVScrollbar } from '../../types'
6
+ import { VxeGlobalUseMixins, VxeComponentSizeType, VxeComponentIsVScrollbar, VxeUseInitVScrollbarReactData, VxeUseInitVScrollbarInternalData } from '../../types'
6
7
 
8
+ const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils
9
+
10
+ function getVmInternalData ($xeVm: {
11
+ reactData: VxeUseInitVScrollbarReactData
12
+ internalData: VxeUseInitVScrollbarInternalData
13
+ getScrollViewElem(): HTMLDivElement | null | undefined
14
+ }) {
15
+ // 新版本 $xeVm.internalData
16
+ // 老版本 $xeVm
17
+ return $xeVm.internalData || $xeVm
18
+ }
19
+
20
+ function getVmReactData ($xeVm: {
21
+ reactData: VxeUseInitVScrollbarReactData
22
+ internalData: VxeUseInitVScrollbarInternalData
23
+ getScrollViewElem(): HTMLDivElement | null | undefined
24
+ }) {
25
+ // 新版本 $xeVm.reactData
26
+ // 老版本 $xeVm
27
+ return $xeVm.reactData || $xeVm
28
+ }
29
+
30
+ /**
31
+ * 组件尺寸上下文
32
+ */
7
33
  export const sizeMixin = Vue.extend({
8
34
  inject: {
9
35
  $xeSizeInfo: {
@@ -26,15 +52,29 @@ export const sizeMixin = Vue.extend({
26
52
  }
27
53
  })
28
54
 
55
+ /**
56
+ * 权限码处理
57
+ */
58
+ export const permissionMixin = Vue.extend({
59
+ computed: {
60
+ computePermissionInfo (this: any) {
61
+ return handleCheckInfo(this.permissionCode, this.permissionMethod)
62
+ }
63
+ }
64
+ })
65
+
66
+ /**
67
+ * 虚拟滚动条是否启用
68
+ */
29
69
  export const vScrollbarMixin = Vue.extend({
30
70
  inject: {
31
- $xeScrollbarInfo: {
71
+ $xeVmInfo: {
32
72
  default: null
33
73
  }
34
74
  },
35
75
  provide (this: any) {
36
76
  return {
37
- $xeScrollbarInfo: {
77
+ $xeVmInfo: {
38
78
  getIsVScrollbar: () => this.computeIsVScrollbar
39
79
  }
40
80
  }
@@ -42,22 +82,211 @@ export const vScrollbarMixin = Vue.extend({
42
82
  computed: {
43
83
  computeIsVScrollbar (this: any): VxeComponentIsVScrollbar {
44
84
  const { useScrollbar } = this
45
- const $xeScrollbarInfo = this.$xeScrollbarInfo
46
- return XEUtils.isBoolean(useScrollbar) ? useScrollbar : ($xeScrollbarInfo ? $xeScrollbarInfo.getIsVScrollbar() : null)
85
+ const $xeVmInfo = this.$xeVmInfo
86
+ return XEUtils.isBoolean(useScrollbar) ? useScrollbar : ($xeVmInfo ? $xeVmInfo.getIsVScrollbar() : null)
47
87
  }
48
88
  }
49
89
  })
50
90
 
51
- export const permissionMixin = Vue.extend({
52
- computed: {
53
- computePermissionInfo (this: any) {
54
- return handleCheckInfo(this.permissionCode, this.permissionMethod)
91
+ export const initVScrollbarMixin = Vue.extend({
92
+ ...({} as {
93
+ data(): {
94
+ reactData: VxeUseInitVScrollbarReactData
95
+ internalData: VxeUseInitVScrollbarInternalData
96
+ getScrollViewElem(): HTMLDivElement | null | undefined
97
+ }
98
+ }),
99
+ methods: {
100
+ updateThumbSize () {
101
+ const $xeVm = this
102
+ const reactData = getVmReactData($xeVm)
103
+
104
+ const viewEl = $xeVm.getScrollViewElem()
105
+ if (!viewEl) {
106
+ return
107
+ }
108
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
109
+ return
110
+ }
111
+ const trackXEl = $xeVm.$refs.refTrackXElem as HTMLDivElement
112
+ const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
113
+ const thumbXElem = $xeVm.$refs.refThumbXElem as HTMLDivElement
114
+ if (thumbXElem) {
115
+ thumbXElem.style.width = xThumbWidth + 'px'
116
+ }
117
+ reactData.xThumbWidth = xThumbWidth
118
+
119
+ const trackYEl = $xeVm.$refs.refTrackYElem as HTMLDivElement
120
+ const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
121
+ const thumbYElem = $xeVm.$refs.refThumbYElem as HTMLDivElement
122
+ if (thumbYElem) {
123
+ thumbYElem.style.height = yThumbHeight + 'px'
124
+ }
125
+ reactData.yThumbHeight = yThumbHeight
126
+ },
127
+ updateThumbOffset () {
128
+ const $xeVm = this
129
+ const reactData = getVmReactData($xeVm)
130
+ const internalData = getVmInternalData($xeVm)
131
+
132
+ const viewEl = $xeVm.getScrollViewElem()
133
+ if (!viewEl) {
134
+ return
135
+ }
136
+ if (!viewEl.clientHeight || !viewEl.clientHeight) {
137
+ return
138
+ }
139
+ const { xThumbWidth, yThumbHeight } = reactData
140
+ const trackXEl = $xeVm.$refs.refTrackXElem as HTMLDivElement
141
+ const thumbXElem = $xeVm.$refs.refThumbXElem as HTMLDivElement
142
+ const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
143
+ internalData.xThumbLeft = xThumbLeft
144
+ if (thumbXElem && xThumbWidth) {
145
+ thumbXElem.style.width = xThumbWidth + 'px'
146
+ thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
147
+ }
148
+
149
+ const trackYEl = $xeVm.$refs.refTrackYElem as HTMLDivElement
150
+ const thumbYElem = $xeVm.$refs.refThumbYElem as HTMLDivElement
151
+ const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
152
+ internalData.yThumbTop = yThumbTop
153
+ if (thumbYElem && yThumbHeight) {
154
+ thumbYElem.style.height = yThumbHeight + 'px'
155
+ thumbYElem.style.transform = `translateY(${yThumbTop}px)`
156
+ }
157
+ },
158
+ clickTrackXEvent (evnt: MouseEvent) {
159
+ const $xeVm = this
160
+ const reactData = getVmReactData($xeVm)
161
+
162
+ const trackEl = evnt.currentTarget as HTMLDivElement
163
+ if (trackEl !== evnt.target) {
164
+ return
165
+ }
166
+ const viewEl = $xeVm.getScrollViewElem()
167
+ if (!viewEl) {
168
+ return
169
+ }
170
+ const { xThumbWidth } = reactData
171
+ const trackRect = trackEl.getBoundingClientRect()
172
+ viewEl.scrollTo({
173
+ left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
174
+ behavior: 'auto'
175
+ })
176
+ },
177
+ clickTrackYEvent (evnt: MouseEvent) {
178
+ const $xeVm = this
179
+ const reactData = getVmReactData($xeVm)
180
+
181
+ const trackEl = evnt.currentTarget as HTMLDivElement
182
+ if (trackEl !== evnt.target) {
183
+ return
184
+ }
185
+ const viewEl = $xeVm.getScrollViewElem()
186
+ if (!viewEl) {
187
+ return
188
+ }
189
+ const { yThumbHeight } = reactData
190
+ const trackRect = trackEl.getBoundingClientRect()
191
+ viewEl.scrollTo({
192
+ top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
193
+ behavior: 'auto'
194
+ })
195
+ },
196
+ pointerdownThumbXEvent (evnt: PointerEvent) {
197
+ const $xeVm = this
198
+ const reactData = getVmReactData($xeVm)
199
+ const internalData = getVmInternalData($xeVm)
200
+
201
+ const thumbEl = evnt.currentTarget as HTMLDivElement
202
+ internalData.isThumbDrag = true
203
+ thumbEl.setPointerCapture(evnt.pointerId)
204
+
205
+ const viewEl = $xeVm.getScrollViewElem()
206
+ if (!viewEl) {
207
+ return
208
+ }
209
+ const { xThumbWidth } = reactData
210
+ const trackEl = thumbEl.parentElement as HTMLDivElement
211
+ const trackRect = trackEl.getBoundingClientRect()
212
+ const pointerPosition = evnt.clientX - trackRect.left
213
+ // 记录 thumb 的偏移
214
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
215
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
216
+ },
217
+ pointermoveThumbXEvent (evnt: PointerEvent) {
218
+ const $xeVm = this
219
+ const reactData = getVmReactData($xeVm)
220
+ const internalData = getVmInternalData($xeVm)
221
+
222
+ const { isThumbDrag, thumbDragOffset } = internalData
223
+ if (isThumbDrag) {
224
+ const viewEl = $xeVm.getScrollViewElem()
225
+ if (!viewEl) {
226
+ return
227
+ }
228
+ const { xThumbWidth } = reactData
229
+ const thumbEl = evnt.currentTarget as HTMLDivElement
230
+ const trackEl = thumbEl.parentElement as HTMLDivElement
231
+ const trackRect = trackEl.getBoundingClientRect()
232
+ // 更新偏移
233
+ viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
234
+ }
235
+ },
236
+ cleatPointerThumbEvent (evnt: PointerEvent) {
237
+ const $xeVm = this
238
+ const internalData = getVmInternalData($xeVm)
239
+
240
+ const thumbEl = evnt.currentTarget as HTMLDivElement
241
+ thumbEl.releasePointerCapture(evnt.pointerId)
242
+ internalData.isThumbDrag = false
243
+ },
244
+ pointerdownThumbYEvent (evnt: PointerEvent) {
245
+ const $xeVm = this
246
+ const reactData = getVmReactData($xeVm)
247
+ const internalData = getVmInternalData($xeVm)
248
+
249
+ const thumbEl = evnt.currentTarget as HTMLDivElement
250
+ internalData.isThumbDrag = true
251
+ thumbEl.setPointerCapture(evnt.pointerId)
252
+
253
+ const viewEl = $xeVm.getScrollViewElem()
254
+ if (!viewEl) {
255
+ return
256
+ }
257
+ const { yThumbHeight } = reactData
258
+ const trackEl = thumbEl.parentElement as HTMLDivElement
259
+ const trackRect = trackEl.getBoundingClientRect()
260
+ const pointerPosition = evnt.clientY - trackRect.top
261
+ // 记录 thumb 的偏移
262
+ const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
263
+ internalData.thumbDragOffset = pointerPosition - thumbOffset
264
+ },
265
+ pointermoveThumbYEvent (evnt: PointerEvent) {
266
+ const $xeVm = this
267
+ const reactData = getVmReactData($xeVm)
268
+ const internalData = getVmInternalData($xeVm)
269
+
270
+ const { isThumbDrag, thumbDragOffset } = internalData
271
+ if (isThumbDrag) {
272
+ const viewEl = $xeVm.getScrollViewElem()
273
+ if (!viewEl) {
274
+ return
275
+ }
276
+ const { yThumbHeight } = reactData
277
+ const thumbEl = evnt.currentTarget as HTMLDivElement
278
+ const trackEl = thumbEl.parentElement as HTMLDivElement
279
+ const trackRect = trackEl.getBoundingClientRect()
280
+ // 更新偏移
281
+ viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
282
+ }
55
283
  }
56
284
  }
57
285
  })
58
286
 
59
- export const globalMixins = {
287
+ export const globalMixins: VxeGlobalUseMixins = {
60
288
  sizeMixin,
289
+ permissionMixin,
61
290
  vScrollbarMixin,
62
- permissionMixin
291
+ initVScrollbarMixin
63
292
  }
@@ -41,7 +41,7 @@ export const popperUtils: VxePopperUtils = {
41
41
  const { defaultTop, defaultLeft, placement, defaultPlacement, appendTo, teleportTo, marginSize, isMinWidth } = Object.assign({
42
42
  appendTo: '',
43
43
  teleportTo: false,
44
- marginSize: 18,
44
+ marginSize: 12,
45
45
  isMinWidth: true
46
46
  }, options)
47
47
  let panelPlacement: 'top' | 'bottom' = 'bottom'
@@ -3,17 +3,109 @@ import { VxeComponentSizeType, VxeComponentIsVScrollbar, VxeComponentPermissionI
3
3
 
4
4
  /* eslint-disable @typescript-eslint/ban-types */
5
5
 
6
+ type ToComputed<T> = {
7
+ [K in keyof T]: T[K] extends (...args: infer A) => infer R
8
+ ? () => (...args: A) => R
9
+ : () => T[K]
10
+ }
11
+
12
+ export interface VxeUseSizeResult {
13
+ computeSize: VxeComponentSizeType
14
+ }
15
+ export type VxeUseSizeComputed = ToComputed<VxeUseSizeResult>
16
+
17
+ export interface VxeUsePermissionResult {
18
+ computePermissionInfo: VxeComponentPermissionInfo
19
+ }
20
+ export type VxeUsePermissionComputed = ToComputed<VxeUsePermissionResult>
21
+
22
+ export interface VxeUseVScrollbarResult {
23
+ computeIsVScrollbar: VxeComponentIsVScrollbar
24
+ }
25
+ export type VxeUseVScrollbarComputed = ToComputed<VxeUseVScrollbarResult>
26
+
27
+ export interface VxeUseInitVScrollbarReactData {
28
+ yThumbHeight: number
29
+ xThumbWidth: number
30
+ }
31
+
32
+ export interface VxeUseInitVScrollbarInternalData {
33
+ scrollObserver?: ResizeObserver
34
+ isThumbDrag?: boolean
35
+ thumbDragOffset: number
36
+ yThumbTop: number
37
+ xThumbLeft: number
38
+ lastScrollTop: number
39
+ lastScrollLeft: number
40
+ }
41
+
42
+ export interface VxeUseInitVScrollbarResult {
43
+ /**
44
+ * 内部方法
45
+ * @private
46
+ */
47
+ updateThumbSize(): void
48
+ /**
49
+ * 内部方法
50
+ * @private
51
+ */
52
+ updateThumbOffset(): void
53
+ /**
54
+ * 内部方法
55
+ * @private
56
+ */
57
+ clickTrackXEvent(evnt: MouseEvent): void
58
+ /**
59
+ * 内部方法
60
+ * @private
61
+ */
62
+ clickTrackYEvent(evnt: MouseEvent): void
63
+ /**
64
+ * 内部方法
65
+ * @private
66
+ */
67
+ pointerdownThumbXEvent(evnt: PointerEvent): void
68
+ /**
69
+ * 内部方法
70
+ * @private
71
+ */
72
+ pointermoveThumbXEvent(evnt: PointerEvent): void
73
+ /**
74
+ * 内部方法
75
+ * @private
76
+ */
77
+ cleatPointerThumbEvent(evnt: PointerEvent): void
78
+ /**
79
+ * 内部方法
80
+ * @private
81
+ */
82
+ pointerdownThumbYEvent(evnt: PointerEvent): void
83
+ /**
84
+ * 内部方法
85
+ * @private
86
+ */
87
+ pointermoveThumbYEvent(evnt: PointerEvent): void
88
+ }
89
+ export type VxeUseInitVScrollbarComputed = ToComputed<VxeUseInitVScrollbarResult>
90
+
6
91
  /**
7
92
  * 通用方法
8
93
  */
9
94
  export interface VxeGlobalUseMixins {
10
- sizeMixin: ExtendedVue<Vue, {}, {}, {
11
- computeSize: VxeComponentSizeType
12
- }, Record<string, any>>
13
- vScrollbarMixin: ExtendedVue<Vue, {}, {}, {
14
- computeIsVScrollbar: VxeComponentIsVScrollbar
15
- }, Record<string, any>>
16
- permissionMixin: ExtendedVue<Vue, {}, {}, {
17
- computePermissionInfo: VxeComponentPermissionInfo
18
- }, Record<string, any>>
95
+ /**
96
+ * 组件尺寸上下文
97
+ */
98
+ sizeMixin: ExtendedVue<Vue, {}, {}, VxeUseSizeResult, Record<string, any>>
99
+ /**
100
+ * 权限码处理
101
+ */
102
+ permissionMixin: ExtendedVue<Vue, {}, {}, VxeUsePermissionResult, Record<string, any>>
103
+ /**
104
+ * 虚拟滚动条是否启用
105
+ */
106
+ vScrollbarMixin: ExtendedVue<Vue, {}, {}, VxeUseVScrollbarResult, Record<string, any>>
107
+ /**
108
+ * 虚拟滚动条是否启用
109
+ */
110
+ initVScrollbarMixin: ExtendedVue<Vue, {}, VxeUseInitVScrollbarResult, {}, Record<string, any>>
19
111
  }