[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