// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import Drawer from '@material-ui/core/Drawer'; import IconButton from "@material-ui/core/IconButton"; import { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core/styles'; import { ArvadosTheme } from '../../common/custom-theme'; import Attribute from '../../components/attribute/attribute'; import Tabs from '@material-ui/core/Tabs'; import Tab from '@material-ui/core/Tab'; import Typography from '@material-ui/core/Typography'; import Grid from '@material-ui/core/Grid'; import * as classnames from "classnames"; import { connect, Dispatch } from 'react-redux'; import EmptyState from '../../components/empty-state/empty-state'; import { RootState } from '../../store/store'; import actions from "../../store/details-panel/details-panel-action"; import { Resource } from '../../common/api/common-resource-service'; import { ResourceKind } from '../../models/kinds'; import { ProjectResource } from '../../models/project'; import { CollectionResource } from '../../models/collection'; import IconBase, { IconTypes } from '../../components/icon/icon'; import { ProcessResource } from '../../models/process'; export interface DetailsPanelDataProps { onCloseDrawer: () => void; isOpened: boolean; icon: IconTypes; title: string; details: React.ReactElement; } type DetailsPanelProps = DetailsPanelDataProps & WithStyles; class DetailsPanel extends React.Component { state = { tabsValue: 0 }; handleChange = (event: any, value: boolean) => { this.setState({ tabsValue: value }); } renderTabContainer = (children: React.ReactElement) => {children} render() { const { classes, onCloseDrawer, isOpened, icon, title, details } = this.props; const { tabsValue } = this.state; return ( {title} {tabsValue === 0 && this.renderTabContainer( {details} )} {tabsValue === 1 && this.renderTabContainer( )} ); } } type CssRules = 'drawerPaper' | 'container' | 'opened' | 'headerContainer' | 'headerIcon' | 'tabContainer'; const drawerWidth = 320; const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ container: { width: 0, position: 'relative', height: 'auto', transition: 'width 0.5s ease', '&$opened': { width: drawerWidth } }, opened: {}, drawerPaper: { position: 'relative', width: drawerWidth }, headerContainer: { color: theme.palette.grey["600"], margin: `${theme.spacing.unit}px 0` }, headerIcon: { fontSize: "34px" }, tabContainer: { padding: theme.spacing.unit * 3 } }); type DetailsPanelResource = ProjectResource | CollectionResource | ProcessResource; const getIcon = (res: DetailsPanelResource) => { switch (res.kind) { case ResourceKind.Project: return IconTypes.FOLDER; case ResourceKind.Collection: return IconTypes.COLLECTION; case ResourceKind.Process: return IconTypes.PROCESS; default: return IconTypes.FOLDER; } }; const getDetails = (res: DetailsPanelResource) => { switch (res.kind) { case ResourceKind.Project: return
Projects
; case ResourceKind.Collection: return
Projects
; case ResourceKind.Process: return
Projects
; default: return getEmptyState(); } }; const getEmptyState = () => { return ; }; const mapStateToProps = ({ detailsPanel }: RootState) => { const { isOpened, item } = detailsPanel; return { isOpened, title: item ? (item as DetailsPanelResource).name : 'Projects', icon: item ? getIcon(item as DetailsPanelResource) : IconTypes.FOLDER, details: item ? getDetails(item as DetailsPanelResource) : getEmptyState() }; }; const mapDispatchToProps = (dispatch: Dispatch) => ({ onCloseDrawer: () => { dispatch(actions.TOGGLE_DETAILS_PANEL()); } }); const DetailsPanelContainer = connect(mapStateToProps, mapDispatchToProps)(DetailsPanel); export default withStyles(styles)(DetailsPanelContainer);