[arvados] updated: 2.7.0-6294-g5bf73506d2

git repository hosting git at public.arvados.org
Tue May 14 15:07:07 UTC 2024


Summary of changes:
 services/workbench2/cypress/e2e/workflow.cy.js     | 18 +++++++++++
 .../data-table-multiselect-popover.tsx             |  4 ++-
 .../src/components/data-table/data-table.tsx       |  2 +-
 .../store/workflow-panel/workflow-panel-actions.ts | 36 +++++++++++++++++++++-
 .../workflow-remove-dialog.tsx                     |  5 ++-
 5 files changed, 59 insertions(+), 6 deletions(-)

       via  5bf73506d2630a957f16573cfc33bd2bbb09e6ad (commit)
      from  caf20343bd8d7a9b065e1708dcd4e946224847ed (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 5bf73506d2630a957f16573cfc33bd2bbb09e6ad
Author: Lisa Knox <lisaknox83 at gmail.com>
Date:   Tue May 14 11:07:02 2024 -0400

    21535: added multi wf delete test Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox at curii.com>

diff --git a/services/workbench2/cypress/e2e/workflow.cy.js b/services/workbench2/cypress/e2e/workflow.cy.js
index c6c49ee343..9e3c5eac56 100644
--- a/services/workbench2/cypress/e2e/workflow.cy.js
+++ b/services/workbench2/cypress/e2e/workflow.cy.js
@@ -246,6 +246,24 @@ describe('Registered workflow panel tests', function() {
             });
     });
 
+    it('can delete multiple workflows', function() {
+        cy.createResource(activeUser.token, "workflows", {workflow: {name: "Test wf1"}})
+        cy.createResource(activeUser.token, "workflows", {workflow: {name: "Test wf2"}})
+        cy.createResource(activeUser.token, "workflows", {workflow: {name: "Test wf3"}})
+        
+        cy.loginAs(activeUser);
+        cy.get('[data-cy=data-table-multiselect-popover]').click();
+        cy.get('[data-cy=multiselect-popover-All]').click();
+
+        cy.get('[data-cy=multiselect-button]').should('have.length', '1').trigger('mouseover');
+        cy.get('body').contains('Delete Workflow').should('exist')
+        cy.get('[data-cy=multiselect-button]').eq(0).click();
+        
+        cy.get('[data-cy=confirmation-dialog-ok-btn]').should('exist').click();
+
+        cy.get('[data-cy=data-table-row]').should('not.exist');
+    });
+
     it('cannot delete readonly workflow', function() {
         cy.createProject({
             owningUser: adminUser,
diff --git a/services/workbench2/src/components/data-table-multiselect-popover/data-table-multiselect-popover.tsx b/services/workbench2/src/components/data-table-multiselect-popover/data-table-multiselect-popover.tsx
index 0248c8267d..ced5c89983 100644
--- a/services/workbench2/src/components/data-table-multiselect-popover/data-table-multiselect-popover.tsx
+++ b/services/workbench2/src/components/data-table-multiselect-popover/data-table-multiselect-popover.tsx
@@ -84,7 +84,8 @@ export const DataTableMultiselectPopover = withStyles(styles)(
                 <>
                     <Tooltip
                         disableFocusListener
-                        title="Select Options"
+                        title="Select options"
+                        data-cy="data-table-multiselect-popover"
                     >
                         <ButtonBase
                             className={classnames(classes.root)}
@@ -118,6 +119,7 @@ export const DataTableMultiselectPopover = withStyles(styles)(
                                 {options.length &&
                                     options.map((option, i) => (
                                         <div
+                                            data-cy={`multiselect-popover-${option.name}`}
                                             key={i}
                                             className={classes.option}
                                             onClick={() => {
diff --git a/services/workbench2/src/components/data-table/data-table.tsx b/services/workbench2/src/components/data-table/data-table.tsx
index 7b78799457..89a2e2a8e6 100644
--- a/services/workbench2/src/components/data-table/data-table.tsx
+++ b/services/workbench2/src/components/data-table/data-table.tsx
@@ -354,7 +354,7 @@ export const DataTable = withStyles(styles)(
                     key={key || index}
                     className={classes.checkBoxCell}>
                     <div className={classes.checkBoxHead}>
-                        <Tooltip title={this.state.isSelected ? "Deselect All" : "Select All"}>
+                        <Tooltip title={this.state.isSelected ? "Deselect all" : "Select all"}>
                             <input
                                 type="checkbox"
                                 className={classes.checkBox}
diff --git a/services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts b/services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts
index 5079c01dd0..5821d9a05d 100644
--- a/services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts
+++ b/services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts
@@ -26,6 +26,10 @@ import { UserResource } from 'models/user';
 import { getWorkflowInputs, parseWorkflowDefinition } from 'models/workflow';
 import { ContextMenuResource } from 'store/context-menu/context-menu-actions'; 
 import { dialogActions } from 'store/dialog/dialog-actions';
+import { ResourceKind, Resource } from 'models/resource';
+import { selectedToArray } from "components/multiselect-toolbar/MultiselectToolbar";
+import { CommonResourceServiceError, getCommonResourceServiceError } from "services/common-service/common-resource-service";
+import { projectPanelActions } from "store/project-panel/project-panel-action-bind";
 
 export const WORKFLOW_PANEL_ID = "workflowPanel";
 const UUID_PREFIX_PROPERTY_NAME = 'uuidPrefix';
@@ -152,4 +156,34 @@ export const openRemoveWorkflowDialog =
     );
 };
 
-export const REMOVE_WORKFLOW_DIALOG = "removeWorkflowDialog";
\ No newline at end of file
+export const REMOVE_WORKFLOW_DIALOG = "removeWorkflowDialog";
+
+export const removeWorkflowPermanently = (uuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => {
+    const resource = getState().dialog.removeWorkflowDialog.data.resource;
+    const checkedList = getState().multiselect.checkedList;
+
+    const uuidsToRemove: string[] = resource.fromContextMenu ? [resource.uuid] : selectedToArray(checkedList);
+
+    //if no items in checkedlist, default to normal context menu behavior
+    if (!uuidsToRemove.length) uuidsToRemove.push(uuid);
+
+    const workflowsToRemove = uuidsToRemove
+        .map(uuid => getResource(uuid)(getState().resources) as Resource)
+        .filter(resource => resource.kind === ResourceKind.WORKFLOW);
+
+    for (const workflow of workflowsToRemove) {
+        try {
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removing ...", kind: SnackbarKind.INFO }));
+            await services.workflowService.delete(workflow.uuid);
+            dispatch(projectPanelActions.REQUEST_ITEMS());
+            dispatch(snackbarActions.OPEN_SNACKBAR({ message: "Removed.", hideDuration: 2000, kind: SnackbarKind.SUCCESS }));
+        } catch (e) {
+            const error = getCommonResourceServiceError(e);
+            if (error === CommonResourceServiceError.PERMISSION_ERROR_FORBIDDEN) {
+                dispatch(snackbarActions.OPEN_SNACKBAR({ message: `Access denied`, hideDuration: 2000, kind: SnackbarKind.ERROR }));
+            } else {
+                dispatch(snackbarActions.OPEN_SNACKBAR({ message: `Deletion failed`, hideDuration: 2000, kind: SnackbarKind.ERROR }));
+            }
+        }
+    }
+};
\ No newline at end of file
diff --git a/services/workbench2/src/views-components/workflow-remove-dialog/workflow-remove-dialog.tsx b/services/workbench2/src/views-components/workflow-remove-dialog/workflow-remove-dialog.tsx
index 7eb2f5e9e0..d3f4874370 100644
--- a/services/workbench2/src/views-components/workflow-remove-dialog/workflow-remove-dialog.tsx
+++ b/services/workbench2/src/views-components/workflow-remove-dialog/workflow-remove-dialog.tsx
@@ -6,13 +6,12 @@ import { Dispatch, compose } from 'redux';
 import { connect } from "react-redux";
 import { ConfirmationDialog } from "components/confirmation-dialog/confirmation-dialog";
 import { withDialog, WithDialogProps } from "store/dialog/with-dialog";
-import { REMOVE_WORKFLOW_DIALOG } from 'store/workflow-panel/workflow-panel-actions';
-import { deleteWorkflow } from 'store/workflow-panel/workflow-panel-actions';
+import { removeWorkflowPermanently, REMOVE_WORKFLOW_DIALOG } from 'store/workflow-panel/workflow-panel-actions';
 
 const mapDispatchToProps = (dispatch: Dispatch, props: WithDialogProps<any>) => ({
     onConfirm: () => {
         props.closeDialog();
-        dispatch<any>(deleteWorkflow(props.data.uuid));
+        dispatch<any>(removeWorkflowPermanently(props.data.uuid));
     }
 });
 

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list