Skip to content

Commit 1c6f3ad

Browse files
authored
Merge pull request #492 from mashmatrix/support-slds-2-restore-props
Restore props for SLDS2
2 parents bf49d8d + 35a62a5 commit 1c6f3ad

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
@@ -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

Comments
 (0)