left-side-panel-small-refactor
[arvados-workbench2.git] / src / components / project-tree / project-tree.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { ReactElement } from 'react';
7 import { StyleRulesCallback, Theme, WithStyles, withStyles } from '@material-ui/core/styles';
8 import ListItemText from "@material-ui/core/ListItemText/ListItemText";
9 import ListItemIcon from '@material-ui/core/ListItemIcon';
10 import Typography from '@material-ui/core/Typography';
11
12 import Tree, { TreeItem, TreeItemStatus } from '../tree/tree';
13 import { Project } from '../../models/project';
14
15 export interface ProjectTreeProps {
16     projects: Array<TreeItem<Project>>;
17     toggleOpen: (id: string, status: TreeItemStatus) => void;
18     toggleActive: (id: string) => void;
19 }
20
21 class ProjectTree<T> extends React.Component<ProjectTreeProps & WithStyles<CssRules>> {
22     render(): ReactElement<any> {
23         const { classes, projects, toggleOpen, toggleActive } = this.props;
24         const { active, listItemText, row, treeContainer } = classes;
25         return (
26             <div className={treeContainer}>
27                 <Tree items={projects}
28                     toggleItemOpen={toggleOpen}
29                     toggleItemActive={toggleActive}
30                     render={(project: TreeItem<Project>) =>
31                         <span className={row}>
32                             <ListItemIcon className={project.active ? active : ''}>
33                                 <i className="fas fa-folder" />
34                             </ListItemIcon>
35                             <ListItemText className={listItemText} primary={
36                                 <Typography className={project.active ? active : ''}>{project.data.name}</Typography>
37                             } />
38                         </span>
39                     } />
40             </div>
41         );
42     }
43 }
44
45 type CssRules = 'active' | 'listItemText' | 'row' | 'treeContainer';
46
47 const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
48     active: {
49         color: '#4285F6',
50     },
51     listItemText: {
52         padding: '0px',
53     },
54     row: {
55         display: 'flex',
56         alignItems: 'center',
57         marginLeft: '20px',
58     },
59     treeContainer: {
60         minWidth: '240px',
61         whiteSpace: 'nowrap',
62         marginLeft: '13px',
63     }
64 });
65
66 export default withStyles(styles)(ProjectTree);