Skip to content

Commit 58d4f81

Browse files
authored
feat: onClear (#523)
* chore: wip * test: onClear
1 parent 8c87f35 commit 58d4f81

File tree

3 files changed

+52
-38
lines changed

3 files changed

+52
-38
lines changed

src/generate.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
8888
showSearch?: boolean;
8989
autoClearSearchValue?: boolean;
9090
onSearch?: (value: string) => void;
91+
onClear?: OnClear;
9192

9293
// Icons
9394
allowClear?: boolean;
@@ -304,6 +305,7 @@ export default function generateSelector<
304305
onChange,
305306
onSelect,
306307
onDeselect,
308+
onClear,
307309

308310
internalProps = {},
309311

@@ -910,6 +912,10 @@ export default function generateSelector<
910912
internalProps.onClear();
911913
}
912914

915+
if (onClear) {
916+
onClear();
917+
}
918+
913919
triggerChange([]);
914920
triggerSearch('', false, false);
915921
};

tests/Select.test.tsx

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import blurTest from './shared/blurTest';
1010
import keyDownTest from './shared/keyDownTest';
1111
import inputFilterTest from './shared/inputFilterTest';
1212
import openControlledTest from './shared/openControlledTest';
13+
import allowClearTest from './shared/allowClearTest';
1314
import {
1415
expectOpen,
1516
toggleOpen,
@@ -22,6 +23,7 @@ import { INTERNAL_PROPS_MARK } from '../src/interface/generator';
2223
describe('Select.Basic', () => {
2324
injectRunAllTimers(jest);
2425

26+
allowClearTest(undefined, '903');
2527
focusTest('single', {});
2628
blurTest('single');
2729
keyDownTest('single');
@@ -351,42 +353,6 @@ describe('Select.Basic', () => {
351353
expectOpen(wrapper);
352354
});
353355

354-
it('clears value', () => {
355-
const handleChange = jest.fn();
356-
const onClear = jest.fn();
357-
358-
const wrapper = mount(
359-
<Select
360-
value="1"
361-
allowClear
362-
onChange={handleChange}
363-
internalProps={{
364-
mark: INTERNAL_PROPS_MARK,
365-
onClear,
366-
}}
367-
>
368-
<Option value="1">1</Option>
369-
<Option value="2">2</Option>
370-
</Select>,
371-
);
372-
373-
wrapper.find('input').simulate('change', { target: { value: 'foo' } });
374-
375-
// disabled
376-
wrapper.setProps({ disabled: true });
377-
expect(wrapper.find('.rc-select-clear')).toHaveLength(0);
378-
379-
// enabled
380-
wrapper.setProps({ disabled: false });
381-
wrapper
382-
.find('.rc-select-clear')
383-
.last()
384-
.simulate('mousedown');
385-
expect(handleChange).toHaveBeenCalledWith(undefined, undefined);
386-
expect(wrapper.find('input').props().value).toEqual('');
387-
expect(onClear).toHaveBeenCalled();
388-
});
389-
390356
it('adds label to value', () => {
391357
const handleChange = jest.fn();
392358
const wrapper = mount(

tests/shared/allowClearTest.tsx

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,54 @@
1-
import { render } from 'enzyme';
1+
import { render, mount } from 'enzyme';
22
import * as React from 'react';
3-
import Select from '../../src';
3+
import Select, { Option } from '../../src';
4+
import { INTERNAL_PROPS_MARK } from '../../src/interface/generator';
45

56
export default function allowClearTest(mode: any, value: any) {
67
describe('allowClear', () => {
78
it('renders correctly', () => {
89
const wrapper = render(<Select mode={mode} value={value} allowClear />);
910
expect(wrapper.find('.rc-select-clear-icon').length).toBeTruthy();
1011
});
12+
it('clears value', () => {
13+
const onClear = jest.fn();
14+
const internalOnClear = jest.fn();
15+
const onChange = jest.fn();
16+
const useArrayValue = ['tags', 'multiple'].includes(mode);
17+
const wrapper = mount(
18+
<Select
19+
defaultValue={useArrayValue ? ['1'] : '1'}
20+
allowClear
21+
mode={mode}
22+
onClear={onClear}
23+
onChange={onChange}
24+
internalProps={{
25+
mark: INTERNAL_PROPS_MARK,
26+
onClear: internalOnClear,
27+
}}
28+
>
29+
<Option value="1">1</Option>
30+
<Option value="2">2</Option>
31+
</Select>,
32+
);
33+
34+
// disabled
35+
wrapper.setProps({ disabled: true });
36+
expect(wrapper.find('.rc-select-clear')).toHaveLength(0);
37+
38+
// enabled
39+
wrapper.setProps({ disabled: false });
40+
wrapper
41+
.find('.rc-select-clear')
42+
.last()
43+
.simulate('mousedown');
44+
if (useArrayValue) {
45+
expect(onChange).toHaveBeenCalledWith([], []);
46+
} else {
47+
expect(onChange).toHaveBeenCalledWith(undefined, undefined);
48+
}
49+
expect(wrapper.find('input').props().value).toEqual('');
50+
expect(onClear).toHaveBeenCalled();
51+
expect(internalOnClear).toHaveBeenCalled();
52+
});
1153
});
1254
}

0 commit comments

Comments
 (0)