From 9b2f1fd4842cc23b88c84e23f0b46a2842191ab4 Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Mon, 6 Oct 2025 12:21:49 +0200 Subject: [PATCH 1/6] feat: create report option for unreported expenses --- src/pages/iou/request/step/IOURequestEditReportCommon.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx index f1ae4bb22d6d8..ba23572b69e8a 100644 --- a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx +++ b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx @@ -152,7 +152,7 @@ function IOURequestEditReportCommon({ const headerMessage = useMemo(() => (searchValue && !reportOptions.length ? translate('common.noResultsFound') : ''), [searchValue, reportOptions, translate]); const createReportOption = useMemo(() => { - if (!createReport || isUnreported) { + if (!createReport) { return undefined; } @@ -164,7 +164,7 @@ function IOURequestEditReportCommon({ icon={Expensicons.DocumentPlus} /> ); - }, [createReport, isUnreported, translate, policyForMovingExpenses?.name]); + }, [createReport, translate, policyForMovingExpenses?.name]); // eslint-disable-next-line rulesdir/no-negated-variables const shouldShowNotFoundPage = useMemo(() => { From fec4f14d455ae53e80b74f120d571e05951b65b1 Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Wed, 8 Oct 2025 15:03:21 +0200 Subject: [PATCH 2/6] fix: minor change --- src/hooks/usePolicyForMovingExpenses.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hooks/usePolicyForMovingExpenses.ts b/src/hooks/usePolicyForMovingExpenses.ts index ef508c8b1c0db..8c8932a4fd0b3 100644 --- a/src/hooks/usePolicyForMovingExpenses.ts +++ b/src/hooks/usePolicyForMovingExpenses.ts @@ -16,8 +16,8 @@ function checkForPendingDelete(login: string, policy: OnyxEntry) { return isPolicyMemberWithoutPendingDelete(login, policy); } -function isPolicyMemberByRole(login: string, policy: OnyxEntry) { - return isPolicyAdmin(policy, login) || isPolicyUser(policy, login) || getPolicyRole(policy, login) === CONST.POLICY.ROLE.AUDITOR; +function isPolicyMemberByRole(policy: OnyxEntry) { + return !!policy?.role && Object.values(CONST.POLICY.ROLE).includes(policy.role); } function usePolicyForMovingExpenses() { @@ -32,7 +32,7 @@ function usePolicyForMovingExpenses() { const login = session?.email ?? ''; const userPolicies = Object.values(allPolicies ?? {}).filter( (policy) => - checkForPendingDelete(login, policy) && isPolicyMemberByRole(login, policy) && isPaidGroupPolicy(policy) && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + checkForPendingDelete(login, policy) && isPolicyMemberByRole(policy) && isPaidGroupPolicy(policy) && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, ); const isMemberOfMoreThanOnePolicy = userPolicies.length > 1; From 70c6c989e4bab14f8afe98aebe66867fc63f8cb8 Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Wed, 8 Oct 2025 15:11:45 +0200 Subject: [PATCH 3/6] fix: minor fixes --- src/hooks/usePolicyForMovingExpenses.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hooks/usePolicyForMovingExpenses.ts b/src/hooks/usePolicyForMovingExpenses.ts index 8c8932a4fd0b3..e0e313e598f6c 100644 --- a/src/hooks/usePolicyForMovingExpenses.ts +++ b/src/hooks/usePolicyForMovingExpenses.ts @@ -1,7 +1,7 @@ import {activePolicySelector} from '@selectors/Policy'; import type {OnyxEntry} from 'react-native-onyx'; import {useSession} from '@components/OnyxListItemProvider'; -import {getPolicyRole, isPaidGroupPolicy, isPolicyAdmin, isPolicyMemberWithoutPendingDelete, isPolicyUser} from '@libs/PolicyUtils'; +import {isPaidGroupPolicy, isPolicyMemberWithoutPendingDelete} from '@libs/PolicyUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Policy} from '@src/types/onyx'; @@ -9,7 +9,7 @@ import {isEmptyObject} from '@src/types/utils/EmptyObject'; import useOnyx from './useOnyx'; // TODO: temporary util - if we don't have employeeList object we don't check for the pending delete -function checkForPendingDelete(login: string, policy: OnyxEntry) { +function checkForUserPendingDelete(login: string, policy: OnyxEntry) { if (isEmptyObject(policy?.employeeList)) { return true; } @@ -32,7 +32,7 @@ function usePolicyForMovingExpenses() { const login = session?.email ?? ''; const userPolicies = Object.values(allPolicies ?? {}).filter( (policy) => - checkForPendingDelete(login, policy) && isPolicyMemberByRole(policy) && isPaidGroupPolicy(policy) && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + checkForUserPendingDelete(login, policy) && isPolicyMemberByRole(policy) && isPaidGroupPolicy(policy) && policy?.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, ); const isMemberOfMoreThanOnePolicy = userPolicies.length > 1; From a69a4cfe8db3f64681c4d3c64705470a92597c6a Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Thu, 9 Oct 2025 10:37:24 +0200 Subject: [PATCH 4/6] fix: enable report field --- src/components/Search/index.tsx | 4 ---- src/libs/ReportUtils.ts | 5 ++--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 9495d2085ef7a..c949d013a6702 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -99,7 +99,6 @@ function mapTransactionItemToSelectedEntry( undefined, undefined, outstandingReportsByPolicyID, - true, ), action: item.action, reportID: item.reportID, @@ -180,7 +179,6 @@ function prepareTransactionsList( undefined, undefined, outstandingReportsByPolicyID, - true, ), action: item.action, reportID: item.reportID, @@ -435,7 +433,6 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS undefined, undefined, outstandingReportsByPolicyID, - true, ), // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing isSelected: areAllMatchingItemsSelected || selectedTransactions[transaction.transactionID].isSelected, @@ -467,7 +464,6 @@ function Search({queryJSON, searchResults, onSearchListScroll, contentContainerS undefined, undefined, outstandingReportsByPolicyID, - true, ), // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing isSelected: areAllMatchingItemsSelected || selectedTransactions[transaction.transactionID].isSelected, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 73d2e0f6beb87..14c841f479489 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4303,8 +4303,6 @@ function canEditFieldOfMoneyRequest( isDeleteAction?: boolean, isChatReportArchived = false, outstandingReportsByPolicyID?: OutstandingReportsByPolicyIDDerivedValue, - // TODO: [Unreported Expense project] temporary check for Search Page only, remove it when no longer necessary - isSearchPageOption?: boolean, ): boolean { // A list of fields that cannot be edited by anyone, once an expense has been settled const restrictedFields: string[] = [ @@ -4389,9 +4387,10 @@ function canEditFieldOfMoneyRequest( // Unreported transaction from OldDot can have the reportID as an empty string const isUnreportedExpense = !transaction?.reportID || transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID; + const isUserWorkspaceMember = getActivePolicies(allPolicies ?? {}, currentUserEmail).filter((userPolicy) => isPaidGroupPolicyPolicyUtils(userPolicy)).length; - if (isUnreportedExpense && isSearchPageOption && isUserWorkspaceMember) { + if (isUnreportedExpense && isUserWorkspaceMember) { return true; } From 9b738aef9024010bfca135c3911347cbe30a5343 Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Thu, 9 Oct 2025 10:43:42 +0200 Subject: [PATCH 5/6] fix: prettier --- src/libs/ReportUtils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 14c841f479489..168cbdcff9466 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4387,7 +4387,6 @@ function canEditFieldOfMoneyRequest( // Unreported transaction from OldDot can have the reportID as an empty string const isUnreportedExpense = !transaction?.reportID || transaction?.reportID === CONST.REPORT.UNREPORTED_REPORT_ID; - const isUserWorkspaceMember = getActivePolicies(allPolicies ?? {}, currentUserEmail).filter((userPolicy) => isPaidGroupPolicyPolicyUtils(userPolicy)).length; if (isUnreportedExpense && isUserWorkspaceMember) { From ce48052634ad4374d26d4f415fa13aa0a42c8365 Mon Sep 17 00:00:00 2001 From: Agata Kosior Date: Thu, 9 Oct 2025 13:06:48 +0200 Subject: [PATCH 6/6] fix: clear selection --- src/pages/NewReportWorkspaceSelectionPage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/NewReportWorkspaceSelectionPage.tsx b/src/pages/NewReportWorkspaceSelectionPage.tsx index 287785d8c670e..37a129c7091e4 100644 --- a/src/pages/NewReportWorkspaceSelectionPage.tsx +++ b/src/pages/NewReportWorkspaceSelectionPage.tsx @@ -101,7 +101,8 @@ function NewReportWorkspaceSelectionPage({route}: NewReportWorkspaceSelectionPag ); if (selectedTransactionIDs.length) { clearSelectedTransactions(true); - } else if (selectedTransactionsKeys.length) { + } + if (selectedTransactionsKeys.length) { clearSelectedTransactions(); } Navigation.dismissModal();