From e5e2d771b9865cdeb0c07f51f26e50666ca188f7 Mon Sep 17 00:00:00 2001 From: TaduJR Date: Wed, 4 Mar 2026 11:17:52 +0300 Subject: [PATCH 1/2] fix: Screen Reader: Workspace: 3-dot More button in Workspace container not focusable or operable --- src/CONST/index.ts | 2 + src/pages/workspace/WorkspacesListPage.tsx | 17 +-- src/pages/workspace/WorkspacesListRow.tsx | 148 ++++++++++++++------- 3 files changed, 104 insertions(+), 63 deletions(-) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 89577aa736c7b..60cf987ec1824 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -8741,6 +8741,8 @@ const CONST = { NEW_WORKSPACE_BUTTON: 'WorkspaceList-NewWorkspaceButton', NEW_DOMAIN_BUTTON: 'WorkspaceList-NewDomainButton', THREE_DOT_MENU: 'WorkspaceList-ThreeDotMenu', + ROW: 'WorkspaceList-Row', + ROW_ARROW: 'WorkspaceList-RowArrow', }, INITIAL: { PROFILE: 'WorkspaceInitial-Profile', diff --git a/src/pages/workspace/WorkspacesListPage.tsx b/src/pages/workspace/WorkspacesListPage.tsx index 79b39f5a36c5e..1854c7d35aa80 100755 --- a/src/pages/workspace/WorkspacesListPage.tsx +++ b/src/pages/workspace/WorkspacesListPage.tsx @@ -54,7 +54,6 @@ import { getConnectionExporters, getPolicyBrickRoadIndicatorStatus, getUberConnectionErrorDirectlyFromPolicy, - getUserFriendlyWorkspaceType, isPendingDeletePolicy, isPolicyAdmin, isPolicyAuditor, @@ -431,17 +430,6 @@ function WorkspacesListPage() { }); } - const ownerDisplayName = personalDetails?.[item.ownerAccountID ?? CONST.DEFAULT_NUMBER_ID]?.displayName ?? ''; - const workspaceType = item.type ? getUserFriendlyWorkspaceType(item.type, translate) : ''; - const accessibilityLabel = [ - `${translate('workspace.common.workspace')}: ${item.title}`, - isDefault ? translate('common.default') : '', - `${translate('workspace.common.workspaceOwner')}: ${ownerDisplayName}`, - `${translate('workspace.common.workspaceType')}: ${workspaceType}`, - ] - .filter(Boolean) - .join(', '); - return ( )} diff --git a/src/pages/workspace/WorkspacesListRow.tsx b/src/pages/workspace/WorkspacesListRow.tsx index f6fa05b971e5e..69a8c2a705b80 100644 --- a/src/pages/workspace/WorkspacesListRow.tsx +++ b/src/pages/workspace/WorkspacesListRow.tsx @@ -9,6 +9,7 @@ import Avatar from '@components/Avatar'; import Badge from '@components/Badge'; import Icon from '@components/Icon'; import type {PopoverMenuItem} from '@components/PopoverMenu'; +import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback'; import Text from '@components/Text'; import TextWithTooltip from '@components/TextWithTooltip'; import ThreeDotsMenu from '@components/ThreeDotsMenu'; @@ -84,6 +85,12 @@ type WorkspacesListRowProps = WithCurrentUserPersonalDetailsProps & { /** Whether the list item is hovered */ isHovered?: boolean; + + /** Whether the row press is disabled */ + disabled?: boolean; + + /** Callback when the row is pressed */ + onPress?: () => void; }; type BrickRoadIndicatorIconProps = { @@ -122,6 +129,8 @@ function WorkspacesListRow({ isLoadingBill, resetLoadingSpinnerIconIndex, isHovered, + disabled, + onPress, }: WorkspacesListRowProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); @@ -177,58 +186,92 @@ function WorkspacesListRow({ const isDeleted = style && Array.isArray(style) ? style.includes(styles.offlineFeedbackDeleted) : false; + const ownerName = ownerDetails ? getDisplayNameOrDefault(ownerDetails) : ''; + const workspaceTypeName = workspaceType ? getUserFriendlyWorkspaceType(workspaceType, translate) : ''; + const accessibilityLabel = [ + `${translate('workspace.common.workspaceName')}: ${title}`, + isDefault ? translate('common.default') : '', + isJoinRequestPending ? translate('workspace.common.requested') : '', + ownerName ? `${translate('workspace.common.workspaceOwner')}: ${ownerName}` : '', + workspaceTypeName ? `${translate('workspace.common.workspaceType')}: ${workspaceTypeName}` : '', + ] + .filter(Boolean) + .join(', '); + + const RequestedBadge = isJoinRequestPending ? ( + + + + ) : null; + + const DefaultBadge = isDefault ? ( + + + + + + ) : null; + + const ThreeDotsSection = !isJoinRequestPending ? ( + + + + + + + ) : null; + + const NarrowBadges = + isJoinRequestPending || isDefault ? ( + + {RequestedBadge} + {DefaultBadge} + + ) : null; + const ThreeDotMenuOrPendingIcon = ( - {!!isJoinRequestPending && ( - - - - )} - {!!isDefault && ( - - - - - - )} - {!isJoinRequestPending && ( - - - - - - - )} + {RequestedBadge} + {DefaultBadge} + {ThreeDotsSection} ); return ( - + - {isNarrow && ThreeDotMenuOrPendingIcon} + {isNarrow && NarrowBadges} - + + {isNarrow && ThreeDotsSection} {!isNarrow && ThreeDotMenuOrPendingIcon} {!isNarrow && ( - + - + )} From d3af0b571f1c3dcc70b09a95fc2097ae611383e0 Mon Sep 17 00:00:00 2001 From: TaduJR Date: Wed, 4 Mar 2026 11:28:51 +0300 Subject: [PATCH 2/2] fix: Remove orphaned role=cell from action column outside role=row --- src/pages/workspace/WorkspacesListRow.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/pages/workspace/WorkspacesListRow.tsx b/src/pages/workspace/WorkspacesListRow.tsx index 69a8c2a705b80..709e7e45e2b52 100644 --- a/src/pages/workspace/WorkspacesListRow.tsx +++ b/src/pages/workspace/WorkspacesListRow.tsx @@ -351,10 +351,7 @@ function WorkspacesListRow({ - + {isNarrow && ThreeDotsSection} {!isNarrow && ThreeDotMenuOrPendingIcon} {!isNarrow && (