stk-table-vue 1.2.4 → 1.2.6
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/README.md +194 -194
- package/lib/{Dropdown-D_9cB0rD.js → Dropdown-BAANgg_5.js} +2 -2
- package/lib/{StkTable-CVcmlZi9.js → StkTable-CGcxwpdb.js} +22 -6
- package/lib/src/StkTable/StkTable.vue.d.ts +18 -4
- package/lib/src/StkTable/types/index.d.ts +4 -1
- package/lib/src/StkTable/useVirtualScroll.d.ts +6 -1
- package/lib/stk-table-vue.js +3 -3
- package/lib/style.css +1 -1
- package/package.json +93 -93
- package/src/StkTable/StkTable.vue +2362 -2338
- package/src/StkTable/components/DragHandle.vue +9 -9
- package/src/StkTable/components/SortIcon.vue +6 -6
- package/src/StkTable/components/TreeNodeCell.vue +19 -19
- package/src/StkTable/components/TriangleIcon.vue +3 -3
- package/src/StkTable/const.ts +50 -50
- package/src/StkTable/custom-cells/ChangeCell/ChangeCell.less +34 -34
- package/src/StkTable/custom-cells/ChangeCell/createChangeCell.ts +90 -90
- package/src/StkTable/custom-cells/ChangeCell/index.ts +4 -4
- package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.less +14 -14
- package/src/StkTable/custom-cells/CheckboxCell/CheckboxCell.vue +56 -56
- package/src/StkTable/custom-cells/CheckboxCell/createCheckboxCell.ts +146 -146
- package/src/StkTable/custom-cells/CheckboxCell/index.ts +5 -5
- package/src/StkTable/custom-cells/FilterCell/Dropdown/index.ts +16 -16
- package/src/StkTable/custom-cells/FilterCell/Dropdown/index.vue +186 -186
- package/src/StkTable/custom-cells/FilterCell/Filter.less +118 -118
- package/src/StkTable/custom-cells/FilterCell/Filter.vue +66 -66
- package/src/StkTable/custom-cells/FilterCell/createFilterCell.ts +120 -120
- package/src/StkTable/custom-cells/FilterCell/index.ts +6 -6
- package/src/StkTable/custom-cells/FilterCell/types.ts +43 -43
- package/src/StkTable/custom-cells/NumberCell/createNumberCell.ts +43 -43
- package/src/StkTable/custom-cells/NumberCell/index.ts +2 -2
- package/src/StkTable/custom-cells/utils/formatNumber.ts +137 -137
- package/src/StkTable/features/const.ts +1 -1
- package/src/StkTable/features/index.ts +1 -1
- package/src/StkTable/features/useAreaSelection.ts +1240 -1239
- package/src/StkTable/index.ts +20 -20
- package/src/StkTable/mergeCellsCache.ts +69 -69
- package/src/StkTable/registerFeature.ts +40 -40
- package/src/StkTable/style.less +791 -791
- package/src/StkTable/types/highlightDimOptions.ts +28 -28
- package/src/StkTable/types/index.ts +503 -500
- package/src/StkTable/useAutoResize.ts +87 -87
- package/src/StkTable/useColResize.ts +202 -202
- package/src/StkTable/useFixedCol.ts +168 -168
- package/src/StkTable/useFixedStyle.ts +75 -75
- package/src/StkTable/useGetFixedColPosition.ts +63 -63
- package/src/StkTable/useHighlight.ts +270 -270
- package/src/StkTable/useIndexResolver.ts +29 -29
- package/src/StkTable/useKeyboardArrowScroll.ts +114 -114
- package/src/StkTable/useMaxRowSpan.ts +60 -60
- package/src/StkTable/useMergeCells.ts +541 -541
- package/src/StkTable/useRowExpand.ts +81 -81
- package/src/StkTable/useScrollRowByRow.ts +96 -96
- package/src/StkTable/useScrollbar.ts +177 -177
- package/src/StkTable/useSorter.ts +267 -267
- package/src/StkTable/useTableColumns.ts +142 -142
- package/src/StkTable/useThDrag.ts +94 -94
- package/src/StkTable/useTrDrag.ts +100 -100
- package/src/StkTable/useTree.ts +253 -253
- package/src/StkTable/useVirtualScroll.ts +1032 -1025
- package/src/StkTable/useWheeling.ts +23 -23
- package/src/StkTable/utils/constRefUtils.ts +29 -29
- package/src/StkTable/utils/index.ts +331 -331
- package/src/StkTable/utils/rowHeightFenwickTree.ts +74 -74
- package/src/StkTable/utils/useTriggerRef.ts +33 -33
- package/src/VirtualTree.vue +622 -622
- package/src/VirtualTreeSelect.vue +367 -367
- package/src/vite-env.d.ts +10 -10
|
@@ -1,177 +1,177 @@
|
|
|
1
|
-
import { nextTick, onMounted, onBeforeUnmount, ref, Ref } from 'vue';
|
|
2
|
-
import type { VirtualScrollStore, VirtualScrollXStore } from './useVirtualScroll';
|
|
3
|
-
import { rafThrottle, throttle } from './utils/index';
|
|
4
|
-
|
|
5
|
-
/** Detect if the primary pointer is a touch device (mobile/tablet). */
|
|
6
|
-
function isTouchPrimaryDevice(): boolean {
|
|
7
|
-
if (typeof window === 'undefined') return false;
|
|
8
|
-
return window.matchMedia('(hover: none) and (pointer: coarse)').matches;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type ScrollbarOptions = {
|
|
12
|
-
enabled?: boolean;
|
|
13
|
-
/** scroll-y width */
|
|
14
|
-
width?: number;
|
|
15
|
-
/** scroll-x height */
|
|
16
|
-
height?: number;
|
|
17
|
-
/** min scroll-y width */
|
|
18
|
-
minWidth?: number;
|
|
19
|
-
/** min scroll-x height */
|
|
20
|
-
minHeight?: number;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* 自定义滚动条hooks
|
|
25
|
-
* @param containerRef 滚动容器的ref
|
|
26
|
-
* @param options 滚动条配置选项
|
|
27
|
-
* @returns 滚动条相关状态和方法
|
|
28
|
-
*/
|
|
29
|
-
export function useScrollbar(
|
|
30
|
-
props: any,
|
|
31
|
-
containerRef: Ref<HTMLDivElement | undefined>,
|
|
32
|
-
virtualScroll: Ref<VirtualScrollStore>,
|
|
33
|
-
virtualScrollX: Ref<VirtualScrollXStore>,
|
|
34
|
-
updateVirtualScrollY: (sTop?: number) => void,
|
|
35
|
-
scrollbarOptions: Ref<Required<ScrollbarOptions>>,
|
|
36
|
-
isExperimentalScrollY: Ref<boolean | undefined>,
|
|
37
|
-
) {
|
|
38
|
-
const showScrollbar = ref({ x: false, y: false });
|
|
39
|
-
const scrollbar = ref({ h: 0, w: 0, t: 0, l: 0 });
|
|
40
|
-
|
|
41
|
-
let isDraggingVertical = false;
|
|
42
|
-
let isDraggingHorizontal = false;
|
|
43
|
-
let dragStartY = 0;
|
|
44
|
-
let dragStartX = 0;
|
|
45
|
-
let dragStartTop = 0;
|
|
46
|
-
let dragStartLeft = 0;
|
|
47
|
-
|
|
48
|
-
let resizeObserver: ResizeObserver | null = null;
|
|
49
|
-
let currentDragHandler: ((e: MouseEvent | TouchEvent) => void) | undefined;
|
|
50
|
-
let isMobileDevice = false;
|
|
51
|
-
|
|
52
|
-
const throttledUpdateScrollbar = throttle(() => updateCustomScrollbar(), 200);
|
|
53
|
-
// Use requestAnimationFrame for smoother scrollbar dragging performance
|
|
54
|
-
const rafUpdateVirtualScrollY = rafThrottle((scrollTop: number) => updateVirtualScrollY(scrollTop));
|
|
55
|
-
|
|
56
|
-
onMounted(() => {
|
|
57
|
-
isMobileDevice = isTouchPrimaryDevice();
|
|
58
|
-
if (scrollbarOptions.value.enabled && !isMobileDevice) {
|
|
59
|
-
resizeObserver = new ResizeObserver(throttledUpdateScrollbar);
|
|
60
|
-
resizeObserver.observe(containerRef.value!);
|
|
61
|
-
}
|
|
62
|
-
initScrollbar();
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
onBeforeUnmount(() => {
|
|
66
|
-
// en: Clean up all event listeners to prevent memory leaks
|
|
67
|
-
onDragEnd();
|
|
68
|
-
resizeObserver?.disconnect();
|
|
69
|
-
resizeObserver = null;
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
function updateCustomScrollbar() {
|
|
73
|
-
if (!scrollbarOptions.value.enabled || isMobileDevice) return;
|
|
74
|
-
const { scrollHeight, scrollTop, containerHeight } = virtualScroll.value;
|
|
75
|
-
const { scrollWidth, scrollLeft, containerWidth } = virtualScrollX.value;
|
|
76
|
-
|
|
77
|
-
const needVertical = scrollHeight > containerHeight;
|
|
78
|
-
const needHorizontal = scrollWidth > containerWidth;
|
|
79
|
-
showScrollbar.value = { x: needHorizontal, y: needVertical };
|
|
80
|
-
|
|
81
|
-
if (needVertical) {
|
|
82
|
-
const ratio = containerHeight / scrollHeight;
|
|
83
|
-
scrollbar.value.h = Math.max(scrollbarOptions.value.minHeight, ratio * containerHeight);
|
|
84
|
-
scrollbar.value.t = Math.round((scrollTop / (scrollHeight - containerHeight)) * (containerHeight - scrollbar.value.h));
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (needHorizontal) {
|
|
88
|
-
const ratio = containerWidth / scrollWidth;
|
|
89
|
-
scrollbar.value.w = Math.max(scrollbarOptions.value.minWidth, ratio * containerWidth);
|
|
90
|
-
scrollbar.value.l = Math.round((scrollLeft / (scrollWidth - containerWidth)) * (containerWidth - scrollbar.value.w));
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function onVerticalScrollbarMouseDown(e: MouseEvent | TouchEvent) {
|
|
95
|
-
if (e instanceof MouseEvent) e.preventDefault();
|
|
96
|
-
isDraggingVertical = true;
|
|
97
|
-
const { scrollTop } = virtualScroll.value;
|
|
98
|
-
dragStartTop = scrollTop;
|
|
99
|
-
dragStartY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;
|
|
100
|
-
addDragListeners(onVerticalDrag);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function onHorizontalScrollbarMouseDown(e: MouseEvent | TouchEvent) {
|
|
104
|
-
if (e instanceof MouseEvent) e.preventDefault();
|
|
105
|
-
isDraggingHorizontal = true;
|
|
106
|
-
const { scrollLeft } = virtualScrollX.value;
|
|
107
|
-
dragStartLeft = scrollLeft;
|
|
108
|
-
dragStartX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;
|
|
109
|
-
addDragListeners(onHorizontalDrag);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function addDragListeners(dragHandler: (e: MouseEvent | TouchEvent) => void) {
|
|
113
|
-
removeCurrentDragHandlerListeners();
|
|
114
|
-
currentDragHandler = dragHandler;
|
|
115
|
-
document.addEventListener('mousemove', dragHandler);
|
|
116
|
-
document.addEventListener('mouseup', onDragEnd);
|
|
117
|
-
document.addEventListener('touchmove', dragHandler, { passive: false });
|
|
118
|
-
document.addEventListener('touchend', onDragEnd);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function onVerticalDrag(e: MouseEvent | TouchEvent) {
|
|
122
|
-
if (!isDraggingVertical) return;
|
|
123
|
-
e.preventDefault();
|
|
124
|
-
const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;
|
|
125
|
-
const deltaY = clientY - dragStartY;
|
|
126
|
-
const { scrollHeight, containerHeight } = virtualScroll.value;
|
|
127
|
-
const scrollRange = scrollHeight - containerHeight;
|
|
128
|
-
const trackRange = containerHeight - scrollbar.value.h;
|
|
129
|
-
const scrollDelta = (deltaY / trackRange) * scrollRange;
|
|
130
|
-
|
|
131
|
-
if (isExperimentalScrollY.value) {
|
|
132
|
-
const ratio = containerHeight / scrollHeight;
|
|
133
|
-
const top = Math.round((dragStartTop + scrollDelta) * ratio);
|
|
134
|
-
const maxTop = containerHeight - scrollbar.value.h;
|
|
135
|
-
scrollbar.value.t = top < 0 ? 0 : top > maxTop ? maxTop : top;
|
|
136
|
-
rafUpdateVirtualScrollY(dragStartTop + scrollDelta);
|
|
137
|
-
} else {
|
|
138
|
-
containerRef.value!.scrollTop = dragStartTop + scrollDelta;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function onHorizontalDrag(e: MouseEvent | TouchEvent) {
|
|
143
|
-
if (!isDraggingHorizontal) return;
|
|
144
|
-
e.preventDefault();
|
|
145
|
-
|
|
146
|
-
const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;
|
|
147
|
-
const deltaX = clientX - dragStartX;
|
|
148
|
-
const { scrollWidth, containerWidth } = virtualScrollX.value;
|
|
149
|
-
|
|
150
|
-
const scrollRange = scrollWidth - containerWidth;
|
|
151
|
-
const trackRange = containerWidth - scrollbar.value.w;
|
|
152
|
-
const scrollDelta = (deltaX / trackRange) * scrollRange;
|
|
153
|
-
containerRef.value!.scrollLeft = dragStartLeft + scrollDelta;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function onDragEnd() {
|
|
157
|
-
isDraggingVertical = false;
|
|
158
|
-
isDraggingHorizontal = false;
|
|
159
|
-
removeCurrentDragHandlerListeners();
|
|
160
|
-
document.removeEventListener('mouseup', onDragEnd);
|
|
161
|
-
document.removeEventListener('touchend', onDragEnd);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function removeCurrentDragHandlerListeners() {
|
|
165
|
-
if (currentDragHandler) {
|
|
166
|
-
document.removeEventListener('mousemove', currentDragHandler);
|
|
167
|
-
document.removeEventListener('touchmove', currentDragHandler);
|
|
168
|
-
currentDragHandler = void 0;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function initScrollbar() {
|
|
173
|
-
nextTick(updateCustomScrollbar);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
return [scrollbar, showScrollbar, onVerticalScrollbarMouseDown, onHorizontalScrollbarMouseDown, updateCustomScrollbar] as const;
|
|
177
|
-
}
|
|
1
|
+
import { nextTick, onMounted, onBeforeUnmount, ref, Ref } from 'vue';
|
|
2
|
+
import type { VirtualScrollStore, VirtualScrollXStore } from './useVirtualScroll';
|
|
3
|
+
import { rafThrottle, throttle } from './utils/index';
|
|
4
|
+
|
|
5
|
+
/** Detect if the primary pointer is a touch device (mobile/tablet). */
|
|
6
|
+
function isTouchPrimaryDevice(): boolean {
|
|
7
|
+
if (typeof window === 'undefined') return false;
|
|
8
|
+
return window.matchMedia('(hover: none) and (pointer: coarse)').matches;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type ScrollbarOptions = {
|
|
12
|
+
enabled?: boolean;
|
|
13
|
+
/** scroll-y width */
|
|
14
|
+
width?: number;
|
|
15
|
+
/** scroll-x height */
|
|
16
|
+
height?: number;
|
|
17
|
+
/** min scroll-y width */
|
|
18
|
+
minWidth?: number;
|
|
19
|
+
/** min scroll-x height */
|
|
20
|
+
minHeight?: number;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 自定义滚动条hooks
|
|
25
|
+
* @param containerRef 滚动容器的ref
|
|
26
|
+
* @param options 滚动条配置选项
|
|
27
|
+
* @returns 滚动条相关状态和方法
|
|
28
|
+
*/
|
|
29
|
+
export function useScrollbar(
|
|
30
|
+
props: any,
|
|
31
|
+
containerRef: Ref<HTMLDivElement | undefined>,
|
|
32
|
+
virtualScroll: Ref<VirtualScrollStore>,
|
|
33
|
+
virtualScrollX: Ref<VirtualScrollXStore>,
|
|
34
|
+
updateVirtualScrollY: (sTop?: number) => void,
|
|
35
|
+
scrollbarOptions: Ref<Required<ScrollbarOptions>>,
|
|
36
|
+
isExperimentalScrollY: Ref<boolean | undefined>,
|
|
37
|
+
) {
|
|
38
|
+
const showScrollbar = ref({ x: false, y: false });
|
|
39
|
+
const scrollbar = ref({ h: 0, w: 0, t: 0, l: 0 });
|
|
40
|
+
|
|
41
|
+
let isDraggingVertical = false;
|
|
42
|
+
let isDraggingHorizontal = false;
|
|
43
|
+
let dragStartY = 0;
|
|
44
|
+
let dragStartX = 0;
|
|
45
|
+
let dragStartTop = 0;
|
|
46
|
+
let dragStartLeft = 0;
|
|
47
|
+
|
|
48
|
+
let resizeObserver: ResizeObserver | null = null;
|
|
49
|
+
let currentDragHandler: ((e: MouseEvent | TouchEvent) => void) | undefined;
|
|
50
|
+
let isMobileDevice = false;
|
|
51
|
+
|
|
52
|
+
const throttledUpdateScrollbar = throttle(() => updateCustomScrollbar(), 200);
|
|
53
|
+
// Use requestAnimationFrame for smoother scrollbar dragging performance
|
|
54
|
+
const rafUpdateVirtualScrollY = rafThrottle((scrollTop: number) => updateVirtualScrollY(scrollTop));
|
|
55
|
+
|
|
56
|
+
onMounted(() => {
|
|
57
|
+
isMobileDevice = isTouchPrimaryDevice();
|
|
58
|
+
if (scrollbarOptions.value.enabled && !isMobileDevice) {
|
|
59
|
+
resizeObserver = new ResizeObserver(throttledUpdateScrollbar);
|
|
60
|
+
resizeObserver.observe(containerRef.value!);
|
|
61
|
+
}
|
|
62
|
+
initScrollbar();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
onBeforeUnmount(() => {
|
|
66
|
+
// en: Clean up all event listeners to prevent memory leaks
|
|
67
|
+
onDragEnd();
|
|
68
|
+
resizeObserver?.disconnect();
|
|
69
|
+
resizeObserver = null;
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
function updateCustomScrollbar() {
|
|
73
|
+
if (!scrollbarOptions.value.enabled || isMobileDevice) return;
|
|
74
|
+
const { scrollHeight, scrollTop, containerHeight } = virtualScroll.value;
|
|
75
|
+
const { scrollWidth, scrollLeft, containerWidth } = virtualScrollX.value;
|
|
76
|
+
|
|
77
|
+
const needVertical = scrollHeight > containerHeight;
|
|
78
|
+
const needHorizontal = scrollWidth > containerWidth;
|
|
79
|
+
showScrollbar.value = { x: needHorizontal, y: needVertical };
|
|
80
|
+
|
|
81
|
+
if (needVertical) {
|
|
82
|
+
const ratio = containerHeight / scrollHeight;
|
|
83
|
+
scrollbar.value.h = Math.max(scrollbarOptions.value.minHeight, ratio * containerHeight);
|
|
84
|
+
scrollbar.value.t = Math.round((scrollTop / (scrollHeight - containerHeight)) * (containerHeight - scrollbar.value.h));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (needHorizontal) {
|
|
88
|
+
const ratio = containerWidth / scrollWidth;
|
|
89
|
+
scrollbar.value.w = Math.max(scrollbarOptions.value.minWidth, ratio * containerWidth);
|
|
90
|
+
scrollbar.value.l = Math.round((scrollLeft / (scrollWidth - containerWidth)) * (containerWidth - scrollbar.value.w));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function onVerticalScrollbarMouseDown(e: MouseEvent | TouchEvent) {
|
|
95
|
+
if (e instanceof MouseEvent) e.preventDefault();
|
|
96
|
+
isDraggingVertical = true;
|
|
97
|
+
const { scrollTop } = virtualScroll.value;
|
|
98
|
+
dragStartTop = scrollTop;
|
|
99
|
+
dragStartY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;
|
|
100
|
+
addDragListeners(onVerticalDrag);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function onHorizontalScrollbarMouseDown(e: MouseEvent | TouchEvent) {
|
|
104
|
+
if (e instanceof MouseEvent) e.preventDefault();
|
|
105
|
+
isDraggingHorizontal = true;
|
|
106
|
+
const { scrollLeft } = virtualScrollX.value;
|
|
107
|
+
dragStartLeft = scrollLeft;
|
|
108
|
+
dragStartX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;
|
|
109
|
+
addDragListeners(onHorizontalDrag);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function addDragListeners(dragHandler: (e: MouseEvent | TouchEvent) => void) {
|
|
113
|
+
removeCurrentDragHandlerListeners();
|
|
114
|
+
currentDragHandler = dragHandler;
|
|
115
|
+
document.addEventListener('mousemove', dragHandler);
|
|
116
|
+
document.addEventListener('mouseup', onDragEnd);
|
|
117
|
+
document.addEventListener('touchmove', dragHandler, { passive: false });
|
|
118
|
+
document.addEventListener('touchend', onDragEnd);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function onVerticalDrag(e: MouseEvent | TouchEvent) {
|
|
122
|
+
if (!isDraggingVertical) return;
|
|
123
|
+
e.preventDefault();
|
|
124
|
+
const clientY = e instanceof MouseEvent ? e.clientY : e.touches[0].clientY;
|
|
125
|
+
const deltaY = clientY - dragStartY;
|
|
126
|
+
const { scrollHeight, containerHeight } = virtualScroll.value;
|
|
127
|
+
const scrollRange = scrollHeight - containerHeight;
|
|
128
|
+
const trackRange = containerHeight - scrollbar.value.h;
|
|
129
|
+
const scrollDelta = (deltaY / trackRange) * scrollRange;
|
|
130
|
+
|
|
131
|
+
if (isExperimentalScrollY.value) {
|
|
132
|
+
const ratio = containerHeight / scrollHeight;
|
|
133
|
+
const top = Math.round((dragStartTop + scrollDelta) * ratio);
|
|
134
|
+
const maxTop = containerHeight - scrollbar.value.h;
|
|
135
|
+
scrollbar.value.t = top < 0 ? 0 : top > maxTop ? maxTop : top;
|
|
136
|
+
rafUpdateVirtualScrollY(dragStartTop + scrollDelta);
|
|
137
|
+
} else {
|
|
138
|
+
containerRef.value!.scrollTop = dragStartTop + scrollDelta;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function onHorizontalDrag(e: MouseEvent | TouchEvent) {
|
|
143
|
+
if (!isDraggingHorizontal) return;
|
|
144
|
+
e.preventDefault();
|
|
145
|
+
|
|
146
|
+
const clientX = e instanceof MouseEvent ? e.clientX : e.touches[0].clientX;
|
|
147
|
+
const deltaX = clientX - dragStartX;
|
|
148
|
+
const { scrollWidth, containerWidth } = virtualScrollX.value;
|
|
149
|
+
|
|
150
|
+
const scrollRange = scrollWidth - containerWidth;
|
|
151
|
+
const trackRange = containerWidth - scrollbar.value.w;
|
|
152
|
+
const scrollDelta = (deltaX / trackRange) * scrollRange;
|
|
153
|
+
containerRef.value!.scrollLeft = dragStartLeft + scrollDelta;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function onDragEnd() {
|
|
157
|
+
isDraggingVertical = false;
|
|
158
|
+
isDraggingHorizontal = false;
|
|
159
|
+
removeCurrentDragHandlerListeners();
|
|
160
|
+
document.removeEventListener('mouseup', onDragEnd);
|
|
161
|
+
document.removeEventListener('touchend', onDragEnd);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function removeCurrentDragHandlerListeners() {
|
|
165
|
+
if (currentDragHandler) {
|
|
166
|
+
document.removeEventListener('mousemove', currentDragHandler);
|
|
167
|
+
document.removeEventListener('touchmove', currentDragHandler);
|
|
168
|
+
currentDragHandler = void 0;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function initScrollbar() {
|
|
173
|
+
nextTick(updateCustomScrollbar);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return [scrollbar, showScrollbar, onVerticalScrollbarMouseDown, onHorizontalScrollbarMouseDown, updateCustomScrollbar] as const;
|
|
177
|
+
}
|