1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import * as React from 'react';
7 StyleRulesCallback, WithStyles, withStyles, Card, CardHeader, IconButton,
8 CardContent, Grid, MenuItem, Menu, ListItemIcon, ListItemText, Typography
9 } from '@material-ui/core';
10 import { connect } from 'react-redux';
11 import { RouteComponentProps } from 'react-router';
12 import { ArvadosTheme } from '../../common/custom-theme';
13 import { RootState } from '../../store/store';
15 MoreOptionsIcon, CollectionIcon, ShareIcon, RenameIcon, AddFavoriteIcon, MoveToIcon,
16 CopyIcon, ProvenanceGraphIcon, DetailsIcon, AdvancedIcon, RemoveIcon
17 } from '../../components/icon/icon';
18 import { DetailsAttribute } from '../../components/details-attribute/details-attribute';
19 import { CollectionResource } from '../../models/collection';
21 type CssRules = 'card' | 'iconHeader';
23 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
29 color: theme.customs.colors.yellow700
33 const MENU_OPTIONS = [
35 title: 'Edit collection',
47 title: 'Add to favorites',
51 title: 'Copy to project',
55 title: 'View details',
59 title: 'Provenance graph',
60 icon: ProvenanceGraphIcon
72 interface CollectionPanelDataProps {
73 item: CollectionResource;
76 interface CollectionPanelActionProps {
77 onItemRouteChange: (collectionId: string) => void;
80 type CollectionPanelProps = CollectionPanelDataProps & CollectionPanelActionProps
81 & WithStyles<CssRules> & RouteComponentProps<{ id: string }>;
83 export const CollectionPanel = withStyles(styles)(
84 connect((state: RootState) => ({ item: state.collectionPanel.item }))(
85 class extends React.Component<CollectionPanelProps> {
92 showMenu = (event: any) => {
93 this.setState({ anchorEl: event.currentTarget, open: true });
97 this.setState({ anchorEl: undefined, open: false });
100 displayMenuAction = () => {
102 aria-label="More options"
103 aria-owns={this.state.anchorEl ? 'submenu' : undefined}
105 onClick={this.showMenu}>
111 const { anchorEl, open } = this.state;
112 const { classes, item } = this.props;
114 <Card className={classes.card}>
116 avatar={ <CollectionIcon className={classes.iconHeader} /> }
119 aria-label="More options"
120 aria-owns={anchorEl ? 'submenu' : undefined}
122 onClick={this.showMenu}>
126 title={item && item.name } />
132 onClose={this.closeMenu}>
133 {MENU_OPTIONS.map((option) => (
134 <MenuItem key={option.title}>
138 <ListItemText inset primary={
139 <Typography variant='body1'>
146 <Grid container direction="column">
148 <DetailsAttribute label='Collection UUID' value={item && item.uuid} />
149 <DetailsAttribute label='Content size' value='54 MB' />
150 <DetailsAttribute label='Owner' value={item && item.ownerUuid} />
156 <Card className={classes.card}>
157 <CardHeader title="Tags" />
159 <Grid container direction="column">
167 <Card className={classes.card}>
168 <CardHeader title="Files" />
170 <Grid container direction="column">
180 componentWillReceiveProps({ match, item, onItemRouteChange }: CollectionPanelProps) {
181 if (!item || match.params.id !== item.uuid) {
182 onItemRouteChange(match.params.id);