diff --git a/src/TabNavList/OperationNode.tsx b/src/TabNavList/OperationNode.tsx index 59a33952..4a8a29a2 100644 --- a/src/TabNavList/OperationNode.tsx +++ b/src/TabNavList/OperationNode.tsx @@ -128,9 +128,13 @@ const OperationNode = React.forwardRef((prop function selectOffset(offset: -1 | 1) { const enabledTabs = tabs.filter(tab => !tab.disabled); - let selectedIndex = enabledTabs.findIndex(tab => tab.key === selectedKey) || 0; + let selectedIndex = enabledTabs.findIndex(tab => tab.key === selectedKey); const len = enabledTabs.length; + if (selectedIndex === -1 && offset === -1) { + selectedIndex = 0; + } + for (let i = 0; i < len; i += 1) { selectedIndex = (selectedIndex + offset + len) % len; const tab = enabledTabs[selectedIndex]; diff --git a/tests/overflow.test.tsx b/tests/overflow.test.tsx index 03a70ad6..47627fc7 100644 --- a/tests/overflow.test.tsx +++ b/tests/overflow.test.tsx @@ -111,6 +111,35 @@ describe('Tabs.Overflow', () => { unmount(); }); + it('should select the last enabled tab on the first ArrowUp', () => { + jest.useFakeTimers(); + const { container, unmount } = render(getTabs()); + + triggerResize(container); + act(() => { + jest.runAllTimers(); + }); + + const moreButton = container.querySelector('.rc-tabs-nav-more'); + fireEvent.keyDown(moreButton, { + which: KeyCode.DOWN, + keyCode: KeyCode.DOWN, + charCode: KeyCode.DOWN, + }); + fireEvent.keyDown(moreButton, { + which: KeyCode.UP, + keyCode: KeyCode.UP, + charCode: KeyCode.UP, + }); + + expect(document.querySelector('li.rc-tabs-dropdown-menu-item-selected').textContent).toEqual( + 'miu', + ); + + unmount(); + jest.useRealTimers(); + }); + [KeyCode.SPACE, KeyCode.ENTER].forEach(code => { it(`keyboard with select keycode: ${code}`, () => { jest.useFakeTimers();