[ARVADOS-WORKBENCH2] updated: 1.2.0-483-g952aa1c
Git user
git at public.curoverse.com
Thu Sep 27 19:29:26 EDT 2018
Summary of changes:
package.json | 5 +-
src/components/data-explorer/data-explorer.tsx | 7 +-
.../rich-text-editor-link.tsx | 43 +++++++
src/components/text-field/text-field.tsx | 28 +++++
src/index.tsx | 3 +-
src/models/workflow.ts | 99 +++++++++++++++-
src/routes/route-change-handlers.ts | 8 +-
src/routes/routes.ts | 4 +
src/store/navigation/navigation-action.ts | 4 +
src/store/projects/project-update-actions.ts | 6 +-
.../rich-text-editor-dialog-actions.tsx | 10 ++
.../shared-with-me-middleware-service.ts | 1 -
.../side-panel-tree/side-panel-tree-actions.ts | 1 -
src/store/side-panel/side-panel-action.ts | 4 +-
src/store/store.ts | 6 +
src/store/workbench/workbench-actions.ts | 8 ++
.../workflow-middleware-service.ts} | 51 ++++-----
src/store/workflow-panel/workflow-panel-actions.ts | 37 ++++++
src/validators/validators.tsx | 1 -
.../current-token-dialog/current-token-dialog.tsx | 1 -
.../data-explorer/data-explorer.tsx | 2 +-
src/views-components/data-explorer/renderers.tsx | 71 +++++++++++-
.../details-panel/project-details.tsx | 11 +-
.../form-fields/project-form-fields.tsx | 7 +-
.../main-content-bar/main-content-bar.tsx | 43 ++++---
.../rich-text-editor-dialog.tsx | 38 ++++++
src/views/workbench/workbench.tsx | 4 +
.../workflow-panel/workflow-description-card.tsx | 74 ++++++++++++
src/views/workflow-panel/workflow-panel-view.tsx | 127 +++++++++++++++++++++
src/views/workflow-panel/workflow-panel.tsx | 28 +++++
typings/global.d.ts | 3 +-
yarn.lock | 105 +++++++++++++++--
32 files changed, 759 insertions(+), 81 deletions(-)
create mode 100644 src/components/rich-text-editor-link/rich-text-editor-link.tsx
create mode 100644 src/store/rich-text-editor-dialog/rich-text-editor-dialog-actions.tsx
copy src/store/{shared-with-me-panel/shared-with-me-middleware-service.ts => workflow-panel/workflow-middleware-service.ts} (53%)
create mode 100644 src/store/workflow-panel/workflow-panel-actions.ts
create mode 100644 src/views-components/rich-text-editor-dialog/rich-text-editor-dialog.tsx
create mode 100644 src/views/workflow-panel/workflow-description-card.tsx
create mode 100644 src/views/workflow-panel/workflow-panel-view.tsx
create mode 100644 src/views/workflow-panel/workflow-panel.tsx
via 952aa1c7170d4b24951f40ed66b5f19a53d11daf (commit)
via 0dd2c3296305cf0c4a57cfe398254f84b877a957 (commit)
via 46ee3699d427ea41fb375be552715a18b72fcb03 (commit)
via a9ba50241080a83734e8aea0f230cc3fc3f3b7ca (commit)
via b547851c52f8f735d0f9aaad3eea8f79033135fc (commit)
via 3367b1ff2a1d1050bb435f7bc8230c03435b2529 (commit)
via 4cddd6be7314d0ab3c387b5dcc909780a468410c (commit)
via 3db1d07b3ab6cdfea052688088f569a173d6dab2 (commit)
via fd9ad9a425f6aed71c18948cf29c0535292a14c6 (commit)
via c8efd8ea08a0830b334ffc6a3811807bf5a1d94a (commit)
via 6f479854450415418e524808ce07ac8a0bac56da (commit)
via f05ff87a5a04b0a6c45c2cba0b492c561de2e651 (commit)
via eb909803c6fe3c99894ac402a88ea7cbc114f66b (commit)
via d4aa5357707c184f7e450465befeb693379ec5a9 (commit)
via a37c2265b5f60351bc1f50c22e74650a79110319 (commit)
via fe815aabd15db10f2f9437db82104c4272bcb38e (commit)
via 20bb2125fddc247d8ff2df960b3d4d316e4a0d13 (commit)
via c04071992d624a6aec1185898e58ce848086684f (commit)
via 9ea087b587f8139416cea16fbe4caad0d6df90c4 (commit)
via 6acebd8c63b066f86aa81fce3b8937609778031f (commit)
via eda5e30d786d5d1224a552e962b6b711efab7369 (commit)
from b6958027ba915d64ab7d6e6c2ee4cae765324294 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit 952aa1c7170d4b24951f40ed66b5f19a53d11daf
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date: Fri Sep 28 01:29:10 2018 +0200
Add workflow definition parser
Feature #13863
Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
diff --git a/src/index.tsx b/src/index.tsx
index d64798b..2f8e73c 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -113,7 +113,6 @@ const initListener = (history: History, store: RootStore, services: ServiceRepos
initWebSocket(config, services.authService, store);
await store.dispatch(loadWorkbench());
addRouteChangeHandlers(history, store);
- // createSampleProcess(services);
}
};
};
diff --git a/src/models/workflow.ts b/src/models/workflow.ts
index d644b79..923a9cb 100644
--- a/src/models/workflow.ts
+++ b/src/models/workflow.ts
@@ -3,10 +3,107 @@
// SPDX-License-Identifier: AGPL-3.0
import { Resource, ResourceKind } from "./resource";
+import { safeLoad } from 'js-yaml';
export interface WorkflowResource extends Resource {
kind: ResourceKind.WORKFLOW;
name: string;
description: string;
definition: string;
-}
\ No newline at end of file
+}
+export interface WorkflowResoruceDefinition {
+ cwlVersion: string;
+ $graph: Array<Workflow | CommandLineTool>;
+}
+export interface Workflow {
+ class: 'Workflow';
+ doc?: string;
+ id?: string;
+ inputs: CommandInputParameter[];
+ outputs: any[];
+ steps: any[];
+}
+
+export interface CommandLineTool {
+ class: 'CommandLineTool';
+ id: string;
+ inputs: CommandInputParameter[];
+ outputs: any[];
+}
+
+export interface CommandInputParameter {
+ id: string;
+ label?: string;
+ doc?: string | string[];
+ default?: any;
+ type?: CWLType | CWLType[] | CommandInputEnumSchema | CommandInputArraySchema;
+}
+
+export enum CWLType {
+ NULL = 'null',
+ BOOLEAN = 'boolean',
+ INT = 'int',
+ LONG = 'long',
+ FLOAT = 'float',
+ DOUBLE = 'double',
+ STRING = 'string',
+ FILE = 'File',
+ DIRECTORY = 'Directory',
+}
+
+export interface CommandInputEnumSchema {
+ symbols: string[];
+ type: 'enum';
+ label?: string;
+ name?: string;
+}
+
+export interface CommandInputArraySchema {
+ items: CWLType;
+ type: 'array';
+ label?: string;
+}
+
+export interface File {
+ class: CWLType.FILE;
+ location?: string;
+ path?: string;
+ basename?: string;
+}
+
+export interface Directory {
+ class: CWLType.DIRECTORY;
+ location?: string;
+ path?: string;
+ basename?: string;
+}
+
+export const parseWorkflowDefinition = (workflow: WorkflowResource): WorkflowResoruceDefinition => {
+ const definition = safeLoad(workflow.definition);
+ return definition;
+};
+
+export const getWorkflowInputs = (workflowDefinition: WorkflowResoruceDefinition) => {
+ const mainWorkflow = workflowDefinition.$graph.find(item => item.class === 'Workflow' && item.id === '#main');
+ return mainWorkflow
+ ? mainWorkflow.inputs
+ : undefined;
+};
+
+export const stringifyInputType = ({ type }: CommandInputParameter) => {
+ if (typeof type === 'string') {
+ return type;
+ } else if (type instanceof Array) {
+ return type.join(' | ');
+ } else if (typeof type === 'object') {
+ if (type.type === 'enum') {
+ return 'enum';
+ } else if (type.type === 'array') {
+ return `${type.items}[]`;
+ } else {
+ return 'unknown';
+ }
+ } else {
+ return 'unknown';
+ }
+};
diff --git a/src/store/workflow-panel/workflow-panel-actions.ts b/src/store/workflow-panel/workflow-panel-actions.ts
index aa79347..ca72e5a 100644
--- a/src/store/workflow-panel/workflow-panel-actions.ts
+++ b/src/store/workflow-panel/workflow-panel-actions.ts
@@ -7,10 +7,13 @@ import { RootState } from '~/store/store';
import { ServiceRepository } from '~/services/services';
import { bindDataExplorerActions } from '~/store/data-explorer/data-explorer-action';
import { propertiesActions } from '~/store/properties/properties-actions';
+import { getResource } from '../resources/resources';
+import { getProperty } from '~/store/properties/properties';
+import { WorkflowResource } from '../../models/workflow';
export const WORKFLOW_PANEL_ID = "workflowPanel";
const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
-
+const WORKFLOW_PANEL_DETAILS_UUID = 'workflowPanelDetailsUuid';
export const workflowPanelActions = bindDataExplorerActions(WORKFLOW_PANEL_ID);
export const loadWorkflowPanel = () =>
@@ -21,6 +24,14 @@ export const loadWorkflowPanel = () =>
export const setUuidPrefix = (uuidPrefix: string) =>
propertiesActions.SET_PROPERTY({ key: UUID_PREFIX_PROPERTY_NAME, value: uuidPrefix });
-export const getUuidPrefix = (state: RootState) =>{
+export const getUuidPrefix = (state: RootState) => {
return state.properties.uuidPrefix;
-};
\ No newline at end of file
+};
+
+export const showWorkflowDetails = (uuid: string) =>
+ propertiesActions.SET_PROPERTY({ key: WORKFLOW_PANEL_DETAILS_UUID, value: uuid });
+
+export const getWorkflowDetails = (state: RootState) => {
+ const uuid = getProperty<string>(WORKFLOW_PANEL_DETAILS_UUID)(state.properties);
+ return uuid ? getResource<WorkflowResource>(uuid)(state.resources) : undefined;
+};
diff --git a/src/views/workflow-panel/workflow-description-card.tsx b/src/views/workflow-panel/workflow-description-card.tsx
index 60e17b6..57cf89f 100644
--- a/src/views/workflow-panel/workflow-description-card.tsx
+++ b/src/views/workflow-panel/workflow-description-card.tsx
@@ -7,7 +7,8 @@ import { StyleRulesCallback, WithStyles, withStyles, CardContent, Tab, Tabs, Pap
import { ArvadosTheme } from '~/common/custom-theme';
import { WorkflowIcon } from '~/components/icon/icon';
import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
-import { WorkflowResource } from '~/models/workflow';
+import { WorkflowResource, parseWorkflowDefinition, getWorkflowInputs, stringifyInputType } from '~/models/workflow';
+import { DetailsAttribute } from '~/components/details-attribute/details-attribute';
export type CssRules = 'root' | 'tab';
@@ -37,7 +38,7 @@ export const WorkflowDetailsCard = withStyles(styles)(
}
render() {
- const { classes } = this.props;
+ const { classes, workflow } = this.props;
const { value } = this.state;
return <Paper className={classes.root}>
<Tabs value={value} onChange={this.handleChange} centered={true}>
@@ -45,14 +46,29 @@ export const WorkflowDetailsCard = withStyles(styles)(
<Tab className={classes.tab} label="Inputs" />
</Tabs>
{value === 0 && <CardContent>
- Description
- <DataTableDefaultView
- icon={WorkflowIcon}
- messages={['Please select a workflow to see its description.']} />
+ {workflow
+ ? workflow.description
+ : <DataTableDefaultView
+ icon={WorkflowIcon}
+ messages={['Please select a workflow to see its description.']} />}
</CardContent>}
{value === 1 && <CardContent>
- Inputs
+ {workflow && this.inputs
+ ? this.inputs.map(input => <DetailsAttribute key={input.id} label={input.label || ''} value={stringifyInputType(input)} />)
+ : <DataTableDefaultView
+ icon={WorkflowIcon}
+ messages={['Please select a workflow to see its description.']} />}
</CardContent>}
</Paper>;
}
+
+ get inputs() {
+ if (this.props.workflow) {
+ const definition = parseWorkflowDefinition(this.props.workflow);
+ if (definition) {
+ return getWorkflowInputs(definition);
+ }
+ }
+ return;
+ }
});
\ No newline at end of file
diff --git a/src/views/workflow-panel/workflow-panel-view.tsx b/src/views/workflow-panel/workflow-panel-view.tsx
index 8a29cb7..c48f46a 100644
--- a/src/views/workflow-panel/workflow-panel-view.tsx
+++ b/src/views/workflow-panel/workflow-panel-view.tsx
@@ -6,7 +6,7 @@ import * as React from 'react';
import { DataExplorer } from "~/views-components/data-explorer/data-explorer";
import { WorkflowIcon } from '~/components/icon/icon';
import { DataTableDefaultView } from '~/components/data-table-default-view/data-table-default-view';
-import { WORKFLOW_PANEL_ID } from '~/store/workflow-panel/workflow-panel-actions';
+import { WORKFLOW_PANEL_ID, workflowPanelActions } from '~/store/workflow-panel/workflow-panel-actions';
import {
ResourceLastModifiedDate,
RosurceWorkflowName,
@@ -18,6 +18,7 @@ import { DataColumns } from '~/components/data-table/data-table';
import { DataTableFilterItem } from '~/components/data-table-filters/data-table-filters';
import { Grid } from '@material-ui/core';
import { WorkflowDetailsCard } from './workflow-description-card';
+import { WorkflowResource } from '../../models/workflow';
export enum WorkflowPanelColumnNames {
NAME = "Name",
@@ -30,11 +31,17 @@ export interface WorkflowPanelFilter extends DataTableFilterItem {
type: ResourceStatus;
}
-interface WorkflowPanelDataProps {
- handleRowDoubleClick: any;
- handleRowClick: any;
+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",
@@ -103,7 +110,7 @@ export const workflowPanelColumns: DataColumns<string, WorkflowPanelFilter> = [
}
];
-export const WorkflowPanelView = ({...props}) => {
+export const WorkflowPanelView = (props: WorkflowPanelProps) => {
return <Grid container spacing={16}>
<Grid item xs={6}>
<DataExplorer
@@ -114,7 +121,7 @@ export const WorkflowPanelView = ({...props}) => {
dataTableDefaultView={<DataTableDefaultView icon={WorkflowIcon} />} />
</Grid>
<Grid item xs={6}>
- <WorkflowDetailsCard />
+ <WorkflowDetailsCard workflow={props.workflow} />
</Grid>
</Grid>;
};
\ No newline at end of file
diff --git a/src/views/workflow-panel/workflow-panel.tsx b/src/views/workflow-panel/workflow-panel.tsx
index 279097d..0dbf918 100644
--- a/src/views/workflow-panel/workflow-panel.tsx
+++ b/src/views/workflow-panel/workflow-panel.tsx
@@ -2,23 +2,27 @@
//
// SPDX-License-Identifier: AGPL-3.0
-import * as React from "react";
import { Dispatch } from "redux";
import { connect } from "react-redux";
import { navigateTo } from '~/store/navigation/navigation-action';
-import { loadDetailsPanel } from '~/store/details-panel/details-panel-action';
import { WorkflowPanelView } from '~/views/workflow-panel/workflow-panel-view';
+import { WorfklowPanelActionProps, WorkflowPanelDataProps } from './workflow-panel-view';
+import { showWorkflowDetails, getWorkflowDetails } from '../../store/workflow-panel/workflow-panel-actions';
+import { RootState } from '~/store/store';
-const mapDispatchToProps = (dispatch: Dispatch) => ({
+const mapStateToProps = (state: RootState): WorkflowPanelDataProps => ({
+ workflow: getWorkflowDetails(state)
+});
+
+const mapDispatchToProps = (dispatch: Dispatch): WorfklowPanelActionProps => ({
handleRowDoubleClick: (uuid: string) => {
dispatch<any>(navigateTo(uuid));
},
-
+
handleRowClick: (uuid: string) => {
- dispatch(loadDetailsPanel(uuid));
+ dispatch(showWorkflowDetails(uuid));
}
});
-export const WorkflowPanel= connect(undefined, mapDispatchToProps)(
- (props) => <WorkflowPanelView {...props}/>);
\ No newline at end of file
+export const WorkflowPanel = connect(mapStateToProps, mapDispatchToProps)(WorkflowPanelView);
\ No newline at end of file
commit 0dd2c3296305cf0c4a57cfe398254f84b877a957
Merge: a9ba502 46ee369
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date: Thu Sep 27 22:24:23 2018 +0200
Merge branch '13857-workflow-view' of git.curoverse.com:arvados-workbench2 into 13863-workflow-inputs-processing
refs #13857
2
13863
Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
commit a9ba50241080a83734e8aea0f230cc3fc3f3b7ca
Merge: b695802 b547851
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date: Thu Sep 27 16:37:45 2018 +0200
Merge workflows view
Feature #13863
Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
diff --cc package.json
index a15f417,64ea1d1..1b196f1
--- a/package.json
+++ b/package.json
@@@ -13,11 -12,10 +13,11 @@@
"@types/shell-quote": "1.6.0",
"axios": "0.18.0",
"classnames": "2.2.6",
+ "js-yaml": "3.12.0",
"lodash": "4.17.10",
- "react": "16.4.2",
+ "react": "16.5.2",
"react-copy-to-clipboard": "5.0.1",
- "react-dom": "16.4.2",
+ "react-dom": "16.5.2",
"react-dropzone": "5.0.1",
"react-redux": "5.0.7",
"react-router": "4.3.1",
diff --cc src/index.tsx
index 542ce6c,d0154b6..d64798b
--- a/src/index.tsx
+++ b/src/index.tsx
@@@ -38,9 -38,8 +38,10 @@@ import { addRouteChangeHandlers } from
import { setCurrentTokenDialogApiHost } from '~/store/current-token-dialog/current-token-dialog-actions';
import { processResourceActionSet } from '~/views-components/context-menu/action-sets/process-resource-action-set';
import { progressIndicatorActions } from '~/store/progress-indicator/progress-indicator-actions';
+ import { setUuidPrefix } from '~/store/workflow-panel/workflow-panel-actions';
import { trashedCollectionActionSet } from '~/views-components/context-menu/action-sets/trashed-collection-action-set';
+import { ContainerRequestState } from '~/models/container-request';
+import { MountKind } from './models/mount-types';
const getBuildNumber = () => "BN-" + (process.env.REACT_APP_BUILD_NUMBER || "dev");
const getGitCommit = () => "GIT-" + (process.env.REACT_APP_GIT_COMMIT || "latest").substr(0, 7);
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list