Skip to content

Commit c5ad5f8

Browse files
authored
feat(MenuToggle): add aria-haspopup prop (#12549)
* feat(MenuToggle): add aria-haspopup prop Adds the aria-haspopup prop to MenuToggle with a default value of 'menu'. Updates all Select implementations across examples and demos to explicitly pass aria-haspopup="listbox" to properly reflect their semantic role, addressing issue #11792 (PF-1704). * fix(MenuToggle): address review feedback on aria-haspopup prop - Remove 'dialog' from aria-haspopup type definition - Update JSDoc comment as suggested - Fix lint errors by placing aria-haspopup on its own line - Set aria-haspopup={false} on static MenuToggle examples - Update snapshots * fix(MenuToggle): update react-templates and react-table snapshots
1 parent 1e942d8 commit c5ad5f8

48 files changed

Lines changed: 165 additions & 32 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/react-core/src/components/DatePicker/__tests__/__snapshots__/DatePicker.test.tsx.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ exports[`With popover opened 1`] = `
137137
</span>
138138
<button
139139
aria-expanded="false"
140+
aria-haspopup="menu"
140141
class="pf-v6-c-menu-toggle"
141142
data-ouia-component-id="OUIA-Generated-MenuToggle-:r10:"
142143
data-ouia-component-type="PF6/MenuToggle"

packages/react-core/src/components/Form/examples/FormState.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export const FormState = () => {
6565
isOpen={isSelectOpen}
6666
toggle={(toggleRef) => (
6767
<MenuToggle
68+
aria-haspopup="listbox"
6869
ref={toggleRef}
6970
onClick={(isOpen) => setIsSelectOpen(isOpen)}
7071
isExpanded={isSelectOpen}

packages/react-core/src/components/LoginPage/examples/LoginPageLanguageSelect.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ export const LoginPageLanguageSelect: React.FunctionComponent = () => {
8282
aria-label="Select Language"
8383
toggle={(toggleRef: React.Ref<MenuToggleElement>) => (
8484
<MenuToggle
85+
aria-haspopup="listbox"
8586
ref={toggleRef}
8687
onClick={() => setIsHeaderUtilsOpen(!isHeaderUtilsOpen)}
8788
isExpanded={isHeaderUtilsOpen}

packages/react-core/src/components/MenuToggle/MenuToggle.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ export interface MenuToggleProps
7373
badge?: BadgeProps | React.ReactNode;
7474
/** Adds styling which affects the size of the menu toggle */
7575
size?: 'default' | 'sm';
76+
/** Indicates what type of popup will be triggered by the menu toggle. A value of true is the same as a value of "menu". */
77+
'aria-haspopup'?: 'menu' | 'listbox' | boolean;
7678
/** @hide Forwarded ref */
7779
innerRef?: React.Ref<MenuToggleElement>;
7880
/** Value to overwrite the randomly generated data-ouia-component-id. It will always target the toggle button. */
@@ -95,7 +97,8 @@ class MenuToggleBase extends Component<MenuToggleProps> {
9597
isDocked: false,
9698
isTextExpanded: false,
9799
size: 'default',
98-
ouiaSafe: true
100+
ouiaSafe: true,
101+
'aria-haspopup': 'menu'
99102
};
100103

101104
render() {
@@ -121,6 +124,7 @@ class MenuToggleBase extends Component<MenuToggleProps> {
121124
innerRef,
122125
onClick,
123126
'aria-label': ariaLabel,
127+
'aria-haspopup': ariaHasPopup,
124128
ouiaId,
125129
ouiaSafe,
126130
size,
@@ -171,6 +175,7 @@ class MenuToggleBase extends Component<MenuToggleProps> {
171175
type="button"
172176
className={css(styles.menuToggleButton)}
173177
aria-expanded={isExpanded}
178+
aria-haspopup={ariaHasPopup}
174179
onClick={onClick}
175180
aria-label={ariaLabel || 'Menu toggle'}
176181
tabIndex={-1}
@@ -231,6 +236,7 @@ class MenuToggleBase extends Component<MenuToggleProps> {
231236
className={css(styles.menuToggleButton, children && styles.modifiers.text)}
232237
type="button"
233238
aria-expanded={isExpanded}
239+
aria-haspopup={ariaHasPopup}
234240
aria-label={ariaLabel}
235241
disabled={isDisabled}
236242
onClick={onClick}
@@ -249,6 +255,7 @@ class MenuToggleBase extends Component<MenuToggleProps> {
249255
className={css(commonStyles, isCircle && isPlain && styles.modifiers.circle)}
250256
type="button"
251257
aria-label={ariaLabel}
258+
aria-haspopup={ariaHasPopup}
252259
aria-expanded={isExpanded}
253260
ref={innerRef as React.Ref<HTMLButtonElement>}
254261
disabled={isDisabled}

packages/react-core/src/components/MenuToggle/__tests__/__snapshots__/MenuToggle.test.tsx.snap

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ exports[`Old Snapshot tests - remove when refactoring passes additional classes
44
<DocumentFragment>
55
<button
66
aria-expanded="false"
7+
aria-haspopup="menu"
78
class="pf-v6-c-menu-toggle test-class"
89
data-ouia-component-id="OUIA-Generated-MenuToggle-:r3:"
910
data-ouia-component-type="PF6/MenuToggle"
@@ -44,6 +45,7 @@ exports[`Old Snapshot tests - remove when refactoring renders successfully 1`] =
4445
<DocumentFragment>
4546
<button
4647
aria-expanded="false"
48+
aria-haspopup="menu"
4749
class="pf-v6-c-menu-toggle"
4850
data-ouia-component-id="OUIA-Generated-MenuToggle-:r1:"
4951
data-ouia-component-type="PF6/MenuToggle"
@@ -84,6 +86,7 @@ exports[`Old Snapshot tests - remove when refactoring shows badge 1`] = `
8486
<DocumentFragment>
8587
<button
8688
aria-expanded="false"
89+
aria-haspopup="menu"
8790
class="pf-v6-c-menu-toggle"
8891
data-ouia-component-id="OUIA-Generated-MenuToggle-:rh:"
8992
data-ouia-component-type="PF6/MenuToggle"
@@ -133,6 +136,7 @@ exports[`Old Snapshot tests - remove when refactoring shows icon 1`] = `
133136
<DocumentFragment>
134137
<button
135138
aria-expanded="false"
139+
aria-haspopup="menu"
136140
class="pf-v6-c-menu-toggle"
137141
data-ouia-component-id="OUIA-Generated-MenuToggle-:rf:"
138142
data-ouia-component-type="PF6/MenuToggle"
@@ -190,6 +194,7 @@ exports[`Old Snapshot tests - remove when refactoring shows isDisabled 1`] = `
190194
<DocumentFragment>
191195
<button
192196
aria-expanded="false"
197+
aria-haspopup="menu"
193198
class="pf-v6-c-menu-toggle pf-m-disabled"
194199
data-ouia-component-id="OUIA-Generated-MenuToggle-:r7:"
195200
data-ouia-component-type="PF6/MenuToggle"
@@ -231,6 +236,7 @@ exports[`Old Snapshot tests - remove when refactoring shows isExpanded 1`] = `
231236
<DocumentFragment>
232237
<button
233238
aria-expanded="true"
239+
aria-haspopup="menu"
234240
class="pf-v6-c-menu-toggle pf-m-expanded"
235241
data-ouia-component-id="OUIA-Generated-MenuToggle-:r5:"
236242
data-ouia-component-type="PF6/MenuToggle"
@@ -271,6 +277,7 @@ exports[`Old Snapshot tests - remove when refactoring shows isPlain 1`] = `
271277
<DocumentFragment>
272278
<button
273279
aria-expanded="false"
280+
aria-haspopup="menu"
274281
class="pf-v6-c-menu-toggle pf-m-plain"
275282
data-ouia-component-id="OUIA-Generated-MenuToggle-plain-:rb:"
276283
data-ouia-component-type="PF6/MenuToggle"
@@ -302,6 +309,7 @@ exports[`Old Snapshot tests - remove when refactoring shows isPrimary 1`] = `
302309
<DocumentFragment>
303310
<button
304311
aria-expanded="false"
312+
aria-haspopup="menu"
305313
class="pf-v6-c-menu-toggle pf-m-primary"
306314
data-ouia-component-id="OUIA-Generated-MenuToggle-primary-:r9:"
307315
data-ouia-component-type="PF6/MenuToggle"
@@ -342,6 +350,7 @@ exports[`Old Snapshot tests - remove when refactoring shows plain text 1`] = `
342350
<DocumentFragment>
343351
<button
344352
aria-expanded="false"
353+
aria-haspopup="menu"
345354
class="pf-v6-c-menu-toggle pf-m-plain pf-m-text"
346355
data-ouia-component-id="OUIA-Generated-MenuToggle-plainText-:rd:"
347356
data-ouia-component-type="PF6/MenuToggle"

packages/react-core/src/components/MenuToggle/examples/MenuToggleAvatarText.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.sv
44

55
export const MenuToggleAvatarText: React.FunctionComponent = () => (
66
<Fragment>
7-
<MenuToggle icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />}>Ned Username</MenuToggle>{' '}
8-
<MenuToggle icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />} isExpanded>
7+
<MenuToggle aria-haspopup={false} icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />}>
98
Ned Username
109
</MenuToggle>{' '}
11-
<MenuToggle icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />} isDisabled>
10+
<MenuToggle aria-haspopup={false} icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />} isExpanded>
11+
Ned Username
12+
</MenuToggle>{' '}
13+
<MenuToggle aria-haspopup={false} icon={<Avatar src={imgAvatar} alt="avatar" size="sm" />} isDisabled>
1214
Ned Username
1315
</MenuToggle>
1416
</Fragment>

packages/react-core/src/components/MenuToggle/examples/MenuToggleBadge.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ import { MenuToggle, Badge } from '@patternfly/react-core';
33

44
export const MenuToggleBadge: React.FunctionComponent = () => (
55
<Fragment>
6-
<MenuToggle badge={<Badge>4 selected</Badge>}>Count</MenuToggle>
7-
<MenuToggle variant="plainText" badge={<Badge screenReaderText="additional items">4</Badge>} />
6+
<MenuToggle aria-haspopup={false} badge={<Badge>4 selected</Badge>}>
7+
Count
8+
</MenuToggle>
9+
<MenuToggle
10+
aria-haspopup={false}
11+
variant="plainText"
12+
badge={<Badge screenReaderText="additional items">4</Badge>}
13+
/>
814
</Fragment>
915
);
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
import { MenuToggle } from '@patternfly/react-core';
22

3-
export const MenuToggleCollapsed: React.FunctionComponent = () => <MenuToggle>Collapsed</MenuToggle>;
3+
export const MenuToggleCollapsed: React.FunctionComponent = () => (
4+
<MenuToggle aria-haspopup={false}>Collapsed</MenuToggle>
5+
);

packages/react-core/src/components/MenuToggle/examples/MenuToggleCustomIcon.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import RhUiAddIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-add-icon';
44

55
export const MenuToggleCustomIcon: React.FC = () => (
66
<Fragment>
7-
<MenuToggle icon={<RhUiAddIcon />} variant="primary">
7+
<MenuToggle aria-haspopup={false} icon={<RhUiAddIcon />} variant="primary">
88
Icon
99
</MenuToggle>{' '}
10-
<MenuToggle icon={<RhUiAddIcon />} variant="secondary">
10+
<MenuToggle aria-haspopup={false} icon={<RhUiAddIcon />} variant="secondary">
1111
Icon
1212
</MenuToggle>{' '}
13-
<MenuToggle icon={<RhUiAddIcon />} variant="secondary" isDisabled>
13+
<MenuToggle aria-haspopup={false} icon={<RhUiAddIcon />} variant="secondary" isDisabled>
1414
Icon
1515
</MenuToggle>
1616
</Fragment>
Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
import { MenuToggle } from '@patternfly/react-core';
22

3-
export const MenuToggleDisabled: React.FunctionComponent = () => <MenuToggle isDisabled>Disabled</MenuToggle>;
3+
export const MenuToggleDisabled: React.FunctionComponent = () => (
4+
<MenuToggle aria-haspopup={false} isDisabled>
5+
Disabled
6+
</MenuToggle>
7+
);

0 commit comments

Comments
 (0)