From 4a2bef173c9cb878b6172f605f57765e477894d2 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Mon, 18 May 2026 11:27:04 +0200 Subject: [PATCH 1/8] Open room details RHP for admins, navigate to room for non-admins --- src/pages/workspace/rooms/WorkspaceRoomsPage.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 47fb2eb1a432..56f9e6024f05 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -18,6 +18,7 @@ import useWorkspaceDocumentTitle from '@hooks/useWorkspaceDocumentTitle'; import openWorkspaceRoomsPage from '@libs/actions/Policy/Room'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; +import {isPolicyAdmin} from '@libs/PolicyUtils'; import {getReportName} from '@libs/ReportNameUtils'; import {isChatRoom, isPolicyExpenseChat} from '@libs/ReportUtils'; import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; @@ -118,7 +119,10 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { renderItem={({item}) => ( Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(item.reportID))} + onPress={() => { + const targetRoute = isPolicyAdmin(policy) ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); + Navigation.navigate(targetRoute); + }} /> )} /> From 544e962313cba2938e275f96093b329704d1145d Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Wed, 20 May 2026 16:25:12 +0200 Subject: [PATCH 2/8] Lift isPolicyAdmin out of renderItem --- src/pages/workspace/rooms/WorkspaceRoomsPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 56f9e6024f05..3c6576798fff 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -43,6 +43,7 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { const illustrations = useMemoizedLazyIllustrations(['Hashtag']); const policyID = route.params.policyID; const policy = usePolicy(policyID); + const isAdmin = isPolicyAdmin(policy); useWorkspaceDocumentTitle(policy?.name, 'workspace.common.rooms'); const [rooms] = useOnyx(ONYXKEYS.COLLECTION.REPORT, { @@ -120,7 +121,7 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { { - const targetRoute = isPolicyAdmin(policy) ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); + const targetRoute = isAdmin ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(item.reportID) : ROUTES.REPORT_WITH_ID.getRoute(item.reportID); Navigation.navigate(targetRoute); }} /> From 2a3d1b91a79a3b3dec1a2b51ae8cc83462dacd37 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Fri, 29 May 2026 15:56:24 +0200 Subject: [PATCH 3/8] work in progress --- src/CONST/index.ts | 1 + src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + src/pages/ReportDetailsPage.tsx | 20 ++++++++++++++++++++ 12 files changed, 31 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index cd52881986ca..495ef25dacd3 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -4930,6 +4930,7 @@ const CONST = { INFO: 'info', }, REPORT_DETAILS_MENU_ITEM: { + GO_TO_ROOM: 'goToRoom', MEMBERS: 'member', INVITE: 'invite', SETTINGS: 'settings', diff --git a/src/languages/de.ts b/src/languages/de.ts index 8ed005124c40..f5f11267e73d 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2874,6 +2874,7 @@ ${amount} für ${merchant} – ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Zum Raum gehen', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF erstellen', waitForPDF: 'Bitte warten, während wir das PDF erstellen.', diff --git a/src/languages/en.ts b/src/languages/en.ts index bea2eba5c66f..fdb0cf3932ee 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2942,6 +2942,7 @@ const translations = { }, }, reportDetailsPage: { + goToRoom: 'Go to room', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Generate PDF', waitForPDF: 'Please wait while we generate the PDF.', diff --git a/src/languages/es.ts b/src/languages/es.ts index a5383564b845..3efa6af58973 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2750,6 +2750,7 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ir a la sala', inWorkspace: (policyName) => `en ${policyName}`, generatingPDF: 'Generar PDF', waitForPDF: 'Por favor, espera mientras creamos el PDF.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 7e80a229b724..dd422e321a38 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2882,6 +2882,7 @@ ${amount} pour ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Aller au salon', inWorkspace: (policyName: string) => `dans ${policyName}`, generatingPDF: 'Générer le PDF', waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.', diff --git a/src/languages/it.ts b/src/languages/it.ts index a8249039d10f..7d933de47a62 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2870,6 +2870,7 @@ ${amount} per ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Vai alla stanza', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Genera PDF', waitForPDF: 'Attendi mentre generiamo il PDF.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 8b1bebeadae5..b778ae761919 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2843,6 +2843,7 @@ ${date} の ${merchant} への ${amount}`, }, }, reportDetailsPage: { + goToRoom: 'ルームに移動', inWorkspace: (policyName: string) => `${policyName} 内`, generatingPDF: 'PDFを生成', waitForPDF: 'PDF を作成しています。しばらくお待ちください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 1dba9df9a594..76e99cdb1d00 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2867,6 +2867,7 @@ ${amount} voor ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ga naar ruimte', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF genereren', waitForPDF: 'Even geduld terwijl we de pdf genereren.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 38186bd07780..1e8162211584 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2861,6 +2861,7 @@ ${amount} dla ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Przejdź do pokoju', inWorkspace: (policyName: string) => `w ${policyName}`, generatingPDF: 'Wygeneruj PDF', waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index b52847067fe6..243d146087d1 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2861,6 +2861,7 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { + goToRoom: 'Ir para a sala', inWorkspace: (policyName: string) => `em ${policyName}`, generatingPDF: 'Gerar PDF', waitForPDF: 'Aguarde enquanto geramos o PDF.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index a2c19a1cfbef..512521907695 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2786,6 +2786,7 @@ ${amount},商户:${merchant} - 日期:${date}`, }, }, reportDetailsPage: { + goToRoom: '前往聊天室', inWorkspace: (policyName: string) => `在 ${policyName} 中`, generatingPDF: '生成 PDF', waitForPDF: '正在生成 PDF,请稍候。', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index f3ebb0f0f6c9..789c6dab07b4 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -178,6 +178,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading 'Camera', 'Trashcan', 'ArrowSplit', + 'ChatBubble', ]); const backTo = route.params.backTo; @@ -379,6 +380,10 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserPersonalDetails?.accountID, !!reportNameValuePairs?.private_isArchived); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; + // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself + // (e.g. the Workspace rooms list), i.e. the room report is not the report currently open in the central pane. + const shouldShowGoToRoom = isChatRoom && Navigation.getTopmostReportId() !== report?.reportID; + const reportForHeader = useMemo(() => getReportForHeader(report), [report]); const shouldParseFullTitle = parentReportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && !isGroupChat; const rawReportName = getReportNameFromReportNameUtils(reportForHeader, reportAttributes); @@ -409,6 +414,19 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading return items; } + if (shouldShowGoToRoom) { + items.push({ + key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_ROOM, + translationKey: 'reportDetailsPage.goToRoom', + icon: expensifyIcons.ChatBubble, + isAnonymousAction: false, + shouldShowRightIcon: true, + action: () => { + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(report?.reportID)); + }, + }); + } + // The Members page is only shown when: // - The report is a thread in a chat report // - The report is not a user created room with participants to show i.e. DM, Group Chat, etc @@ -628,6 +646,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading }, [ isSelfDM, isArchivedRoom, + shouldShowGoToRoom, isGroupChat, isDefaultRoom, isChatThread, @@ -658,6 +677,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading expensifyIcons.Building, expensifyIcons.Exit, expensifyIcons.Bug, + expensifyIcons.ChatBubble, styles.ph2, shouldOpenRoomMembersPage, backTo, From 026eae494c0cb29d3a9059b1f901a97a5ee32811 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Fri, 29 May 2026 17:40:50 +0200 Subject: [PATCH 4/8] Use Hashtag icon for Go to room and keep only en/es translations Match the icon used by the workspace Rooms tab. Drop the auto-generatable language entries so only en and es are maintained by hand. --- src/languages/de.ts | 1 - src/languages/fr.ts | 1 - src/languages/it.ts | 1 - src/languages/ja.ts | 1 - src/languages/nl.ts | 1 - src/languages/pl.ts | 1 - src/languages/pt-BR.ts | 1 - src/languages/zh-hans.ts | 1 - src/pages/ReportDetailsPage.tsx | 6 +++--- 9 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index f5f11267e73d..8ed005124c40 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2874,7 +2874,6 @@ ${amount} für ${merchant} – ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Zum Raum gehen', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF erstellen', waitForPDF: 'Bitte warten, während wir das PDF erstellen.', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index dd422e321a38..7e80a229b724 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2882,7 +2882,6 @@ ${amount} pour ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Aller au salon', inWorkspace: (policyName: string) => `dans ${policyName}`, generatingPDF: 'Générer le PDF', waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.', diff --git a/src/languages/it.ts b/src/languages/it.ts index 7d933de47a62..a8249039d10f 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2870,7 +2870,6 @@ ${amount} per ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Vai alla stanza', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'Genera PDF', waitForPDF: 'Attendi mentre generiamo il PDF.', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index b778ae761919..8b1bebeadae5 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2843,7 +2843,6 @@ ${date} の ${merchant} への ${amount}`, }, }, reportDetailsPage: { - goToRoom: 'ルームに移動', inWorkspace: (policyName: string) => `${policyName} 内`, generatingPDF: 'PDFを生成', waitForPDF: 'PDF を作成しています。しばらくお待ちください。', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 76e99cdb1d00..1dba9df9a594 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2867,7 +2867,6 @@ ${amount} voor ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Ga naar ruimte', inWorkspace: (policyName: string) => `in ${policyName}`, generatingPDF: 'PDF genereren', waitForPDF: 'Even geduld terwijl we de pdf genereren.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 1e8162211584..38186bd07780 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2861,7 +2861,6 @@ ${amount} dla ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Przejdź do pokoju', inWorkspace: (policyName: string) => `w ${policyName}`, generatingPDF: 'Wygeneruj PDF', waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 243d146087d1..b52847067fe6 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2861,7 +2861,6 @@ ${amount} para ${merchant} - ${date}`, }, }, reportDetailsPage: { - goToRoom: 'Ir para a sala', inWorkspace: (policyName: string) => `em ${policyName}`, generatingPDF: 'Gerar PDF', waitForPDF: 'Aguarde enquanto geramos o PDF.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 512521907695..a2c19a1cfbef 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2786,7 +2786,6 @@ ${amount},商户:${merchant} - 日期:${date}`, }, }, reportDetailsPage: { - goToRoom: '前往聊天室', inWorkspace: (policyName: string) => `在 ${policyName} 中`, generatingPDF: '生成 PDF', waitForPDF: '正在生成 PDF,请稍候。', diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 789c6dab07b4..e477e2dcb647 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -178,7 +178,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading 'Camera', 'Trashcan', 'ArrowSplit', - 'ChatBubble', + 'Hashtag', ]); const backTo = route.params.backTo; @@ -418,7 +418,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading items.push({ key: CONST.REPORT_DETAILS_MENU_ITEM.GO_TO_ROOM, translationKey: 'reportDetailsPage.goToRoom', - icon: expensifyIcons.ChatBubble, + icon: expensifyIcons.Hashtag, isAnonymousAction: false, shouldShowRightIcon: true, action: () => { @@ -677,7 +677,7 @@ function ReportDetailsPage({policy, report, route, reportMetadata, reportLoading expensifyIcons.Building, expensifyIcons.Exit, expensifyIcons.Bug, - expensifyIcons.ChatBubble, + expensifyIcons.Hashtag, styles.ph2, shouldOpenRoomMembersPage, backTo, From 942cdef76ca46c48f783470c82a0fbc552475d21 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Mon, 1 Jun 2026 09:46:19 +0200 Subject: [PATCH 5/8] Show Go to room for all workspace room list entries with hashtag icon --- src/pages/DynamicReportDetailsPage.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index ddbfffd8094a..8ade148b805b 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -381,9 +381,8 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserPersonalDetails?.accountID, !!reportNameValuePairs?.private_isArchived); const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; - // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself - // (e.g. the Workspace rooms list), i.e. the room report is not the report currently open in the central pane. - const shouldShowGoToRoom = isChatRoom && Navigation.getTopmostReportId() !== report?.reportID; + // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself (e.g. the Workspace rooms list). + const shouldShowGoToRoom = (isChatRoom || isPolicyExpenseChat) && Navigation.getTopmostReportId() !== report?.reportID; const reportForHeader = useMemo(() => getReportForHeader(report), [report]); const shouldParseFullTitle = parentReportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && !isGroupChat; From 568502a8dd516d4b36ca097c1c7c0615f03b7d49 Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Mon, 1 Jun 2026 11:01:18 +0200 Subject: [PATCH 6/8] Open room details RHP over Workspace rooms list and fix Go to room visibility --- src/ROUTES.ts | 11 ++++++++++- src/pages/DynamicReportDetailsPage.tsx | 4 +++- src/pages/workspace/rooms/WorkspaceRoomsPage.tsx | 5 +++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index ce1823a2abd3..43f3c847f760 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -669,7 +669,16 @@ const DYNAMIC_ROUTES = { }, REPORT_DETAILS: { path: 'details', - entryScreens: [SCREENS.RIGHT_MODAL.SEARCH_REPORT, SCREENS.RIGHT_MODAL.EXPENSE_REPORT, SCREENS.REPORT, SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT, SCREENS.SEARCH.ROOT], + entryScreens: [ + SCREENS.RIGHT_MODAL.SEARCH_REPORT, + SCREENS.RIGHT_MODAL.EXPENSE_REPORT, + SCREENS.REPORT, + SCREENS.RIGHT_MODAL.SEARCH_MONEY_REQUEST_REPORT, + SCREENS.SEARCH.ROOT, + SCREENS.WORKSPACE.ROOMS, + ], + getRoute: (reportID: string) => getUrlWithParams('details', {reportID}), + queryParams: ['reportID'], }, REPORT_DETAILS_SHARE_CODE: { path: 'share-code', diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index 8ade148b805b..eea12d7ec3c6 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -47,6 +47,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import getBase62ReportID from '@libs/getBase62ReportID'; import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID'; import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; +import isReportTopmostSplitNavigator from '@libs/Navigation/helpers/isReportTopmostSplitNavigator'; import Navigation, {navigationRef} from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {ReportDetailsNavigatorParamList, RightModalNavigatorParamList} from '@libs/Navigation/types'; @@ -382,7 +383,8 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself (e.g. the Workspace rooms list). - const shouldShowGoToRoom = (isChatRoom || isPolicyExpenseChat) && Navigation.getTopmostReportId() !== report?.reportID; + const isRoomCurrentlyOpen = isReportTopmostSplitNavigator() && Navigation.getTopmostReportId() === report?.reportID; + const shouldShowGoToRoom = (isChatRoom || isPolicyExpenseChat) && !isRoomCurrentlyOpen; const reportForHeader = useMemo(() => getReportForHeader(report), [report]); const shouldParseFullTitle = parentReportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && !isGroupChat; diff --git a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx index 61f557d203cb..55a41d0e23a1 100644 --- a/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx +++ b/src/pages/workspace/rooms/WorkspaceRoomsPage.tsx @@ -19,6 +19,7 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; import useWorkspaceDocumentTitle from '@hooks/useWorkspaceDocumentTitle'; import {openPolicyRoomsPage} from '@libs/actions/Policy/Room'; +import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils'; @@ -29,7 +30,7 @@ import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import ROUTES, {DYNAMIC_ROUTES} from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; type WorkspaceRoomsPageProps = PlatformStackScreenProps; @@ -68,7 +69,7 @@ function WorkspaceRoomsPage({route}: WorkspaceRoomsPageProps) { ownerDisplayName: ownerDetails ? getDisplayNameOrDefault(ownerDetails) : '', memberCount: getParticipantsAccountIDsForDisplay(report, true, false, false, undefined, personalDetails).length, action: () => { - const targetRoute = isAdmin ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID) : ROUTES.REPORT_WITH_ID.getRoute(report.reportID); + const targetRoute = isAdmin ? createDynamicRoute(DYNAMIC_ROUTES.REPORT_DETAILS.getRoute(report.reportID)) : ROUTES.REPORT_WITH_ID.getRoute(report.reportID); Navigation.navigate(targetRoute); }, }; From e3b800b4e987c3cb1a7e78a6cd4d6995c36b687f Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Tue, 2 Jun 2026 10:24:50 +0200 Subject: [PATCH 7/8] add translations --- src/languages/de.ts | 1 + src/languages/fr.ts | 3 ++- src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + 8 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 8bda4e402694..37eba434f04f 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2892,6 +2892,7 @@ ${amount} für ${merchant} – ${date}`, waitForPDF: 'Bitte warten, während wir das PDF erstellen.', errorPDF: 'Beim Versuch, Ihre PDF zu erstellen, ist ein Fehler aufgetreten', successPDF: 'Dein PDF wurde erstellt! Falls es nicht automatisch heruntergeladen wurde, verwende die Schaltfläche unten.', + goToRoom: 'Zum Raum gehen', }, reportDescriptionPage: { roomDescription: 'Zimmerbeschreibung', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index df8a728dc2a7..55a81f919085 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2900,6 +2900,7 @@ ${amount} pour ${merchant} - ${date}`, waitForPDF: 'Veuillez patienter pendant que nous générons le PDF.', errorPDF: 'Une erreur s’est produite lors de la tentative de génération de votre PDF', successPDF: 'Votre PDF a été généré ! S’il ne s’est pas téléchargé automatiquement, utilisez le bouton ci-dessous.', + goToRoom: 'Aller à la salle', }, reportDescriptionPage: { roomDescription: 'Description de la salle', @@ -2976,7 +2977,7 @@ ${amount} pour ${merchant} - ${date}`, phoneOrEmail: 'Téléphone ou e-mail', error: { agentSignInBlocked: - 'Les comptes d\u2019agent ne permettent pas de se connecter directement. Pour utiliser un agent, connectez-vous avec votre propre compte et accédez-y via Copilot.', + 'Les comptes d’agent ne permettent pas de se connecter directement. Pour utiliser un agent, connectez-vous avec votre propre compte et accédez-y via Copilot.', invalidFormatEmailLogin: 'L’adresse e-mail saisie est invalide. Veuillez corriger le format et réessayer.', }, cannotGetAccountDetails: 'Impossible de récupérer les détails du compte. Veuillez essayer de vous reconnecter.', diff --git a/src/languages/it.ts b/src/languages/it.ts index 873bd2941bc4..cb0fbf816eaa 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2888,6 +2888,7 @@ ${amount} per ${merchant} - ${date}`, waitForPDF: 'Attendi mentre generiamo il PDF.', errorPDF: 'Si è verificato un errore durante il tentativo di generare il tuo PDF', successPDF: 'Il tuo PDF è stato generato! Se non è stato scaricato automaticamente, usa il pulsante qui sotto.', + goToRoom: 'Vai alla stanza', }, reportDescriptionPage: { roomDescription: 'Descrizione stanza', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index f3200b394346..9369948e5175 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2864,6 +2864,7 @@ ${date} の ${merchant} への ${amount}`, waitForPDF: 'PDF を作成しています。しばらくお待ちください。', errorPDF: 'PDF の生成中にエラーが発生しました', successPDF: 'PDFが作成されました!自動的にダウンロードされない場合は、下のボタンを使用してください。', + goToRoom: 'ルームに移動', }, reportDescriptionPage: { roomDescription: '部屋の説明', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 92edd92d3d6d..80a4aa5336c9 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2885,6 +2885,7 @@ ${amount} voor ${merchant} - ${date}`, waitForPDF: 'Even geduld terwijl we de pdf genereren.', errorPDF: 'Er is een fout opgetreden bij het genereren van je PDF', successPDF: 'Je PDF is gegenereerd! Als het niet automatisch is gedownload, gebruik dan de knop hieronder.', + goToRoom: 'Ga naar kamer', }, reportDescriptionPage: { roomDescription: 'Kamerbeschrijving', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 42b105e62d48..ff8291fc1499 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2879,6 +2879,7 @@ ${amount} dla ${merchant} - ${date}`, waitForPDF: 'Poczekaj, aż wygenerujemy plik PDF.', errorPDF: 'Wystąpił błąd podczas próby wygenerowania Twojego pliku PDF', successPDF: 'Twój plik PDF został wygenerowany! Jeśli nie pobrał się automatycznie, użyj przycisku poniżej.', + goToRoom: 'Przejdź do pokoju', }, reportDescriptionPage: { roomDescription: 'Opis pokoju', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index ab3f8e49e2d1..fb07eb588189 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2879,6 +2879,7 @@ ${amount} para ${merchant} - ${date}`, waitForPDF: 'Aguarde enquanto geramos o PDF.', errorPDF: 'Ocorreu um erro ao tentar gerar seu PDF', successPDF: 'Seu PDF foi gerado! Se ele não foi baixado automaticamente, use o botão abaixo.', + goToRoom: 'Ir para a sala', }, reportDescriptionPage: { roomDescription: 'Descrição do quarto', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index b28aeef66f6a..1f0599d53867 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -2807,6 +2807,7 @@ ${amount},商户:${merchant} - 日期:${date}`, waitForPDF: '正在生成 PDF,请稍候。', errorPDF: '尝试生成您的 PDF 时出错', successPDF: '您的 PDF 已生成!如果没有自动下载,请使用下面的按钮。', + goToRoom: '进入房间', }, reportDescriptionPage: { roomDescription: '房间描述', From 1e85b0349e4dda3443ae34dc1a8c06e3b870b5ef Mon Sep 17 00:00:00 2001 From: sumo_slonik Date: Wed, 3 Jun 2026 10:10:56 +0200 Subject: [PATCH 8/8] Hide Go to workspace in room details over rooms list and add bottom spacing to rooms table --- src/components/Tables/WorkspaceRoomsTable/index.tsx | 8 +++++++- src/pages/DynamicReportDetailsPage.tsx | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/Tables/WorkspaceRoomsTable/index.tsx b/src/components/Tables/WorkspaceRoomsTable/index.tsx index 04396e8e45d3..78d2c60ab7fb 100644 --- a/src/components/Tables/WorkspaceRoomsTable/index.tsx +++ b/src/components/Tables/WorkspaceRoomsTable/index.tsx @@ -3,6 +3,7 @@ import React from 'react'; import {View} from 'react-native'; import type {CompareItemsCallback, IsItemInSearchCallback, TableColumn} from '@components/Table'; import Table from '@components/Table'; +import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddingStyle'; import useLocalize from '@hooks/useLocalize'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -22,6 +23,11 @@ function WorkspaceRoomsTable({rooms}: WorkspaceRoomsTableProps) { const {translate, localeCompare} = useLocalize(); const {shouldUseNarrowLayout, isMediumScreenWidth} = useResponsiveLayout(); const shouldUseNarrowTableLayout = shouldUseNarrowLayout || isMediumScreenWidth; + const tableBodyContentContainerStyle = useBottomSafeSafeAreaPaddingStyle({ + addBottomSafeAreaPadding: true, + addOfflineIndicatorBottomSafeAreaPadding: true, + style: styles.pb5, + }); const columns: Array> = [ {key: 'name', label: translate('common.name')}, @@ -69,7 +75,7 @@ function WorkspaceRoomsTable({rooms}: WorkspaceRoomsTableProps) { - + ); } diff --git a/src/pages/DynamicReportDetailsPage.tsx b/src/pages/DynamicReportDetailsPage.tsx index eea12d7ec3c6..95ec482ea837 100644 --- a/src/pages/DynamicReportDetailsPage.tsx +++ b/src/pages/DynamicReportDetailsPage.tsx @@ -380,11 +380,11 @@ function DynamicReportDetailsPage({policy, report, route, reportMetadata, report }, [showConfirmModal, translate, leaveChat]); const shouldShowLeaveButton = canLeaveChat(report, policy, currentUserPersonalDetails?.accountID, !!reportNameValuePairs?.private_isArchived); - const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending; // Only show the "Go to room" row when the Details page was opened from a screen other than the room report itself (e.g. the Workspace rooms list). const isRoomCurrentlyOpen = isReportTopmostSplitNavigator() && Navigation.getTopmostReportId() === report?.reportID; const shouldShowGoToRoom = (isChatRoom || isPolicyExpenseChat) && !isRoomCurrentlyOpen; + const shouldShowGoToWorkspace = shouldShowPolicy(policy, false, currentUserPersonalDetails?.email) && !policy?.isJoinRequestPending && !shouldShowGoToRoom; const reportForHeader = useMemo(() => getReportForHeader(report), [report]); const shouldParseFullTitle = parentReportAction?.actionName !== CONST.REPORT.ACTIONS.TYPE.ADD_COMMENT && !isGroupChat;