// 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'; import { matchProjectRoute } from '~/routes/routes'; 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; buttonVisible: boolean; } interface SidePanelState { anchorEl: any; } type SidePanelProps = SidePanelDataProps & DispatchProp & WithStyles; const transformOrigin: PopoverOrigin = { vertical: -50, horizontal: 45 }; const isButtonVisible = ({ router }: RootState) => { const pathname = router.location ? router.location.pathname : ''; const match = matchProjectRoute(pathname); return !!match; }; export const SidePanelButton = withStyles(styles)( connect((state: RootState) => ({ currentItemId: getProperty(PROJECT_PANEL_CURRENT_UUID)(state.properties), buttonVisible: isButtonVisible(state) }))( class extends React.Component { state: SidePanelState = { anchorEl: undefined }; render() { const { classes, buttonVisible } = this.props; const { anchorEl } = this.state; return {buttonVisible && 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 }); } } ) );