diff --git a/packages/autocomplete-js/src/__tests__/detached.test.ts b/packages/autocomplete-js/src/__tests__/detached.test.ts index 835f56b3a..430e61dc8 100644 --- a/packages/autocomplete-js/src/__tests__/detached.test.ts +++ b/packages/autocomplete-js/src/__tests__/detached.test.ts @@ -85,4 +85,50 @@ describe('detached', () => { expect(document.body).not.toHaveClass('aa-Detached'); }); }); + + test('closes after cancel', async () => { + const container = document.createElement('div'); + document.body.appendChild(container); + autocomplete<{ label: string }>({ + id: 'autocomplete', + detachedMediaQuery: '', + container, + }); + + const searchButton = container.querySelector( + '.aa-DetachedSearchButton' + ); + + // Open detached overlay + searchButton.click(); + + await waitFor(() => { + expect(document.querySelector('.aa-DetachedOverlay')).toBeInTheDocument(); + expect(document.body).toHaveClass('aa-Detached'); + }); + + const cancelButton = document.querySelector( + '.aa-DetachedCancelButton' + ); + + const bodyClickListener = jest.fn(); + document.querySelector('body').addEventListener('click', bodyClickListener); + + // Close detached overlay + cancelButton.click(); + + expect(bodyClickListener).toHaveBeenCalledTimes(0); + + document + .querySelector('body') + .removeEventListener('click', bodyClickListener); + + // The detached overlay should close + await waitFor(() => { + expect( + document.querySelector('.aa-DetachedOverlay') + ).not.toBeInTheDocument(); + expect(document.body).not.toHaveClass('aa-Detached'); + }); + }); }); diff --git a/packages/autocomplete-js/src/createAutocompleteDom.ts b/packages/autocomplete-js/src/createAutocompleteDom.ts index 0d7a04139..aae8dc7bd 100644 --- a/packages/autocomplete-js/src/createAutocompleteDom.ts +++ b/packages/autocomplete-js/src/createAutocompleteDom.ts @@ -158,17 +158,19 @@ export function createAutocompleteDom({ textContent: placeholder, }); const detachedSearchButton = createDomElement('button', { + type: 'button', class: classNames.detachedSearchButton, - onClick(event: MouseEvent) { - event.preventDefault(); + onClick() { setIsModalOpen(true); }, children: [detachedSearchButtonIcon, detachedSearchButtonPlaceholder], }); const detachedCancelButton = createDomElement('button', { + type: 'button', class: classNames.detachedCancelButton, textContent: translations.detachedCancelButtonText, - onClick() { + onClick(event: MouseEvent) { + event.stopPropagation(); autocomplete.setIsOpen(false); setIsModalOpen(false); },