From e1af882da686b8e6e01d89a916403735c26734a2 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Wed, 5 Feb 2025 18:57:43 +0530 Subject: [PATCH 1/4] fix: Scan - Delete option is displayed for an admin which causes an error. Signed-off-by: krishna2323 --- src/components/AttachmentModal.tsx | 5 ++++- src/libs/ReportUtils.ts | 11 ++++++----- src/pages/TransactionReceiptPage.tsx | 2 ++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index 74ff19f21a46..4286c6c834eb 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -133,6 +133,8 @@ type AttachmentModalProps = { canEditReceipt?: boolean; + canDeleteReceipt?: boolean; + shouldDisableSendButton?: boolean; attachmentLink?: string; @@ -157,6 +159,7 @@ function AttachmentModal({ children, fallbackSource, canEditReceipt = false, + canDeleteReceipt = false, onModalClose = () => {}, isLoading = false, shouldShowNotFoundPage = false, @@ -447,7 +450,7 @@ function AttachmentModal({ } const hasOnlyEReceipt = hasEReceipt(transaction) && !hasReceiptSource(transaction); - if (!hasOnlyEReceipt && hasReceipt(transaction) && !isReceiptBeingScanned(transaction) && canEditReceipt && !hasMissingSmartscanFields(transaction)) { + if (!hasOnlyEReceipt && hasReceipt(transaction) && !isReceiptBeingScanned(transaction) && canDeleteReceipt && !hasMissingSmartscanFields(transaction)) { menuItems.push({ icon: Expensicons.Trashcan, text: translate('receipt.deleteReceipt'), diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index eaee67283c1d..0845320f4f7a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -3534,7 +3534,7 @@ function canEditMoneyRequest(reportAction: OnyxInputOrEntry, fieldToEdit: ValueOf): boolean { +function canEditFieldOfMoneyRequest(reportAction: OnyxInputOrEntry, fieldToEdit: ValueOf, isDeleteAction?: boolean): boolean { // A list of fields that cannot be edited by anyone, once an expense has been settled const restrictedFields: string[] = [ CONST.EDIT_REQUEST_FIELD.AMOUNT, @@ -3587,13 +3587,14 @@ function canEditFieldOfMoneyRequest(reportAction: OnyxInputOrEntry if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.RECEIPT) { const isRequestor = currentUserAccountID === reportAction?.actorAccountID; - return ( - !isInvoiceReport(moneyRequestReport) && + return !isInvoiceReport(moneyRequestReport) && !isReceiptBeingScanned(transaction) && !isDistanceRequest(transaction) && !isPerDiemRequest(transaction) && - (isAdmin || isManager || isRequestor) - ); + (isAdmin || isManager || isRequestor) && + isDeleteAction + ? isRequestor + : true; } if (fieldToEdit === CONST.EDIT_REQUEST_FIELD.DISTANCE_RATE) { diff --git a/src/pages/TransactionReceiptPage.tsx b/src/pages/TransactionReceiptPage.tsx index 497adef4ec1e..07d12dc5d0cf 100644 --- a/src/pages/TransactionReceiptPage.tsx +++ b/src/pages/TransactionReceiptPage.tsx @@ -32,6 +32,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { const parentReportAction = ReportActionUtils.getReportAction(report?.parentReportID ?? '-1', report?.parentReportActionID ?? '-1'); const canEditReceipt = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT); + const canDeletedReceipt = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, true); const isEReceipt = transaction && !TransactionUtils.hasReceiptSource(transaction) && TransactionUtils.hasEReceipt(transaction); const isTrackExpenseAction = ReportActionUtils.isTrackExpenseAction(parentReportAction); @@ -71,6 +72,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { report={report} isReceiptAttachment canEditReceipt={canEditReceipt && !readonly} + canDeleteReceipt={canDeletedReceipt && !readonly} allowDownload={!isEReceipt} isTrackExpenseAction={isTrackExpenseAction} originalFileName={receiptURIs?.filename} From b62ae1f22e2a2d4511598c105edd5e310a64d94f Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Thu, 6 Feb 2025 03:59:32 +0530 Subject: [PATCH 2/4] update TransactionReceipt component to use named imports. Signed-off-by: krishna2323 --- src/pages/TransactionReceiptPage.tsx | 41 ++++++++++++++++------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/pages/TransactionReceiptPage.tsx b/src/pages/TransactionReceiptPage.tsx index 07d12dc5d0cf..fcf7bde98393 100644 --- a/src/pages/TransactionReceiptPage.tsx +++ b/src/pages/TransactionReceiptPage.tsx @@ -1,16 +1,21 @@ import React, {useEffect} from 'react'; import {useOnyx} from 'react-native-onyx'; import AttachmentModal from '@components/AttachmentModal'; +import {openReport} from '@libs/actions/Report'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {AuthScreensParamList, RootStackParamList, State} from '@libs/Navigation/types'; -import * as ReceiptUtils from '@libs/ReceiptUtils'; -import * as ReportActionUtils from '@libs/ReportActionsUtils'; -import * as ReportUtils from '@libs/ReportUtils'; -import * as TransactionUtils from '@libs/TransactionUtils'; +import {getThumbnailAndImageURIs} from '@libs/ReceiptUtils'; +import {getReportAction, isTrackExpenseAction as isTrackExpenseReportReportActionsUtils} from '@libs/ReportActionsUtils'; +import { + canEditFieldOfMoneyRequest, + isMoneyRequestReport, + isOneTransactionThread as isOneTransactionThreadReportUtils, + isTrackExpenseReport as isTrackExpenseReportReportUtils, +} from '@libs/ReportUtils'; +import {hasEReceipt, hasReceiptSource} from '@libs/TransactionUtils'; import tryResolveUrlFromApiRoot from '@libs/tryResolveUrlFromApiRoot'; import navigationRef from '@navigation/navigationRef'; -import * as ReportActions from '@userActions/Report'; import CONST from '@src/CONST'; import NAVIGATORS from '@src/NAVIGATORS'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -19,10 +24,10 @@ import type SCREENS from '@src/SCREENS'; type TransactionReceiptProps = PlatformStackScreenProps; function TransactionReceipt({route}: TransactionReceiptProps) { - const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID ?? '-1'}`); - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${route.params.transactionID ?? '-1'}`); - const [reportMetadata = {isLoadingInitialReportActions: true}] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${route.params.reportID ?? '-1'}`); - const receiptURIs = ReceiptUtils.getThumbnailAndImageURIs(transaction); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID ?? CONST.DEFAULT_NUMBER_ID}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${route.params.transactionID ?? CONST.DEFAULT_NUMBER_ID}`); + const [reportMetadata = {isLoadingInitialReportActions: true}] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT_METADATA}${route.params.reportID ?? CONST.DEFAULT_NUMBER_ID}`); + const receiptURIs = getThumbnailAndImageURIs(transaction); const imageSource = tryResolveUrlFromApiRoot(receiptURIs.image ?? ''); @@ -30,17 +35,17 @@ function TransactionReceipt({route}: TransactionReceiptProps) { const readonly = route.params.readonly === 'true'; const isFromReviewDuplicates = route.params.isFromReviewDuplicates === 'true'; - const parentReportAction = ReportActionUtils.getReportAction(report?.parentReportID ?? '-1', report?.parentReportActionID ?? '-1'); - const canEditReceipt = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT); - const canDeletedReceipt = ReportUtils.canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, true); - const isEReceipt = transaction && !TransactionUtils.hasReceiptSource(transaction) && TransactionUtils.hasEReceipt(transaction); - const isTrackExpenseAction = ReportActionUtils.isTrackExpenseAction(parentReportAction); + const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); + const canEditReceipt = canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT); + const canDeletedReceipt = canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, true); + const isEReceipt = transaction && !hasReceiptSource(transaction) && hasEReceipt(transaction); + const isTrackExpenseAction = isTrackExpenseReportReportActionsUtils(parentReportAction); useEffect(() => { if (report && transaction) { return; } - ReportActions.openReport(route.params.reportID); + openReport(route.params.reportID); // I'm disabling the warning, as it expects to use exhaustive deps, even though we want this useEffect to run only on the first render. // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps }, []); @@ -53,13 +58,13 @@ function TransactionReceipt({route}: TransactionReceiptProps) { if (secondToLastRoute?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR) { Navigation.dismissModal(); } else { - const isOneTransactionThread = ReportUtils.isOneTransactionThread(report?.reportID ?? '-1', report?.parentReportID ?? '-1', parentReportAction); + const isOneTransactionThread = isOneTransactionThreadReportUtils(report?.reportID ?? '-1', report?.parentReportID ?? '-1', parentReportAction); Navigation.dismissModal(isOneTransactionThread ? report?.parentReportID : report?.reportID); } }; - const moneyRequestReportID = ReportUtils.isMoneyRequestReport(report) ? report?.reportID : report?.parentReportID; - const isTrackExpenseReport = ReportUtils.isTrackExpenseReport(report); + const moneyRequestReportID = isMoneyRequestReport(report) ? report?.reportID : report?.parentReportID; + const isTrackExpenseReport = isTrackExpenseReportReportUtils(report); // eslint-disable-next-line rulesdir/no-negated-variables const shouldShowNotFoundPage = From 2b13da39c390b05286b627d7c0a720bb20aaf638 Mon Sep 17 00:00:00 2001 From: krishna2323 Date: Thu, 6 Feb 2025 04:03:05 +0530 Subject: [PATCH 3/4] minor updates. Signed-off-by: krishna2323 --- src/pages/TransactionReceiptPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/TransactionReceiptPage.tsx b/src/pages/TransactionReceiptPage.tsx index fcf7bde98393..d81f7a25a432 100644 --- a/src/pages/TransactionReceiptPage.tsx +++ b/src/pages/TransactionReceiptPage.tsx @@ -58,7 +58,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { if (secondToLastRoute?.name === NAVIGATORS.RIGHT_MODAL_NAVIGATOR) { Navigation.dismissModal(); } else { - const isOneTransactionThread = isOneTransactionThreadReportUtils(report?.reportID ?? '-1', report?.parentReportID ?? '-1', parentReportAction); + const isOneTransactionThread = isOneTransactionThreadReportUtils(report?.reportID, report?.parentReportID, parentReportAction); Navigation.dismissModal(isOneTransactionThread ? report?.parentReportID : report?.reportID); } }; @@ -68,7 +68,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { // eslint-disable-next-line rulesdir/no-negated-variables const shouldShowNotFoundPage = - isTrackExpenseReport || transaction?.reportID === CONST.REPORT.SPLIT_REPORTID || isFromReviewDuplicates ? !transaction : (moneyRequestReportID ?? '-1') !== transaction?.reportID; + isTrackExpenseReport || transaction?.reportID === CONST.REPORT.SPLIT_REPORTID || isFromReviewDuplicates ? !transaction : moneyRequestReportID !== transaction?.reportID; return ( Date: Thu, 6 Feb 2025 23:04:51 +0530 Subject: [PATCH 4/4] minor update. Signed-off-by: krishna2323 --- src/pages/TransactionReceiptPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/TransactionReceiptPage.tsx b/src/pages/TransactionReceiptPage.tsx index d81f7a25a432..52ce46105e5d 100644 --- a/src/pages/TransactionReceiptPage.tsx +++ b/src/pages/TransactionReceiptPage.tsx @@ -37,7 +37,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { const parentReportAction = getReportAction(report?.parentReportID, report?.parentReportActionID); const canEditReceipt = canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT); - const canDeletedReceipt = canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, true); + const canDeleteReceipt = canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.RECEIPT, true); const isEReceipt = transaction && !hasReceiptSource(transaction) && hasEReceipt(transaction); const isTrackExpenseAction = isTrackExpenseReportReportActionsUtils(parentReportAction); @@ -77,7 +77,7 @@ function TransactionReceipt({route}: TransactionReceiptProps) { report={report} isReceiptAttachment canEditReceipt={canEditReceipt && !readonly} - canDeleteReceipt={canDeletedReceipt && !readonly} + canDeleteReceipt={canDeleteReceipt && !readonly} allowDownload={!isEReceipt} isTrackExpenseAction={isTrackExpenseAction} originalFileName={receiptURIs?.filename}