Skip to content

Commit 0ba97b6

Browse files
morenyangzombieJ
authored andcommitted
Close dropdown when select disabled (#449)
1 parent 245b3b1 commit 0ba97b6

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

src/generate.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,8 @@ export default function generateSelector<
627627

628628
// ============================== Open ==============================
629629
const [innerOpen, setInnerOpen] = React.useState<boolean>(defaultOpen);
630-
let mergedOpen: boolean = open !== undefined ? open : innerOpen;
630+
let mergedOpen: boolean =
631+
!disabled && (open !== undefined ? open : innerOpen);
631632

632633
// Not trigger `open` in `combobox` when `notFoundContent` is empty
633634
const emptyListContent = !notFoundContent && !displayOptions.length;
@@ -713,6 +714,13 @@ export default function generateSelector<
713714
return ret;
714715
};
715716

717+
// Close dropdown when disabled change
718+
React.useEffect(() => {
719+
if (innerOpen && !!disabled) {
720+
setInnerOpen(false);
721+
}
722+
}, [disabled]);
723+
716724
// Close will clean up single mode search text
717725
React.useEffect(() => {
718726
if (!mergedOpen && !isMultiple && mode !== 'combobox') {

tests/Select.test.tsx

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1457,4 +1457,42 @@ describe('Select.Basic', () => {
14571457
wrapper.update();
14581458
expect(wrapper.find('.rc-select-selection-item')).toHaveLength(0);
14591459
});
1460+
1461+
describe('disabled on open', () => {
1462+
it('should not show dropdown when oepn and disabled', () => {
1463+
const wrapper = mount(
1464+
<Select open disabled>
1465+
<Option value="1">1</Option>
1466+
<Option value="2">2</Option>
1467+
</Select>,
1468+
);
1469+
expectOpen(wrapper, false);
1470+
});
1471+
1472+
it('should close dropdown when disabled after open', () => {
1473+
const wrapper = mount(
1474+
<Select>
1475+
<Option value="1">1</Option>
1476+
<Option value="2">2</Option>
1477+
</Select>,
1478+
);
1479+
toggleOpen(wrapper);
1480+
expectOpen(wrapper, true);
1481+
wrapper.setProps({ disabled: true });
1482+
expectOpen(wrapper, false);
1483+
});
1484+
1485+
it('should not open dropdown after remove disabled', () => {
1486+
const wrapper = mount(
1487+
<Select>
1488+
<Option value="1">1</Option>
1489+
<Option value="2">2</Option>
1490+
</Select>,
1491+
);
1492+
toggleOpen(wrapper);
1493+
wrapper.setProps({ disabled: true });
1494+
wrapper.setProps({ disabled: false });
1495+
expectOpen(wrapper, false);
1496+
});
1497+
});
14601498
});

tests/__snapshots__/Select.test.tsx.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ exports[`Select.Basic render renders disabled select correctly 1`] = `
400400
aria-activedescendant="undefined_list_0"
401401
aria-autocomplete="list"
402402
aria-controls="undefined_list"
403+
aria-expanded="false"
403404
aria-haspopup="listbox"
404405
aria-owns="undefined_list"
405406
autocomplete="off"

0 commit comments

Comments
 (0)