Merge branch '19069-workflow-launching' into 19143-project-list-workflows
authorPeter Amstutz <peter.amstutz@curii.com>
Mon, 23 May 2022 15:15:44 +0000 (11:15 -0400)
committerPeter Amstutz <peter.amstutz@curii.com>
Mon, 23 May 2022 15:15:44 +0000 (11:15 -0400)
Arvados-DCO-1.1-Signed-off-by: Peter Amstutz <peter.amstutz@curii.com>

13 files changed:
cypress/integration/side-panel.spec.js
src/models/collection.ts
src/routes/route-change-handlers.ts
src/store/navigation/navigation-action.ts
src/store/resource-type-filters/resource-type-filters.test.ts
src/store/resource-type-filters/resource-type-filters.ts
src/store/run-process-panel/run-process-panel-actions.test.ts
src/store/run-process-panel/run-process-panel-actions.ts
src/store/side-panel-tree/side-panel-tree-actions.ts
src/store/workbench/workbench-actions.ts
src/views-components/side-panel-tree/side-panel-tree.tsx
src/views/run-process-panel/run-process-second-step.tsx
src/views/workflow-panel/workflow-description-card.tsx

index fc2052cc13afb11311512589185c9ac60f5eed45..e187d533ead19b2b43e9ed01aae24215f84c4955 100644 (file)
@@ -62,7 +62,6 @@ describe('Side panel tests', function() {
             {url: '/shared-with-me', label: 'Shared with me'},
             {url: '/public-favorites', label: 'Public Favorites'},
             {url: '/favorites', label: 'My Favorites'},
-            // {url: '/workflows', label: 'Workflows'},
             {url: '/all_processes', label: 'All Processes'},
             {url: '/trash', label: 'Trash'},
         ].map(function(section) {
index 9a5d2ee2d86d6e34ef71c77af3fab222b3538d9c..defaca769a2544de5b6108a493ff745aee5a76ce 100644 (file)
@@ -70,4 +70,5 @@ export enum CollectionType {
     GENERAL = 'nil',
     OUTPUT = 'output',
     LOG = 'log',
+    INTERMEDIATE = 'intermediate',
 }
index 5b3ce6687ff0e4cb8b3e17a97d286898dda90946..237b6d9611bd3d5c9b3f8ff994c92a9dc075e5b5 100644 (file)
@@ -33,7 +33,6 @@ const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => {
     const runProcessMatch = Routes.matchRunProcessRoute(pathname);
     const virtualMachineUserMatch = Routes.matchUserVirtualMachineRoute(pathname);
     const virtualMachineAdminMatch = Routes.matchAdminVirtualMachineRoute(pathname);
-    const workflowMatch = Routes.matchWorkflowRoute(pathname);
     const sshKeysUserMatch = Routes.matchSshKeysUserRoute(pathname);
     const sshKeysAdminMatch = Routes.matchSshKeysAdminRoute(pathname);
     const siteManagerMatch = Routes.matchSiteManagerRoute(pathname);
@@ -77,8 +76,6 @@ const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => {
         store.dispatch(WorkbenchActions.loadSharedWithMe);
     } else if (runProcessMatch) {
         store.dispatch(WorkbenchActions.loadRunProcess);
-    } else if (workflowMatch) {
-        store.dispatch(WorkbenchActions.loadWorkflow);
     } else if (searchResultsMatch) {
         store.dispatch(WorkbenchActions.loadSearchResults);
     } else if (virtualMachineUserMatch) {
index 973ba25a36645b7b0d00178239d72c95d085efde..c8811bf43955a92ad493ddc6e2acc28e8846b1b3 100644 (file)
@@ -62,9 +62,6 @@ export const navigateTo = (uuid: string) =>
             case SidePanelTreeCategory.SHARED_WITH_ME:
                 dispatch(navigateToSharedWithMe);
                 return;
-            case SidePanelTreeCategory.WORKFLOWS:
-                dispatch(navigateToWorkflows);
-                return;
             case SidePanelTreeCategory.TRASH:
                 dispatch(navigateToTrash);
                 return;
index 698515bde55f8fc945baa5ce3d9e40bddd22f623..a3684507b3bbd3a8db79dcd02fe97e7b9756bbb2 100644 (file)
@@ -47,6 +47,7 @@ describe("serializeResourceTypeFilters", () => {
             deselectNode(ObjectTypeFilter.PROCESS),
             deselectNode(CollectionTypeFilter.GENERAL_COLLECTION),
             deselectNode(CollectionTypeFilter.LOG_COLLECTION),
+            deselectNode(CollectionTypeFilter.INTERMEDIATE_COLLECTION),
         )();
 
         const serializedFilters = serializeResourceTypeFilters(filters);
@@ -54,6 +55,20 @@ describe("serializeResourceTypeFilters", () => {
             .toEqual(`["uuid","is_a",["${ResourceKind.PROJECT}","${ResourceKind.COLLECTION}"]],["collections.properties.type","in",["output"]]`);
     });
 
+    it("should serialize intermediate collections and projects", () => {
+        const filters = pipe(
+            () => getInitialResourceTypeFilters(),
+            deselectNode(ObjectTypeFilter.PROCESS),
+            deselectNode(CollectionTypeFilter.GENERAL_COLLECTION),
+            deselectNode(CollectionTypeFilter.LOG_COLLECTION),
+            deselectNode(CollectionTypeFilter.OUTPUT_COLLECTION),
+        )();
+
+        const serializedFilters = serializeResourceTypeFilters(filters);
+        expect(serializedFilters)
+            .toEqual(`["uuid","is_a",["${ResourceKind.PROJECT}","${ResourceKind.COLLECTION}"]],["collections.properties.type","in",["intermediate"]]`);
+    });
+
     it("should serialize general and log collections", () => {
         const filters = pipe(
             () => getInitialResourceTypeFilters(),
index b1c52e4f72b8e10cd765ec0bd9d927d73ba3192a..64a391ca9e5419ac7c3e9c79e4e4a04606304c93 100644 (file)
@@ -39,6 +39,7 @@ export enum CollectionTypeFilter {
     GENERAL_COLLECTION = 'General',
     OUTPUT_COLLECTION = 'Output',
     LOG_COLLECTION = 'Log',
+    INTERMEDIATE_COLLECTION = 'Intermediate',
 }
 
 export enum ProcessTypeFilter {
@@ -84,6 +85,7 @@ export const getInitialResourceTypeFilters = pipe(
         initFilter(ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.GENERAL_COLLECTION, ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.OUTPUT_COLLECTION, ObjectTypeFilter.COLLECTION),
+        initFilter(CollectionTypeFilter.INTERMEDIATE_COLLECTION, ObjectTypeFilter.COLLECTION),
         initFilter(CollectionTypeFilter.LOG_COLLECTION, ObjectTypeFilter.COLLECTION),
     ),
     initFilter(ObjectTypeFilter.WORKFLOW)
@@ -115,6 +117,7 @@ export const getTrashPanelTypeFilters = pipe(
     initFilter(ObjectTypeFilter.COLLECTION),
     initFilter(CollectionTypeFilter.GENERAL_COLLECTION, ObjectTypeFilter.COLLECTION),
     initFilter(CollectionTypeFilter.OUTPUT_COLLECTION, ObjectTypeFilter.COLLECTION),
+    initFilter(CollectionTypeFilter.INTERMEDIATE_COLLECTION, ObjectTypeFilter.COLLECTION),
     initFilter(CollectionTypeFilter.LOG_COLLECTION, ObjectTypeFilter.COLLECTION),
 );
 
@@ -173,6 +176,10 @@ const collectionTypeToPropertyValue = (type: CollectionTypeFilter) => {
             return CollectionType.OUTPUT;
         case CollectionTypeFilter.LOG_COLLECTION:
             return CollectionType.LOG;
+        case CollectionTypeFilter.INTERMEDIATE_COLLECTION:
+            return CollectionType.INTERMEDIATE;
+        default:
+            return CollectionType.GENERAL;
     }
 };
 
index 3137583e35dd89c34810a0d1b514db623e68cd1f..c615f2162d0de02e1c35ce6b708edf116d85c1b1 100644 (file)
@@ -66,8 +66,8 @@ describe("run-process-panel-actions", () => {
                         email: "test@gmail.com",
                         firstName: "TestFirstName",
                         lastName: "TestLastName",
-                        uuid: "ce8i5-tpzed-yid70bw31f51234",
-                        ownerUuid: "ce8i5-tpzed-000000000000000",
+                        uuid: "zzzzz-tpzed-yid70bw31f51234",
+                        ownerUuid: "zzzzz-tpzed-000000000000000",
                         isAdmin: false,
                         isActive: true,
                         username: "testfirstname",
@@ -77,17 +77,17 @@ describe("run-process-panel-actions", () => {
                     },
                 },
                 runProcessPanel: {
-                    processPathname: "/projects/ce8i5-tpzed-yid70bw31f51234",
-                    processOwnerUuid: "ce8i5-tpzed-yid70bw31f51234",
+                    processPathname: "/projects/zzzzz-tpzed-yid70bw31f51234",
+                    processOwnerUuid: "zzzzz-tpzed-yid70bw31f51234",
                     selectedWorkflow: {
-                        href: "/workflows/ce8i5-7fd4e-2tlnerdkxnl4fjt",
+                        href: "/workflows/zzzzz-7fd4e-2tlnerdkxnl4fjt",
                         kind: "arvados#workflow",
                         etag: "8gh5xlhlgo61yqscyl1spw8tc",
-                        uuid: "ce8i5-7fd4e-2tlnerdkxnl4fjt",
-                        ownerUuid: "ce8i5-tpzed-o4njwilpp4ov321",
+                        uuid: "zzzzz-7fd4e-2tlnerdkxnl4fjt",
+                        ownerUuid: "zzzzz-tpzed-o4njwilpp4ov321",
                         createdAt: "2020-07-15T19:40:50.296041000Z",
-                        modifiedByClientUuid: "ce8i5-ozdt8-libnr89sc5nq111",
-                        modifiedByUserUuid: "ce8i5-tpzed-o4njwilpp4ov321",
+                        modifiedByClientUuid: "zzzzz-ozdt8-libnr89sc5nq111",
+                        modifiedByUserUuid: "zzzzz-tpzed-o4njwilpp4ov321",
                         modifiedAt: "2020-07-15T19:40:50.296376000Z",
                         name: "revsort.cwl",
                         description:
@@ -107,7 +107,7 @@ describe("run-process-panel-actions", () => {
                     "arvados-cwl-runner",
                     "--api=containers",
                     "--local",
-                    "--project-uuid=ce8i5-tpzed-yid70bw31f51234",
+                    "--project-uuid=zzzzz-tpzed-yid70bw31f51234",
                     "/var/lib/cwl/workflow.json#main",
                     "/var/lib/cwl/cwl.input.json",
                 ],
@@ -118,11 +118,11 @@ describe("run-process-panel-actions", () => {
                 name: "basicFormTestName",
                 outputName: "Output from basicFormTestName",
                 outputPath: "/var/spool/cwl",
-                ownerUuid: "ce8i5-tpzed-yid70bw31f51234",
+                ownerUuid: "zzzzz-tpzed-yid70bw31f51234",
                 priority: 1,
                 properties: {
                     workflowName: "revsort.cwl",
-                    template_uuid: "ce8i5-7fd4e-2tlnerdkxnl4fjt",
+                    template_uuid: "zzzzz-7fd4e-2tlnerdkxnl4fjt",
                 },
                 runtimeConstraints: {
                     API: true,
index 61597bb776a760e4cf499d0226944428e4b56f95..f3352eb484a78db2db00352c3e634ac94e76c10a 100644 (file)
@@ -48,7 +48,7 @@ export type RunProcessPanelAction = UnionOf<typeof runProcessPanelActions>;
 export const loadRunProcessPanel = () =>
     async (dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
         try {
-            dispatch(setBreadcrumbs([{ label: 'Run Process' }]));
+            dispatch(setBreadcrumbs([{ label: 'Run workflow' }]));
             const response = await services.workflowService.list();
             dispatch(runProcessPanelActions.SET_WORKFLOWS(response.items));
         } catch (e) {
index 58f7d82d956546644532767679547e39023d87c5..dd56b42870d2486a5d887caee3f54a3b134eb447 100644 (file)
@@ -23,7 +23,6 @@ export enum SidePanelTreeCategory {
     PROJECTS = 'Projects',
     SHARED_WITH_ME = 'Shared with me',
     PUBLIC_FAVORITES = 'Public Favorites',
-    WORKFLOWS = 'Workflows',
     FAVORITES = 'My Favorites',
     TRASH = 'Trash',
     ALL_PROCESSES = 'All Processes',
@@ -52,7 +51,6 @@ let SIDE_PANEL_CATEGORIES: string[] = [
     SidePanelTreeCategory.SHARED_WITH_ME,
     SidePanelTreeCategory.PUBLIC_FAVORITES,
     SidePanelTreeCategory.FAVORITES,
-    //    SidePanelTreeCategory.WORKFLOWS,
     SidePanelTreeCategory.GROUPS,
     SidePanelTreeCategory.ALL_PROCESSES,
     SidePanelTreeCategory.TRASH
index ba405cb8f2938f9ce190b32eaed81ec8276aa76a..d2ff84b3acd447f347d067e730305fd9d0910b0e 100644 (file)
@@ -58,7 +58,7 @@ import {
     sharedWithMePanelActions
 } from 'store/shared-with-me-panel/shared-with-me-panel-actions';
 import { CopyFormDialogData } from 'store/copy-dialog/copy-dialog';
-import { loadWorkflowPanel, workflowPanelActions } from 'store/workflow-panel/workflow-panel-actions';
+import { workflowPanelActions } from 'store/workflow-panel/workflow-panel-actions';
 import { loadSshKeysPanel } from 'store/auth/auth-action-ssh';
 import { loadLinkAccountPanel, linkAccountPanelActions } from 'store/link-account-panel/link-account-panel-actions';
 import { loadSiteManagerPanel } from 'store/auth/auth-action-session';
@@ -457,12 +457,6 @@ export const loadRunProcess = handleFirstTimeLoad(
     }
 );
 
-export const loadWorkflow = handleFirstTimeLoad(async (dispatch: Dispatch<any>) => {
-    dispatch(activateSidePanelTreeItem(SidePanelTreeCategory.WORKFLOWS));
-    await dispatch(loadWorkflowPanel());
-    dispatch(setSidePanelBreadcrumbs(SidePanelTreeCategory.WORKFLOWS));
-});
-
 export const loadPublicFavorites = () =>
     handleFirstTimeLoad(
         (dispatch: Dispatch) => {
index e829483473636a08e79179807d131b1275181263..7f5b8d738797ed9a4247ccf523510ce0b648eab2 100644 (file)
@@ -10,7 +10,6 @@ import { TreeItem } from "components/tree/tree";
 import { ProjectResource } from "models/project";
 import { ListItemTextIcon } from "components/list-item-text-icon/list-item-text-icon";
 import { ProcessIcon, ProjectIcon, FilterGroupIcon, FavoriteIcon, ProjectsIcon, ShareMeIcon, TrashIcon, PublicFavoriteIcon, GroupsIcon } from 'components/icon/icon';
-import { WorkflowIcon } from 'components/icon/icon';
 import { activateSidePanelTreeItem, toggleSidePanelTreeItemCollapse, SIDE_PANEL_TREE, SidePanelTreeCategory } from 'store/side-panel-tree/side-panel-tree-actions';
 import { openSidePanelContextMenu } from 'store/context-menu/context-menu-actions';
 import { noop } from 'lodash';
@@ -42,7 +41,7 @@ const mapDispatchToProps = (dispatch: Dispatch, props: SidePanelTreeProps): Side
 export const SidePanelTree = connect(undefined, mapDispatchToProps)(
     (props: SidePanelTreeActionProps) =>
         <span data-cy="side-panel-tree">
-        <TreePicker {...props} render={renderSidePanelItem} pickerId={SIDE_PANEL_TREE} />
+            <TreePicker {...props} render={renderSidePanelItem} pickerId={SIDE_PANEL_TREE} />
         </span>);
 
 const renderSidePanelItem = (item: TreeItem<ProjectResource>) => {
@@ -76,8 +75,6 @@ const getSidePanelIcon = (category: string) => {
             return ShareMeIcon;
         case SidePanelTreeCategory.TRASH:
             return TrashIcon;
-        case SidePanelTreeCategory.WORKFLOWS:
-            return WorkflowIcon;
         case SidePanelTreeCategory.PUBLIC_FAVORITES:
             return PublicFavoriteIcon;
         case SidePanelTreeCategory.ALL_PROCESSES:
index ca30ce5fe2b8129f6cea1d704ed7e58ae1689720..2f41dedb8232dcae9184c1d386b78ea97fd26772 100644 (file)
@@ -13,7 +13,6 @@ import { isValid } from 'redux-form';
 import { RUN_PROCESS_INPUTS_FORM } from './run-process-inputs-form';
 import { RunProcessAdvancedForm, RUN_PROCESS_ADVANCED_FORM } from './run-process-advanced-form';
 import { createStructuredSelector } from 'reselect';
-import { WorkflowPresetSelect } from 'views/run-process-panel/workflow-preset-select';
 import { selectPreset } from 'store/run-process-panel/run-process-panel-actions';
 
 export interface RunProcessSecondStepFormDataProps {
@@ -58,14 +57,6 @@ export const RunProcessSecondStepForm = connect(mapStateToProps, { onPresetChang
     ({ inputs, workflow, selectedPreset, presets, onPresetChange, valid, goBack, runProcess }: RunProcessSecondStepFormProps) =>
         <Grid container spacing={16} data-cy="new-process-panel">
             <Grid item xs={12}>
-                {/* <Grid container spacing={32}>
-                    <Grid item xs={12} md={6}>
-                    {workflow && selectedPreset && presets &&
-                    < WorkflowPresetSelect
-                    {...{ workflow, selectedPreset, presets, onChange: onPresetChange }} />
-                    }
-                    </Grid>
-                    </Grid> */}
                 <RunProcessBasicForm />
                 <RunProcessInputsForm inputs={inputs} />
                 <RunProcessAdvancedForm />
@@ -75,7 +66,7 @@ export const RunProcessSecondStepForm = connect(mapStateToProps, { onPresetChang
                     Back
                 </Button>
                 <Button disabled={!valid} variant="contained" color="primary" onClick={runProcess}>
-                    Run Process
+                    Run workflow
                 </Button>
             </Grid>
         </Grid>);
index e93caea4debc6bfd6961b37ee2b8062dfb62ba65..f25a8e648c6f0e1e221ef120445d22c6dc7078b4 100644 (file)
@@ -20,9 +20,11 @@ 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 { parseWorkflowDefinition, getWorkflowInputs, getInputLabel, stringifyInputType } from 'models/workflow';
-// import { WorkflowGraph } from "views/workflow-panel/workflow-graph";
-
 import { WorkflowDetailsCardDataProps, WorkflowDetailsAttributes } from 'views-components/details-panel/workflow-details';
+import { WorkflowResource, parseWorkflowDefinition, getWorkflowInputs, getInputLabel, stringifyInputType } from 'models/workflow';
+import { DetailsAttribute } from 'components/details-attribute/details-attribute';
+import { ResourceOwnerWithName } from 'views-components/data-explorer/renderers';
+import { formatDate } from "common/formatters";
 
 export type CssRules = 'root' | 'tab' | 'inputTab' | 'graphTab' | 'graphTabWithChosenWorkflow' | 'descriptionTab' | 'inputsTable';
 
@@ -76,7 +78,6 @@ export const WorkflowDetailsCard = withStyles(styles)(
                     <Tab className={classes.tab} label="Description" />
                     <Tab className={classes.tab} label="Inputs" />
                     <Tab className={classes.tab} label="Details" />
-                    {/* <Tab className={classes.tab} label="Graph" /> */}
                 </Tabs>
                 {value === 0 && <CardContent className={classes.descriptionTab}>
                     {workflow ? <div>
@@ -95,14 +96,6 @@ export const WorkflowDetailsCard = withStyles(styles)(
                             messages={['Please select a workflow to see its inputs.']} />
                     }
                 </CardContent>}
-                {/* {value === 2 && <CardContent className={workflow ? classes.graphTabWithChosenWorkflow : classes.graphTab}>
-                    {workflow
-                    ? <WorkflowGraph workflow={workflow} />
-                    : <DataTableDefaultView
-                    icon={WorkflowIcon}
-                    messages={['Please select a workflow to see its visualisation.']} />
-                    }
-                    </CardContent>} */}
                 {value === 2 && <CardContent className={classes.descriptionTab}>
                     {workflow
                         ? <WorkflowDetailsAttributes workflow={workflow} />