react-arborist 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/components/drop-cursor.js +3 -8
- package/dist/lib/components/preview.js +22 -17
- package/dist/lib/components/row.js +3 -21
- package/dist/lib/components/tree.d.ts +2 -3
- package/dist/lib/components/tree.js +19 -71
- package/dist/lib/context.d.ts +3 -3
- package/dist/lib/context.js +3 -25
- package/dist/lib/data/enrich-tree.d.ts +2 -0
- package/dist/lib/data/enrich-tree.js +34 -0
- package/dist/lib/data/flatten-tree.d.ts +2 -0
- package/dist/lib/data/flatten-tree.js +20 -0
- package/dist/lib/data/make-tree.d.ts +5 -0
- package/dist/lib/data/make-tree.js +40 -0
- package/dist/lib/data/visible-nodes-hook.d.ts +2 -0
- package/dist/lib/data/visible-nodes-hook.js +13 -0
- package/dist/lib/dnd/outer-drop-hook.d.ts +1 -0
- package/dist/lib/dnd/outer-drop-hook.js +49 -0
- package/dist/lib/types.d.ts +47 -43
- package/dist/lib/utils.d.ts +1 -9
- package/dist/lib/utils.js +1 -81
- package/package.json +3 -1
|
@@ -10,12 +10,9 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
14
|
exports.DropCursor = void 0;
|
|
18
|
-
var
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
19
16
|
var react_dom_1 = require("react-dom");
|
|
20
17
|
var context_1 = require("../context");
|
|
21
18
|
function DropCursor(_a) {
|
|
@@ -32,7 +29,7 @@ function DropCursor(_a) {
|
|
|
32
29
|
left: left + "px",
|
|
33
30
|
right: treeView.indent + "px",
|
|
34
31
|
};
|
|
35
|
-
return (0, react_dom_1.createPortal)(
|
|
32
|
+
return (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)(DefaultCursor, { style: style }, void 0), root);
|
|
36
33
|
}
|
|
37
34
|
exports.DropCursor = DropCursor;
|
|
38
35
|
var placeholderStyle = {
|
|
@@ -52,7 +49,5 @@ var circleStyle = {
|
|
|
52
49
|
};
|
|
53
50
|
function DefaultCursor(_a) {
|
|
54
51
|
var style = _a.style;
|
|
55
|
-
return (
|
|
56
|
-
react_1.default.createElement("div", { style: __assign({}, circleStyle) }),
|
|
57
|
-
react_1.default.createElement("div", { style: __assign({}, lineStyle) })));
|
|
52
|
+
return ((0, jsx_runtime_1.jsxs)("div", __assign({ style: __assign(__assign({}, placeholderStyle), style) }, { children: [(0, jsx_runtime_1.jsx)("div", { style: __assign({}, circleStyle) }, void 0), (0, jsx_runtime_1.jsx)("div", { style: __assign({}, lineStyle) }, void 0)] }), void 0));
|
|
58
53
|
}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
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);
|
|
4
12
|
};
|
|
5
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
14
|
exports.Preview = void 0;
|
|
7
|
-
var
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
16
|
var react_dnd_1 = require("react-dnd");
|
|
9
17
|
var context_1 = require("../context");
|
|
10
18
|
var layerStyles = {
|
|
@@ -41,19 +49,16 @@ function Preview() {
|
|
|
41
49
|
var node = treeView.getNode(item.id);
|
|
42
50
|
if (!node)
|
|
43
51
|
return null;
|
|
44
|
-
return (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
rename: function () { },
|
|
56
|
-
} })),
|
|
57
|
-
item.dragIds.length > 1 && (react_1.default.createElement("div", { className: "selected-count", style: getCountStyle(mouse) }, item.dragIds.length))));
|
|
52
|
+
return ((0, jsx_runtime_1.jsxs)("div", __assign({ style: layerStyles }, { children: [(0, jsx_runtime_1.jsx)("div", __assign({ className: "row preview", style: getStyle(offset) }, { children: (0, jsx_runtime_1.jsx)(treeView.renderer, { preview: true, node: node, props: { style: {}, ref: function () { } }, state: {
|
|
53
|
+
isEditing: false,
|
|
54
|
+
isSelected: false,
|
|
55
|
+
isHoveringOverChild: false,
|
|
56
|
+
isOpen: node.isOpen,
|
|
57
|
+
}, indent: treeView.indent * node.level, handlers: {
|
|
58
|
+
toggleIsEditing: function () { },
|
|
59
|
+
toggleIsSelected: function () { },
|
|
60
|
+
toggleIsOpen: function () { },
|
|
61
|
+
rename: function () { },
|
|
62
|
+
} }, void 0) }), void 0), item.dragIds.length > 1 && ((0, jsx_runtime_1.jsx)("div", __assign({ className: "selected-count", style: getCountStyle(mouse) }, { children: item.dragIds.length }), void 0))] }), void 0));
|
|
58
63
|
}
|
|
59
64
|
exports.Preview = Preview;
|
|
@@ -1,26 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
3
|
exports.Row = void 0;
|
|
23
|
-
var
|
|
4
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
var react_1 = require("react");
|
|
24
6
|
var context_1 = require("../context");
|
|
25
7
|
var drag_hook_1 = require("../dnd/drag-hook");
|
|
26
8
|
var drop_hook_1 = require("../dnd/drop-hook");
|
|
@@ -97,5 +79,5 @@ exports.Row = (0, react_1.memo)(function Row(_a) {
|
|
|
97
79
|
var Renderer = (0, react_1.useMemo)(function () {
|
|
98
80
|
return (0, react_1.memo)(treeView.renderer);
|
|
99
81
|
}, [treeView.renderer]);
|
|
100
|
-
return (
|
|
82
|
+
return ((0, jsx_runtime_1.jsx)(Renderer, { preview: false, node: node, props: props, state: state, indent: treeView.indent * node.level, handlers: handlers }, void 0));
|
|
101
83
|
});
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export declare const Tree: React.ForwardRefExoticComponent<TreeViewProps & React.RefAttributes<TreeViewHandle>>;
|
|
1
|
+
import { IdObj, TreeProps } from "../types";
|
|
2
|
+
export declare function Tree<T extends IdObj>(props: TreeProps<T>): JSX.Element;
|
|
@@ -1,89 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
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);
|
|
20
12
|
};
|
|
21
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
14
|
exports.Tree = void 0;
|
|
23
|
-
var
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
var react_1 = require("react");
|
|
24
17
|
var react_dnd_1 = require("react-dnd");
|
|
25
18
|
var react_dnd_html5_backend_1 = require("react-dnd-html5-backend");
|
|
26
19
|
var react_window_1 = require("react-window");
|
|
27
20
|
var context_1 = require("../context");
|
|
28
|
-
var
|
|
29
|
-
var
|
|
21
|
+
var visible_nodes_hook_1 = require("../data/visible-nodes-hook");
|
|
22
|
+
var outer_drop_hook_1 = require("../dnd/outer-drop-hook");
|
|
30
23
|
var utils_1 = require("../utils");
|
|
31
24
|
var preview_1 = require("./preview");
|
|
32
25
|
var row_1 = require("./row");
|
|
33
|
-
function
|
|
34
|
-
|
|
35
|
-
var visibleNodes = (0, react_1.useMemo)(function () { return (0, utils_1.flattenTree)(root); }, [root]);
|
|
36
|
-
var listRef = (0, react_1.useRef)(null);
|
|
37
|
-
return (react_1.default.createElement(context_1.TreeViewProvider, { handle: ref, visibleNodes: visibleNodes, listRef: listRef, renderer: props.children, width: props.width, height: props.height, indent: props.indent || 12, rowHeight: props.rowHeight || 24, onClose: props.onClose || utils_1.noop, onMove: props.onMove || utils_1.noop, onOpen: props.onOpen || utils_1.noop, onRename: props.onRename || utils_1.noop },
|
|
38
|
-
react_1.default.createElement(react_dnd_1.DndProvider, { backend: react_dnd_html5_backend_1.HTML5Backend },
|
|
39
|
-
react_1.default.createElement(OuterDrop, null,
|
|
40
|
-
react_1.default.createElement(List, { className: props.className })),
|
|
41
|
-
react_1.default.createElement(preview_1.Preview, null))));
|
|
26
|
+
function Tree(props) {
|
|
27
|
+
return ((0, jsx_runtime_1.jsx)(context_1.TreeViewProvider, __assign({ handle: props.handle, visibleNodes: (0, visible_nodes_hook_1.useVisibleNodes)(props), listRef: (0, react_1.useRef)(null), renderer: props.children, width: props.width, height: props.height, indent: props.indent || 12, rowHeight: props.rowHeight || 24, onClose: props.onClose || utils_1.noop, onMove: props.onMove || utils_1.noop, onOpen: props.onOpen || utils_1.noop, onRename: props.onRename || 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));
|
|
42
28
|
}
|
|
29
|
+
exports.Tree = Tree;
|
|
43
30
|
function OuterDrop(props) {
|
|
44
|
-
|
|
45
|
-
// In case we drop an item at the bottom of the list
|
|
46
|
-
var _a = (0, react_dnd_1.useDrop)(function () { return ({
|
|
47
|
-
accept: "NODE",
|
|
48
|
-
hover: function (item, m) {
|
|
49
|
-
if (!m.isOver({ shallow: true }))
|
|
50
|
-
return;
|
|
51
|
-
var offset = m.getClientOffset();
|
|
52
|
-
if (!tree.listRef.current || !offset)
|
|
53
|
-
return;
|
|
54
|
-
var cursor = (0, compute_drop_1.computeDrop)({
|
|
55
|
-
element: tree.listRef.current,
|
|
56
|
-
offset: offset,
|
|
57
|
-
indent: tree.indent,
|
|
58
|
-
node: null,
|
|
59
|
-
prevNode: tree.visibleNodes[tree.visibleNodes.length - 1],
|
|
60
|
-
nextNode: null,
|
|
61
|
-
}).cursor;
|
|
62
|
-
tree.dispatch((0, reducer_1.setCursorLocation)(cursor));
|
|
63
|
-
},
|
|
64
|
-
drop: function (item, m) {
|
|
65
|
-
if (m.didDrop())
|
|
66
|
-
return;
|
|
67
|
-
console.log("drop!!");
|
|
68
|
-
var offset = m.getClientOffset();
|
|
69
|
-
if (!tree.listRef.current || !offset)
|
|
70
|
-
return;
|
|
71
|
-
var _a = (0, compute_drop_1.computeDrop)({
|
|
72
|
-
element: tree.listRef.current,
|
|
73
|
-
offset: offset,
|
|
74
|
-
indent: tree.indent,
|
|
75
|
-
node: null,
|
|
76
|
-
prevNode: tree.visibleNodes[tree.visibleNodes.length - 1],
|
|
77
|
-
nextNode: null,
|
|
78
|
-
}), parentId = _a.parentId, index = _a.index;
|
|
79
|
-
return { parentId: parentId, index: index };
|
|
80
|
-
},
|
|
81
|
-
}); }, [tree]), drop = _a[1];
|
|
82
|
-
drop(tree.listRef);
|
|
31
|
+
(0, outer_drop_hook_1.useOuterDrop)();
|
|
83
32
|
return props.children;
|
|
84
33
|
}
|
|
85
34
|
function List(props) {
|
|
86
35
|
var tree = (0, context_1.useStaticContext)();
|
|
87
|
-
return (
|
|
36
|
+
return ((0, jsx_runtime_1.jsx)(react_window_1.FixedSizeList, __assign({ className: props.className, outerRef: tree.listRef, itemCount: tree.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight }, { children: row_1.Row }), void 0));
|
|
88
37
|
}
|
|
89
|
-
exports.Tree = (0, react_1.forwardRef)(TreeComponent);
|
package/dist/lib/context.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { StaticContext,
|
|
1
|
+
import { IdObj, StaticContext, TreeProviderProps } from "./types";
|
|
2
2
|
export declare function useCursorParentId(): string | null;
|
|
3
|
-
export declare function useStaticContext(): StaticContext
|
|
3
|
+
export declare function useStaticContext(): StaticContext<IdObj>;
|
|
4
4
|
export declare function useDispatch(): never;
|
|
5
5
|
export declare function useSelectedIds(): string[];
|
|
6
6
|
export declare function useIsSelected(): (index: number | null) => boolean;
|
|
7
7
|
export declare function useEditingId(): string | null;
|
|
8
|
-
export declare function TreeViewProvider(props:
|
|
8
|
+
export declare function TreeViewProvider<T>(props: TreeProviderProps<T>): JSX.Element;
|
package/dist/lib/context.js
CHANGED
|
@@ -10,28 +10,10 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
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
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
14
|
exports.TreeViewProvider = exports.useEditingId = exports.useIsSelected = exports.useSelectedIds = exports.useDispatch = exports.useStaticContext = exports.useCursorParentId = void 0;
|
|
34
|
-
var
|
|
15
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
|
+
var react_1 = require("react");
|
|
35
17
|
var drop_cursor_1 = require("./components/drop-cursor");
|
|
36
18
|
var reducer_1 = require("./reducer");
|
|
37
19
|
var selection_1 = require("./selection/selection");
|
|
@@ -115,10 +97,6 @@ function TreeViewProvider(props) {
|
|
|
115
97
|
}); }, [staticValue, state.selection.ids]);
|
|
116
98
|
return (
|
|
117
99
|
// @ts-ignore
|
|
118
|
-
|
|
119
|
-
react_1.default.createElement(EditingIdContext.Provider, { value: state.editingId },
|
|
120
|
-
react_1.default.createElement(SelectionContext.Provider, { value: state.selection },
|
|
121
|
-
react_1.default.createElement(CursorParentId.Provider, { value: ((_a = state.cursorLocation) === null || _a === void 0 ? void 0 : _a.parentId) || null }, props.children),
|
|
122
|
-
react_1.default.createElement(drop_cursor_1.DropCursor, { root: props.listRef.current, cursor: state.cursorLocation })))));
|
|
100
|
+
(0, jsx_runtime_1.jsx)(Static.Provider, __assign({ value: staticValue }, { children: (0, jsx_runtime_1.jsx)(EditingIdContext.Provider, __assign({ value: state.editingId }, { children: (0, jsx_runtime_1.jsxs)(SelectionContext.Provider, __assign({ value: state.selection }, { children: [(0, jsx_runtime_1.jsx)(CursorParentId.Provider, __assign({ value: ((_a = state.cursorLocation) === null || _a === void 0 ? void 0 : _a.parentId) || null }, { children: props.children }), void 0), (0, jsx_runtime_1.jsx)(drop_cursor_1.DropCursor, { root: props.listRef.current, cursor: state.cursorLocation }, void 0)] }), void 0) }), void 0) }), void 0));
|
|
123
101
|
}
|
|
124
102
|
exports.TreeViewProvider = TreeViewProvider;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.enrichTree = void 0;
|
|
4
|
+
var defaultGetIsOpen = function (m) { return m.isOpen; };
|
|
5
|
+
var defaultGetChildren = function (m) { return m.children; };
|
|
6
|
+
function createNode(model, level, parent, children, isOpen) {
|
|
7
|
+
return {
|
|
8
|
+
id: model.id,
|
|
9
|
+
level: level,
|
|
10
|
+
parent: parent,
|
|
11
|
+
children: children,
|
|
12
|
+
isOpen: isOpen,
|
|
13
|
+
model: model,
|
|
14
|
+
rowIndex: null,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function enrichTree(model, hideRoot, getChildren, getIsOpen) {
|
|
18
|
+
if (hideRoot === void 0) { hideRoot = false; }
|
|
19
|
+
if (getChildren === void 0) { getChildren = defaultGetChildren; }
|
|
20
|
+
if (getIsOpen === void 0) { getIsOpen = defaultGetIsOpen; }
|
|
21
|
+
function visitSelfAndChildren(model, level, parent) {
|
|
22
|
+
var isOpen = getIsOpen(model);
|
|
23
|
+
var node = createNode(model, level, parent, null, isOpen);
|
|
24
|
+
var children = getChildren(model);
|
|
25
|
+
if (children) {
|
|
26
|
+
node.children = children.map(function (child) {
|
|
27
|
+
return visitSelfAndChildren(child, level + 1, node);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return node;
|
|
31
|
+
}
|
|
32
|
+
return visitSelfAndChildren(model, hideRoot ? -1 : 0, null);
|
|
33
|
+
}
|
|
34
|
+
exports.enrichTree = enrichTree;
|
|
@@ -0,0 +1,20 @@
|
|
|
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;
|
|
@@ -0,0 +1,40 @@
|
|
|
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;
|
|
@@ -0,0 +1,13 @@
|
|
|
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.getChildren, props.getIsOpen);
|
|
10
|
+
}, [props.data, props.hideRoot, props.getChildren, props.getIsOpen]);
|
|
11
|
+
return (0, react_1.useMemo)(function () { return (0, flatten_tree_1.flattenTree)(root); }, [root]);
|
|
12
|
+
}
|
|
13
|
+
exports.useVisibleNodes = useVisibleNodes;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useOuterDrop(): void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useOuterDrop = void 0;
|
|
4
|
+
var react_dnd_1 = require("react-dnd");
|
|
5
|
+
var context_1 = require("../context");
|
|
6
|
+
var reducer_1 = require("../reducer");
|
|
7
|
+
var compute_drop_1 = require("./compute-drop");
|
|
8
|
+
function useOuterDrop() {
|
|
9
|
+
var tree = (0, context_1.useStaticContext)();
|
|
10
|
+
// In case we drop an item at the bottom of the list
|
|
11
|
+
var _a = (0, react_dnd_1.useDrop)(function () { return ({
|
|
12
|
+
accept: "NODE",
|
|
13
|
+
hover: function (item, m) {
|
|
14
|
+
if (!m.isOver({ shallow: true }))
|
|
15
|
+
return;
|
|
16
|
+
var offset = m.getClientOffset();
|
|
17
|
+
if (!tree.listRef.current || !offset)
|
|
18
|
+
return;
|
|
19
|
+
var cursor = (0, compute_drop_1.computeDrop)({
|
|
20
|
+
element: tree.listRef.current,
|
|
21
|
+
offset: offset,
|
|
22
|
+
indent: tree.indent,
|
|
23
|
+
node: null,
|
|
24
|
+
prevNode: tree.visibleNodes[tree.visibleNodes.length - 1],
|
|
25
|
+
nextNode: null,
|
|
26
|
+
}).cursor;
|
|
27
|
+
tree.dispatch((0, reducer_1.setCursorLocation)(cursor));
|
|
28
|
+
},
|
|
29
|
+
drop: function (item, m) {
|
|
30
|
+
if (m.didDrop())
|
|
31
|
+
return;
|
|
32
|
+
console.log("drop!!");
|
|
33
|
+
var offset = m.getClientOffset();
|
|
34
|
+
if (!tree.listRef.current || !offset)
|
|
35
|
+
return;
|
|
36
|
+
var _a = (0, compute_drop_1.computeDrop)({
|
|
37
|
+
element: tree.listRef.current,
|
|
38
|
+
offset: offset,
|
|
39
|
+
indent: tree.indent,
|
|
40
|
+
node: null,
|
|
41
|
+
prevNode: tree.visibleNodes[tree.visibleNodes.length - 1],
|
|
42
|
+
nextNode: null,
|
|
43
|
+
}), parentId = _a.parentId, index = _a.index;
|
|
44
|
+
return { parentId: parentId, index: index };
|
|
45
|
+
},
|
|
46
|
+
}); }, [tree]), drop = _a[1];
|
|
47
|
+
drop(tree.listRef);
|
|
48
|
+
}
|
|
49
|
+
exports.useOuterDrop = useOuterDrop;
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
import { ComponentType,
|
|
1
|
+
import { ComponentType, CSSProperties, MouseEvent, MouseEventHandler, MutableRefObject, ReactElement, Ref } from "react";
|
|
2
2
|
import { Action } from "./reducer";
|
|
3
3
|
import { SelectionData } from "./selection/selection";
|
|
4
|
-
export declare type Node<
|
|
4
|
+
export declare type Node<T = unknown> = {
|
|
5
5
|
id: string;
|
|
6
|
-
model:
|
|
6
|
+
model: T;
|
|
7
7
|
level: number;
|
|
8
|
-
children: Node<
|
|
9
|
-
parent: Node<
|
|
8
|
+
children: Node<T>[] | null;
|
|
9
|
+
parent: Node<T> | null;
|
|
10
10
|
isOpen: boolean;
|
|
11
11
|
rowIndex: number | null;
|
|
12
12
|
};
|
|
13
|
-
export declare type NodesById = {
|
|
14
|
-
[id: string]: Node
|
|
13
|
+
export declare type NodesById<T> = {
|
|
14
|
+
[id: string]: Node<T>;
|
|
15
15
|
};
|
|
16
|
-
export
|
|
16
|
+
export interface IdObj {
|
|
17
17
|
id: string;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
21
|
-
export declare type NodeRendererProps<M extends NodeModel> = {
|
|
18
|
+
}
|
|
19
|
+
export declare type NodeRendererProps<T> = {
|
|
22
20
|
preview: boolean;
|
|
23
|
-
node: Node<
|
|
24
|
-
props:
|
|
21
|
+
node: Node<T>;
|
|
22
|
+
props: {
|
|
23
|
+
style: CSSProperties;
|
|
24
|
+
ref: Ref<any>;
|
|
25
|
+
};
|
|
25
26
|
indent: number;
|
|
26
27
|
state: NodeState;
|
|
27
28
|
handlers: NodeHandlers;
|
|
@@ -38,67 +39,70 @@ export declare type NodeHandlers = {
|
|
|
38
39
|
toggleIsEditing: () => void;
|
|
39
40
|
rename: (name: string) => void;
|
|
40
41
|
};
|
|
41
|
-
export declare type NodeRenderer<
|
|
42
|
+
export declare type NodeRenderer<T> = ComponentType<NodeRendererProps<T>>;
|
|
42
43
|
export declare type OnMove = (dragIds: string[], parentId: string | null, index: number) => void;
|
|
43
44
|
export declare type IdHandler = (id: string) => void;
|
|
44
45
|
export declare type RenameHandler = (id: string, name: string) => void;
|
|
45
|
-
export declare type NodeClickHandler = (e: MouseEvent, n: Node) => void;
|
|
46
|
+
export declare type NodeClickHandler<T> = (e: MouseEvent, n: Node<T>) => void;
|
|
46
47
|
export declare type IndexClickHandler = (e: MouseEvent, index: number) => void;
|
|
47
48
|
export declare type SelectedCheck = (index: number) => boolean;
|
|
48
49
|
export declare type CursorLocation = {
|
|
49
|
-
parentId: string | null;
|
|
50
50
|
index: number | null;
|
|
51
51
|
level: number | null;
|
|
52
|
+
parentId: string | null;
|
|
52
53
|
};
|
|
53
54
|
export declare type DragItem = {
|
|
54
|
-
id: string;
|
|
55
55
|
dragIds: string[];
|
|
56
|
+
id: string;
|
|
56
57
|
};
|
|
57
58
|
export declare type SelectionState = {
|
|
58
|
-
ids: string[];
|
|
59
59
|
data: SelectionData | null;
|
|
60
|
+
ids: string[];
|
|
60
61
|
};
|
|
61
62
|
export declare type StateContext = {
|
|
62
|
-
visibleIds: string[];
|
|
63
|
-
editingId: string | null;
|
|
64
63
|
cursorLocation: CursorLocation | null;
|
|
64
|
+
editingId: string | null;
|
|
65
65
|
selection: SelectionState;
|
|
66
|
+
visibleIds: string[];
|
|
66
67
|
};
|
|
67
|
-
export
|
|
68
|
-
children: NodeRenderer<
|
|
69
|
-
data:
|
|
70
|
-
width: number;
|
|
68
|
+
export interface TreeProps<T> {
|
|
69
|
+
children: NodeRenderer<T>;
|
|
70
|
+
data: T;
|
|
71
71
|
height: number;
|
|
72
|
+
width: number;
|
|
73
|
+
className?: string | undefined;
|
|
74
|
+
getChildren?: (model: T) => T[] | undefined;
|
|
75
|
+
getIsOpen?: (model: T) => boolean;
|
|
76
|
+
handle?: Ref<TreeHandle>;
|
|
77
|
+
hideRoot?: boolean;
|
|
72
78
|
indent?: number;
|
|
73
|
-
|
|
79
|
+
onClose?: IdHandler;
|
|
74
80
|
onMove?: OnMove;
|
|
75
81
|
onOpen?: IdHandler;
|
|
76
|
-
onClose?: IdHandler;
|
|
77
82
|
onRename?: RenameHandler;
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
export declare type TreeViewProviderProps = {
|
|
82
|
-
handle: Ref<TreeViewHandle>;
|
|
83
|
-
renderer: NodeRenderer<any>;
|
|
84
|
-
visibleNodes: Node[];
|
|
85
|
-
listRef: MutableRefObject<HTMLDivElement | null>;
|
|
83
|
+
rowHeight?: number;
|
|
84
|
+
}
|
|
85
|
+
export declare type TreeProviderProps<T> = {
|
|
86
86
|
children: ReactElement;
|
|
87
|
-
|
|
88
|
-
rowHeight: number;
|
|
89
|
-
width: number;
|
|
87
|
+
handle?: Ref<TreeHandle>;
|
|
90
88
|
height: number;
|
|
89
|
+
indent: number;
|
|
90
|
+
listRef: MutableRefObject<HTMLDivElement | null>;
|
|
91
|
+
onClose: IdHandler;
|
|
91
92
|
onMove: OnMove;
|
|
92
93
|
onOpen: IdHandler;
|
|
93
|
-
onClose: IdHandler;
|
|
94
94
|
onRename: RenameHandler;
|
|
95
|
+
renderer: NodeRenderer<any>;
|
|
96
|
+
rowHeight: number;
|
|
97
|
+
visibleNodes: Node<T>[];
|
|
98
|
+
width: number;
|
|
95
99
|
};
|
|
96
|
-
export declare type StaticContext =
|
|
100
|
+
export declare type StaticContext<T> = TreeProviderProps<T> & {
|
|
97
101
|
dispatch: (a: Action) => void;
|
|
98
|
-
getNode: (id: string) => Node | null;
|
|
102
|
+
getNode: (id: string) => Node<T> | null;
|
|
99
103
|
};
|
|
100
|
-
export declare type
|
|
104
|
+
export declare type TreeHandle = {
|
|
105
|
+
edit: (id: string) => void;
|
|
101
106
|
selectedIds: string[];
|
|
102
107
|
selectId: (id: string) => void;
|
|
103
|
-
edit: (id: string) => void;
|
|
104
108
|
};
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
|
-
import { Node
|
|
1
|
+
import { Node } from "./types";
|
|
2
2
|
export declare function bound(n: number, min: number, max: number): number;
|
|
3
3
|
export declare const isFolder: (node: Node<any>) => boolean;
|
|
4
|
-
export declare const isHiddenRoot: (node: Node) => boolean;
|
|
5
4
|
/**
|
|
6
5
|
* Is first param a decendent of the second param
|
|
7
6
|
*/
|
|
8
7
|
export declare const isDecendent: (a: Node, b: Node) => boolean;
|
|
9
8
|
export declare const indexOf: (node: Node) => number;
|
|
10
|
-
export declare function enrichTree(model: NodeModel, hideRoot?: boolean): Node;
|
|
11
|
-
export declare function flattenTree(root: Node): Node[];
|
|
12
|
-
export declare function createNode(model: NodeModel, level: number, parent: Node | null, children: Node[] | null): Node;
|
|
13
9
|
export declare function noop(): void;
|
|
14
|
-
export declare function makeTree(string: string): {
|
|
15
|
-
id: string;
|
|
16
|
-
isOpen: boolean;
|
|
17
|
-
};
|
package/dist/lib/utils.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
var nanoid_1 = require("nanoid");
|
|
3
|
+
exports.noop = exports.indexOf = exports.isDecendent = exports.isFolder = exports.bound = void 0;
|
|
5
4
|
function bound(n, min, max) {
|
|
6
5
|
return Math.max(Math.min(n, max), min);
|
|
7
6
|
}
|
|
8
7
|
exports.bound = bound;
|
|
9
8
|
var isFolder = function (node) { return !!node.children; };
|
|
10
9
|
exports.isFolder = isFolder;
|
|
11
|
-
var isHiddenRoot = function (node) { return node.id === "HIDDEN"; };
|
|
12
|
-
exports.isHiddenRoot = isHiddenRoot;
|
|
13
10
|
/**
|
|
14
11
|
* Is first param a decendent of the second param
|
|
15
12
|
*/
|
|
@@ -29,82 +26,5 @@ var indexOf = function (node) {
|
|
|
29
26
|
return node.parent.children.findIndex(function (c) { return c.id === node.id; });
|
|
30
27
|
};
|
|
31
28
|
exports.indexOf = indexOf;
|
|
32
|
-
function enrichTree(model, hideRoot) {
|
|
33
|
-
if (hideRoot === void 0) { hideRoot = false; }
|
|
34
|
-
function visitSelfAndChildren(m, level, parent) {
|
|
35
|
-
var n = createNode(m, level, parent, null);
|
|
36
|
-
if (m.children) {
|
|
37
|
-
n.children = m.children.map(function (child) {
|
|
38
|
-
return visitSelfAndChildren(child, level + 1, n);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
return n;
|
|
42
|
-
}
|
|
43
|
-
return visitSelfAndChildren(model, hideRoot ? -1 : 0, null);
|
|
44
|
-
}
|
|
45
|
-
exports.enrichTree = enrichTree;
|
|
46
|
-
function flattenTree(root) {
|
|
47
|
-
var list = [];
|
|
48
|
-
var index = 0;
|
|
49
|
-
function collect(node) {
|
|
50
|
-
var _a;
|
|
51
|
-
if (node.level >= 0) {
|
|
52
|
-
node.rowIndex = index++;
|
|
53
|
-
list.push(node);
|
|
54
|
-
}
|
|
55
|
-
if (node.isOpen) {
|
|
56
|
-
(_a = node.children) === null || _a === void 0 ? void 0 : _a.forEach(collect);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
collect(root);
|
|
60
|
-
return list;
|
|
61
|
-
}
|
|
62
|
-
exports.flattenTree = flattenTree;
|
|
63
|
-
function createNode(model, level, parent, children) {
|
|
64
|
-
return {
|
|
65
|
-
id: model.id,
|
|
66
|
-
level: level,
|
|
67
|
-
parent: parent,
|
|
68
|
-
children: children,
|
|
69
|
-
isOpen: !!model.isOpen,
|
|
70
|
-
model: model,
|
|
71
|
-
rowIndex: null,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
exports.createNode = createNode;
|
|
75
29
|
function noop() { }
|
|
76
30
|
exports.noop = noop;
|
|
77
|
-
var gotLineage = "House Arryn\n Jon\n Robin\nHouse Tully\n Hoster\n Lysa\n Edmure\n Catelyn\nHouse Stark\n Rickard\n Brandon\n Eddard\n Robb\n Sansa\n Arya\n Brandon\n Rckon\n Benjen\n Lyanna\nHouse Targaryen\n Aerys II (the Mad)\n Rhaegar\n Jon Snow\n Viserys\n Daenerys\nHouse Baratheon\n Steffon\n Robert\n Stannis\n Shireen\n Renly\nHouse Lanister\n Tywin\n Jaime\n Cersei\n Joffery\n Myrcella\n Tommen\n Tyrion\nHouse Tyrell\n Olenna\n Mace\n Margaery\n Loras\nHouse Martell\n Doran\n Trystane\n Elia\n Oberyn\n Sand Snakes\n";
|
|
78
|
-
function makeTree(string) {
|
|
79
|
-
var root = { id: "ROOT", isOpen: true };
|
|
80
|
-
var prevNode = root;
|
|
81
|
-
var prevLevel = -1;
|
|
82
|
-
string.split("\n").forEach(function (line) {
|
|
83
|
-
var name = line.trimStart();
|
|
84
|
-
var level = line.length - name.length;
|
|
85
|
-
var diff = level - prevLevel;
|
|
86
|
-
var node = { id: (0, nanoid_1.nanoid)(), name: name, isOpen: true };
|
|
87
|
-
if (diff === 1) {
|
|
88
|
-
// First child
|
|
89
|
-
//@ts-ignore
|
|
90
|
-
node.parent = prevNode;
|
|
91
|
-
//@ts-ignore
|
|
92
|
-
prevNode.children = [node];
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
// Find the parent and go up
|
|
96
|
-
//@ts-ignore
|
|
97
|
-
var parent_1 = prevNode.parent;
|
|
98
|
-
for (var i = diff; i < 0; i++) {
|
|
99
|
-
parent_1 = parent_1.parent;
|
|
100
|
-
}
|
|
101
|
-
//@ts-ignore
|
|
102
|
-
node.parent = parent_1;
|
|
103
|
-
parent_1.children.push(node);
|
|
104
|
-
}
|
|
105
|
-
prevNode = node;
|
|
106
|
-
prevLevel = level;
|
|
107
|
-
});
|
|
108
|
-
return root;
|
|
109
|
-
}
|
|
110
|
-
exports.makeTree = makeTree;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-arborist",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/lib"
|
|
@@ -50,6 +50,8 @@
|
|
|
50
50
|
"@types/react-dom": "^16.8.0",
|
|
51
51
|
"@types/react-window": "^1.8.5",
|
|
52
52
|
"classnames": "^2.3.1",
|
|
53
|
+
"react": "^17.0.2",
|
|
54
|
+
"react-dom": "^17.0.2",
|
|
53
55
|
"react-feather": "^2.0.9",
|
|
54
56
|
"react-scripts": "4.0.3",
|
|
55
57
|
"react-use-dimensions": "^1.2.1",
|