@@ -173,6 +173,7 @@ export type PicklistProps<MultiSelect extends boolean | undefined> = {
173173 tooltip ?: ReactNode ;
174174 tooltipIcon ?: string ;
175175 elementRef ?: Ref < HTMLDivElement > ;
176+ inputRef ?: Ref < HTMLDivElement > ;
176177 dropdownRef ?: Ref < HTMLDivElement > ;
177178 onValueChange ?: Bivariant <
178179 (
@@ -214,6 +215,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
214215 tooltip,
215216 tooltipIcon,
216217 elementRef : elementRef_ ,
218+ inputRef : inputRef_ ,
217219 dropdownRef : dropdownRef_ ,
218220 onSelect,
219221 onComplete,
@@ -336,6 +338,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
336338 const elRef = useRef < HTMLDivElement | null > ( null ) ;
337339 const elementRef = useMergeRefs ( [ elRef , elementRef_ ] ) ;
338340 const comboboxElRef = useRef < HTMLDivElement | null > ( null ) ;
341+ const inputRef = useMergeRefs ( [ comboboxElRef , inputRef_ ] ) ;
339342 const dropdownElRef = useRef < HTMLDivElement | null > ( null ) ;
340343 const dropdownRef = useMergeRefs ( [ dropdownElRef , dropdownRef_ ] ) ;
341344
@@ -559,7 +562,7 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
559562 role = 'none'
560563 >
561564 < div
562- ref = { comboboxElRef }
565+ ref = { inputRef }
563566 role = 'combobox'
564567 tabIndex = { disabled ? - 1 : 0 }
565568 className = { inputClassNames }
@@ -577,12 +580,13 @@ export const Picklist: (<MultiSelect extends boolean | undefined>(
577580 >
578581 < span className = 'slds-truncate' > { selectedItemLabel } </ span >
579582 </ div >
580- < span className = 'slds-icon_container slds-icon-utility-down slds-input__icon slds-input__icon_right' >
581- < Icon
582- icon = 'down'
583- className = 'slds-icon slds-icon_x-small slds-icon-text-default'
584- />
585- </ span >
583+ < Icon
584+ containerClassName = 'slds-input__icon slds-input__icon_right'
585+ category = 'utility'
586+ icon = 'down'
587+ size = 'x-small'
588+ textColor = 'default'
589+ />
586590 </ div >
587591 { opened && (
588592 < div
@@ -623,6 +627,10 @@ export type PicklistItemProps = {
623627 value ?: string | number ;
624628 selected ?: boolean ;
625629 disabled ?: boolean ;
630+ icon ?: string ;
631+ iconRight ?: string ;
632+ divider ?: 'top' | 'bottom' ;
633+ onClick ?: ( e : React . SyntheticEvent ) => void ;
626634 children ?: React . ReactNode ;
627635} ;
628636
@@ -634,6 +642,10 @@ export const PicklistItem: FC<PicklistItemProps> = ({
634642 selected : selected_ ,
635643 value,
636644 disabled,
645+ icon,
646+ iconRight,
647+ divider,
648+ onClick : onClick_ ,
637649 children,
638650} ) => {
639651 const { values, multiSelect, onSelect, focusedValue, optionIdPrefix } =
@@ -642,9 +654,10 @@ export const PicklistItem: FC<PicklistItemProps> = ({
642654 selected_ ?? ( value != null ? values . indexOf ( value ) >= 0 : false ) ;
643655 const isFocused = focusedValue === value ;
644656
645- const onClick = useEventCallback ( ( ) => {
657+ const onClick = useEventCallback ( ( e : React . SyntheticEvent ) => {
646658 if ( ! disabled && value != null ) {
647659 onSelect ( value ) ;
660+ onClick_ ?.( e ) ;
648661 }
649662 } ) ;
650663
@@ -659,8 +672,12 @@ export const PicklistItem: FC<PicklistItemProps> = ({
659672 }
660673 ) ;
661674
662- return (
663- < li role = 'presentation' className = 'slds-listbox__item' >
675+ const listItemClassNames = classnames (
676+ 'slds-listbox__item' ,
677+ divider ? `slds-has-divider_${ divider } -space` : undefined
678+ ) ;
679+ const mainListItem = (
680+ < li role = 'presentation' className = { listItemClassNames } >
664681 < div
665682 id = { value ? `${ optionIdPrefix } -${ value } ` : undefined }
666683 className = { itemClassNames }
@@ -672,18 +689,50 @@ export const PicklistItem: FC<PicklistItemProps> = ({
672689 onClick = { onClick }
673690 >
674691 < span className = 'slds-media__figure slds-listbox__option-icon' >
675- { selected && (
676- < span className = 'slds-icon_container slds-icon-utility-check slds-current-color' >
677- < Icon icon = 'check' className = 'slds-icon slds-icon_x-small' />
678- </ span >
679- ) }
692+ { icon ? (
693+ < Icon
694+ category = 'utility'
695+ icon = { icon }
696+ size = 'x-small'
697+ textColor = 'currentColor'
698+ />
699+ ) : selected ? (
700+ < Icon
701+ category = 'utility'
702+ icon = 'check'
703+ size = 'x-small'
704+ textColor = 'currentColor'
705+ />
706+ ) : null }
680707 </ span >
681708 < span className = 'slds-media__body' >
682709 < span className = 'slds-truncate' title = { String ( label || children ) } >
683710 { label || children }
684711 </ span >
685712 </ span >
713+ { iconRight && (
714+ < span className = 'slds-media__figure slds-media__figure_reverse' >
715+ < Icon
716+ category = 'utility'
717+ icon = { iconRight }
718+ size = 'x-small'
719+ textColor = 'currentColor'
720+ />
721+ </ span >
722+ ) }
686723 </ div >
687724 </ li >
688725 ) ;
726+
727+ return (
728+ < >
729+ { divider === 'top' && (
730+ < li className = { `slds-has-divider_${ divider } -space` } role = 'separator' />
731+ ) }
732+ { mainListItem }
733+ { divider === 'bottom' && (
734+ < li className = { `slds-has-divider_${ divider } -space` } role = 'separator' />
735+ ) }
736+ </ >
737+ ) ;
689738} ;
0 commit comments