sbwb-ds 1.0.63 → 1.0.65
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/sbwb-ds.js +30 -45
- package/dist/sbwb-ds.umd.cjs +1 -1
- package/dist/src/presentation/components/atoms/Tree/index.d.ts +4 -6
- package/dist/src/presentation/components/atoms/Tree/index.spec.d.ts +1 -1
- package/package.json +1 -1
- package/src/presentation/components/atoms/Tree/Tree.stories.tsx +18 -12
- package/src/presentation/components/atoms/Tree/index.spec.tsx +51 -16
- package/src/presentation/components/atoms/Tree/index.tsx +34 -39
package/dist/sbwb-ds.js
CHANGED
|
@@ -52231,70 +52231,55 @@ F.p`
|
|
|
52231
52231
|
color: ${({ disabled: e }) => e ? "#A6B0C4" : "#4E5666"};
|
|
52232
52232
|
cursor: ${({ disabled: e }) => e ? "not-allowed" : "pointer"};
|
|
52233
52233
|
`;
|
|
52234
|
-
const khe = (e) => new CustomEvent("treeSelectionChanged", { detail: { selectedTitle: e } }), Wk = ({
|
|
52235
|
-
|
|
52236
|
-
|
|
52237
|
-
|
|
52238
|
-
|
|
52239
|
-
|
|
52240
|
-
|
|
52234
|
+
const khe = (e) => new CustomEvent("treeSelectionChanged", { detail: { selectedTitle: e } }), Wk = ({ node: e }) => {
|
|
52235
|
+
const {
|
|
52236
|
+
title: r,
|
|
52237
|
+
childrens: t,
|
|
52238
|
+
disabled: n,
|
|
52239
|
+
isLeaf: a,
|
|
52240
|
+
onClickNode: i,
|
|
52241
|
+
onClickLeaf: o,
|
|
52242
|
+
isOpenByDefault: s,
|
|
52243
|
+
isSelectedByDefault: l
|
|
52244
|
+
} = e, c = (C) => {
|
|
52245
|
+
var y;
|
|
52246
|
+
return C.isSelectedByDefault ? !0 : ((y = C.childrens) == null ? void 0 : y.some(c)) ?? !1;
|
|
52247
|
+
}, u = s || c(e), [h, f] = Ne(u), [d, v] = Ne(l || !1);
|
|
52241
52248
|
return It(() => {
|
|
52242
|
-
const
|
|
52243
|
-
a !==
|
|
52249
|
+
const C = (y) => {
|
|
52250
|
+
a && r !== y.detail.selectedTitle && v(!1);
|
|
52244
52251
|
};
|
|
52245
|
-
return window.addEventListener("treeSelectionChanged",
|
|
52246
|
-
window.removeEventListener("treeSelectionChanged",
|
|
52252
|
+
return window.addEventListener("treeSelectionChanged", C), () => {
|
|
52253
|
+
window.removeEventListener("treeSelectionChanged", C);
|
|
52247
52254
|
};
|
|
52248
|
-
}, [a]), /* @__PURE__ */ fe(Mhe, { children: [
|
|
52255
|
+
}, [r, a]), /* @__PURE__ */ fe(Mhe, { children: [
|
|
52249
52256
|
/* @__PURE__ */ fe(Lhe, { onClick: () => {
|
|
52250
|
-
|
|
52257
|
+
n || (a ? (v(!0), window.dispatchEvent(khe(r)), o && o(e)) : (i && i(e), f(!h)));
|
|
52251
52258
|
}, children: [
|
|
52252
|
-
(() =>
|
|
52259
|
+
(() => a ? /* @__PURE__ */ R(
|
|
52253
52260
|
Qa,
|
|
52254
52261
|
{
|
|
52255
|
-
iconName:
|
|
52256
|
-
color:
|
|
52257
|
-
customStyles:
|
|
52262
|
+
iconName: d ? "FiberManualRecordFill1Sm" : "FiberManualRecordFILL0Sm",
|
|
52263
|
+
color: n ? "#A6B0C4" : "#4E5666",
|
|
52264
|
+
customStyles: n ? { cursor: "not-allowed" } : {},
|
|
52258
52265
|
width: "16px",
|
|
52259
52266
|
height: "16px"
|
|
52260
52267
|
}
|
|
52261
52268
|
) : /* @__PURE__ */ R(
|
|
52262
52269
|
Qa,
|
|
52263
52270
|
{
|
|
52264
|
-
iconName:
|
|
52265
|
-
color:
|
|
52266
|
-
customStyles:
|
|
52271
|
+
iconName: h ? "DoNotDisturbOnFill0Sm" : "AddCircleSm",
|
|
52272
|
+
color: n ? "#A6B0C4" : "#4E5666",
|
|
52273
|
+
customStyles: n ? { cursor: "not-allowed" } : {},
|
|
52267
52274
|
width: "16px",
|
|
52268
52275
|
height: "16px"
|
|
52269
52276
|
}
|
|
52270
52277
|
))(),
|
|
52271
|
-
/* @__PURE__ */ R(Vhe, { disabled:
|
|
52278
|
+
/* @__PURE__ */ R(Vhe, { disabled: n, children: r })
|
|
52272
52279
|
] }),
|
|
52273
|
-
|
|
52274
|
-
Wk,
|
|
52275
|
-
{
|
|
52276
|
-
node: v,
|
|
52277
|
-
onClickNode: r,
|
|
52278
|
-
onClickLeaf: t
|
|
52279
|
-
},
|
|
52280
|
-
v.title + p
|
|
52281
|
-
)) })
|
|
52280
|
+
h && t && /* @__PURE__ */ R(Ehe, { children: t.map((C, y) => /* @__PURE__ */ R(Wk, { node: C }, C.title + y)) })
|
|
52282
52281
|
] });
|
|
52283
|
-
}, zme = ({
|
|
52284
|
-
nodes: e,
|
|
52285
|
-
onClickNode: r,
|
|
52286
|
-
onClickLeaf: t,
|
|
52287
|
-
isOpenByDefault: n = !1
|
|
52288
|
-
}) => /* @__PURE__ */ R("div", { children: e.map((a, i) => /* @__PURE__ */ R(
|
|
52289
|
-
Wk,
|
|
52290
|
-
{
|
|
52291
|
-
node: a,
|
|
52292
|
-
onClickNode: r,
|
|
52293
|
-
onClickLeaf: t,
|
|
52294
|
-
isOpenByDefault: n
|
|
52295
|
-
},
|
|
52296
|
-
a.title + i
|
|
52297
|
-
)) }), Dhe = (e, r, t) => (It(() => {
|
|
52282
|
+
}, zme = ({ nodes: e }) => /* @__PURE__ */ R("div", { children: e.map((r, t) => /* @__PURE__ */ R(Wk, { node: r }, r.title + t)) }), Dhe = (e, r, t) => (It(() => {
|
|
52298
52283
|
let n;
|
|
52299
52284
|
return r && e && (n = setTimeout(() => {
|
|
52300
52285
|
t && t();
|
package/dist/sbwb-ds.umd.cjs
CHANGED
|
@@ -2290,7 +2290,7 @@ echarts.use([`+T+"]);":"Unknown series "+k))}return}if(h==="tooltip"){if(w){proc
|
|
|
2290
2290
|
margin-left: 8px;
|
|
2291
2291
|
color: ${({disabled:e})=>e?"#A6B0C4":"#4E5666"};
|
|
2292
2292
|
cursor: ${({disabled:e})=>e?"not-allowed":"pointer"};
|
|
2293
|
-
`;const p2e=e=>new CustomEvent("treeSelectionChanged",{detail:{selectedTitle:e}}),ZV=({node:e
|
|
2293
|
+
`;const p2e=e=>new CustomEvent("treeSelectionChanged",{detail:{selectedTitle:e}}),ZV=({node:e})=>{const{title:r,childrens:t,disabled:n,isLeaf:a,onClickNode:i,onClickLeaf:o,isOpenByDefault:s,isSelectedByDefault:l}=e,c=C=>{var y;return C.isSelectedByDefault?!0:((y=C.childrens)==null?void 0:y.some(c))??!1},u=s||c(e),[h,f]=$.useState(u),[d,v]=$.useState(l||!1);return $.useEffect(()=>{const C=y=>{a&&r!==y.detail.selectedTitle&&v(!1)};return window.addEventListener("treeSelectionChanged",C),()=>{window.removeEventListener("treeSelectionChanged",C)}},[r,a]),he(h2e,{children:[he(f2e,{onClick:()=>{n||(a?(v(!0),window.dispatchEvent(p2e(r)),o&&o(e)):(i&&i(e),f(!h)))},children:[(()=>a?N(ra,{iconName:d?"FiberManualRecordFill1Sm":"FiberManualRecordFILL0Sm",color:n?"#A6B0C4":"#4E5666",customStyles:n?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}):N(ra,{iconName:h?"DoNotDisturbOnFill0Sm":"AddCircleSm",color:n?"#A6B0C4":"#4E5666",customStyles:n?{cursor:"not-allowed"}:{},width:"16px",height:"16px"}))(),N(v2e,{disabled:n,children:r})]}),h&&t&&N(d2e,{children:t.map((C,y)=>N(ZV,{node:C},C.title+y))})]})},g2e=({nodes:e})=>N("div",{children:e.map((r,t)=>N(ZV,{node:r},r.title+t))}),C2e=(e,r,t)=>($.useEffect(()=>{let n;return r&&e&&(n=setTimeout(()=>{t&&t()},r)),()=>{n&&clearTimeout(n)}},[e,r,t]),{}),m2e=z.div`
|
|
2294
2294
|
display: flex;
|
|
2295
2295
|
flex-direction: row;
|
|
2296
2296
|
justify-content: space-between;
|
|
@@ -4,18 +4,16 @@ export interface TreeItem {
|
|
|
4
4
|
childrens?: TreeItem[];
|
|
5
5
|
disabled?: boolean;
|
|
6
6
|
isLeaf?: boolean;
|
|
7
|
-
}
|
|
8
|
-
export interface TreeProps {
|
|
9
|
-
node: TreeItem;
|
|
10
7
|
onClickNode?: (node: TreeItem) => void;
|
|
11
8
|
onClickLeaf?: (node: TreeItem) => void;
|
|
12
9
|
isOpenByDefault?: boolean;
|
|
10
|
+
isSelectedByDefault?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface TreeProps {
|
|
13
|
+
node: TreeItem;
|
|
13
14
|
}
|
|
14
15
|
export interface TreeListProps {
|
|
15
16
|
nodes: TreeItem[];
|
|
16
|
-
onClickNode?: (node: TreeItem) => void;
|
|
17
|
-
onClickLeaf?: (node: TreeItem) => void;
|
|
18
|
-
isOpenByDefault?: boolean;
|
|
19
17
|
}
|
|
20
18
|
declare const TreeList: React.FC<TreeListProps>;
|
|
21
19
|
export default TreeList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
import '@testing-library/jest-dom';
|
package/package.json
CHANGED
|
@@ -22,9 +22,14 @@ export default {
|
|
|
22
22
|
const treeDataArray = [
|
|
23
23
|
{
|
|
24
24
|
title: 'Root Node 1',
|
|
25
|
+
isOpenByDefault: true,
|
|
26
|
+
onClickNode: (node) => console.log('Clicked Node:', node.title),
|
|
27
|
+
onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
|
|
25
28
|
childrens: [
|
|
26
29
|
{
|
|
27
|
-
title: 'Node 1 - Depth
|
|
30
|
+
title: 'Node 1 - Depth 11',
|
|
31
|
+
onClickNode: (node) => console.log('Clicked Node:', node.title),
|
|
32
|
+
|
|
28
33
|
childrens: [
|
|
29
34
|
{
|
|
30
35
|
title: 'Node 1 - Depth 2',
|
|
@@ -36,6 +41,7 @@ const treeDataArray = [
|
|
|
36
41
|
{
|
|
37
42
|
title: 'Node 2 - Depth 3',
|
|
38
43
|
disabled: true,
|
|
44
|
+
isLeaf: true,
|
|
39
45
|
},
|
|
40
46
|
],
|
|
41
47
|
},
|
|
@@ -45,10 +51,20 @@ const treeDataArray = [
|
|
|
45
51
|
},
|
|
46
52
|
{
|
|
47
53
|
title: 'Root Node 2',
|
|
54
|
+
isOpenByDefault: false,
|
|
55
|
+
onClickNode: (node) => console.log('Clicked Node:', node.title),
|
|
56
|
+
onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
|
|
48
57
|
childrens: [
|
|
49
58
|
{
|
|
50
59
|
title: 'Node 1 - Depth 1 (Root 2)',
|
|
51
60
|
isLeaf: true,
|
|
61
|
+
onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
|
|
62
|
+
isSelectedByDefault: true,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
title: 'Node 2 - Depth 1 (Root 2)',
|
|
66
|
+
isLeaf: true,
|
|
67
|
+
onClickLeaf: (node) => console.log('Clicked Leaf:', node.title),
|
|
52
68
|
},
|
|
53
69
|
],
|
|
54
70
|
},
|
|
@@ -56,17 +72,7 @@ const treeDataArray = [
|
|
|
56
72
|
|
|
57
73
|
const Tree = (args) => (
|
|
58
74
|
<div>
|
|
59
|
-
<TreeList
|
|
60
|
-
{...args}
|
|
61
|
-
nodes={treeDataArray}
|
|
62
|
-
isOpenByDefault={true}
|
|
63
|
-
onClickNode={(value) => {
|
|
64
|
-
console.log('onClickNode', value);
|
|
65
|
-
}}
|
|
66
|
-
onClickLeaf={(value) => {
|
|
67
|
-
console.log('onClickLeaf', value);
|
|
68
|
-
}}
|
|
69
|
-
/>
|
|
75
|
+
<TreeList {...args} nodes={treeDataArray} />
|
|
70
76
|
</div>
|
|
71
77
|
);
|
|
72
78
|
|
|
@@ -1,30 +1,65 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { render, fireEvent } from '@testing-library/react';
|
|
3
|
-
import TreeList from './';
|
|
3
|
+
import TreeList, { TreeItem } from './';
|
|
4
|
+
import '@testing-library/jest-dom';
|
|
4
5
|
|
|
5
|
-
test('
|
|
6
|
-
const nodes = [
|
|
6
|
+
test('Should render multiple nodes in TreeList', () => {
|
|
7
|
+
const nodes: TreeItem[] = [{ title: 'Node 1' }, { title: 'Node 2' }];
|
|
8
|
+
const { getByText } = render(<TreeList nodes={nodes} />);
|
|
9
|
+
|
|
10
|
+
expect(getByText('Node 1')).toBeInTheDocument();
|
|
11
|
+
expect(getByText('Node 2')).toBeInTheDocument();
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test('Should call onClickLeaf when a leaf node is clicked', () => {
|
|
15
|
+
const onClickLeaf = jest.fn();
|
|
16
|
+
const nodes: TreeItem[] = [{ title: 'Leaf Node', isLeaf: true, onClickLeaf }];
|
|
17
|
+
const { getByText } = render(<TreeList nodes={nodes} />);
|
|
18
|
+
|
|
19
|
+
fireEvent.click(getByText('Leaf Node'));
|
|
20
|
+
|
|
21
|
+
expect(onClickLeaf).toHaveBeenCalledWith(nodes[0]);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Should not call onClickNode or onClickLeaf when a disabled node is clicked', () => {
|
|
25
|
+
const onClickNode = jest.fn();
|
|
26
|
+
const onClickLeaf = jest.fn();
|
|
27
|
+
const nodes: TreeItem[] = [
|
|
28
|
+
{ title: 'Disabled Node', disabled: true, onClickNode, onClickLeaf },
|
|
29
|
+
];
|
|
30
|
+
const { getByText } = render(<TreeList nodes={nodes} />);
|
|
31
|
+
|
|
32
|
+
fireEvent.click(getByText('Disabled Node'));
|
|
33
|
+
|
|
34
|
+
expect(onClickNode).not.toHaveBeenCalled();
|
|
35
|
+
expect(onClickLeaf).not.toHaveBeenCalled();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('Should render child nodes when a parent node is clicked', () => {
|
|
39
|
+
const nodes: TreeItem[] = [
|
|
7
40
|
{
|
|
8
|
-
title: '
|
|
41
|
+
title: 'Parent Node',
|
|
42
|
+
childrens: [{ title: 'Child Node' }],
|
|
9
43
|
},
|
|
10
44
|
];
|
|
11
|
-
render(<TreeList nodes={nodes} />);
|
|
45
|
+
const { getByText } = render(<TreeList nodes={nodes} />);
|
|
46
|
+
|
|
47
|
+
fireEvent.click(getByText('Parent Node'));
|
|
48
|
+
|
|
49
|
+
expect(getByText('Child Node')).toBeInTheDocument();
|
|
12
50
|
});
|
|
13
51
|
|
|
14
|
-
test('
|
|
15
|
-
const nodes = [
|
|
52
|
+
test('Should not render child nodes when a parent node is clicked if it is disabled', () => {
|
|
53
|
+
const nodes: TreeItem[] = [
|
|
16
54
|
{
|
|
17
|
-
title: '
|
|
55
|
+
title: 'Parent Node',
|
|
56
|
+
disabled: true,
|
|
57
|
+
childrens: [{ title: 'Child Node' }],
|
|
18
58
|
},
|
|
19
59
|
];
|
|
20
|
-
const
|
|
21
|
-
const { getByText } = render(
|
|
22
|
-
<TreeList nodes={nodes} onClickNode={onClickNode} />
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
const titleElement = getByText('Nó de teste');
|
|
60
|
+
const { queryByText, getByText } = render(<TreeList nodes={nodes} />);
|
|
26
61
|
|
|
27
|
-
fireEvent.click(
|
|
62
|
+
fireEvent.click(getByText('Parent Node'));
|
|
28
63
|
|
|
29
|
-
expect(
|
|
64
|
+
expect(queryByText('Child Node')).toBeNull();
|
|
30
65
|
});
|
|
@@ -7,31 +7,46 @@ export interface TreeItem {
|
|
|
7
7
|
childrens?: TreeItem[];
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
isLeaf?: boolean;
|
|
10
|
+
onClickNode?: (node: TreeItem) => void;
|
|
11
|
+
onClickLeaf?: (node: TreeItem) => void;
|
|
12
|
+
isOpenByDefault?: boolean;
|
|
13
|
+
isSelectedByDefault?: boolean;
|
|
10
14
|
}
|
|
11
15
|
|
|
12
16
|
export interface TreeProps {
|
|
13
17
|
node: TreeItem;
|
|
14
|
-
onClickNode?: (node: TreeItem) => void;
|
|
15
|
-
onClickLeaf?: (node: TreeItem) => void;
|
|
16
|
-
isOpenByDefault?: boolean;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
const treeSelectionEvent = (selectedTitle) =>
|
|
20
21
|
new CustomEvent('treeSelectionChanged', { detail: { selectedTitle } });
|
|
21
22
|
|
|
22
|
-
const Tree: React.FC<TreeProps> = ({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
const Tree: React.FC<TreeProps> = ({ node }) => {
|
|
24
|
+
const {
|
|
25
|
+
title,
|
|
26
|
+
childrens,
|
|
27
|
+
disabled,
|
|
28
|
+
isLeaf,
|
|
29
|
+
onClickNode,
|
|
30
|
+
onClickLeaf,
|
|
31
|
+
isOpenByDefault,
|
|
32
|
+
isSelectedByDefault,
|
|
33
|
+
} = node;
|
|
34
|
+
|
|
35
|
+
const isAnyDescendantSelectedByDefault = (node) => {
|
|
36
|
+
if (node.isSelectedByDefault) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return node.childrens?.some(isAnyDescendantSelectedByDefault) ?? false;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const initialIsOpen =
|
|
43
|
+
isOpenByDefault || isAnyDescendantSelectedByDefault(node);
|
|
44
|
+
const [isOpen, setIsOpen] = useState(initialIsOpen);
|
|
45
|
+
const [isSelected, setIsSelected] = useState(isSelectedByDefault || false);
|
|
31
46
|
|
|
32
47
|
useEffect(() => {
|
|
33
48
|
const handleSelectionChange = (event) => {
|
|
34
|
-
if (title !== event.detail.selectedTitle) {
|
|
49
|
+
if (isLeaf && title !== event.detail.selectedTitle) {
|
|
35
50
|
setIsSelected(false);
|
|
36
51
|
}
|
|
37
52
|
};
|
|
@@ -41,14 +56,13 @@ const Tree: React.FC<TreeProps> = ({
|
|
|
41
56
|
return () => {
|
|
42
57
|
window.removeEventListener('treeSelectionChanged', handleSelectionChange);
|
|
43
58
|
};
|
|
44
|
-
}, [title]);
|
|
59
|
+
}, [title, isLeaf]);
|
|
45
60
|
|
|
46
61
|
const handleClick = () => {
|
|
47
62
|
if (!disabled) {
|
|
48
|
-
setIsSelected(true);
|
|
49
|
-
window.dispatchEvent(treeSelectionEvent(title));
|
|
50
|
-
|
|
51
63
|
if (isLeaf) {
|
|
64
|
+
setIsSelected(true);
|
|
65
|
+
window.dispatchEvent(treeSelectionEvent(title));
|
|
52
66
|
if (onClickLeaf) onClickLeaf(node);
|
|
53
67
|
} else {
|
|
54
68
|
if (onClickNode) onClickNode(node);
|
|
@@ -92,12 +106,7 @@ const Tree: React.FC<TreeProps> = ({
|
|
|
92
106
|
{isOpen && childrens && (
|
|
93
107
|
<C.Content>
|
|
94
108
|
{childrens.map((child, index) => (
|
|
95
|
-
<Tree
|
|
96
|
-
key={child.title + index}
|
|
97
|
-
node={child}
|
|
98
|
-
onClickNode={onClickNode}
|
|
99
|
-
onClickLeaf={onClickLeaf}
|
|
100
|
-
/>
|
|
109
|
+
<Tree key={child.title + index} node={child} />
|
|
101
110
|
))}
|
|
102
111
|
</C.Content>
|
|
103
112
|
)}
|
|
@@ -107,27 +116,13 @@ const Tree: React.FC<TreeProps> = ({
|
|
|
107
116
|
|
|
108
117
|
export interface TreeListProps {
|
|
109
118
|
nodes: TreeItem[];
|
|
110
|
-
onClickNode?: (node: TreeItem) => void;
|
|
111
|
-
onClickLeaf?: (node: TreeItem) => void;
|
|
112
|
-
isOpenByDefault?: boolean;
|
|
113
119
|
}
|
|
114
120
|
|
|
115
|
-
const TreeList: React.FC<TreeListProps> = ({
|
|
116
|
-
nodes,
|
|
117
|
-
onClickNode,
|
|
118
|
-
onClickLeaf,
|
|
119
|
-
isOpenByDefault = false,
|
|
120
|
-
}) => {
|
|
121
|
+
const TreeList: React.FC<TreeListProps> = ({ nodes }) => {
|
|
121
122
|
return (
|
|
122
123
|
<div>
|
|
123
124
|
{nodes.map((node, index) => (
|
|
124
|
-
<Tree
|
|
125
|
-
key={node.title + index}
|
|
126
|
-
node={node}
|
|
127
|
-
onClickNode={onClickNode}
|
|
128
|
-
onClickLeaf={onClickLeaf}
|
|
129
|
-
isOpenByDefault={isOpenByDefault}
|
|
130
|
-
/>
|
|
125
|
+
<Tree key={node.title + index} node={node} />
|
|
131
126
|
))}
|
|
132
127
|
</div>
|
|
133
128
|
);
|