Skip to content

Commit a07610e

Browse files
author
nathanlao11
committed
feat: support option in onChange handler
1 parent 2bdef40 commit a07610e

6 files changed

+559
-469
lines changed

src/TreeSelect.tsx

+19-5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import type {
3434
DefaultValueType,
3535
FieldNames,
3636
LegacyDataNode,
37+
DefaultOptionType,
3738
} from './interface';
3839

3940
export interface TreeSelectProps<ValueType = any, OptionType extends DataNode = DataNode>
@@ -45,7 +46,11 @@ export interface TreeSelectProps<ValueType = any, OptionType extends DataNode =
4546
// >>> Value
4647
value?: ValueType;
4748
defaultValue?: ValueType;
48-
onChange?: (value: ValueType, labelList: React.ReactNode[], extra: ChangeEventExtra) => void;
49+
onChange?: (
50+
value: ValueType,
51+
labelList: React.ReactNode[],
52+
extra: ChangeEventExtra & { option?: DefaultOptionType },
53+
) => void;
4954

5055
// >>> Search
5156
searchValue?: string;
@@ -410,7 +415,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
410415
const triggerChange = useRefFunc(
411416
(
412417
newRawValues: SafeKey[],
413-
extra: { triggerValue?: SafeKey; selected?: boolean },
418+
extra: { triggerValue?: SafeKey; selected?: boolean; option?: DefaultOptionType },
414419
source: SelectSource,
415420
) => {
416421
const labeledValues = convert2LabelValues(newRawValues);
@@ -456,7 +461,8 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
456461
// [Legacy] Always return as array contains label & value
457462
preValue: rawLabeledValues,
458463
triggerValue,
459-
} as ChangeEventExtra;
464+
option: extra.option,
465+
} as ChangeEventExtra & { option?: DefaultOptionType };
460466

461467
// [Legacy] Fill legacy data if user query.
462468
// This is expansive that we only fill when user query
@@ -505,7 +511,11 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
505511
// Never be falsy but keep it safe
506512
if (!mergedMultiple) {
507513
// Single mode always set value
508-
triggerChange([selectedValue], { selected: true, triggerValue: selectedValue }, 'option');
514+
triggerChange(
515+
[selectedValue],
516+
{ selected: true, triggerValue: selectedValue, option: node as DefaultOptionType },
517+
'option',
518+
);
509519
} else {
510520
let newRawValues = selected
511521
? [...rawValues, selectedValue]
@@ -535,7 +545,11 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
535545
...checkedKeys.map(key => keyEntities[key as SafeKey].node[mergedFieldNames.value]),
536546
];
537547
}
538-
triggerChange(newRawValues, { selected, triggerValue: selectedValue }, source || 'option');
548+
triggerChange(
549+
newRawValues,
550+
{ selected, triggerValue: selectedValue, option: node as DefaultOptionType },
551+
source || 'option',
552+
);
539553
}
540554

541555
// Trigger select event

src/interface.ts

+13
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@ import type { SafeKey, Key, DataNode as TreeDataNode } from 'rc-tree/lib/interfa
33

44
export type { SafeKey, Key };
55

6+
export interface BaseOptionType {
7+
disabled?: boolean;
8+
className?: string;
9+
title?: string;
10+
[name: string]: any;
11+
}
12+
13+
export interface DefaultOptionType extends BaseOptionType {
14+
label?: React.ReactNode;
15+
value?: string | number | null;
16+
children?: Omit<DefaultOptionType, 'children'>[];
17+
}
18+
619
export interface DataNode extends Record<string, any>, Omit<TreeDataNode, 'key' | 'children'> {
720
key?: Key;
821
value?: SafeKey;

tests/Select.props.spec.js

+3
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,7 @@ describe('TreeSelect.props', () => {
324324
}),
325325
],
326326
checked: true,
327+
option: expect.anything(),
327328
preValue: [],
328329
triggerNode: expect.anything(),
329330
triggerValue: 'Value 0',
@@ -342,6 +343,7 @@ describe('TreeSelect.props', () => {
342343
}),
343344
],
344345
checked: true,
346+
option: expect.anything(),
345347
preValue: [],
346348
triggerNode: expect.anything(),
347349
triggerValue: 'Value 0',
@@ -360,6 +362,7 @@ describe('TreeSelect.props', () => {
360362
}),
361363
],
362364
checked: true,
365+
option: expect.anything(),
363366
preValue: [],
364367
triggerNode: expect.anything(),
365368
triggerValue: 'Value 0',

0 commit comments

Comments
 (0)