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/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 (mouseDownEvent, _targetNode, curManagedItem) {
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
- var sortMouseMoveListener = on(window, 'mousemove', function (mouseOverEvent) {
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: (mouseOverEvent === null || mouseOverEvent === void 0 ? void 0 : mouseOverEvent.pageX) || 0,
94
- y: (mouseOverEvent === null || mouseOverEvent === void 0 ? void 0 : mouseOverEvent.pageY) || 0
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 - mouseDownEvent.pageX,
100
- y: offset.y - mouseDownEvent.pageY
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
- }, mouseOverEvent);
201
- }, {
202
- passive: false
203
- });
204
- var sortMouseEndListener = on(window, 'mouseup', function (event) {
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, event);
255
- onSort === null || onSort === void 0 || onSort(callbackPayload, event);
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
- }, mouseDownEvent.nativeEvent);
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
- return clearTimeout(pressTimer.current);
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
@@ -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
- return closestNode(el, function (el) {
66
- var computedStyle = window.getComputedStyle(el);
67
- var overflowRegex = /(auto|scroll)/;
68
- var properties = ['overflow', 'overflowX', 'overflowY'];
69
- return properties.some(function (property) {
70
- return overflowRegex.test(computedStyle[property]);
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rsuite",
3
- "version": "5.79.0",
3
+ "version": "5.79.1",
4
4
  "description": "A suite of react components",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",