[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