Skip to content

Commit dc3937f

Browse files
Merge branch 'support-slds-2' into fix-issues-with-external-app
2 parents 1520924 + 1c6f3ad commit dc3937f

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed

src/scripts/Picklist.tsx

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)