@os-design/drag-sort 1.0.0

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 (135) hide show
  1. package/LICENCE.md +1 -0
  2. package/README.md +15 -0
  3. package/dist/cjs/DragAndDrop.js +197 -0
  4. package/dist/cjs/DragAndDrop.js.map +1 -0
  5. package/dist/cjs/Draggable.js +97 -0
  6. package/dist/cjs/Draggable.js.map +1 -0
  7. package/dist/cjs/Droppable.js +112 -0
  8. package/dist/cjs/Droppable.js.map +1 -0
  9. package/dist/cjs/index.js +77 -0
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/cjs/utils/ListStore.js +68 -0
  12. package/dist/cjs/utils/ListStore.js.map +1 -0
  13. package/dist/cjs/utils/NodeList.js +266 -0
  14. package/dist/cjs/utils/NodeList.js.map +1 -0
  15. package/dist/cjs/utils/getElementOffset.js +27 -0
  16. package/dist/cjs/utils/getElementOffset.js.map +1 -0
  17. package/dist/cjs/utils/getElementScroll.js +27 -0
  18. package/dist/cjs/utils/getElementScroll.js.map +1 -0
  19. package/dist/cjs/utils/getNodeRect.js +48 -0
  20. package/dist/cjs/utils/getNodeRect.js.map +1 -0
  21. package/dist/cjs/utils/useAppendClassName.js +27 -0
  22. package/dist/cjs/utils/useAppendClassName.js.map +1 -0
  23. package/dist/cjs/utils/useBlankNode.js +103 -0
  24. package/dist/cjs/utils/useBlankNode.js.map +1 -0
  25. package/dist/cjs/utils/useDragAndDrop.js +32 -0
  26. package/dist/cjs/utils/useDragAndDrop.js.map +1 -0
  27. package/dist/cjs/utils/useDragEffect.js +509 -0
  28. package/dist/cjs/utils/useDragEffect.js.map +1 -0
  29. package/dist/cjs/utils/useDroppable.js +35 -0
  30. package/dist/cjs/utils/useDroppable.js.map +1 -0
  31. package/dist/cjs/utils/useGeneratedId.js +22 -0
  32. package/dist/cjs/utils/useGeneratedId.js.map +1 -0
  33. package/dist/cjs/utils/useGetNodeStyle.js +28 -0
  34. package/dist/cjs/utils/useGetNodeStyle.js.map +1 -0
  35. package/dist/cjs/utils/useInitRect.js +25 -0
  36. package/dist/cjs/utils/useInitRect.js.map +1 -0
  37. package/dist/cjs/utils/useInitScrollOffset.js +27 -0
  38. package/dist/cjs/utils/useInitScrollOffset.js.map +1 -0
  39. package/dist/cjs/utils/useMoveNode.js +110 -0
  40. package/dist/cjs/utils/useMoveNode.js.map +1 -0
  41. package/dist/cjs/utils/useScrollEventByPoint.js +66 -0
  42. package/dist/cjs/utils/useScrollEventByPoint.js.map +1 -0
  43. package/dist/cjs/utils/useTargetList.js +58 -0
  44. package/dist/cjs/utils/useTargetList.js.map +1 -0
  45. package/dist/cjs/utils/useTransitionStyle.js +30 -0
  46. package/dist/cjs/utils/useTransitionStyle.js.map +1 -0
  47. package/dist/esm/DragAndDrop.js +139 -0
  48. package/dist/esm/DragAndDrop.js.map +1 -0
  49. package/dist/esm/Draggable.js +62 -0
  50. package/dist/esm/Draggable.js.map +1 -0
  51. package/dist/esm/Droppable.js +84 -0
  52. package/dist/esm/Droppable.js.map +1 -0
  53. package/dist/esm/index.js +7 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/esm/utils/ListStore.js +46 -0
  56. package/dist/esm/utils/ListStore.js.map +1 -0
  57. package/dist/esm/utils/NodeList.js +207 -0
  58. package/dist/esm/utils/NodeList.js.map +1 -0
  59. package/dist/esm/utils/getElementOffset.js +19 -0
  60. package/dist/esm/utils/getElementOffset.js.map +1 -0
  61. package/dist/esm/utils/getElementScroll.js +19 -0
  62. package/dist/esm/utils/getElementScroll.js.map +1 -0
  63. package/dist/esm/utils/getNodeRect.js +36 -0
  64. package/dist/esm/utils/getNodeRect.js.map +1 -0
  65. package/dist/esm/utils/useAppendClassName.js +19 -0
  66. package/dist/esm/utils/useAppendClassName.js.map +1 -0
  67. package/dist/esm/utils/useBlankNode.js +81 -0
  68. package/dist/esm/utils/useBlankNode.js.map +1 -0
  69. package/dist/esm/utils/useDragAndDrop.js +13 -0
  70. package/dist/esm/utils/useDragAndDrop.js.map +1 -0
  71. package/dist/esm/utils/useDragEffect.js +417 -0
  72. package/dist/esm/utils/useDragEffect.js.map +1 -0
  73. package/dist/esm/utils/useDroppable.js +14 -0
  74. package/dist/esm/utils/useDroppable.js.map +1 -0
  75. package/dist/esm/utils/useGeneratedId.js +7 -0
  76. package/dist/esm/utils/useGeneratedId.js.map +1 -0
  77. package/dist/esm/utils/useGetNodeStyle.js +20 -0
  78. package/dist/esm/utils/useGetNodeStyle.js.map +1 -0
  79. package/dist/esm/utils/useInitRect.js +15 -0
  80. package/dist/esm/utils/useInitRect.js.map +1 -0
  81. package/dist/esm/utils/useInitScrollOffset.js +14 -0
  82. package/dist/esm/utils/useInitScrollOffset.js.map +1 -0
  83. package/dist/esm/utils/useMoveNode.js +62 -0
  84. package/dist/esm/utils/useMoveNode.js.map +1 -0
  85. package/dist/esm/utils/useScrollEventByPoint.js +53 -0
  86. package/dist/esm/utils/useScrollEventByPoint.js.map +1 -0
  87. package/dist/esm/utils/useTargetList.js +27 -0
  88. package/dist/esm/utils/useTargetList.js.map +1 -0
  89. package/dist/esm/utils/useTransitionStyle.js +24 -0
  90. package/dist/esm/utils/useTransitionStyle.js.map +1 -0
  91. package/dist/types/DragAndDrop.d.ts +16 -0
  92. package/dist/types/DragAndDrop.d.ts.map +1 -0
  93. package/dist/types/Draggable.d.ts +17 -0
  94. package/dist/types/Draggable.d.ts.map +1 -0
  95. package/dist/types/Droppable.d.ts +15 -0
  96. package/dist/types/Droppable.d.ts.map +1 -0
  97. package/dist/types/index.d.ts +7 -0
  98. package/dist/types/index.d.ts.map +1 -0
  99. package/dist/types/utils/ListStore.d.ts +10 -0
  100. package/dist/types/utils/ListStore.d.ts.map +1 -0
  101. package/dist/types/utils/NodeList.d.ts +42 -0
  102. package/dist/types/utils/NodeList.d.ts.map +1 -0
  103. package/dist/types/utils/getElementOffset.d.ts +6 -0
  104. package/dist/types/utils/getElementOffset.d.ts.map +1 -0
  105. package/dist/types/utils/getElementScroll.d.ts +6 -0
  106. package/dist/types/utils/getElementScroll.d.ts.map +1 -0
  107. package/dist/types/utils/getNodeRect.d.ts +9 -0
  108. package/dist/types/utils/getNodeRect.d.ts.map +1 -0
  109. package/dist/types/utils/useAppendClassName.d.ts +4 -0
  110. package/dist/types/utils/useAppendClassName.d.ts.map +1 -0
  111. package/dist/types/utils/useBlankNode.d.ts +14 -0
  112. package/dist/types/utils/useBlankNode.d.ts.map +1 -0
  113. package/dist/types/utils/useDragAndDrop.d.ts +20 -0
  114. package/dist/types/utils/useDragAndDrop.d.ts.map +1 -0
  115. package/dist/types/utils/useDragEffect.d.ts +23 -0
  116. package/dist/types/utils/useDragEffect.d.ts.map +1 -0
  117. package/dist/types/utils/useDroppable.d.ts +12 -0
  118. package/dist/types/utils/useDroppable.d.ts.map +1 -0
  119. package/dist/types/utils/useGeneratedId.d.ts +3 -0
  120. package/dist/types/utils/useGeneratedId.d.ts.map +1 -0
  121. package/dist/types/utils/useGetNodeStyle.d.ts +9 -0
  122. package/dist/types/utils/useGetNodeStyle.d.ts.map +1 -0
  123. package/dist/types/utils/useInitRect.d.ts +9 -0
  124. package/dist/types/utils/useInitRect.d.ts.map +1 -0
  125. package/dist/types/utils/useInitScrollOffset.d.ts +7 -0
  126. package/dist/types/utils/useInitScrollOffset.d.ts.map +1 -0
  127. package/dist/types/utils/useMoveNode.d.ts +15 -0
  128. package/dist/types/utils/useMoveNode.d.ts.map +1 -0
  129. package/dist/types/utils/useScrollEventByPoint.d.ts +7 -0
  130. package/dist/types/utils/useScrollEventByPoint.d.ts.map +1 -0
  131. package/dist/types/utils/useTargetList.d.ts +6 -0
  132. package/dist/types/utils/useTargetList.d.ts.map +1 -0
  133. package/dist/types/utils/useTransitionStyle.d.ts +8 -0
  134. package/dist/types/utils/useTransitionStyle.d.ts.map +1 -0
  135. package/package.json +49 -0
@@ -0,0 +1,84 @@
1
+ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import useMemoObject from '@os-design/use-memo-object';
3
+ import NodeList from './utils/NodeList';
4
+ import useDragAndDrop from './utils/useDragAndDrop';
5
+ import { DroppableContext } from './utils/useDroppable';
6
+ import useGeneratedId from './utils/useGeneratedId';
7
+
8
+ const Droppable = ({
9
+ renderDraggedNode,
10
+ id,
11
+ horizontal = false,
12
+ children
13
+ }) => {
14
+ // The reference to the list
15
+ const ref = useRef(null); // The reference to the container inside the virtual list
16
+
17
+ const innerRef = useRef(null); // The unique ID of the list. If no ID was specified, the generated one is used.
18
+
19
+ const generatedId = useGeneratedId(10);
20
+ const droppableId = useMemo(() => id || generatedId, [generatedId, id]); // The reference to the list of nodes
21
+
22
+ const listRef = useRef(new NodeList({
23
+ id: droppableId,
24
+ ref,
25
+ innerRef,
26
+ horizontal,
27
+ renderDraggedNode
28
+ })); // Update the ID of the list if it changes
29
+
30
+ useEffect(() => {
31
+ listRef.current.id = droppableId;
32
+ }, [droppableId]); // Update the list orientation if it changes.
33
+ // There is no need to check the order of the nodes in the list because it will be the same.
34
+
35
+ useEffect(() => {
36
+ listRef.current.horizontal = horizontal;
37
+ }, [horizontal]); // Update the callback that renders the dragged node if it changes
38
+
39
+ useEffect(() => {
40
+ listRef.current.renderDraggedNode = renderDraggedNode;
41
+ }, [renderDraggedNode]);
42
+ const {
43
+ registerList,
44
+ deregisterList,
45
+ onMouseDown,
46
+ onTouchStart
47
+ } = useDragAndDrop(); // Register the list in the store
48
+
49
+ useEffect(() => {
50
+ registerList(listRef.current);
51
+ const listId = listRef.current.id;
52
+ return () => deregisterList(listId);
53
+ }, [deregisterList, registerList]);
54
+ const registerNode = useCallback(props => listRef.current.add(props), []);
55
+ const deregisterNode = useCallback(node => {
56
+ listRef.current.remove(node);
57
+ }, []); // Handlers that determine whether a user clicks on the node
58
+
59
+ const mouseDownHandler = useCallback((e, node) => {
60
+ onMouseDown(e, listRef.current, node);
61
+ }, [onMouseDown]);
62
+ const touchStartHandler = useCallback((e, node) => {
63
+ onTouchStart(e, listRef.current, node);
64
+ }, [onTouchStart]);
65
+ const droppableContext = useMemoObject({
66
+ registerNode,
67
+ deregisterNode,
68
+ onMouseDown: mouseDownHandler,
69
+ onTouchStart: touchStartHandler
70
+ });
71
+ const renderChildren = useCallback(() => {
72
+ if (typeof children !== 'function') return children;
73
+ return children({
74
+ ref,
75
+ innerRef
76
+ });
77
+ }, [children]);
78
+ return /*#__PURE__*/React.createElement(DroppableContext.Provider, {
79
+ value: droppableContext
80
+ }, renderChildren());
81
+ };
82
+
83
+ export default Droppable;
84
+ //# sourceMappingURL=Droppable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Droppable.tsx"],"names":["React","useCallback","useEffect","useMemo","useRef","useMemoObject","NodeList","useDragAndDrop","DroppableContext","useGeneratedId","Droppable","renderDraggedNode","id","horizontal","children","ref","innerRef","generatedId","droppableId","listRef","current","registerList","deregisterList","onMouseDown","onTouchStart","listId","registerNode","props","add","deregisterNode","node","remove","mouseDownHandler","e","touchStartHandler","droppableContext","renderChildren"],"mappings":"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","sourcesContent":["import React, {\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n MouseEvent,\n TouchEvent,\n} from 'react';\nimport useMemoObject from '@os-design/use-memo-object';\nimport NodeList, {\n ExistingNode,\n NodeProps,\n RenderDraggedNode,\n} from './utils/NodeList';\nimport useDragAndDrop from './utils/useDragAndDrop';\nimport { DroppableContext } from './utils/useDroppable';\nimport useGeneratedId from './utils/useGeneratedId';\n\nexport interface DroppableChildrenProps {\n /**\n * The reference to the list.\n * If a virtual list is used, pass it to the outerRef prop.\n */\n ref: RefObject<HTMLDivElement>;\n /**\n * The reference to the container inside the virtual list.\n * Pass it to the innerRef prop.\n */\n innerRef: RefObject<HTMLDivElement>;\n}\n\nexport interface DroppableProps {\n /**\n * The function that renders the dragged node.\n */\n renderDraggedNode: RenderDraggedNode;\n /**\n * The ID of the list with draggable nodes.\n * Used to determine in which list the dragged node was dropped.\n * @default undefined\n */\n id?: string;\n /**\n * Whether the list is horizontal.\n * @default false\n */\n horizontal?: boolean;\n /**\n * The function that renders the list with draggable nodes.\n */\n children:\n | React.ReactNode\n | ((props: DroppableChildrenProps) => React.ReactNode);\n}\n\nconst Droppable: React.FC<DroppableProps> = ({\n renderDraggedNode,\n id,\n horizontal = false,\n children,\n}) => {\n // The reference to the list\n const ref = useRef<HTMLDivElement>(null);\n // The reference to the container inside the virtual list\n const innerRef = useRef<HTMLDivElement>(null);\n // The unique ID of the list. If no ID was specified, the generated one is used.\n const generatedId = useGeneratedId(10);\n const droppableId = useMemo(() => id || generatedId, [generatedId, id]);\n // The reference to the list of nodes\n const listRef = useRef(\n new NodeList({\n id: droppableId,\n ref,\n innerRef,\n horizontal,\n renderDraggedNode,\n })\n );\n\n // Update the ID of the list if it changes\n useEffect(() => {\n listRef.current.id = droppableId;\n }, [droppableId]);\n\n // Update the list orientation if it changes.\n // There is no need to check the order of the nodes in the list because it will be the same.\n useEffect(() => {\n listRef.current.horizontal = horizontal;\n }, [horizontal]);\n\n // Update the callback that renders the dragged node if it changes\n useEffect(() => {\n listRef.current.renderDraggedNode = renderDraggedNode;\n }, [renderDraggedNode]);\n\n const { registerList, deregisterList, onMouseDown, onTouchStart } =\n useDragAndDrop();\n\n // Register the list in the store\n useEffect(() => {\n registerList(listRef.current);\n const listId = listRef.current.id;\n return () => deregisterList(listId);\n }, [deregisterList, registerList]);\n\n const registerNode = useCallback(\n (props: NodeProps) => listRef.current.add(props),\n []\n );\n const deregisterNode = useCallback((node: ExistingNode) => {\n listRef.current.remove(node);\n }, []);\n\n // Handlers that determine whether a user clicks on the node\n const mouseDownHandler = useCallback(\n (e: MouseEvent, node: ExistingNode) => {\n onMouseDown(e, listRef.current, node);\n },\n [onMouseDown]\n );\n const touchStartHandler = useCallback(\n (e: TouchEvent, node: ExistingNode) => {\n onTouchStart(e, listRef.current, node);\n },\n [onTouchStart]\n );\n\n const droppableContext = useMemoObject({\n registerNode,\n deregisterNode,\n onMouseDown: mouseDownHandler,\n onTouchStart: touchStartHandler,\n });\n\n const renderChildren = useCallback<() => React.ReactNode>(() => {\n if (typeof children !== 'function') return children;\n return (children as Function)({ ref, innerRef });\n }, [children]);\n\n return (\n <DroppableContext.Provider value={droppableContext}>\n {renderChildren()}\n </DroppableContext.Provider>\n );\n};\n\nexport default Droppable;\n"],"file":"Droppable.js"}
@@ -0,0 +1,7 @@
1
+ export { default as DragAndDrop } from './DragAndDrop';
2
+ export { default as Droppable } from './Droppable';
3
+ export { default as Draggable } from './Draggable';
4
+ export * from './DragAndDrop';
5
+ export * from './Droppable';
6
+ export * from './Draggable';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"names":["default","DragAndDrop","Droppable","Draggable"],"mappings":"AAAA,SAASA,OAAO,IAAIC,WAApB,QAAuC,eAAvC;AACA,SAASD,OAAO,IAAIE,SAApB,QAAqC,aAArC;AACA,SAASF,OAAO,IAAIG,SAApB,QAAqC,aAArC;AAEA,cAAc,eAAd;AACA,cAAc,aAAd;AACA,cAAc,aAAd","sourcesContent":["export { default as DragAndDrop } from './DragAndDrop';\nexport { default as Droppable } from './Droppable';\nexport { default as Draggable } from './Draggable';\n\nexport * from './DragAndDrop';\nexport * from './Droppable';\nexport * from './Draggable';\n"],"file":"index.js"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Stores all the lists where the draggable items is located.
3
+ */
4
+ class ListStore {
5
+ constructor() {
6
+ this.lists = void 0;
7
+ this.lists = [];
8
+ }
9
+ /**
10
+ * Adds a new list to the store.
11
+ */
12
+
13
+
14
+ add(list) {
15
+ this.lists.push(list);
16
+ }
17
+ /**
18
+ * Removes the list from the store.
19
+ */
20
+
21
+
22
+ remove(id) {
23
+ const index = this.lists.findIndex(item => item.id === id);
24
+ if (index === -1) return;
25
+ this.lists.splice(index, 1);
26
+ }
27
+ /**
28
+ * Returns the list in which the position is located.
29
+ */
30
+
31
+
32
+ findByPosition(x, y) {
33
+ return this.lists.find(list => {
34
+ const {
35
+ current
36
+ } = list.ref;
37
+ if (!current) return true;
38
+ const rect = current.getBoundingClientRect();
39
+ return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;
40
+ });
41
+ }
42
+
43
+ }
44
+
45
+ export default ListStore;
46
+ //# sourceMappingURL=ListStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/ListStore.ts"],"names":["ListStore","constructor","lists","add","list","push","remove","id","index","findIndex","item","splice","findByPosition","x","y","find","current","ref","rect","getBoundingClientRect","width","height"],"mappings":"AAEA;AACA;AACA;AACA,MAAMA,SAAN,CAAgB;AAGPC,EAAAA,WAAW,GAAG;AAAA,SAFbC,KAEa;AACnB,SAAKA,KAAL,GAAa,EAAb;AACD;AAED;AACF;AACA;;;AACSC,EAAAA,GAAG,CAACC,IAAD,EAAiB;AACzB,SAAKF,KAAL,CAAWG,IAAX,CAAgBD,IAAhB;AACD;AAED;AACF;AACA;;;AACSE,EAAAA,MAAM,CAACC,EAAD,EAAa;AACxB,UAAMC,KAAK,GAAG,KAAKN,KAAL,CAAWO,SAAX,CAAsBC,IAAD,IAAUA,IAAI,CAACH,EAAL,KAAYA,EAA3C,CAAd;AACA,QAAIC,KAAK,KAAK,CAAC,CAAf,EAAkB;AAClB,SAAKN,KAAL,CAAWS,MAAX,CAAkBH,KAAlB,EAAyB,CAAzB;AACD;AAED;AACF;AACA;;;AACSI,EAAAA,cAAc,CAACC,CAAD,EAAYC,CAAZ,EAAuB;AAC1C,WAAO,KAAKZ,KAAL,CAAWa,IAAX,CAAiBX,IAAD,IAAU;AAC/B,YAAM;AAAEY,QAAAA;AAAF,UAAcZ,IAAI,CAACa,GAAzB;AACA,UAAI,CAACD,OAAL,EAAc,OAAO,IAAP;AACd,YAAME,IAAI,GAAGF,OAAO,CAACG,qBAAR,EAAb;AACA,aACEN,CAAC,IAAIK,IAAI,CAACL,CAAV,IACAA,CAAC,IAAIK,IAAI,CAACL,CAAL,GAASK,IAAI,CAACE,KADnB,IAEAN,CAAC,IAAII,IAAI,CAACJ,CAFV,IAGAA,CAAC,IAAII,IAAI,CAACJ,CAAL,GAASI,IAAI,CAACG,MAJrB;AAMD,KAVM,CAAP;AAWD;;AAtCa;;AAyChB,eAAerB,SAAf","sourcesContent":["import NodeList from './NodeList';\n\n/**\n * Stores all the lists where the draggable items is located.\n */\nclass ListStore {\n private lists: NodeList[];\n\n public constructor() {\n this.lists = [];\n }\n\n /**\n * Adds a new list to the store.\n */\n public add(list: NodeList) {\n this.lists.push(list);\n }\n\n /**\n * Removes the list from the store.\n */\n public remove(id: string) {\n const index = this.lists.findIndex((item) => item.id === id);\n if (index === -1) return;\n this.lists.splice(index, 1);\n }\n\n /**\n * Returns the list in which the position is located.\n */\n public findByPosition(x: number, y: number) {\n return this.lists.find((list) => {\n const { current } = list.ref;\n if (!current) return true;\n const rect = current.getBoundingClientRect();\n return (\n x >= rect.x &&\n x <= rect.x + rect.width &&\n y >= rect.y &&\n y <= rect.y + rect.height\n );\n });\n }\n}\n\nexport default ListStore;\n"],"file":"ListStore.js"}
@@ -0,0 +1,207 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign,prefer-destructuring,no-constant-condition */
2
+ // [prev, next, ref, setStyle, index]
3
+
4
+ /**
5
+ * Stores all the draggable items in the list.
6
+ * The structure of the doubly linked list is used.
7
+ */
8
+ class NodeList {
9
+ /**
10
+ * The ID of the list.
11
+ */
12
+
13
+ /**
14
+ * The ref to the list.
15
+ */
16
+
17
+ /**
18
+ * The inner ref to the list.
19
+ * Used by the virtual list.
20
+ */
21
+
22
+ /**
23
+ * Whether the list is horizontal.
24
+ */
25
+
26
+ /**
27
+ * The callback that renders the dragged node.
28
+ */
29
+
30
+ /**
31
+ * The head of draggable nodes.
32
+ */
33
+
34
+ /**
35
+ * The tail of draggable nodes.
36
+ */
37
+
38
+ /**
39
+ * Listeners of node addition events.
40
+ */
41
+ constructor(props) {
42
+ this.id = void 0;
43
+ this.ref = void 0;
44
+ this.innerRef = void 0;
45
+ this.horizontal = void 0;
46
+ this.renderDraggedNode = void 0;
47
+ this.head = void 0;
48
+ this.tail = void 0;
49
+ this.listeners = void 0;
50
+ this.id = props.id;
51
+ this.ref = props.ref;
52
+ this.innerRef = props.innerRef;
53
+ this.horizontal = props.horizontal;
54
+ this.renderDraggedNode = props.renderDraggedNode;
55
+ this.head = null;
56
+ this.tail = null;
57
+ this.listeners = [];
58
+ }
59
+
60
+ getHead() {
61
+ return this.head;
62
+ }
63
+
64
+ getTail() {
65
+ return this.tail;
66
+ }
67
+ /**
68
+ * Adds the node to the beginning.
69
+ * TL: O(1).
70
+ */
71
+
72
+
73
+ addToTheBeginning(props) {
74
+ this.head = [null, this.head, props.ref, props.setStyle, props.index];
75
+ const [, next] = this.head;
76
+ if (next) next[0] = this.head; // Set the prev cursor of the next element
77
+
78
+ if (!this.tail) this.tail = this.head;
79
+ return this.head;
80
+ }
81
+ /**
82
+ * Adds the node to the end.
83
+ * TL: O(1).
84
+ */
85
+
86
+
87
+ addToTheEnd(props) {
88
+ this.tail = [this.tail, null, props.ref, props.setStyle, props.index];
89
+ const [prev] = this.tail;
90
+ if (prev) prev[1] = this.tail; // Set the next cursor of the prev element
91
+
92
+ if (!this.head) this.head = this.tail;
93
+ return this.tail;
94
+ }
95
+ /**
96
+ * Adds the node after the specified one.
97
+ * TL: O(1).
98
+ */
99
+
100
+
101
+ static addAfter(node, props) {
102
+ node[1] = [node, node[1], props.ref, props.setStyle, props.index];
103
+ if (node[1][1]) node[1][1][0] = node[1];
104
+ return node[1];
105
+ }
106
+ /**
107
+ * Adds a new node depends on its position.
108
+ * Called when a new node is mounted.
109
+ * TL: O(1) – add to the beginning or to the end, O(n) – add to the middle.
110
+ */
111
+
112
+
113
+ add(props) {
114
+ const {
115
+ index
116
+ } = props; // Run listeners
117
+
118
+ this.listeners.forEach(listener => listener(props)); // Add the first node to the beginning
119
+
120
+ if (!this.head || !this.tail) {
121
+ return this.addToTheBeginning(props);
122
+ } // Add the node to the beginning if it is located above the first one
123
+
124
+
125
+ const [,,,, headIndex] = this.head;
126
+
127
+ if (index < headIndex) {
128
+ return this.addToTheBeginning(props);
129
+ } // Add the node to the end if it is located below the last one
130
+
131
+
132
+ const [,,,, tailIndex] = this.tail;
133
+
134
+ if (index === tailIndex) {
135
+ // The tail is the blank node
136
+ const [prev] = this.tail;
137
+
138
+ if (prev) {
139
+ this.tail[4] += 1;
140
+ return NodeList.addAfter(prev, props);
141
+ }
142
+ }
143
+
144
+ if (index > tailIndex) {
145
+ return this.addToTheEnd(props);
146
+ } // Add the node after the one that is located above the current one
147
+
148
+
149
+ let node = this.head;
150
+
151
+ while (true) {
152
+ const [, next] = node;
153
+ if (!next) break;
154
+ const [,,,, nextIndex] = next;
155
+ if (index < nextIndex) break;
156
+ node = next;
157
+ }
158
+
159
+ return NodeList.addAfter(node, props);
160
+ }
161
+ /**
162
+ * Removes the existing node.
163
+ * Called when the node is unmounted.
164
+ * TL: O(1).
165
+ */
166
+
167
+
168
+ remove(node) {
169
+ const [prev, next] = node;
170
+
171
+ if (!prev && !next) {
172
+ this.head = null;
173
+ this.tail = null;
174
+ return;
175
+ }
176
+
177
+ if (!prev && next) {
178
+ next[0] = null;
179
+ this.head = next;
180
+ return;
181
+ }
182
+
183
+ if (prev && !next) {
184
+ prev[1] = null;
185
+ this.tail = prev;
186
+ return;
187
+ }
188
+
189
+ if (prev && next) {
190
+ prev[1] = next;
191
+ next[0] = prev;
192
+ }
193
+ }
194
+
195
+ addListener(callback) {
196
+ this.listeners.push(callback);
197
+ }
198
+
199
+ removeListener(callback) {
200
+ const index = this.listeners.findIndex(listener => listener === callback);
201
+ this.listeners.splice(index, 1);
202
+ }
203
+
204
+ }
205
+
206
+ export default NodeList;
207
+ //# sourceMappingURL=NodeList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/NodeList.ts"],"names":["NodeList","constructor","props","id","ref","innerRef","horizontal","renderDraggedNode","head","tail","listeners","getHead","getTail","addToTheBeginning","setStyle","index","next","addToTheEnd","prev","addAfter","node","add","forEach","listener","headIndex","tailIndex","nextIndex","remove","addListener","callback","push","removeListener","findIndex","splice"],"mappings":"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","sourcesContent":["import React, { CSSProperties, RefObject } from 'react';\n\n/* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign,prefer-destructuring,no-constant-condition */\n\n// [prev, next, ref, setStyle, index]\nexport type Node =\n | [Node, Node, RefObject<any>, (style: CSSProperties) => void, number]\n | null;\n\nexport type ExistingNode = Exclude<Node, null>;\n\nexport interface NodeProps {\n ref: React.MutableRefObject<any>;\n setStyle: (style: CSSProperties) => void;\n index: number;\n}\n\ninterface RenderDraggedNodeProps {\n /**\n * The index of the dragged node.\n */\n index: number;\n /**\n * The style of the dragged node with position.\n */\n style: CSSProperties;\n}\n\nexport type RenderDraggedNode = (\n props: RenderDraggedNodeProps\n) => React.ReactNode;\n\ninterface InitProps {\n id: string;\n ref: RefObject<HTMLDivElement>;\n innerRef: RefObject<HTMLDivElement>;\n horizontal: boolean;\n renderDraggedNode: RenderDraggedNode;\n}\n\n/**\n * Stores all the draggable items in the list.\n * The structure of the doubly linked list is used.\n */\nclass NodeList {\n /**\n * The ID of the list.\n */\n public id: string;\n\n /**\n * The ref to the list.\n */\n public ref: RefObject<HTMLDivElement>;\n\n /**\n * The inner ref to the list.\n * Used by the virtual list.\n */\n public innerRef: RefObject<HTMLDivElement>;\n\n /**\n * Whether the list is horizontal.\n */\n public horizontal: boolean;\n\n /**\n * The callback that renders the dragged node.\n */\n public renderDraggedNode: RenderDraggedNode;\n\n /**\n * The head of draggable nodes.\n */\n private head: Node;\n\n /**\n * The tail of draggable nodes.\n */\n private tail: Node;\n\n /**\n * Listeners of node addition events.\n */\n private listeners: Array<(props: NodeProps) => void>;\n\n public constructor(props: InitProps) {\n this.id = props.id;\n this.ref = props.ref;\n this.innerRef = props.innerRef;\n this.horizontal = props.horizontal;\n this.renderDraggedNode = props.renderDraggedNode;\n this.head = null;\n this.tail = null;\n this.listeners = [];\n }\n\n public getHead() {\n return this.head;\n }\n\n public getTail() {\n return this.tail;\n }\n\n /**\n * Adds the node to the beginning.\n * TL: O(1).\n */\n private addToTheBeginning(props: NodeProps): ExistingNode {\n this.head = [null, this.head, props.ref, props.setStyle, props.index];\n const [, next] = this.head;\n if (next) next[0] = this.head; // Set the prev cursor of the next element\n if (!this.tail) this.tail = this.head;\n return this.head;\n }\n\n /**\n * Adds the node to the end.\n * TL: O(1).\n */\n private addToTheEnd(props: NodeProps): ExistingNode {\n this.tail = [this.tail, null, props.ref, props.setStyle, props.index];\n const [prev] = this.tail;\n if (prev) prev[1] = this.tail; // Set the next cursor of the prev element\n if (!this.head) this.head = this.tail;\n return this.tail;\n }\n\n /**\n * Adds the node after the specified one.\n * TL: O(1).\n */\n private static addAfter(node: ExistingNode, props: NodeProps): ExistingNode {\n node[1] = [node, node[1], props.ref, props.setStyle, props.index];\n if (node[1][1]) node[1][1][0] = node[1];\n return node[1];\n }\n\n /**\n * Adds a new node depends on its position.\n * Called when a new node is mounted.\n * TL: O(1) – add to the beginning or to the end, O(n) – add to the middle.\n */\n public add(props: NodeProps): ExistingNode {\n const { index } = props;\n\n // Run listeners\n this.listeners.forEach((listener) => listener(props));\n\n // Add the first node to the beginning\n if (!this.head || !this.tail) {\n return this.addToTheBeginning(props);\n }\n\n // Add the node to the beginning if it is located above the first one\n const [, , , , headIndex] = this.head;\n if (index < headIndex) {\n return this.addToTheBeginning(props);\n }\n\n // Add the node to the end if it is located below the last one\n const [, , , , tailIndex] = this.tail;\n if (index === tailIndex) {\n // The tail is the blank node\n const [prev] = this.tail;\n if (prev) {\n this.tail[4] += 1;\n return NodeList.addAfter(prev, props);\n }\n }\n if (index > tailIndex) {\n return this.addToTheEnd(props);\n }\n\n // Add the node after the one that is located above the current one\n let node = this.head;\n while (true) {\n const [, next] = node;\n if (!next) break;\n const [, , , , nextIndex] = next;\n if (index < nextIndex) break;\n node = next;\n }\n return NodeList.addAfter(node, props);\n }\n\n /**\n * Removes the existing node.\n * Called when the node is unmounted.\n * TL: O(1).\n */\n public remove(node: ExistingNode) {\n const [prev, next] = node;\n if (!prev && !next) {\n this.head = null;\n this.tail = null;\n return;\n }\n if (!prev && next) {\n next[0] = null;\n this.head = next;\n return;\n }\n if (prev && !next) {\n prev[1] = null;\n this.tail = prev;\n return;\n }\n if (prev && next) {\n prev[1] = next;\n next[0] = prev;\n }\n }\n\n public addListener(callback: (props: NodeProps) => void) {\n this.listeners.push(callback);\n }\n\n public removeListener(callback: (props: NodeProps) => void) {\n const index = this.listeners.findIndex((listener) => listener === callback);\n this.listeners.splice(index, 1);\n }\n}\n\nexport default NodeList;\n"],"file":"NodeList.js"}
@@ -0,0 +1,19 @@
1
+ const getElementOffset = element => {
2
+ let offsetLeft = 0;
3
+ let offsetTop = 0;
4
+ let el = element;
5
+
6
+ while (el) {
7
+ offsetLeft += el.offsetLeft;
8
+ offsetTop += el.offsetTop;
9
+ el = el.offsetParent;
10
+ }
11
+
12
+ return {
13
+ offsetLeft,
14
+ offsetTop
15
+ };
16
+ };
17
+
18
+ export default getElementOffset;
19
+ //# sourceMappingURL=getElementOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/getElementOffset.ts"],"names":["getElementOffset","element","offsetLeft","offsetTop","el","offsetParent"],"mappings":"AAAA,MAAMA,gBAAgB,GAAIC,OAAD,IAA0B;AACjD,MAAIC,UAAU,GAAG,CAAjB;AACA,MAAIC,SAAS,GAAG,CAAhB;AACA,MAAIC,EAAsB,GAAGH,OAA7B;;AACA,SAAOG,EAAP,EAAW;AACTF,IAAAA,UAAU,IAAIE,EAAE,CAACF,UAAjB;AACAC,IAAAA,SAAS,IAAIC,EAAE,CAACD,SAAhB;AACAC,IAAAA,EAAE,GAAGA,EAAE,CAACC,YAAR;AACD;;AACD,SAAO;AAAEH,IAAAA,UAAF;AAAcC,IAAAA;AAAd,GAAP;AACD,CAVD;;AAYA,eAAeH,gBAAf","sourcesContent":["const getElementOffset = (element: HTMLElement) => {\n let offsetLeft = 0;\n let offsetTop = 0;\n let el: HTMLElement | null = element;\n while (el) {\n offsetLeft += el.offsetLeft;\n offsetTop += el.offsetTop;\n el = el.offsetParent as HTMLElement;\n }\n return { offsetLeft, offsetTop };\n};\n\nexport default getElementOffset;\n"],"file":"getElementOffset.js"}
@@ -0,0 +1,19 @@
1
+ const getElementScroll = element => {
2
+ let scrollLeft = 0;
3
+ let scrollTop = 0;
4
+ let el = element;
5
+
6
+ while (el) {
7
+ scrollLeft += el.scrollLeft;
8
+ scrollTop += el.scrollTop;
9
+ el = el.parentElement;
10
+ }
11
+
12
+ return {
13
+ scrollLeft,
14
+ scrollTop
15
+ };
16
+ };
17
+
18
+ export default getElementScroll;
19
+ //# sourceMappingURL=getElementScroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/getElementScroll.ts"],"names":["getElementScroll","element","scrollLeft","scrollTop","el","parentElement"],"mappings":"AAAA,MAAMA,gBAAgB,GAAIC,OAAD,IAA0B;AACjD,MAAIC,UAAU,GAAG,CAAjB;AACA,MAAIC,SAAS,GAAG,CAAhB;AACA,MAAIC,EAAsB,GAAGH,OAA7B;;AACA,SAAOG,EAAP,EAAW;AACTF,IAAAA,UAAU,IAAIE,EAAE,CAACF,UAAjB;AACAC,IAAAA,SAAS,IAAIC,EAAE,CAACD,SAAhB;AACAC,IAAAA,EAAE,GAAGA,EAAE,CAACC,aAAR;AACD;;AACD,SAAO;AAAEH,IAAAA,UAAF;AAAcC,IAAAA;AAAd,GAAP;AACD,CAVD;;AAYA,eAAeH,gBAAf","sourcesContent":["const getElementScroll = (element: HTMLElement) => {\n let scrollLeft = 0;\n let scrollTop = 0;\n let el: HTMLElement | null = element;\n while (el) {\n scrollLeft += el.scrollLeft;\n scrollTop += el.scrollTop;\n el = el.parentElement;\n }\n return { scrollLeft, scrollTop };\n};\n\nexport default getElementScroll;\n"],"file":"getElementScroll.js"}
@@ -0,0 +1,36 @@
1
+ import getElementScroll from './getElementScroll';
2
+ import getElementOffset from './getElementOffset';
3
+ /**
4
+ * Computes the bounds of the existing node without considering transforms.
5
+ */
6
+
7
+ const getNodeRect = ref => {
8
+ if (!ref.current) return null;
9
+ const parent = ref.current.parentElement;
10
+ const {
11
+ width,
12
+ height
13
+ } = ref.current.getBoundingClientRect();
14
+ const {
15
+ offsetLeft,
16
+ offsetTop
17
+ } = getElementOffset(ref.current);
18
+ const {
19
+ scrollLeft,
20
+ scrollTop
21
+ } = parent ? getElementScroll(parent) : {
22
+ scrollLeft: 0,
23
+ scrollTop: 0
24
+ };
25
+ const left = offsetLeft - scrollLeft;
26
+ const top = offsetTop - scrollTop;
27
+ return {
28
+ left,
29
+ top,
30
+ right: left + width,
31
+ bottom: top + height
32
+ };
33
+ };
34
+
35
+ export default getNodeRect;
36
+ //# sourceMappingURL=getNodeRect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/getNodeRect.ts"],"names":["getElementScroll","getElementOffset","getNodeRect","ref","current","parent","parentElement","width","height","getBoundingClientRect","offsetLeft","offsetTop","scrollLeft","scrollTop","left","top","right","bottom"],"mappings":"AACA,OAAOA,gBAAP,MAA6B,oBAA7B;AACA,OAAOC,gBAAP,MAA6B,oBAA7B;AAEA;AACA;AACA;;AACA,MAAMC,WAAW,GAAIC,GAAD,IAAiC;AACnD,MAAI,CAACA,GAAG,CAACC,OAAT,EAAkB,OAAO,IAAP;AAElB,QAAMC,MAAM,GAAGF,GAAG,CAACC,OAAJ,CAAYE,aAA3B;AACA,QAAM;AAAEC,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAoBL,GAAG,CAACC,OAAJ,CAAYK,qBAAZ,EAA1B;AACA,QAAM;AAAEC,IAAAA,UAAF;AAAcC,IAAAA;AAAd,MAA4BV,gBAAgB,CAACE,GAAG,CAACC,OAAL,CAAlD;AACA,QAAM;AAAEQ,IAAAA,UAAF;AAAcC,IAAAA;AAAd,MAA4BR,MAAM,GACpCL,gBAAgB,CAACK,MAAD,CADoB,GAEpC;AAAEO,IAAAA,UAAU,EAAE,CAAd;AAAiBC,IAAAA,SAAS,EAAE;AAA5B,GAFJ;AAIA,QAAMC,IAAI,GAAGJ,UAAU,GAAGE,UAA1B;AACA,QAAMG,GAAG,GAAGJ,SAAS,GAAGE,SAAxB;AAEA,SAAO;AACLC,IAAAA,IADK;AAELC,IAAAA,GAFK;AAGLC,IAAAA,KAAK,EAAEF,IAAI,GAAGP,KAHT;AAILU,IAAAA,MAAM,EAAEF,GAAG,GAAGP;AAJT,GAAP;AAMD,CAnBD;;AAqBA,eAAeN,WAAf","sourcesContent":["import { RefObject } from 'react';\nimport getElementScroll from './getElementScroll';\nimport getElementOffset from './getElementOffset';\n\n/**\n * Computes the bounds of the existing node without considering transforms.\n */\nconst getNodeRect = (ref: RefObject<HTMLElement>) => {\n if (!ref.current) return null;\n\n const parent = ref.current.parentElement;\n const { width, height } = ref.current.getBoundingClientRect();\n const { offsetLeft, offsetTop } = getElementOffset(ref.current);\n const { scrollLeft, scrollTop } = parent\n ? getElementScroll(parent)\n : { scrollLeft: 0, scrollTop: 0 };\n\n const left = offsetLeft - scrollLeft;\n const top = offsetTop - scrollTop;\n\n return {\n left,\n top,\n right: left + width,\n bottom: top + height,\n };\n};\n\nexport default getNodeRect;\n"],"file":"getNodeRect.js"}
@@ -0,0 +1,19 @@
1
+ import { useEffect } from 'react';
2
+ /**
3
+ * Adds a new class name to the element.
4
+ */
5
+
6
+ const useAppendClassName = (ref, className) => {
7
+ useEffect(() => {
8
+ const element = ref.current;
9
+ if (!element) return () => {};
10
+ const initClassName = element.className;
11
+ element.className = `${initClassName} ${className}`.trim();
12
+ return () => {
13
+ element.className = initClassName;
14
+ };
15
+ }, [className, ref]);
16
+ };
17
+
18
+ export default useAppendClassName;
19
+ //# sourceMappingURL=useAppendClassName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/useAppendClassName.ts"],"names":["useEffect","useAppendClassName","ref","className","element","current","initClassName","trim"],"mappings":"AAAA,SAAoBA,SAApB,QAAqC,OAArC;AAEA;AACA;AACA;;AACA,MAAMC,kBAAkB,GAAG,CAACC,GAAD,EAA8BC,SAA9B,KAAoD;AAC7EH,EAAAA,SAAS,CAAC,MAAM;AACd,UAAMI,OAAO,GAAGF,GAAG,CAACG,OAApB;AACA,QAAI,CAACD,OAAL,EAAc,OAAO,MAAM,CAAE,CAAf;AAEd,UAAME,aAAa,GAAGF,OAAO,CAACD,SAA9B;AACAC,IAAAA,OAAO,CAACD,SAAR,GAAqB,GAAEG,aAAc,IAAGH,SAAU,EAA9B,CAAgCI,IAAhC,EAApB;AAEA,WAAO,MAAM;AACXH,MAAAA,OAAO,CAACD,SAAR,GAAoBG,aAApB;AACD,KAFD;AAGD,GAVQ,EAUN,CAACH,SAAD,EAAYD,GAAZ,CAVM,CAAT;AAWD,CAZD;;AAcA,eAAeD,kBAAf","sourcesContent":["import { RefObject, useEffect } from 'react';\n\n/**\n * Adds a new class name to the element.\n */\nconst useAppendClassName = (ref: RefObject<HTMLElement>, className: string) => {\n useEffect(() => {\n const element = ref.current;\n if (!element) return () => {};\n\n const initClassName = element.className;\n element.className = `${initClassName} ${className}`.trim();\n\n return () => {\n element.className = initClassName;\n };\n }, [className, ref]);\n};\n\nexport default useAppendClassName;\n"],"file":"useAppendClassName.js"}
@@ -0,0 +1,81 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+
3
+ /**
4
+ * Appends the blank node to the list to increase the height of it.
5
+ * Used when the dragged node is located inside another list.
6
+ */
7
+ const useBlankNode = props => {
8
+ const {
9
+ draggedNode,
10
+ targetList,
11
+ initDraggedNodeRect
12
+ } = props;
13
+ const initDraggedNodeRectRef = useRef(initDraggedNodeRect);
14
+ const blankNode = useRef(null);
15
+ useEffect(() => {
16
+ initDraggedNodeRectRef.current = initDraggedNodeRect;
17
+ }, [initDraggedNodeRect]);
18
+ useEffect(() => {
19
+ if (!draggedNode || !targetList || !targetList.ref.current || draggedNode.list === targetList || !initDraggedNodeRectRef.current) {
20
+ return;
21
+ } // Create a new blank div
22
+
23
+
24
+ const {
25
+ initWidth,
26
+ initHeight
27
+ } = initDraggedNodeRectRef.current;
28
+ const div = document.createElement('div');
29
+ div.style.width = `${initWidth}px`;
30
+ div.style.height = `${initHeight}px`;
31
+ div.style.minWidth = `${initWidth}px`;
32
+ div.style.minHeight = `${initHeight}px`;
33
+ let parent = targetList.ref.current;
34
+ const innerList = targetList.innerRef.current; // The inner ref used only in the virtual list
35
+
36
+ if (innerList) {
37
+ const {
38
+ width,
39
+ height
40
+ } = innerList.getBoundingClientRect();
41
+ div.style.position = 'absolute';
42
+ div.style.left = targetList.horizontal ? `${width}px` : '0px';
43
+ div.style.top = targetList.horizontal ? '0px' : `${height}px`;
44
+ parent = innerList;
45
+ } // Append the blank div to increase the height of the list
46
+
47
+
48
+ parent.appendChild(div); // Add the blank node to the node list
49
+
50
+ const tail = targetList.getTail();
51
+ blankNode.current = {
52
+ list: targetList,
53
+ node: targetList.add({
54
+ ref: {
55
+ current: div
56
+ },
57
+ setStyle: () => {},
58
+ index: tail ? tail[4] + 1 : 0
59
+ })
60
+ };
61
+ }, [draggedNode, targetList]);
62
+ const removeBlankNode = useCallback(() => {
63
+ const blank = blankNode.current;
64
+ if (!blank) return;
65
+ blankNode.current = null;
66
+ blank.list.remove(blank.node);
67
+ const [,, blankNodeRef] = blank.node;
68
+ if (!blank.list.ref.current || !blankNodeRef.current) return;
69
+ const parent = blankNodeRef.current.parentElement;
70
+ if (parent) parent.removeChild(blankNodeRef.current);
71
+ }, []); // Remove the blank node if the dragged node has been dropped
72
+
73
+ useEffect(() => {
74
+ if (!draggedNode) return () => {};
75
+ return () => removeBlankNode();
76
+ }, [draggedNode, removeBlankNode]);
77
+ return removeBlankNode;
78
+ };
79
+
80
+ export default useBlankNode;
81
+ //# sourceMappingURL=useBlankNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/useBlankNode.ts"],"names":["useCallback","useEffect","useRef","useBlankNode","props","draggedNode","targetList","initDraggedNodeRect","initDraggedNodeRectRef","blankNode","current","ref","list","initWidth","initHeight","div","document","createElement","style","width","height","minWidth","minHeight","parent","innerList","innerRef","getBoundingClientRect","position","left","horizontal","top","appendChild","tail","getTail","node","add","setStyle","index","removeBlankNode","blank","remove","blankNodeRef","parentElement","removeChild"],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport NodeList, { ExistingNode } from './NodeList';\n// eslint-disable-next-line import/no-cycle\nimport { DraggedNode } from './useDragEffect';\n\ninterface InitSize {\n initWidth: number;\n initHeight: number;\n}\n\ninterface UseBlankNodeProps {\n draggedNode: DraggedNode | null;\n targetList: NodeList | null;\n initDraggedNodeRect: InitSize | null;\n}\n\ninterface BlankNode {\n list: NodeList;\n node: ExistingNode;\n}\n\n/**\n * Appends the blank node to the list to increase the height of it.\n * Used when the dragged node is located inside another list.\n */\nconst useBlankNode = (props: UseBlankNodeProps) => {\n const { draggedNode, targetList, initDraggedNodeRect } = props;\n const initDraggedNodeRectRef = useRef(initDraggedNodeRect);\n const blankNode = useRef<BlankNode | null>(null);\n\n useEffect(() => {\n initDraggedNodeRectRef.current = initDraggedNodeRect;\n }, [initDraggedNodeRect]);\n\n useEffect(() => {\n if (\n !draggedNode ||\n !targetList ||\n !targetList.ref.current ||\n draggedNode.list === targetList ||\n !initDraggedNodeRectRef.current\n ) {\n return;\n }\n\n // Create a new blank div\n const { initWidth, initHeight } = initDraggedNodeRectRef.current;\n const div = document.createElement('div');\n div.style.width = `${initWidth}px`;\n div.style.height = `${initHeight}px`;\n div.style.minWidth = `${initWidth}px`;\n div.style.minHeight = `${initHeight}px`;\n\n let parent = targetList.ref.current;\n const innerList = targetList.innerRef.current;\n\n // The inner ref used only in the virtual list\n if (innerList) {\n const { width, height } = innerList.getBoundingClientRect();\n div.style.position = 'absolute';\n div.style.left = targetList.horizontal ? `${width}px` : '0px';\n div.style.top = targetList.horizontal ? '0px' : `${height}px`;\n parent = innerList;\n }\n\n // Append the blank div to increase the height of the list\n parent.appendChild(div);\n\n // Add the blank node to the node list\n const tail = targetList.getTail();\n blankNode.current = {\n list: targetList,\n node: targetList.add({\n ref: { current: div },\n setStyle: () => {},\n index: tail ? tail[4] + 1 : 0,\n }),\n };\n }, [draggedNode, targetList]);\n\n const removeBlankNode = useCallback(() => {\n const blank = blankNode.current;\n if (!blank) return;\n blankNode.current = null;\n blank.list.remove(blank.node);\n const [, , blankNodeRef] = blank.node;\n if (!blank.list.ref.current || !blankNodeRef.current) return;\n const parent = blankNodeRef.current.parentElement;\n if (parent) parent.removeChild(blankNodeRef.current);\n }, []);\n\n // Remove the blank node if the dragged node has been dropped\n useEffect(() => {\n if (!draggedNode) return () => {};\n return () => removeBlankNode();\n }, [draggedNode, removeBlankNode]);\n\n return removeBlankNode;\n};\n\nexport default useBlankNode;\n"],"file":"useBlankNode.js"}
@@ -0,0 +1,13 @@
1
+ import React, { useContext } from 'react';
2
+ export const DragAndDropContext = /*#__PURE__*/React.createContext({
3
+ registerList: () => {},
4
+ deregisterList: () => {},
5
+ onMouseDown: () => {},
6
+ onTouchStart: () => {},
7
+ nodeClassName: ''
8
+ });
9
+
10
+ const useDragAndDrop = () => useContext(DragAndDropContext);
11
+
12
+ export default useDragAndDrop;
13
+ //# sourceMappingURL=useDragAndDrop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/useDragAndDrop.ts"],"names":["React","useContext","DragAndDropContext","createContext","registerList","deregisterList","onMouseDown","onTouchStart","nodeClassName","useDragAndDrop"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,UAAhB,QAA0D,OAA1D;AAoBA,OAAO,MAAMC,kBAAkB,gBAAGF,KAAK,CAACG,aAAN,CAA6C;AAC7EC,EAAAA,YAAY,EAAE,MAAM,CAAE,CADuD;AAE7EC,EAAAA,cAAc,EAAE,MAAM,CAAE,CAFqD;AAG7EC,EAAAA,WAAW,EAAE,MAAM,CAAE,CAHwD;AAI7EC,EAAAA,YAAY,EAAE,MAAM,CAAE,CAJuD;AAK7EC,EAAAA,aAAa,EAAE;AAL8D,CAA7C,CAA3B;;AAQP,MAAMC,cAAc,GAAG,MACrBR,UAAU,CAACC,kBAAD,CADZ;;AAGA,eAAeO,cAAf","sourcesContent":["import React, { useContext, MouseEvent, TouchEvent } from 'react';\nimport { Position } from '@os-design/use-drag';\nimport NodeList, { ExistingNode } from './NodeList';\n\nexport interface SetDraggedNodeProps {\n list: NodeList;\n node: ExistingNode;\n position: Position;\n}\n\ntype NodeEventHandler<T> = (e: T, list: NodeList, node: ExistingNode) => void;\n\ninterface DragAndDropContextProps {\n registerList: (list: NodeList) => void;\n deregisterList: (id: string) => void;\n onMouseDown: NodeEventHandler<MouseEvent>;\n onTouchStart: NodeEventHandler<TouchEvent>;\n nodeClassName: string;\n}\n\nexport const DragAndDropContext = React.createContext<DragAndDropContextProps>({\n registerList: () => {},\n deregisterList: () => {},\n onMouseDown: () => {},\n onTouchStart: () => {},\n nodeClassName: '',\n});\n\nconst useDragAndDrop = (): DragAndDropContextProps =>\n useContext(DragAndDropContext);\n\nexport default useDragAndDrop;\n"],"file":"useDragAndDrop.js"}