diff --git a/src/components/TestDetailsModal.tsx b/src/components/TestDetailsModal.tsx index 8631ab59..c6dced5b 100644 --- a/src/components/TestDetailsModal.tsx +++ b/src/components/TestDetailsModal.tsx @@ -25,7 +25,7 @@ import { TestStatus } from "../types/testStatus"; import { useHistory, Prompt } from "react-router-dom"; import { IgnoreArea } from "../types/ignoreArea"; import { KonvaEventObject } from "konva/types/Node"; -import { Close, Add, Delete, Save, WarningRounded } from "@material-ui/icons"; +import { Close, Add, Delete, Save, WarningRounded, LayersClear } from "@material-ui/icons"; import { TestRunDetails } from "./TestRunDetails"; import useImage from "use-image"; import { routes } from "../constants"; @@ -330,7 +330,7 @@ const TestDetailsModal: React.FunctionComponent<{ selectedRectId && deleteIgnoreArea(selectedRectId) } @@ -338,6 +338,18 @@ const TestDetailsModal: React.FunctionComponent<{ + + + + setIgnoreAreas([]) + } + > + + + + = ( props: BaseComponentProps @@ -14,9 +15,12 @@ export const BulkOperation: React.FunctionComponent = ( const [approveDialogOpen, setApproveDialogOpen] = React.useState(false); const [rejectDialogOpen, setRejectDialogOpen] = React.useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false); + const [clearIgnoreDialogOpen, setClearIgnoreDialogOpen] = React.useState(false); + const [isProcessing, setIsProcessing] = React.useState(false); - const rows: Record = props.state.selection; - const count = Object.keys(rows).length; + const allRows: InternalRowsState = props.state.rows; + const selectedRows: Record = props.state.selection; + const count = Object.keys(selectedRows).length; const toggleApproveDialogOpen = () => { setApproveDialogOpen(!approveDialogOpen); @@ -27,21 +31,30 @@ export const BulkOperation: React.FunctionComponent = ( const toggleDeleteDialogOpen = () => { setDeleteDialogOpen(!deleteDialogOpen); }; + const toggleClearIgnoreDialogOpen = () => { + setClearIgnoreDialogOpen(!clearIgnoreDialogOpen); + }; const getTitle = () => { + if (clearIgnoreDialogOpen) { + return "Clear Ignore Area For Selected Items"; + } return submitButtonText() + " Test Runs"; }; const submitButtonText = (): string => { - if (deleteDialogOpen) { - return "Delete"; - } if (approveDialogOpen) { return "Approve"; } if (rejectDialogOpen) { return "Reject"; } + if (deleteDialogOpen) { + return "Delete"; + } + if (clearIgnoreDialogOpen) { + return "Clear"; + } return ""; }; @@ -55,6 +68,9 @@ export const BulkOperation: React.FunctionComponent = ( if (rejectDialogOpen) { return toggleRejectDialogOpen(); } + if (clearIgnoreDialogOpen) { + return toggleClearIgnoreDialogOpen(); + } }; const isRowEligibleForApproveOrReject = (id: string) => { @@ -72,6 +88,9 @@ export const BulkOperation: React.FunctionComponent = ( if (isRowEligibleForApproveOrReject(id)) { processApproveReject(id); } + if (clearIgnoreDialogOpen) { + testRunService.setIgnoreAreas(id, []); + } }; const processApproveReject = (id: string) => { @@ -90,6 +109,9 @@ export const BulkOperation: React.FunctionComponent = ( if (approveDialogOpen) { return toggleApproveDialogOpen(); } + if (clearIgnoreDialogOpen) { + return toggleClearIgnoreDialogOpen(); + } return toggleRejectDialogOpen(); }; @@ -116,27 +138,37 @@ export const BulkOperation: React.FunctionComponent = ( + + + + + + + {`Are you sure you want to ${submitButtonText().toLowerCase()} ${count} items?`} + + {`Are you sure you want to ${submitButtonText().toLowerCase()} ${count} items?`} + } onSubmit={() => { - enqueueSnackbar( - "Wait for the confirmation message until operation is completed.", - { - variant: "info", - } - ); - + setIsProcessing(true); Promise.all( - Object.keys(rows).map((id: string) => processAction(id)) + Object.keys(selectedRows).map((id: string) => processAction(id)) ) .then(() => { + setIsProcessing(false); enqueueSnackbar(`${count} test runs processed.`, { variant: "success", }); @@ -149,6 +181,7 @@ export const BulkOperation: React.FunctionComponent = ( closeModal(); }} /> + { isProcessing && } ); };