// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import List from "@material-ui/core/List/List"; import ListItem from "@material-ui/core/ListItem/ListItem"; import { StyleRulesCallback, Theme, withStyles, WithStyles } from '@material-ui/core/styles'; import { ReactElement } from "react"; import Collapse from "@material-ui/core/Collapse/Collapse"; type CssRules = 'list' | 'activeArrow' | 'arrow' | 'arrowRotate'; const styles: StyleRulesCallback = (theme: Theme) => ({ list: { paddingBottom: '3px', paddingTop: '3px', }, activeArrow: { color: '#4285F6', position: 'absolute', }, arrow: { position: 'absolute', }, arrowRotate: { transform: 'rotate(-90deg)', } }); export interface TreeItem { data: T; id: string; open: boolean; active: boolean; items?: Array>; } interface TreeProps { items?: Array>; render: (item: TreeItem, level?: number) => ReactElement<{}>; toggleItem: (id: string) => any; level?: number; } class Tree extends React.Component & WithStyles, {}> { renderArrow (items: boolean, arrowClass: string, open: boolean){ return } render(): ReactElement { const level = this.props.level ? this.props.level : 0; const {classes, render, toggleItem, items} = this.props; const {list, arrow, activeArrow} = classes; return {items && items.map((it: TreeItem, idx: number) =>
toggleItem(it.id)} className={list} style={{paddingLeft: (level + 1) * 20}}> {this.renderArrow(true, it.active ? activeArrow : arrow, it.open)} {render(it, level)} {it.items && it.items.length > 0 && }
)}
} } const StyledTree = withStyles(styles)(Tree); export default StyledTree