Skip to content

Commit 9c8a100

Browse files
committed
fix(ui): doc drawer leave without saving modal
DocumentDrawer also closes via the side "overlay" button and by pressing the Esc key - extend change from #14324 to trigger the leave without saving modal when closing via keyboard Esc key or via the `close-drawer` button.
1 parent 24b9e13 commit 9c8a100

2 files changed

Lines changed: 44 additions & 3 deletions

File tree

  • packages/ui/src/elements/DocumentDrawer/DrawerHeader
  • test/admin/e2e/document-view

packages/ui/src/elements/DocumentDrawer/DrawerHeader/index.tsx

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { useCallback } from 'react'
3+
import { useCallback, useEffect } from 'react'
44

55
import { Gutter } from '../../../elements/Gutter/index.js'
66
import { useModal } from '../../../elements/Modal/index.js'
@@ -22,7 +22,7 @@ export const DocumentDrawerHeader: React.FC<{
2222
drawerSlug: string
2323
showDocumentID?: boolean
2424
}> = ({ AfterHeader, drawerSlug, showDocumentID = true }) => {
25-
const { closeModal, openModal } = useModal()
25+
const { closeModal, isModalOpen, openModal } = useModal()
2626
const { t } = useTranslation()
2727
const isModified = useFormModified()
2828

@@ -34,6 +34,38 @@ export const DocumentDrawerHeader: React.FC<{
3434
}
3535
}, [isModified, openModal, closeModal, drawerSlug])
3636

37+
useEffect(() => {
38+
if (!isModified) {
39+
return
40+
}
41+
42+
const drawerCloseButton = document.getElementById(`close-drawer__${drawerSlug}`)
43+
44+
const handleDrawerCloseClick = (event: MouseEvent) => {
45+
if (isModalOpen(leaveWithoutSavingModalSlug)) return
46+
47+
event.preventDefault()
48+
event.stopPropagation()
49+
handleOnClose()
50+
}
51+
52+
const handleKeyDown = (event: KeyboardEvent) => {
53+
if (event.key !== 'Escape' || !isModalOpen(leaveWithoutSavingModalSlug)) return
54+
55+
event.preventDefault()
56+
event.stopPropagation()
57+
handleOnClose()
58+
}
59+
60+
drawerCloseButton?.addEventListener('click', handleDrawerCloseClick)
61+
document.addEventListener('keydown', handleKeyDown)
62+
63+
return () => {
64+
drawerCloseButton?.removeEventListener('click', handleDrawerCloseClick)
65+
document.removeEventListener('keydown', handleKeyDown)
66+
}
67+
}, [drawerSlug, handleOnClose, isModalOpen, isModified])
68+
3769
return (
3870
<Gutter className={`${documentDrawerBaseClass}__header`}>
3971
<div className={`${documentDrawerBaseClass}__header-content`}>

test/admin/e2e/document-view/e2e.spec.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,16 @@ describe('Document View', () => {
911911
await expect(leaveModal).toBeVisible()
912912
await leaveModal.locator('#confirm-cancel').click()
913913
await expect(editModal).toBeVisible()
914-
await closeButton.click()
914+
915+
const gutterCloseButton = page.locator('.drawer--is-open > .drawer__close')
916+
await gutterCloseButton.click()
917+
await expect(leaveModal).toBeVisible()
918+
await leaveModal.locator('#confirm-cancel').click()
919+
await expect(editModal).toBeVisible()
920+
921+
await page.keyboard.press('Escape')
922+
await expect(leaveModal).toBeVisible()
923+
915924
await leaveModal.locator('#confirm-action').click()
916925
await expect(editModal).toBeHidden()
917926
})

0 commit comments

Comments
 (0)