From 19cfa8d126a2ff54298150529e58e5e4f5495f09 Mon Sep 17 00:00:00 2001
From: tobi <31960611+tsmethurst@users.noreply.github.com>
Date: Wed, 9 Apr 2025 14:14:20 +0200
Subject: [bugfix] Fix a couple accessibility issues with `:focus` elements
(#3979)
* [bugfix/frontend] Fix accessibility/focus issues in settings + web ui
* fix little error
* tweaks
---
.../admin/http-header-permissions/overview.tsx | 23 ++++++++++++----------
.../moderation/domain-permissions/drafts/index.tsx | 23 ++++++++++++----------
.../domain-permissions/excludes/index.tsx | 23 ++++++++++++----------
.../views/moderation/domain-permissions/form.tsx | 16 +++++++++++++--
.../domain-permissions/subscriptions/common.tsx | 23 ++++++++++++----------
.../settings/views/moderation/reports/search.tsx | 23 ++++++++++++----------
.../settings/views/user/applications/search.tsx | 23 ++++++++++++----------
.../settings/views/user/export-import/export.tsx | 5 -----
.../settings/views/user/interactions/search.tsx | 23 ++++++++++++----------
web/source/settings/views/user/profile/profile.tsx | 4 +++-
10 files changed, 108 insertions(+), 78 deletions(-)
(limited to 'web/source/settings/views')
diff --git a/web/source/settings/views/admin/http-header-permissions/overview.tsx b/web/source/settings/views/admin/http-header-permissions/overview.tsx
index b2d8b7372..0b708aa8c 100644
--- a/web/source/settings/views/admin/http-header-permissions/overview.tsx
+++ b/web/source/settings/views/admin/http-header-permissions/overview.tsx
@@ -65,20 +65,23 @@ export default function HeaderPermsOverview() {
} = useGetHeaderAllowsQuery(NoArg, { skip: permType !== "allow" });
const itemToEntry = (perm: HeaderPermission) => {
+ const onClick = () => {
+ // When clicking on a header perm,
+ // go to the detail view for perm.
+ setLocation(`/${permType}s/${perm.id}`, {
+ // Store the back location in
+ // history so the detail view
+ // can use it to return here.
+ state: { backLocation: location }
+ });
+ };
+
return (
{
- // When clicking on a header perm,
- // go to the detail view for perm.
- setLocation(`/${permType}s/${perm.id}`, {
- // Store the back location in
- // history so the detail view
- // can use it to return here.
- state: { backLocation: location }
- });
- }}
+ onClick={onClick}
+ onKeyDown={e => e.key === "Enter" && onClick()}
role="link"
tabIndex={0}
>
diff --git a/web/source/settings/views/moderation/domain-permissions/drafts/index.tsx b/web/source/settings/views/moderation/domain-permissions/drafts/index.tsx
index 19dbe0d88..36bc7ee01 100644
--- a/web/source/settings/views/moderation/domain-permissions/drafts/index.tsx
+++ b/web/source/settings/views/moderation/domain-permissions/drafts/index.tsx
@@ -211,21 +211,24 @@ function DraftListEntry({ permDraft, linkTo, backLocation }: DraftEntryProps) {
const title = `${permTypeUpper} ${domain}`;
+ const onClick = () => {
+ // When clicking on a draft, direct
+ // to the detail view for that draft.
+ setLocation(linkTo, {
+ // Store the back location in history so
+ // the detail view can use it to return to
+ // this page (including query parameters).
+ state: { backLocation: backLocation }
+ });
+ };
+
return (
{
- // When clicking on a draft, direct
- // to the detail view for that draft.
- setLocation(linkTo, {
- // Store the back location in history so
- // the detail view can use it to return to
- // this page (including query parameters).
- state: { backLocation: backLocation }
- });
- }}
+ onClick={onClick}
+ onKeyDown={e => e.key === "Enter" && onClick()}
role="link"
tabIndex={0}
>
diff --git a/web/source/settings/views/moderation/domain-permissions/excludes/index.tsx b/web/source/settings/views/moderation/domain-permissions/excludes/index.tsx
index 915d6f5cc..207f94d61 100644
--- a/web/source/settings/views/moderation/domain-permissions/excludes/index.tsx
+++ b/web/source/settings/views/moderation/domain-permissions/excludes/index.tsx
@@ -186,21 +186,24 @@ function ExcludeListEntry({ permExclude, linkTo, backLocation }: ExcludeEntryPro
return ;
}
+ const onClick = () => {
+ // When clicking on a exclude, direct
+ // to the detail view for that exclude.
+ setLocation(linkTo, {
+ // Store the back location in history so
+ // the detail view can use it to return to
+ // this page (including query parameters).
+ state: { backLocation: backLocation }
+ });
+ };
+
return (
{
- // When clicking on a exclude, direct
- // to the detail view for that exclude.
- setLocation(linkTo, {
- // Store the back location in history so
- // the detail view can use it to return to
- // this page (including query parameters).
- state: { backLocation: backLocation }
- });
- }}
+ onClick={onClick}
+ onKeyDown={e => e.key === "Enter" && onClick()}
role="link"
tabIndex={0}
>
diff --git a/web/source/settings/views/moderation/domain-permissions/form.tsx b/web/source/settings/views/moderation/domain-permissions/form.tsx
index 204e9510c..cf1447cfd 100644
--- a/web/source/settings/views/moderation/domain-permissions/form.tsx
+++ b/web/source/settings/views/moderation/domain-permissions/form.tsx
@@ -17,7 +17,7 @@
along with this program. If not, see .
*/
-import React from "react";
+import React, { useRef } from "react";
import { useEffect } from "react";
import { useExportDomainListMutation } from "../../../lib/query/admin/domain-permissions/export";
@@ -70,6 +70,11 @@ export default function ImportExportForm({ form, submitParse, parseResult }: Imp
/* eslint-disable-next-line react-hooks/exhaustive-deps */
}, [exportResult]);
+ const importFileRef = useRef(null);
+ const importFileOnClick = () => {
+ importFileRef.current?.click();
+ };
+
return (
<>
Import / Export domain permissions
@@ -101,7 +106,13 @@ export default function ImportExportForm({ form, submitParse, parseResult }: Imp
showError={false}
disabled={form.permType.value === undefined || form.permType.value.length === 0}
/>
- exportBlocks()}
@@ -158,7 +154,6 @@ export default function Export({ exportStats }: { exportStats: AccountExportStat
Muting {exportStats.mutes_count} account{ exportStats.mutes_count !== 1 && "s" }
exportMutes()}
diff --git a/web/source/settings/views/user/interactions/search.tsx b/web/source/settings/views/user/interactions/search.tsx
index b97899c51..5d2da7563 100644
--- a/web/source/settings/views/user/interactions/search.tsx
+++ b/web/source/settings/views/user/interactions/search.tsx
@@ -174,21 +174,24 @@ function ReqsListEntry({ req, linkTo, backLocation }: ReqsListEntryProps) {
const ourContent = useContent(req.status);
const theirContent = useContent(req.reply);
+ const onClick = () => {
+ // When clicking on a request, direct
+ // to the detail view for that request.
+ setLocation(linkTo, {
+ // Store the back location in history so
+ // the detail view can use it to return to
+ // this page (including query parameters).
+ state: { backLocation: backLocation }
+ });
+ };
+
return (
{
- // When clicking on a request, direct
- // to the detail view for that request.
- setLocation(linkTo, {
- // Store the back location in history so
- // the detail view can use it to return to
- // this page (including query parameters).
- state: { backLocation: backLocation }
- });
- }}
+ onClick={onClick}
+ onKeyDown={e => e.key === "Enter" && onClick()}
role="link"
tabIndex={0}
>
diff --git a/web/source/settings/views/user/profile/profile.tsx b/web/source/settings/views/user/profile/profile.tsx
index 6f99a17db..36e307193 100644
--- a/web/source/settings/views/user/profile/profile.tsx
+++ b/web/source/settings/views/user/profile/profile.tsx
@@ -167,6 +167,7 @@ function ProfileForm({ data: profile }: ProfileFormProps) {
{
@@ -179,7 +180,7 @@ function ProfileForm({ data: profile }: ProfileFormProps) {
}}
/>
-
+