Skip to content

Commit 41733ec

Browse files
authored
fix(ui): keep ribbon dropdowns open with disabled siblings (#7602)
1 parent ee1adb0 commit 41733ec

2 files changed

Lines changed: 26 additions & 4 deletions

File tree

packages/ui/src/views/components/ribbon/TooltipButtonWrapper.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ const TooltipWrapperContext = createContext({
4747
setDropdownVisible: (_visible: boolean) => {},
4848
});
4949

50+
// Ribbon dropdowns share one open key; disabled items must only clear it when they own it.
5051
const ToolbarDropdownContext = createContext<{
5152
openDropdownKey: string | null;
5253
setOpenDropdownKey: (key: string | null) => void;
@@ -158,10 +159,10 @@ export function DropdownWrapper(props: Omit<Partial<IDropdownProps>, 'overlay'>
158159
const overlayRef = useRef<HTMLDivElement>(null);
159160

160161
useEffect(() => {
161-
if (disabled) {
162+
if (disabled && dropdownVisible) {
162163
setDropdownVisible(false);
163164
}
164-
}, [disabled, setDropdownVisible]);
165+
}, [disabled, dropdownVisible, setDropdownVisible]);
165166

166167
useEffect(() => {
167168
const ownerDocument = triggerRef.current?.ownerDocument;
@@ -268,10 +269,10 @@ export function DropdownMenuWrapper({
268269
const { dropdownVisible, setDropdownVisible } = useContext(TooltipWrapperContext);
269270

270271
useEffect(() => {
271-
if (disabled) {
272+
if (disabled && dropdownVisible) {
272273
setDropdownVisible(false);
273274
}
274-
}, [disabled, setDropdownVisible]);
275+
}, [disabled, dropdownVisible, setDropdownVisible]);
275276

276277
const menuManagerService = useDependency(IMenuManagerService);
277278
const resolveMenuItems = () => menuId ? menuManagerService.getMenuByPositionKey(menuId) : [];

packages/ui/src/views/components/ribbon/__tests__/TooltipButtonWrapper.spec.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,27 @@ describe('DropdownMenuLabel', () => {
135135
});
136136

137137
describe('DropdownWrapper', () => {
138+
it('keeps an enabled dropdown open when a sibling is disabled', () => {
139+
const { getByRole, queryByText } = render(
140+
<ToolbarDropdownProvider>
141+
<TooltipWrapper dropdownKey="disabled-dropdown">
142+
<DropdownWrapper disabled overlay={<div>Disabled content</div>}>
143+
<button type="button">Disabled dropdown</button>
144+
</DropdownWrapper>
145+
</TooltipWrapper>
146+
<TooltipWrapper dropdownKey="enabled-dropdown">
147+
<DropdownWrapper overlay={<div>Enabled content</div>}>
148+
<button type="button">Enabled dropdown</button>
149+
</DropdownWrapper>
150+
</TooltipWrapper>
151+
</ToolbarDropdownProvider>
152+
);
153+
154+
fireEvent.click(getByRole('button', { name: 'Enabled dropdown' }));
155+
156+
expect(queryByText('Enabled content')).not.toBeNull();
157+
});
158+
138159
it('opens toward the left in RTL layouts', async () => {
139160
const { findByText, getByRole } = render(
140161
<ConfigProvider direction="rtl" mountContainer={document.body}>

0 commit comments

Comments
 (0)