Skip to content

Commit 790ec35

Browse files
Fix(accessibility):fix sa11y accessibility issue for combobox duplicate id & scrollable-region-focusable (#5147)
* Fix(accessibility) fix sa11y accessibility issue for combobox duplicate ID & scrollable * release version added * placeholder text updated * addressed review comments * release notes updated * group id updated * changed to const * removed comment * refactored the code * code refactored * code refactoring done. * review comments for group unique id addressed. * comments removed * added variables in loop and removed redundant code
1 parent 4a936d2 commit 790ec35

File tree

10 files changed

+111
-91
lines changed

10 files changed

+111
-91
lines changed

ui/components/combobox/RELEASENOTES.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
# Combobox Release Notes
44

55
<!-- ## [Unreleased] -->
6+
## 2.21.0
7+
### Fixed
8+
- Fixed by adding tabindex for `scrollable region must have keyboard access` wcag issue
9+
- Fixed by adding dynamic Ids for duplicate-id-aria issue
10+
- Fixed by adding unique Ids,aria-label for `aria-allowed-attr` wcag issue
611

712
## 2.17.3
813

ui/components/combobox/autocomplete/example.jsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export default [
4747
)
4848
}
4949
];
50-
50+
const newStateID =_.uniqueId('listbox-id-');
5151
export let states = [
5252
{
5353
context: STORY_SINK_CONTEXT,
@@ -88,7 +88,7 @@ export let states = [
8888
label: 'Lookup - Focused - Open',
8989
element: (
9090
<Combobox
91-
id={_.uniqueId('combobox-id-')}
91+
id={newStateID}
9292
aria-controls="listbox-id-15"
9393
autocomplete
9494
inputIconPosition="right"
@@ -107,6 +107,8 @@ export let states = [
107107
snapshot={Snapshot.EntityOptions}
108108
type="entity"
109109
count={2}
110+
aria-labelledby={newStateID}
111+
aria-label="{{Placeholder for Menu Items}}"
110112
/>
111113
}
112114
resultsType="listbox"
@@ -261,7 +263,7 @@ export let states = [
261263
element: (
262264
<Combobox
263265
id={_.uniqueId('combobox-id-')}
264-
aria-controls="listbox-unique-id-03"
266+
aria-controls="listbox-id-20"
265267
autocomplete
266268
inputIconPosition="right"
267269
rightInputIcon={
@@ -274,7 +276,7 @@ export let states = [
274276
}
275277
results={
276278
<Listbox
277-
id="listbox-unique-id-03"
279+
id="listbox-id-20"
278280
snapshot={Snapshot.PlainOptions}
279281
type="entity"
280282
count={3}

ui/components/combobox/base/example.jsx

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ import { StandardIcon } from '../../icons/standard/example';
1717
import Grid, { Column } from '../../../utilities/grid/docs/Grid';
1818
import _ from '../../../shared/helpers';
1919
import * as Snapshot from '../snapshots.data';
20+
import uniqueId from 'lodash.uniqueid';
2021

2122
/* -----------------------------------------------------------------------------
2223
Variables
2324
----------------------------------------------------------------------------- */
2425
const STORY_SINK_CONTEXT = 'Select-Only (Base)';
25-
const listboxOptionId01 = 'listbox-option-unique-id-01';
26-
const listboxOptionId02 = 'listbox-option-unique-id-02';
26+
const listboxOptionId01 = uniqueId('option');
27+
const listboxOptionId02 = uniqueId('option');
2728

2829
/* -----------------------------------------------------------------------------
2930
Private
@@ -33,7 +34,7 @@ export const ListboxDropdown = props => (
3334
<DeprecatedListbox
3435
listboxClassName="slds-dropdown slds-dropdown_fluid"
3536
vertical
36-
id="listbox-unique-id"
37+
id="listbox-unique-id-03"
3738
>
3839
<DeprecatedListboxItem>
3940
<DeprecatedEntityOption
@@ -53,35 +54,38 @@ export const ListboxDropdown = props => (
5354
</DeprecatedListbox>
5455
);
5556

56-
const ComboBoxDefault = props => (
57-
<Combobox
58-
id={_.uniqueId('combobox-id-')}
59-
aria-controls="listbox-id-1"
60-
inputIconPosition="right"
61-
rightInputIcon={
62-
<UtilityIcon
63-
symbol="down"
64-
className="slds-icon slds-icon_x-small slds-icon-text-default"
65-
containerClassName="slds-input__icon slds-input__icon_right"
66-
assistiveText={false}
67-
title={false}
68-
/>
69-
}
70-
results={
71-
<Listbox
72-
id="listbox-id-1"
73-
snapshot={Snapshot.ObjectOptions}
74-
type="plain"
75-
count={8}
76-
visualSelection
77-
/>
78-
}
79-
resultsType="listbox"
80-
hasInteractions
81-
selectOnly
82-
{...props}
83-
/>
84-
)
57+
const ComboBoxDefault = props => {
58+
const comboboxDefaultID = uniqueId('listbox-id-');
59+
return (
60+
<Combobox
61+
id={_.uniqueId('combobox-id-')}
62+
aria-controls={comboboxDefaultID}
63+
inputIconPosition="right"
64+
rightInputIcon={
65+
<UtilityIcon
66+
symbol="down"
67+
className="slds-icon slds-icon_x-small slds-icon-text-default"
68+
containerClassName="slds-input__icon slds-input__icon_right"
69+
assistiveText={false}
70+
title={false}
71+
/>
72+
}
73+
results={
74+
<Listbox
75+
id={comboboxDefaultID}
76+
snapshot={Snapshot.ObjectOptions}
77+
type="plain"
78+
count={8}
79+
visualSelection
80+
/>
81+
}
82+
resultsType="listbox"
83+
hasInteractions
84+
selectOnly
85+
{...props}
86+
/>
87+
);
88+
};
8589

8690
/* -----------------------------------------------------------------------------
8791
Exports

ui/components/combobox/deprecated-inline-listbox/example.jsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import {
1010
DeprecatedListboxItem,
1111
DeprecatedEntityOption
1212
} from '../deprecated';
13+
import uniqueId from 'lodash.uniqueid';
1314

1415
/* -----------------------------------------------------------------------------
1516
Variables
1617
----------------------------------------------------------------------------- */
1718
const STORY_SINK_CONTEXT = 'Deprecated – Inline-Listbox';
18-
const listboxOptionId01 = 'listbox-option-unique-id-01';
19-
const listboxOptionId02 = 'listbox-option-unique-id-02';
19+
const listboxOptionId01 = uniqueId('listbox-option-unique-id-');
20+
const listboxOptionId02 = uniqueId('listbox-option-unique-id-');
2021

2122
/* -----------------------------------------------------------------------------
2223
Private
@@ -26,7 +27,7 @@ const ListboxDropdown = props => (
2627
<DeprecatedListbox
2728
listboxClassName="slds-dropdown slds-dropdown_fluid"
2829
vertical
29-
id="listbox-unique-id"
30+
id="listbox-unique-id-03"
3031
>
3132
<DeprecatedListboxItem>
3233
<DeprecatedEntityOption

ui/components/combobox/deprecated-multi-entity/example.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import {
1212
import { ListboxPills, ListboxPillsItem, ListboxPill } from '../../pills';
1313

1414
const STORY_SINK_CONTEXT = 'Deprecated – Multi-Entity';
15-
const listboxOptionId01 = 'listbox-option-unique-id-01';
16-
const listboxOptionId02 = 'listbox-option-unique-id-02';
15+
const listboxOptionId01 = 'option1';
16+
const listboxOptionId02 = 'option2';
1717

1818
const ListboxDropdown = props => (
1919
<DeprecatedListbox

ui/components/combobox/deprecated/index.jsx

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { UtilityIcon } from '../../icons/base/example';
1010
import { Spinner } from '../../spinners/base/example';
1111
import classNames from 'classnames';
1212
import _ from '../../../shared/helpers';
13-
1413
/**
1514
* Object switcher is a popup menu button, its visually displayed inlined with
1615
* its adjacent objects. A "polymorphic" combobox example uses this.
@@ -98,11 +97,7 @@ export const DeprecatedComboboxInputElement = ({
9897
id={id || comboboxId}
9998
aria-activedescendant={props['aria-activedescendant']}
10099
aria-autocomplete={autocomplete ? 'list' : null}
101-
aria-controls={
102-
props.listbox
103-
? props['aria-controls'] || props.listboxId
104-
: props['aria-controls'] || 'please-provide-listbox-id-here'
105-
}
100+
aria-controls="listbox-unique-id-03"
106101
autocomplete="off"
107102
role="combobox"
108103
aria-expanded={isOpen ? 'true' : 'false'}
@@ -324,10 +319,11 @@ export const DeprecatedCombobox = props => {
324319
*/
325320
export let DeprecatedListbox = props => (
326321
<div
327-
id={props.id || 'listbox-unique-id'}
322+
id={props.id || 'listbox-unique-id-03'}
328323
role="listbox"
329324
aria-orientation={props.horizontal || props.inline ? 'horizontal' : null}
330325
className={props.listboxClassName}
326+
aria-label="{{Placeholder for Dropdown Options}}"
331327
>
332328
<ul
333329
className={classNames(
@@ -367,11 +363,11 @@ export let DeprecatedListboxItem = props => (
367363
* @prop {string} className - A CSS class for the outer element
368364
*/
369365
export let DeprecatedListboxOption = props => {
370-
const uniqueId = _.uniqueId('listbox-option-unique-id-');
366+
371367

372368
return (
373369
<div
374-
id={props.id || uniqueId}
370+
id={props.id || _.uniqueId('listbox-option-unique-id-')}
375371
className={classNames(
376372
'slds-media slds-listbox__option',
377373
{

0 commit comments

Comments
 (0)