Skip to content

Commit 2c5e03d

Browse files
authored
fix(icon-button): ensure aria-pressed is set according to isSelected (#18829)
1 parent 9643c7a commit 2c5e03d

File tree

6 files changed

+35
-20
lines changed

6 files changed

+35
-20
lines changed

packages/react/src/components/Button/ButtonBase.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ const ButtonBase = React.forwardRef(function ButtonBase<
5151
[`${prefix}--btn--${kind}`]: kind,
5252
[`${prefix}--btn--disabled`]: disabled,
5353
[`${prefix}--btn--expressive`]: isExpressive,
54-
[`${prefix}--btn--icon-only`]:
55-
hasIconOnly && !className?.includes(`${prefix}--btn--icon-only`),
54+
[`${prefix}--btn--icon-only`]: hasIconOnly,
5655
[`${prefix}--btn--selected`]: hasIconOnly && isSelected && kind === 'ghost',
5756
});
5857

packages/react/src/components/DataTable/__tests__/__snapshots__/DataTable-test.js.snap

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ exports[`DataTable behaves as expected selection should render and match snapsho
572572
aria-expanded="false"
573573
aria-haspopup="true"
574574
aria-labelledby="tooltip-:r2t:"
575-
class="cds--btn--icon-only cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost"
575+
class="cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost cds--btn--icon-only"
576576
title="Settings"
577577
type="button"
578578
>
@@ -1005,7 +1005,7 @@ exports[`DataTable renders as expected - Component API should render and match s
10051005
aria-expanded="false"
10061006
aria-haspopup="true"
10071007
aria-labelledby="tooltip-:rm:"
1008-
class="cds--btn--icon-only cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost"
1008+
class="cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost cds--btn--icon-only"
10091009
title="Settings"
10101010
type="button"
10111011
>

packages/react/src/components/DataTable/__tests__/__snapshots__/TableToolbarMenu-test.js.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ exports[`TableToolbarMenu renders as expected - Component API should render 1`]
1515
aria-expanded="false"
1616
aria-haspopup="true"
1717
aria-labelledby="tooltip-:r1:"
18-
class="cds--btn--icon-only custom-class cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost"
18+
class="custom-class cds--toolbar-action cds--overflow-menu cds--overflow-menu cds--overflow-menu--md cds--btn cds--btn--md cds--layout--size-md cds--btn--ghost cds--btn--icon-only"
1919
title="Add"
2020
type="button"
2121
>

packages/react/src/components/IconButton/IconButton.stories.js

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,9 @@ export default {
3737
};
3838

3939
const DefaultStory = (props) => {
40-
const { align, defaultOpen, disabled, kind, label, size } = props;
4140
return (
4241
<div style={{ margin: '3rem' }}>
43-
<IconButton
44-
align={align}
45-
defaultOpen={defaultOpen}
46-
disabled={disabled}
47-
kind={kind}
48-
label={label}
49-
size={size}>
42+
<IconButton {...props}>
5043
<Edit />
5144
</IconButton>
5245
</div>

packages/react/src/components/IconButton/__tests__/IconButton-test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,31 @@ describe('IconButton', () => {
7878
);
7979
expect(ref).toHaveBeenCalledWith(screen.getByTestId('icon-button'));
8080
});
81+
82+
it('should set aria-pressed="true" if props.isSelected="true" and props.kind="ghost" ', () => {
83+
const { rerender } = render(
84+
<IconButton label="edit" kind="ghost" isSelected={true}>
85+
<Edit />
86+
</IconButton>
87+
);
88+
expect(screen.getByRole('button')).toHaveAttribute('aria-pressed', 'true');
89+
});
90+
91+
it('should set aria-pressed="false" if props.isSelected="false" and props.kind="ghost" ', () => {
92+
const { rerender } = render(
93+
<IconButton label="edit" kind="ghost" isSelected={false}>
94+
<Edit />
95+
</IconButton>
96+
);
97+
expect(screen.getByRole('button')).toHaveAttribute('aria-pressed', 'false');
98+
});
99+
100+
it('should not set aria-pressed if props.isSelected is provided but props.kind is not "ghost" ', () => {
101+
const { rerender } = render(
102+
<IconButton label="edit" kind="primary" isSelected={true}>
103+
<Edit />
104+
</IconButton>
105+
);
106+
expect(screen.getByRole('button')).not.toHaveAttribute('aria-pressed');
107+
});
81108
});

packages/react/src/components/IconButton/index.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -230,13 +230,9 @@ const IconButton = React.forwardRef(function IconButton(
230230
kind={kind}
231231
ref={ref}
232232
size={size}
233-
className={classNames(
234-
`${prefix}--btn--icon-only`,
235-
{
236-
[`${prefix}--btn--selected`]: isSelected,
237-
},
238-
className
239-
)}
233+
isSelected={isSelected}
234+
hasIconOnly
235+
className={className}
240236
aria-describedby={badgeCount && badgeId}>
241237
{children}
242238
{!disabled && badgeCount !== undefined && (

0 commit comments

Comments
 (0)