1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
6 import List from "@material-ui/core/List/List";
7 import ListItem from "@material-ui/core/ListItem/ListItem";
8 import { ReactElement } from "react";
9 import Collapse from "@material-ui/core/Collapse/Collapse";
11 export interface TreeItem<T> {
15 items?: Array<TreeItem<T>>;
18 interface TreeProps<T> {
19 items?: Array<TreeItem<T>>;
20 render: (item: T) => ReactElement<{}>;
21 toggleItem: (id: string) => any;
25 class Tree<T> extends React.Component<TreeProps<T>, {}> {
26 render(): ReactElement<any> {
27 const level = this.props.level ? this.props.level : 0;
28 return <List component="div">
29 {this.props.items && this.props.items.map((it: TreeItem<T>, idx: number) =>
30 <div key={`item/${level}/${idx}`}>
31 <ListItem button onClick={() => this.props.toggleItem(it.id)} style={{paddingLeft: (level + 1) * 30}}>
32 {this.props.render(it.data)}
34 {it.items && it.items.length > 0 &&
35 <Collapse in={it.open} timeout="auto" unmountOnExit>
36 <Tree items={it.items}
37 render={this.props.render}
38 toggleItem={this.props.toggleItem}