Merge branch '14178-tooltips-for-more-options'
[arvados-workbench2.git] / src / views / process-panel / process-subprocesses-card.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 {
7     StyleRulesCallback, WithStyles, withStyles, Card,
8     CardHeader, IconButton, CardContent, Typography, Tooltip
9 } from '@material-ui/core';
10 import { ArvadosTheme } from '~/common/custom-theme';
11 import { MoreOptionsIcon } from '~/components/icon/icon';
12 import { DetailsAttribute } from '~/components/details-attribute/details-attribute';
13 import { Process, getProcessStatus, getProcessRuntime } from '~/store/processes/process';
14 import { formatTime } from '~/common/formatters';
15 import { getProcessStatusColor } from '~/store/processes/process';
16
17 export type CssRules = 'label' | 'value' | 'title' | 'content' | 'action' | 'options' | 'status' | 'rightSideHeader' | 'titleHeader' | 'header';
18
19 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
20     label: {
21         fontSize: '0.875rem',
22     },
23     value: {
24         textTransform: 'none',
25         fontSize: '0.875rem',
26     },
27     title: {
28         overflow: 'hidden'
29     },
30     content: {
31         paddingTop: theme.spacing.unit * 0.5,
32         '&:last-child': {
33             paddingBottom: 0
34         }
35     },
36     action: {
37         marginTop: 0
38     },
39     options: {
40         width: theme.spacing.unit * 4,
41         height: theme.spacing.unit * 4,
42         color: theme.palette.common.white,
43     },
44     status: {
45         paddingTop: theme.spacing.unit * 0.5,
46         color: theme.palette.common.white,
47     },
48     rightSideHeader: {
49         display: 'flex'
50     },
51     titleHeader: {
52         color: theme.palette.common.white,
53         fontWeight: 600
54     },
55     header: {
56         paddingTop: 0,
57         paddingBottom: 0,
58     },
59 });
60
61 export interface SubprocessItemProps {
62     title: string;
63     status: string;
64     runtime?: string;
65 }
66
67 export interface ProcessSubprocessesCardDataProps {
68     onContextMenu: (event: React.MouseEvent<HTMLElement>) => void;
69     subprocess: Process;
70 }
71
72 type ProcessSubprocessesCardProps = ProcessSubprocessesCardDataProps & WithStyles<CssRules>;
73
74 export const ProcessSubprocessesCard = withStyles(styles, { withTheme: true })(
75     ({ classes, onContextMenu, subprocess, theme }: ProcessSubprocessesCardProps) => {
76         return <Card>
77             <CardHeader
78                 className={classes.header}
79                 style={{ backgroundColor: getProcessStatusColor(getProcessStatus(subprocess), theme as ArvadosTheme) }}
80                 classes={{ content: classes.title, action: classes.action }}
81                 action={
82                     <div className={classes.rightSideHeader}>
83                         <Typography noWrap variant="body2" className={classes.status}>
84                             {getProcessStatus(subprocess)}
85                         </Typography>
86                         <IconButton
87                             className={classes.options}
88                             aria-label="More options"
89                             onClick={onContextMenu}>
90                             <Tooltip title="More options">
91                                 <MoreOptionsIcon />
92                             </Tooltip>
93                         </IconButton>
94                     </div>
95                 }
96                 title={
97                     <Tooltip title={subprocess.containerRequest.name}>
98                         <Typography noWrap variant="body2" className={classes.titleHeader}>
99                             {subprocess.containerRequest.name}
100                         </Typography>
101                     </Tooltip>
102                 } />
103             <CardContent className={classes.content}>
104                 <DetailsAttribute classLabel={classes.label} classValue={classes.value}
105                     label="Runtime" value={formatTime(getProcessRuntime(subprocess))} />
106             </CardContent>
107         </Card>;
108     });