4d7e938495b4934cfb02699f55e3ce337e1b34f7
[arvados-workbench2.git] / src / components / collection-panel-files / collection-panel-files.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import * as React from 'react';
6 import { TreeItem, TreeItemStatus } from '~/components/tree/tree';
7 import { FileTreeData } from '~/components/file-tree/file-tree-data';
8 import { FileTree } from '~/components/file-tree/file-tree';
9 import { IconButton, Grid, Typography, StyleRulesCallback, withStyles, WithStyles, CardHeader, Card, Button, Tooltip } from '@material-ui/core';
10 import { CustomizeTableIcon } from '~/components/icon/icon';
11 import { DownloadIcon } from '~/components/icon/icon';
12
13 export interface CollectionPanelFilesProps {
14     items: Array<TreeItem<FileTreeData>>;
15     isWritable: boolean;
16     isLoading: boolean;
17     tooManyFiles: boolean;
18     onUploadDataClick: () => void;
19     onItemMenuOpen: (event: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>, isWritable: boolean) => void;
20     onOptionsMenuOpen: (event: React.MouseEvent<HTMLElement>, isWritable: boolean) => void;
21     onSelectionToggle: (event: React.MouseEvent<HTMLElement>, item: TreeItem<FileTreeData>) => void;
22     onCollapseToggle: (id: string, status: TreeItemStatus) => void;
23     onFileClick: (id: string) => void;
24     loadFilesFunc: () => void;
25     currentItemUuid?: string;
26 }
27
28 type CssRules = 'root' | 'cardSubheader' | 'nameHeader' | 'fileSizeHeader' | 'uploadIcon' | 'button' | 'centeredLabel';
29
30 const styles: StyleRulesCallback<CssRules> = theme => ({
31     root: {
32         paddingBottom: theme.spacing.unit
33     },
34     cardSubheader: {
35         paddingTop: 0,
36         paddingBottom: 0
37     },
38     nameHeader: {
39         marginLeft: '75px'
40     },
41     fileSizeHeader: {
42         marginRight: '65px'
43     },
44     uploadIcon: {
45         transform: 'rotate(180deg)'
46     },
47     button: {
48         marginRight: -theme.spacing.unit,
49         marginTop: '0px'
50     },
51     centeredLabel: {
52         fontSize: '0.875rem',
53         textAlign: 'center'
54     },
55 });
56
57 export const CollectionPanelFiles =
58     withStyles(styles)(
59         ({ onItemMenuOpen, onOptionsMenuOpen, onUploadDataClick, classes,
60             isWritable, isLoading, tooManyFiles, loadFilesFunc, ...treeProps }: CollectionPanelFilesProps & WithStyles<CssRules>) =>
61             <Card data-cy='collection-files-panel' className={classes.root}>
62                 <CardHeader
63                     title="Files"
64                     classes={{ action: classes.button }}
65                     action={
66                         isWritable &&
67                         <Button
68                             data-cy='upload-button'
69                             onClick={onUploadDataClick}
70                             variant='contained'
71                             color='primary'
72                             size='small'>
73                             <DownloadIcon className={classes.uploadIcon} />
74                             Upload data
75                         </Button>
76                     } />
77                 { tooManyFiles
78                 ? <div className={classes.centeredLabel}>
79                         File listing may take some time, please click to browse: <Button onClick={loadFilesFunc}><DownloadIcon/>Show files</Button>
80                 </div>
81                 : <>
82                     <CardHeader
83                         className={classes.cardSubheader}
84                         action={
85                             <Tooltip title="More options" disableFocusListener>
86                                 <IconButton
87                                     data-cy='collection-files-panel-options-btn'
88                                     onClick={(ev) => onOptionsMenuOpen(ev, isWritable)}>
89                                     <CustomizeTableIcon />
90                                 </IconButton>
91                             </Tooltip>
92                         } />
93                     <Grid container justify="space-between">
94                         <Typography variant="caption" className={classes.nameHeader}>
95                             Name
96                         </Typography>
97                         <Typography variant="caption" className={classes.fileSizeHeader}>
98                             File size
99                         </Typography>
100                     </Grid>
101                     { isLoading
102                     ? <div className={classes.centeredLabel}>(loading files...)</div>
103                     : <FileTree onMenuOpen={(ev, item) => onItemMenuOpen(ev, item, isWritable)} {...treeProps} /> }
104                 </>
105                 }
106             </Card>);