From 813e0e2af9dc2c83ac3792814cf9f7e050fba200 Mon Sep 17 00:00:00 2001 From: Dzmitry Yarmoshkin Date: Wed, 9 Aug 2023 11:08:05 +0300 Subject: [PATCH 1/4] fix submenu focus --- src/Menu.tsx | 3 ++- src/SubMenu/SubMenuList.tsx | 5 +++-- src/SubMenu/index.tsx | 30 ++++++++++++++++++------------ src/context/MenuContext.tsx | 3 ++- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Menu.tsx b/src/Menu.tsx index ef9db196..9374b8ee 100644 --- a/src/Menu.tsx +++ b/src/Menu.tsx @@ -2,11 +2,11 @@ import classNames from 'classnames'; import type { CSSMotionProps } from 'rc-motion'; import Overflow from 'rc-overflow'; import useMergedState from 'rc-util/lib/hooks/useMergedState'; +import isEqual from 'rc-util/lib/isEqual'; import warning from 'rc-util/lib/warning'; import * as React from 'react'; import { useImperativeHandle } from 'react'; import { flushSync } from 'react-dom'; -import isEqual from 'rc-util/lib/isEqual'; import { getMenuId, IdContext } from './context/IdContext'; import MenuContextProvider from './context/MenuContext'; import { PathRegisterContext, PathUserContext } from './context/PathContext'; @@ -627,6 +627,7 @@ const Menu = React.forwardRef((props, ref) => { // Events onItemClick={onInternalClick} onOpenChange={onInternalOpenChange} + onKeyDown={onInternalKeyDown} > {container} diff --git a/src/SubMenu/SubMenuList.tsx b/src/SubMenu/SubMenuList.tsx index 732fa097..4cd278e7 100644 --- a/src/SubMenu/SubMenuList.tsx +++ b/src/SubMenu/SubMenuList.tsx @@ -1,5 +1,5 @@ -import * as React from 'react'; import classNames from 'classnames'; +import * as React from 'react'; import { MenuContext } from '../context/MenuContext'; export interface SubMenuListProps @@ -11,7 +11,7 @@ const InternalSubMenuList = ( { className, children, ...restProps }: SubMenuListProps, ref: React.Ref, ) => { - const { prefixCls, mode, rtl } = React.useContext(MenuContext); + const { prefixCls, mode, rtl, onKeyDown } = React.useContext(MenuContext); return (
    {children}
diff --git a/src/SubMenu/index.tsx b/src/SubMenu/index.tsx index cc2737a6..61683c83 100644 --- a/src/SubMenu/index.tsx +++ b/src/SubMenu/index.tsx @@ -1,26 +1,26 @@ -import * as React from 'react'; import classNames from 'classnames'; import Overflow from 'rc-overflow'; import warning from 'rc-util/lib/warning'; -import SubMenuList from './SubMenuList'; -import { parseChildren } from '../utils/commonUtil'; -import type { MenuInfo, SubMenuType } from '../interface'; +import * as React from 'react'; +import { useMenuId } from '../context/IdContext'; import MenuContextProvider, { MenuContext } from '../context/MenuContext'; -import useMemoCallback from '../hooks/useMemoCallback'; -import PopupTrigger from './PopupTrigger'; -import Icon from '../Icon'; -import useActive from '../hooks/useActive'; -import { warnItemProp } from '../utils/warnUtil'; -import useDirectionStyle from '../hooks/useDirectionStyle'; -import InlineSubMenuList from './InlineSubMenuList'; import { PathTrackerContext, PathUserContext, useFullPath, useMeasure, } from '../context/PathContext'; -import { useMenuId } from '../context/IdContext'; import PrivateContext from '../context/PrivateContext'; +import useActive from '../hooks/useActive'; +import useDirectionStyle from '../hooks/useDirectionStyle'; +import useMemoCallback from '../hooks/useMemoCallback'; +import Icon from '../Icon'; +import type { MenuInfo, SubMenuType } from '../interface'; +import { parseChildren } from '../utils/commonUtil'; +import { warnItemProp } from '../utils/warnUtil'; +import InlineSubMenuList from './InlineSubMenuList'; +import PopupTrigger from './PopupTrigger'; +import SubMenuList from './SubMenuList'; export interface SubMenuProps extends Omit { @@ -137,6 +137,12 @@ const InternalSubMenu = (props: SubMenuProps) => { onTitleMouseLeave, ); + React.useEffect(() => { + if (elementRef.current && activeKey === eventKey) { + elementRef.current.focus(); + } + }); + // Fallback of active check to avoid hover on menu title or disabled item const [childrenActive, setChildrenActive] = React.useState(false); diff --git a/src/context/MenuContext.tsx b/src/context/MenuContext.tsx index c34c4bdf..60ed4175 100644 --- a/src/context/MenuContext.tsx +++ b/src/context/MenuContext.tsx @@ -1,7 +1,7 @@ -import * as React from 'react'; import type { CSSMotionProps } from 'rc-motion'; import useMemo from 'rc-util/lib/hooks/useMemo'; import isEqual from 'rc-util/lib/isEqual'; +import * as React from 'react'; import type { BuiltinPlacements, MenuClickEventHandler, @@ -52,6 +52,7 @@ export interface MenuContextProps { // Function onItemClick: MenuClickEventHandler; + onKeyDown?: React.KeyboardEventHandler; onOpenChange: (key: string, open: boolean) => void; getPopupContainer: (node: HTMLElement) => HTMLElement; } From 4ce5a3767cd5cec985c6c8408cbda640baeac180 Mon Sep 17 00:00:00 2001 From: Dzmitry Yarmoshkin Date: Wed, 9 Aug 2023 19:01:48 +0300 Subject: [PATCH 2/4] fix queryselector --- src/Menu.tsx | 2 +- src/SubMenu/index.tsx | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Menu.tsx b/src/Menu.tsx index 9374b8ee..4f6df858 100644 --- a/src/Menu.tsx +++ b/src/Menu.tsx @@ -386,7 +386,7 @@ const Menu = React.forwardRef((props, ref) => { if (shouldFocusKey) { containerRef.current ?.querySelector( - `li[data-menu-id='${getMenuId(uuid, shouldFocusKey as string)}']`, + `[data-menu-id='${getMenuId(uuid, shouldFocusKey as string)}']`, ) ?.focus?.(options); } diff --git a/src/SubMenu/index.tsx b/src/SubMenu/index.tsx index 61683c83..d11d7c8a 100644 --- a/src/SubMenu/index.tsx +++ b/src/SubMenu/index.tsx @@ -137,12 +137,6 @@ const InternalSubMenu = (props: SubMenuProps) => { onTitleMouseLeave, ); - React.useEffect(() => { - if (elementRef.current && activeKey === eventKey) { - elementRef.current.focus(); - } - }); - // Fallback of active check to avoid hover on menu title or disabled item const [childrenActive, setChildrenActive] = React.useState(false); From e1feb819e83e92c94b2307131743c5838a18f189 Mon Sep 17 00:00:00 2001 From: Dzmitry Yarmoshkin Date: Wed, 27 Dec 2023 15:19:43 +0300 Subject: [PATCH 3/4] revert changes in Submenu/index --- src/SubMenu/index.tsx | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/SubMenu/index.tsx b/src/SubMenu/index.tsx index 1d2f0332..f5419269 100644 --- a/src/SubMenu/index.tsx +++ b/src/SubMenu/index.tsx @@ -1,26 +1,26 @@ +import * as React from 'react'; import classNames from 'classnames'; import Overflow from 'rc-overflow'; import warning from 'rc-util/lib/warning'; -import * as React from 'react'; -import { useMenuId } from '../context/IdContext'; +import SubMenuList from './SubMenuList'; +import { parseChildren } from '../utils/commonUtil'; +import type { MenuInfo, SubMenuType } from '../interface'; import MenuContextProvider, { MenuContext } from '../context/MenuContext'; +import useMemoCallback from '../hooks/useMemoCallback'; +import PopupTrigger from './PopupTrigger'; +import Icon from '../Icon'; +import useActive from '../hooks/useActive'; +import { warnItemProp } from '../utils/warnUtil'; +import useDirectionStyle from '../hooks/useDirectionStyle'; +import InlineSubMenuList from './InlineSubMenuList'; import { PathTrackerContext, PathUserContext, useFullPath, useMeasure, } from '../context/PathContext'; +import { useMenuId } from '../context/IdContext'; import PrivateContext from '../context/PrivateContext'; -import useActive from '../hooks/useActive'; -import useDirectionStyle from '../hooks/useDirectionStyle'; -import useMemoCallback from '../hooks/useMemoCallback'; -import Icon from '../Icon'; -import type { MenuInfo, SubMenuType } from '../interface'; -import { parseChildren } from '../utils/commonUtil'; -import { warnItemProp } from '../utils/warnUtil'; -import InlineSubMenuList from './InlineSubMenuList'; -import PopupTrigger from './PopupTrigger'; -import SubMenuList from './SubMenuList'; export interface SubMenuProps extends Omit { @@ -392,4 +392,4 @@ export default function SubMenu(props: SubMenuProps) { {renderNode} ); -} +} \ No newline at end of file From 2ff8bad700b175e46a76d10333452052bf5bf800 Mon Sep 17 00:00:00 2001 From: Dzmitry Yarmoshkin Date: Wed, 27 Dec 2023 15:21:54 +0300 Subject: [PATCH 4/4] fix imports sorting --- src/Menu.tsx | 4 ++-- src/SubMenu/index.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Menu.tsx b/src/Menu.tsx index 17e27eea..23080e95 100644 --- a/src/Menu.tsx +++ b/src/Menu.tsx @@ -7,6 +7,8 @@ import warning from 'rc-util/lib/warning'; import * as React from 'react'; import { useImperativeHandle } from 'react'; import { flushSync } from 'react-dom'; +import MenuItem from './MenuItem'; +import SubMenu from './SubMenu'; import { IdContext } from './context/IdContext'; import MenuContextProvider from './context/MenuContext'; import { PathRegisterContext, PathUserContext } from './context/PathContext'; @@ -31,8 +33,6 @@ import type { SelectInfo, TriggerSubMenuAction, } from './interface'; -import MenuItem from './MenuItem'; -import SubMenu from './SubMenu'; import { parseItems } from './utils/nodeUtil'; import { warnItemProp } from './utils/warnUtil'; diff --git a/src/SubMenu/index.tsx b/src/SubMenu/index.tsx index f5419269..06183bd2 100644 --- a/src/SubMenu/index.tsx +++ b/src/SubMenu/index.tsx @@ -392,4 +392,4 @@ export default function SubMenu(props: SubMenuProps) { {renderNode} ); -} \ No newline at end of file +}