@@ -188,6 +188,7 @@ export type PicklistProps<MultiSelect extends boolean | undefined> = {
188188 tooltip ?: ReactNode ;
189189 tooltipIcon ?: string ;
190190 elementRef ?: Ref < HTMLDivElement > ;
191+ inputRef ?: Ref < HTMLDivElement > ;
191192 dropdownRef ?: Ref < HTMLDivElement > ;
192193 onValueChange ?: Bivariant <
193194 (
@@ -229,6 +230,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
229230 tooltip,
230231 tooltipIcon,
231232 elementRef : elementRef_ ,
233+ inputRef : inputRef_ ,
232234 dropdownRef : dropdownRef_ ,
233235 onSelect,
234236 onComplete,
@@ -353,6 +355,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
353355 const elRef = useRef < HTMLDivElement | null > ( null ) ;
354356 const elementRef = useMergeRefs ( [ elRef , elementRef_ ] ) ;
355357 const comboboxElRef = useRef < HTMLDivElement | null > ( null ) ;
358+ const inputRef = useMergeRefs ( [ comboboxElRef , inputRef_ ] ) ;
356359 const dropdownElRef = useRef < HTMLDivElement | null > ( null ) ;
357360 const dropdownRef = useMergeRefs ( [ dropdownElRef , dropdownRef_ ] ) ;
358361
@@ -578,7 +581,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
578581 role = 'none'
579582 >
580583 < div
581- ref = { comboboxElRef }
584+ ref = { inputRef }
582585 role = 'combobox'
583586 tabIndex = { disabled ? - 1 : 0 }
584587 className = { inputClassNames }
@@ -596,12 +599,13 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
596599 >
597600 < span className = 'slds-truncate' > { selectedItemLabel } </ span >
598601 </ div >
599- < span className = 'slds-icon_container slds-icon-utility-down slds-input__icon slds-input__icon_right' >
600- < Icon
601- icon = 'down'
602- className = 'slds-icon slds-icon_x-small slds-icon-text-default'
603- />
604- </ span >
602+ < Icon
603+ containerClassName = 'slds-input__icon slds-input__icon_right'
604+ category = 'utility'
605+ icon = 'down'
606+ size = 'x-small'
607+ textColor = 'default'
608+ />
605609 </ div >
606610 </ div >
607611 { opened && (
@@ -651,6 +655,10 @@ export type PicklistItemProps = {
651655 value ?: string | number ;
652656 selected ?: boolean ;
653657 disabled ?: boolean ;
658+ icon ?: string ;
659+ iconRight ?: string ;
660+ divider ?: 'top' | 'bottom' ;
661+ onClick ?: ( e : React . SyntheticEvent ) => void ;
654662 children ?: React . ReactNode ;
655663} ;
656664
@@ -662,6 +670,10 @@ export const PicklistItem: FC<PicklistItemProps> = ({
662670 selected : selected_ ,
663671 value,
664672 disabled,
673+ icon,
674+ iconRight,
675+ divider,
676+ onClick : onClick_ ,
665677 children,
666678} ) => {
667679 const { values, multiSelect, onSelect, focusedValue, optionIdPrefix } =
@@ -670,9 +682,10 @@ export const PicklistItem: FC<PicklistItemProps> = ({
670682 selected_ ?? ( value != null ? values . indexOf ( value ) >= 0 : false ) ;
671683 const isFocused = focusedValue === value ;
672684
673- const onClick = useEventCallback ( ( ) => {
685+ const onClick = useEventCallback ( ( e : React . SyntheticEvent ) => {
674686 if ( ! disabled && value != null ) {
675687 onSelect ( value ) ;
688+ onClick_ ?.( e ) ;
676689 }
677690 } ) ;
678691
@@ -687,8 +700,12 @@ export const PicklistItem: FC<PicklistItemProps> = ({
687700 }
688701 ) ;
689702
690- return (
691- < li role = 'presentation' className = 'slds-listbox__item' >
703+ const listItemClassNames = classnames (
704+ 'slds-listbox__item' ,
705+ divider ? `slds-has-divider_${ divider } -space` : undefined
706+ ) ;
707+ const mainListItem = (
708+ < li role = 'presentation' className = { listItemClassNames } >
692709 < div
693710 id = { value ? `${ optionIdPrefix } -${ value } ` : undefined }
694711 className = { itemClassNames }
@@ -700,18 +717,50 @@ export const PicklistItem: FC<PicklistItemProps> = ({
700717 onClick = { onClick }
701718 >
702719 < span className = 'slds-media__figure slds-listbox__option-icon' >
703- { selected && (
704- < span className = 'slds-icon_container slds-icon-utility-check slds-current-color' >
705- < Icon icon = 'check' className = 'slds-icon slds-icon_x-small' />
706- </ span >
707- ) }
720+ { icon ? (
721+ < Icon
722+ category = 'utility'
723+ icon = { icon }
724+ size = 'x-small'
725+ textColor = 'currentColor'
726+ />
727+ ) : selected ? (
728+ < Icon
729+ category = 'utility'
730+ icon = 'check'
731+ size = 'x-small'
732+ textColor = 'currentColor'
733+ />
734+ ) : null }
708735 </ span >
709736 < span className = 'slds-media__body' >
710737 < span className = 'slds-truncate' title = { String ( label || children ) } >
711738 { label || children }
712739 </ span >
713740 </ span >
741+ { iconRight && (
742+ < span className = 'slds-media__figure slds-media__figure_reverse' >
743+ < Icon
744+ category = 'utility'
745+ icon = { iconRight }
746+ size = 'x-small'
747+ textColor = 'currentColor'
748+ />
749+ </ span >
750+ ) }
714751 </ div >
715752 </ li >
716753 ) ;
754+
755+ return (
756+ < >
757+ { divider === 'top' && (
758+ < li className = { `slds-has-divider_${ divider } -space` } role = 'separator' />
759+ ) }
760+ { mainListItem }
761+ { divider === 'bottom' && (
762+ < li className = { `slds-has-divider_${ divider } -space` } role = 'separator' />
763+ ) }
764+ </ >
765+ ) ;
717766} ;
0 commit comments