-
Notifications
You must be signed in to change notification settings - Fork 27
/
index.tsx
134 lines (122 loc) · 3.95 KB
/
index.tsx
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import React from "react";
import PropTypes from "prop-types";
import { fade, makeStyles, withStyles } from "@material-ui/core/styles";
import TreeView from "@material-ui/lab/TreeView";
import TreeItem, { TreeItemProps } from "@material-ui/lab/TreeItem";
import Collapse from "@material-ui/core/Collapse";
import { useSpring, animated } from "react-spring/web.cjs"; // web.cjs is required for IE 11 support
import FolderIcon from "@material-ui/icons/Folder";
import FolderOpenIcon from "@material-ui/icons/FolderOpen";
import InsertDriveFileOutlinedIcon from "@material-ui/icons/InsertDriveFileOutlined";
import { Config } from "../../actions";
import { setCurrentConfigIdChainAction } from "../../actions/config";
function TransitionComponent(props: any) {
const style = useSpring({
from: { opacity: 0, transform: "translate3d(30px,0,0)" },
to: {
opacity: props.in ? 1 : 0,
transform: `translate3d(${props.in ? 0 : 30}px,0,0)`
}
});
return (
<animated.div style={style}>
<Collapse {...props} />
</animated.div>
);
}
TransitionComponent.propTypes = {
/**
* Show the component; triggers the enter or exit states
*/
in: PropTypes.bool
};
const StyledTreeItem = withStyles((theme: any) => ({
group: {
marginLeft: 12,
paddingLeft: 12,
borderLeft: `1px dashed ${fade(theme.palette.text.primary, 0.4)}`
},
content: {
height: 30
}
}))((props: TreeItemProps) => (
<TreeItem {...props} TransitionComponent={TransitionComponent} />
));
const useStyles = makeStyles({
root: {
height: 400,
flexGrow: 1,
maxWidth: 400
}
});
export interface FileTreeProp {
rootConfig: Config;
dispatch: any;
}
const renderStyledTreeItem = (
config: Config,
idChain: string[],
dispatch: any
) => {
let newIdChain: string[] = idChain.slice(0); // copy idChain to newIdChain, different memory addresses
newIdChain.push(config.get("id"));
// const currentConfig = getCurrentConfig();
if (config.get("type") === "file") {
return (
<StyledTreeItem
key={config.get("id")}
nodeId={config.get("id")}
label={config.get("name")}
onClick={() => dispatch(setCurrentConfigIdChainAction(newIdChain))}
// isSelected={config.get("id") === currentConfig.get("id")}
/>
);
}
const childrenItems: any[] = [];
config.get("children").forEach((childConfig: Config) => {
// 递归渲染子树
childrenItems.push(renderStyledTreeItem(childConfig, newIdChain, dispatch));
});
return (
<StyledTreeItem
key={config.get("id")}
nodeId={config.get("id")}
label={config.get("name")}
>
{childrenItems}
</StyledTreeItem>
);
};
export const FileTree = (props: FileTreeProp) => {
const classes = useStyles();
return (
<TreeView
// onClick={v => console.log(v)}
className={classes.root}
defaultExpanded={[props.rootConfig.get("id")]}
defaultCollapseIcon={<FolderOpenIcon htmlColor="#f9a825" />}
defaultExpandIcon={<FolderIcon htmlColor="#f9a825" />}
defaultEndIcon={<InsertDriveFileOutlinedIcon htmlColor="#0277bd" />}
>
{renderStyledTreeItem(props.rootConfig, [], props.dispatch)}
{/* <StyledTreeItem nodeId="1" label="Main">
<StyledTreeItem nodeId="2" label="Hello" />
<StyledTreeItem nodeId="3" label="Subtree with children">
<StyledTreeItem nodeId="6" label="Hello" />
<StyledTreeItem nodeId="7" label="Sub-subtree with children">
<StyledTreeItem nodeId="9" label="Child 1" />
<StyledTreeItem nodeId="10" label="Child 2" />
<StyledTreeItem nodeId="11" label="Child 3" />
</StyledTreeItem>
<StyledTreeItem
nodeId="8"
label="Hello"
onClick={() => console.log("hello")}
/>
</StyledTreeItem>
<StyledTreeItem nodeId="4" label="World" />
<StyledTreeItem nodeId="5" label="Something something" />
</StyledTreeItem> */}
</TreeView>
);
};