From: Janicki Artur Date: Wed, 12 Sep 2018 07:59:26 +0000 (+0200) Subject: add 'New' button with 3 options and clean code X-Git-Tag: 1.3.0~98^2~5 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/89efe3a344e0850cf7e401142d2a838cbc825ffb add 'New' button with 3 options and clean code Feature #14137 Arvados-DCO-1.1-Signed-off-by: Janicki Artur --- diff --git a/src/components/icon/icon.tsx b/src/components/icon/icon.tsx index afc0fed1..c0668b82 100644 --- a/src/components/icon/icon.tsx +++ b/src/components/icon/icon.tsx @@ -4,6 +4,7 @@ import * as React from 'react'; import AccessTime from '@material-ui/icons/AccessTime'; +import Add from '@material-ui/icons/Add'; import ArrowBack from '@material-ui/icons/ArrowBack'; import ArrowDropDown from '@material-ui/icons/ArrowDropDown'; import BubbleChart from '@material-ui/icons/BubbleChart'; @@ -48,6 +49,7 @@ import HelpOutline from '@material-ui/icons/HelpOutline'; export type IconType = React.SFC<{ className?: string }>; +export const AddIcon: IconType = (props) => ; export const AddFavoriteIcon: IconType = (props) => ; export const AdvancedIcon: IconType = (props) => ; export const BackIcon: IconType = (props) => ; diff --git a/src/views-components/side-panel-button/side-panel-button.tsx b/src/views-components/side-panel-button/side-panel-button.tsx new file mode 100644 index 00000000..28e6891a --- /dev/null +++ b/src/views-components/side-panel-button/side-panel-button.tsx @@ -0,0 +1,111 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { connect, DispatchProp } from 'react-redux'; +import { RootState } from '~/store/store'; +import { getProperty } from '~/store/properties/properties'; +import { PROJECT_PANEL_CURRENT_UUID } from '~/store/project-panel/project-panel-action'; +import { ArvadosTheme } from '~/common/custom-theme'; +import { PopoverOrigin } from '@material-ui/core/Popover'; +import { StyleRulesCallback, WithStyles, withStyles, Toolbar, Grid, Button, MenuItem, Menu } from '@material-ui/core'; +import { AddIcon, CollectionIcon, ProcessIcon, ProjectIcon } from '~/components/icon/icon'; +import { openProjectCreateDialog } from '~/store/projects/project-create-actions'; +import { openCollectionCreateDialog } from '~/store/collections/collection-create-actions'; + +type CssRules = 'button' | 'menuItem' | 'icon'; + +const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ + button: { + boxShadow: 'none', + padding: '2px 10px 2px 5px', + fontSize: '0.75rem' + }, + menuItem: { + fontSize: '0.875rem', + color: theme.palette.grey["700"] + }, + icon: { + marginRight: theme.spacing.unit + } +}); + +interface SidePanelDataProps { + currentItemId: string; +} + +interface SidePanelState { + anchorEl: any; +} + +type SidePanelProps = SidePanelDataProps & DispatchProp & WithStyles; + +export const SidePanelButton = withStyles(styles)( + connect((state: RootState) => ({ + currentItemId: getProperty(PROJECT_PANEL_CURRENT_UUID)(state.properties) + }))( + class extends React.Component { + + state: SidePanelState = { + anchorEl: undefined + }; + + transformOrigin: PopoverOrigin = { + vertical: -50, + horizontal: 25 + }; + + render() { + const { classes } = this.props; + const { anchorEl } = this.state; + return + + + + + + New collection + + + Run a process + + + New project + + + + + ; + } + + handleNewProjectClick = () => { + this.props.dispatch(openProjectCreateDialog(this.props.currentItemId)); + } + + handleNewCollectionClick = () => { + this.props.dispatch(openCollectionCreateDialog(this.props.currentItemId)); + } + + handleClose = () => { + this.setState({ anchorEl: undefined }); + } + + handleOpen = (event: React.MouseEvent) => { + this.setState({ anchorEl: event.currentTarget }); + } + } + ) +); \ No newline at end of file diff --git a/src/views-components/side-panel/side-panel.tsx b/src/views-components/side-panel/side-panel.tsx index 70bc92b7..fffe3344 100644 --- a/src/views-components/side-panel/side-panel.tsx +++ b/src/views-components/side-panel/side-panel.tsx @@ -4,12 +4,13 @@ import * as React from 'react'; import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; -import Drawer from '@material-ui/core/Drawer'; import { ArvadosTheme } from '~/common/custom-theme'; import { SidePanelTree, SidePanelTreeProps } from '~/views-components/side-panel-tree/side-panel-tree'; import { compose, Dispatch } from 'redux'; import { connect } from 'react-redux'; import { navigateFromSidePanel } from '../../store/side-panel/side-panel-action'; +import { Grid } from '@material-ui/core'; +import { SidePanelButton } from '~/views-components/side-panel-button/side-panel-button'; const DRAWER_WITDH = 240; @@ -35,6 +36,7 @@ export const SidePanel = compose( withStyles(styles), connect(undefined, mapDispatchToProps) )(({ classes, ...props }: WithStyles & SidePanelTreeProps) => -
+ + -
); + ); \ No newline at end of file diff --git a/src/views/project-panel/project-panel.tsx b/src/views/project-panel/project-panel.tsx index 63aedadd..2c962ef8 100644 --- a/src/views/project-panel/project-panel.tsx +++ b/src/views/project-panel/project-panel.tsx @@ -31,7 +31,7 @@ import { filterResources } from '~/store/resources/resources'; import { PanelDefaultView } from '~/components/panel-default-view/panel-default-view'; import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view'; -type CssRules = 'root' | "toolbar" | "button"; +type CssRules = 'root' | "button"; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { @@ -39,10 +39,6 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ width: '100%', height: '100%' }, - toolbar: { - paddingBottom: theme.spacing.unit * 3, - textAlign: "right" - }, button: { marginLeft: theme.spacing.unit }, @@ -143,17 +139,6 @@ export const ProjectPanel = withStyles(styles)( render() { const { classes } = this.props; return
-
- - - -
{this.hasAnyItems() ? { - this.props.dispatch(openProjectCreateDialog(this.props.currentItemId)); - } - - handleNewCollectionClick = () => { - this.props.dispatch(openCollectionCreateDialog(this.props.currentItemId)); - } - handleContextMenu = (event: React.MouseEvent, resourceUuid: string) => { const menuKind = resourceKindToContextMenuKind(resourceUuid); const resource = getResource(resourceUuid)(this.props.resources); diff --git a/src/views/workbench/workbench.tsx b/src/views/workbench/workbench.tsx index 56fabeba..3f61c521 100644 --- a/src/views/workbench/workbench.tsx +++ b/src/views/workbench/workbench.tsx @@ -43,7 +43,7 @@ import { TrashPanel } from "~/views/trash-panel/trash-panel"; import { MainContentBar } from '../../views-components/main-content-bar/main-content-bar'; import { Grid } from '@material-ui/core'; -type CssRules = 'root' | 'contentWrapper' | 'content' | 'appBar'; +type CssRules = 'root' | 'asidePanel' | 'contentWrapper' | 'content' | 'appBar'; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ root: { @@ -51,6 +51,10 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ width: '100vw', height: '100vh' }, + asidePanel: { + maxWidth: '240px', + background: theme.palette.background.default + }, contentWrapper: { background: theme.palette.background.default, minWidth: 0, @@ -93,14 +97,11 @@ export const Workbench = withStyles(styles)( state = { searchText: "", }; - render() { + const { classes } = this.props; return <> - - + + {this.props.user && - - + + - + - +