diff --git a/src/Panel.tsx b/src/Panel.tsx index 5dd97aca..ead19567 100644 --- a/src/Panel.tsx +++ b/src/Panel.tsx @@ -37,7 +37,16 @@ const CollapsePanel = React.forwardRef((prop onItemClick?.(panelKey); }, onKeyDown: (e: React.KeyboardEvent) => { - if (e.key === 'Enter' || e.keyCode === KeyCode.ENTER || e.which === KeyCode.ENTER) { + if ( + !disabled && + (e.key === 'Enter' || + e.key === ' ' || + e.keyCode === KeyCode.ENTER || + e.keyCode === KeyCode.SPACE || + e.which === KeyCode.ENTER || + e.which === KeyCode.SPACE) + ) { + e.preventDefault(); onItemClick?.(panelKey); } }, diff --git a/tests/index.spec.tsx b/tests/index.spec.tsx index c509cb3c..3415827a 100644 --- a/tests/index.spec.tsx +++ b/tests/index.spec.tsx @@ -395,14 +395,20 @@ describe('collapse', () => { }); }); - it('should toggle panel when press enter', () => { - const myKeyEvent = { + it('should toggle panel when press Enter or Space', () => { + const enterKeyEvent = { key: 'Enter', keyCode: KeyCode.ENTER, which: KeyCode.ENTER, // https://github.com/testing-library/react-testing-library/issues/269#issuecomment-455854112 charCode: KeyCode.ENTER, }; + const spaceKeyEvent = { + key: ' ', + keyCode: KeyCode.SPACE, + which: KeyCode.SPACE, + charCode: KeyCode.SPACE, + }; const { container } = render( @@ -418,24 +424,37 @@ describe('collapse', () => { , ); - fireEvent.keyDown(container.querySelectorAll('.rc-collapse-header')?.[2], myKeyEvent); + fireEvent.keyDown(container.querySelectorAll('.rc-collapse-header')?.[2], enterKeyEvent); + fireEvent.keyDown(container.querySelectorAll('.rc-collapse-header')?.[2], spaceKeyEvent); jest.runAllTimers(); expect(container.querySelectorAll('.rc-collapse-panel-active')).toHaveLength(0); - fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, myKeyEvent); + fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, enterKeyEvent); jest.runAllTimers(); expect(container.querySelectorAll('.rc-collapse-panel-active')).toHaveLength(1); expect(container.querySelector('.rc-collapse-panel')).toHaveClass('rc-collapse-panel-active'); - fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, myKeyEvent); + fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, enterKeyEvent); jest.runAllTimers(); expect(container.querySelectorAll('.rc-collapse-panel-active')).toHaveLength(0); expect(container.querySelector('.rc-collapse-panel')!.className).not.toContain( 'rc-collapse-panel-active', ); + + expect(fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, spaceKeyEvent)).toBe( + false, + ); + jest.runAllTimers(); + expect(container.querySelectorAll('.rc-collapse-panel-active')).toHaveLength(1); + + expect(fireEvent.keyDown(container.querySelector('.rc-collapse-header')!, spaceKeyEvent)).toBe( + false, + ); + jest.runAllTimers(); + expect(container.querySelectorAll('.rc-collapse-panel-active')).toHaveLength(0); }); describe('wrapped in Fragment', () => {