Skip to content

Commit 520d941

Browse files
committed
feat: Add internal props ability for rc-tree-select usage
1 parent 0b1c5d0 commit 520d941

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

src/generate.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import {
2525
DisplayLabelValueType,
2626
FlattenOptionsType,
2727
SingleType,
28+
OnClear,
29+
INTERNAL_PROPS_MARK,
2830
} from './interface/generator';
2931
import { OptionListProps, RefOptionListProps } from './OptionList';
3032
import { toInnerValue, toOuterValues, removeLastEnabledValue, getUUID } from './utils/commonUtil';
@@ -137,6 +139,16 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
137139

138140
// Motion
139141
choiceTransitionName?: string;
142+
143+
// Internal props
144+
/**
145+
* Only used in current version for internal event process.
146+
* Do not use in production environment.
147+
*/
148+
internalProps?: {
149+
mark?: string;
150+
onClear?: OnClear;
151+
};
140152
}
141153

142154
export interface GenerateConfig<OptionsType extends object[]> {
@@ -272,6 +284,8 @@ export default function generateSelector<
272284
onSelect,
273285
onDeselect,
274286

287+
internalProps = {},
288+
275289
...restProps
276290
} = props;
277291

@@ -604,7 +618,12 @@ export default function generateSelector<
604618
!mergedSearchValue &&
605619
mergedRawValue.length
606620
) {
607-
triggerChange(removeLastEnabledValue(displayValues, mergedRawValue));
621+
const removeInfo = removeLastEnabledValue(displayValues, mergedRawValue);
622+
623+
if (removeInfo.removedValue !== null) {
624+
triggerChange(removeInfo.values);
625+
triggerSelect(removeInfo.removedValue, false);
626+
}
608627
}
609628

610629
if (mergedOpen && listRef.current) {
@@ -746,6 +765,11 @@ export default function generateSelector<
746765
// ============================= Clear ==============================
747766
let clearNode: React.ReactNode;
748767
const onClearMouseDown: React.MouseEventHandler<HTMLSpanElement> = () => {
768+
// Trigger internal `onClear` event
769+
if (internalProps.mark === INTERNAL_PROPS_MARK && internalProps.onClear) {
770+
internalProps.onClear();
771+
}
772+
749773
triggerChange([]);
750774
triggerSearch('', false);
751775
};

src/interface/generator.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { SelectProps, RefSelectProps } from '../generate';
22

3+
export const INTERNAL_PROPS_MARK = 'RC_SELECT_INTERNAL_PROPS_MARK';
4+
35
// =================================== Shared Type ===================================
46
export type Key = string | number;
57

@@ -18,6 +20,8 @@ export interface DisplayLabelValueType extends LabelValueType {
1820

1921
export type SingleType<MixType> = MixType extends (infer Single)[] ? Single : MixType;
2022

23+
export type OnClear = () => void;
24+
2125
// ==================================== Generator ====================================
2226
export type GetLabeledValue<FOT extends FlattenOptionsType> = (
2327
value: RawValueType,

src/utils/commonUtil.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export function toOuterValues<FOT extends FlattenOptionsType>(
6666
export function removeLastEnabledValue<
6767
T extends { disabled?: boolean },
6868
P extends RawValueType | object
69-
>(measureValues: T[], values: P[]): P[] {
69+
>(measureValues: T[], values: P[]): { values: P[]; removedValue: P } {
7070
const newValues = [...values];
7171

7272
let removeIndex: number;
@@ -76,11 +76,17 @@ export function removeLastEnabledValue<
7676
}
7777
}
7878

79+
let removedValue = null;
80+
7981
if (removeIndex !== -1) {
82+
removedValue = newValues[removeIndex];
8083
newValues.splice(removeIndex, 1);
8184
}
8285

83-
return newValues;
86+
return {
87+
values: newValues,
88+
removedValue,
89+
};
8490
}
8591

8692
export const isClient =

tests/Select.test.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
findSelection,
1616
injectRunAllTimers,
1717
} from './utils/common';
18+
import { INTERNAL_PROPS_MARK } from '../src/interface/generator';
1819

1920
describe('Select.Basic', () => {
2021
injectRunAllTimers(jest);
@@ -340,8 +341,18 @@ describe('Select.Basic', () => {
340341

341342
it('clears value', () => {
342343
const handleChange = jest.fn();
344+
const onClear = jest.fn();
345+
343346
const wrapper = mount(
344-
<Select value="1" allowClear onChange={handleChange}>
347+
<Select
348+
value="1"
349+
allowClear
350+
onChange={handleChange}
351+
internalProps={{
352+
mark: INTERNAL_PROPS_MARK,
353+
onClear,
354+
}}
355+
>
345356
<Option value="1">1</Option>
346357
<Option value="2">2</Option>
347358
</Select>,
@@ -354,6 +365,7 @@ describe('Select.Basic', () => {
354365
.simulate('mousedown');
355366
expect(handleChange).toHaveBeenCalledWith(undefined, undefined);
356367
expect(wrapper.find('input').props().value).toEqual('');
368+
expect(onClear).toHaveBeenCalled();
357369
});
358370

359371
it('adds label to value', () => {

0 commit comments

Comments
 (0)