Skip to content

Commit 5490f68

Browse files
aivkov123Alexandr Ivkov
andauthored
fix(gallery): stop propagation on handled keys (#1696)
Prevents arrow/Home/End/Enter/Space/Escape keystrokes inside the gallery grid from bubbling to EndUserApp's HotkeyLayer, which was hijacking focus to the file browser. Co-authored-by: Alexandr Ivkov <aivkov@box.com>
1 parent d14a0e6 commit 5490f68

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

src/lib/viewers/gallery/GalleryGrid.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -270,29 +270,34 @@ export default function GalleryGrid({
270270
// Listbox is 1-D — arrows move ±1; row-aware nav comes with v2 grid role.
271271
case 'ArrowUp':
272272
case 'ArrowLeft':
273+
event.preventDefault();
274+
event.stopPropagation();
273275
if (focusedPage > 1) {
274-
event.preventDefault();
275276
focusTile(focusedPage - 1);
276277
}
277278
return;
278279
case 'ArrowDown':
279280
case 'ArrowRight':
281+
event.preventDefault();
282+
event.stopPropagation();
280283
if (focusedPage < pageCount) {
281-
event.preventDefault();
282284
focusTile(focusedPage + 1);
283285
}
284286
return;
285287
case 'Home':
286288
event.preventDefault();
289+
event.stopPropagation();
287290
focusTile(1);
288291
return;
289292
case 'End':
290293
event.preventDefault();
294+
event.stopPropagation();
291295
focusTile(pageCount);
292296
return;
293297
case 'Enter':
294298
case 'Space':
295299
event.preventDefault();
300+
event.stopPropagation();
296301
onPageNavigate(focusedPage);
297302
break;
298303
default:

src/lib/viewers/gallery/__tests__/GalleryGrid-test.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,28 @@ describe('GalleryGrid', () => {
189189
await userEvent.keyboard(' ');
190190
expect(onPageNavigate).toHaveBeenCalledWith(3);
191191
});
192+
193+
test.each([
194+
'{ArrowUp}',
195+
'{ArrowDown}',
196+
'{ArrowLeft}',
197+
'{ArrowRight}',
198+
'{Home}',
199+
'{End}',
200+
'{Enter}',
201+
' ',
202+
'{Escape}',
203+
])('should stop propagation on %s so parent handlers do not fire', async keyString => {
204+
const parentHandler = jest.fn();
205+
document.addEventListener('keydown', parentHandler);
206+
getWrapper();
207+
screen.getByLabelText('Page 3').focus();
208+
209+
await userEvent.keyboard(keyString);
210+
211+
expect(parentHandler).not.toHaveBeenCalled();
212+
document.removeEventListener('keydown', parentHandler);
213+
});
192214
});
193215

194216
describe('focus management', () => {

0 commit comments

Comments
 (0)