-export interface SidePanelItem {
- id: string;
- name: string;
- icon: IconType;
- active?: boolean;
- open?: boolean;
- margin?: boolean;
- openAble?: boolean;
-}
-
-interface SidePanelProps {
- toggleOpen: (id: string) => void;
- toggleActive: (id: string) => void;
- sidePanelItems: SidePanelItem[];
- onContextMenu: (event: React.MouseEvent<HTMLElement>, item: SidePanelItem) => void;
-}
-
-class SidePanel extends React.Component<SidePanelProps & WithStyles<CssRules>> {
- render(): ReactElement<any> {
- const { classes, toggleOpen, toggleActive, sidePanelItems, children } = this.props;
- const { leftSidePanelContainer, row, list, toggableIconContainer } = classes;
- return (
- <div className={leftSidePanelContainer}>
- <List>
- {sidePanelItems.map(it => (
- <span key={it.name}>
- <ListItem button className={list} onClick={() => toggleActive(it.id)} onContextMenu={this.handleRowContextMenu(it)}>
- <span className={row}>
- {it.openAble ? (
- <i onClick={() => toggleOpen(it.id)} className={toggableIconContainer}>
- <ListItemIcon className={this.getToggableIconClassNames(it.open, it.active)}>
- {< SidePanelRightArrowIcon />}
- </ListItemIcon>
- </i>
- ) : null}
- <ListItemIcon className={this.getListItemIconClassNames(it.margin, it.active)}>
- {<it.icon />}
- </ListItemIcon>
- <ListItemText primary={this.renderListItemText(it.name, it.active)} />
- </span>
- </ListItem>
- {it.openAble ? (
- <Collapse in={it.open} timeout="auto" unmountOnExit>
- {children}
- </Collapse>
- ) : null}
- </span>
- ))}
- </List>
- </div>
- );
- }
-
- getToggableIconClassNames = (isOpen?: boolean, isActive ?: boolean) => {
- const { classes } = this.props;
- return classnames(classes.toggableIcon, {
- [classes.iconOpen]: isOpen,
- [classes.iconClose]: !isOpen,
- [classes.active]: isActive
- });
- }
-
- getListItemIconClassNames = (hasMargin?: boolean, isActive?: boolean) => {
- const { classes } = this.props;
- return classnames({
- [classes.hasMargin]: hasMargin,
- [classes.active]: isActive
- });
- }
-
- renderListItemText = (name: string, isActive?: boolean) => {
- return <Typography variant='body1' className={this.getListItemTextClassNames(isActive)}>
- {name}
- </Typography>;
- }
-
- getListItemTextClassNames = (isActive?: boolean) => {
- const { classes } = this.props;
- return classnames(classes.listItemText, {
- [classes.active]: isActive
- });
- }
-
- handleRowContextMenu = (item: SidePanelItem) =>
- (event: React.MouseEvent<HTMLElement>) =>
- item.openAble ? this.props.onContextMenu(event, item) : null
-
-}
-
-type CssRules = 'active' | 'listItemText' | 'row' | 'leftSidePanelContainer' | 'list' |
- 'hasMargin' | 'iconClose' | 'iconOpen' | 'toggableIconContainer' | 'toggableIcon';