-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonTreeView.js
More file actions
62 lines (57 loc) · 1.87 KB
/
JsonTreeView.js
File metadata and controls
62 lines (57 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { withStyles } from '@material-ui/core/styles';
import ChevronRightIcon from '@material-ui/icons/ChevronRight';
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
import TreeItem from '@material-ui/lab/TreeItem';
import TreeView from '@material-ui/lab/TreeView';
const styles = (theme) => ({
root: {},
labelKey: {
color: theme.palette.primary.main,
},
labelValue: {
color: theme.palette.success.main,
},
});
const LabelComponent = withStyles(styles)(({ classes, nodeKey, nodeValue }) => {
return typeof nodeValue === 'object' ? (
<span className={classes.labelKey}>{nodeKey}</span>
) : (
<>
<span className={classes.labelKey}>{`${nodeKey}: `}</span>
<span className={classes.labelValue}>{nodeValue}</span>
</>
);
});
function JsonTreeView({ classes, data }) {
const renderNodes = (nodes, prevKey = 'root') =>
Array.isArray(nodes)
? nodes.map((node, index) => {
return (
// eslint-disable-next-line react/no-array-index-key
<TreeItem key={`${prevKey}${index}`} nodeId={`${prevKey}${index}`} label={index}>
{typeof node === 'object' ? renderNodes(node, `${prevKey}${index}`) : null}
</TreeItem>
);
})
: Object.entries(nodes).map(([key, value]) => {
return (
<TreeItem
key={`${prevKey}${key}`}
nodeId={`${prevKey}${key}`}
label={<LabelComponent nodeKey={key} nodeValue={value} />}
>
{typeof value === 'object' ? renderNodes(value, `${prevKey}${key}`) : null}
</TreeItem>
);
});
return (
<TreeView
className={classes.root}
defaultCollapseIcon={<ExpandMoreIcon />}
defaultExpandIcon={<ChevronRightIcon />}
>
{renderNodes(data)}
</TreeView>
);
}
export default withStyles(styles)(JsonTreeView);