diff --git a/packages/autocomplete-core/src/getPropGetters.ts b/packages/autocomplete-core/src/getPropGetters.ts index 32ea43b69..29c08cdb8 100644 --- a/packages/autocomplete-core/src/getPropGetters.ts +++ b/packages/autocomplete-core/src/getPropGetters.ts @@ -239,19 +239,29 @@ export function getPropGetters< }; }; - const getLabelProps: GetLabelProps = (rest) => { + const getAutocompleteId = (instanceId: string, sourceId?: number) => { + return typeof sourceId !== 'undefined' + ? `${instanceId}-${sourceId}` + : instanceId; + }; + + const getLabelProps: GetLabelProps = (providedProps) => { + const { sourceIndex, ...rest } = providedProps || {}; + return { - htmlFor: `${props.id}-input`, - id: `${props.id}-label`, + htmlFor: `${getAutocompleteId(props.id, sourceIndex)}-input`, + id: `${getAutocompleteId(props.id, sourceIndex)}-label`, ...rest, }; }; - const getListProps: GetListProps = (rest) => { + const getListProps: GetListProps = (providedProps) => { + const { sourceIndex, ...rest } = providedProps || {}; + return { role: 'listbox', - 'aria-labelledby': `${props.id}-label`, - id: `${props.id}-list`, + 'aria-labelledby': `${getAutocompleteId(props.id, sourceIndex)}-label`, + id: `${getAutocompleteId(props.id, sourceIndex)}-list`, ...rest, }; }; @@ -272,10 +282,12 @@ export function getPropGetters< }; const getItemProps: GetItemProps = (providedProps) => { - const { item, source, ...rest } = providedProps; + const { item, source, sourceIndex, ...rest } = providedProps; return { - id: `${props.id}-item-${item.__autocomplete_id}`, + id: `${getAutocompleteId(props.id, sourceIndex as number)}-item-${ + item.__autocomplete_id + }`, role: 'option', 'aria-selected': store.getState().activeItemId === item.__autocomplete_id, onMouseMove(event) { diff --git a/packages/autocomplete-core/src/types/AutocompletePropGetters.ts b/packages/autocomplete-core/src/types/AutocompletePropGetters.ts index 79e5d5a1b..fcd73c2f8 100644 --- a/packages/autocomplete-core/src/types/AutocompletePropGetters.ts +++ b/packages/autocomplete-core/src/types/AutocompletePropGetters.ts @@ -60,6 +60,7 @@ export type GetFormProps = (props: { export type GetLabelProps = (props?: { [key: string]: unknown; + sourceIndex?: number; }) => { htmlFor: string; id: string; @@ -101,6 +102,7 @@ export type GetPanelProps = (props?: { export type GetListProps = (props?: { [key: string]: unknown; + sourceIndex?: number; }) => { role: string; 'aria-labelledby': string; diff --git a/packages/autocomplete-js/src/__tests__/detached.test.ts b/packages/autocomplete-js/src/__tests__/detached.test.ts index 4f92eacdc..52aeb9789 100644 --- a/packages/autocomplete-js/src/__tests__/detached.test.ts +++ b/packages/autocomplete-js/src/__tests__/detached.test.ts @@ -80,7 +80,7 @@ describe('detached', () => { }); const firstItem = document.querySelector( - '#autocomplete-item-0' + '#autocomplete-0-item-0' ); // Select the first item diff --git a/packages/autocomplete-js/src/__tests__/renderer.test.ts b/packages/autocomplete-js/src/__tests__/renderer.test.ts index 806cb1684..eb3f9b95e 100644 --- a/packages/autocomplete-js/src/__tests__/renderer.test.ts +++ b/packages/autocomplete-js/src/__tests__/renderer.test.ts @@ -215,15 +215,15 @@ describe('renderer', () => { data-autocomplete-source-id="testSource" >
  • 1 diff --git a/packages/autocomplete-js/src/__tests__/templates.test.tsx b/packages/autocomplete-js/src/__tests__/templates.test.tsx index 009fb7e43..cf601e661 100644 --- a/packages/autocomplete-js/src/__tests__/templates.test.tsx +++ b/packages/autocomplete-js/src/__tests__/templates.test.tsx @@ -92,15 +92,15 @@ describe('templates', () => { expect(within(panelContainer).getByRole('listbox')) .toMatchInlineSnapshot(`
    • { expect(within(panelContainer).getByRole('listbox')) .toMatchInlineSnapshot(`
      • {
        • {
          • div diff --git a/packages/autocomplete-js/src/render.tsx b/packages/autocomplete-js/src/render.tsx index cd49b61fe..f33bb337e 100644 --- a/packages/autocomplete-js/src/render.tsx +++ b/packages/autocomplete-js/src/render.tsx @@ -131,7 +131,9 @@ export function renderPanel( className={classNames.list} {...propGetters.getListProps({ state, - props: autocomplete.getListProps({}), + props: autocomplete.getListProps({ + sourceIndex, + }), ...autocompleteScopeApi, })} > @@ -139,6 +141,7 @@ export function renderPanel( const itemProps = autocomplete.getItemProps({ item, source, + sourceIndex, }); return (