From cef6c64d12c6410336da9f10da062f5c7b3df00f Mon Sep 17 00:00:00 2001 From: Wpxp123456 <2677556700@qq.com> Date: Thu, 27 Aug 2026 16:51:36 +0800 Subject: [PATCH] fix(ui): keep ribbon dropdowns open with disabled siblings --- .../ribbon/TooltipButtonWrapper.tsx | 9 ++++---- .../__tests__/TooltipButtonWrapper.spec.tsx | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/views/components/ribbon/TooltipButtonWrapper.tsx b/packages/ui/src/views/components/ribbon/TooltipButtonWrapper.tsx index ae06edacbfb1..451253c975eb 100644 --- a/packages/ui/src/views/components/ribbon/TooltipButtonWrapper.tsx +++ b/packages/ui/src/views/components/ribbon/TooltipButtonWrapper.tsx @@ -47,6 +47,7 @@ const TooltipWrapperContext = createContext({ setDropdownVisible: (_visible: boolean) => {}, }); +// Ribbon dropdowns share one open key; disabled items must only clear it when they own it. const ToolbarDropdownContext = createContext<{ openDropdownKey: string | null; setOpenDropdownKey: (key: string | null) => void; @@ -158,10 +159,10 @@ export function DropdownWrapper(props: Omit, 'overlay'> const overlayRef = useRef(null); useEffect(() => { - if (disabled) { + if (disabled && dropdownVisible) { setDropdownVisible(false); } - }, [disabled, setDropdownVisible]); + }, [disabled, dropdownVisible, setDropdownVisible]); useEffect(() => { const ownerDocument = triggerRef.current?.ownerDocument; @@ -268,10 +269,10 @@ export function DropdownMenuWrapper({ const { dropdownVisible, setDropdownVisible } = useContext(TooltipWrapperContext); useEffect(() => { - if (disabled) { + if (disabled && dropdownVisible) { setDropdownVisible(false); } - }, [disabled, setDropdownVisible]); + }, [disabled, dropdownVisible, setDropdownVisible]); const menuManagerService = useDependency(IMenuManagerService); const resolveMenuItems = () => menuId ? menuManagerService.getMenuByPositionKey(menuId) : []; diff --git a/packages/ui/src/views/components/ribbon/__tests__/TooltipButtonWrapper.spec.tsx b/packages/ui/src/views/components/ribbon/__tests__/TooltipButtonWrapper.spec.tsx index 126e19791db4..c2c5367b772a 100644 --- a/packages/ui/src/views/components/ribbon/__tests__/TooltipButtonWrapper.spec.tsx +++ b/packages/ui/src/views/components/ribbon/__tests__/TooltipButtonWrapper.spec.tsx @@ -135,6 +135,27 @@ describe('DropdownMenuLabel', () => { }); describe('DropdownWrapper', () => { + it('keeps an enabled dropdown open when a sibling is disabled', () => { + const { getByRole, queryByText } = render( + + + Disabled content}> + + + + + Enabled content}> + + + + + ); + + fireEvent.click(getByRole('button', { name: 'Enabled dropdown' })); + + expect(queryByText('Enabled content')).not.toBeNull(); + }); + it('opens toward the left in RTL layouts', async () => { const { findByText, getByRole } = render(