@elliemae/ds-treeview 2.3.0-alpha.2 → 2.3.0-alpha.3

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.
Files changed (93) hide show
  1. package/cjs/TreeView.js +1 -3
  2. package/cjs/TreeView.js.map +2 -2
  3. package/cjs/TreeViewContext.js +2 -8
  4. package/cjs/TreeViewContext.js.map +2 -2
  5. package/cjs/config/useTreeview.js +14 -28
  6. package/cjs/config/useTreeview.js.map +2 -2
  7. package/cjs/hoc/DnDTreeContext.js +45 -0
  8. package/cjs/hoc/DnDTreeContext.js.map +7 -0
  9. package/cjs/hoc/SortableItemContext.js +46 -0
  10. package/cjs/hoc/SortableItemContext.js.map +7 -0
  11. package/cjs/hoc/WithConditionalDnDContext.js +128 -0
  12. package/cjs/hoc/WithConditionalDnDContext.js.map +7 -0
  13. package/cjs/hoc/WithDnDSortableItemContext.js +69 -0
  14. package/cjs/hoc/WithDnDSortableItemContext.js.map +7 -0
  15. package/cjs/parts/DnDHandle.js +57 -0
  16. package/cjs/parts/DnDHandle.js.map +7 -0
  17. package/cjs/parts/DropIndicator.js +80 -0
  18. package/cjs/parts/DropIndicator.js.map +7 -0
  19. package/cjs/parts/TreeItem.js +37 -62
  20. package/cjs/parts/TreeItem.js.map +2 -2
  21. package/cjs/parts/TreeList.js +13 -18
  22. package/cjs/parts/TreeList.js.map +2 -2
  23. package/cjs/plugins/dnd/TreeDndPlugin.js +0 -24
  24. package/cjs/plugins/dnd/TreeDndPlugin.js.map +2 -2
  25. package/cjs/react-desc-prop-types.js +1 -0
  26. package/cjs/react-desc-prop-types.js.map +2 -2
  27. package/cjs/sharedTypes.js.map +1 -1
  28. package/cjs/utils/keyboard-helpers.js +7 -7
  29. package/cjs/utils/keyboard-helpers.js.map +2 -2
  30. package/cjs/utils/refs-helpers.js.map +1 -1
  31. package/cjs/utils/tree-helpers.js +21 -1
  32. package/cjs/utils/tree-helpers.js.map +2 -2
  33. package/cjs/utils/useTree.js +3 -1
  34. package/cjs/utils/useTree.js.map +2 -2
  35. package/esm/TreeView.js +1 -3
  36. package/esm/TreeView.js.map +2 -2
  37. package/esm/TreeViewContext.js +2 -8
  38. package/esm/TreeViewContext.js.map +2 -2
  39. package/esm/config/useTreeview.js +15 -29
  40. package/esm/config/useTreeview.js.map +2 -2
  41. package/esm/hoc/DnDTreeContext.js +16 -0
  42. package/esm/hoc/DnDTreeContext.js.map +7 -0
  43. package/esm/hoc/SortableItemContext.js +17 -0
  44. package/esm/hoc/SortableItemContext.js.map +7 -0
  45. package/esm/hoc/WithConditionalDnDContext.js +99 -0
  46. package/esm/hoc/WithConditionalDnDContext.js.map +7 -0
  47. package/esm/hoc/WithDnDSortableItemContext.js +40 -0
  48. package/esm/hoc/WithDnDSortableItemContext.js.map +7 -0
  49. package/esm/parts/DnDHandle.js +28 -0
  50. package/esm/parts/DnDHandle.js.map +7 -0
  51. package/esm/parts/DropIndicator.js +51 -0
  52. package/esm/parts/DropIndicator.js.map +7 -0
  53. package/esm/parts/TreeItem.js +37 -62
  54. package/esm/parts/TreeItem.js.map +2 -2
  55. package/esm/parts/TreeList.js +12 -17
  56. package/esm/parts/TreeList.js.map +2 -2
  57. package/esm/plugins/dnd/TreeDndPlugin.js +0 -24
  58. package/esm/plugins/dnd/TreeDndPlugin.js.map +2 -2
  59. package/esm/react-desc-prop-types.js +1 -0
  60. package/esm/react-desc-prop-types.js.map +2 -2
  61. package/esm/utils/keyboard-helpers.js +7 -7
  62. package/esm/utils/keyboard-helpers.js.map +2 -2
  63. package/esm/utils/refs-helpers.js.map +1 -1
  64. package/esm/utils/tree-helpers.js +21 -1
  65. package/esm/utils/tree-helpers.js.map +2 -2
  66. package/esm/utils/useTree.js +4 -2
  67. package/esm/utils/useTree.js.map +2 -2
  68. package/package.json +34 -18
  69. package/types/hoc/DnDTreeContext.d.ts +14 -0
  70. package/types/hoc/SortableItemContext.d.ts +19 -0
  71. package/types/hoc/WithConditionalDnDContext.d.ts +4 -0
  72. package/types/hoc/WithDnDSortableItemContext.d.ts +4 -0
  73. package/types/parts/DnDHandle.d.ts +6 -0
  74. package/types/parts/DropIndicator.d.ts +10 -0
  75. package/types/parts/TreeItem.d.ts +4 -11
  76. package/types/parts/TreeList.d.ts +0 -4
  77. package/types/plugins/dnd/TreeDndPlugin.d.ts +0 -2
  78. package/types/react-desc-prop-types.d.ts +17 -3
  79. package/types/sharedTypes.d.ts +1 -8
  80. package/types/utils/keyboard-helpers.d.ts +2 -1
  81. package/types/utils/refs-helpers.d.ts +1 -1
  82. package/types/utils/tree-helpers.d.ts +4 -1
  83. package/types/utils/useTree.d.ts +1 -0
  84. package/cjs/utils/dnd-helpers.js +0 -146
  85. package/cjs/utils/dnd-helpers.js.map +0 -7
  86. package/cjs/utils/useDnDHelpers.js +0 -199
  87. package/cjs/utils/useDnDHelpers.js.map +0 -7
  88. package/esm/utils/dnd-helpers.js +0 -117
  89. package/esm/utils/dnd-helpers.js.map +0 -7
  90. package/esm/utils/useDnDHelpers.js +0 -170
  91. package/esm/utils/useDnDHelpers.js.map +0 -7
  92. package/types/utils/dnd-helpers.d.ts +0 -39
  93. package/types/utils/useDnDHelpers.d.ts +0 -26
@@ -1,117 +0,0 @@
1
- import * as React from "react";
2
- import { getItemsParentNode, itemsShareSameParent } from "./tree-helpers";
3
- const keyCodes = {
4
- lift: [32, 13],
5
- drop: [32, 13],
6
- cancel: [27],
7
- up: [38, 37],
8
- down: [40, 39]
9
- };
10
- const sameParentAsHoverItemDrop = ({
11
- isBefore,
12
- isAfter,
13
- draggedItem,
14
- overItem,
15
- movementDirection
16
- }) => {
17
- const hoveredItemNodeNestedIndex = overItem.node.getIndex();
18
- let newParentNode = getItemsParentNode([overItem], true);
19
- const { treeDepth: draggedItemTreeDepth } = draggedItem;
20
- const { treeDepth: overItemTreeDepth } = overItem;
21
- const directionOffset = draggedItemTreeDepth <= overItemTreeDepth && movementDirection === "topToBottom" ? -1 : 0;
22
- let newNestedIndex;
23
- if (isBefore)
24
- newNestedIndex = hoveredItemNodeNestedIndex + directionOffset;
25
- else if (isAfter)
26
- newNestedIndex = hoveredItemNodeNestedIndex + 1 + directionOffset;
27
- else {
28
- newNestedIndex = overItem.children.length;
29
- newParentNode = overItem.node;
30
- }
31
- if (newNestedIndex < 0)
32
- newNestedIndex = 0;
33
- return {
34
- newNestedIndex,
35
- newParentNode
36
- };
37
- };
38
- const inferHoverItemKinshipDrop = ({
39
- isBefore,
40
- isAfter,
41
- draggedItem,
42
- overItem,
43
- movementDirection
44
- }) => {
45
- const hoverItemModel = overItem.node.model;
46
- const isGroupAndIsExpanded = hoverItemModel.isExpanded && hoverItemModel.children.length > 0;
47
- if (isAfter && isGroupAndIsExpanded) {
48
- return {
49
- newNestedIndex: 0,
50
- newParentNode: overItem.node
51
- };
52
- }
53
- if (isBefore || isAfter && !isGroupAndIsExpanded) {
54
- return sameParentAsHoverItemDrop({
55
- isBefore,
56
- isAfter,
57
- draggedItem,
58
- overItem,
59
- movementDirection
60
- });
61
- }
62
- return {
63
- newNestedIndex: overItem.children.length,
64
- newParentNode: overItem.node
65
- };
66
- };
67
- const isDropValid = ({
68
- isBefore,
69
- isAfter,
70
- draggedItem,
71
- overItem,
72
- restrictDragAndDrop
73
- }) => {
74
- const { id: movedId } = draggedItem;
75
- const { id: hoverId } = overItem;
76
- const isInside = !isBefore && !isAfter;
77
- if (movedId === hoverId)
78
- return false;
79
- if (isInside && !overItem.isGroup) {
80
- return false;
81
- }
82
- if (restrictDragAndDrop) {
83
- if (isInside)
84
- return false;
85
- const sameParent = itemsShareSameParent([draggedItem, overItem]);
86
- if (overItem.node.model.isExpanded && isAfter)
87
- return false;
88
- if (!sameParent)
89
- return false;
90
- }
91
- return true;
92
- };
93
- const inferKeyboardKinshipDrop = ({
94
- items,
95
- newIndex
96
- }) => {
97
- const kinship = {};
98
- const itemBefore = items[newIndex];
99
- const itemBeforeModel = itemBefore.node.model;
100
- const isGroupAndIsExpanded = itemBeforeModel.isExpanded && itemBeforeModel.children.length > 0;
101
- if (isGroupAndIsExpanded) {
102
- kinship.newParentNode = itemBefore.node;
103
- kinship.newNestedIndex = 0;
104
- } else {
105
- kinship.newParentNode = getItemsParentNode([itemBefore], true);
106
- kinship.newNestedIndex = itemBefore.node.getIndex();
107
- }
108
- return kinship;
109
- };
110
- export {
111
- inferHoverItemKinshipDrop,
112
- inferKeyboardKinshipDrop,
113
- isDropValid,
114
- keyCodes,
115
- sameParentAsHoverItemDrop
116
- };
117
- //# sourceMappingURL=dnd-helpers.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/utils/dnd-helpers.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\nimport { getItemsParentNode, itemsShareSameParent } from './tree-helpers';\nimport type { DSTreeviewT } from '../react-desc-prop-types';\nimport type { DSTreeviewInternalsT } from '../sharedTypes';\n\ninterface MetaInfoT {\n isBefore: boolean;\n isAfter: boolean;\n draggedItem: DSTreeviewT.Item;\n overItem: DSTreeviewT.Item;\n}\ninterface KinshipT {\n newParentNode: DSTreeviewT.Item['node'];\n newNestedIndex: number;\n}\n\nexport const keyCodes = {\n lift: [32, 13],\n drop: [32, 13],\n cancel: [27],\n up: [38, 37],\n down: [40, 39],\n};\n\nexport const sameParentAsHoverItemDrop = ({\n isBefore,\n isAfter,\n\n draggedItem,\n overItem,\n movementDirection,\n}: MetaInfoT & { movementDirection: DSTreeviewInternalsT.DnDMovementDirectionT }) => {\n const hoveredItemNodeNestedIndex = overItem.node.getIndex();\n let newParentNode = getItemsParentNode([overItem], true);\n\n const { treeDepth: draggedItemTreeDepth } = draggedItem;\n const { treeDepth: overItemTreeDepth } = overItem;\n const directionOffset =\n // we don't apply the offset for direction\n // if moving from less nested to more nested\n // or moving bottom to top\n // the offset is required when moving elemnts down in their nest level\n (draggedItemTreeDepth as number) <= (overItemTreeDepth as number) && movementDirection === 'topToBottom' ? -1 : 0;\n let newNestedIndex;\n\n if (isBefore) newNestedIndex = hoveredItemNodeNestedIndex + directionOffset;\n else if (isAfter) newNestedIndex = hoveredItemNodeNestedIndex + 1 + directionOffset;\n else {\n newNestedIndex = overItem.children.length; // append as last child of the group\n newParentNode = overItem.node;\n }\n if (newNestedIndex < 0) newNestedIndex = 0;\n return {\n newNestedIndex,\n newParentNode,\n };\n};\n\nexport const inferHoverItemKinshipDrop = ({\n isBefore,\n isAfter,\n\n draggedItem,\n overItem,\n movementDirection,\n}: MetaInfoT & { movementDirection: DSTreeviewInternalsT.DnDMovementDirectionT }) => {\n const hoverItemModel = overItem.node.model;\n const isGroupAndIsExpanded = hoverItemModel.isExpanded && hoverItemModel.children.length > 0;\n\n if (isAfter && isGroupAndIsExpanded) {\n return {\n newNestedIndex: 0, // append after the group, so basically as first child\n newParentNode: overItem.node,\n };\n }\n\n if (isBefore || (isAfter && !isGroupAndIsExpanded)) {\n return sameParentAsHoverItemDrop({\n isBefore,\n isAfter,\n draggedItem,\n overItem,\n movementDirection,\n });\n }\n\n // drop inside\n return {\n newNestedIndex: overItem.children.length, // append as last child of the group\n newParentNode: overItem.node,\n };\n};\n\nexport const isDropValid = ({\n isBefore,\n isAfter,\n\n draggedItem,\n overItem,\n\n restrictDragAndDrop,\n}: MetaInfoT & { restrictDragAndDrop: boolean }) => {\n const { id: movedId } = draggedItem;\n const { id: hoverId } = overItem;\n const isInside = !isBefore && !isAfter;\n\n if (movedId === hoverId) return false;\n\n if (isInside && !overItem.isGroup) {\n return false; // we can't drop inside an item that isn't a group\n }\n\n if (restrictDragAndDrop) {\n if (isInside) return false; // in this mode we can't drop inside another element\n const sameParent = itemsShareSameParent([draggedItem, overItem]);\n if (overItem.node.model.isExpanded && isAfter) return false;\n if (!sameParent) return false;\n }\n\n return true;\n};\n\nexport const inferKeyboardKinshipDrop = ({\n items,\n\n newIndex,\n}: {\n items: DSTreeviewT.Item[];\n newIndex: number;\n}) => {\n const kinship: Partial<KinshipT> = {};\n\n const itemBefore = items[newIndex];\n\n const itemBeforeModel = itemBefore.node.model;\n const isGroupAndIsExpanded = itemBeforeModel.isExpanded && itemBeforeModel.children.length > 0;\n\n if (isGroupAndIsExpanded) {\n kinship.newParentNode = itemBefore.node;\n kinship.newNestedIndex = 0;\n } else {\n kinship.newParentNode = getItemsParentNode([itemBefore], true);\n kinship.newNestedIndex = itemBefore.node.getIndex();\n }\n\n return kinship;\n};\n"],
5
- "mappings": "AAAA;ACCA;AAeO,MAAM,WAAW;AAAA,EACtB,MAAM,CAAC,IAAI;AAAA,EACX,MAAM,CAAC,IAAI;AAAA,EACX,QAAQ,CAAC;AAAA,EACT,IAAI,CAAC,IAAI;AAAA,EACT,MAAM,CAAC,IAAI;AAAA;AAGN,MAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,MACmF;AACnF,QAAM,6BAA6B,SAAS,KAAK;AACjD,MAAI,gBAAgB,mBAAmB,CAAC,WAAW;AAEnD,QAAM,EAAE,WAAW,yBAAyB;AAC5C,QAAM,EAAE,WAAW,sBAAsB;AACzC,QAAM,kBAKH,wBAAoC,qBAAgC,sBAAsB,gBAAgB,KAAK;AAClH,MAAI;AAEJ,MAAI;AAAU,qBAAiB,6BAA6B;AAAA,WACnD;AAAS,qBAAiB,6BAA6B,IAAI;AAAA,OAC/D;AACH,qBAAiB,SAAS,SAAS;AACnC,oBAAgB,SAAS;AAAA;AAE3B,MAAI,iBAAiB;AAAG,qBAAiB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA;AAAA;AAIG,MAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,MACmF;AACnF,QAAM,iBAAiB,SAAS,KAAK;AACrC,QAAM,uBAAuB,eAAe,cAAc,eAAe,SAAS,SAAS;AAE3F,MAAI,WAAW,sBAAsB;AACnC,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,eAAe,SAAS;AAAA;AAAA;AAI5B,MAAI,YAAa,WAAW,CAAC,sBAAuB;AAClD,WAAO,0BAA0B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA;AAKJ,SAAO;AAAA,IACL,gBAAgB,SAAS,SAAS;AAAA,IAClC,eAAe,SAAS;AAAA;AAAA;AAIrB,MAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,MACkD;AAClD,QAAM,EAAE,IAAI,YAAY;AACxB,QAAM,EAAE,IAAI,YAAY;AACxB,QAAM,WAAW,CAAC,YAAY,CAAC;AAE/B,MAAI,YAAY;AAAS,WAAO;AAEhC,MAAI,YAAY,CAAC,SAAS,SAAS;AACjC,WAAO;AAAA;AAGT,MAAI,qBAAqB;AACvB,QAAI;AAAU,aAAO;AACrB,UAAM,aAAa,qBAAqB,CAAC,aAAa;AACtD,QAAI,SAAS,KAAK,MAAM,cAAc;AAAS,aAAO;AACtD,QAAI,CAAC;AAAY,aAAO;AAAA;AAG1B,SAAO;AAAA;AAGF,MAAM,2BAA2B,CAAC;AAAA,EACvC;AAAA,EAEA;AAAA,MAII;AACJ,QAAM,UAA6B;AAEnC,QAAM,aAAa,MAAM;AAEzB,QAAM,kBAAkB,WAAW,KAAK;AACxC,QAAM,uBAAuB,gBAAgB,cAAc,gBAAgB,SAAS,SAAS;AAE7F,MAAI,sBAAsB;AACxB,YAAQ,gBAAgB,WAAW;AACnC,YAAQ,iBAAiB;AAAA,SACpB;AACL,YAAQ,gBAAgB,mBAAmB,CAAC,aAAa;AACzD,YAAQ,iBAAiB,WAAW,KAAK;AAAA;AAG3C,SAAO;AAAA;",
6
- "names": []
7
- }
@@ -1,170 +0,0 @@
1
- import * as React from "react";
2
- import { useContext, useCallback } from "react";
3
- import { cloneDeep } from "lodash";
4
- import TreeViewContext, { defaultRelativeMouseCoord } from "../TreeViewContext";
5
- import { getNodeById, focusItem } from "./tree-helpers";
6
- import { inferHoverItemKinshipDrop, inferKeyboardKinshipDrop, isDropValid } from "./dnd-helpers";
7
- const useDnDHelpers = () => {
8
- const ctx = useContext(TreeViewContext);
9
- const {
10
- props: { data, onOrderChange, restrictDragAndDrop },
11
- relativeMouseCord,
12
- setRelativeMouseCord,
13
- visibleItems,
14
- isDragging,
15
- setIsDragging,
16
- isKeyboardDragging,
17
- setIsKeyboardDragging,
18
- setDraggedItem,
19
- setFocusedItem,
20
- triggerTreeRerender,
21
- tree,
22
- treeRoot,
23
- draggedItem
24
- } = ctx;
25
- const onSortEnd = useCallback(({ oldIndex, newIndex, isKeySorting }) => {
26
- const { isBefore, isAfter, item: overItem, isValid } = relativeMouseCord;
27
- if (draggedItem && tree && treeRoot && overItem) {
28
- let newItems = cloneDeep(data);
29
- if (oldIndex === newIndex || !isValid) {
30
- setIsDragging(false);
31
- setDraggedItem(null);
32
- triggerTreeRerender();
33
- return;
34
- }
35
- const movementDirection = newIndex > oldIndex ? "topToBottom" : "bottomToTop";
36
- let newNestedIndex;
37
- let newParentNode;
38
- if (isKeySorting) {
39
- const kinship = inferKeyboardKinshipDrop({
40
- items: visibleItems,
41
- newIndex
42
- });
43
- newNestedIndex = kinship.newNestedIndex;
44
- newParentNode = kinship.newParentNode;
45
- } else {
46
- const kinship = inferHoverItemKinshipDrop({
47
- isBefore,
48
- isAfter,
49
- overItem,
50
- movementDirection,
51
- draggedItem
52
- });
53
- newNestedIndex = kinship.newNestedIndex;
54
- newParentNode = kinship.newParentNode;
55
- }
56
- const newMovedItemNode = tree.parse(draggedItem.node.model);
57
- getNodeById(treeRoot, draggedItem.id).drop();
58
- if (newParentNode && typeof newNestedIndex === "number") {
59
- newParentNode.addChildAtIndex(newMovedItemNode, newNestedIndex);
60
- if (newParentNode.isRoot()) {
61
- newItems = [...newParentNode.model.children];
62
- } else {
63
- newItems = [...treeRoot.model.children];
64
- }
65
- }
66
- onOrderChange(newItems, data, draggedItem);
67
- setIsDragging(false);
68
- setDraggedItem(null);
69
- triggerTreeRerender();
70
- }
71
- }, [
72
- data,
73
- draggedItem,
74
- relativeMouseCord,
75
- visibleItems,
76
- tree,
77
- treeRoot,
78
- onOrderChange,
79
- triggerTreeRerender,
80
- setIsDragging,
81
- setDraggedItem
82
- ]);
83
- const onSortStart = useCallback(() => {
84
- }, []);
85
- const updateBeforeSortStart = useCallback((beforeStartArgs) => new Promise((resolve) => {
86
- const { index, isKeySorting } = beforeStartArgs;
87
- const item = visibleItems[index];
88
- const { isExpanded } = item.node.model;
89
- if (isExpanded) {
90
- item.node.model.isExpanded = false;
91
- triggerTreeRerender();
92
- }
93
- setRelativeMouseCord(defaultRelativeMouseCoord);
94
- setIsKeyboardDragging(isKeySorting);
95
- setIsDragging(true);
96
- setDraggedItem(item);
97
- focusItem(null);
98
- setFocusedItem(null);
99
- if (document.activeElement && typeof document.activeElement.blur === "function")
100
- document.activeElement.blur();
101
- resolve(true);
102
- }), [
103
- visibleItems,
104
- setRelativeMouseCord,
105
- setIsKeyboardDragging,
106
- setIsDragging,
107
- setDraggedItem,
108
- setFocusedItem,
109
- triggerTreeRerender
110
- ]);
111
- const onMouseDragOverItem = useCallback(({
112
- event,
113
- item,
114
- itemIndex,
115
- setIsDraggingOverThis,
116
- openFolderOnHoverTimeout
117
- }) => {
118
- const { node } = item;
119
- const { nodeItemRef } = node.model;
120
- if (isDragging && !isKeyboardDragging && draggedItem) {
121
- const rect = nodeItemRef?.current?.getBoundingClientRect();
122
- if (rect) {
123
- const x = event.clientX - rect.left;
124
- const y = event.clientY - rect.top;
125
- const { height: elementHeight } = rect;
126
- const dropBeforeMaxY = elementHeight * 0.25;
127
- const dropAfterMinY = elementHeight - elementHeight * 0.25;
128
- const isBefore = y < dropBeforeMaxY;
129
- const isAfter = y > dropAfterMinY;
130
- const isValid = isDropValid({
131
- isBefore,
132
- isAfter,
133
- draggedItem,
134
- overItem: item,
135
- restrictDragAndDrop
136
- });
137
- setRelativeMouseCord({
138
- isBefore,
139
- isAfter,
140
- isValid,
141
- item,
142
- x,
143
- y,
144
- relativeElementDOMRect: rect,
145
- relativeElementIndex: itemIndex
146
- });
147
- setIsDraggingOverThis(true);
148
- if (!openFolderOnHoverTimeout?.current && draggedItem?.id !== item?.id && (item.isGroup || item.children.length > 0) && !restrictDragAndDrop) {
149
- openFolderOnHoverTimeout.current = setTimeout(() => {
150
- item.node.model.isExpanded = true;
151
- openFolderOnHoverTimeout.current = null;
152
- triggerTreeRerender();
153
- }, 1e3);
154
- }
155
- }
156
- } else {
157
- setRelativeMouseCord(defaultRelativeMouseCoord);
158
- }
159
- }, [isDragging, isKeyboardDragging, draggedItem, restrictDragAndDrop, setRelativeMouseCord, triggerTreeRerender]);
160
- return {
161
- updateBeforeSortStart,
162
- onSortStart,
163
- onSortEnd,
164
- onMouseDragOverItem
165
- };
166
- };
167
- export {
168
- useDnDHelpers
169
- };
170
- //# sourceMappingURL=useDnDHelpers.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/utils/useDnDHelpers.tsx"],
4
- "sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-depth */\n/* eslint-disable no-lonely-if */\n/* eslint-disable max-lines */\n/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport React, { useContext, useCallback } from 'react';\nimport { cloneDeep } from 'lodash';\n\nimport TreeViewContext, { defaultRelativeMouseCoord } from '../TreeViewContext';\nimport { getNodeById, focusItem } from './tree-helpers';\nimport { inferHoverItemKinshipDrop, inferKeyboardKinshipDrop, isDropValid } from './dnd-helpers';\nimport type { DSTreeviewT } from '../react-desc-prop-types';\nimport type { DSTreeviewInternalsT } from '../sharedTypes';\n\nexport const useDnDHelpers = () => {\n const ctx = useContext(TreeViewContext);\n\n const {\n props: { data, onOrderChange, restrictDragAndDrop },\n relativeMouseCord,\n setRelativeMouseCord,\n visibleItems,\n isDragging,\n setIsDragging,\n isKeyboardDragging,\n setIsKeyboardDragging,\n setDraggedItem,\n setFocusedItem,\n triggerTreeRerender,\n tree,\n treeRoot,\n draggedItem,\n } = ctx;\n\n const onSortEnd = useCallback(\n ({ oldIndex, newIndex, isKeySorting }: { oldIndex: number; newIndex: number; isKeySorting: boolean }) => {\n const { isBefore, isAfter, item: overItem, isValid } = relativeMouseCord;\n if (draggedItem && tree && treeRoot && overItem) {\n let newItems = cloneDeep(data);\n // if dropping in same position do nothing\n // if the drop is not allowed do nothing\n if (oldIndex === newIndex || !isValid) {\n // onOrderChange(newItems, data);\n setIsDragging(false);\n setDraggedItem(null);\n triggerTreeRerender();\n return;\n }\n\n // if we are moving from topToBottom the offset changes\n const movementDirection = newIndex > oldIndex ? ('topToBottom' as const) : ('bottomToTop' as const);\n\n let newNestedIndex;\n let newParentNode;\n if (isKeySorting) {\n const kinship = inferKeyboardKinshipDrop({\n items: visibleItems,\n\n newIndex,\n });\n newNestedIndex = kinship.newNestedIndex;\n newParentNode = kinship.newParentNode;\n } else {\n const kinship = inferHoverItemKinshipDrop({\n isBefore,\n isAfter,\n overItem,\n movementDirection,\n draggedItem,\n });\n newNestedIndex = kinship.newNestedIndex;\n newParentNode = kinship.newParentNode;\n }\n\n const newMovedItemNode = tree.parse(draggedItem.node.model);\n getNodeById(treeRoot, draggedItem.id).drop();\n if (newParentNode && typeof newNestedIndex === 'number') {\n newParentNode.addChildAtIndex(newMovedItemNode, newNestedIndex);\n\n if (newParentNode.isRoot()) {\n newItems = [...newParentNode.model.children];\n } else {\n newItems = [...treeRoot.model.children];\n }\n }\n\n onOrderChange(newItems, data, draggedItem);\n setIsDragging(false);\n setDraggedItem(null);\n triggerTreeRerender();\n }\n },\n [\n data,\n draggedItem,\n relativeMouseCord,\n visibleItems,\n tree,\n treeRoot,\n onOrderChange,\n triggerTreeRerender,\n setIsDragging,\n setDraggedItem,\n ],\n );\n\n const onSortStart = useCallback(\n () => {},\n // ({ node, index, collection, isKeySorting }, event) => {\n // console.log('node :>> ', node);\n // console.log('isKeySorting :>> ', isKeySorting);\n // console.log('event :>> ', event);\n // const item = collection?.[index] || visibleItems[index];\n // setIsDragging(true);\n // setDraggedItem(item);\n // },\n [],\n );\n\n const updateBeforeSortStart = useCallback(\n (beforeStartArgs: { index: number; isKeySorting: boolean }) =>\n new Promise((resolve) => {\n const { index, isKeySorting } = beforeStartArgs;\n\n const item = visibleItems[index];\n const { isExpanded } = item.node.model;\n\n if (isExpanded) {\n item.node.model.isExpanded = false;\n triggerTreeRerender();\n }\n setRelativeMouseCord(defaultRelativeMouseCoord);\n setIsKeyboardDragging(isKeySorting);\n setIsDragging(true);\n setDraggedItem(item);\n focusItem(null);\n setFocusedItem(null);\n if (document.activeElement && typeof (document.activeElement as HTMLElement).blur === 'function')\n (document.activeElement as HTMLElement).blur();\n resolve(true);\n }),\n [\n visibleItems,\n setRelativeMouseCord,\n setIsKeyboardDragging,\n setIsDragging,\n setDraggedItem,\n setFocusedItem,\n triggerTreeRerender,\n ],\n );\n\n // tracks mouse coords relative to an element to check if the drop happens\n // at the top/center/bottom of an element to choose where to move the element\n // requested in the specs\n const onMouseDragOverItem = useCallback(\n ({\n event,\n item,\n itemIndex,\n setIsDraggingOverThis,\n openFolderOnHoverTimeout,\n }: {\n event: React.MouseEvent<HTMLLIElement>;\n item: DSTreeviewT.Item;\n itemIndex: number;\n setIsDraggingOverThis: DSTreeviewInternalsT.StateSetter<boolean>;\n openFolderOnHoverTimeout: React.MutableRefObject<NodeJS.Timeout | null>;\n }) => {\n const { node } = item;\n const { nodeItemRef } = node.model;\n if (isDragging && !isKeyboardDragging && draggedItem) {\n const rect = nodeItemRef?.current?.getBoundingClientRect();\n if (rect) {\n const x = event.clientX - rect.left; // x position within the element.\n const y = event.clientY - rect.top; // y position within the element.\n\n // by spec we need to track where the drop will happens\n // if drop happens on top 25% drop before\n // if drop happens on bottom of 25% drop after\n // if drop happens in the middle 50% either invalid or drop into children\n const { height: elementHeight } = rect;\n const dropBeforeMaxY = elementHeight * 0.25;\n const dropAfterMinY = elementHeight - elementHeight * 0.25;\n const isBefore = y < dropBeforeMaxY;\n const isAfter = y > dropAfterMinY;\n const isValid = isDropValid({\n isBefore,\n isAfter,\n draggedItem,\n overItem: item,\n restrictDragAndDrop,\n });\n setRelativeMouseCord({\n isBefore,\n isAfter,\n isValid,\n item,\n x,\n y,\n relativeElementDOMRect: rect,\n relativeElementIndex: itemIndex,\n });\n setIsDraggingOverThis(true);\n\n if (\n !openFolderOnHoverTimeout?.current && // only set the interval if it wasn't set already once\n draggedItem?.id !== item?.id && // don't open ghost element\n (item.isGroup || item.children.length > 0) && // only open groups\n !restrictDragAndDrop\n ) {\n openFolderOnHoverTimeout.current = setTimeout(() => {\n item.node.model.isExpanded = true;\n openFolderOnHoverTimeout.current = null;\n triggerTreeRerender();\n }, 1000);\n }\n }\n } else {\n setRelativeMouseCord(defaultRelativeMouseCoord);\n }\n },\n [isDragging, isKeyboardDragging, draggedItem, restrictDragAndDrop, setRelativeMouseCord, triggerTreeRerender],\n );\n\n return {\n updateBeforeSortStart,\n onSortStart,\n onSortEnd,\n onMouseDragOverItem,\n };\n};\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,39 +0,0 @@
1
- import type { DSTreeviewT } from '../react-desc-prop-types';
2
- import type { DSTreeviewInternalsT } from '../sharedTypes';
3
- interface MetaInfoT {
4
- isBefore: boolean;
5
- isAfter: boolean;
6
- draggedItem: DSTreeviewT.Item;
7
- overItem: DSTreeviewT.Item;
8
- }
9
- interface KinshipT {
10
- newParentNode: DSTreeviewT.Item['node'];
11
- newNestedIndex: number;
12
- }
13
- export declare const keyCodes: {
14
- lift: number[];
15
- drop: number[];
16
- cancel: number[];
17
- up: number[];
18
- down: number[];
19
- };
20
- export declare const sameParentAsHoverItemDrop: ({ isBefore, isAfter, draggedItem, overItem, movementDirection, }: MetaInfoT & {
21
- movementDirection: DSTreeviewInternalsT.DnDMovementDirectionT;
22
- }) => {
23
- newNestedIndex: number;
24
- newParentNode: import("tree-model/types").Node<DSTreeviewT.Item>;
25
- };
26
- export declare const inferHoverItemKinshipDrop: ({ isBefore, isAfter, draggedItem, overItem, movementDirection, }: MetaInfoT & {
27
- movementDirection: DSTreeviewInternalsT.DnDMovementDirectionT;
28
- }) => {
29
- newNestedIndex: number;
30
- newParentNode: import("tree-model/types").Node<DSTreeviewT.Item>;
31
- };
32
- export declare const isDropValid: ({ isBefore, isAfter, draggedItem, overItem, restrictDragAndDrop, }: MetaInfoT & {
33
- restrictDragAndDrop: boolean;
34
- }) => boolean;
35
- export declare const inferKeyboardKinshipDrop: ({ items, newIndex, }: {
36
- items: DSTreeviewT.Item[];
37
- newIndex: number;
38
- }) => Partial<KinshipT>;
39
- export {};
@@ -1,26 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="mocha" />
3
- /// <reference types="webpack-env" />
4
- /// <reference types="styled-components" />
5
- import React from 'react';
6
- import type { DSTreeviewT } from '../react-desc-prop-types';
7
- import type { DSTreeviewInternalsT } from '../sharedTypes';
8
- export declare const useDnDHelpers: () => {
9
- updateBeforeSortStart: (beforeStartArgs: {
10
- index: number;
11
- isKeySorting: boolean;
12
- }) => Promise<unknown>;
13
- onSortStart: () => void;
14
- onSortEnd: ({ oldIndex, newIndex, isKeySorting }: {
15
- oldIndex: number;
16
- newIndex: number;
17
- isKeySorting: boolean;
18
- }) => void;
19
- onMouseDragOverItem: ({ event, item, itemIndex, setIsDraggingOverThis, openFolderOnHoverTimeout, }: {
20
- event: React.MouseEvent<HTMLLIElement>;
21
- item: DSTreeviewT.Item;
22
- itemIndex: number;
23
- setIsDraggingOverThis: DSTreeviewInternalsT.StateSetter<boolean>;
24
- openFolderOnHoverTimeout: React.MutableRefObject<NodeJS.Timeout | null>;
25
- }) => void;
26
- };