workflow-view-middleware-service
[arvados-workbench2.git] / src / views / workflow-panel / workflow-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 { DataExplorer } from "~/views-components/data-explorer/data-explorer";
7 import { connect, DispatchProp } from 'react-redux';
8 import { RootState } from '~/store/store';
9 import { WorkflowIcon } from '~/components/icon/icon';
10 import { ResourcesState, getResource } from '~/store/resources/resources';
11 import { navigateTo } from "~/store/navigation/navigation-action";
12 import { loadDetailsPanel } from "~/store/details-panel/details-panel-action";
13 import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
14 import { WORKFLOW_PANEL_ID } from '~/store/workflow-panel/workflow-panel-actions';
15 import { openContextMenu } from '~/store/context-menu/context-menu-actions';
16 import { GroupResource } from '~/models/group';
17 import { ContextMenuKind } from '~/views-components/context-menu/context-menu';
18 import {
19     ResourceLastModifiedDate,
20     ResourceName,
21 } from "~/views-components/data-explorer/renderers";
22 import { SortDirection } from '~/components/data-table/data-column';
23 import { DataColumns } from '~/components/data-table/data-table';
24 import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
25 import { Grid } from '@material-ui/core';
26 import { WorkflowDescriptionCard } from './workflow-description-card';
27
28 export enum WorkflowPanelColumnNames {
29     NAME = "Name",
30     AUTHORISATION = "Authorisation",
31     LAST_MODIFIED = "Last modified",
32 }
33
34 interface WorkflowPanelDataProps {
35     resources: ResourcesState;
36 }
37
38 export enum ResourceStatus {
39     PUBLIC = 'public',
40     PRIVATE = 'private',
41     SHARED = 'shared'
42 }
43
44 const resourceStatus = (type: string) => {
45     switch (type) {
46         case ResourceStatus.PUBLIC:
47             return "Public";
48         case ResourceStatus.PRIVATE:
49             return "Private";
50         case ResourceStatus.SHARED:
51             return "Shared";
52         default:
53             return "Unknown";
54     }
55 };
56
57 export const workflowPanelColumns: DataColumns<string, DataTableFilterItem> = [
58     {
59         name: WorkflowPanelColumnNames.NAME,
60         selected: true,
61         configurable: true,
62         sortDirection: SortDirection.ASC,
63         filters: [],
64         render: (uuid: string) => <ResourceName uuid={uuid} />
65     },
66     {
67         name: WorkflowPanelColumnNames.AUTHORISATION,
68         selected: true,
69         configurable: true,
70         sortDirection: SortDirection.NONE,
71         filters: [
72             {
73                 name: resourceStatus(ResourceStatus.PUBLIC),
74                 selected: true,
75             },
76             {
77                 name: resourceStatus(ResourceStatus.PRIVATE),
78                 selected: true,
79             },
80             {
81                 name: resourceStatus(ResourceStatus.SHARED),
82                 selected: true,
83             }
84         ],
85         // do zmiany na ResourceAuthorisation
86         render: (uuid: string) => <ResourceName uuid={uuid} />,
87     },
88     {
89         name: WorkflowPanelColumnNames.LAST_MODIFIED,
90         selected: true,
91         configurable: true,
92         sortDirection: SortDirection.NONE,
93         filters: [],
94         render: (uuid: string) => <ResourceLastModifiedDate uuid={uuid} />
95     }
96 ];
97
98 type WorkflowPanelProps = WorkflowPanelDataProps & DispatchProp;
99
100 export const WorkflowPanel = connect((state: RootState) => ({
101     resources: state.resources
102 }))(
103     class extends React.Component<WorkflowPanelProps> {
104         render() {
105             return <Grid container spacing={16}>
106                 <Grid item xs={6}>
107                     <DataExplorer
108                         id={WORKFLOW_PANEL_ID}
109                         onRowClick={this.handleRowClick}
110                         onRowDoubleClick={this.handleRowDoubleClick}
111                         onContextMenu={this.handleContextMenu}
112                         contextMenuColumn={false}
113                         dataTableDefaultView={<DataTableDefaultView icon={WorkflowIcon} />} />
114                 </Grid>
115                 <Grid item xs={6}>
116                     <WorkflowDescriptionCard />
117                 </Grid>
118             </Grid>;
119         }
120
121         handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
122             const resource = getResource<GroupResource>(resourceUuid)(this.props.resources);
123             if (resource) {
124                 this.props.dispatch<any>(openContextMenu(event, {
125                     name: '',
126                     uuid: resource.uuid,
127                     ownerUuid: resource.ownerUuid,
128                     isTrashed: resource.isTrashed,
129                     kind: resource.kind,
130                     menuKind: ContextMenuKind.PROJECT,
131                 }));
132             }
133         }
134
135         handleRowDoubleClick = (uuid: string) => {
136             this.props.dispatch<any>(navigateTo(uuid));
137         }
138
139         handleRowClick = (uuid: string) => {
140             this.props.dispatch(loadDetailsPanel(uuid));
141         }
142     }
143 );