@vxe-ui/core 4.4.34 → 4.4.36
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/dist/all.esm.js +214 -14
- package/es/src/core.js +1 -1
- package/es/src/log.js +1 -1
- package/es/src/useFns.js +212 -11
- package/lib/index.umd.js +243 -12
- package/lib/index.umd.min.js +1 -1
- package/lib/src/core.js +1 -1
- package/lib/src/core.min.js +1 -1
- package/lib/src/log.js +1 -1
- package/lib/src/log.min.js +1 -1
- package/lib/src/useFns.js +242 -11
- package/lib/src/useFns.min.js +1 -1
- package/package.json +1 -1
- package/packages/src/useFns.ts +240 -16
- package/types/core/useFn.d.ts +105 -15
package/lib/src/useFns.js
CHANGED
|
@@ -3,16 +3,27 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.useFns = void 0;
|
|
6
|
+
exports.useInitVScrollbar = exports.useFns = void 0;
|
|
7
7
|
exports.usePermission = usePermission;
|
|
8
8
|
exports.useSize = useSize;
|
|
9
9
|
exports.useVScrollbar = useVScrollbar;
|
|
10
10
|
var _xeUtils = _interopRequireDefault(require("xe-utils"));
|
|
11
11
|
var _vue = require("vue");
|
|
12
12
|
var _permission = require("./permission");
|
|
13
|
+
var _scrollbarUtils = require("./scrollbar-utils");
|
|
13
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
const {
|
|
16
|
+
getThumbOffsetSize,
|
|
17
|
+
getThumbSize,
|
|
18
|
+
getScrollFromClick,
|
|
19
|
+
getScrollFromDrag
|
|
20
|
+
} = _scrollbarUtils.scrollbarUtils;
|
|
21
|
+
/**
|
|
22
|
+
* 组件尺寸上下文
|
|
23
|
+
* @param props
|
|
24
|
+
* @returns
|
|
25
|
+
*/
|
|
14
26
|
function useSize(props) {
|
|
15
|
-
// 组件尺寸上下文
|
|
16
27
|
const xeSizeInfo = (0, _vue.inject)('xeSizeInfo', null);
|
|
17
28
|
const computeSize = (0, _vue.computed)(() => {
|
|
18
29
|
const {
|
|
@@ -25,8 +36,25 @@ function useSize(props) {
|
|
|
25
36
|
computeSize
|
|
26
37
|
};
|
|
27
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 权限码处理
|
|
41
|
+
* @param props
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
function usePermission(props) {
|
|
45
|
+
const computePermissionInfo = (0, _vue.computed)(() => {
|
|
46
|
+
return (0, _permission.handleCheckInfo)(props.permissionCode, props.permissionMethod);
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
computePermissionInfo
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 虚拟滚动条是否启用
|
|
54
|
+
* @param props
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
28
57
|
function useVScrollbar(props) {
|
|
29
|
-
// 组件虚拟滚动条
|
|
30
58
|
const xeScrollbarInfo = (0, _vue.inject)('xeScrollbarInfo', null);
|
|
31
59
|
const computeIsVScrollbar = (0, _vue.computed)(() => {
|
|
32
60
|
const {
|
|
@@ -34,21 +62,224 @@ function useVScrollbar(props) {
|
|
|
34
62
|
} = props;
|
|
35
63
|
return _xeUtils.default.isBoolean(useScrollbar) ? useScrollbar : xeScrollbarInfo ? xeScrollbarInfo.value : null;
|
|
36
64
|
});
|
|
37
|
-
(0, _vue.provide)('
|
|
65
|
+
(0, _vue.provide)('xeScrollbarInfo', computeIsVScrollbar);
|
|
38
66
|
return {
|
|
39
67
|
computeIsVScrollbar
|
|
40
68
|
};
|
|
41
69
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
70
|
+
/**
|
|
71
|
+
* 初始化虚拟滚动条
|
|
72
|
+
* @param reactData
|
|
73
|
+
* @param internalData
|
|
74
|
+
* @param refViewElem
|
|
75
|
+
* @returns
|
|
76
|
+
*/
|
|
77
|
+
const useInitVScrollbar = $xeVM => {
|
|
78
|
+
const {
|
|
79
|
+
reactData,
|
|
80
|
+
internalData
|
|
81
|
+
} = $xeVM;
|
|
82
|
+
const refTrackXElem = (0, _vue.ref)();
|
|
83
|
+
const refTrackYElem = (0, _vue.ref)();
|
|
84
|
+
const refThumbXElem = (0, _vue.ref)();
|
|
85
|
+
const refThumbYElem = (0, _vue.ref)();
|
|
86
|
+
const updateThumbSize = () => {
|
|
87
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
88
|
+
if (!viewEl) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const trackXEl = refTrackXElem.value;
|
|
95
|
+
const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0;
|
|
96
|
+
const thumbXElem = refThumbXElem.value;
|
|
97
|
+
if (thumbXElem) {
|
|
98
|
+
thumbXElem.style.width = xThumbWidth + 'px';
|
|
99
|
+
}
|
|
100
|
+
reactData.xThumbWidth = xThumbWidth;
|
|
101
|
+
const trackYEl = refTrackYElem.value;
|
|
102
|
+
const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0;
|
|
103
|
+
const thumbYElem = refThumbYElem.value;
|
|
104
|
+
if (thumbYElem) {
|
|
105
|
+
thumbYElem.style.height = yThumbHeight + 'px';
|
|
106
|
+
}
|
|
107
|
+
reactData.yThumbHeight = yThumbHeight;
|
|
108
|
+
};
|
|
109
|
+
const updateThumbOffset = () => {
|
|
110
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
111
|
+
if (!viewEl) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const {
|
|
118
|
+
xThumbWidth,
|
|
119
|
+
yThumbHeight
|
|
120
|
+
} = reactData;
|
|
121
|
+
const trackXEl = refTrackXElem.value;
|
|
122
|
+
const thumbXElem = refThumbXElem.value;
|
|
123
|
+
const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0;
|
|
124
|
+
internalData.xThumbLeft = xThumbLeft;
|
|
125
|
+
if (thumbXElem && xThumbWidth) {
|
|
126
|
+
thumbXElem.style.width = xThumbWidth + 'px';
|
|
127
|
+
thumbXElem.style.transform = `translateX(${xThumbLeft}px)`;
|
|
128
|
+
}
|
|
129
|
+
const trackYEl = refTrackYElem.value;
|
|
130
|
+
const thumbYElem = refThumbYElem.value;
|
|
131
|
+
const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0;
|
|
132
|
+
internalData.yThumbTop = yThumbTop;
|
|
133
|
+
if (thumbYElem && yThumbHeight) {
|
|
134
|
+
thumbYElem.style.height = yThumbHeight + 'px';
|
|
135
|
+
thumbYElem.style.transform = `translateY(${yThumbTop}px)`;
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
const clickTrackXEvent = evnt => {
|
|
139
|
+
const trackEl = evnt.currentTarget;
|
|
140
|
+
if (trackEl !== evnt.target) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
144
|
+
if (!viewEl) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const {
|
|
148
|
+
xThumbWidth
|
|
149
|
+
} = reactData;
|
|
150
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
151
|
+
viewEl.scrollTo({
|
|
152
|
+
left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
|
|
153
|
+
behavior: 'auto'
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
const clickTrackYEvent = evnt => {
|
|
157
|
+
const trackEl = evnt.currentTarget;
|
|
158
|
+
if (trackEl !== evnt.target) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
162
|
+
if (!viewEl) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const {
|
|
166
|
+
yThumbHeight
|
|
167
|
+
} = reactData;
|
|
168
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
169
|
+
viewEl.scrollTo({
|
|
170
|
+
top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
|
|
171
|
+
behavior: 'auto'
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const pointerdownThumbXEvent = evnt => {
|
|
175
|
+
const thumbEl = evnt.currentTarget;
|
|
176
|
+
internalData.isThumbDrag = true;
|
|
177
|
+
thumbEl.setPointerCapture(evnt.pointerId);
|
|
178
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
179
|
+
if (!viewEl) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const {
|
|
183
|
+
xThumbWidth
|
|
184
|
+
} = reactData;
|
|
185
|
+
const trackEl = thumbEl.parentElement;
|
|
186
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
187
|
+
const pointerPosition = evnt.clientX - trackRect.left;
|
|
188
|
+
// 记录 thumb 的偏移
|
|
189
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
|
|
190
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset;
|
|
191
|
+
};
|
|
192
|
+
const pointermoveThumbXEvent = evnt => {
|
|
193
|
+
const thumbEl = evnt.currentTarget;
|
|
194
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const {
|
|
198
|
+
isThumbDrag,
|
|
199
|
+
thumbDragOffset
|
|
200
|
+
} = internalData;
|
|
201
|
+
if (isThumbDrag) {
|
|
202
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
203
|
+
if (!viewEl) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const {
|
|
207
|
+
xThumbWidth
|
|
208
|
+
} = reactData;
|
|
209
|
+
const thumbEl = evnt.currentTarget;
|
|
210
|
+
const trackEl = thumbEl.parentElement;
|
|
211
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
212
|
+
// 更新偏移
|
|
213
|
+
viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const cleatPointerThumbEvent = evnt => {
|
|
217
|
+
const thumbEl = evnt.currentTarget;
|
|
218
|
+
thumbEl.releasePointerCapture(evnt.pointerId);
|
|
219
|
+
internalData.isThumbDrag = false;
|
|
220
|
+
};
|
|
221
|
+
const pointerdownThumbYEvent = evnt => {
|
|
222
|
+
const thumbEl = evnt.currentTarget;
|
|
223
|
+
internalData.isThumbDrag = true;
|
|
224
|
+
thumbEl.setPointerCapture(evnt.pointerId);
|
|
225
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
226
|
+
if (!viewEl) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const {
|
|
230
|
+
yThumbHeight
|
|
231
|
+
} = reactData;
|
|
232
|
+
const trackEl = thumbEl.parentElement;
|
|
233
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
234
|
+
const pointerPosition = evnt.clientY - trackRect.top;
|
|
235
|
+
// 记录 thumb 的偏移
|
|
236
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
|
|
237
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset;
|
|
238
|
+
};
|
|
239
|
+
const pointermoveThumbYEvent = evnt => {
|
|
240
|
+
const thumbEl = evnt.currentTarget;
|
|
241
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const {
|
|
245
|
+
isThumbDrag,
|
|
246
|
+
thumbDragOffset
|
|
247
|
+
} = internalData;
|
|
248
|
+
if (isThumbDrag) {
|
|
249
|
+
const viewEl = $xeVM.getScrollViewElem();
|
|
250
|
+
if (!viewEl) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const {
|
|
254
|
+
yThumbHeight
|
|
255
|
+
} = reactData;
|
|
256
|
+
const thumbEl = evnt.currentTarget;
|
|
257
|
+
const trackEl = thumbEl.parentElement;
|
|
258
|
+
const trackRect = trackEl.getBoundingClientRect();
|
|
259
|
+
// 更新偏移
|
|
260
|
+
viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight);
|
|
261
|
+
}
|
|
262
|
+
};
|
|
46
263
|
return {
|
|
47
|
-
|
|
264
|
+
refTrackXElem,
|
|
265
|
+
refTrackYElem,
|
|
266
|
+
refThumbXElem,
|
|
267
|
+
refThumbYElem,
|
|
268
|
+
updateThumbSize,
|
|
269
|
+
updateThumbOffset,
|
|
270
|
+
clickTrackXEvent,
|
|
271
|
+
clickTrackYEvent,
|
|
272
|
+
pointerdownThumbXEvent,
|
|
273
|
+
pointermoveThumbXEvent,
|
|
274
|
+
cleatPointerThumbEvent,
|
|
275
|
+
pointerdownThumbYEvent,
|
|
276
|
+
pointermoveThumbYEvent
|
|
48
277
|
};
|
|
49
|
-
}
|
|
278
|
+
};
|
|
279
|
+
exports.useInitVScrollbar = useInitVScrollbar;
|
|
50
280
|
const useFns = exports.useFns = {
|
|
51
281
|
useSize,
|
|
52
282
|
useVScrollbar,
|
|
53
|
-
usePermission
|
|
283
|
+
usePermission,
|
|
284
|
+
useInitVScrollbar
|
|
54
285
|
};
|
package/lib/src/useFns.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0}),exports.useFns=void 0,exports.usePermission=usePermission,exports.useSize=useSize,exports.useVScrollbar=useVScrollbar;var _xeUtils=_interopRequireDefault(require("xe-utils")),_vue=require("vue"),_permission=require("./permission");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function useSize(
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0}),exports.useInitVScrollbar=exports.useFns=void 0,exports.usePermission=usePermission,exports.useSize=useSize,exports.useVScrollbar=useVScrollbar;var _xeUtils=_interopRequireDefault(require("xe-utils")),_vue=require("vue"),_permission=require("./permission"),_scrollbarUtils=require("./scrollbar-utils");function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let{getThumbOffsetSize,getThumbSize,getScrollFromClick,getScrollFromDrag}=_scrollbarUtils.scrollbarUtils;function useSize(t){let r=(0,_vue.inject)("xeSizeInfo",null);var e=(0,_vue.computed)(()=>{var e=t.size;return e||(r?r.value:null)});return(0,_vue.provide)("xeSizeInfo",e),{computeSize:e}}function usePermission(e){return{computePermissionInfo:(0,_vue.computed)(()=>(0,_permission.handleCheckInfo)(e.permissionCode,e.permissionMethod))}}function useVScrollbar(t){let r=(0,_vue.inject)("xeScrollbarInfo",null);var e=(0,_vue.computed)(()=>{var e=t.useScrollbar;return _xeUtils.default.isBoolean(e)?e:r?r.value:null});return(0,_vue.provide)("xeScrollbarInfo",e),{computeIsVScrollbar:e}}let useInitVScrollbar=o=>{let{reactData:s,internalData:c}=o,u=(0,_vue.ref)(),n=(0,_vue.ref)(),a=(0,_vue.ref)(),h=(0,_vue.ref)();return{refTrackXElem:u,refTrackYElem:n,refThumbXElem:a,refThumbYElem:h,updateThumbSize:()=>{var e,t,r=o.getScrollViewElem();r&&r.clientHeight&&(t=(t=u.value)?getThumbSize(r.clientWidth,r.scrollWidth,t.clientWidth):0,(e=a.value)&&(e.style.width=t+"px"),s.xThumbWidth=t,t=(e=n.value)?getThumbSize(r.clientHeight,r.scrollHeight,e.clientHeight):0,(r=h.value)&&(r.style.height=t+"px"),s.yThumbHeight=t)},updateThumbOffset:()=>{var e,t,r,l,i=o.getScrollViewElem();i&&i.clientHeight&&({xThumbWidth:t,yThumbHeight:e}=s,l=u.value,r=a.value,l=l&&t?getThumbOffsetSize(i.scrollLeft,i.clientWidth,i.scrollWidth,l.clientWidth,t):0,c.xThumbLeft=l,r&&t&&(r.style.width=t+"px",r.style.transform=`translateX(${l}px)`),t=n.value,r=h.value,l=t&&e?getThumbOffsetSize(i.scrollTop,i.clientHeight,i.scrollHeight,t.clientHeight,e):0,c.yThumbTop=l,r)&&e&&(r.style.height=e+"px",r.style.transform=`translateY(${l}px)`)},clickTrackXEvent:e=>{var t,r,l,i=e.currentTarget;i===e.target&&(t=o.getScrollViewElem())&&(r=s.xThumbWidth,l=i.getBoundingClientRect(),t.scrollTo({left:getScrollFromClick(e.clientX-l.left,t.clientWidth,t.scrollWidth,i.clientWidth,r),behavior:"auto"}))},clickTrackYEvent:e=>{var t,r,l,i=e.currentTarget;i===e.target&&(t=o.getScrollViewElem())&&(r=s.yThumbHeight,l=i.getBoundingClientRect(),t.scrollTo({top:getScrollFromClick(e.clientY-l.top,t.clientHeight,t.scrollHeight,i.clientHeight,r),behavior:"auto"}))},pointerdownThumbXEvent:e=>{var t,r,l=e.currentTarget,i=(c.isThumbDrag=!0,l.setPointerCapture(e.pointerId),o.getScrollViewElem());i&&(t=s.xThumbWidth,r=(l=l.parentElement).getBoundingClientRect(),e=e.clientX-r.left,r=getThumbOffsetSize(i.scrollLeft,i.clientWidth,i.scrollWidth,l.clientWidth,t),c.thumbDragOffset=e-r)},pointermoveThumbXEvent:t=>{let e=t.currentTarget;if(e.hasPointerCapture(t.pointerId)){var{isThumbDrag:r,thumbDragOffset:l}=c;if(r){r=o.getScrollViewElem();if(r){var i=s.xThumbWidth;let e=t.currentTarget;var u=e.parentElement,n=u.getBoundingClientRect();r.scrollLeft=getScrollFromDrag(t.clientX-n.left,l,r.clientWidth,r.scrollWidth,u.clientWidth,i)}}}},cleatPointerThumbEvent:e=>{e.currentTarget.releasePointerCapture(e.pointerId),c.isThumbDrag=!1},pointerdownThumbYEvent:e=>{var t,r,l=e.currentTarget,i=(c.isThumbDrag=!0,l.setPointerCapture(e.pointerId),o.getScrollViewElem());i&&(t=s.yThumbHeight,r=(l=l.parentElement).getBoundingClientRect(),e=e.clientY-r.top,r=getThumbOffsetSize(i.scrollTop,i.clientHeight,i.scrollHeight,l.clientHeight,t),c.thumbDragOffset=e-r)},pointermoveThumbYEvent:t=>{let e=t.currentTarget;if(e.hasPointerCapture(t.pointerId)){var{isThumbDrag:r,thumbDragOffset:l}=c;if(r){r=o.getScrollViewElem();if(r){var i=s.yThumbHeight;let e=t.currentTarget;var u=e.parentElement,n=u.getBoundingClientRect();r.scrollTop=getScrollFromDrag(t.clientY-n.top,l,r.clientHeight,r.scrollHeight,u.clientHeight,i)}}}}}},useFns=(exports.useInitVScrollbar=useInitVScrollbar,exports.useFns={useSize:useSize,useVScrollbar:useVScrollbar,usePermission:usePermission,useInitVScrollbar:useInitVScrollbar});
|
package/package.json
CHANGED
package/packages/src/useFns.ts
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import XEUtils from 'xe-utils'
|
|
2
|
-
import { computed, inject, provide, ComputedRef } from 'vue'
|
|
2
|
+
import { computed, ref, Ref, inject, provide, ComputedRef } from 'vue'
|
|
3
3
|
import { handleCheckInfo } from './permission'
|
|
4
|
+
import { scrollbarUtils } from './scrollbar-utils'
|
|
4
5
|
|
|
5
|
-
import type { VxeComponentSizeType, VxeComponentIsVScrollbar, VxeComponentPermissionCodeType, VxeComponentPermissionMethod } from '../../types'
|
|
6
|
+
import type { VxeComponentSizeType, VxeComponentIsVScrollbar, VxeUseInitVScrollbar, VxeComponentPermissionCodeType, VxeComponentPermissionMethod, VxeUseInitVScrollbarResult, VxeUseSizeResult, VxeUsePermissionResult, VxeUseVScrollbarResult } from '../../types'
|
|
6
7
|
|
|
8
|
+
const { getThumbOffsetSize, getThumbSize, getScrollFromClick, getScrollFromDrag } = scrollbarUtils
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 组件尺寸上下文
|
|
12
|
+
* @param props
|
|
13
|
+
* @returns
|
|
14
|
+
*/
|
|
7
15
|
export function useSize (props: {
|
|
8
16
|
size?: VxeComponentSizeType
|
|
9
|
-
}) {
|
|
10
|
-
// 组件尺寸上下文
|
|
17
|
+
}): VxeUseSizeResult {
|
|
11
18
|
const xeSizeInfo = inject('xeSizeInfo', null as ComputedRef<VxeComponentSizeType> | null)
|
|
12
19
|
const computeSize = computed(() => {
|
|
13
20
|
const { size } = props
|
|
@@ -18,34 +25,251 @@ export function useSize (props: {
|
|
|
18
25
|
return { computeSize }
|
|
19
26
|
}
|
|
20
27
|
|
|
28
|
+
/**
|
|
29
|
+
* 权限码处理
|
|
30
|
+
* @param props
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
export function usePermission (props: {
|
|
34
|
+
permissionCode?: VxeComponentPermissionCodeType
|
|
35
|
+
permissionMethod?: VxeComponentPermissionMethod
|
|
36
|
+
}): VxeUsePermissionResult {
|
|
37
|
+
const computePermissionInfo = computed(() => {
|
|
38
|
+
return handleCheckInfo(props.permissionCode, props.permissionMethod)
|
|
39
|
+
})
|
|
40
|
+
return {
|
|
41
|
+
computePermissionInfo
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 虚拟滚动条是否启用
|
|
47
|
+
* @param props
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
21
50
|
export function useVScrollbar (props: {
|
|
22
51
|
useScrollbar?: VxeComponentIsVScrollbar
|
|
23
|
-
}) {
|
|
24
|
-
// 组件虚拟滚动条
|
|
52
|
+
}): VxeUseVScrollbarResult {
|
|
25
53
|
const xeScrollbarInfo = inject('xeScrollbarInfo', null as ComputedRef<VxeComponentIsVScrollbar> | null)
|
|
26
54
|
const computeIsVScrollbar = computed(() => {
|
|
27
55
|
const { useScrollbar } = props
|
|
28
56
|
return XEUtils.isBoolean(useScrollbar) ? useScrollbar : (xeScrollbarInfo ? xeScrollbarInfo.value : null)
|
|
29
57
|
})
|
|
30
|
-
provide('
|
|
58
|
+
provide('xeScrollbarInfo', computeIsVScrollbar)
|
|
31
59
|
|
|
32
60
|
return { computeIsVScrollbar }
|
|
33
61
|
}
|
|
34
62
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
63
|
+
/**
|
|
64
|
+
* 初始化虚拟滚动条
|
|
65
|
+
* @param reactData
|
|
66
|
+
* @param internalData
|
|
67
|
+
* @param refViewElem
|
|
68
|
+
* @returns
|
|
69
|
+
*/
|
|
70
|
+
export const useInitVScrollbar: VxeUseInitVScrollbar = ($xeVM): VxeUseInitVScrollbarResult & {
|
|
71
|
+
refTrackXElem: Ref<HTMLDivElement | undefined>
|
|
72
|
+
refTrackYElem: Ref<HTMLDivElement | undefined>
|
|
73
|
+
refThumbXElem: Ref<HTMLDivElement | undefined>
|
|
74
|
+
refThumbYElem: Ref<HTMLDivElement | undefined>
|
|
75
|
+
} => {
|
|
76
|
+
const { reactData, internalData } = $xeVM
|
|
77
|
+
|
|
78
|
+
const refTrackXElem = ref<HTMLDivElement>()
|
|
79
|
+
const refTrackYElem = ref<HTMLDivElement>()
|
|
80
|
+
const refThumbXElem = ref<HTMLDivElement>()
|
|
81
|
+
const refThumbYElem = ref<HTMLDivElement>()
|
|
82
|
+
|
|
83
|
+
const updateThumbSize = () => {
|
|
84
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
85
|
+
if (!viewEl) {
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
89
|
+
return
|
|
90
|
+
}
|
|
91
|
+
const trackXEl = refTrackXElem.value
|
|
92
|
+
const xThumbWidth = trackXEl ? getThumbSize(viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth) : 0
|
|
93
|
+
const thumbXElem = refThumbXElem.value
|
|
94
|
+
if (thumbXElem) {
|
|
95
|
+
thumbXElem.style.width = xThumbWidth + 'px'
|
|
96
|
+
}
|
|
97
|
+
reactData.xThumbWidth = xThumbWidth
|
|
98
|
+
|
|
99
|
+
const trackYEl = refTrackYElem.value
|
|
100
|
+
|
|
101
|
+
const yThumbHeight = trackYEl ? getThumbSize(viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight) : 0
|
|
102
|
+
const thumbYElem = refThumbYElem.value
|
|
103
|
+
if (thumbYElem) {
|
|
104
|
+
thumbYElem.style.height = yThumbHeight + 'px'
|
|
105
|
+
}
|
|
106
|
+
reactData.yThumbHeight = yThumbHeight
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const updateThumbOffset = () => {
|
|
110
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
111
|
+
if (!viewEl) {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
if (!viewEl.clientHeight || !viewEl.clientHeight) {
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
const { xThumbWidth, yThumbHeight } = reactData
|
|
118
|
+
const trackXEl = refTrackXElem.value
|
|
119
|
+
const thumbXElem = refThumbXElem.value
|
|
120
|
+
const xThumbLeft = trackXEl && xThumbWidth ? getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackXEl.clientWidth, xThumbWidth) : 0
|
|
121
|
+
internalData.xThumbLeft = xThumbLeft
|
|
122
|
+
if (thumbXElem && xThumbWidth) {
|
|
123
|
+
thumbXElem.style.width = xThumbWidth + 'px'
|
|
124
|
+
thumbXElem.style.transform = `translateX(${xThumbLeft}px)`
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const trackYEl = refTrackYElem.value
|
|
128
|
+
const thumbYElem = refThumbYElem.value
|
|
129
|
+
const yThumbTop = trackYEl && yThumbHeight ? getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackYEl.clientHeight, yThumbHeight) : 0
|
|
130
|
+
internalData.yThumbTop = yThumbTop
|
|
131
|
+
if (thumbYElem && yThumbHeight) {
|
|
132
|
+
thumbYElem.style.height = yThumbHeight + 'px'
|
|
133
|
+
thumbYElem.style.transform = `translateY(${yThumbTop}px)`
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const clickTrackXEvent = (evnt: MouseEvent) => {
|
|
138
|
+
const trackEl = evnt.currentTarget as HTMLDivElement
|
|
139
|
+
if (trackEl !== evnt.target) {
|
|
140
|
+
return
|
|
141
|
+
}
|
|
142
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
143
|
+
if (!viewEl) {
|
|
144
|
+
return
|
|
145
|
+
}
|
|
146
|
+
const { xThumbWidth } = reactData
|
|
147
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
148
|
+
viewEl.scrollTo({
|
|
149
|
+
left: getScrollFromClick(evnt.clientX - trackRect.left, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth),
|
|
150
|
+
behavior: 'auto'
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const clickTrackYEvent = (evnt: MouseEvent) => {
|
|
155
|
+
const trackEl = evnt.currentTarget as HTMLDivElement
|
|
156
|
+
if (trackEl !== evnt.target) {
|
|
157
|
+
return
|
|
158
|
+
}
|
|
159
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
160
|
+
if (!viewEl) {
|
|
161
|
+
return
|
|
162
|
+
}
|
|
163
|
+
const { yThumbHeight } = reactData
|
|
164
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
165
|
+
viewEl.scrollTo({
|
|
166
|
+
top: getScrollFromClick(evnt.clientY - trackRect.top, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight),
|
|
167
|
+
behavior: 'auto'
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const pointerdownThumbXEvent = (evnt: PointerEvent) => {
|
|
172
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
173
|
+
internalData.isThumbDrag = true
|
|
174
|
+
thumbEl.setPointerCapture(evnt.pointerId)
|
|
175
|
+
|
|
176
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
177
|
+
if (!viewEl) {
|
|
178
|
+
return
|
|
179
|
+
}
|
|
180
|
+
const { xThumbWidth } = reactData
|
|
181
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
182
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
183
|
+
const pointerPosition = evnt.clientX - trackRect.left
|
|
184
|
+
// 记录 thumb 的偏移
|
|
185
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollLeft, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
|
|
186
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
const pointermoveThumbXEvent = (evnt: PointerEvent) => {
|
|
190
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
191
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
192
|
+
return
|
|
193
|
+
}
|
|
194
|
+
const { isThumbDrag, thumbDragOffset } = internalData
|
|
195
|
+
if (isThumbDrag) {
|
|
196
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
197
|
+
if (!viewEl) {
|
|
198
|
+
return
|
|
199
|
+
}
|
|
200
|
+
const { xThumbWidth } = reactData
|
|
201
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
202
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
203
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
204
|
+
// 更新偏移
|
|
205
|
+
viewEl.scrollLeft = getScrollFromDrag(evnt.clientX - trackRect.left, thumbDragOffset, viewEl.clientWidth, viewEl.scrollWidth, trackEl.clientWidth, xThumbWidth)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const cleatPointerThumbEvent = (evnt: PointerEvent) => {
|
|
210
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
211
|
+
thumbEl.releasePointerCapture(evnt.pointerId)
|
|
212
|
+
internalData.isThumbDrag = false
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const pointerdownThumbYEvent = (evnt: PointerEvent) => {
|
|
216
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
217
|
+
internalData.isThumbDrag = true
|
|
218
|
+
thumbEl.setPointerCapture(evnt.pointerId)
|
|
219
|
+
|
|
220
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
221
|
+
if (!viewEl) {
|
|
222
|
+
return
|
|
223
|
+
}
|
|
224
|
+
const { yThumbHeight } = reactData
|
|
225
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
226
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
227
|
+
const pointerPosition = evnt.clientY - trackRect.top
|
|
228
|
+
// 记录 thumb 的偏移
|
|
229
|
+
const thumbOffset = getThumbOffsetSize(viewEl.scrollTop, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
|
|
230
|
+
internalData.thumbDragOffset = pointerPosition - thumbOffset
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
const pointermoveThumbYEvent = (evnt: PointerEvent) => {
|
|
234
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
235
|
+
if (!thumbEl.hasPointerCapture(evnt.pointerId)) {
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
const { isThumbDrag, thumbDragOffset } = internalData
|
|
239
|
+
if (isThumbDrag) {
|
|
240
|
+
const viewEl = $xeVM.getScrollViewElem()
|
|
241
|
+
if (!viewEl) {
|
|
242
|
+
return
|
|
243
|
+
}
|
|
244
|
+
const { yThumbHeight } = reactData
|
|
245
|
+
const thumbEl = evnt.currentTarget as HTMLDivElement
|
|
246
|
+
const trackEl = thumbEl.parentElement as HTMLDivElement
|
|
247
|
+
const trackRect = trackEl.getBoundingClientRect()
|
|
248
|
+
// 更新偏移
|
|
249
|
+
viewEl.scrollTop = getScrollFromDrag(evnt.clientY - trackRect.top, thumbDragOffset, viewEl.clientHeight, viewEl.scrollHeight, trackEl.clientHeight, yThumbHeight)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
42
253
|
return {
|
|
43
|
-
|
|
254
|
+
refTrackXElem,
|
|
255
|
+
refTrackYElem,
|
|
256
|
+
refThumbXElem,
|
|
257
|
+
refThumbYElem,
|
|
258
|
+
updateThumbSize,
|
|
259
|
+
updateThumbOffset,
|
|
260
|
+
clickTrackXEvent,
|
|
261
|
+
clickTrackYEvent,
|
|
262
|
+
pointerdownThumbXEvent,
|
|
263
|
+
pointermoveThumbXEvent,
|
|
264
|
+
cleatPointerThumbEvent,
|
|
265
|
+
pointerdownThumbYEvent,
|
|
266
|
+
pointermoveThumbYEvent
|
|
44
267
|
}
|
|
45
268
|
}
|
|
46
269
|
|
|
47
270
|
export const useFns = {
|
|
48
271
|
useSize,
|
|
49
272
|
useVScrollbar,
|
|
50
|
-
usePermission
|
|
273
|
+
usePermission,
|
|
274
|
+
useInitVScrollbar
|
|
51
275
|
}
|