Skip to content

Commit a9a8d05

Browse files
committed
feat(ui-menu): add prop to focus first element on open
INSTUI-4376
1 parent 82b2129 commit a9a8d05

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

packages/ui-menu/src/Menu/index.tsx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ class Menu extends Component<MenuProps> {
8282
shouldFocusTriggerOnClose: true,
8383
withArrow: true,
8484
offsetX: 0,
85-
offsetY: 0
85+
offsetY: 0,
86+
focusFirsItemOnOpen: false
8687
}
8788

8889
static Item = MenuItem
@@ -455,7 +456,8 @@ class Menu extends Component<MenuProps> {
455456
onMouseOver,
456457
positionContainerDisplay,
457458
offsetX,
458-
offsetY
459+
offsetY,
460+
focusFirsItemOnOpen
459461
} = this.props
460462

461463
return trigger ? (
@@ -500,6 +502,17 @@ class Menu extends Component<MenuProps> {
500502
onKeyDown: this.handleTriggerKeyDown,
501503
disabled: (trigger as ReactElement).props.disabled || disabled
502504
})}
505+
defaultFocusElement={
506+
focusFirsItemOnOpen
507+
? () => {
508+
// TODO: this could be better. Maybe a more precise selector
509+
// @ts-expect-error it works
510+
return this._popover?._contentElement?.querySelector(
511+
'[class$="menuItem"]'
512+
)
513+
}
514+
: undefined
515+
}
503516
>
504517
{this.renderMenu()}
505518
</Popover>

packages/ui-menu/src/Menu/props.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,10 @@ type MenuOwnProps = {
175175
* Content to render in the label's info region. It is only visible on nested Menus.
176176
*/
177177
renderLabelInfo?: React.ReactNode | (() => React.ReactNode)
178+
/**
179+
* If true, when menu opens, the focus will jump to the first menuItem
180+
*/
181+
focusFirsItemOnOpen?: boolean
178182
}
179183

180184
type PropKeys = keyof MenuOwnProps
@@ -223,7 +227,8 @@ const propTypes: PropValidators<PropKeys> = {
223227
offsetX: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
224228
offsetY: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
225229
maxHeight: PropTypes.string,
226-
renderLabelInfo: PropTypes.node
230+
renderLabelInfo: PropTypes.node,
231+
focusFirsItemOnOpen: PropTypes.bool
227232
}
228233

229234
const allowedProps: AllowedPropKeys = [

0 commit comments

Comments
 (0)