diff --git a/oxlint-suppressions.json b/oxlint-suppressions.json index c0b968118fccd1..143f88c0c464a5 100644 --- a/oxlint-suppressions.json +++ b/oxlint-suppressions.json @@ -202,14 +202,6 @@ "count": 4 } }, - "web/app/components/app-sidebar/dataset-info/menu-item.tsx": { - "jsx_a11y/click-events-have-key-events": { - "count": 1 - }, - "jsx_a11y/no-static-element-interactions": { - "count": 1 - } - }, "web/app/components/app/annotation/add-annotation-modal/edit-item/index.tsx": { "erasable-syntax-only/enums": { "count": 1 diff --git a/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx b/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx index 933e0dd76e036e..37d5d4ef9f314b 100644 --- a/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx +++ b/web/app/components/app-sidebar/dataset-info/__tests__/index.spec.tsx @@ -240,33 +240,47 @@ describe('MenuItem', () => { render() // Act - await user.click(screen.getByText('Edit')) + await user.click(screen.getByRole('button', { name: 'Edit' })) // Assert expect(handleClick).toHaveBeenCalledTimes(1) }) + it.each([ + ['Enter', '{Enter}'], + ['Space', ' '], + ])('should be reachable and activate with %s', async (_, key) => { + const user = userEvent.setup() + const handleClick = vi.fn() + render() + + await user.tab() + expect(screen.getByRole('button', { name: 'Edit' })).toHaveFocus() + + await user.keyboard(key) + expect(handleClick).toHaveBeenCalledTimes(1) + }) + it('should stop propagation before invoking the handler', () => { - const parentClick = vi.fn() const handleClick = vi.fn() + render() - render( -
- -
, - ) + const menuItem = screen.getByRole('button', { name: 'Edit' }) + const event = createEvent.click(menuItem) + const stopPropagation = vi.spyOn(event, 'stopPropagation') - fireEvent.click(screen.getByText('Edit')) + fireEvent(menuItem, event) expect(handleClick).toHaveBeenCalledTimes(1) - expect(parentClick).not.toHaveBeenCalled() + expect(stopPropagation).toHaveBeenCalledTimes(1) }) it('should prevent the default action when no click handler is provided', () => { render() - const event = createEvent.click(screen.getByText('Edit')) - fireEvent(screen.getByText('Edit'), event) + const menuItem = screen.getByRole('button', { name: 'Edit' }) + const event = createEvent.click(menuItem) + fireEvent(menuItem, event) expect(event.defaultPrevented).toBe(true) }) diff --git a/web/app/components/app-sidebar/dataset-info/menu-item.tsx b/web/app/components/app-sidebar/dataset-info/menu-item.tsx index 6e0269d269a181..4342c09bacc928 100644 --- a/web/app/components/app-sidebar/dataset-info/menu-item.tsx +++ b/web/app/components/app-sidebar/dataset-info/menu-item.tsx @@ -9,17 +9,18 @@ type MenuItemProps = { const MenuItem = ({ Icon, name, handleClick }: MenuItemProps) => { return ( -
{ e.preventDefault() e.stopPropagation() handleClick?.() }} > - + {name} -
+ ) }