Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Fix accessibility issues around the room list and space panel #10717

Merged
merged 3 commits into from
May 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/components/views/rooms/NotificationBadge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ interface IClickableProps extends IProps, React.InputHTMLAttributes<Element> {
/**
* If specified will return an AccessibleButton instead of a div.
*/
onClick?(ev: React.MouseEvent): void;
onClick(ev: React.MouseEvent): void;
}

interface IState {
Expand Down Expand Up @@ -112,7 +112,7 @@ export default class NotificationBadge extends React.PureComponent<XOR<IProps, I

public render(): ReactNode {
/* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */
const { notification, showUnsentTooltip, forceCount, onClick } = this.props;
const { notification, showUnsentTooltip, forceCount, onClick, tabIndex } = this.props;

if (notification.isIdle) return null;
if (forceCount) {
Expand All @@ -135,6 +135,7 @@ export default class NotificationBadge extends React.PureComponent<XOR<IProps, I
onClick={onClick}
onMouseOver={this.onMouseOver}
onMouseLeave={this.onMouseLeave}
tabIndex={tabIndex}
>
{tooltip}
</StatelessNotificationBadge>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,32 @@ import { formatCount } from "../../../../utils/FormattingUtils";
import AccessibleButton from "../../elements/AccessibleButton";
import { NotificationColor } from "../../../../stores/notifications/NotificationColor";
import { useSettingValue } from "../../../../hooks/useSettings";
import { XOR } from "../../../../@types/common";

interface Props {
symbol: string | null;
count: number;
color: NotificationColor;
onClick?: (ev: MouseEvent) => void;
onMouseOver?: (ev: MouseEvent) => void;
onMouseLeave?: (ev: MouseEvent) => void;
children?: ReactNode;
label?: string;
}

export function StatelessNotificationBadge({ symbol, count, color, ...props }: Props): JSX.Element {
interface ClickableProps extends Props {
/**
* If specified will return an AccessibleButton instead of a div.
*/
onClick(ev: React.MouseEvent): void;
tabIndex?: number;
}

export function StatelessNotificationBadge({
symbol,
count,
color,
...props
}: XOR<Props, ClickableProps>): JSX.Element {
const hideBold = useSettingValue("feature_hidebold");

// Don't show a badge if we don't need to
Expand Down
8 changes: 6 additions & 2 deletions src/components/views/rooms/RoomSublist.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ interface IProps {
onListCollapse?: (isExpanded: boolean) => void;
}

function getLabelId(tagId: TagID): string {
return `mx_RoomSublist_label_${tagId}`;
}

// TODO: Use re-resizer's NumberSize when it is exposed as the type
interface ResizeDelta {
width: number;
Expand Down Expand Up @@ -712,7 +716,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
title={this.props.isMinimized ? this.props.label : undefined}
>
<span className={collapseClasses} />
<span>{this.props.label}</span>
<span id={getLabelId(this.props.tagId)}>{this.props.label}</span>
</Button>
{this.renderMenu()}
{this.props.isMinimized ? null : badgeContainer}
Expand Down Expand Up @@ -880,7 +884,7 @@ export default class RoomSublist extends React.Component<IProps, IState> {
className={classes}
role="group"
aria-hidden={hidden}
aria-label={this.props.label}
aria-labelledby={getLabelId(this.props.tagId)}
onKeyDown={this.onKeyDown}
>
{this.renderHeader()}
Expand Down