@@ -27,6 +27,7 @@ import {
2727 SingleType ,
2828 OnClear ,
2929 INTERNAL_PROPS_MARK ,
30+ SelectSource ,
3031} from './interface/generator' ;
3132import { OptionListProps , RefOptionListProps } from './OptionList' ;
3233import { toInnerValue , toOuterValues , removeLastEnabledValue , getUUID } from './utils/commonUtil' ;
@@ -150,8 +151,12 @@ export interface SelectProps<OptionsType extends object[], ValueType> extends Re
150151 onClear ?: OnClear ;
151152 skipTriggerChange ?: boolean ;
152153 skipTriggerSelect ?: boolean ;
153- onRawSelect ?: ( value : RawValueType , option : OptionsType [ number ] ) => void ;
154- onRawDeselect ?: ( value : RawValueType , option : OptionsType [ number ] ) => void ;
154+ onRawSelect ?: ( value : RawValueType , option : OptionsType [ number ] , source : SelectSource ) => void ;
155+ onRawDeselect ?: (
156+ value : RawValueType ,
157+ option : OptionsType [ number ] ,
158+ source : SelectSource ,
159+ ) => void ;
155160 } ;
156161}
157162
@@ -433,7 +438,7 @@ export default function generateSelector<
433438 [ baseValue , mergedOptions ] ,
434439 ) ;
435440
436- const triggerSelect = ( newValue : RawValueType , isSelect : boolean ) => {
441+ const triggerSelect = ( newValue : RawValueType , isSelect : boolean , source : SelectSource ) => {
437442 const outOption = findValueOption ( [ newValue ] , mergedFlattenOptions ) [ 0 ] ;
438443
439444 if ( ! internalProps . skipTriggerSelect ) {
@@ -457,9 +462,9 @@ export default function generateSelector<
457462 // Trigger internal event
458463 if ( useInternalProps ) {
459464 if ( isSelect && internalProps . onRawSelect ) {
460- internalProps . onRawSelect ( newValue , outOption ) ;
465+ internalProps . onRawSelect ( newValue , outOption , source ) ;
461466 } else if ( ! isSelect && internalProps . onRawDeselect ) {
462- internalProps . onRawDeselect ( newValue , outOption ) ;
467+ internalProps . onRawDeselect ( newValue , outOption , source ) ;
463468 }
464469 }
465470 } ;
@@ -488,7 +493,10 @@ export default function generateSelector<
488493 setInnerValue ( outValue ) ;
489494 } ;
490495
491- const onInternalSelect = ( newValue : RawValueType , { selected } : { selected : boolean } ) => {
496+ const onInternalSelect = (
497+ newValue : RawValueType ,
498+ { selected, source } : { selected : boolean ; source : 'option' | 'selection' } ,
499+ ) => {
492500 if ( disabled ) {
493501 return ;
494502 }
@@ -513,7 +521,7 @@ export default function generateSelector<
513521 }
514522
515523 // Trigger `onSelect`. Single mode always trigger select
516- triggerSelect ( newValue , ! isMultiple || selected ) ;
524+ triggerSelect ( newValue , ! isMultiple || selected , source ) ;
517525
518526 // Clean search value if single or configured
519527 if ( mode === 'combobox' ) {
@@ -525,6 +533,14 @@ export default function generateSelector<
525533 }
526534 } ;
527535
536+ const onInternalOptionSelect = ( newValue : RawValueType , info : { selected : boolean } ) => {
537+ onInternalSelect ( newValue , { ...info , source : 'option' } ) ;
538+ } ;
539+
540+ const onInternalSelectionSelect = ( newValue : RawValueType , info : { selected : boolean } ) => {
541+ onInternalSelect ( newValue , { ...info , source : 'selection' } ) ;
542+ } ;
543+
528544 // ============================= Input ==============================
529545 // Only works in `combobox`
530546 const customizeInputElement : React . ReactElement =
@@ -585,7 +601,7 @@ export default function generateSelector<
585601 ) ;
586602 triggerChange ( newRawValues ) ;
587603 newRawValues . forEach ( newRawValue => {
588- triggerSelect ( newRawValue , true ) ;
604+ triggerSelect ( newRawValue , true , 'input' ) ;
589605 } ) ;
590606
591607 // Should close when paste finish
@@ -644,7 +660,7 @@ export default function generateSelector<
644660
645661 if ( removeInfo . removedValue !== null ) {
646662 triggerChange ( removeInfo . values ) ;
647- triggerSelect ( removeInfo . removedValue , false ) ;
663+ triggerSelect ( removeInfo . removedValue , false , 'input' ) ;
648664 }
649665 }
650666
@@ -773,7 +789,7 @@ export default function generateSelector<
773789 values = { rawValues }
774790 height = { listHeight }
775791 itemHeight = { listItemHeight }
776- onSelect = { onInternalSelect }
792+ onSelect = { onInternalOptionSelect }
777793 onToggleOpen = { onToggleOpen }
778794 onActiveValue = { onActiveValue }
779795 defaultActiveFirstOption = { mergedDefaultActiveFirstOption }
@@ -896,7 +912,7 @@ export default function generateSelector<
896912 searchValue = { mergedSearchValue }
897913 activeValue = { activeValue }
898914 onSearch = { triggerSearch }
899- onSelect = { onInternalSelect }
915+ onSelect = { onInternalSelectionSelect }
900916 />
901917 </ SelectTrigger >
902918
0 commit comments