rsuite 5.79.0 → 5.79.1
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/CHANGELOG.md +9 -0
- package/cjs/List/List.js +6 -2
- package/cjs/List/helper/useSortHelper.d.ts +7 -5
- package/cjs/List/helper/useSortHelper.js +109 -16
- package/cjs/List/helper/utils.js +15 -7
- package/dist/rsuite.js +5 -5
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.map +1 -1
- package/esm/List/List.js +6 -2
- package/esm/List/helper/useSortHelper.d.ts +7 -5
- package/esm/List/helper/useSortHelper.js +109 -16
- package/esm/List/helper/utils.js +15 -7
- package/package.json +1 -1
package/esm/List/List.js
CHANGED
|
@@ -58,7 +58,9 @@ var List = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
58
58
|
register = _useSortHelper.register,
|
|
59
59
|
sorting = _useSortHelper.sorting,
|
|
60
60
|
handleEnd = _useSortHelper.handleEnd,
|
|
61
|
-
handleStart = _useSortHelper.handleStart
|
|
61
|
+
handleStart = _useSortHelper.handleStart,
|
|
62
|
+
handleTouchStart = _useSortHelper.handleTouchStart,
|
|
63
|
+
handleTouchEnd = _useSortHelper.handleTouchEnd;
|
|
62
64
|
var classes = merge(className, withClassPrefix({
|
|
63
65
|
bordered: bordered,
|
|
64
66
|
sortable: sortable,
|
|
@@ -79,7 +81,9 @@ var List = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
79
81
|
ref: mergeRefs(containerRef, ref),
|
|
80
82
|
className: classes,
|
|
81
83
|
onMouseDown: sortable ? handleStart : undefined,
|
|
82
|
-
onMouseUp: sortable ? handleEnd : undefined
|
|
84
|
+
onMouseUp: sortable ? handleEnd : undefined,
|
|
85
|
+
onTouchStart: sortable ? handleTouchStart : undefined,
|
|
86
|
+
onTouchEnd: sortable ? handleTouchEnd : undefined
|
|
83
87
|
}), /*#__PURE__*/React.createElement(ListContext.Provider, {
|
|
84
88
|
value: contextValue
|
|
85
89
|
}, children));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MouseEventHandler } from 'react';
|
|
1
|
+
import { MouseEventHandler, TouchEventHandler } from 'react';
|
|
2
2
|
import { Collection, ManagedItem } from './useManager';
|
|
3
3
|
export interface MovedItemInfo {
|
|
4
4
|
collection: Collection;
|
|
@@ -10,14 +10,16 @@ export type SortConfig = {
|
|
|
10
10
|
autoScroll?: boolean;
|
|
11
11
|
pressDelay?: number;
|
|
12
12
|
transitionDuration?: number;
|
|
13
|
-
onSortStart?(payload?: MovedItemInfo, event?: MouseEvent): void;
|
|
14
|
-
onSortMove?(payload?: MovedItemInfo, event?: MouseEvent): void;
|
|
15
|
-
onSortEnd?(payload?: MovedItemInfo, event?: MouseEvent): void;
|
|
16
|
-
onSort?(payload?: MovedItemInfo, event?: MouseEvent): void;
|
|
13
|
+
onSortStart?(payload?: MovedItemInfo, event?: MouseEvent | TouchEvent): void;
|
|
14
|
+
onSortMove?(payload?: MovedItemInfo, event?: MouseEvent | TouchEvent): void;
|
|
15
|
+
onSortEnd?(payload?: MovedItemInfo, event?: MouseEvent | TouchEvent): void;
|
|
16
|
+
onSort?(payload?: MovedItemInfo, event?: MouseEvent | TouchEvent): void;
|
|
17
17
|
};
|
|
18
18
|
declare const useSortHelper: (config: SortConfig) => {
|
|
19
19
|
handleStart: MouseEventHandler<Element>;
|
|
20
20
|
handleEnd: MouseEventHandler<Element>;
|
|
21
|
+
handleTouchStart: TouchEventHandler<Element>;
|
|
22
|
+
handleTouchEnd: TouchEventHandler<Element>;
|
|
21
23
|
containerRef: import("react").RefObject<HTMLDivElement>;
|
|
22
24
|
sorting: boolean;
|
|
23
25
|
register: (item: ManagedItem) => {
|
|
@@ -32,7 +32,7 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
32
32
|
/**
|
|
33
33
|
* start dragging
|
|
34
34
|
* */
|
|
35
|
-
var handlePress = useCallback(function (
|
|
35
|
+
var handlePress = useCallback(function (event, _targetNode, curManagedItem) {
|
|
36
36
|
var _curManagedItem$info$, _curManagedItem$info$2, _activeNodeHelper;
|
|
37
37
|
if (!isMounted()) return;
|
|
38
38
|
// data
|
|
@@ -46,6 +46,13 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
46
46
|
};
|
|
47
47
|
var animatedNodesOffset = []; // all list item offset
|
|
48
48
|
|
|
49
|
+
// Get initial position from event
|
|
50
|
+
var isTouchEvent = 'touches' in event;
|
|
51
|
+
var initialPosition = {
|
|
52
|
+
pageX: isTouchEvent ? event.touches[0].pageX : event.pageX,
|
|
53
|
+
pageY: isTouchEvent ? event.touches[0].pageY : event.pageY
|
|
54
|
+
};
|
|
55
|
+
|
|
49
56
|
// init scroller
|
|
50
57
|
var scrollContainer = getScrollingParent(containerElement) || containerElement;
|
|
51
58
|
var initScroll = {
|
|
@@ -87,17 +94,31 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
87
94
|
y: 0
|
|
88
95
|
});
|
|
89
96
|
};
|
|
90
|
-
|
|
97
|
+
|
|
98
|
+
// Common handler for both mouse and touch move events
|
|
99
|
+
var handleSortMove = function handleSortMove(moveEvent) {
|
|
100
|
+
// Prevent default to stop page scrolling during touch drag
|
|
101
|
+
if ('touches' in moveEvent) {
|
|
102
|
+
moveEvent.preventDefault();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Get current position from event
|
|
106
|
+
var isTouchMoveEvent = 'touches' in moveEvent;
|
|
107
|
+
var currentPosition = {
|
|
108
|
+
pageX: isTouchMoveEvent ? moveEvent.touches[0].pageX : moveEvent.pageX,
|
|
109
|
+
pageY: isTouchMoveEvent ? moveEvent.touches[0].pageY : moveEvent.pageY
|
|
110
|
+
};
|
|
111
|
+
|
|
91
112
|
// Update helper position
|
|
92
113
|
var offset = {
|
|
93
|
-
x:
|
|
94
|
-
y:
|
|
114
|
+
x: currentPosition.pageX,
|
|
115
|
+
y: currentPosition.pageY
|
|
95
116
|
};
|
|
96
117
|
var containerScrollDelta = getContainerScrollDelta();
|
|
97
118
|
var containerBoundingRect = scrollContainer.getBoundingClientRect();
|
|
98
119
|
activeNodeHolderTranslate = {
|
|
99
|
-
x: offset.x -
|
|
100
|
-
y: offset.y -
|
|
120
|
+
x: offset.x - initialPosition.pageX,
|
|
121
|
+
y: offset.y - initialPosition.pageY
|
|
101
122
|
};
|
|
102
123
|
if (activeNodeHelper) {
|
|
103
124
|
setTranslate3d(activeNodeHelper, activeNodeHolderTranslate);
|
|
@@ -197,14 +218,22 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
197
218
|
node: activeNode,
|
|
198
219
|
oldIndex: activeNodeOldIndex,
|
|
199
220
|
newIndex: activeNodeNextIndex
|
|
200
|
-
},
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
var
|
|
221
|
+
}, moveEvent);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
// Common handler for both mouse and touch end events
|
|
225
|
+
var handleSortEnd = function handleSortEnd(endEvent) {
|
|
226
|
+
var _sortTouchMoveListene, _sortTouchEndListener;
|
|
205
227
|
// Remove the event listeners
|
|
206
228
|
sortMouseMoveListener.off();
|
|
207
229
|
sortMouseEndListener.off();
|
|
230
|
+
(_sortTouchMoveListene = sortTouchMoveListener) === null || _sortTouchMoveListene === void 0 || _sortTouchMoveListene.off();
|
|
231
|
+
(_sortTouchEndListener = sortTouchEndListener) === null || _sortTouchEndListener === void 0 || _sortTouchEndListener.off();
|
|
232
|
+
|
|
233
|
+
// Enable page scrolling again
|
|
234
|
+
if (document.body.style.overflow === 'hidden') {
|
|
235
|
+
document.body.style.overflow = '';
|
|
236
|
+
}
|
|
208
237
|
var holderTranslate = getHolderTranslate();
|
|
209
238
|
var containerScrollDelta = getContainerScrollDelta();
|
|
210
239
|
if (activeNodeHelper) {
|
|
@@ -251,12 +280,33 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
251
280
|
newIndex: activeNodeNextIndex,
|
|
252
281
|
oldIndex: activeNodeOldIndex
|
|
253
282
|
};
|
|
254
|
-
onSortEnd === null || onSortEnd === void 0 || onSortEnd(callbackPayload,
|
|
255
|
-
onSort === null || onSort === void 0 || onSort(callbackPayload,
|
|
283
|
+
onSortEnd === null || onSortEnd === void 0 || onSortEnd(callbackPayload, endEvent);
|
|
284
|
+
onSort === null || onSort === void 0 || onSort(callbackPayload, endEvent);
|
|
256
285
|
}, transitionDuration);
|
|
257
|
-
}
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
// Set up mouse event listeners
|
|
289
|
+
var sortMouseMoveListener = on(window, 'mousemove', handleSortMove, {
|
|
290
|
+
passive: false
|
|
291
|
+
});
|
|
292
|
+
var sortMouseEndListener = on(window, 'mouseup', handleSortEnd, {
|
|
258
293
|
passive: false
|
|
259
294
|
});
|
|
295
|
+
|
|
296
|
+
// Set up touch event listeners
|
|
297
|
+
var sortTouchMoveListener;
|
|
298
|
+
var sortTouchEndListener;
|
|
299
|
+
if (isTouchEvent) {
|
|
300
|
+
// Disable page scrolling during touch drag
|
|
301
|
+
document.body.style.overflow = 'hidden';
|
|
302
|
+
sortTouchMoveListener = on(window, 'touchmove', handleSortMove, {
|
|
303
|
+
passive: false
|
|
304
|
+
} // Important: passive: false allows preventDefault() to work
|
|
305
|
+
);
|
|
306
|
+
sortTouchEndListener = on(window, 'touchend', handleSortEnd, {
|
|
307
|
+
passive: false
|
|
308
|
+
});
|
|
309
|
+
}
|
|
260
310
|
setSorting(true);
|
|
261
311
|
// start callback
|
|
262
312
|
onSortStart === null || onSortStart === void 0 || onSortStart({
|
|
@@ -264,7 +314,7 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
264
314
|
node: activeNode,
|
|
265
315
|
oldIndex: activeNodeOldIndex,
|
|
266
316
|
newIndex: activeNodeNextIndex
|
|
267
|
-
},
|
|
317
|
+
}, event);
|
|
268
318
|
}, [autoScroll, getOrderedItems, isMounted, onSort, onSortEnd, onSortMove, onSortStart, transitionDuration]);
|
|
269
319
|
|
|
270
320
|
/**
|
|
@@ -292,15 +342,58 @@ var useSortHelper = function useSortHelper(config) {
|
|
|
292
342
|
}
|
|
293
343
|
}, [getManagedItem, handlePress, pressDelay, sorting]);
|
|
294
344
|
|
|
345
|
+
/**
|
|
346
|
+
* Handle touch start for mobile devices
|
|
347
|
+
*/
|
|
348
|
+
var handleTouchStart = useCallback(function (touchStartEvent) {
|
|
349
|
+
var triggeredNode = touchStartEvent.target;
|
|
350
|
+
var targetNode = closestNode(triggeredNode, function (el) {
|
|
351
|
+
return Boolean(getManagedItem(el));
|
|
352
|
+
});
|
|
353
|
+
var curManagedItem = getManagedItem(targetNode);
|
|
354
|
+
if (
|
|
355
|
+
// is list item
|
|
356
|
+
Boolean(curManagedItem) && !curManagedItem.info.disabled &&
|
|
357
|
+
// is not sorting
|
|
358
|
+
!sorting &&
|
|
359
|
+
// is valid node
|
|
360
|
+
targetNode instanceof HTMLElement &&
|
|
361
|
+
// excludes interactive elements
|
|
362
|
+
!targetNode.contains(closestNode(triggeredNode, isContainInteractiveElement))) {
|
|
363
|
+
// Prevent scrolling while sorting
|
|
364
|
+
touchStartEvent.preventDefault();
|
|
365
|
+
pressTimer.current = setTimeout(handlePress, pressDelay, touchStartEvent, targetNode, curManagedItem);
|
|
366
|
+
}
|
|
367
|
+
}, [getManagedItem, handlePress, pressDelay, sorting]);
|
|
368
|
+
|
|
295
369
|
/**
|
|
296
370
|
* Clear timer after drag
|
|
297
371
|
* */
|
|
298
372
|
var handleEnd = useCallback(function () {
|
|
299
|
-
|
|
373
|
+
clearTimeout(pressTimer.current);
|
|
374
|
+
|
|
375
|
+
// Ensure page scrolling is re-enabled
|
|
376
|
+
if (document.body.style.overflow === 'hidden') {
|
|
377
|
+
document.body.style.overflow = '';
|
|
378
|
+
}
|
|
379
|
+
}, []);
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Clear timer after touch end
|
|
383
|
+
*/
|
|
384
|
+
var handleTouchEnd = useCallback(function () {
|
|
385
|
+
clearTimeout(pressTimer.current);
|
|
386
|
+
|
|
387
|
+
// Ensure page scrolling is re-enabled
|
|
388
|
+
if (document.body.style.overflow === 'hidden') {
|
|
389
|
+
document.body.style.overflow = '';
|
|
390
|
+
}
|
|
300
391
|
}, []);
|
|
301
392
|
return {
|
|
302
393
|
handleStart: handleStart,
|
|
303
394
|
handleEnd: handleEnd,
|
|
395
|
+
handleTouchStart: handleTouchStart,
|
|
396
|
+
handleTouchEnd: handleTouchEnd,
|
|
304
397
|
containerRef: containerRef,
|
|
305
398
|
sorting: sorting,
|
|
306
399
|
register: listItemRegister
|
package/esm/List/helper/utils.js
CHANGED
|
@@ -62,12 +62,20 @@ export function getEdgeOffset(node, parent, offset) {
|
|
|
62
62
|
return getEdgeOffset(node.parentNode, parent, nodeOffset);
|
|
63
63
|
}
|
|
64
64
|
export function getScrollingParent(el) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return
|
|
70
|
-
|
|
65
|
+
if (!el || typeof window === 'undefined' || !window.getComputedStyle) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
return closestNode(el, function (el) {
|
|
70
|
+
var computedStyle = window.getComputedStyle(el);
|
|
71
|
+
var overflowRegex = /(auto|scroll)/;
|
|
72
|
+
var properties = ['overflow', 'overflowX', 'overflowY'];
|
|
73
|
+
return properties.some(function (property) {
|
|
74
|
+
return overflowRegex.test(computedStyle[property]);
|
|
75
|
+
});
|
|
71
76
|
});
|
|
72
|
-
})
|
|
77
|
+
} catch (error) {
|
|
78
|
+
// In test environments, errors may occur, so return null
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
73
81
|
}
|