Skip to content

Commit 3a4dda0

Browse files
authored
fix: Disabled option should not be closable (#312)
1 parent 37db73b commit 3a4dda0

File tree

3 files changed

+54
-26
lines changed

3 files changed

+54
-26
lines changed

examples/debug.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import '../assets/index.less';
44
import Cascader from '../src';
55

66
const addressOptions = [
7-
...new Array(20).fill(null).map((_, i) => ({ label: String(i), value: `99${i}` })),
7+
// ...new Array(20).fill(null).map((_, i) => ({ label: String(i), value: `99${i}` })),
88
{
99
label: <span>空孩子</span>,
1010
value: 'empty',
@@ -18,6 +18,7 @@ const addressOptions = [
1818
{
1919
label: '福州',
2020
value: 'fuzhou',
21+
disabled: true,
2122
children: [
2223
{
2324
label: '马尾',
@@ -82,7 +83,7 @@ const addressOptions = [
8283
},
8384
],
8485
},
85-
...new Array(20).fill(null).map((_, i) => ({ label: String(i), value: i })),
86+
// ...new Array(20).fill(null).map((_, i) => ({ label: String(i), value: i })),
8687
];
8788

8889
// const defaultValue = ['fj', 'fuzhou'];
@@ -92,7 +93,7 @@ const addressOptions = [
9293
const defaultValue = ['not', 'exist'];
9394

9495
const Demo = () => {
95-
const [multiple, setMultiple] = React.useState(false);
96+
const [multiple, setMultiple] = React.useState(true);
9697
const [, setInputValue] = React.useState('');
9798

9899
const onChange = (value: any, selectedOptions: any) => {

src/hooks/useDisplayValues.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ export default (
5656
value,
5757
key: value,
5858
valueCells,
59+
disabled: valueOptions[valueOptions.length - 1]?.option?.disabled,
5960
};
6061
});
6162
}, [rawValues, options, fieldNames, displayRender, multiple]);

tests/index.spec.tsx

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -369,30 +369,56 @@ describe('Cascader.Basic', () => {
369369
expect(menus.length).toBe(1);
370370
});
371371

372-
it('should be unselectable when option is disabled', () => {
373-
const newAddressOptions = [...addressOptions];
374-
newAddressOptions[0] = {
375-
...newAddressOptions[0],
376-
disabled: true,
377-
};
378-
const wrapper = mount(
379-
<Cascader options={newAddressOptions} onChange={onChange}>
380-
<input readOnly />
381-
</Cascader>,
382-
);
383-
wrapper.find('input').simulate('click');
384-
let menus = wrapper.find('.rc-cascader-menu');
385-
expect(menus.length).toBe(1);
386-
const menu1Items = menus.at(0).find('.rc-cascader-menu-item');
387-
expect(menu1Items.length).toBe(3);
388-
expect(selectedValue).toBeFalsy();
372+
describe('option disabled', () => {
373+
it('should be unselectable when option is disabled', () => {
374+
const newAddressOptions = [...addressOptions];
375+
newAddressOptions[0] = {
376+
...newAddressOptions[0],
377+
disabled: true,
378+
};
379+
const wrapper = mount(
380+
<Cascader options={newAddressOptions} onChange={onChange}>
381+
<input readOnly />
382+
</Cascader>,
383+
);
384+
wrapper.find('input').simulate('click');
385+
let menus = wrapper.find('.rc-cascader-menu');
386+
expect(menus.length).toBe(1);
387+
const menu1Items = menus.at(0).find('.rc-cascader-menu-item');
388+
expect(menu1Items.length).toBe(3);
389+
expect(selectedValue).toBeFalsy();
390+
391+
menu1Items.at(0).simulate('click');
392+
expect(
393+
wrapper.find('.rc-cascader-menu-item').first().hasClass('rc-cascader-menu-item-disabled'),
394+
).toBe(true);
395+
menus = wrapper.find('.rc-cascader-menu');
396+
expect(menus.length).toBe(1);
397+
});
389398

390-
menu1Items.at(0).simulate('click');
391-
expect(
392-
wrapper.find('.rc-cascader-menu-item').first().hasClass('rc-cascader-menu-item-disabled'),
393-
).toBe(true);
394-
menus = wrapper.find('.rc-cascader-menu');
395-
expect(menus.length).toBe(1);
399+
it('can not clear selector when disabled', () => {
400+
const newAddressOptions = JSON.parse(JSON.stringify(addressOptions));
401+
newAddressOptions[0].children[0].disabled = true;
402+
403+
const wrapper = mount(
404+
<Cascader
405+
options={newAddressOptions}
406+
value={[
407+
['fj', 'fuzhou'],
408+
['bj', 'chaoyang'],
409+
]}
410+
checkable
411+
/>,
412+
);
413+
414+
expect(wrapper.find('.rc-cascader-selection-item-disabled').text()).toEqual('福州');
415+
expect(
416+
wrapper
417+
.find('.rc-cascader-selection-item:not(.rc-cascader-selection-item-disabled)')
418+
.find('.rc-cascader-selection-item-content')
419+
.text(),
420+
).toEqual('朝阳区');
421+
});
396422
});
397423

398424
it('should have correct active menu items', () => {

0 commit comments

Comments
 (0)