Skip to content

Commit 61ee993

Browse files
authored
feat: improve Input accessibility (#1186)
1 parent a1e4a12 commit 61ee993

File tree

5 files changed

+61
-17
lines changed

5 files changed

+61
-17
lines changed

src/SelectInput/Input.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>((props, ref) => {
179179
role: role || 'combobox',
180180
'aria-expanded': open || false,
181181
'aria-haspopup': 'listbox' as const,
182-
'aria-owns': `${id}_list`,
182+
'aria-owns': open ? `${id}_list` : undefined,
183183
'aria-autocomplete': 'list' as const,
184-
'aria-controls': `${id}_list`,
184+
'aria-controls': open ? `${id}_list` : undefined,
185185
'aria-activedescendant': open ? activeDescendantId : undefined,
186186
};
187187

tests/Accessibility.test.tsx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,62 @@ describe('Select.Accessibility', () => {
214214
});
215215
});
216216
});
217+
218+
describe('Select Input attributes', () => {
219+
it('should have correct aria and role attributes by default', () => {
220+
const { container } = render(
221+
<Select
222+
options={[
223+
{
224+
value: '123',
225+
},
226+
{
227+
value: '1234',
228+
},
229+
{
230+
value: '12345',
231+
},
232+
]}
233+
/>,
234+
);
235+
236+
const input = container.querySelector('input');
237+
expect(input).toHaveAttribute('role', 'combobox');
238+
expect(input).toHaveAttribute('aria-expanded', 'false');
239+
expect(input).toHaveAttribute('aria-haspopup', 'listbox');
240+
expect(input).not.toHaveAttribute('aria-owns');
241+
expect(input).toHaveAttribute('aria-autocomplete', 'list');
242+
expect(input).not.toHaveAttribute('aria-controls');
243+
expect(input).not.toHaveAttribute('aria-activedescendant');
244+
});
245+
246+
it('should have correct aria and role attributes when open', () => {
247+
const { container } = render(
248+
<Select
249+
id="select"
250+
open
251+
options={[
252+
{
253+
value: '123',
254+
},
255+
{
256+
value: '1234',
257+
},
258+
{
259+
value: '12345',
260+
},
261+
]}
262+
/>,
263+
);
264+
265+
const input = container.querySelector('input');
266+
expect(input).toHaveAttribute('role', 'combobox');
267+
expect(input).toHaveAttribute('aria-expanded', 'true');
268+
expect(input).toHaveAttribute('aria-haspopup', 'listbox');
269+
expect(input).toHaveAttribute('aria-owns', 'select_list');
270+
expect(input).toHaveAttribute('aria-autocomplete', 'list');
271+
expect(input).toHaveAttribute('aria-controls', 'select_list');
272+
expect(input).toHaveAttribute('aria-activedescendant', 'select_list_0');
273+
});
274+
});
217275
});

tests/__snapshots__/Combobox.test.tsx.snap

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@ exports[`Select.Combobox renders controlled correctly 1`] = `
1515
</div>
1616
<input
1717
aria-autocomplete="list"
18-
aria-controls="test-id_list"
1918
aria-expanded="false"
2019
aria-haspopup="listbox"
21-
aria-owns="test-id_list"
2220
autocomplete="off"
2321
class="rc-select-input"
2422
id="test-id"
@@ -45,10 +43,8 @@ exports[`Select.Combobox renders correctly 1`] = `
4543
</div>
4644
<input
4745
aria-autocomplete="list"
48-
aria-controls="test-id_list"
4946
aria-expanded="false"
5047
aria-haspopup="listbox"
51-
aria-owns="test-id_list"
5248
autocomplete="off"
5349
class="rc-select-input"
5450
id="test-id"

tests/__snapshots__/Select.test.tsx.snap

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,10 @@ exports[`Select.Basic render renders aria-attributes correctly 1`] = `
124124
</div>
125125
<input
126126
aria-autocomplete="list"
127-
aria-controls="test-id_list"
128127
aria-expanded="false"
129128
aria-haspopup="listbox"
130129
aria-label="some-label"
131130
aria-labelledby="test-id"
132-
aria-owns="test-id_list"
133131
autocomplete="off"
134132
class="antd-input"
135133
id="test-id"
@@ -162,10 +160,8 @@ exports[`Select.Basic render renders correctly 1`] = `
162160
</div>
163161
<input
164162
aria-autocomplete="list"
165-
aria-controls="test-id_list"
166163
aria-expanded="false"
167164
aria-haspopup="listbox"
168-
aria-owns="test-id_list"
169165
autocomplete="off"
170166
class="antd-input"
171167
id="test-id"
@@ -200,10 +196,8 @@ exports[`Select.Basic render renders data-attributes correctly 1`] = `
200196
</div>
201197
<input
202198
aria-autocomplete="list"
203-
aria-controls="test-id_list"
204199
aria-expanded="false"
205200
aria-haspopup="listbox"
206-
aria-owns="test-id_list"
207201
autocomplete="off"
208202
class="antd-input"
209203
id="test-id"
@@ -236,10 +230,8 @@ exports[`Select.Basic render renders disabled select correctly 1`] = `
236230
</div>
237231
<input
238232
aria-autocomplete="list"
239-
aria-controls="test-id_list"
240233
aria-expanded="false"
241234
aria-haspopup="listbox"
242-
aria-owns="test-id_list"
243235
autocomplete="off"
244236
class="antd-input"
245237
disabled=""
@@ -271,10 +263,8 @@ exports[`Select.Basic render renders role prop correctly 1`] = `
271263
</div>
272264
<input
273265
aria-autocomplete="list"
274-
aria-controls="test-id_list"
275266
aria-expanded="false"
276267
aria-haspopup="listbox"
277-
aria-owns="test-id_list"
278268
autocomplete="off"
279269
class="antd-input"
280270
id="test-id"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3-
exports[`Select.SSR should work 1`] = `"<div class="rc-select rc-select-single"><div class="rc-select-content"><div class="rc-select-placeholder" style="visibility:visible"></div><input id="test-id" type="search" readonly="" autoComplete="off" class="rc-select-input" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-owns="test-id_list" aria-autocomplete="list" aria-controls="test-id_list" value=""/></div></div>"`;
3+
exports[`Select.SSR should work 1`] = `"<div class="rc-select rc-select-single"><div class="rc-select-content"><div class="rc-select-placeholder" style="visibility:visible"></div><input id="test-id" type="search" readonly="" autoComplete="off" class="rc-select-input" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-autocomplete="list" value=""/></div></div>"`;

0 commit comments

Comments
 (0)