1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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';
12 import Tree, { TreeItem, TreeItemStatus } from '../../components/tree/tree';
13 import { ProjectResource } from '../../models/project';
15 export interface ProjectTreeProps {
16 projects: Array<TreeItem<ProjectResource>>;
17 toggleOpen: (id: string, status: TreeItemStatus) => void;
18 toggleActive: (id: string, status: TreeItemStatus) => void;
19 onContextMenu: (event: React.MouseEvent<HTMLElement>, item: TreeItem<ProjectResource>) => void;
22 class ProjectTree<T> extends React.Component<ProjectTreeProps & WithStyles<CssRules>> {
23 render(): ReactElement<any> {
24 const { classes, projects, toggleOpen, toggleActive, onContextMenu } = this.props;
25 const { active, listItemText, row, treeContainer } = classes;
27 <div className={treeContainer}>
28 <Tree items={projects}
29 onContextMenu={onContextMenu}
30 toggleItemOpen={toggleOpen}
31 toggleItemActive={toggleActive}
32 render={(project: TreeItem<ProjectResource>) =>
33 <span className={row}>
34 <ListItemIcon className={project.active ? active : ''}>
35 <i className="fas fa-folder" />
37 <ListItemText className={listItemText} primary={
38 <Typography className={project.active ? active : ''}>{project.data.name}</Typography>
47 type CssRules = 'active' | 'listItemText' | 'row' | 'treeContainer';
49 const styles: StyleRulesCallback<CssRules> = (theme: Theme) => ({
68 export default withStyles(styles)(ProjectTree);