Skip to content

Commit ffd9a80

Browse files
(Lookup): try improving interfaces to accept functions
1 parent ed76f4a commit ffd9a80

2 files changed

Lines changed: 60 additions & 31 deletions

File tree

src/scripts/Lookup.tsx

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -745,9 +745,13 @@ type LookupDropdownProps = {
745745
loading?: boolean;
746746
listboxId: string;
747747
dropdownRef: Ref<HTMLDivElement>;
748-
listHeader?: JSX.Element;
748+
listHeader?: (
749+
optionProps: React.HTMLAttributes<HTMLDivElement>
750+
) => JSX.Element;
749751
listHeaderIdSeed: string;
750-
listFooter?: JSX.Element;
752+
listFooter?: (
753+
optionProps: React.HTMLAttributes<HTMLDivElement>
754+
) => JSX.Element;
751755
listFooterIdSeed: string;
752756
filteredData: LookupEntry[];
753757
focusedValue?: string;
@@ -802,16 +806,14 @@ const LookupDropdown: FC<LookupDropdownProps> = ({
802806
onBlur={onBlur}
803807
>
804808
<li role='presentation' className='slds-listbox__item'>
805-
<div
806-
id={getOptionId(listHeaderIdSeed)}
807-
className='slds-listbox__option'
808-
role='option'
809-
aria-selected='true'
810-
tabIndex={0}
811-
onFocus={() => onOptionFocus(listHeaderIdSeed)}
812-
>
813-
{listHeader}
814-
</div>
809+
{listHeader({
810+
id: getOptionId(listHeaderIdSeed),
811+
className: 'slds-listbox__option',
812+
role: 'option',
813+
'aria-selected': 'true',
814+
tabIndex: 0,
815+
onFocus: () => onOptionFocus(listHeaderIdSeed),
816+
})}
815817
</li>
816818
</ul>
817819
) : null}
@@ -847,15 +849,13 @@ const LookupDropdown: FC<LookupDropdownProps> = ({
847849
onBlur={onBlur}
848850
>
849851
<li role='presentation' className='slds-listbox__item'>
850-
<div
851-
id={getOptionId(listFooterIdSeed)}
852-
className='slds-listbox__option'
853-
role='option'
854-
tabIndex={0}
855-
onFocus={() => onOptionFocus(listFooterIdSeed)}
856-
>
857-
{listFooter}
858-
</div>
852+
{listFooter({
853+
id: getOptionId(listFooterIdSeed),
854+
className: 'slds-listbox__option',
855+
role: 'option',
856+
tabIndex: 0,
857+
onFocus: () => onOptionFocus(listFooterIdSeed),
858+
})}
859859
</li>
860860
</ul>
861861
) : null}
@@ -935,8 +935,12 @@ export type LookupProps = {
935935
lookupFilter?: Bivariant<
936936
(entry: LookupEntry, searchText?: string, scope?: string) => boolean
937937
>;
938-
listHeader?: JSX.Element;
939-
listFooter?: JSX.Element;
938+
listHeader?: (
939+
optionProps: React.HTMLAttributes<HTMLDivElement>
940+
) => JSX.Element;
941+
listFooter?: (
942+
optionProps: React.HTMLAttributes<HTMLDivElement>
943+
) => JSX.Element;
940944
tooltip?: ReactNode;
941945
tooltipIcon?: string;
942946

stories/Lookup.stories.tsx

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import CASES from './data/CASES';
1212
import SCOPES from './data/SCOPES';
1313
import { ComponentMeta, ComponentStoryObj } from '@storybook/react';
1414
import { containerDecorator } from './util';
15+
import classnames from 'classnames';
1516

1617
/**
1718
* example data set used for lookup datasource
@@ -373,8 +374,14 @@ export const OpenedWithListHeaderFooter: ComponentStoryObj<typeof Lookup> = {
373374
opened: true,
374375
data: COMPANY_DATA,
375376
selected: null,
376-
listHeader: (
377-
<div className='slds-media slds-media_center slds-listbox__option_entity slds-listbox__option_term'>
377+
listHeader: (optionProps) => (
378+
<div
379+
{...optionProps}
380+
className={classnames(
381+
optionProps.className,
382+
'slds-listbox__option_term slds-media slds-media_center'
383+
)}
384+
>
378385
<span className='slds-media__figure slds-listbox__option-icon'>
379386
<Icon category='utility' icon='search' size='x-small' />
380387
</span>
@@ -385,8 +392,14 @@ export const OpenedWithListHeaderFooter: ComponentStoryObj<typeof Lookup> = {
385392
</span>
386393
</div>
387394
),
388-
listFooter: (
389-
<div className='slds-media slds-media_center slds-listbox__option_entity slds-listbox__option_term'>
395+
listFooter: (optionProps) => (
396+
<div
397+
{...optionProps}
398+
className={classnames(
399+
optionProps.className,
400+
'slds-listbox__option_entity slds-media slds-media_center'
401+
)}
402+
>
390403
<span className='slds-media__figure slds-listbox__option-icon'>
391404
<Icon category='utility' icon='add' size='x-small' />
392405
</span>
@@ -467,8 +480,14 @@ export const DefaultOpenedWithListHeaderFooter: ComponentStoryObj<
467480
defaultOpened: true,
468481
data: COMPANY_DATA,
469482
selected: null,
470-
listHeader: (
471-
<div className='slds-media slds-media_center slds-listbox__option_entity slds-listbox__option_term'>
483+
listHeader: (optionProps) => (
484+
<div
485+
{...optionProps}
486+
className={classnames(
487+
optionProps.className,
488+
'slds-listbox__option_term slds-media slds-media_center'
489+
)}
490+
>
472491
<span className='slds-media__figure slds-listbox__option-icon'>
473492
<Icon category='utility' icon='search' size='x-small' />
474493
</span>
@@ -479,8 +498,14 @@ export const DefaultOpenedWithListHeaderFooter: ComponentStoryObj<
479498
</span>
480499
</div>
481500
),
482-
listFooter: (
483-
<div className='slds-media slds-media_center slds-listbox__option_entity slds-listbox__option_term'>
501+
listFooter: (optionProps) => (
502+
<div
503+
{...optionProps}
504+
className={classnames(
505+
optionProps.className,
506+
'slds-listbox__option_entity slds-media slds-media_center'
507+
)}
508+
>
484509
<span className='slds-media__figure slds-listbox__option-icon'>
485510
<Icon category='utility' icon='add' size='x-small' />
486511
</span>

0 commit comments

Comments
 (0)