From bbf5a7268a7b211e01f6014b80a10b8173329130 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Sun, 5 Jul 2026 20:24:10 +0530 Subject: [PATCH 1/4] Fix people admin workspace access --- src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx | 2 ++ .../approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx | 3 ++- .../WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx b/src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx index dfe8798d7d46..0f57c45e7e09 100644 --- a/src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberCustomFieldPage.tsx @@ -58,6 +58,8 @@ function WorkspaceMemberCustomFieldPage({policy, route, personalDetails}: Worksp { diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx index bc64568bfa4d..a326ea5562f7 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx @@ -26,6 +26,7 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import React from 'react'; @@ -53,7 +54,7 @@ function WorkspaceWorkflowsApprovalsOverLimitApproverPage({policy, personalDetai const currentApproverEmail = currentApprover?.email; const canWriteApprovals = canMemberWrite(policy, currentUserLogin, CONST.POLICY.POLICY_FEATURE.WORKFLOWS_APPROVALS); - const shouldShowNotFoundView = !canWriteApprovals || isAnyHRReadOnlyWorkflowMode(policy); + const shouldShowNotFoundView = (!isEmptyObject(policy) && !isLoadingReportData && !canWriteApprovals) || isAnyHRReadOnlyWorkflowMode(policy); const shouldFilterOutExpensifyTeam = shouldFilterExpensifyTeam(policy?.owner, currentUserLogin); const allApprovers: SelectionListApprover[] = (() => { From c5032552b56e60b24d94ba8177c47a97c2f4892b Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Mon, 6 Jul 2026 12:36:04 +0530 Subject: [PATCH 2/4] Simplify workflow approver access checks --- .../approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx | 6 ++---- .../WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx index ae1918bcbb64..92518b52ceb8 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx @@ -15,7 +15,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types'; import {addSMSDomainIfPhoneNumber} from '@libs/PhoneNumber'; -import {canMemberWrite, getDefaultApprover, getMemberAccountIDsForWorkspace, isExpensifyTeam, shouldFilterExpensifyTeam} from '@libs/PolicyUtils'; +import {getDefaultApprover, getMemberAccountIDsForWorkspace, isExpensifyTeam, shouldFilterExpensifyTeam} from '@libs/PolicyUtils'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import MemberRightIcon from '@pages/workspace/MemberRightIcon'; @@ -26,7 +26,6 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import SCREENS from '@src/SCREENS'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import {useNavigationState} from '@react-navigation/native'; @@ -62,8 +61,7 @@ function WorkspaceWorkflowsApprovalsApproverPage({policy, personalDetails, isLoa const approversFromWorkflow = approvalWorkflow?.approvers; const isDefault = approvalWorkflow?.isDefault; - const canWriteApprovals = canMemberWrite(policy, currentUserLogin, CONST.POLICY.POLICY_FEATURE.WORKFLOWS_APPROVALS); - const shouldShowNotFoundView = (!isEmptyObject(policy) && !isLoadingReportData && !canWriteApprovals) || isAnyHRReadOnlyWorkflowMode(policy); + const shouldShowNotFoundView = isAnyHRReadOnlyWorkflowMode(policy); const shouldFilterOutExpensifyTeam = shouldFilterExpensifyTeam(policy?.owner, currentUserLogin); const allApprovers: SelectionListApprover[] = useMemo(() => { diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx index a326ea5562f7..dad09d930fc3 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx @@ -13,7 +13,7 @@ import {isAnyHRReadOnlyWorkflowMode} from '@libs/HRUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {WorkspaceSplitNavigatorParamList} from '@libs/Navigation/types'; -import {canMemberWrite, getMemberAccountIDsForWorkspace, isExpensifyTeam, shouldFilterExpensifyTeam} from '@libs/PolicyUtils'; +import {getMemberAccountIDsForWorkspace, isExpensifyTeam, shouldFilterExpensifyTeam} from '@libs/PolicyUtils'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import MemberRightIcon from '@pages/workspace/MemberRightIcon'; @@ -26,7 +26,6 @@ import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -import {isEmptyObject} from '@src/types/utils/EmptyObject'; import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue'; import React from 'react'; @@ -53,8 +52,7 @@ function WorkspaceWorkflowsApprovalsOverLimitApproverPage({policy, personalDetai const currentApproverEmail = currentApprover?.email; - const canWriteApprovals = canMemberWrite(policy, currentUserLogin, CONST.POLICY.POLICY_FEATURE.WORKFLOWS_APPROVALS); - const shouldShowNotFoundView = (!isEmptyObject(policy) && !isLoadingReportData && !canWriteApprovals) || isAnyHRReadOnlyWorkflowMode(policy); + const shouldShowNotFoundView = isAnyHRReadOnlyWorkflowMode(policy); const shouldFilterOutExpensifyTeam = shouldFilterExpensifyTeam(policy?.owner, currentUserLogin); const allApprovers: SelectionListApprover[] = (() => { From 8d9f3184c5dd2ab6b5569226c52b249e20dbe8a3 Mon Sep 17 00:00:00 2001 From: ShridharGoel <35566748+ShridharGoel@users.noreply.github.com> Date: Mon, 6 Jul 2026 14:02:02 +0530 Subject: [PATCH 3/4] Avoid redundant approver picker access gate --- .../approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx | 2 -- .../WorkspaceWorkflowsApprovalsOverLimitApproverPage.tsx | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx index 92518b52ceb8..06664ad32b12 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx @@ -237,8 +237,6 @@ function WorkspaceWorkflowsApprovalsApproverPage({policy, personalDetails, isLoa Date: Mon, 6 Jul 2026 17:22:33 +0530 Subject: [PATCH 4/4] Fix invite approver access for people admins --- .../WorkspaceInviteMessageApproverPage.tsx | 32 ++++++++++++------- ...orkspaceWorkflowsApprovalsApproverPage.tsx | 2 ++ ...orkflowsApprovalsOverLimitApproverPage.tsx | 2 ++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/pages/workspace/WorkspaceInviteMessageApproverPage.tsx b/src/pages/workspace/WorkspaceInviteMessageApproverPage.tsx index b38d687eebaa..8a648e0f411f 100644 --- a/src/pages/workspace/WorkspaceInviteMessageApproverPage.tsx +++ b/src/pages/workspace/WorkspaceInviteMessageApproverPage.tsx @@ -9,16 +9,18 @@ import {setWorkspaceInviteApproverDraft} from '@libs/actions/Policy/Member'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {getDefaultApprover, getMemberAccountIDsForWorkspace} from '@libs/PolicyUtils'; +import {getDefaultApprover, getMemberAccountIDsForWorkspace, goBackFromInvalidPolicy} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; import React from 'react'; import type {WithPolicyAndFullscreenLoadingProps} from './withPolicyAndFullscreenLoading'; +import AccessOrNotFoundWrapper from './AccessOrNotFoundWrapper'; import MemberRightIcon from './MemberRightIcon'; import withPolicyAndFullscreenLoading from './withPolicyAndFullscreenLoading'; @@ -110,16 +112,24 @@ function WorkspaceInviteMessageApproverPage({policy, personalDetails, isLoadingR }; return ( - + + + ); } diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx index 06664ad32b12..92518b52ceb8 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApproverPage.tsx @@ -237,6 +237,8 @@ function WorkspaceWorkflowsApprovalsApproverPage({policy, personalDetails, isLoa