1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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';
19 ResourceLastModifiedDate,
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';
28 export enum WorkflowPanelColumnNames {
30 AUTHORISATION = "Authorisation",
31 LAST_MODIFIED = "Last modified",
34 interface WorkflowPanelDataProps {
35 resources: ResourcesState;
38 export enum ResourceStatus {
44 const resourceStatus = (type: string) => {
46 case ResourceStatus.PUBLIC:
48 case ResourceStatus.PRIVATE:
50 case ResourceStatus.SHARED:
57 export const workflowPanelColumns: DataColumns<string, DataTableFilterItem> = [
59 name: WorkflowPanelColumnNames.NAME,
62 sortDirection: SortDirection.ASC,
64 render: (uuid: string) => <ResourceName uuid={uuid} />
67 name: WorkflowPanelColumnNames.AUTHORISATION,
70 sortDirection: SortDirection.NONE,
73 name: resourceStatus(ResourceStatus.PUBLIC),
77 name: resourceStatus(ResourceStatus.PRIVATE),
81 name: resourceStatus(ResourceStatus.SHARED),
85 render: (uuid: string) => <ResourceName uuid={uuid} />,
88 name: WorkflowPanelColumnNames.LAST_MODIFIED,
91 sortDirection: SortDirection.NONE,
93 render: (uuid: string) => <ResourceLastModifiedDate uuid={uuid} />
97 type WorkflowPanelProps = WorkflowPanelDataProps & DispatchProp;
99 export const WorkflowPanel = connect((state: RootState) => ({
100 resources: state.resources
102 class extends React.Component<WorkflowPanelProps> {
104 return <Grid container>
105 <Grid item xs={6} style={{ paddingRight: '24px', display: 'grid' }}>
107 id={WORKFLOW_PANEL_ID}
108 onRowClick={this.handleRowClick}
109 onRowDoubleClick={this.handleRowDoubleClick}
110 onContextMenu={this.handleContextMenu}
111 contextMenuColumn={false}
112 dataTableDefaultView={<DataTableDefaultView icon={WorkflowIcon} />} />
115 <WorkflowDescriptionCard />
120 handleContextMenu = (event: React.MouseEvent<HTMLElement>, resourceUuid: string) => {
121 const resource = getResource<GroupResource>(resourceUuid)(this.props.resources);
123 this.props.dispatch<any>(openContextMenu(event, {
126 ownerUuid: resource.ownerUuid,
127 isTrashed: resource.isTrashed,
129 menuKind: ContextMenuKind.PROJECT,
134 handleRowDoubleClick = (uuid: string) => {
135 this.props.dispatch<any>(navigateTo(uuid));
138 handleRowClick = (uuid: string) => {
139 this.props.dispatch(loadDetailsPanel(uuid));