X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/152a17b28656fe498d3b3bbf21d5994e9ccd34ab..50031c8c6aae1f325f81d71a6f5a8c1cb293aa46:/src/components/side-panel/side-panel.tsx diff --git a/src/components/side-panel/side-panel.tsx b/src/components/side-panel/side-panel.tsx index ecfb5f09..ec648e11 100644 --- a/src/components/side-panel/side-panel.tsx +++ b/src/components/side-panel/side-panel.tsx @@ -4,108 +4,121 @@ import * as React from 'react'; import { ReactElement } from 'react'; -import { StyleRulesCallback, Theme, WithStyles, withStyles } from '@material-ui/core/styles'; -import List from "@material-ui/core/List/List"; -import ListItem from "@material-ui/core/ListItem/ListItem"; -import ListItemText from "@material-ui/core/ListItemText/ListItemText"; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import Collapse from "@material-ui/core/Collapse/Collapse"; +import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; +import { ArvadosTheme } from '../../common/custom-theme'; +import { List, ListItem, ListItemIcon, Collapse } from "@material-ui/core"; +import { SidePanelRightArrowIcon, IconType } from '../icon/icon'; +import * as classnames from "classnames"; +import { ListItemTextIcon } from '../list-item-text-icon/list-item-text-icon'; +import { Dispatch } from "redux"; -import { Typography } from '@material-ui/core'; +type CssRules = 'active' | 'row' | 'root' | 'list' | 'iconClose' | 'iconOpen' | 'toggableIconContainer' | 'toggableIcon'; -export interface SidePanelItem { - id: string; - name: string; - icon: string; - active?: boolean; - open?: boolean; -} - -interface SidePanelProps { - toggleSidePanelOpen: (id: string) => void; - toggleSidePanelActive: (id: string) => void; - sidePanelItems: SidePanelItem[]; -} - -class SidePanel extends React.Component> { - render(): ReactElement { - const { classes, toggleSidePanelOpen, toggleSidePanelActive, sidePanelItems } = this.props; - const { listItemText, leftSidePanelContainer, row, list, icon, projectIcon, active, activeArrow, inactiveArrow, arrowTransition, arrowRotate } = classes; - return ( -
- - {sidePanelItems.map(it => ( - - toggleSidePanelActive(it.id)}> - - {it.name === "Projects" ? toggleSidePanelOpen(it.id)} className={`${it.active ? activeArrow : inactiveArrow} - ${it.open ? `fas fa-caret-down ${arrowTransition}` : `fas fa-caret-down ${arrowRotate}`}`} /> : null} - - - - {it.name}} /> - - - {it.name === "Projects" ? ( - - {this.props.children} - ) : null} - - ))} - -
- ); - } -} - -type CssRules = 'active' | 'listItemText' | 'row' | 'leftSidePanelContainer' | 'list' | 'icon' | 'projectIcon' | - 'activeArrow' | 'inactiveArrow' | 'arrowRotate' | 'arrowTransition'; - -const styles: StyleRulesCallback = (theme: Theme) => ({ - active: { - color: '#4285F6', +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + root: { + overflowY: 'auto', + minWidth: '240px', + whiteSpace: 'nowrap', + marginTop: '52px', + display: 'flex', + flexGrow: 1, }, - listItemText: { - padding: '0px', + list: { + padding: '5px 0px 5px 14px', + minWidth: '240px', }, row: { display: 'flex', alignItems: 'center', }, - activeArrow: { - color: '#4285F6', - position: 'absolute', + toggableIconContainer: { + color: theme.palette.grey["700"], + height: '14px', + width: '14px' }, - inactiveArrow: { - position: 'absolute', + toggableIcon: { + fontSize: '14px' }, - arrowTransition: { - transition: 'all 0.1s ease', + active: { + color: theme.palette.primary.main, }, - arrowRotate: { + iconClose: { transition: 'all 0.1s ease', - transform: 'rotate(-90deg)', }, - leftSidePanelContainer: { - overflowY: 'auto', - minWidth: '240px', - whiteSpace: 'nowrap', - marginTop: '38px', - display: 'flex', - flexGrow: 1, - }, - list: { - paddingBottom: '5px', - paddingTop: '5px', - paddingLeft: '14px', - minWidth: '240px', - }, - icon: { - minWidth: '20px', - }, - projectIcon: { - marginLeft: '17px', + iconOpen: { + transition: 'all 0.1s ease', + transform: 'rotate(90deg)', } }); -export default withStyles(styles)(SidePanel); \ No newline at end of file +export interface SidePanelItem { + id: string; + name: string; + icon: IconType; + active?: boolean; + open?: boolean; + margin?: boolean; + openAble?: boolean; + activeAction?: (dispatch: Dispatch) => void; +} + +interface SidePanelDataProps { + toggleOpen: (id: string) => void; + toggleActive: (id: string) => void; + sidePanelItems: SidePanelItem[]; + onContextMenu: (event: React.MouseEvent, item: SidePanelItem) => void; +} + +type SidePanelProps = SidePanelDataProps & WithStyles; + +export const SidePanel = withStyles(styles)( + class extends React.Component { + render(): ReactElement { + const { classes, toggleOpen, toggleActive, sidePanelItems, children } = this.props; + const { root, row, list, toggableIconContainer } = classes; + return ( +
+ + {sidePanelItems.map(it => ( + + toggleActive(it.id)} + onContextMenu={this.handleRowContextMenu(it)}> + + {it.openAble ? ( + toggleOpen(it.id)} className={toggableIconContainer}> + + < SidePanelRightArrowIcon/> + + + ) : null} + + + + {it.openAble ? ( + + {children} + + ) : null} + + ))} + +
+ ); + } + + getToggableIconClassNames = (isOpen?: boolean, isActive ?: boolean) => { + const { iconOpen, iconClose, active, toggableIcon } = this.props.classes; + return classnames(toggableIcon, { + [iconOpen]: isOpen, + [iconClose]: !isOpen, + [active]: isActive + }); + } + + handleRowContextMenu = (item: SidePanelItem) => + (event: React.MouseEvent) => + item.openAble ? this.props.onContextMenu(event, item) : null + } +);