From 1d9efaa46b5e30f4b69fa8ebca99ea234a5d40c7 Mon Sep 17 00:00:00 2001 From: Janicki Artur Date: Wed, 18 Jul 2018 14:24:09 +0200 Subject: [PATCH] refatoring project tree component, create component for list item Feature #13797 Arvados-DCO-1.1-Signed-off-by: Janicki Artur --- src/components/side-panel/side-panel.tsx | 44 ++--------- .../single-list-item/single-list-item.tsx | 74 +++++++++++++++++++ src/components/tree/tree.tsx | 7 +- .../project-tree/project-tree.tsx | 46 ++++-------- 4 files changed, 98 insertions(+), 73 deletions(-) create mode 100644 src/components/single-list-item/single-list-item.tsx diff --git a/src/components/side-panel/side-panel.tsx b/src/components/side-panel/side-panel.tsx index 2d384ef7fa..8105ba7507 100644 --- a/src/components/side-panel/side-panel.tsx +++ b/src/components/side-panel/side-panel.tsx @@ -9,6 +9,7 @@ import { ArvadosTheme } from '../../common/custom-theme'; import { List, ListItem, ListItemText, ListItemIcon, Collapse, Typography } from "@material-ui/core"; import { SidePanelRightArrowIcon, IconType } from '../icon/icon'; import * as classnames from "classnames"; +import SingleListItem from '../single-list-item/single-list-item'; export interface SidePanelItem { id: string; @@ -30,9 +31,9 @@ interface SidePanelProps { class SidePanel extends React.Component> { render(): ReactElement { const { classes, toggleOpen, toggleActive, sidePanelItems, children } = this.props; - const { leftSidePanelContainer, row, list, toggableIconContainer } = classes; + const { root, row, list, toggableIconContainer } = classes; return ( -
+
{sidePanelItems.map(it => ( @@ -41,14 +42,11 @@ class SidePanel extends React.Component> { {it.openAble ? ( toggleOpen(it.id)} className={toggableIconContainer}> - {< SidePanelRightArrowIcon />} + < SidePanelRightArrowIcon /> ) : null} - - {} - - + {it.openAble ? ( @@ -72,38 +70,16 @@ class SidePanel extends React.Component> { }); } - getListItemIconClassNames = (hasMargin?: boolean, isActive?: boolean) => { - const { classes } = this.props; - return classnames({ - [classes.hasMargin]: hasMargin, - [classes.active]: isActive - }); - } - - renderListItemText = (name: string, isActive?: boolean) => { - return - {name} - ; - } - - getListItemTextClassNames = (isActive?: boolean) => { - const { classes } = this.props; - return classnames(classes.listItemText, { - [classes.active]: isActive - }); - } - handleRowContextMenu = (item: SidePanelItem) => (event: React.MouseEvent) => item.openAble ? this.props.onContextMenu(event, item) : null } -type CssRules = 'active' | 'listItemText' | 'row' | 'leftSidePanelContainer' | 'list' | - 'hasMargin' | 'iconClose' | 'iconOpen' | 'toggableIconContainer' | 'toggableIcon'; +type CssRules = 'active' | 'row' | 'root' | 'list' | 'iconClose' | 'iconOpen' | 'toggableIconContainer' | 'toggableIcon'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ - leftSidePanelContainer: { + root: { overflowY: 'auto', minWidth: '240px', whiteSpace: 'nowrap', @@ -127,15 +103,9 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ toggableIcon: { fontSize: '14px' }, - listItemText: { - fontWeight: 700 - }, active: { color: theme.palette.primary.main, }, - hasMargin: { - marginLeft: '18px', - }, iconClose: { transition: 'all 0.1s ease', }, diff --git a/src/components/single-list-item/single-list-item.tsx b/src/components/single-list-item/single-list-item.tsx new file mode 100644 index 0000000000..13338c3d55 --- /dev/null +++ b/src/components/single-list-item/single-list-item.tsx @@ -0,0 +1,74 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; +import { ArvadosTheme } from '../../common/custom-theme'; +import { ListItemIcon, ListItemText, Typography } from '@material-ui/core'; +import { IconType } from '../icon/icon'; +import * as classnames from "classnames"; + +export interface SingleListItemDataProps { + icon: IconType; + name: string; + isActive?: boolean; + hasMargin?: boolean; +} + +type SingleListItemProps = SingleListItemDataProps & WithStyles; + +class SingleListItem extends React.Component { + render() { + const { classes, isActive, hasMargin, name, icon: Icon } = this.props; + return ( + + + + + + {name} + + } /> + + ); + } + + getListItemIconClassNames = (hasMargin?: boolean, isActive?: boolean) => { + const { classes } = this.props; + return classnames({ + [classes.hasMargin]: hasMargin, + [classes.active]: isActive + }); + } + + getListItemTextClassNames = (isActive?: boolean) => { + const { classes } = this.props; + return classnames(classes.listItemText, { + [classes.active]: isActive + }); + } + + +} + +type CssRules = 'root' | 'listItemText' | 'hasMargin' | 'active'; + +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + root: { + display: 'flex', + alignItems: 'center' + }, + listItemText: { + fontWeight: 700 + }, + active: { + color: theme.palette.primary.main, + }, + hasMargin: { + marginLeft: '18px', + }, +}); + +export default withStyles(styles)(SingleListItem); \ No newline at end of file diff --git a/src/components/tree/tree.tsx b/src/components/tree/tree.tsx index 8de9bda597..1ceb3b97cf 100644 --- a/src/components/tree/tree.tsx +++ b/src/components/tree/tree.tsx @@ -5,10 +5,11 @@ 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 { StyleRulesCallback, withStyles, WithStyles } from '@material-ui/core/styles'; import { ReactElement } from "react"; import Collapse from "@material-ui/core/Collapse/Collapse"; import CircularProgress from '@material-ui/core/CircularProgress'; +import { ArvadosTheme } from '../../common/custom-theme'; export enum TreeItemStatus { Initial, @@ -77,13 +78,13 @@ class Tree extends React.Component & WithStyles, {}> { type CssRules = 'list' | 'activeArrow' | 'inactiveArrow' | 'arrowRotate' | 'arrowTransition' | 'loader' | 'arrowVisibility'; -const styles: StyleRulesCallback = (theme: Theme) => ({ +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ list: { paddingBottom: '3px', paddingTop: '3px', }, activeArrow: { - color: '#4285F6', + color: theme.palette.primary.main, position: 'absolute', }, inactiveArrow: { diff --git a/src/views-components/project-tree/project-tree.tsx b/src/views-components/project-tree/project-tree.tsx index 17592a7f36..68c4c85772 100644 --- a/src/views-components/project-tree/project-tree.tsx +++ b/src/views-components/project-tree/project-tree.tsx @@ -5,12 +5,11 @@ import * as React from 'react'; import { ReactElement } from 'react'; import { StyleRulesCallback, Theme, WithStyles, withStyles } from '@material-ui/core/styles'; -import ListItemText from "@material-ui/core/ListItemText/ListItemText"; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import Typography from '@material-ui/core/Typography'; - import Tree, { TreeItem, TreeItemStatus } from '../../components/tree/tree'; import { ProjectResource } from '../../models/project'; +import { ProjectIcon } from '../../components/icon/icon'; +import { ArvadosTheme } from '../../common/custom-theme'; +import SingleListItem from '../../components/single-list-item/single-list-item'; export interface ProjectTreeProps { projects: Array>; @@ -22,46 +21,27 @@ export interface ProjectTreeProps { class ProjectTree extends React.Component> { render(): ReactElement { const { classes, projects, toggleOpen, toggleActive, onContextMenu } = this.props; - const { active, listItemText, row, treeContainer } = classes; + const { root } = classes; return ( -
+
) => - - - - - {project.data.name} - } /> - - } /> + render={ + (project: TreeItem) => + + }/>
); } } -type CssRules = 'active' | 'listItemText' | 'row' | 'treeContainer'; +type CssRules = 'root'; -const styles: StyleRulesCallback = (theme: Theme) => ({ - active: { - color: '#4285F6', - }, - listItemText: { - padding: '0px', - }, - row: { - display: 'flex', - alignItems: 'center', - marginLeft: '20px', - }, - treeContainer: { - minWidth: '240px', - whiteSpace: 'nowrap', - marginLeft: '13px', +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + root: { + marginLeft: `${theme.spacing.unit * 1.5}px`, } }); -- 2.30.2