From 592a32531858d003928b496c9a8a4e2a7221a735 Mon Sep 17 00:00:00 2001 From: NJ-2020 Date: Mon, 2 Feb 2026 19:59:53 +0700 Subject: [PATCH 01/11] fix: prevent changing payer role to member --- src/languages/en.ts | 2 ++ src/pages/workspace/WorkspaceMembersPage.tsx | 3 ++- .../members/WorkspaceMemberDetailsPage.tsx | 24 ++++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index e9750ea9ad09..278c2173c792 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -495,6 +495,8 @@ const translations = { member: 'Member', auditor: 'Auditor', role: 'Role', + roleCannotBeChanged: (workflowsLinkPage: string) => + `Role cannot be changed because this member is a Payer on this workspace.`, currency: 'Currency', groupCurrency: 'Group currency', rate: 'Rate', diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index fcea3732c47f..1786d7e102de 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -418,7 +418,8 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers login: details.login ?? '', customField1: policyEmployee.employeeUserID, customField2: policyEmployee.employeePayrollID, - isDisabledCheckbox: !(isPolicyAdmin && accountID !== policy?.ownerAccountID && accountID !== session?.accountID), + isDisabledCheckbox: + !(isPolicyAdmin && accountID !== policy?.ownerAccountID && accountID !== session?.accountID) || email === policy?.achAccount?.reimburser, isDisabled: isPendingDeleteOrError, isInteractive: !details.isOptimisticPersonalDetail, cursorStyle: details.isOptimisticPersonalDetail ? styles.cursorDefault : {}, diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx index 2ae06486029b..b2cfaeb42931 100644 --- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx @@ -26,6 +26,7 @@ import usePrevious from '@hooks/usePrevious'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeIllustrations from '@hooks/useThemeIllustrations'; import useThemeStyles from '@hooks/useThemeStyles'; +import useEnvironment from '@hooks/useEnvironment'; import {setPolicyPreventSelfApproval} from '@libs/actions/Policy/Policy'; import {removeApprovalWorkflow as removeApprovalWorkflowAction, updateApprovalWorkflow} from '@libs/actions/Workflow'; import { @@ -83,6 +84,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const illustrations = useThemeIllustrations(); const companyCardFeedIcons = useCompanyCardFeedIcons(); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); + const {environmentURL} = useEnvironment(); const [cardFeeds] = useCardFeeds(policyID); const [cardList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}`, {canBeMissing: true}); const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true}); @@ -106,6 +108,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const policyOwnerDisplayName = formatPhoneNumber(getDisplayNameOrDefault(ownerDetails)) ?? policy?.owner ?? ''; const hasMultipleFeeds = Object.keys(getCompanyFeeds(cardFeeds, false, true)).length > 0; const {cardList: assignableCards, ...workspaceCards} = getAllCardsForWorkspace(workspaceAccountID, cardList, cardFeeds, expensifyCardSettings); + const workspaceWorkflowsPageURL = `${environmentURL}/${ROUTES.WORKSPACE_WORKFLOWS.getRoute(policyID)}`; const isSMSLogin = Str.isSMSLogin(memberLogin); const phoneNumber = getPhoneNumber(details); const isReimburser = policy?.achAccount?.reimburser === memberLogin; @@ -303,13 +306,15 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM /> ) ) : ( -