react-arborist 0.1.14 → 0.2.0-beta.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 (85) hide show
  1. package/dist/{lib/components → components}/drop-cursor.d.ts +1 -0
  2. package/dist/{lib/components → components}/preview.d.ts +1 -0
  3. package/dist/{lib/components → components}/row.d.ts +0 -0
  4. package/dist/{lib/components → components}/tree.d.ts +0 -0
  5. package/dist/{lib/context.d.ts → context.d.ts} +0 -0
  6. package/dist/{lib/data → data}/enrich-tree.d.ts +0 -0
  7. package/dist/{lib/data → data}/flatten-tree.d.ts +0 -0
  8. package/dist/{lib/dnd → dnd}/compute-drop.d.ts +0 -0
  9. package/dist/{lib/dnd → dnd}/drag-hook.d.ts +0 -0
  10. package/dist/{lib/dnd → dnd}/drop-hook.d.ts +0 -0
  11. package/dist/{lib/dnd → dnd}/outer-drop-hook.d.ts +0 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.js +1354 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/module.js +1346 -0
  16. package/dist/module.js.map +1 -0
  17. package/dist/{lib/provider.d.ts → provider.d.ts} +1 -0
  18. package/dist/{lib/reducer.d.ts → reducer.d.ts} +0 -0
  19. package/dist/{lib/selection → selection}/range.d.ts +0 -0
  20. package/dist/{lib/selection → selection}/selection-hook.d.ts +0 -0
  21. package/dist/{lib/selection → selection}/selection.d.ts +0 -0
  22. package/dist/{lib/tree-api-hook.d.ts → tree-api-hook.d.ts} +0 -0
  23. package/dist/{lib/tree-api.d.ts → tree-api.d.ts} +1 -1
  24. package/dist/{lib/types.d.ts → types.d.ts} +4 -0
  25. package/dist/types.d.ts.map +1 -0
  26. package/dist/{lib/utils.d.ts → utils.d.ts} +0 -0
  27. package/package.json +16 -44
  28. package/src/components/drop-cursor.tsx +47 -0
  29. package/src/components/preview.tsx +108 -0
  30. package/src/components/row.tsx +119 -0
  31. package/src/components/tree.tsx +118 -0
  32. package/src/context.tsx +52 -0
  33. package/src/data/enrich-tree.ts +74 -0
  34. package/src/data/flatten-tree.ts +17 -0
  35. package/src/data/make-tree.ts +37 -0
  36. package/src/dnd/compute-drop.ts +184 -0
  37. package/src/dnd/drag-hook.ts +48 -0
  38. package/src/dnd/drop-hook.ts +66 -0
  39. package/src/dnd/measure-hover.ts +26 -0
  40. package/src/dnd/outer-drop-hook.ts +50 -0
  41. package/src/index.ts +5 -0
  42. package/src/provider.tsx +61 -0
  43. package/src/reducer.ts +161 -0
  44. package/src/selection/range.ts +41 -0
  45. package/src/selection/selection-hook.ts +24 -0
  46. package/src/selection/selection.test.ts +111 -0
  47. package/src/selection/selection.ts +186 -0
  48. package/src/tree-api-hook.ts +34 -0
  49. package/src/tree-api.ts +129 -0
  50. package/src/types.ts +147 -0
  51. package/src/utils.ts +35 -0
  52. package/tsconfig.json +28 -0
  53. package/README.md +0 -197
  54. package/dist/lib/components/drop-cursor.js +0 -53
  55. package/dist/lib/components/preview.js +0 -91
  56. package/dist/lib/components/row.js +0 -122
  57. package/dist/lib/components/tree.js +0 -76
  58. package/dist/lib/context.js +0 -57
  59. package/dist/lib/data/enrich-tree.js +0 -48
  60. package/dist/lib/data/flatten-tree.js +0 -20
  61. package/dist/lib/data/make-tree.d.ts +0 -5
  62. package/dist/lib/data/make-tree.js +0 -40
  63. package/dist/lib/data/visible-nodes-hook.d.ts +0 -2
  64. package/dist/lib/data/visible-nodes-hook.js +0 -19
  65. package/dist/lib/dnd/compute-drop.js +0 -146
  66. package/dist/lib/dnd/drag-hook.js +0 -36
  67. package/dist/lib/dnd/drop-hook.js +0 -59
  68. package/dist/lib/dnd/measure-hover.d.ts +0 -8
  69. package/dist/lib/dnd/measure-hover.js +0 -21
  70. package/dist/lib/dnd/outer-drop-hook.js +0 -51
  71. package/dist/lib/index.d.ts +0 -3
  72. package/dist/lib/index.js +0 -7
  73. package/dist/lib/provider.js +0 -46
  74. package/dist/lib/reducer.js +0 -147
  75. package/dist/lib/selection/range.js +0 -45
  76. package/dist/lib/selection/selection-hook.js +0 -24
  77. package/dist/lib/selection/selection.js +0 -192
  78. package/dist/lib/selection/selection.test.d.ts +0 -1
  79. package/dist/lib/selection/selection.test.js +0 -102
  80. package/dist/lib/tree-api-hook.js +0 -26
  81. package/dist/lib/tree-api.js +0 -130
  82. package/dist/lib/tree-monitor.d.ts +0 -15
  83. package/dist/lib/tree-monitor.js +0 -32
  84. package/dist/lib/types.js +0 -2
  85. package/dist/lib/utils.js +0 -39
@@ -1,122 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || function (mod) {
26
- if (mod && mod.__esModule) return mod;
27
- var result = {};
28
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
29
- __setModuleDefault(result, mod);
30
- return result;
31
- };
32
- Object.defineProperty(exports, "__esModule", { value: true });
33
- exports.Row = void 0;
34
- var jsx_runtime_1 = require("react/jsx-runtime");
35
- var react_1 = __importStar(require("react"));
36
- var context_1 = require("../context");
37
- var drag_hook_1 = require("../dnd/drag-hook");
38
- var drop_hook_1 = require("../dnd/drop-hook");
39
- exports.Row = react_1.default.memo(function Row(_a) {
40
- var index = _a.index, style = _a.style;
41
- var tree = (0, context_1.useStaticContext)();
42
- var selected = (0, context_1.useIsSelected)();
43
- var node = tree.api.visibleNodes[index];
44
- var next = tree.api.visibleNodes[index + 1] || null;
45
- var prev = tree.api.visibleNodes[index - 1] || null;
46
- var cursorParentId = (0, context_1.useCursorParentId)();
47
- var cursorOverFolder = (0, context_1.useIsCursorOverFolder)();
48
- var el = (0, react_1.useRef)(null);
49
- var _b = (0, drag_hook_1.useDragHook)(node), isDragging = _b[0].isDragging, dragRef = _b[1];
50
- var _c = (0, drop_hook_1.useDropHook)(el, node, prev, next), dropRef = _c[1];
51
- var isEditing = node.id === (0, context_1.useEditingId)();
52
- var isSelected = selected(index);
53
- var nextSelected = next && selected(index + 1);
54
- var prevSelected = prev && selected(index - 1);
55
- var isHoveringOverChild = node.id === cursorParentId;
56
- var isOverFolder = node.id === cursorParentId && cursorOverFolder;
57
- var isOpen = node.isOpen;
58
- var indent = tree.indent * node.level;
59
- var state = (0, react_1.useMemo)(function () {
60
- return {
61
- isEditing: isEditing,
62
- isDragging: isDragging,
63
- isFirstOfSelected: isSelected && !prevSelected,
64
- isLastOfSelected: isSelected && !nextSelected,
65
- isSelected: isSelected,
66
- isHoveringOverChild: isHoveringOverChild,
67
- isOpen: isOpen,
68
- isOverFolder: isOverFolder,
69
- };
70
- }, [
71
- isEditing,
72
- isSelected,
73
- prevSelected,
74
- nextSelected,
75
- isHoveringOverChild,
76
- isOpen,
77
- isDragging,
78
- isOverFolder,
79
- ]);
80
- var ref = (0, react_1.useCallback)(function (n) {
81
- el.current = n;
82
- dragRef(dropRef(n));
83
- }, [dragRef, dropRef]);
84
- var styles = (0, react_1.useMemo)(function () { return ({
85
- row: __assign({}, style),
86
- indent: { paddingLeft: indent },
87
- }); }, [indent, style]);
88
- var handlers = (0, react_1.useMemo)(function () {
89
- return {
90
- select: function (e, selectOnClick) {
91
- if (selectOnClick === void 0) { selectOnClick = true; }
92
- if (node.rowIndex === null)
93
- return;
94
- if (selectOnClick || e.metaKey || e.shiftKey) {
95
- tree.api.select(node.rowIndex, e.metaKey, e.shiftKey);
96
- }
97
- else {
98
- tree.api.select(null, false, false);
99
- }
100
- },
101
- toggle: function (e) {
102
- e.stopPropagation();
103
- tree.onToggle(node.id, !node.isOpen);
104
- },
105
- edit: function () {
106
- tree.api.edit(node.id);
107
- },
108
- submit: function (name) {
109
- if (name.trim())
110
- tree.onEdit(node.id, name);
111
- tree.api.edit(null);
112
- },
113
- reset: function () {
114
- tree.api.edit(null);
115
- },
116
- };
117
- }, [tree, node]);
118
- var Renderer = (0, react_1.useMemo)(function () {
119
- return react_1.default.memo(tree.renderer);
120
- }, [tree.renderer]);
121
- return ((0, jsx_runtime_1.jsx)(Renderer, { innerRef: ref, data: node.model, styles: styles, state: state, handlers: handlers, preview: false, tree: tree.api }, void 0));
122
- });
@@ -1,76 +0,0 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __rest = (this && this.__rest) || function (s, e) {
14
- var t = {};
15
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
16
- t[p] = s[p];
17
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
18
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
19
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
20
- t[p[i]] = s[p[i]];
21
- }
22
- return t;
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.Tree = void 0;
26
- var jsx_runtime_1 = require("react/jsx-runtime");
27
- var react_1 = require("react");
28
- var react_dnd_1 = require("react-dnd");
29
- var react_dnd_html5_backend_1 = require("react-dnd-html5-backend");
30
- var react_window_1 = require("react-window");
31
- var context_1 = require("../context");
32
- var enrich_tree_1 = require("../data/enrich-tree");
33
- var outer_drop_hook_1 = require("../dnd/outer-drop-hook");
34
- var provider_1 = require("../provider");
35
- var utils_1 = require("../utils");
36
- var drop_cursor_1 = require("./drop-cursor");
37
- var preview_1 = require("./preview");
38
- var row_1 = require("./row");
39
- var OuterElement = (0, react_1.forwardRef)(function Outer(props, ref) {
40
- var children = props.children, rest = __rest(props, ["children"]);
41
- var tree = (0, context_1.useStaticContext)();
42
- return (
43
- // @ts-ignore
44
- (0, jsx_runtime_1.jsxs)("div", __assign({ ref: ref }, rest, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ style: {
45
- height: tree.api.visibleNodes.length * tree.rowHeight,
46
- width: "100%",
47
- overflow: "hidden",
48
- position: "absolute",
49
- left: "0",
50
- right: "0",
51
- } }, { children: (0, jsx_runtime_1.jsx)(drop_cursor_1.DropCursor, {}, void 0) }), void 0), children] }), void 0));
52
- });
53
- function List(props) {
54
- var tree = (0, context_1.useStaticContext)();
55
- return ((0, jsx_runtime_1.jsx)("div", __assign({ style: { height: tree.height, width: tree.width, overflow: "hidden" } }, { children: (0, jsx_runtime_1.jsx)(react_window_1.FixedSizeList, __assign({ className: props.className, outerRef: tree.listEl, itemCount: tree.api.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight, itemKey: function (index) { var _a; return ((_a = tree.api.visibleNodes[index]) === null || _a === void 0 ? void 0 : _a.id) || index; }, outerElementType: OuterElement,
56
- // @ts-ignore
57
- ref: tree.list }, { children: row_1.Row }), void 0) }), void 0));
58
- }
59
- function OuterDrop(props) {
60
- (0, outer_drop_hook_1.useOuterDrop)();
61
- return props.children;
62
- }
63
- exports.Tree = (0, react_1.forwardRef)(function Tree(props, ref) {
64
- var root = (0, react_1.useMemo)(function () {
65
- return (0, enrich_tree_1.enrichTree)(props.data, props.hideRoot, props.getChildren, props.isOpen, props.disableDrag, props.disableDrop, props.openByDefault);
66
- }, [
67
- props.data,
68
- props.hideRoot,
69
- props.getChildren,
70
- props.isOpen,
71
- props.disableDrag,
72
- props.disableDrop,
73
- props.openByDefault,
74
- ]);
75
- return ((0, jsx_runtime_1.jsx)(provider_1.TreeViewProvider, __assign({ imperativeHandle: ref, root: root, listEl: (0, react_1.useRef)(null), renderer: props.children, width: props.width === undefined ? 300 : props.width, height: props.height === undefined ? 500 : props.height, indent: props.indent === undefined ? 24 : props.indent, rowHeight: props.rowHeight === undefined ? 24 : props.rowHeight, onMove: props.onMove || utils_1.noop, onToggle: props.onToggle || utils_1.noop, onEdit: props.onEdit || utils_1.noop }, { children: (0, jsx_runtime_1.jsxs)(react_dnd_1.DndProvider, __assign({ backend: react_dnd_html5_backend_1.HTML5Backend }, { children: [(0, jsx_runtime_1.jsx)(OuterDrop, { children: (0, jsx_runtime_1.jsx)(List, { className: props.className }, void 0) }, void 0), (0, jsx_runtime_1.jsx)(preview_1.Preview, {}, void 0)] }), void 0) }), void 0));
76
- });
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useEditingId = exports.EditingIdContext = exports.useIsSelected = exports.useSelectedIds = exports.SelectionContext = exports.useDispatch = exports.DispatchContext = exports.useStaticContext = exports.Static = exports.useCursorLocation = exports.CursorLocationContext = exports.useIsCursorOverFolder = exports.IsCursorOverFolder = exports.useCursorParentId = exports.CursorParentId = void 0;
4
- var react_1 = require("react");
5
- var selection_1 = require("./selection/selection");
6
- exports.CursorParentId = (0, react_1.createContext)(null);
7
- function useCursorParentId() {
8
- return (0, react_1.useContext)(exports.CursorParentId);
9
- }
10
- exports.useCursorParentId = useCursorParentId;
11
- exports.IsCursorOverFolder = (0, react_1.createContext)(false);
12
- function useIsCursorOverFolder() {
13
- return (0, react_1.useContext)(exports.IsCursorOverFolder);
14
- }
15
- exports.useIsCursorOverFolder = useIsCursorOverFolder;
16
- exports.CursorLocationContext = (0, react_1.createContext)(null);
17
- function useCursorLocation() {
18
- return (0, react_1.useContext)(exports.CursorLocationContext);
19
- }
20
- exports.useCursorLocation = useCursorLocation;
21
- exports.Static = (0, react_1.createContext)(null);
22
- function useStaticContext() {
23
- var value = (0, react_1.useContext)(exports.Static);
24
- if (!value)
25
- throw new Error("Context must be in a provider");
26
- return value;
27
- }
28
- exports.useStaticContext = useStaticContext;
29
- exports.DispatchContext = (0, react_1.createContext)(null);
30
- function useDispatch() {
31
- var dispatch = (0, react_1.useContext)(exports.DispatchContext);
32
- if (!dispatch)
33
- throw new Error("No dispatch provided");
34
- return dispatch;
35
- }
36
- exports.useDispatch = useDispatch;
37
- exports.SelectionContext = (0, react_1.createContext)(null);
38
- function useSelectedIds() {
39
- var value = (0, react_1.useContext)(exports.SelectionContext);
40
- if (!value)
41
- throw new Error("Must provide selection context");
42
- return value.ids;
43
- }
44
- exports.useSelectedIds = useSelectedIds;
45
- function useIsSelected() {
46
- var value = (0, react_1.useContext)(exports.SelectionContext);
47
- if (!value)
48
- throw new Error("Must provide selection context");
49
- var s = (0, react_1.useMemo)(function () { return selection_1.Selection.parse(value.data, []); }, [value.data]);
50
- return function (i) { return s.contains(i); };
51
- }
52
- exports.useIsSelected = useIsSelected;
53
- exports.EditingIdContext = (0, react_1.createContext)(null);
54
- function useEditingId() {
55
- return (0, react_1.useContext)(exports.EditingIdContext);
56
- }
57
- exports.useEditingId = useEditingId;
@@ -1,48 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.enrichTree = void 0;
4
- function createNode(model, level, parent, children, isOpen, isDraggable, isDroppable) {
5
- return {
6
- id: model.id,
7
- level: level,
8
- parent: parent,
9
- children: children,
10
- isOpen: isOpen,
11
- isDraggable: isDraggable,
12
- isDroppable: isDroppable,
13
- model: model,
14
- rowIndex: null,
15
- };
16
- }
17
- function access(obj, accessor) {
18
- if (typeof accessor === "boolean") {
19
- return accessor;
20
- }
21
- if (typeof accessor === "string") {
22
- return obj[accessor];
23
- }
24
- return accessor(obj);
25
- }
26
- function enrichTree(model, hideRoot, getChildren, isOpen, disableDrag, disableDrop, openByDefault) {
27
- if (hideRoot === void 0) { hideRoot = false; }
28
- if (getChildren === void 0) { getChildren = "children"; }
29
- if (isOpen === void 0) { isOpen = "isOpen"; }
30
- if (disableDrag === void 0) { disableDrag = false; }
31
- if (disableDrop === void 0) { disableDrop = false; }
32
- if (openByDefault === void 0) { openByDefault = true; }
33
- function visitSelfAndChildren(model, level, parent) {
34
- var open = access(model, isOpen);
35
- var draggable = !access(model, disableDrag);
36
- var droppable = !access(model, disableDrop);
37
- var node = createNode(model, level, parent, null, open === undefined ? openByDefault : open, draggable, droppable);
38
- var children = access(model, getChildren);
39
- if (children) {
40
- node.children = children.map(function (child) {
41
- return visitSelfAndChildren(child, level + 1, node);
42
- });
43
- }
44
- return node;
45
- }
46
- return visitSelfAndChildren(model, hideRoot ? -1 : 0, null);
47
- }
48
- exports.enrichTree = enrichTree;
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.flattenTree = void 0;
4
- function flattenTree(root) {
5
- var list = [];
6
- var index = 0;
7
- function collect(node) {
8
- var _a;
9
- if (node.level >= 0) {
10
- node.rowIndex = index++;
11
- list.push(node);
12
- }
13
- if (node.isOpen) {
14
- (_a = node.children) === null || _a === void 0 ? void 0 : _a.forEach(collect);
15
- }
16
- }
17
- collect(root);
18
- return list;
19
- }
20
- exports.flattenTree = flattenTree;
@@ -1,5 +0,0 @@
1
- export declare function makeTree(string: string): {
2
- id: string;
3
- name: string;
4
- isOpen: boolean;
5
- };
@@ -1,40 +0,0 @@
1
- "use strict";
2
- // A function that turns a string of text into a tree
3
- // Each line is a node
4
- // The number of spaces at the beginning indicate the level
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.makeTree = void 0;
7
- function makeTree(string) {
8
- var root = { id: "ROOT", name: "ROOT", isOpen: true };
9
- var prevNode = root;
10
- var prevLevel = -1;
11
- var id = 1;
12
- string.split("\n").forEach(function (line) {
13
- var name = line.trimStart();
14
- var level = line.length - name.length;
15
- var diff = level - prevLevel;
16
- var node = { id: (id++).toString(), name: name, isOpen: true };
17
- if (diff === 1) {
18
- // First child
19
- //@ts-ignore
20
- node.parent = prevNode;
21
- //@ts-ignore
22
- prevNode.children = [node];
23
- }
24
- else {
25
- // Find the parent and go up
26
- //@ts-ignore
27
- var parent_1 = prevNode.parent;
28
- for (var i = diff; i < 0; i++) {
29
- parent_1 = parent_1.parent;
30
- }
31
- //@ts-ignore
32
- node.parent = parent_1;
33
- parent_1.children.push(node);
34
- }
35
- prevNode = node;
36
- prevLevel = level;
37
- });
38
- return root;
39
- }
40
- exports.makeTree = makeTree;
@@ -1,2 +0,0 @@
1
- import { TreeProps, Node, IdObj } from "../types";
2
- export declare function useVisibleNodes<T extends IdObj>(props: TreeProps<T>): Node<T>[];
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useVisibleNodes = void 0;
4
- var react_1 = require("react");
5
- var enrich_tree_1 = require("./enrich-tree");
6
- var flatten_tree_1 = require("./flatten-tree");
7
- function useVisibleNodes(props) {
8
- var root = (0, react_1.useMemo)(function () {
9
- return (0, enrich_tree_1.enrichTree)(props.data, props.hideRoot, props.childrenAccessor, props.isOpenAccessor, props.openByDefault);
10
- }, [
11
- props.data,
12
- props.hideRoot,
13
- props.childrenAccessor,
14
- props.isOpenAccessor,
15
- props.openByDefault,
16
- ]);
17
- return (0, react_1.useMemo)(function () { return (0, flatten_tree_1.flattenTree)(root); }, [root]);
18
- }
19
- exports.useVisibleNodes = useVisibleNodes;
@@ -1,146 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.computeDrop = void 0;
4
- var utils_1 = require("../utils");
5
- function measureHover(el, offset) {
6
- var rect = el.getBoundingClientRect();
7
- var x = offset.x - Math.round(rect.x);
8
- var y = offset.y - Math.round(rect.y);
9
- var height = rect.height;
10
- var inTopHalf = y < height / 2;
11
- var inBottomHalf = !inTopHalf;
12
- var pad = height / 4;
13
- var inMiddle = y > pad && y < height - pad;
14
- var atTop = !inMiddle && inTopHalf;
15
- var atBottom = !inMiddle && inBottomHalf;
16
- return { x: x, inTopHalf: inTopHalf, inBottomHalf: inBottomHalf, inMiddle: inMiddle, atTop: atTop, atBottom: atBottom };
17
- }
18
- function getNodesAroundCursor(node, prev, next, hover) {
19
- if (!node) {
20
- // We're hoving over the empty part of the list, not over an item,
21
- // Put the cursor below the last item which is "prev"
22
- return [prev, null];
23
- }
24
- if ((0, utils_1.isFolder)(node)) {
25
- if (hover.atTop) {
26
- return [prev, node];
27
- }
28
- else if (hover.inMiddle) {
29
- return [node, node];
30
- }
31
- else {
32
- return [node, next];
33
- }
34
- }
35
- else {
36
- if (hover.inTopHalf) {
37
- return [prev, node];
38
- }
39
- else {
40
- return [node, next];
41
- }
42
- }
43
- }
44
- function getDropLevel(hovering, aboveCursor, belowCursor, indent) {
45
- var hoverLevel = Math.round(Math.max(0, hovering.x - indent) / indent);
46
- var min, max;
47
- if (!aboveCursor) {
48
- max = 0;
49
- min = 0;
50
- }
51
- else if (!belowCursor) {
52
- max = aboveCursor.level;
53
- min = 0;
54
- }
55
- else {
56
- max = aboveCursor.level;
57
- min = belowCursor.level;
58
- }
59
- return (0, utils_1.bound)(hoverLevel, min, max);
60
- }
61
- function canDrop(above, below) {
62
- if (!above) {
63
- return true;
64
- }
65
- var n = above;
66
- if ((0, utils_1.isClosed)(above) && above !== below)
67
- n = above.parent;
68
- while (n) {
69
- if (!n.isDroppable)
70
- return false;
71
- n = n.parent;
72
- }
73
- return true;
74
- }
75
- function dropAt(parentId, index) {
76
- return { parentId: parentId || null, index: index };
77
- }
78
- function lineCursor(index, level) {
79
- return {
80
- type: "line",
81
- index: index,
82
- level: level,
83
- };
84
- }
85
- function noCursor() {
86
- return {
87
- type: "none",
88
- };
89
- }
90
- function highlightCursor(id) {
91
- return {
92
- type: "highlight",
93
- id: id,
94
- };
95
- }
96
- function walkUpFrom(node, level) {
97
- var _a;
98
- var drop = node;
99
- while (drop.parent && drop.level > level) {
100
- drop = drop.parent;
101
- }
102
- var parentId = ((_a = drop.parent) === null || _a === void 0 ? void 0 : _a.id) || null;
103
- var index = (0, utils_1.indexOf)(drop) + 1;
104
- return { parentId: parentId, index: index };
105
- }
106
- /**
107
- * This is the most complex, tricky function in the whole repo.
108
- * It could be simplified and made more understandable.
109
- */
110
- function computeDrop(args) {
111
- var _a;
112
- var hover = measureHover(args.element, args.offset);
113
- var node = args.node, nextNode = args.nextNode, prevNode = args.prevNode;
114
- var _b = getNodesAroundCursor(node, prevNode, nextNode, hover), above = _b[0], below = _b[1];
115
- if (!canDrop(above, below)) {
116
- return { drop: null, cursor: noCursor() };
117
- }
118
- /* Hovering over the middle of a folder */
119
- if (node && (0, utils_1.isFolder)(node) && hover.inMiddle) {
120
- return {
121
- drop: dropAt(node.id, 0),
122
- cursor: highlightCursor(node.id),
123
- };
124
- }
125
- /* At the top of the list */
126
- if (!above) {
127
- return {
128
- drop: dropAt((_a = below === null || below === void 0 ? void 0 : below.parent) === null || _a === void 0 ? void 0 : _a.id, 0),
129
- cursor: lineCursor(0, 0),
130
- };
131
- }
132
- /* The above node is an item or a closed folder */
133
- if ((0, utils_1.isItem)(above) || (0, utils_1.isClosed)(above)) {
134
- var level = getDropLevel(hover, above, below, args.indent);
135
- return {
136
- drop: walkUpFrom(above, level),
137
- cursor: lineCursor(above.rowIndex + 1, level),
138
- };
139
- }
140
- /* The above node is an open folder */
141
- return {
142
- drop: dropAt(above === null || above === void 0 ? void 0 : above.id, 0),
143
- cursor: lineCursor(above.rowIndex + 1, above.level + 1),
144
- };
145
- }
146
- exports.computeDrop = computeDrop;
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useDragHook = void 0;
4
- var react_1 = require("react");
5
- var react_dnd_1 = require("react-dnd");
6
- var react_dnd_html5_backend_1 = require("react-dnd-html5-backend");
7
- var context_1 = require("../context");
8
- function useDragHook(node) {
9
- var tree = (0, context_1.useStaticContext)();
10
- var isSelected = (0, context_1.useIsSelected)();
11
- var ids = (0, context_1.useSelectedIds)();
12
- var _a = (0, react_dnd_1.useDrag)(function () { return ({
13
- canDrag: function () { return node.isDraggable; },
14
- type: "NODE",
15
- item: function () { return ({
16
- id: node.id,
17
- dragIds: isSelected(node.rowIndex) ? ids : [node.id],
18
- }); },
19
- collect: function (m) { return ({
20
- isDragging: m.isDragging(),
21
- }); },
22
- end: function (item, monitor) {
23
- tree.api.hideCursor();
24
- var drop = monitor.getDropResult();
25
- if (drop && drop.parentId) {
26
- tree.onMove(item.dragIds, drop.parentId, drop.index);
27
- tree.onToggle(drop.parentId, true);
28
- }
29
- },
30
- }); }, [ids, node]), isDragging = _a[0].isDragging, ref = _a[1], preview = _a[2];
31
- (0, react_1.useEffect)(function () {
32
- preview((0, react_dnd_html5_backend_1.getEmptyImage)());
33
- }, [preview]);
34
- return [{ isDragging: isDragging }, ref];
35
- }
36
- exports.useDragHook = useDragHook;
@@ -1,59 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useDropHook = void 0;
4
- var react_dnd_1 = require("react-dnd");
5
- var context_1 = require("../context");
6
- var utils_1 = require("../utils");
7
- var compute_drop_1 = require("./compute-drop");
8
- function useDropHook(el, node, prev, next) {
9
- var tree = (0, context_1.useStaticContext)();
10
- return (0, react_dnd_1.useDrop)(function () { return ({
11
- accept: "NODE",
12
- canDrop: function (item) {
13
- for (var _i = 0, _a = item.dragIds; _i < _a.length; _i++) {
14
- var id = _a[_i];
15
- var drag = tree.api.getNode(id);
16
- if (!drag)
17
- return false;
18
- if ((0, utils_1.isFolder)(drag) && (0, utils_1.isDecendent)(node, drag))
19
- return false;
20
- }
21
- return true;
22
- },
23
- hover: function (item, m) {
24
- if (m.canDrop()) {
25
- var offset = m.getClientOffset();
26
- if (!el.current || !offset)
27
- return;
28
- var cursor = (0, compute_drop_1.computeDrop)({
29
- element: el.current,
30
- offset: offset,
31
- indent: tree.indent,
32
- node: node,
33
- prevNode: prev,
34
- nextNode: next,
35
- }).cursor;
36
- if (cursor)
37
- tree.api.showCursor(cursor);
38
- }
39
- else {
40
- tree.api.hideCursor();
41
- }
42
- },
43
- drop: function (item, m) {
44
- var offset = m.getClientOffset();
45
- if (!el.current || !offset)
46
- return;
47
- var drop = (0, compute_drop_1.computeDrop)({
48
- element: el.current,
49
- offset: offset,
50
- indent: tree.indent,
51
- node: node,
52
- prevNode: prev,
53
- nextNode: next,
54
- }).drop;
55
- return drop;
56
- },
57
- }); }, [node, prev, el, tree]);
58
- }
59
- exports.useDropHook = useDropHook;
@@ -1,8 +0,0 @@
1
- import { XYCoord } from "react-dnd";
2
- export declare function measureHover(el: HTMLElement, offset: XYCoord, indent: number): {
3
- level: number;
4
- inTopHalf: boolean;
5
- inBottomHalf: boolean;
6
- inMiddle: boolean;
7
- };
8
- export declare type HoverData = ReturnType<typeof measureHover>;
@@ -1,21 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.measureHover = void 0;
4
- var utils_1 = require("../utils");
5
- function measureHover(el, offset, indent) {
6
- var nextEl = el.nextElementSibling;
7
- var prevEl = el.previousElementSibling;
8
- var rect = el.getBoundingClientRect();
9
- var x = offset.x - Math.round(rect.x);
10
- var y = offset.y - Math.round(rect.y);
11
- var height = rect.height;
12
- var inTopHalf = y < height / 2;
13
- var inBottomHalf = !inTopHalf;
14
- var pad = height / 4;
15
- var inMiddle = y > pad && y < height - pad;
16
- var maxLevel = Number(inBottomHalf ? el.dataset.level : prevEl ? prevEl.dataset.level : 0);
17
- var minLevel = Number(inTopHalf ? el.dataset.level : nextEl ? nextEl.dataset.level : 0);
18
- var level = (0, utils_1.bound)(Math.floor(x / indent), minLevel, maxLevel);
19
- return { level: level, inTopHalf: inTopHalf, inBottomHalf: inBottomHalf, inMiddle: inMiddle };
20
- }
21
- exports.measureHover = measureHover;