Skip to content

Commit b57b3af

Browse files
authored
Allow custom aria-describedby on checkbox and radio group items (#4778)
1 parent d3fcad8 commit b57b3af

File tree

4 files changed

+24
-6
lines changed

4 files changed

+24
-6
lines changed

packages/@react-aria/checkbox/src/useCheckboxGroupItem.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export function useCheckboxGroupItem(props: AriaCheckboxGroupItemProps, state: C
5353
inputProps: {
5454
...res.inputProps,
5555
'aria-describedby': [
56+
props['aria-describedby'],
5657
state.validationState === 'invalid' ? checkboxGroupErrorMessageIds.get(state) : null,
5758
checkboxGroupDescriptionIds.get(state)
5859
].filter(Boolean).join(' ') || undefined

packages/@react-aria/radio/src/useRadio.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export function useRadio(props: AriaRadioProps, state: RadioGroupState, ref: Ref
8484
value,
8585
onChange,
8686
'aria-describedby': [
87+
props['aria-describedby'],
8788
state.validationState === 'invalid' ? radioGroupErrorMessageIds.get(state) : null,
8889
radioGroupDescriptionIds.get(state)
8990
].filter(Boolean).join(' ') || undefined

packages/react-aria-components/test/CheckboxGroup.test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,12 @@ describe('CheckboxGroup', () => {
193193
let label = document.getElementById(group.getAttribute('aria-labelledby'));
194194
expect(label).toHaveAttribute('data-required', 'true');
195195
});
196+
197+
it('should support aria-describedby on a checkbox', () => {
198+
let {getAllByRole} = renderGroup({}, {'aria-describedby': 'test'});
199+
let checkboxes = getAllByRole('checkbox');
200+
for (let checkbox of checkboxes) {
201+
expect(checkbox).toHaveAttribute('aria-describedby', 'test');
202+
}
203+
});
196204
});

packages/react-aria-components/test/RadioGroup.test.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ describe('RadioGroup', () => {
283283
let labelA = radios[0].closest('label');
284284
let labelB = radios[1].closest('label');
285285
let labelC = radios[2].closest('label');
286-
286+
287287
const expectNotFocused = (...labels) => {
288288
labels.forEach((label) => {
289289
expect(label).not.toHaveAttribute('data-focus-visible');
@@ -292,7 +292,7 @@ describe('RadioGroup', () => {
292292
};
293293

294294
expectNotFocused(labelA, labelB, labelC);
295-
295+
296296
userEvent.tab();
297297
expect(document.activeElement).toBe(radios[0]);
298298
expect(labelA).toHaveAttribute('data-focus-visible', 'true');
@@ -316,7 +316,7 @@ describe('RadioGroup', () => {
316316
<Modal data-test="modal">
317317
<Dialog role="alertdialog" data-test="dialog">
318318
{({close}) => (
319-
<>
319+
<>
320320
<TestRadioGroup radioProps={{className: ({isFocusVisible}) => isFocusVisible ? 'focus' : ''}} />
321321
<Button onPress={close}>Close</Button>
322322
</>
@@ -330,7 +330,7 @@ describe('RadioGroup', () => {
330330
userEvent.click(trigger);
331331

332332
let dialog = getByRole('alertdialog');
333-
333+
334334
let radios = within(dialog).getAllByRole('radio');
335335
let labelA = radios[0].closest('label');
336336
let labelB = radios[1].closest('label');
@@ -344,10 +344,10 @@ describe('RadioGroup', () => {
344344
};
345345

346346
expectNotFocused(labelA, labelB, labelC);
347-
347+
348348
userEvent.tab();
349349
expect(document.activeElement).toBe(radios[0]);
350-
expect(labelA).toHaveAttribute('data-focus-visible', 'true');
350+
expect(labelA).toHaveAttribute('data-focus-visible', 'true');
351351
expect(labelA).toHaveClass('focus');
352352
expectNotFocused(labelB, labelC);
353353

@@ -362,4 +362,12 @@ describe('RadioGroup', () => {
362362
expect(labelC).toHaveClass('focus');
363363
expectNotFocused(labelA, labelB);
364364
});
365+
366+
it('should support aria-describedby on a radio', () => {
367+
let {getAllByRole} = renderGroup({}, {'aria-describedby': 'test'});
368+
let radios = getAllByRole('radio');
369+
for (let radio of radios) {
370+
expect(radio).toHaveAttribute('aria-describedby', 'test');
371+
}
372+
});
365373
});

0 commit comments

Comments
 (0)