From 069cdf3ce01fa29181b53dc1d336bf699d7b709b Mon Sep 17 00:00:00 2001
From: Michael Telatynski <7t3chguy@gmail.com>
Date: Sun, 5 Jul 2020 18:23:57 +0100
Subject: [PATCH] Fix room list v2 context menus to be aria menus
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
---
src/components/structures/ContextMenu.js | 36 +++++++++++++++++++++
src/components/views/rooms/RoomSublist2.tsx | 26 ++++++++-------
src/components/views/rooms/RoomTile2.tsx | 24 ++++++++++----
3 files changed, 67 insertions(+), 19 deletions(-)
diff --git a/src/components/structures/ContextMenu.js b/src/components/structures/ContextMenu.js
index e43b0d1431..038208e49f 100644
--- a/src/components/structures/ContextMenu.js
+++ b/src/components/structures/ContextMenu.js
@@ -23,6 +23,8 @@ import classNames from 'classnames';
import {Key} from "../../Keyboard";
import * as sdk from "../../index";
import AccessibleButton from "../views/elements/AccessibleButton";
+import StyledCheckbox from "../views/elements/StyledCheckbox";
+import StyledRadioButton from "../views/elements/StyledRadioButton";
// Shamelessly ripped off Modal.js. There's probably a better way
// of doing reusable widgets like dialog boxes & menus where we go and
@@ -421,6 +423,23 @@ MenuItemCheckbox.propTypes = {
onClick: PropTypes.func.isRequired,
};
+// Semantic component for representing a styled role=menuitemcheckbox
+export const StyledMenuItemCheckbox = ({children, label, active=false, disabled=false, ...props}) => {
+ return (
+
+ { children }
+
+ );
+};
+StyledMenuItemCheckbox.propTypes = {
+ ...AccessibleButton.propTypes,
+ label: PropTypes.string, // optional
+ active: PropTypes.bool.isRequired,
+ disabled: PropTypes.bool, // optional
+ className: PropTypes.string, // optional
+ onClick: PropTypes.func.isRequired,
+};
+
// Semantic component for representing a role=menuitemradio
export const MenuItemRadio = ({children, label, active=false, disabled=false, ...props}) => {
const AccessibleButton = sdk.getComponent('elements.AccessibleButton');
@@ -439,6 +458,23 @@ MenuItemRadio.propTypes = {
onClick: PropTypes.func.isRequired,
};
+// Semantic component for representing a styled role=menuitemradio
+export const StyledMenuItemRadio = ({children, label, active=false, disabled=false, ...props}) => {
+ return (
+
+ { children }
+
+ );
+};
+StyledMenuItemRadio.propTypes = {
+ ...StyledMenuItemRadio.propTypes,
+ label: PropTypes.string, // optional
+ active: PropTypes.bool.isRequired,
+ disabled: PropTypes.bool, // optional
+ className: PropTypes.string, // optional
+ onClick: PropTypes.func.isRequired,
+};
+
// Placement method for to position context menu to right of elementRect with chevronOffset
export const toRightOf = (elementRect, chevronOffset=12) => {
const left = elementRect.right + window.pageXOffset + 3;
diff --git a/src/components/views/rooms/RoomSublist2.tsx b/src/components/views/rooms/RoomSublist2.tsx
index 69125ca88f..1b1e2ed66d 100644
--- a/src/components/views/rooms/RoomSublist2.tsx
+++ b/src/components/views/rooms/RoomSublist2.tsx
@@ -26,16 +26,18 @@ import AccessibleButton from "../../views/elements/AccessibleButton";
import RoomTile2 from "./RoomTile2";
import { ResizableBox, ResizeCallbackData } from "react-resizable";
import { ListLayout } from "../../../stores/room-list/ListLayout";
-import { ContextMenu, ContextMenuButton } from "../../structures/ContextMenu";
-import StyledCheckbox from "../elements/StyledCheckbox";
-import StyledRadioButton from "../elements/StyledRadioButton";
+import {
+ ContextMenu,
+ ContextMenuButton,
+ StyledMenuItemCheckbox,
+ StyledMenuItemRadio,
+} from "../../structures/ContextMenu";
import RoomListStore from "../../../stores/room-list/RoomListStore2";
import { ListAlgorithm, SortAlgorithm } from "../../../stores/room-list/algorithms/models";
import { DefaultTagID, TagID } from "../../../stores/room-list/models";
import dis from "../../../dispatcher/dispatcher";
import NotificationBadge from "./NotificationBadge";
import { ListNotificationState } from "../../../stores/notifications/ListNotificationState";
-import Tooltip from "../elements/Tooltip";
import AccessibleTooltipButton from "../elements/AccessibleTooltipButton";
import { Key } from "../../../Keyboard";
@@ -329,40 +331,40 @@ export default class RoomSublist2 extends React.Component {
{_t("Sort by")}
-
this.onTagSortChanged(SortAlgorithm.Recent)}
checked={!isAlphabetical}
name={`mx_${this.props.tagId}_sortBy`}
>
{_t("Activity")}
-
-
+ this.onTagSortChanged(SortAlgorithm.Alphabetic)}
checked={isAlphabetical}
name={`mx_${this.props.tagId}_sortBy`}
>
{_t("A-Z")}
-
+
{_t("Unread rooms")}
-
{_t("Always show first")}
-
+
{_t("Show")}
-
{_t("Message preview")}
-
+
diff --git a/src/components/views/rooms/RoomTile2.tsx b/src/components/views/rooms/RoomTile2.tsx
index 46b6d57501..dbaed0d819 100644
--- a/src/components/views/rooms/RoomTile2.tsx
+++ b/src/components/views/rooms/RoomTile2.tsx
@@ -26,7 +26,13 @@ import dis from '../../../dispatcher/dispatcher';
import { Key } from "../../../Keyboard";
import ActiveRoomObserver from "../../../ActiveRoomObserver";
import { _t } from "../../../languageHandler";
-import { ContextMenu, ContextMenuButton, MenuItemRadio } from "../../structures/ContextMenu";
+import {
+ ContextMenu,
+ ContextMenuButton,
+ MenuItemRadio,
+ MenuItemCheckbox,
+ MenuItem,
+} from "../../structures/ContextMenu";
import { DefaultTagID, TagID } from "../../../stores/room-list/models";
import { MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore";
import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar";
@@ -328,20 +334,24 @@ export default class RoomTile2 extends React.Component {
-
this.onTagRoom(e, DefaultTagID.Favourite)}>
+ this.onTagRoom(e, DefaultTagID.Favourite)}
+ active={false} // TODO: https://github.com/vector-im/riot-web/issues/14283
+ label={_t("Favourite")}
+ >
{_t("Favourite")}
-
-
+
+
+
-
+
+