Skip to content

Commit ba17ccd

Browse files
authored
fix: prevent event bubbling on cancel button click (#922)
1 parent 83b5a31 commit ba17ccd

File tree

2 files changed

+51
-3
lines changed

2 files changed

+51
-3
lines changed

packages/autocomplete-js/src/__tests__/detached.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,50 @@ describe('detached', () => {
8585
expect(document.body).not.toHaveClass('aa-Detached');
8686
});
8787
});
88+
89+
test('closes after cancel', async () => {
90+
const container = document.createElement('div');
91+
document.body.appendChild(container);
92+
autocomplete<{ label: string }>({
93+
id: 'autocomplete',
94+
detachedMediaQuery: '',
95+
container,
96+
});
97+
98+
const searchButton = container.querySelector<HTMLButtonElement>(
99+
'.aa-DetachedSearchButton'
100+
);
101+
102+
// Open detached overlay
103+
searchButton.click();
104+
105+
await waitFor(() => {
106+
expect(document.querySelector('.aa-DetachedOverlay')).toBeInTheDocument();
107+
expect(document.body).toHaveClass('aa-Detached');
108+
});
109+
110+
const cancelButton = document.querySelector<HTMLButtonElement>(
111+
'.aa-DetachedCancelButton'
112+
);
113+
114+
const bodyClickListener = jest.fn();
115+
document.querySelector('body').addEventListener('click', bodyClickListener);
116+
117+
// Close detached overlay
118+
cancelButton.click();
119+
120+
expect(bodyClickListener).toHaveBeenCalledTimes(0);
121+
122+
document
123+
.querySelector('body')
124+
.removeEventListener('click', bodyClickListener);
125+
126+
// The detached overlay should close
127+
await waitFor(() => {
128+
expect(
129+
document.querySelector('.aa-DetachedOverlay')
130+
).not.toBeInTheDocument();
131+
expect(document.body).not.toHaveClass('aa-Detached');
132+
});
133+
});
88134
});

packages/autocomplete-js/src/createAutocompleteDom.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,17 +158,19 @@ export function createAutocompleteDom<TItem extends BaseItem>({
158158
textContent: placeholder,
159159
});
160160
const detachedSearchButton = createDomElement('button', {
161+
type: 'button',
161162
class: classNames.detachedSearchButton,
162-
onClick(event: MouseEvent) {
163-
event.preventDefault();
163+
onClick() {
164164
setIsModalOpen(true);
165165
},
166166
children: [detachedSearchButtonIcon, detachedSearchButtonPlaceholder],
167167
});
168168
const detachedCancelButton = createDomElement('button', {
169+
type: 'button',
169170
class: classNames.detachedCancelButton,
170171
textContent: translations.detachedCancelButtonText,
171-
onClick() {
172+
onClick(event: MouseEvent) {
173+
event.stopPropagation();
172174
autocomplete.setIsOpen(false);
173175
setIsModalOpen(false);
174176
},

0 commit comments

Comments
 (0)