Skip to content

Commit c684a1a

Browse files
authored
fix: Whatever selectable, should close it (#401)
* fix: Whatever selectable, should close it * test: More test case
1 parent 9c7a888 commit c684a1a

File tree

2 files changed

+58
-47
lines changed

2 files changed

+58
-47
lines changed

src/Menu.tsx

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -331,41 +331,40 @@ const Menu: React.FC<MenuProps> = props => {
331331

332332
// >>>>> Trigger select
333333
const triggerSelection = (info: MenuInfo) => {
334-
if (!selectable) {
335-
return;
336-
}
337-
338-
// Insert or Remove
339-
const { key: targetKey } = info;
340-
const exist = mergedSelectKeys.includes(targetKey);
341-
let newSelectKeys: string[];
342-
343-
if (multiple) {
344-
if (exist) {
345-
newSelectKeys = mergedSelectKeys.filter(key => key !== targetKey);
334+
if (selectable) {
335+
// Insert or Remove
336+
const { key: targetKey } = info;
337+
const exist = mergedSelectKeys.includes(targetKey);
338+
let newSelectKeys: string[];
339+
340+
if (multiple) {
341+
if (exist) {
342+
newSelectKeys = mergedSelectKeys.filter(key => key !== targetKey);
343+
} else {
344+
newSelectKeys = [...mergedSelectKeys, targetKey];
345+
}
346346
} else {
347-
newSelectKeys = [...mergedSelectKeys, targetKey];
347+
newSelectKeys = [targetKey];
348348
}
349-
} else {
350-
newSelectKeys = [targetKey];
351-
}
352349

353-
setMergedSelectKeys(newSelectKeys);
350+
setMergedSelectKeys(newSelectKeys);
354351

355-
// Trigger event
356-
const selectInfo: SelectInfo = {
357-
...info,
358-
selectedKeys: newSelectKeys,
359-
};
352+
// Trigger event
353+
const selectInfo: SelectInfo = {
354+
...info,
355+
selectedKeys: newSelectKeys,
356+
};
360357

361-
if (exist) {
362-
onDeselect?.(selectInfo);
363-
} else {
364-
onSelect?.(selectInfo);
358+
if (exist) {
359+
onDeselect?.(selectInfo);
360+
} else {
361+
onSelect?.(selectInfo);
362+
}
365363
}
366364

365+
// Whatever selectable, always close it
367366
if (!multiple && mergedOpenKeys.length) {
368-
onOpenChange?.(EMPTY_LIST);
367+
triggerOpenKeys(EMPTY_LIST);
369368
}
370369
};
371370

tests/Menu.spec.js

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -540,31 +540,43 @@ describe('Menu', () => {
540540
errorSpy.mockRestore();
541541
});
542542

543-
it('Click should close Menu', async () => {
544-
jest.useFakeTimers();
543+
describe('Click should close Menu', () => {
544+
function test(name, props) {
545+
it(name, async () => {
546+
jest.useFakeTimers();
547+
548+
const onOpenChange = jest.fn();
549+
550+
const wrapper = mount(
551+
<Menu
552+
openKeys={['bamboo']}
553+
mode="vertical"
554+
onOpenChange={onOpenChange}
555+
{...props}
556+
>
557+
<SubMenu key="bamboo" title="Bamboo">
558+
<MenuItem key="light">Light</MenuItem>
559+
</SubMenu>
560+
</Menu>,
561+
);
545562

546-
const onOpenChange = jest.fn();
563+
// Open menu
564+
await act(async () => {
565+
jest.runAllTimers();
566+
wrapper.update();
567+
});
547568

548-
const wrapper = mount(
549-
<Menu openKeys={['bamboo']} mode="vertical" onOpenChange={onOpenChange}>
550-
<SubMenu key="bamboo" title="Bamboo">
551-
<MenuItem key="light">Light</MenuItem>
552-
</SubMenu>
553-
</Menu>,
554-
);
569+
wrapper.update();
555570

556-
// Open menu
557-
await act(async () => {
558-
jest.runAllTimers();
559-
wrapper.update();
560-
});
561-
562-
wrapper.update();
571+
wrapper.find('.rc-menu-item').last().simulate('click');
572+
expect(onOpenChange).toHaveBeenCalledWith([]);
563573

564-
wrapper.find('.rc-menu-item').last().simulate('click');
565-
expect(onOpenChange).toHaveBeenCalledWith([]);
574+
jest.useRealTimers();
575+
});
576+
}
566577

567-
jest.useRealTimers();
578+
test('basic');
579+
test('not selectable', { selectable: false });
568580
});
569581
});
570582
/* eslint-enable */

0 commit comments

Comments
 (0)