react-arborist 3.6.0 → 3.7.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.
- package/dist/main/components/default-container.js +2 -1
- package/dist/main/components/list-outer-element.d.ts +1 -0
- package/dist/main/components/list-outer-element.js +3 -2
- package/dist/main/components/provider.js +8 -1
- package/dist/main/components/provider.test.d.ts +1 -0
- package/dist/main/components/provider.test.js +33 -0
- package/dist/main/index.d.ts +3 -0
- package/dist/main/index.js +7 -1
- package/dist/main/types/tree-props.d.ts +3 -1
- package/dist/module/components/default-container.js +2 -1
- package/dist/module/components/list-outer-element.d.ts +1 -0
- package/dist/module/components/list-outer-element.js +1 -1
- package/dist/module/components/provider.js +8 -1
- package/dist/module/components/provider.test.d.ts +1 -0
- package/dist/module/components/provider.test.js +31 -0
- package/dist/module/index.d.ts +3 -0
- package/dist/module/index.js +3 -0
- package/dist/module/types/tree-props.d.ts +3 -1
- package/package.json +7 -1
- package/src/components/default-container.tsx +2 -2
- package/src/components/list-outer-element.tsx +1 -1
- package/src/components/provider.test.tsx +44 -0
- package/src/components/provider.tsx +9 -1
- package/src/index.ts +3 -0
- package/src/types/tree-props.ts +5 -1
|
@@ -16,6 +16,7 @@ let timeoutId = null;
|
|
|
16
16
|
* the event handler. Future clean up welcome.
|
|
17
17
|
*/
|
|
18
18
|
function DefaultContainer() {
|
|
19
|
+
var _a, _b;
|
|
19
20
|
(0, context_1.useDataUpdates)();
|
|
20
21
|
const tree = (0, context_1.useTreeApi)();
|
|
21
22
|
return ((0, jsx_runtime_1.jsx)("div", { role: "tree", style: {
|
|
@@ -233,5 +234,5 @@ function DefaultContainer() {
|
|
|
233
234
|
});
|
|
234
235
|
if (node)
|
|
235
236
|
tree.focus(node.id);
|
|
236
|
-
}, children: (0, jsx_runtime_1.jsx)(react_window_1.FixedSizeList, { className: tree.props.className, outerRef: tree.listEl, itemCount: tree.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight, overscanCount: tree.overscanCount, itemKey: (index) => { var _a; return ((_a = tree.visibleNodes[index]) === null || _a === void 0 ? void 0 : _a.id) || index; }, outerElementType: list_outer_element_1.ListOuterElement, innerElementType: list_inner_element_1.ListInnerElement, onScroll: tree.props.onScroll, onItemsRendered: tree.onItemsRendered.bind(tree), ref: tree.list, children: row_container_1.RowContainer }) }));
|
|
237
|
+
}, children: (0, jsx_runtime_1.jsx)(react_window_1.FixedSizeList, { className: tree.props.className, outerRef: tree.listEl, itemCount: tree.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight, overscanCount: tree.overscanCount, itemKey: (index) => { var _a; return ((_a = tree.visibleNodes[index]) === null || _a === void 0 ? void 0 : _a.id) || index; }, outerElementType: (_a = tree.props.outerElementType) !== null && _a !== void 0 ? _a : list_outer_element_1.ListOuterElement, innerElementType: (_b = tree.props.innerElementType) !== null && _b !== void 0 ? _b : list_inner_element_1.ListInnerElement, onScroll: tree.props.onScroll, onItemsRendered: tree.onItemsRendered.bind(tree), ref: tree.list, children: row_container_1.RowContainer }) }));
|
|
237
238
|
}
|
|
@@ -11,7 +11,7 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.ListOuterElement = void 0;
|
|
14
|
+
exports.DropContainer = exports.ListOuterElement = void 0;
|
|
15
15
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
16
16
|
const react_1 = require("react");
|
|
17
17
|
const context_1 = require("../context");
|
|
@@ -24,7 +24,7 @@ exports.ListOuterElement = (0, react_1.forwardRef)(function Outer(props, ref) {
|
|
|
24
24
|
ref: ref }, rest, { onClick: (e) => {
|
|
25
25
|
if (e.currentTarget === e.target)
|
|
26
26
|
tree.deselectAll();
|
|
27
|
-
}, children: [(0, jsx_runtime_1.jsx)(DropContainer, {}), children] })));
|
|
27
|
+
}, children: [(0, jsx_runtime_1.jsx)(exports.DropContainer, {}), children] })));
|
|
28
28
|
});
|
|
29
29
|
const DropContainer = () => {
|
|
30
30
|
const tree = (0, context_1.useTreeApi)();
|
|
@@ -36,3 +36,4 @@ const DropContainer = () => {
|
|
|
36
36
|
right: "0",
|
|
37
37
|
}, children: (0, jsx_runtime_1.jsx)(cursor_1.Cursor, {}) }));
|
|
38
38
|
};
|
|
39
|
+
exports.DropContainer = DropContainer;
|
|
@@ -29,7 +29,14 @@ function TreeProvider({ treeProps, imperativeHandle, children, }) {
|
|
|
29
29
|
(0, react_1.useMemo)(() => {
|
|
30
30
|
updateCount.current += 1;
|
|
31
31
|
api.update(treeProps);
|
|
32
|
-
}, [...Object.values(treeProps)
|
|
32
|
+
}, [...Object.values(treeProps)]);
|
|
33
|
+
/* Rebuild visible nodes when open state changes, without clobbering
|
|
34
|
+
props set imperatively via api.update(). Bumping updateCount keeps
|
|
35
|
+
DataUpdates consumers (e.g. DefaultContainer) in sync. */
|
|
36
|
+
(0, react_1.useMemo)(() => {
|
|
37
|
+
updateCount.current += 1;
|
|
38
|
+
api.update(api.props);
|
|
39
|
+
}, [state.nodes.open]);
|
|
33
40
|
/* Expose the tree api */
|
|
34
41
|
(0, react_1.useImperativeHandle)(imperativeHandle, () => api);
|
|
35
42
|
/* Change selection based on props */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const react_2 = require("@testing-library/react");
|
|
6
|
+
const tree_1 = require("./tree");
|
|
7
|
+
const data = [
|
|
8
|
+
{
|
|
9
|
+
id: "1",
|
|
10
|
+
name: "root",
|
|
11
|
+
children: [
|
|
12
|
+
{ id: "2", name: "a" },
|
|
13
|
+
{ id: "3", name: "b", children: [{ id: "4", name: "c" }] },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
];
|
|
17
|
+
test("imperative tree.update() props survive node toggles (#228)", () => {
|
|
18
|
+
const ref = (0, react_1.createRef)();
|
|
19
|
+
(0, react_2.render)((0, jsx_runtime_1.jsx)(tree_1.Tree, { data: data, ref: ref, rowHeight: 24, openByDefault: false }));
|
|
20
|
+
const api = ref.current;
|
|
21
|
+
expect(api.rowHeight).toBe(24);
|
|
22
|
+
(0, react_2.act)(() => {
|
|
23
|
+
api.update(Object.assign(Object.assign({}, api.props), { rowHeight: 48 }));
|
|
24
|
+
});
|
|
25
|
+
expect(api.rowHeight).toBe(48);
|
|
26
|
+
/* Opening a node dispatches a redux action that changes state.nodes.open.
|
|
27
|
+
Before #337, the open-state effect re-ran api.update(treeProps), reverting
|
|
28
|
+
rowHeight to 24. */
|
|
29
|
+
(0, react_2.act)(() => {
|
|
30
|
+
api.open("1");
|
|
31
|
+
});
|
|
32
|
+
expect(api.rowHeight).toBe(48);
|
|
33
|
+
});
|
package/dist/main/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { Tree } from "./components/tree";
|
|
2
|
+
export { DropContainer } from "./components/list-outer-element";
|
|
3
|
+
export { ListOuterElement } from "./components/list-outer-element";
|
|
4
|
+
export { ListInnerElement } from "./components/list-inner-element";
|
|
2
5
|
export * from "./types/handlers";
|
|
3
6
|
export * from "./types/renderers";
|
|
4
7
|
export * from "./types/state";
|
package/dist/main/index.js
CHANGED
|
@@ -14,10 +14,16 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getTreeLinePrefix = exports.Tree = void 0;
|
|
17
|
+
exports.getTreeLinePrefix = exports.ListInnerElement = exports.ListOuterElement = exports.DropContainer = exports.Tree = void 0;
|
|
18
18
|
/* The Public Api */
|
|
19
19
|
var tree_1 = require("./components/tree");
|
|
20
20
|
Object.defineProperty(exports, "Tree", { enumerable: true, get: function () { return tree_1.Tree; } });
|
|
21
|
+
var list_outer_element_1 = require("./components/list-outer-element");
|
|
22
|
+
Object.defineProperty(exports, "DropContainer", { enumerable: true, get: function () { return list_outer_element_1.DropContainer; } });
|
|
23
|
+
var list_outer_element_2 = require("./components/list-outer-element");
|
|
24
|
+
Object.defineProperty(exports, "ListOuterElement", { enumerable: true, get: function () { return list_outer_element_2.ListOuterElement; } });
|
|
25
|
+
var list_inner_element_1 = require("./components/list-inner-element");
|
|
26
|
+
Object.defineProperty(exports, "ListInnerElement", { enumerable: true, get: function () { return list_inner_element_1.ListInnerElement; } });
|
|
21
27
|
__exportStar(require("./types/handlers"), exports);
|
|
22
28
|
__exportStar(require("./types/renderers"), exports);
|
|
23
29
|
__exportStar(require("./types/state"), exports);
|
|
@@ -2,7 +2,7 @@ import { BoolFunc } from "./utils";
|
|
|
2
2
|
import * as handlers from "./handlers";
|
|
3
3
|
import * as renderers from "./renderers";
|
|
4
4
|
import { ElementType, MouseEventHandler } from "react";
|
|
5
|
-
import { ListOnScrollProps } from "react-window";
|
|
5
|
+
import { ListOnScrollProps, CommonProps as ReactWindowCommonProps } from "react-window";
|
|
6
6
|
import { NodeApi } from "../interfaces/node-api";
|
|
7
7
|
import { OpenMap } from "../state/open-slice";
|
|
8
8
|
import { useDragDropManager, DndProviderProps } from "react-dnd";
|
|
@@ -57,4 +57,6 @@ export interface TreeProps<T> {
|
|
|
57
57
|
backend: unknown;
|
|
58
58
|
}>["backend"];
|
|
59
59
|
dndManager?: ReturnType<typeof useDragDropManager>;
|
|
60
|
+
outerElementType?: ReactWindowCommonProps["outerElementType"];
|
|
61
|
+
innerElementType?: ReactWindowCommonProps["innerElementType"];
|
|
60
62
|
}
|
|
@@ -13,6 +13,7 @@ let timeoutId = null;
|
|
|
13
13
|
* the event handler. Future clean up welcome.
|
|
14
14
|
*/
|
|
15
15
|
export function DefaultContainer() {
|
|
16
|
+
var _a, _b;
|
|
16
17
|
useDataUpdates();
|
|
17
18
|
const tree = useTreeApi();
|
|
18
19
|
return (_jsx("div", { role: "tree", style: {
|
|
@@ -230,5 +231,5 @@ export function DefaultContainer() {
|
|
|
230
231
|
});
|
|
231
232
|
if (node)
|
|
232
233
|
tree.focus(node.id);
|
|
233
|
-
}, children: _jsx(FixedSizeList, { className: tree.props.className, outerRef: tree.listEl, itemCount: tree.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight, overscanCount: tree.overscanCount, itemKey: (index) => { var _a; return ((_a = tree.visibleNodes[index]) === null || _a === void 0 ? void 0 : _a.id) || index; }, outerElementType: ListOuterElement, innerElementType: ListInnerElement, onScroll: tree.props.onScroll, onItemsRendered: tree.onItemsRendered.bind(tree), ref: tree.list, children: RowContainer }) }));
|
|
234
|
+
}, children: _jsx(FixedSizeList, { className: tree.props.className, outerRef: tree.listEl, itemCount: tree.visibleNodes.length, height: tree.height, width: tree.width, itemSize: tree.rowHeight, overscanCount: tree.overscanCount, itemKey: (index) => { var _a; return ((_a = tree.visibleNodes[index]) === null || _a === void 0 ? void 0 : _a.id) || index; }, outerElementType: (_a = tree.props.outerElementType) !== null && _a !== void 0 ? _a : ListOuterElement, innerElementType: (_b = tree.props.innerElementType) !== null && _b !== void 0 ? _b : ListInnerElement, onScroll: tree.props.onScroll, onItemsRendered: tree.onItemsRendered.bind(tree), ref: tree.list, children: RowContainer }) }));
|
|
234
235
|
}
|
|
@@ -23,7 +23,7 @@ export const ListOuterElement = forwardRef(function Outer(props, ref) {
|
|
|
23
23
|
tree.deselectAll();
|
|
24
24
|
}, children: [_jsx(DropContainer, {}), children] })));
|
|
25
25
|
});
|
|
26
|
-
const DropContainer = () => {
|
|
26
|
+
export const DropContainer = () => {
|
|
27
27
|
const tree = useTreeApi();
|
|
28
28
|
return (_jsx("div", { style: {
|
|
29
29
|
height: tree.visibleNodes.length * tree.rowHeight,
|
|
@@ -26,7 +26,14 @@ export function TreeProvider({ treeProps, imperativeHandle, children, }) {
|
|
|
26
26
|
useMemo(() => {
|
|
27
27
|
updateCount.current += 1;
|
|
28
28
|
api.update(treeProps);
|
|
29
|
-
}, [...Object.values(treeProps)
|
|
29
|
+
}, [...Object.values(treeProps)]);
|
|
30
|
+
/* Rebuild visible nodes when open state changes, without clobbering
|
|
31
|
+
props set imperatively via api.update(). Bumping updateCount keeps
|
|
32
|
+
DataUpdates consumers (e.g. DefaultContainer) in sync. */
|
|
33
|
+
useMemo(() => {
|
|
34
|
+
updateCount.current += 1;
|
|
35
|
+
api.update(api.props);
|
|
36
|
+
}, [state.nodes.open]);
|
|
30
37
|
/* Expose the tree api */
|
|
31
38
|
useImperativeHandle(imperativeHandle, () => api);
|
|
32
39
|
/* Change selection based on props */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createRef } from "react";
|
|
3
|
+
import { act, render } from "@testing-library/react";
|
|
4
|
+
import { Tree } from "./tree";
|
|
5
|
+
const data = [
|
|
6
|
+
{
|
|
7
|
+
id: "1",
|
|
8
|
+
name: "root",
|
|
9
|
+
children: [
|
|
10
|
+
{ id: "2", name: "a" },
|
|
11
|
+
{ id: "3", name: "b", children: [{ id: "4", name: "c" }] },
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
test("imperative tree.update() props survive node toggles (#228)", () => {
|
|
16
|
+
const ref = createRef();
|
|
17
|
+
render(_jsx(Tree, { data: data, ref: ref, rowHeight: 24, openByDefault: false }));
|
|
18
|
+
const api = ref.current;
|
|
19
|
+
expect(api.rowHeight).toBe(24);
|
|
20
|
+
act(() => {
|
|
21
|
+
api.update(Object.assign(Object.assign({}, api.props), { rowHeight: 48 }));
|
|
22
|
+
});
|
|
23
|
+
expect(api.rowHeight).toBe(48);
|
|
24
|
+
/* Opening a node dispatches a redux action that changes state.nodes.open.
|
|
25
|
+
Before #337, the open-state effect re-ran api.update(treeProps), reverting
|
|
26
|
+
rowHeight to 24. */
|
|
27
|
+
act(() => {
|
|
28
|
+
api.open("1");
|
|
29
|
+
});
|
|
30
|
+
expect(api.rowHeight).toBe(48);
|
|
31
|
+
});
|
package/dist/module/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { Tree } from "./components/tree";
|
|
2
|
+
export { DropContainer } from "./components/list-outer-element";
|
|
3
|
+
export { ListOuterElement } from "./components/list-outer-element";
|
|
4
|
+
export { ListInnerElement } from "./components/list-inner-element";
|
|
2
5
|
export * from "./types/handlers";
|
|
3
6
|
export * from "./types/renderers";
|
|
4
7
|
export * from "./types/state";
|
package/dist/module/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/* The Public Api */
|
|
2
2
|
export { Tree } from "./components/tree";
|
|
3
|
+
export { DropContainer } from "./components/list-outer-element";
|
|
4
|
+
export { ListOuterElement } from "./components/list-outer-element";
|
|
5
|
+
export { ListInnerElement } from "./components/list-inner-element";
|
|
3
6
|
export * from "./types/handlers";
|
|
4
7
|
export * from "./types/renderers";
|
|
5
8
|
export * from "./types/state";
|
|
@@ -2,7 +2,7 @@ import { BoolFunc } from "./utils";
|
|
|
2
2
|
import * as handlers from "./handlers";
|
|
3
3
|
import * as renderers from "./renderers";
|
|
4
4
|
import { ElementType, MouseEventHandler } from "react";
|
|
5
|
-
import { ListOnScrollProps } from "react-window";
|
|
5
|
+
import { ListOnScrollProps, CommonProps as ReactWindowCommonProps } from "react-window";
|
|
6
6
|
import { NodeApi } from "../interfaces/node-api";
|
|
7
7
|
import { OpenMap } from "../state/open-slice";
|
|
8
8
|
import { useDragDropManager, DndProviderProps } from "react-dnd";
|
|
@@ -57,4 +57,6 @@ export interface TreeProps<T> {
|
|
|
57
57
|
backend: unknown;
|
|
58
58
|
}>["backend"];
|
|
59
59
|
dndManager?: ReturnType<typeof useDragDropManager>;
|
|
60
|
+
outerElementType?: ReactWindowCommonProps["outerElementType"];
|
|
61
|
+
innerElementType?: ReactWindowCommonProps["innerElementType"];
|
|
60
62
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-arborist",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.7.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"main": "dist/main/index.js",
|
|
@@ -49,12 +49,18 @@
|
|
|
49
49
|
"react-dom": ">= 16.14"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
|
+
"@testing-library/dom": "^9.3.0",
|
|
53
|
+
"@testing-library/react": "^14.0.0",
|
|
52
54
|
"@types/jest": "^29.5.11",
|
|
53
55
|
"@types/react": "^18.2.43",
|
|
56
|
+
"@types/react-dom": "^18.2.0",
|
|
54
57
|
"@types/react-window": "^1.8.8",
|
|
55
58
|
"@types/use-sync-external-store": "^0.0.6",
|
|
56
59
|
"jest": "^29.7.0",
|
|
60
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
57
61
|
"npm-run-all": "^4.1.5",
|
|
62
|
+
"react": "^18.2.0",
|
|
63
|
+
"react-dom": "^18.2.0",
|
|
58
64
|
"rimraf": "^5.0.5",
|
|
59
65
|
"ts-jest": "^29.1.1",
|
|
60
66
|
"typescript": "^5.6.0"
|
|
@@ -226,8 +226,8 @@ export function DefaultContainer() {
|
|
|
226
226
|
itemSize={tree.rowHeight}
|
|
227
227
|
overscanCount={tree.overscanCount}
|
|
228
228
|
itemKey={(index) => tree.visibleNodes[index]?.id || index}
|
|
229
|
-
outerElementType={ListOuterElement}
|
|
230
|
-
innerElementType={ListInnerElement}
|
|
229
|
+
outerElementType={tree.props.outerElementType ?? ListOuterElement}
|
|
230
|
+
innerElementType={tree.props.innerElementType ?? ListInnerElement}
|
|
231
231
|
onScroll={tree.props.onScroll}
|
|
232
232
|
onItemsRendered={tree.onItemsRendered.bind(tree)}
|
|
233
233
|
ref={tree.list}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { createRef } from "react";
|
|
2
|
+
import { act, render } from "@testing-library/react";
|
|
3
|
+
import { Tree } from "./tree";
|
|
4
|
+
import { TreeApi } from "../interfaces/tree-api";
|
|
5
|
+
|
|
6
|
+
type Datum = { id: string; name: string; children?: Datum[] };
|
|
7
|
+
|
|
8
|
+
const data: Datum[] = [
|
|
9
|
+
{
|
|
10
|
+
id: "1",
|
|
11
|
+
name: "root",
|
|
12
|
+
children: [
|
|
13
|
+
{ id: "2", name: "a" },
|
|
14
|
+
{ id: "3", name: "b", children: [{ id: "4", name: "c" }] },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
test("imperative tree.update() props survive node toggles (#228)", () => {
|
|
20
|
+
const ref = createRef<TreeApi<Datum> | undefined>();
|
|
21
|
+
render(
|
|
22
|
+
<Tree<Datum>
|
|
23
|
+
data={data}
|
|
24
|
+
ref={ref}
|
|
25
|
+
rowHeight={24}
|
|
26
|
+
openByDefault={false}
|
|
27
|
+
/>
|
|
28
|
+
);
|
|
29
|
+
const api = ref.current!;
|
|
30
|
+
expect(api.rowHeight).toBe(24);
|
|
31
|
+
|
|
32
|
+
act(() => {
|
|
33
|
+
api.update({ ...api.props, rowHeight: 48 });
|
|
34
|
+
});
|
|
35
|
+
expect(api.rowHeight).toBe(48);
|
|
36
|
+
|
|
37
|
+
/* Opening a node dispatches a redux action that changes state.nodes.open.
|
|
38
|
+
Before #337, the open-state effect re-ran api.update(treeProps), reverting
|
|
39
|
+
rowHeight to 24. */
|
|
40
|
+
act(() => {
|
|
41
|
+
api.open("1");
|
|
42
|
+
});
|
|
43
|
+
expect(api.rowHeight).toBe(48);
|
|
44
|
+
});
|
|
@@ -57,7 +57,15 @@ export function TreeProvider<T>({
|
|
|
57
57
|
useMemo(() => {
|
|
58
58
|
updateCount.current += 1;
|
|
59
59
|
api.update(treeProps);
|
|
60
|
-
}, [...Object.values(treeProps)
|
|
60
|
+
}, [...Object.values(treeProps)]);
|
|
61
|
+
|
|
62
|
+
/* Rebuild visible nodes when open state changes, without clobbering
|
|
63
|
+
props set imperatively via api.update(). Bumping updateCount keeps
|
|
64
|
+
DataUpdates consumers (e.g. DefaultContainer) in sync. */
|
|
65
|
+
useMemo(() => {
|
|
66
|
+
updateCount.current += 1;
|
|
67
|
+
api.update(api.props);
|
|
68
|
+
}, [state.nodes.open]);
|
|
61
69
|
|
|
62
70
|
/* Expose the tree api */
|
|
63
71
|
useImperativeHandle(imperativeHandle, () => api);
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/* The Public Api */
|
|
2
2
|
export { Tree } from "./components/tree";
|
|
3
|
+
export { DropContainer } from "./components/list-outer-element";
|
|
4
|
+
export { ListOuterElement } from "./components/list-outer-element";
|
|
5
|
+
export { ListInnerElement } from "./components/list-inner-element";
|
|
3
6
|
export * from "./types/handlers";
|
|
4
7
|
export * from "./types/renderers";
|
|
5
8
|
export * from "./types/state";
|
package/src/types/tree-props.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BoolFunc } from "./utils";
|
|
|
2
2
|
import * as handlers from "./handlers";
|
|
3
3
|
import * as renderers from "./renderers";
|
|
4
4
|
import { ElementType, MouseEventHandler } from "react";
|
|
5
|
-
import { ListOnScrollProps } from "react-window";
|
|
5
|
+
import { ListOnScrollProps, CommonProps as ReactWindowCommonProps } from "react-window";
|
|
6
6
|
import { NodeApi } from "../interfaces/node-api";
|
|
7
7
|
import { OpenMap } from "../state/open-slice";
|
|
8
8
|
import { useDragDropManager, DndProviderProps } from "react-dnd";
|
|
@@ -82,4 +82,8 @@ export interface TreeProps<T> {
|
|
|
82
82
|
{ backend: unknown }
|
|
83
83
|
>["backend"];
|
|
84
84
|
dndManager?: ReturnType<typeof useDragDropManager>;
|
|
85
|
+
|
|
86
|
+
/* Custom react-window outer/inner elements */
|
|
87
|
+
outerElementType?: ReactWindowCommonProps["outerElementType"];
|
|
88
|
+
innerElementType?: ReactWindowCommonProps["innerElementType"];
|
|
85
89
|
}
|