15012: Adds run time column to all_processes. Fixes created_at column's label.
[arvados-workbench2.git] / src / views / all-processes-panel / all-processes-panel.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 { StyleRulesCallback, WithStyles, withStyles } from '@material-ui/core';
7 import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
8 import { connect, DispatchProp } from 'react-redux';
9 import { DataColumns } from '~/components/data-table/data-table';
10 import { RouteComponentProps } from 'react-router';
11 import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
12 import { SortDirection } from '~/components/data-table/data-column';
13 import { ResourceKind } from '~/models/resource';
14 import { ArvadosTheme } from '~/common/custom-theme';
15 import { ALL_PROCESSES_PANEL_ID } from '~/store/all-processes-panel/all-processes-panel-action';
16 import {
17     ProcessStatus,
18     ResourceName,
19     ResourceOwner,
20     ResourceType,
21     ContainerRunTime,
22     ResourceCreatedAtDate
23 } from '~/views-components/data-explorer/renderers';
24 import { ProcessIcon } from '~/components/icon/icon';
25 import { openContextMenu, resourceKindToContextMenuKind } from '~/store/context-menu/context-menu-actions';
26 import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
27 import { navigateTo } from '~/store/navigation/navigation-action';
28 import { ContainerRequestState } from "~/models/container-request";
29 import { RootState } from '~/store/store';
30 import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
31 import { createTree } from '~/models/tree';
32 import { getInitialProcessStatusFilters, getInitialProcessTypeFilters } from '~/store/resource-type-filters/resource-type-filters';
33
34 type CssRules = "toolbar" | "button";
35
36 const styles: StyleRulesCallback<CssRules> = (theme: ArvadosTheme) => ({
37     toolbar: {
38         paddingBottom: theme.spacing.unit * 3,
39         textAlign: "right"
40     },
41     button: {
42         marginLeft: theme.spacing.unit
43     },
44 });
45
46 export enum AllProcessesPanelColumnNames {
47     NAME = "Name",
48     STATUS = "Status",
49     TYPE = "Type",
50     OWNER = "Owner",
51     CREATED_AT = "Created at",
52     RUNTIME = "Run Time"
53 }
54
55 export interface AllProcessesPanelFilter extends DataTableFilterItem {
56     type: ResourceKind | ContainerRequestState;
57 }
58
59 export const allProcessesPanelColumns: DataColumns<string> = [
60     {
61         name: AllProcessesPanelColumnNames.NAME,
62         selected: true,
63         configurable: true,
64         sortDirection: SortDirection.NONE,
65         filters: createTree(),
66         render: uuid => <ResourceName uuid={uuid} />
67     },
68     {
69         name: AllProcessesPanelColumnNames.STATUS,
70         selected: true,
71         configurable: true,
72         mutuallyExclusiveFilters: true,
73         filters: getInitialProcessStatusFilters(),
74         render: uuid => <ProcessStatus uuid={uuid} />
75     },
76     {
77         name: AllProcessesPanelColumnNames.TYPE,
78         selected: true,
79         configurable: true,
80         filters: getInitialProcessTypeFilters(),
81         render: uuid => <ResourceType uuid={uuid} />
82     },
83     {
84         name: AllProcessesPanelColumnNames.OWNER,
85         selected: true,
86         configurable: true,
87         filters: createTree(),
88         render: uuid => <ResourceOwner uuid={uuid} />
89     },
90     {
91         name: AllProcessesPanelColumnNames.CREATED_AT,
92         selected: true,
93         configurable: true,
94         sortDirection: SortDirection.DESC,
95         filters: createTree(),
96         render: uuid => <ResourceCreatedAtDate uuid={uuid} />
97     },
98     {
99         name: AllProcessesPanelColumnNames.RUNTIME,
100         selected: true,
101         configurable: true,
102         filters: createTree(),
103         render: uuid => <ContainerRunTime uuid={uuid} />
104     }
105 ];
106
107 interface AllProcessesPanelDataProps {
108     isAdmin: boolean;
109 }
110
111 interface AllProcessesPanelActionProps {
112     onItemClick: (item: string) => void;
113     onDialogOpen: (ownerUuid: string) => void;
114     onItemDoubleClick: (item: string) => void;
115 }
116 const mapStateToProps = (state : RootState): AllProcessesPanelDataProps => ({
117     isAdmin: state.auth.user!.isAdmin
118 });
119
120 type AllProcessesPanelProps = AllProcessesPanelDataProps & AllProcessesPanelActionProps & DispatchProp
121     & WithStyles<CssRules> & RouteComponentProps<{ id: string }>;
122
123 export const AllProcessesPanel = withStyles(styles)(
124     connect(mapStateToProps)(
125         class extends React.Component<AllProcessesPanelProps> {
126             handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
127                 const menuKind = resourceKindToContextMenuKind(resourceUuid, this.props.isAdmin);
128                 if (menuKind) {
129                     this.props.dispatch<any>(openContextMenu(event, {
130                         name: '',
131                         uuid: resourceUuid,
132                         ownerUuid: '',
133                         kind: ResourceKind.NONE,
134                         menuKind
135                     }));
136                 }
137                 this.props.dispatch<any>(loadDetailsPanel(resourceUuid));
138             }
139
140             handleRowDoubleClick = (uuid: string) => {
141                 this.props.dispatch<any>(navigateTo(uuid));
142             }
143
144             handleRowClick = (uuid: string) => {
145                 this.props.dispatch(loadDetailsPanel(uuid));
146             }
147
148             render() {
149                 return <DataExplorer
150                     id={ALL_PROCESSES_PANEL_ID}
151                     onRowClick={this.handleRowClick}
152                     onRowDoubleClick={this.handleRowDoubleClick}
153                     onContextMenu={this.handleContextMenu}
154                     contextMenuColumn={true}
155                     dataTableDefaultView={
156                         <DataTableDefaultView
157                             icon={ProcessIcon}
158                             messages={['Processes list empty.']}
159                             />
160                     } />;
161             }
162         }
163     )
164 );