Skip to content

Commit 0d63f5e

Browse files
authored
PLU-372: [UI-Prevamp] add delete step confirmation (#824)
## Problem No confirmation before deleting a step from a pipe... ## Solution Reuse the `AlertDialog` and add it to the delete icon ## Tests - [x] Can delete step with the modal - [x] Can cancel the deleting of step
1 parent 7e0773a commit 0d63f5e

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

packages/frontend/src/components/FlowStep/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ export default function FlowStep(
182182

183183
const isDeletable =
184184
displayOverrides?.disableDelete === true ? false : !isTrigger && !readOnly
185-
const [deleteStep] = useMutation(DELETE_STEP, {
185+
const [deleteStep, { loading: isDeletingStep }] = useMutation(DELETE_STEP, {
186186
refetchQueries: [GET_FLOW],
187187
})
188188
const onDelete = useCallback<MouseEventHandler>(
@@ -254,6 +254,7 @@ export default function FlowStep(
254254
}
255255
isCompleted={step.status === 'completed'}
256256
onDelete={isDeletable ? onDelete : undefined}
257+
isDeleting={isDeletable ? isDeletingStep : undefined}
257258
onOpen={onOpen}
258259
onClose={onClose}
259260
collapsed={collapsed ?? false}

packages/frontend/src/components/FlowStepHeader/index.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
type MouseEventHandler,
44
type ReactNode,
55
useCallback,
6+
useRef,
67
useState,
78
} from 'react'
89
import {
@@ -30,6 +31,8 @@ import { IconButton } from '@opengovsg/design-system-react'
3031

3132
import DemoVideoModalContent from '@/components/FlowRow/DemoVideoModalContent'
3233

34+
import MenuAlertDialog from '../MenuAlertDialog'
35+
3336
// Chakra's `Collapse` sets `overflow: hidden` by default, which causes dropdown
3437
// menu items to be hidden. We override overflow by making `Collapse` a Chakra
3538
// element.
@@ -41,6 +44,7 @@ interface FlowStepHeaderProps {
4144
hintAboveCaption: string
4245
isCompleted?: boolean
4346
onDelete?: MouseEventHandler
47+
isDeleting?: boolean
4448
onOpen: () => void
4549
onClose: () => void
4650
collapsed: boolean
@@ -61,6 +65,7 @@ export default function FlowStepHeader(
6165
hintAboveCaption,
6266
isCompleted,
6367
onDelete,
68+
isDeleting,
6469
onOpen,
6570
onClose,
6671
collapsed,
@@ -79,6 +84,13 @@ export default function FlowStepHeader(
7984
}
8085
}, [collapsed, onOpen, onClose])
8186

87+
const cancelRef = useRef<HTMLButtonElement>(null)
88+
const {
89+
isOpen: isDialogOpen,
90+
onOpen: onDialogOpen,
91+
onClose: onDialogClose,
92+
} = useDisclosure()
93+
8294
// for loading demo modal
8395
const {
8496
isOpen: isModalOpen,
@@ -231,7 +243,10 @@ export default function FlowStepHeader(
231243
{onDelete && (
232244
<Flex ml="auto">
233245
<IconButton
234-
onClick={onDelete}
246+
onClick={(event) => {
247+
onDialogOpen()
248+
event.stopPropagation()
249+
}}
235250
variant="clear"
236251
aria-label="Delete Step"
237252
icon={<BiTrashAlt />}
@@ -262,6 +277,18 @@ export default function FlowStepHeader(
262277
</ModalContent>
263278
</Modal>
264279
)}
280+
281+
{onDelete && isDeleting !== undefined && (
282+
<MenuAlertDialog
283+
isDialogOpen={isDialogOpen}
284+
cancelRef={cancelRef}
285+
onDialogClose={onDialogClose}
286+
dialogHeader="Step"
287+
dialogType="delete"
288+
onClick={onDelete}
289+
isLoading={isDeleting}
290+
/>
291+
)}
265292
</>
266293
)
267294
}

packages/frontend/src/components/MenuAlertDialog/index.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { type MouseEventHandler } from 'react'
12
import {
23
AlertDialog,
34
AlertDialogBody,
@@ -9,15 +10,15 @@ import {
910
import { Button } from '@opengovsg/design-system-react'
1011

1112
export type AlertDialogType = 'delete' | 'duplicate'
12-
export type AlertHeaderType = 'Connection' | 'Pipe' | 'Tile'
13+
export type AlertHeaderType = 'Connection' | 'Pipe' | 'Tile' | 'Step'
1314

1415
interface MenuAlertDialogProps {
1516
isDialogOpen: boolean
1617
cancelRef: React.RefObject<HTMLButtonElement>
1718
onDialogClose: () => void
1819
dialogType: AlertDialogType
1920
dialogHeader: AlertHeaderType
20-
onClick: () => void
21+
onClick: (() => void) | MouseEventHandler
2122
isLoading: boolean
2223
}
2324

0 commit comments

Comments
 (0)