@elliemae/ds-drag-and-drop 3.8.1 → 3.8.2-rc.2
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/cjs/hierarchy/useHierarchyAnnouncements.js.map +1 -1
- package/dist/cjs/tree/customCollisionDetection.js +16 -52
- package/dist/cjs/tree/customCollisionDetection.js.map +2 -2
- package/dist/cjs/tree/useTreeAnnouncements.js.map +1 -1
- package/dist/cjs/tree/useTreeDndkitConfig.js.map +2 -2
- package/dist/esm/hierarchy/useHierarchyAnnouncements.js.map +1 -1
- package/dist/esm/tree/customCollisionDetection.js +16 -52
- package/dist/esm/tree/customCollisionDetection.js.map +2 -2
- package/dist/esm/tree/useTreeAnnouncements.js.map +1 -1
- package/dist/esm/tree/useTreeDndkitConfig.js.map +2 -2
- package/package.json +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/hierarchy/useHierarchyAnnouncements.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
-
"sourcesContent": ["import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { Item } from './types';\n\nexport const useHierarchyAnnouncements = (visibleItemsDictionary: Record<string, Item>): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].index + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['
|
|
4
|
+
"sourcesContent": ["import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { Item } from './types';\n\nexport const useHierarchyAnnouncements = (visibleItemsDictionary: Record<string, Item>): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].index + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['onDragOver'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].index + 1;\n return `Draggable item was moved to position ${overIndex}.`;\n }\n\n return `Draggable item is no longer over a droppable area.`;\n },\n [visibleItemsDictionary],\n );\n\n const onDragOver: Announcements['onDragOver'] = onDragMove;\n\n const onDragEnd: Announcements['onDragEnd'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].index + 1;\n return `Draggable item was dropped over position ${overIndex}.`;\n }\n\n return `Draggable item was dropped at it's original position.`;\n },\n [visibleItemsDictionary],\n );\n\n const onDragCancel: Announcements['onDragCancel'] = useCallback(\n ({ active: { id } }) =>\n `Dragging was cancelled. Draggable item from position ${\n visibleItemsDictionary[id].index + 1\n } was dropped at it's initial position.`,\n [visibleItemsDictionary],\n );\n\n return { onDragStart, onDragOver, onDragMove, onDragEnd, onDragCancel };\n};\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADCvB,mBAA4B;AAGrB,MAAM,4BAA4B,CAAC,2BAAgE;AACxG,QAAM,kBAA4C;AAAA,IAChD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,0CAA0C,uBAAuB,IAAI,QAAQ;AAAA,IACrG,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,iBAA0C;AAAA,IAC9C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,QAAQ;AAC1D,eAAO,wCAAwC;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,aAA0C;AAEhD,QAAM,gBAAwC;AAAA,IAC5C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,QAAQ;AAC1D,eAAO,4CAA4C;AAAA,MACrD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,mBAA8C;AAAA,IAClD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAChB,wDACE,uBAAuB,IAAI,QAAQ;AAAA,IAEvC,CAAC,sBAAsB;AAAA,EACzB;AAEA,SAAO,EAAE,aAAa,YAAY,YAAY,WAAW,aAAa;AACxE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -29,24 +29,7 @@ __export(customCollisionDetection_exports, {
|
|
|
29
29
|
module.exports = __toCommonJS(customCollisionDetection_exports);
|
|
30
30
|
var React = __toESM(require("react"));
|
|
31
31
|
var import_constants = require("./constants");
|
|
32
|
-
const
|
|
33
|
-
const RECT_UP = {
|
|
34
|
-
top: -Infinity,
|
|
35
|
-
left: 0,
|
|
36
|
-
right: 0,
|
|
37
|
-
bottom: 0,
|
|
38
|
-
width: 0,
|
|
39
|
-
height: 0
|
|
40
|
-
};
|
|
41
|
-
const RECT_DOWN = {
|
|
42
|
-
top: Infinity,
|
|
43
|
-
left: 0,
|
|
44
|
-
right: 0,
|
|
45
|
-
bottom: 0,
|
|
46
|
-
width: 0,
|
|
47
|
-
height: 0
|
|
48
|
-
};
|
|
49
|
-
const thresholdRatio = 0.2;
|
|
32
|
+
const thresholdRatio = 0.75;
|
|
50
33
|
const insideThreshold = 0.7;
|
|
51
34
|
const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndicatorPosition, maxDragAndDropLevel, lastPosition, setLastPosition) => {
|
|
52
35
|
const func = ({ droppableContainers, collisionRect }) => {
|
|
@@ -57,39 +40,20 @@ const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndic
|
|
|
57
40
|
isUp = originalRect.top > collisionRect.top;
|
|
58
41
|
}
|
|
59
42
|
const threshold = collisionRect.height * thresholdRatio;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
{ id: DUMMY_ID, rect: { current: RECT_DOWN } }
|
|
75
|
-
);
|
|
76
|
-
} else {
|
|
77
|
-
collidingContainer = droppableContainers.reduce(
|
|
78
|
-
(firstRectUp, container) => {
|
|
79
|
-
const rect = container.rect.current;
|
|
80
|
-
if (rect && firstRectUp.rect.current) {
|
|
81
|
-
const { top: rectTop } = rect;
|
|
82
|
-
const { top: firstRectUpTop } = firstRectUp.rect.current;
|
|
83
|
-
if (rectTop - threshold < collisionRect.top && rectTop > firstRectUpTop) {
|
|
84
|
-
return container;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return firstRectUp;
|
|
88
|
-
},
|
|
89
|
-
{ id: DUMMY_ID, rect: { current: RECT_UP } }
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
if (collidingContainer.id === DUMMY_ID) {
|
|
43
|
+
const collidingContainer = droppableContainers.reduce((bestContainer, container) => {
|
|
44
|
+
const rect = container.rect.current;
|
|
45
|
+
if (!rect)
|
|
46
|
+
return bestContainer;
|
|
47
|
+
const bestContainerTop = bestContainer?.rect?.current?.top ?? 0;
|
|
48
|
+
if (isUp && collisionRect.top + threshold > rect.top && (bestContainer === null || rect.top > bestContainerTop)) {
|
|
49
|
+
return container;
|
|
50
|
+
}
|
|
51
|
+
if (!isUp && collisionRect.bottom - threshold < rect.bottom && (bestContainer === null || rect.top < bestContainerTop)) {
|
|
52
|
+
return container;
|
|
53
|
+
}
|
|
54
|
+
return bestContainer;
|
|
55
|
+
}, null);
|
|
56
|
+
if (collidingContainer === null) {
|
|
93
57
|
return [];
|
|
94
58
|
}
|
|
95
59
|
const collidingRect = collidingContainer.rect.current;
|
|
@@ -99,7 +63,7 @@ const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndic
|
|
|
99
63
|
Math.max(collisionRect.top, collidingRect.top),
|
|
100
64
|
Math.min(collisionRect.top + collisionRect.height, collidingRect.top + collidingRect.height)
|
|
101
65
|
];
|
|
102
|
-
const intersectionPercentage = Math.abs(bottom - top) / collidingRect.height;
|
|
66
|
+
const intersectionPercentage = Math.abs(bottom - top) / Math.min(collisionRect.height, collidingRect.height);
|
|
103
67
|
if (intersectionPercentage > insideThreshold && visibleItemsDictionary[collidingContainer.id].depth + 1 <= maxDragAndDropLevel && collidingContainer.id !== activeId) {
|
|
104
68
|
setDropIndicatorPosition(import_constants.DropIndicatorPosition.Inside);
|
|
105
69
|
} else {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tree/customCollisionDetection.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable max-statements */\n/* eslint-disable complexity */\n/* eslint-disable @typescript-eslint/indent */\n/* eslint-disable max-params */\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADKvB,uBAAsC;
|
|
4
|
+
"sourcesContent": ["/* eslint-disable max-statements */\n/* eslint-disable complexity */\n/* eslint-disable @typescript-eslint/indent */\n/* eslint-disable max-params */\nimport { type CollisionDetection, type DroppableContainer } from '@dnd-kit/core';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\n// Percentage of height to take into consideration when looking for colliding rects\nconst thresholdRatio = 0.75;\n// Percentage to be inside\nconst insideThreshold = 0.7;\n\nexport const customCollisionDetection = (\n activeId: string,\n visibleItemsDictionary: Record<string, Item>,\n setDropIndicatorPosition: React.Dispatch<React.SetStateAction<DropIndicatorPosition>>,\n maxDragAndDropLevel: number,\n lastPosition: string,\n setLastPosition: React.Dispatch<React.SetStateAction<string>>,\n): CollisionDetection => {\n const func: CollisionDetection = ({ droppableContainers, collisionRect }) => {\n const originalContainer = droppableContainers.find(({ id }) => id === activeId);\n const originalRect = originalContainer?.rect?.current;\n\n // We first check if the item was moved up or down\n // This modifies how to search the matching colliding rect\n let isUp = lastPosition === 'up';\n if (originalRect) {\n isUp = originalRect.top > collisionRect.top;\n }\n\n const threshold = collisionRect.height * thresholdRatio;\n\n const collidingContainer = droppableContainers.reduce((bestContainer, container) => {\n const rect = container.rect.current;\n if (!rect) return bestContainer;\n const bestContainerTop = bestContainer?.rect?.current?.top ?? 0;\n if (isUp && collisionRect.top + threshold > rect.top && (bestContainer === null || rect.top > bestContainerTop)) {\n return container;\n }\n if (\n !isUp &&\n collisionRect.bottom - threshold < rect.bottom &&\n (bestContainer === null || rect.top < bestContainerTop)\n ) {\n return container;\n }\n return bestContainer;\n }, null as DroppableContainer | null);\n\n // If we didn't find a match, return empty array\n if (collidingContainer === null) {\n return [];\n }\n\n const collidingRect = collidingContainer.rect.current;\n\n if (!collidingRect) return [];\n\n // Calculate the intersection interval\n const [top, bottom] = [\n Math.max(collisionRect.top, collidingRect.top),\n Math.min(collisionRect.top + collisionRect.height, collidingRect.top + collidingRect.height),\n ];\n\n // Calculate the percentage of intersection\n const intersectionPercentage = Math.abs(bottom - top) / Math.min(collisionRect.height, collidingRect.height);\n\n if (\n intersectionPercentage > insideThreshold &&\n visibleItemsDictionary[collidingContainer.id].depth + 1 <= maxDragAndDropLevel &&\n collidingContainer.id !== activeId\n ) {\n setDropIndicatorPosition(DropIndicatorPosition.Inside);\n } else {\n setDropIndicatorPosition(isUp ? DropIndicatorPosition.Before : DropIndicatorPosition.After);\n }\n\n if (isUp && lastPosition !== 'up') setLastPosition('up');\n else if (!isUp && lastPosition !== 'down') setLastPosition('down');\n\n // Return the id of the match rectangle\n return [{ id: collidingContainer.id }];\n };\n return func;\n};\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADKvB,uBAAsC;AAItC,MAAM,iBAAiB;AAEvB,MAAM,kBAAkB;AAEjB,MAAM,2BAA2B,CACtC,UACA,wBACA,0BACA,qBACA,cACA,oBACuB;AACvB,QAAM,OAA2B,CAAC,EAAE,qBAAqB,cAAc,MAAM;AAC3E,UAAM,oBAAoB,oBAAoB,KAAK,CAAC,EAAE,GAAG,MAAM,OAAO,QAAQ;AAC9E,UAAM,eAAe,mBAAmB,MAAM;AAI9C,QAAI,OAAO,iBAAiB;AAC5B,QAAI,cAAc;AAChB,aAAO,aAAa,MAAM,cAAc;AAAA,IAC1C;AAEA,UAAM,YAAY,cAAc,SAAS;AAEzC,UAAM,qBAAqB,oBAAoB,OAAO,CAAC,eAAe,cAAc;AAClF,YAAM,OAAO,UAAU,KAAK;AAC5B,UAAI,CAAC;AAAM,eAAO;AAClB,YAAM,mBAAmB,eAAe,MAAM,SAAS,OAAO;AAC9D,UAAI,QAAQ,cAAc,MAAM,YAAY,KAAK,QAAQ,kBAAkB,QAAQ,KAAK,MAAM,mBAAmB;AAC/G,eAAO;AAAA,MACT;AACA,UACE,CAAC,QACD,cAAc,SAAS,YAAY,KAAK,WACvC,kBAAkB,QAAQ,KAAK,MAAM,mBACtC;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,GAAG,IAAiC;AAGpC,QAAI,uBAAuB,MAAM;AAC/B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,gBAAgB,mBAAmB,KAAK;AAE9C,QAAI,CAAC;AAAe,aAAO,CAAC;AAG5B,UAAM,CAAC,KAAK,MAAM,IAAI;AAAA,MACpB,KAAK,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,MAC7C,KAAK,IAAI,cAAc,MAAM,cAAc,QAAQ,cAAc,MAAM,cAAc,MAAM;AAAA,IAC7F;AAGA,UAAM,yBAAyB,KAAK,IAAI,SAAS,GAAG,IAAI,KAAK,IAAI,cAAc,QAAQ,cAAc,MAAM;AAE3G,QACE,yBAAyB,mBACzB,uBAAuB,mBAAmB,IAAI,QAAQ,KAAK,uBAC3D,mBAAmB,OAAO,UAC1B;AACA,+BAAyB,uCAAsB,MAAM;AAAA,IACvD,OAAO;AACL,+BAAyB,OAAO,uCAAsB,SAAS,uCAAsB,KAAK;AAAA,IAC5F;AAEA,QAAI,QAAQ,iBAAiB;AAAM,sBAAgB,IAAI;AAAA,aAC9C,CAAC,QAAQ,iBAAiB;AAAQ,sBAAgB,MAAM;AAGjE,WAAO,CAAC,EAAE,IAAI,mBAAmB,GAAG,CAAC;AAAA,EACvC;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tree/useTreeAnnouncements.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
-
"sourcesContent": ["import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\nexport const useTreeAnnouncements = (\n visibleItemsDictionary: Record<string, Item>,\n dropIndicatorPosition: DropIndicatorPosition,\n): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].realIndex + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['
|
|
4
|
+
"sourcesContent": ["import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\nexport const useTreeAnnouncements = (\n visibleItemsDictionary: Record<string, Item>,\n dropIndicatorPosition: DropIndicatorPosition,\n): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].realIndex + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['onDragOver'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].realIndex + 1;\n if (dropIndicatorPosition === DropIndicatorPosition.Inside) {\n return `Draggable item was moved inside the item at position ${overIndex}.`;\n }\n if (dropIndicatorPosition === DropIndicatorPosition.Before) {\n return `Draggable item was moved to position ${overIndex - 1}.`;\n }\n return `Draggable item was moved to position ${overIndex}.`;\n }\n\n return `Draggable item is no longer over a droppable area.`;\n },\n [visibleItemsDictionary, dropIndicatorPosition],\n );\n\n const onDragOver: Announcements['onDragOver'] = onDragMove;\n\n const onDragEnd: Announcements['onDragEnd'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].realIndex + 1;\n if (dropIndicatorPosition === DropIndicatorPosition.Inside) {\n return `Draggable item was dropped inside the item at position ${overIndex}.`;\n }\n if (dropIndicatorPosition === DropIndicatorPosition.Before) {\n return `Draggable item was dropped over position ${overIndex - 1}.`;\n }\n return `Draggable item was dropped over position ${overIndex}.`;\n }\n\n return `Draggable item was dropped at it's original position.`;\n },\n [dropIndicatorPosition, visibleItemsDictionary],\n );\n\n const onDragCancel: Announcements['onDragCancel'] = useCallback(\n ({ active: { id } }) =>\n `Dragging was cancelled. Draggable item from position ${\n visibleItemsDictionary[id].realIndex + 1\n } was dropped at it's initial position.`,\n [visibleItemsDictionary],\n );\n\n return { onDragStart, onDragOver, onDragMove, onDragEnd, onDragCancel };\n};\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADCvB,mBAA4B;AAC5B,uBAAsC;AAG/B,MAAM,uBAAuB,CAClC,wBACA,0BACkB;AAClB,QAAM,kBAA4C;AAAA,IAChD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,0CAA0C,uBAAuB,IAAI,YAAY;AAAA,IACzG,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,iBAA0C;AAAA,IAC9C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,YAAY;AAC9D,YAAI,0BAA0B,uCAAsB,QAAQ;AAC1D,iBAAO,wDAAwD;AAAA,QACjE;AACA,YAAI,0BAA0B,uCAAsB,QAAQ;AAC1D,iBAAO,wCAAwC,YAAY;AAAA,QAC7D;AACA,eAAO,wCAAwC;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,wBAAwB,qBAAqB;AAAA,EAChD;AAEA,QAAM,aAA0C;AAEhD,QAAM,gBAAwC;AAAA,IAC5C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,YAAY;AAC9D,YAAI,0BAA0B,uCAAsB,QAAQ;AAC1D,iBAAO,0DAA0D;AAAA,QACnE;AACA,YAAI,0BAA0B,uCAAsB,QAAQ;AAC1D,iBAAO,4CAA4C,YAAY;AAAA,QACjE;AACA,eAAO,4CAA4C;AAAA,MACrD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,uBAAuB,sBAAsB;AAAA,EAChD;AAEA,QAAM,mBAA8C;AAAA,IAClD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAChB,wDACE,uBAAuB,IAAI,YAAY;AAAA,IAE3C,CAAC,sBAAsB;AAAA,EACzB;AAEA,SAAO,EAAE,aAAa,YAAY,YAAY,WAAW,aAAa;AACxE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tree/useTreeDndkitConfig.tsx", "../../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable max-statements */\n/* eslint-disable max-lines */\nimport { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n useSensor,\n useSensors,\n KeyboardSensor,\n PointerSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n Modifier,\n} from '@dnd-kit/core';\nimport { useTreePreviewHandlers } from './useTreePreviewHandlers';\nimport { getTreeKeyboardCoordinates } from './getTreeKeyboardCoordinates';\nimport { getProjection, removeChildrenOf } from './utilities';\nimport { useTreeActionHandlers } from './useTreeActionHandlers';\nimport type { UseTreeDndkitConfigType, SensorContext } from './types';\nimport { DropIndicatorPosition } from './constants';\nimport { customCollisionDetection } from './customCollisionDetection';\nimport { useTreeAnnouncements } from './useTreeAnnouncements';\n\n// we make space for the drop indicator\n// if second parameter is true, the space will be done on the horizontal axis\nconst adjustTranslate = (isHorizontalDnD: boolean, sortedIds: string[]): Modifier => {\n const func: Modifier = ({ transform, activatorEvent, active }) => {\n const newTransform = {\n ...transform,\n };\n if (isHorizontalDnD) {\n newTransform.x = transform.x + 25;\n } else {\n newTransform.x = transform.x + 15;\n if (['Enter', 'Space'].includes(activatorEvent?.code)) {\n const isLast = active?.id === sortedIds[sortedIds.length - 1];\n const keyboardTranslate = ((isLast ? -1 : 1) * (active?.rect?.current?.initial?.height ?? 0)) / 2;\n newTransform.y = transform.y + keyboardTranslate;\n }\n }\n return newTransform;\n };\n return func;\n};\n\nconst measuring: Partial<MeasuringConfiguration> = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nexport const useTreeDndkitConfig: UseTreeDndkitConfigType = ({\n flattenedItems,\n visibleItems: preVisibleItems,\n isHorizontalDnD = false,\n isExpandable = false,\n onReorder,\n getIsDropValid = () => true,\n maxDragAndDropLevel,\n}) => {\n const [activeId, setActiveId] = useState<string>('');\n const [overId, setOverId] = useState<string>('');\n const [dropIndicatorPosition, setDropIndicatorPosition] = useState<DropIndicatorPosition>(DropIndicatorPosition.None);\n const [lastPosition, setLastPosition] = useState<string>('');\n\n // Remove activeId's children\n const visibleItems = useMemo(() => removeChildrenOf(preVisibleItems, activeId), [preVisibleItems, activeId]);\n\n // Sorted ids for the library\n const sortedIds = useMemo(() => visibleItems.map((item) => item.uid), [visibleItems]);\n\n /**\n * Dictionary from UID to ITEM\n * This dictionary is computed since on every DnD move, I need to know the\n * depth of a particular row, so O(1) per DnD move instead of O(#ITEMS)\n */\n const visibleItemsDictionary = useMemo(() => {\n // Using plain for to achieve O(#ITEMS) performance\n const dictionary: Record<string, typeof visibleItems[0]> = {};\n visibleItems.forEach((item) => {\n dictionary[item.uid] = item;\n });\n return dictionary;\n }, [visibleItems]);\n\n const isDropValid = useMemo(() => {\n if (!activeId || !overId) return true;\n return getIsDropValid(\n visibleItemsDictionary[activeId],\n visibleItemsDictionary[overId],\n ['none', 'before', 'after', 'inside'][dropIndicatorPosition] as Parameters<typeof getIsDropValid>[2],\n );\n }, [getIsDropValid, visibleItemsDictionary, activeId, overId, dropIndicatorPosition]);\n\n const modifiers: Modifier[] = useMemo(\n () => [adjustTranslate(isHorizontalDnD, sortedIds)],\n [isHorizontalDnD, sortedIds],\n );\n\n const sensorContext: SensorContext = useRef({\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n });\n\n useEffect(() => {\n sensorContext.current = {\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n };\n }, [visibleItems, dropIndicatorPosition, setDropIndicatorPosition]);\n\n const coordinateGetter = useMemo(\n () => getTreeKeyboardCoordinates(sensorContext, isHorizontalDnD, maxDragAndDropLevel),\n [sensorContext, isHorizontalDnD, maxDragAndDropLevel],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n );\n\n // where is the activeItem being positioned (depth and parent)\n const projected = useMemo(\n () =>\n overId ? getProjection(visibleItems, visibleItemsDictionary, overId, dropIndicatorPosition, isExpandable) : null,\n [overId, visibleItems, visibleItemsDictionary, dropIndicatorPosition, isExpandable],\n );\n\n const dragPreviewHandlers = useTreePreviewHandlers({\n setActiveId,\n setOverId,\n setDropIndicatorPosition,\n });\n\n const dragActionHandlers = useTreeActionHandlers({\n ...dragPreviewHandlers,\n onReorder,\n projected,\n flattenedItems,\n dropIndicatorPosition,\n isDropValid,\n });\n\n const announcements = useTreeAnnouncements(visibleItemsDictionary, dropIndicatorPosition);\n\n const dndContextProps = useMemo(\n () => ({\n accessibility: {\n announcements,\n container: document.body,\n },\n modifiers,\n sensors,\n measuring,\n collisionDetection: customCollisionDetection(\n activeId,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ),\n ...dragActionHandlers,\n }),\n [\n announcements,\n modifiers,\n sensors,\n dragActionHandlers,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n activeId,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ],\n );\n\n const sortableContextProps = useMemo(\n () => ({\n items: sortedIds,\n strategy: () => null,\n }),\n [sortedIds],\n );\n\n return {\n dndContextProps,\n sortableContextProps,\n isDropValid,\n activeId,\n activeIndex: visibleItemsDictionary[activeId]?.realIndex ?? -1,\n overId,\n depth: projected ? projected.depth : 0,\n dropIndicatorPosition,\n visibleItems,\n };\n};\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADEvB,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable max-statements */\n/* eslint-disable max-lines */\nimport React, { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n useSensor,\n useSensors,\n KeyboardSensor,\n PointerSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n Modifier,\n} from '@dnd-kit/core';\nimport { useTreePreviewHandlers } from './useTreePreviewHandlers';\nimport { getTreeKeyboardCoordinates } from './getTreeKeyboardCoordinates';\nimport { getProjection, removeChildrenOf } from './utilities';\nimport { useTreeActionHandlers } from './useTreeActionHandlers';\nimport type { UseTreeDndkitConfigType, SensorContext } from './types';\nimport { DropIndicatorPosition } from './constants';\nimport { customCollisionDetection } from './customCollisionDetection';\nimport { useTreeAnnouncements } from './useTreeAnnouncements';\n\n// we make space for the drop indicator\n// if second parameter is true, the space will be done on the horizontal axis\nconst adjustTranslate = (isHorizontalDnD: boolean, sortedIds: string[]): Modifier => {\n const func: Modifier = ({ transform, activatorEvent, active }) => {\n const newTransform = {\n ...transform,\n };\n if (isHorizontalDnD) {\n newTransform.x = transform.x + 25;\n } else {\n newTransform.x = transform.x + 15;\n if (['Enter', 'Space'].includes((activatorEvent as KeyboardEvent)?.code)) {\n const isLast = active?.id === sortedIds[sortedIds.length - 1];\n const keyboardTranslate = ((isLast ? -1 : 1) * (active?.rect?.current?.initial?.height ?? 0)) / 2;\n newTransform.y = transform.y + keyboardTranslate;\n }\n }\n return newTransform;\n };\n return func;\n};\n\nconst measuring: Partial<MeasuringConfiguration> = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nexport const useTreeDndkitConfig: UseTreeDndkitConfigType = ({\n flattenedItems,\n visibleItems: preVisibleItems,\n isHorizontalDnD = false,\n isExpandable = false,\n onReorder,\n getIsDropValid = () => true,\n maxDragAndDropLevel,\n}) => {\n const [activeId, setActiveId] = useState<string>('');\n const [overId, setOverId] = useState<string>('');\n const [dropIndicatorPosition, setDropIndicatorPosition] = useState<DropIndicatorPosition>(DropIndicatorPosition.None);\n const [lastPosition, setLastPosition] = useState<string>('');\n\n // Remove activeId's children\n const visibleItems = useMemo(() => removeChildrenOf(preVisibleItems, activeId), [preVisibleItems, activeId]);\n\n // Sorted ids for the library\n const sortedIds = useMemo(() => visibleItems.map((item) => item.uid), [visibleItems]);\n\n /**\n * Dictionary from UID to ITEM\n * This dictionary is computed since on every DnD move, I need to know the\n * depth of a particular row, so O(1) per DnD move instead of O(#ITEMS)\n */\n const visibleItemsDictionary = useMemo(() => {\n // Using plain for to achieve O(#ITEMS) performance\n const dictionary: Record<string, typeof visibleItems[0]> = {};\n visibleItems.forEach((item) => {\n dictionary[item.uid] = item;\n });\n return dictionary;\n }, [visibleItems]);\n\n const isDropValid = useMemo(() => {\n if (!activeId || !overId) return true;\n return getIsDropValid(\n visibleItemsDictionary[activeId],\n visibleItemsDictionary[overId],\n ['none', 'before', 'after', 'inside'][dropIndicatorPosition] as Parameters<typeof getIsDropValid>[2],\n );\n }, [getIsDropValid, visibleItemsDictionary, activeId, overId, dropIndicatorPosition]);\n\n const modifiers: Modifier[] = useMemo(\n () => [adjustTranslate(isHorizontalDnD, sortedIds)],\n [isHorizontalDnD, sortedIds],\n );\n\n const sensorContext: SensorContext = useRef({\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n });\n\n useEffect(() => {\n sensorContext.current = {\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n };\n }, [visibleItems, dropIndicatorPosition, setDropIndicatorPosition]);\n\n const coordinateGetter = useMemo(\n () => getTreeKeyboardCoordinates(sensorContext, isHorizontalDnD, maxDragAndDropLevel),\n [sensorContext, isHorizontalDnD, maxDragAndDropLevel],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n );\n\n // where is the activeItem being positioned (depth and parent)\n const projected = useMemo(\n () =>\n overId ? getProjection(visibleItems, visibleItemsDictionary, overId, dropIndicatorPosition, isExpandable) : null,\n [overId, visibleItems, visibleItemsDictionary, dropIndicatorPosition, isExpandable],\n );\n\n const dragPreviewHandlers = useTreePreviewHandlers({\n setActiveId,\n setOverId,\n setDropIndicatorPosition,\n });\n\n const dragActionHandlers = useTreeActionHandlers({\n ...dragPreviewHandlers,\n onReorder,\n projected,\n flattenedItems,\n dropIndicatorPosition,\n isDropValid,\n });\n\n const announcements = useTreeAnnouncements(visibleItemsDictionary, dropIndicatorPosition);\n\n const dndContextProps = useMemo(\n () => ({\n accessibility: {\n announcements,\n container: document.body,\n },\n modifiers,\n sensors,\n measuring,\n collisionDetection: customCollisionDetection(\n activeId,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ),\n ...dragActionHandlers,\n }),\n [\n announcements,\n modifiers,\n sensors,\n dragActionHandlers,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n activeId,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ],\n );\n\n const sortableContextProps = useMemo(\n () => ({\n items: sortedIds,\n strategy: () => null,\n }),\n [sortedIds],\n );\n\n return {\n dndContextProps,\n sortableContextProps,\n isDropValid,\n activeId,\n activeIndex: visibleItemsDictionary[activeId]?.realIndex ?? -1,\n overId,\n depth: projected ? projected.depth : 0,\n dropIndicatorPosition,\n visibleItems,\n };\n};\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADEvB,mBAA4D;AAC5D,kBAQO;AACP,oCAAuC;AACvC,wCAA2C;AAC3C,uBAAgD;AAChD,mCAAsC;AAEtC,uBAAsC;AACtC,sCAAyC;AACzC,kCAAqC;AAIrC,MAAM,kBAAkB,CAAC,iBAA0B,cAAkC;AACnF,QAAM,OAAiB,CAAC,EAAE,WAAW,gBAAgB,OAAO,MAAM;AAChE,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,IACL;AACA,QAAI,iBAAiB;AACnB,mBAAa,IAAI,UAAU,IAAI;AAAA,IACjC,OAAO;AACL,mBAAa,IAAI,UAAU,IAAI;AAC/B,UAAI,CAAC,SAAS,OAAO,EAAE,SAAU,gBAAkC,IAAI,GAAG;AACxE,cAAM,SAAS,QAAQ,OAAO,UAAU,UAAU,SAAS;AAC3D,cAAM,qBAAsB,SAAS,KAAK,MAAM,QAAQ,MAAM,SAAS,SAAS,UAAU,KAAM;AAChG,qBAAa,IAAI,UAAU,IAAI;AAAA,MACjC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,MAAM,YAA6C;AAAA,EACjD,WAAW;AAAA,IACT,UAAU,8BAAkB;AAAA,EAC9B;AACF;AAEO,MAAM,sBAA+C,CAAC;AAAA,EAC3D;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf;AAAA,EACA,iBAAiB,MAAM;AAAA,EACvB;AACF,MAAM;AACJ,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAiB,EAAE;AACnD,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAiB,EAAE;AAC/C,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,uBAAgC,uCAAsB,IAAI;AACpH,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAiB,EAAE;AAG3D,QAAM,mBAAe,sBAAQ,UAAM,mCAAiB,iBAAiB,QAAQ,GAAG,CAAC,iBAAiB,QAAQ,CAAC;AAG3G,QAAM,gBAAY,sBAAQ,MAAM,aAAa,IAAI,CAAC,SAAS,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC;AAOpF,QAAM,6BAAyB,sBAAQ,MAAM;AAE3C,UAAM,aAAqD,CAAC;AAC5D,iBAAa,QAAQ,CAAC,SAAS;AAC7B,iBAAW,KAAK,OAAO;AAAA,IACzB,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,kBAAc,sBAAQ,MAAM;AAChC,QAAI,CAAC,YAAY,CAAC;AAAQ,aAAO;AACjC,WAAO;AAAA,MACL,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,CAAC,QAAQ,UAAU,SAAS,QAAQ,EAAE;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,gBAAgB,wBAAwB,UAAU,QAAQ,qBAAqB,CAAC;AAEpF,QAAM,gBAAwB;AAAA,IAC5B,MAAM,CAAC,gBAAgB,iBAAiB,SAAS,CAAC;AAAA,IAClD,CAAC,iBAAiB,SAAS;AAAA,EAC7B;AAEA,QAAM,oBAA+B,qBAAO;AAAA,IAC1C,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF,CAAC;AAED,8BAAU,MAAM;AACd,kBAAc,UAAU;AAAA,MACtB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,cAAc,uBAAuB,wBAAwB,CAAC;AAElE,QAAM,uBAAmB;AAAA,IACvB,UAAM,8DAA2B,eAAe,iBAAiB,mBAAmB;AAAA,IACpF,CAAC,eAAe,iBAAiB,mBAAmB;AAAA,EACtD;AAEA,QAAM,cAAU;AAAA,QACd,uBAAU,yBAAa;AAAA,QACvB,uBAAU,4BAAgB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAGA,QAAM,gBAAY;AAAA,IAChB,MACE,aAAS,gCAAc,cAAc,wBAAwB,QAAQ,uBAAuB,YAAY,IAAI;AAAA,IAC9G,CAAC,QAAQ,cAAc,wBAAwB,uBAAuB,YAAY;AAAA,EACpF;AAEA,QAAM,0BAAsB,sDAAuB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,yBAAqB,oDAAsB;AAAA,IAC/C,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,oBAAgB,kDAAqB,wBAAwB,qBAAqB;AAExF,QAAM,sBAAkB;AAAA,IACtB,OAAO;AAAA,MACL,eAAe;AAAA,QACb;AAAA,QACA,WAAW,SAAS;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,wBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,2BAAuB;AAAA,IAC3B,OAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,MAAM;AAAA,IAClB;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,uBAAuB,WAAW,aAAa;AAAA,IAC5D;AAAA,IACA,OAAO,YAAY,UAAU,QAAQ;AAAA,IACrC;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/hierarchy/useHierarchyAnnouncements.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { Item } from './types';\n\nexport const useHierarchyAnnouncements = (visibleItemsDictionary: Record<string, Item>): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].index + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { Item } from './types';\n\nexport const useHierarchyAnnouncements = (visibleItemsDictionary: Record<string, Item>): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].index + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['onDragOver'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].index + 1;\n return `Draggable item was moved to position ${overIndex}.`;\n }\n\n return `Draggable item is no longer over a droppable area.`;\n },\n [visibleItemsDictionary],\n );\n\n const onDragOver: Announcements['onDragOver'] = onDragMove;\n\n const onDragEnd: Announcements['onDragEnd'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].index + 1;\n return `Draggable item was dropped over position ${overIndex}.`;\n }\n\n return `Draggable item was dropped at it's original position.`;\n },\n [visibleItemsDictionary],\n );\n\n const onDragCancel: Announcements['onDragCancel'] = useCallback(\n ({ active: { id } }) =>\n `Dragging was cancelled. Draggable item from position ${\n visibleItemsDictionary[id].index + 1\n } was dropped at it's initial position.`,\n [visibleItemsDictionary],\n );\n\n return { onDragStart, onDragOver, onDragMove, onDragEnd, onDragCancel };\n};\n"],
|
|
5
5
|
"mappings": "AAAA,YAAY,WAAW;ACCvB,SAAS,mBAAmB;AAGrB,MAAM,4BAA4B,CAAC,2BAAgE;AACxG,QAAM,cAA4C;AAAA,IAChD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,0CAA0C,uBAAuB,IAAI,QAAQ;AAAA,IACrG,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,aAA0C;AAAA,IAC9C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,QAAQ;AAC1D,eAAO,wCAAwC;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,aAA0C;AAEhD,QAAM,YAAwC;AAAA,IAC5C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,QAAQ;AAC1D,eAAO,4CAA4C;AAAA,MACrD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,eAA8C;AAAA,IAClD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAChB,wDACE,uBAAuB,IAAI,QAAQ;AAAA,IAEvC,CAAC,sBAAsB;AAAA,EACzB;AAEA,SAAO,EAAE,aAAa,YAAY,YAAY,WAAW,aAAa;AACxE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,23 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { DropIndicatorPosition } from "./constants";
|
|
3
|
-
const
|
|
4
|
-
const RECT_UP = {
|
|
5
|
-
top: -Infinity,
|
|
6
|
-
left: 0,
|
|
7
|
-
right: 0,
|
|
8
|
-
bottom: 0,
|
|
9
|
-
width: 0,
|
|
10
|
-
height: 0
|
|
11
|
-
};
|
|
12
|
-
const RECT_DOWN = {
|
|
13
|
-
top: Infinity,
|
|
14
|
-
left: 0,
|
|
15
|
-
right: 0,
|
|
16
|
-
bottom: 0,
|
|
17
|
-
width: 0,
|
|
18
|
-
height: 0
|
|
19
|
-
};
|
|
20
|
-
const thresholdRatio = 0.2;
|
|
3
|
+
const thresholdRatio = 0.75;
|
|
21
4
|
const insideThreshold = 0.7;
|
|
22
5
|
const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndicatorPosition, maxDragAndDropLevel, lastPosition, setLastPosition) => {
|
|
23
6
|
const func = ({ droppableContainers, collisionRect }) => {
|
|
@@ -28,39 +11,20 @@ const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndic
|
|
|
28
11
|
isUp = originalRect.top > collisionRect.top;
|
|
29
12
|
}
|
|
30
13
|
const threshold = collisionRect.height * thresholdRatio;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
{ id: DUMMY_ID, rect: { current: RECT_DOWN } }
|
|
46
|
-
);
|
|
47
|
-
} else {
|
|
48
|
-
collidingContainer = droppableContainers.reduce(
|
|
49
|
-
(firstRectUp, container) => {
|
|
50
|
-
const rect = container.rect.current;
|
|
51
|
-
if (rect && firstRectUp.rect.current) {
|
|
52
|
-
const { top: rectTop } = rect;
|
|
53
|
-
const { top: firstRectUpTop } = firstRectUp.rect.current;
|
|
54
|
-
if (rectTop - threshold < collisionRect.top && rectTop > firstRectUpTop) {
|
|
55
|
-
return container;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return firstRectUp;
|
|
59
|
-
},
|
|
60
|
-
{ id: DUMMY_ID, rect: { current: RECT_UP } }
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
if (collidingContainer.id === DUMMY_ID) {
|
|
14
|
+
const collidingContainer = droppableContainers.reduce((bestContainer, container) => {
|
|
15
|
+
const rect = container.rect.current;
|
|
16
|
+
if (!rect)
|
|
17
|
+
return bestContainer;
|
|
18
|
+
const bestContainerTop = bestContainer?.rect?.current?.top ?? 0;
|
|
19
|
+
if (isUp && collisionRect.top + threshold > rect.top && (bestContainer === null || rect.top > bestContainerTop)) {
|
|
20
|
+
return container;
|
|
21
|
+
}
|
|
22
|
+
if (!isUp && collisionRect.bottom - threshold < rect.bottom && (bestContainer === null || rect.top < bestContainerTop)) {
|
|
23
|
+
return container;
|
|
24
|
+
}
|
|
25
|
+
return bestContainer;
|
|
26
|
+
}, null);
|
|
27
|
+
if (collidingContainer === null) {
|
|
64
28
|
return [];
|
|
65
29
|
}
|
|
66
30
|
const collidingRect = collidingContainer.rect.current;
|
|
@@ -70,7 +34,7 @@ const customCollisionDetection = (activeId, visibleItemsDictionary, setDropIndic
|
|
|
70
34
|
Math.max(collisionRect.top, collidingRect.top),
|
|
71
35
|
Math.min(collisionRect.top + collisionRect.height, collidingRect.top + collidingRect.height)
|
|
72
36
|
];
|
|
73
|
-
const intersectionPercentage = Math.abs(bottom - top) / collidingRect.height;
|
|
37
|
+
const intersectionPercentage = Math.abs(bottom - top) / Math.min(collisionRect.height, collidingRect.height);
|
|
74
38
|
if (intersectionPercentage > insideThreshold && visibleItemsDictionary[collidingContainer.id].depth + 1 <= maxDragAndDropLevel && collidingContainer.id !== activeId) {
|
|
75
39
|
setDropIndicatorPosition(DropIndicatorPosition.Inside);
|
|
76
40
|
} else {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/tree/customCollisionDetection.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable complexity */\n/* eslint-disable @typescript-eslint/indent */\n/* eslint-disable max-params */\nimport {
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACKvB,SAAS,6BAA6B;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable complexity */\n/* eslint-disable @typescript-eslint/indent */\n/* eslint-disable max-params */\nimport { type CollisionDetection, type DroppableContainer } from '@dnd-kit/core';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\n// Percentage of height to take into consideration when looking for colliding rects\nconst thresholdRatio = 0.75;\n// Percentage to be inside\nconst insideThreshold = 0.7;\n\nexport const customCollisionDetection = (\n activeId: string,\n visibleItemsDictionary: Record<string, Item>,\n setDropIndicatorPosition: React.Dispatch<React.SetStateAction<DropIndicatorPosition>>,\n maxDragAndDropLevel: number,\n lastPosition: string,\n setLastPosition: React.Dispatch<React.SetStateAction<string>>,\n): CollisionDetection => {\n const func: CollisionDetection = ({ droppableContainers, collisionRect }) => {\n const originalContainer = droppableContainers.find(({ id }) => id === activeId);\n const originalRect = originalContainer?.rect?.current;\n\n // We first check if the item was moved up or down\n // This modifies how to search the matching colliding rect\n let isUp = lastPosition === 'up';\n if (originalRect) {\n isUp = originalRect.top > collisionRect.top;\n }\n\n const threshold = collisionRect.height * thresholdRatio;\n\n const collidingContainer = droppableContainers.reduce((bestContainer, container) => {\n const rect = container.rect.current;\n if (!rect) return bestContainer;\n const bestContainerTop = bestContainer?.rect?.current?.top ?? 0;\n if (isUp && collisionRect.top + threshold > rect.top && (bestContainer === null || rect.top > bestContainerTop)) {\n return container;\n }\n if (\n !isUp &&\n collisionRect.bottom - threshold < rect.bottom &&\n (bestContainer === null || rect.top < bestContainerTop)\n ) {\n return container;\n }\n return bestContainer;\n }, null as DroppableContainer | null);\n\n // If we didn't find a match, return empty array\n if (collidingContainer === null) {\n return [];\n }\n\n const collidingRect = collidingContainer.rect.current;\n\n if (!collidingRect) return [];\n\n // Calculate the intersection interval\n const [top, bottom] = [\n Math.max(collisionRect.top, collidingRect.top),\n Math.min(collisionRect.top + collisionRect.height, collidingRect.top + collidingRect.height),\n ];\n\n // Calculate the percentage of intersection\n const intersectionPercentage = Math.abs(bottom - top) / Math.min(collisionRect.height, collidingRect.height);\n\n if (\n intersectionPercentage > insideThreshold &&\n visibleItemsDictionary[collidingContainer.id].depth + 1 <= maxDragAndDropLevel &&\n collidingContainer.id !== activeId\n ) {\n setDropIndicatorPosition(DropIndicatorPosition.Inside);\n } else {\n setDropIndicatorPosition(isUp ? DropIndicatorPosition.Before : DropIndicatorPosition.After);\n }\n\n if (isUp && lastPosition !== 'up') setLastPosition('up');\n else if (!isUp && lastPosition !== 'down') setLastPosition('down');\n\n // Return the id of the match rectangle\n return [{ id: collidingContainer.id }];\n };\n return func;\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACKvB,SAAS,6BAA6B;AAItC,MAAM,iBAAiB;AAEvB,MAAM,kBAAkB;AAEjB,MAAM,2BAA2B,CACtC,UACA,wBACA,0BACA,qBACA,cACA,oBACuB;AACvB,QAAM,OAA2B,CAAC,EAAE,qBAAqB,cAAc,MAAM;AAC3E,UAAM,oBAAoB,oBAAoB,KAAK,CAAC,EAAE,GAAG,MAAM,OAAO,QAAQ;AAC9E,UAAM,eAAe,mBAAmB,MAAM;AAI9C,QAAI,OAAO,iBAAiB;AAC5B,QAAI,cAAc;AAChB,aAAO,aAAa,MAAM,cAAc;AAAA,IAC1C;AAEA,UAAM,YAAY,cAAc,SAAS;AAEzC,UAAM,qBAAqB,oBAAoB,OAAO,CAAC,eAAe,cAAc;AAClF,YAAM,OAAO,UAAU,KAAK;AAC5B,UAAI,CAAC;AAAM,eAAO;AAClB,YAAM,mBAAmB,eAAe,MAAM,SAAS,OAAO;AAC9D,UAAI,QAAQ,cAAc,MAAM,YAAY,KAAK,QAAQ,kBAAkB,QAAQ,KAAK,MAAM,mBAAmB;AAC/G,eAAO;AAAA,MACT;AACA,UACE,CAAC,QACD,cAAc,SAAS,YAAY,KAAK,WACvC,kBAAkB,QAAQ,KAAK,MAAM,mBACtC;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,GAAG,IAAiC;AAGpC,QAAI,uBAAuB,MAAM;AAC/B,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,gBAAgB,mBAAmB,KAAK;AAE9C,QAAI,CAAC;AAAe,aAAO,CAAC;AAG5B,UAAM,CAAC,KAAK,MAAM,IAAI;AAAA,MACpB,KAAK,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,MAC7C,KAAK,IAAI,cAAc,MAAM,cAAc,QAAQ,cAAc,MAAM,cAAc,MAAM;AAAA,IAC7F;AAGA,UAAM,yBAAyB,KAAK,IAAI,SAAS,GAAG,IAAI,KAAK,IAAI,cAAc,QAAQ,cAAc,MAAM;AAE3G,QACE,yBAAyB,mBACzB,uBAAuB,mBAAmB,IAAI,QAAQ,KAAK,uBAC3D,mBAAmB,OAAO,UAC1B;AACA,+BAAyB,sBAAsB,MAAM;AAAA,IACvD,OAAO;AACL,+BAAyB,OAAO,sBAAsB,SAAS,sBAAsB,KAAK;AAAA,IAC5F;AAEA,QAAI,QAAQ,iBAAiB;AAAM,sBAAgB,IAAI;AAAA,aAC9C,CAAC,QAAQ,iBAAiB;AAAQ,sBAAgB,MAAM;AAGjE,WAAO,CAAC,EAAE,IAAI,mBAAmB,GAAG,CAAC;AAAA,EACvC;AACA,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/tree/useTreeAnnouncements.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\nexport const useTreeAnnouncements = (\n visibleItemsDictionary: Record<string, Item>,\n dropIndicatorPosition: DropIndicatorPosition,\n): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].realIndex + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { Announcements } from '@dnd-kit/core';\nimport { useCallback } from 'react';\nimport { DropIndicatorPosition } from './constants';\nimport { Item } from './types';\n\nexport const useTreeAnnouncements = (\n visibleItemsDictionary: Record<string, Item>,\n dropIndicatorPosition: DropIndicatorPosition,\n): Announcements => {\n const onDragStart: Announcements['onDragStart'] = useCallback(\n ({ active: { id } }) => `Picked up draggable item from position ${visibleItemsDictionary[id].realIndex + 1}.`,\n [visibleItemsDictionary],\n );\n\n const onDragMove: Announcements['onDragOver'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].realIndex + 1;\n if (dropIndicatorPosition === DropIndicatorPosition.Inside) {\n return `Draggable item was moved inside the item at position ${overIndex}.`;\n }\n if (dropIndicatorPosition === DropIndicatorPosition.Before) {\n return `Draggable item was moved to position ${overIndex - 1}.`;\n }\n return `Draggable item was moved to position ${overIndex}.`;\n }\n\n return `Draggable item is no longer over a droppable area.`;\n },\n [visibleItemsDictionary, dropIndicatorPosition],\n );\n\n const onDragOver: Announcements['onDragOver'] = onDragMove;\n\n const onDragEnd: Announcements['onDragEnd'] = useCallback(\n ({ over }) => {\n if (over) {\n const overIndex = visibleItemsDictionary[over.id].realIndex + 1;\n if (dropIndicatorPosition === DropIndicatorPosition.Inside) {\n return `Draggable item was dropped inside the item at position ${overIndex}.`;\n }\n if (dropIndicatorPosition === DropIndicatorPosition.Before) {\n return `Draggable item was dropped over position ${overIndex - 1}.`;\n }\n return `Draggable item was dropped over position ${overIndex}.`;\n }\n\n return `Draggable item was dropped at it's original position.`;\n },\n [dropIndicatorPosition, visibleItemsDictionary],\n );\n\n const onDragCancel: Announcements['onDragCancel'] = useCallback(\n ({ active: { id } }) =>\n `Dragging was cancelled. Draggable item from position ${\n visibleItemsDictionary[id].realIndex + 1\n } was dropped at it's initial position.`,\n [visibleItemsDictionary],\n );\n\n return { onDragStart, onDragOver, onDragMove, onDragEnd, onDragCancel };\n};\n"],
|
|
5
5
|
"mappings": "AAAA,YAAY,WAAW;ACCvB,SAAS,mBAAmB;AAC5B,SAAS,6BAA6B;AAG/B,MAAM,uBAAuB,CAClC,wBACA,0BACkB;AAClB,QAAM,cAA4C;AAAA,IAChD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,0CAA0C,uBAAuB,IAAI,YAAY;AAAA,IACzG,CAAC,sBAAsB;AAAA,EACzB;AAEA,QAAM,aAA0C;AAAA,IAC9C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,YAAY;AAC9D,YAAI,0BAA0B,sBAAsB,QAAQ;AAC1D,iBAAO,wDAAwD;AAAA,QACjE;AACA,YAAI,0BAA0B,sBAAsB,QAAQ;AAC1D,iBAAO,wCAAwC,YAAY;AAAA,QAC7D;AACA,eAAO,wCAAwC;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,wBAAwB,qBAAqB;AAAA,EAChD;AAEA,QAAM,aAA0C;AAEhD,QAAM,YAAwC;AAAA,IAC5C,CAAC,EAAE,KAAK,MAAM;AACZ,UAAI,MAAM;AACR,cAAM,YAAY,uBAAuB,KAAK,IAAI,YAAY;AAC9D,YAAI,0BAA0B,sBAAsB,QAAQ;AAC1D,iBAAO,0DAA0D;AAAA,QACnE;AACA,YAAI,0BAA0B,sBAAsB,QAAQ;AAC1D,iBAAO,4CAA4C,YAAY;AAAA,QACjE;AACA,eAAO,4CAA4C;AAAA,MACrD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,CAAC,uBAAuB,sBAAsB;AAAA,EAChD;AAEA,QAAM,eAA8C;AAAA,IAClD,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAChB,wDACE,uBAAuB,IAAI,YAAY;AAAA,IAE3C,CAAC,sBAAsB;AAAA,EACzB;AAEA,SAAO,EAAE,aAAa,YAAY,YAAY,WAAW,aAAa;AACxE;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/tree/useTreeDndkitConfig.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable max-lines */\nimport { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n useSensor,\n useSensors,\n KeyboardSensor,\n PointerSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n Modifier,\n} from '@dnd-kit/core';\nimport { useTreePreviewHandlers } from './useTreePreviewHandlers';\nimport { getTreeKeyboardCoordinates } from './getTreeKeyboardCoordinates';\nimport { getProjection, removeChildrenOf } from './utilities';\nimport { useTreeActionHandlers } from './useTreeActionHandlers';\nimport type { UseTreeDndkitConfigType, SensorContext } from './types';\nimport { DropIndicatorPosition } from './constants';\nimport { customCollisionDetection } from './customCollisionDetection';\nimport { useTreeAnnouncements } from './useTreeAnnouncements';\n\n// we make space for the drop indicator\n// if second parameter is true, the space will be done on the horizontal axis\nconst adjustTranslate = (isHorizontalDnD: boolean, sortedIds: string[]): Modifier => {\n const func: Modifier = ({ transform, activatorEvent, active }) => {\n const newTransform = {\n ...transform,\n };\n if (isHorizontalDnD) {\n newTransform.x = transform.x + 25;\n } else {\n newTransform.x = transform.x + 15;\n if (['Enter', 'Space'].includes(activatorEvent?.code)) {\n const isLast = active?.id === sortedIds[sortedIds.length - 1];\n const keyboardTranslate = ((isLast ? -1 : 1) * (active?.rect?.current?.initial?.height ?? 0)) / 2;\n newTransform.y = transform.y + keyboardTranslate;\n }\n }\n return newTransform;\n };\n return func;\n};\n\nconst measuring: Partial<MeasuringConfiguration> = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nexport const useTreeDndkitConfig: UseTreeDndkitConfigType = ({\n flattenedItems,\n visibleItems: preVisibleItems,\n isHorizontalDnD = false,\n isExpandable = false,\n onReorder,\n getIsDropValid = () => true,\n maxDragAndDropLevel,\n}) => {\n const [activeId, setActiveId] = useState<string>('');\n const [overId, setOverId] = useState<string>('');\n const [dropIndicatorPosition, setDropIndicatorPosition] = useState<DropIndicatorPosition>(DropIndicatorPosition.None);\n const [lastPosition, setLastPosition] = useState<string>('');\n\n // Remove activeId's children\n const visibleItems = useMemo(() => removeChildrenOf(preVisibleItems, activeId), [preVisibleItems, activeId]);\n\n // Sorted ids for the library\n const sortedIds = useMemo(() => visibleItems.map((item) => item.uid), [visibleItems]);\n\n /**\n * Dictionary from UID to ITEM\n * This dictionary is computed since on every DnD move, I need to know the\n * depth of a particular row, so O(1) per DnD move instead of O(#ITEMS)\n */\n const visibleItemsDictionary = useMemo(() => {\n // Using plain for to achieve O(#ITEMS) performance\n const dictionary: Record<string, typeof visibleItems[0]> = {};\n visibleItems.forEach((item) => {\n dictionary[item.uid] = item;\n });\n return dictionary;\n }, [visibleItems]);\n\n const isDropValid = useMemo(() => {\n if (!activeId || !overId) return true;\n return getIsDropValid(\n visibleItemsDictionary[activeId],\n visibleItemsDictionary[overId],\n ['none', 'before', 'after', 'inside'][dropIndicatorPosition] as Parameters<typeof getIsDropValid>[2],\n );\n }, [getIsDropValid, visibleItemsDictionary, activeId, overId, dropIndicatorPosition]);\n\n const modifiers: Modifier[] = useMemo(\n () => [adjustTranslate(isHorizontalDnD, sortedIds)],\n [isHorizontalDnD, sortedIds],\n );\n\n const sensorContext: SensorContext = useRef({\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n });\n\n useEffect(() => {\n sensorContext.current = {\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n };\n }, [visibleItems, dropIndicatorPosition, setDropIndicatorPosition]);\n\n const coordinateGetter = useMemo(\n () => getTreeKeyboardCoordinates(sensorContext, isHorizontalDnD, maxDragAndDropLevel),\n [sensorContext, isHorizontalDnD, maxDragAndDropLevel],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n );\n\n // where is the activeItem being positioned (depth and parent)\n const projected = useMemo(\n () =>\n overId ? getProjection(visibleItems, visibleItemsDictionary, overId, dropIndicatorPosition, isExpandable) : null,\n [overId, visibleItems, visibleItemsDictionary, dropIndicatorPosition, isExpandable],\n );\n\n const dragPreviewHandlers = useTreePreviewHandlers({\n setActiveId,\n setOverId,\n setDropIndicatorPosition,\n });\n\n const dragActionHandlers = useTreeActionHandlers({\n ...dragPreviewHandlers,\n onReorder,\n projected,\n flattenedItems,\n dropIndicatorPosition,\n isDropValid,\n });\n\n const announcements = useTreeAnnouncements(visibleItemsDictionary, dropIndicatorPosition);\n\n const dndContextProps = useMemo(\n () => ({\n accessibility: {\n announcements,\n container: document.body,\n },\n modifiers,\n sensors,\n measuring,\n collisionDetection: customCollisionDetection(\n activeId,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ),\n ...dragActionHandlers,\n }),\n [\n announcements,\n modifiers,\n sensors,\n dragActionHandlers,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n activeId,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ],\n );\n\n const sortableContextProps = useMemo(\n () => ({\n items: sortedIds,\n strategy: () => null,\n }),\n [sortedIds],\n );\n\n return {\n dndContextProps,\n sortableContextProps,\n isDropValid,\n activeId,\n activeIndex: visibleItemsDictionary[activeId]?.realIndex ?? -1,\n overId,\n depth: projected ? projected.depth : 0,\n dropIndicatorPosition,\n visibleItems,\n };\n};\n"],
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACEvB,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-statements */\n/* eslint-disable max-lines */\nimport React, { useState, useEffect, useMemo, useRef } from 'react';\nimport {\n useSensor,\n useSensors,\n KeyboardSensor,\n PointerSensor,\n MeasuringConfiguration,\n MeasuringStrategy,\n Modifier,\n} from '@dnd-kit/core';\nimport { useTreePreviewHandlers } from './useTreePreviewHandlers';\nimport { getTreeKeyboardCoordinates } from './getTreeKeyboardCoordinates';\nimport { getProjection, removeChildrenOf } from './utilities';\nimport { useTreeActionHandlers } from './useTreeActionHandlers';\nimport type { UseTreeDndkitConfigType, SensorContext } from './types';\nimport { DropIndicatorPosition } from './constants';\nimport { customCollisionDetection } from './customCollisionDetection';\nimport { useTreeAnnouncements } from './useTreeAnnouncements';\n\n// we make space for the drop indicator\n// if second parameter is true, the space will be done on the horizontal axis\nconst adjustTranslate = (isHorizontalDnD: boolean, sortedIds: string[]): Modifier => {\n const func: Modifier = ({ transform, activatorEvent, active }) => {\n const newTransform = {\n ...transform,\n };\n if (isHorizontalDnD) {\n newTransform.x = transform.x + 25;\n } else {\n newTransform.x = transform.x + 15;\n if (['Enter', 'Space'].includes((activatorEvent as KeyboardEvent)?.code)) {\n const isLast = active?.id === sortedIds[sortedIds.length - 1];\n const keyboardTranslate = ((isLast ? -1 : 1) * (active?.rect?.current?.initial?.height ?? 0)) / 2;\n newTransform.y = transform.y + keyboardTranslate;\n }\n }\n return newTransform;\n };\n return func;\n};\n\nconst measuring: Partial<MeasuringConfiguration> = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nexport const useTreeDndkitConfig: UseTreeDndkitConfigType = ({\n flattenedItems,\n visibleItems: preVisibleItems,\n isHorizontalDnD = false,\n isExpandable = false,\n onReorder,\n getIsDropValid = () => true,\n maxDragAndDropLevel,\n}) => {\n const [activeId, setActiveId] = useState<string>('');\n const [overId, setOverId] = useState<string>('');\n const [dropIndicatorPosition, setDropIndicatorPosition] = useState<DropIndicatorPosition>(DropIndicatorPosition.None);\n const [lastPosition, setLastPosition] = useState<string>('');\n\n // Remove activeId's children\n const visibleItems = useMemo(() => removeChildrenOf(preVisibleItems, activeId), [preVisibleItems, activeId]);\n\n // Sorted ids for the library\n const sortedIds = useMemo(() => visibleItems.map((item) => item.uid), [visibleItems]);\n\n /**\n * Dictionary from UID to ITEM\n * This dictionary is computed since on every DnD move, I need to know the\n * depth of a particular row, so O(1) per DnD move instead of O(#ITEMS)\n */\n const visibleItemsDictionary = useMemo(() => {\n // Using plain for to achieve O(#ITEMS) performance\n const dictionary: Record<string, typeof visibleItems[0]> = {};\n visibleItems.forEach((item) => {\n dictionary[item.uid] = item;\n });\n return dictionary;\n }, [visibleItems]);\n\n const isDropValid = useMemo(() => {\n if (!activeId || !overId) return true;\n return getIsDropValid(\n visibleItemsDictionary[activeId],\n visibleItemsDictionary[overId],\n ['none', 'before', 'after', 'inside'][dropIndicatorPosition] as Parameters<typeof getIsDropValid>[2],\n );\n }, [getIsDropValid, visibleItemsDictionary, activeId, overId, dropIndicatorPosition]);\n\n const modifiers: Modifier[] = useMemo(\n () => [adjustTranslate(isHorizontalDnD, sortedIds)],\n [isHorizontalDnD, sortedIds],\n );\n\n const sensorContext: SensorContext = useRef({\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n });\n\n useEffect(() => {\n sensorContext.current = {\n items: visibleItems,\n dropIndicatorPosition,\n setDropIndicatorPosition,\n };\n }, [visibleItems, dropIndicatorPosition, setDropIndicatorPosition]);\n\n const coordinateGetter = useMemo(\n () => getTreeKeyboardCoordinates(sensorContext, isHorizontalDnD, maxDragAndDropLevel),\n [sensorContext, isHorizontalDnD, maxDragAndDropLevel],\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter,\n }),\n );\n\n // where is the activeItem being positioned (depth and parent)\n const projected = useMemo(\n () =>\n overId ? getProjection(visibleItems, visibleItemsDictionary, overId, dropIndicatorPosition, isExpandable) : null,\n [overId, visibleItems, visibleItemsDictionary, dropIndicatorPosition, isExpandable],\n );\n\n const dragPreviewHandlers = useTreePreviewHandlers({\n setActiveId,\n setOverId,\n setDropIndicatorPosition,\n });\n\n const dragActionHandlers = useTreeActionHandlers({\n ...dragPreviewHandlers,\n onReorder,\n projected,\n flattenedItems,\n dropIndicatorPosition,\n isDropValid,\n });\n\n const announcements = useTreeAnnouncements(visibleItemsDictionary, dropIndicatorPosition);\n\n const dndContextProps = useMemo(\n () => ({\n accessibility: {\n announcements,\n container: document.body,\n },\n modifiers,\n sensors,\n measuring,\n collisionDetection: customCollisionDetection(\n activeId,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ),\n ...dragActionHandlers,\n }),\n [\n announcements,\n modifiers,\n sensors,\n dragActionHandlers,\n visibleItemsDictionary,\n setDropIndicatorPosition,\n activeId,\n maxDragAndDropLevel,\n lastPosition,\n setLastPosition,\n ],\n );\n\n const sortableContextProps = useMemo(\n () => ({\n items: sortedIds,\n strategy: () => null,\n }),\n [sortedIds],\n );\n\n return {\n dndContextProps,\n sortableContextProps,\n isDropValid,\n activeId,\n activeIndex: visibleItemsDictionary[activeId]?.realIndex ?? -1,\n overId,\n depth: projected ? projected.depth : 0,\n dropIndicatorPosition,\n visibleItems,\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elliemae/ds-drag-and-drop",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.2-rc.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "ICE MT - Dimsum - Drag And Drop",
|
|
6
6
|
"files": [
|
|
@@ -118,7 +118,7 @@
|
|
|
118
118
|
},
|
|
119
119
|
"publishConfig": {
|
|
120
120
|
"access": "public",
|
|
121
|
-
"typeSafety":
|
|
121
|
+
"typeSafety": true
|
|
122
122
|
},
|
|
123
123
|
"scripts": {
|
|
124
124
|
"dev": "cross-env NODE_ENV=development node ../../scripts/build/build.mjs --watch",
|