diff --git a/res/css/structures/_ContextualMenu.scss b/res/css/structures/_ContextualMenu.scss index 42e8b403d1..67e4b41268 100644 --- a/res/css/structures/_ContextualMenu.scss +++ b/res/css/structures/_ContextualMenu.scss @@ -27,7 +27,6 @@ limitations under the License. width: 100%; height: 100%; opacity: 1.0; - z-index: 5000; } .mx_ContextualMenu { diff --git a/res/css/views/right_panel/_ThreadPanel.scss b/res/css/views/right_panel/_ThreadPanel.scss index 369c57cdd2..ce1d6d2d0a 100644 --- a/res/css/views/right_panel/_ThreadPanel.scss +++ b/res/css/views/right_panel/_ThreadPanel.scss @@ -120,7 +120,7 @@ limitations under the License. &:hover { background-color: $event-selected-color; } - &[aria-selected="true"] { + &[aria-checked="true"] { :first-child { margin-left: -20px; } diff --git a/src/components/structures/ContextMenu.tsx b/src/components/structures/ContextMenu.tsx index 94b4b46fd4..84af76e282 100644 --- a/src/components/structures/ContextMenu.tsx +++ b/src/components/structures/ContextMenu.tsx @@ -103,7 +103,7 @@ interface IState { // all options inside the menu should be of role=menuitem/menuitemcheckbox/menuitemradiobutton and have tabIndex={-1} // this will allow the ContextMenu to manage its own focus using arrow keys as per the ARIA guidelines. @replaceableComponent("structures.ContextMenu") -export class ContextMenu extends React.PureComponent { +export default class ContextMenu extends React.PureComponent { private readonly initialFocus: HTMLElement; static defaultProps = { @@ -411,6 +411,7 @@ export class ContextMenu extends React.PureComponent { onClick={this.onClick} onContextMenu={this.onContextMenuPreventBubbling} > + { background }
{ > { body }
- { background } ); } @@ -530,30 +530,22 @@ export const useContextMenu = (): ContextMenuTuple< return [isOpen, button, open, close, setIsOpen]; }; -@replaceableComponent("structures.LegacyContextMenu") -export default class LegacyContextMenu extends ContextMenu { - render() { - return this.renderMenu(false); - } -} - // XXX: Deprecated, used only for dynamic Tooltips. Avoid using at all costs. export function createMenu(ElementClass, props) { const onFinished = function(...args) { ReactDOM.unmountComponentAtNode(getOrCreateContainer()); - - if (props && props.onFinished) { - props.onFinished.apply(null, args); - } + props?.onFinished?.apply(null, args); }; - const menu = - ; + ; ReactDOM.render(menu, getOrCreateContainer()); diff --git a/src/components/structures/ThreadPanel.tsx b/src/components/structures/ThreadPanel.tsx index 3e1e658af2..4ede274097 100644 --- a/src/components/structures/ThreadPanel.tsx +++ b/src/components/structures/ThreadPanel.tsx @@ -24,12 +24,11 @@ import ResizeNotifier from '../../utils/ResizeNotifier'; import MatrixClientContext from '../../contexts/MatrixClientContext'; import { _t } from '../../languageHandler'; import { ContextMenuButton } from '../../accessibility/context_menu/ContextMenuButton'; -import ContextMenu, { ChevronFace, useContextMenu } from './ContextMenu'; +import ContextMenu, { ChevronFace, MenuItemRadio, useContextMenu } from './ContextMenu'; import RoomContext, { TimelineRenderingType } from '../../contexts/RoomContext'; import TimelinePanel from './TimelinePanel'; import { Layout } from '../../settings/enums/Layout'; import { useEventEmitter } from '../../hooks/useEventEmitter'; -import AccessibleButton from '../views/elements/AccessibleButton'; import { TileShape } from '../views/rooms/EventTile'; import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; @@ -98,14 +97,14 @@ export const ThreadPanelHeaderFilterOptionItem = ({ onClick: () => void; isSelected: boolean; }) => { - return { label } { description } - ; + ; }; export const ThreadPanelHeader = ({ filterOption, setFilterOption }: { @@ -141,8 +140,8 @@ export const ThreadPanelHeader = ({ filterOption, setFilterOption }: { top={0} right={25} onFinished={closeMenu} - managed={false} chevronFace={ChevronFace.Top} + mountAsChild={true} > { contextMenuOptions } : null; diff --git a/src/components/views/avatars/MemberStatusMessageAvatar.tsx b/src/components/views/avatars/MemberStatusMessageAvatar.tsx index 8c703b3b32..f9c4fd8cb4 100644 --- a/src/components/views/avatars/MemberStatusMessageAvatar.tsx +++ b/src/components/views/avatars/MemberStatusMessageAvatar.tsx @@ -21,7 +21,7 @@ import MemberAvatar from '../avatars/MemberAvatar'; import classNames from 'classnames'; import StatusMessageContextMenu from "../context_menus/StatusMessageContextMenu"; import SettingsStore from "../../../settings/SettingsStore"; -import { ChevronFace, ContextMenu, ContextMenuButton } from "../../structures/ContextMenu"; +import ContextMenu, { ChevronFace, ContextMenuButton } from "../../structures/ContextMenu"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { ResizeMethod } from "matrix-js-sdk/src/@types/partials"; diff --git a/src/components/views/context_menus/CallContextMenu.tsx b/src/components/views/context_menus/CallContextMenu.tsx index a61cdeedd3..38398e70b3 100644 --- a/src/components/views/context_menus/CallContextMenu.tsx +++ b/src/components/views/context_menus/CallContextMenu.tsx @@ -17,7 +17,7 @@ limitations under the License. import React from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; -import { ContextMenu, IProps as IContextMenuProps, MenuItem } from '../../structures/ContextMenu'; +import ContextMenu, { IProps as IContextMenuProps, MenuItem } from '../../structures/ContextMenu'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import CallHandler from '../../../CallHandler'; import InviteDialog, { KIND_CALL_TRANSFER } from '../dialogs/InviteDialog'; diff --git a/src/components/views/context_menus/DialpadContextMenu.tsx b/src/components/views/context_menus/DialpadContextMenu.tsx index 01c7c6c1d8..cb1b877e66 100644 --- a/src/components/views/context_menus/DialpadContextMenu.tsx +++ b/src/components/views/context_menus/DialpadContextMenu.tsx @@ -17,7 +17,7 @@ limitations under the License. import * as React from "react"; import { createRef } from "react"; import AccessibleButton, { ButtonEvent } from "../elements/AccessibleButton"; -import { ContextMenu, IProps as IContextMenuProps } from '../../structures/ContextMenu'; +import ContextMenu, { IProps as IContextMenuProps } from '../../structures/ContextMenu'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import Field from "../elements/Field"; import DialPad from '../voip/DialPad'; diff --git a/src/components/views/context_menus/IconizedContextMenu.tsx b/src/components/views/context_menus/IconizedContextMenu.tsx index 571b0b39bf..b648ade36c 100644 --- a/src/components/views/context_menus/IconizedContextMenu.tsx +++ b/src/components/views/context_menus/IconizedContextMenu.tsx @@ -17,9 +17,8 @@ limitations under the License. import React from "react"; import classNames from "classnames"; -import { +import ContextMenu, { ChevronFace, - ContextMenu, IProps as IContextMenuProps, MenuItem, MenuItemCheckbox, MenuItemRadio, diff --git a/src/components/views/directory/NetworkDropdown.tsx b/src/components/views/directory/NetworkDropdown.tsx index 9a999625d7..43821aa849 100644 --- a/src/components/views/directory/NetworkDropdown.tsx +++ b/src/components/views/directory/NetworkDropdown.tsx @@ -21,9 +21,8 @@ import { IProtocol } from "matrix-js-sdk/src/client"; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { instanceForInstanceId } from '../../../utils/DirectoryUtils'; -import { +import ContextMenu, { ChevronFace, - ContextMenu, ContextMenuButton, MenuGroup, MenuItem, diff --git a/src/components/views/elements/DNDTagTile.js b/src/components/views/elements/DNDTagTile.js index 97bae82e61..ed74246cb2 100644 --- a/src/components/views/elements/DNDTagTile.js +++ b/src/components/views/elements/DNDTagTile.js @@ -18,7 +18,7 @@ limitations under the License. import TagTile from './TagTile'; import React from 'react'; -import { ContextMenu, toRightOf, useContextMenu } from "../../structures/ContextMenu"; +import ContextMenu, { toRightOf, useContextMenu } from "../../structures/ContextMenu"; import * as sdk from '../../../index'; export default function DNDTagTile(props) { diff --git a/src/components/views/groups/GroupInviteTile.js b/src/components/views/groups/GroupInviteTile.js index 0ec0084162..dc18db5c54 100644 --- a/src/components/views/groups/GroupInviteTile.js +++ b/src/components/views/groups/GroupInviteTile.js @@ -23,7 +23,7 @@ import dis from '../../../dispatcher/dispatcher'; import { _t } from '../../../languageHandler'; import classNames from 'classnames'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; -import { ContextMenu, ContextMenuButton, toRightOf } from "../../structures/ContextMenu"; +import ContextMenu, { ContextMenuButton, toRightOf } from "../../structures/ContextMenu"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { RovingTabIndexWrapper } from "../../../accessibility/RovingTabIndex"; import { replaceableComponent } from "../../../utils/replaceableComponent"; diff --git a/src/components/views/messages/MessageActionBar.tsx b/src/components/views/messages/MessageActionBar.tsx index 2b0faa210a..69ec20dbf5 100644 --- a/src/components/views/messages/MessageActionBar.tsx +++ b/src/components/views/messages/MessageActionBar.tsx @@ -23,7 +23,7 @@ import type { Relations } from 'matrix-js-sdk/src/models/relations'; import { _t } from '../../../languageHandler'; import dis from '../../../dispatcher/dispatcher'; import { Action } from '../../../dispatcher/actions'; -import { aboveLeftOf, ContextMenu, ContextMenuTooltipButton, useContextMenu } from '../../structures/ContextMenu'; +import ContextMenu, { aboveLeftOf, ContextMenuTooltipButton, useContextMenu } from '../../structures/ContextMenu'; import { isContentActionable, canEditContent } from '../../../utils/EventUtils'; import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContext"; import Toolbar from "../../../accessibility/Toolbar"; diff --git a/src/components/views/messages/ReactionsRow.tsx b/src/components/views/messages/ReactionsRow.tsx index d4caf4ecf8..c4f796e084 100644 --- a/src/components/views/messages/ReactionsRow.tsx +++ b/src/components/views/messages/ReactionsRow.tsx @@ -24,7 +24,7 @@ import { _t } from '../../../languageHandler'; import { isContentActionable } from '../../../utils/EventUtils'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { ContextMenuTooltipButton } from "../../../accessibility/context_menu/ContextMenuTooltipButton"; -import { aboveLeftOf, ContextMenu, useContextMenu } from "../../structures/ContextMenu"; +import ContextMenu, { aboveLeftOf, useContextMenu } from "../../structures/ContextMenu"; import ReactionPicker from "../emojipicker/ReactionPicker"; import ReactionsRowButton from "./ReactionsRowButton"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; diff --git a/src/components/views/rooms/MessageComposer.tsx b/src/components/views/rooms/MessageComposer.tsx index a666a9b26a..c16f855344 100644 --- a/src/components/views/rooms/MessageComposer.tsx +++ b/src/components/views/rooms/MessageComposer.tsx @@ -27,9 +27,8 @@ import { makeRoomPermalink, RoomPermalinkCreator } from '../../../utils/permalin import ContentMessages from '../../../ContentMessages'; import E2EIcon from './E2EIcon'; import SettingsStore from "../../../settings/SettingsStore"; -import { +import ContextMenu, { aboveLeftOf, - ContextMenu, useContextMenu, MenuItem, AboveLeftOf, diff --git a/src/components/views/rooms/RoomSublist.tsx b/src/components/views/rooms/RoomSublist.tsx index fde2355ff3..37b7fed652 100644 --- a/src/components/views/rooms/RoomSublist.tsx +++ b/src/components/views/rooms/RoomSublist.tsx @@ -26,9 +26,8 @@ import { _t } from "../../../languageHandler"; import AccessibleButton from "../../views/elements/AccessibleButton"; import RoomTile from "./RoomTile"; import { ListLayout } from "../../../stores/room-list/ListLayout"; -import { +import ContextMenu, { ChevronFace, - ContextMenu, ContextMenuTooltipButton, StyledMenuItemCheckbox, StyledMenuItemRadio, diff --git a/src/components/views/rooms/Stickerpicker.tsx b/src/components/views/rooms/Stickerpicker.tsx index 1f59d3a71e..19cff10f70 100644 --- a/src/components/views/rooms/Stickerpicker.tsx +++ b/src/components/views/rooms/Stickerpicker.tsx @@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ + import React from 'react'; import { Room } from 'matrix-js-sdk/src/models/room'; import { _t, _td } from '../../../languageHandler'; @@ -24,7 +25,7 @@ import WidgetUtils, { IWidgetEvent } from '../../../utils/WidgetUtils'; import PersistedElement from "../elements/PersistedElement"; import { IntegrationManagers } from "../../../integrations/IntegrationManagers"; import SettingsStore from "../../../settings/SettingsStore"; -import { ChevronFace, ContextMenu } from "../../structures/ContextMenu"; +import ContextMenu, { ChevronFace } from "../../structures/ContextMenu"; import { WidgetType } from "../../../widgets/WidgetType"; import { Action } from "../../../dispatcher/actions"; import { WidgetMessagingStore } from "../../../stores/widgets/WidgetMessagingStore"; diff --git a/src/components/views/spaces/QuickSettingsButton.tsx b/src/components/views/spaces/QuickSettingsButton.tsx index 59cfcb967c..e54d5af598 100644 --- a/src/components/views/spaces/QuickSettingsButton.tsx +++ b/src/components/views/spaces/QuickSettingsButton.tsx @@ -18,7 +18,7 @@ import React, { useMemo } from "react"; import { _t } from "../../../languageHandler"; import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; -import { alwaysAboveRightOf, ChevronFace, ContextMenu, useContextMenu } from "../../structures/ContextMenu"; +import ContextMenu, { alwaysAboveRightOf, ChevronFace, useContextMenu } from "../../structures/ContextMenu"; import AccessibleButton from "../elements/AccessibleButton"; import StyledCheckbox from "../elements/StyledCheckbox"; import { MetaSpace } from "../../../stores/spaces"; diff --git a/src/components/views/spaces/SpaceCreateMenu.tsx b/src/components/views/spaces/SpaceCreateMenu.tsx index c5e15ad855..9dc52f21d6 100644 --- a/src/components/views/spaces/SpaceCreateMenu.tsx +++ b/src/components/views/spaces/SpaceCreateMenu.tsx @@ -22,7 +22,7 @@ import { HistoryVisibility, Preset } from "matrix-js-sdk/src/@types/partials"; import { _t } from "../../../languageHandler"; import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; -import { ChevronFace, ContextMenu } from "../../structures/ContextMenu"; +import ContextMenu, { ChevronFace } from "../../structures/ContextMenu"; import createRoom, { IOpts as ICreateOpts } from "../../../createRoom"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import SpaceBasicSettings, { SpaceAvatar } from "./SpaceBasicSettings"; diff --git a/test/components/structures/ThreadPanel-test.tsx b/test/components/structures/ThreadPanel-test.tsx index a59e9aa6cd..7dc50ebf24 100644 --- a/test/components/structures/ThreadPanel-test.tsx +++ b/test/components/structures/ThreadPanel-test.tsx @@ -70,7 +70,7 @@ describe('ThreadPanel', () => { wrapper.find(ContextMenuButton).simulate('click'); const found = wrapper.find(ThreadPanelHeaderFilterOptionItem); expect(found.length).toEqual(2); - const foundButton = found.find('[aria-selected=true]').first(); + const foundButton = found.find('[aria-checked=true]').first(); expect(foundButton.text()).toEqual(`${_t("All threads")}${_t('Shows all threads from current room')}`); expect(foundButton).toMatchSnapshot(); }); diff --git a/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap b/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap index 0be306a0a0..2f1288bf63 100644 --- a/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap +++ b/test/components/structures/__snapshots__/ThreadPanel-test.tsx.snap @@ -46,21 +46,21 @@ exports[`ThreadPanel Header expect that My filter for ThreadPanelHeader properly exports[`ThreadPanel Header expect that ThreadPanelHeader has the correct option selected in the context menu 1`] = `
All threads