--- /dev/null
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+import React from 'react';
+import { DataExplorer } from "views-components/data-explorer/data-explorer";
+import { WorkflowIcon } from 'components/icon/icon';
+import { WORKFLOW_PANEL_ID } from 'store/workflow-panel/workflow-panel-actions';
+import {
+ ResourceLastModifiedDate,
+ ResourceWorkflowName,
+ ResourceWorkflowStatus,
+ ResourceShare,
+ ResourceRunProcess
+} from "views-components/data-explorer/renderers";
+import { SortDirection } from 'components/data-table/data-column';
+import { DataColumns } from 'components/data-table/data-table';
+import { DataTableFilterItem } from 'components/data-table-filters/data-table-filters';
+import { Grid, Paper } from '@material-ui/core';
+import { WorkflowDetailsCard } from './workflow-description-card';
+import { WorkflowResource } from 'models/workflow';
+import { createTree } from 'models/tree';
+
+export enum WorkflowPanelColumnNames {
+ NAME = "Name",
+ AUTHORISATION = "Authorisation",
+ LAST_MODIFIED = "Last modified",
+ SHARE = 'Share'
+}
+
+export interface WorkflowPanelFilter extends DataTableFilterItem {
+ type: ResourceStatus;
+}
+
+export interface WorkflowPanelDataProps {
+ workflow?: WorkflowResource;
+}
+
+export interface WorfklowPanelActionProps {
+ handleRowDoubleClick: (workflowUuid: string) => void;
+ handleRowClick: (workflowUuid: string) => void;
+}
+
+export type WorkflowPanelProps = WorkflowPanelDataProps & WorfklowPanelActionProps;
+
+export enum ResourceStatus {
+ PUBLIC = "Public",
+ PRIVATE = "Private",
+ SHARED = "Shared"
+}
+
+// TODO: restore filters
+// const resourceStatus = (type: string) => {
+// switch (type) {
+// case ResourceStatus.PUBLIC:
+// return "Public";
+// case ResourceStatus.PRIVATE:
+// return "Private";
+// case ResourceStatus.SHARED:
+// return "Shared";
+// default:
+// return "Unknown";
+// }
+// };
+
+export const workflowPanelColumns: DataColumns<string, WorkflowResource> = [
+ {
+ name: WorkflowPanelColumnNames.NAME,
+ selected: true,
+ configurable: true,
+ sort: {direction: SortDirection.ASC, field: "name"},
+ filters: createTree(),
+ render: (uuid: string) => <ResourceWorkflowName uuid={uuid} />
+ },
+ {
+ name: WorkflowPanelColumnNames.AUTHORISATION,
+ selected: true,
+ configurable: true,
+ filters: createTree(),
+ // TODO: restore filters
+ // filters: [
+ // {
+ // name: resourceStatus(ResourceStatus.PUBLIC),
+ // selected: true,
+ // type: ResourceStatus.PUBLIC
+ // },
+ // {
+ // name: resourceStatus(ResourceStatus.PRIVATE),
+ // selected: true,
+ // type: ResourceStatus.PRIVATE
+ // },
+ // {
+ // name: resourceStatus(ResourceStatus.SHARED),
+ // selected: true,
+ // type: ResourceStatus.SHARED
+ // }
+ // ],
+ render: (uuid: string) => <ResourceWorkflowStatus uuid={uuid} />,
+ },
+ {
+ name: WorkflowPanelColumnNames.LAST_MODIFIED,
+ selected: true,
+ configurable: true,
+ sort: {direction: SortDirection.NONE, field: "modifiedAt"},
+ filters: createTree(),
+ render: (uuid: string) => <ResourceLastModifiedDate uuid={uuid} />
+ },
+ {
+ name: '',
+ selected: true,
+ configurable: false,
+ filters: createTree(),
+ render: (uuid: string) => <ResourceShare uuid={uuid} />
+ },
+ {
+ name: '',
+ selected: true,
+ configurable: false,
+ filters: createTree(),
+ render: (uuid: string) => <ResourceRunProcess uuid={uuid} />
+ }
+];
+
+export const WorkflowPanelView = (props: WorkflowPanelProps) => {
+ return <Grid container spacing={16} style={{ minHeight: '500px' }}>
+ <Grid item xs={6}>
+ <DataExplorer
+ id={WORKFLOW_PANEL_ID}
+ onRowClick={props.handleRowClick}
+ onRowDoubleClick={props.handleRowDoubleClick}
+ contextMenuColumn={false}
+ onContextMenu={e => e}
+ defaultViewIcon={WorkflowIcon}
+ defaultViewMessages={['Workflow list is empty.']} />
+ </Grid>
+ <Grid item xs={6}>
+ <Paper style={{ height: '100%' }}>
+ <WorkflowDetailsCard workflow={props.workflow} />
+ </Paper>
+ </Grid>
+ </Grid>;
+};