From 50af9a770e4f9d96ec0a7347245075e99bb9f70f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=B3=E5=BB=B7=E5=AE=89?= <73953029+nrps9909@users.noreply.github.com> Date: Fri, 28 Aug 2026 05:34:59 +0800 Subject: [PATCH] fix: wrap initial overflow ArrowUp to last tab --- src/TabNavList/OperationNode.tsx | 6 +++++- tests/overflow.test.tsx | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) 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();