From 70c2c26d180ec4dde2928e1c5d32a1f616fdbb93 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 7 Mar 2025 05:53:45 +0200 Subject: [PATCH 1/2] Clean up delete button visibility based on liability type --- src/libs/ReportUtils.ts | 20 ++++++++++++++++---- src/pages/ReportDetailsPage.tsx | 11 +++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 454c25a0b6d1d..50a51d55ed0da 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2153,6 +2153,18 @@ function canDeleteTransaction(moneyRequestReport: OnyxEntry): boolean { return canAddOrDeleteTransactions(moneyRequestReport); } +/** + * Checks whether the card transaction support deleting based on liability type + */ +function canDeleteCardTransactionByLiabilityType(iouTransactionID?: string): boolean { + const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID); + const isCardTransaction = isCardTransactionTransactionUtils(transaction); + if (!isCardTransaction) { + return true; + } + return transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW; +} + /** * Can only delete if the author is this user and the action is an ADD_COMMENT action or an IOU action in an unsettled report, or if the user is a * policy admin @@ -2161,11 +2173,10 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep const report = getReportOrDraftReport(reportID); const isActionOwner = reportAction?.actorAccountID === currentUserAccountID; const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`] ?? null; - const iouTransactionID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : ''; - const transaction = getTransaction(iouTransactionID ?? CONST.DEFAULT_NUMBER_ID); - const isCardTransaction = isCardTransactionTransactionUtils(transaction); if (isMoneyRequestAction(reportAction)) { + const iouTransactionID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : ''; + const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID); // For now, users cannot delete split actions const isSplitAction = getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT; @@ -2175,7 +2186,7 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep if (isActionOwner) { if (!isEmptyObject(report) && (isMoneyRequestReport(report) || isInvoiceReport(report))) { - return canDeleteTransaction(report) && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW)); + return canDeleteTransaction(report) && isCardTransactionCanBeDeleted; } return true; } @@ -9363,6 +9374,7 @@ export { getRoom, getRootParentReport, getRouteFromLink, + canDeleteCardTransactionByLiabilityType, getTaskAssigneeChatOnyxData, getTransactionDetails, getTransactionReportName, diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index afbc1fa160139..29c15a7c94705 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -39,6 +39,7 @@ import {getPersonalDetailsForAccountIDs} from '@libs/OptionsListUtils'; import {getConnectedIntegration, isPolicyAdmin as isPolicyAdminUtil, isPolicyEmployee as isPolicyEmployeeUtil, shouldShowPolicy} from '@libs/PolicyUtils'; import {getOneTransactionThreadReportID, getOriginalMessage, getTrackExpenseActionableWhisper, isDeletedAction, isMoneyRequestAction, isTrackExpenseAction} from '@libs/ReportActionsUtils'; import { + canDeleteCardTransactionByLiabilityType, canDeleteTransaction, canEditReportDescription as canEditReportDescriptionUtil, canHoldUnholdReportAction as canHoldUnholdReportActionUtil, @@ -92,7 +93,6 @@ import { shouldUseFullTitleToDisplay, } from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; -import {isCardTransaction as isCardTransactionTransactionUtils} from '@libs/TransactionUtils'; import { canCancelPayment, cancelPayment as cancelPaymentAction, @@ -297,13 +297,8 @@ function ReportDetailsPage({policies, report, route, reportMetadata}: ReportDeta isTaskReport && !isCanceledTaskReport && canWriteInReport(report) && report.stateNum !== CONST.REPORT.STATE_NUM.APPROVED && !isClosedReport(report) && canModifyTask && canActionTask; const canDeleteRequest = isActionOwner && (canDeleteTransaction(moneyRequestReport) || isSelfDMTrackExpenseReport) && !isDeletedParentAction; const iouTransactionID = isMoneyRequestAction(requestParentReportAction) ? getOriginalMessage(requestParentReportAction)?.IOUTransactionID : ''; - - /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ - const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${iouTransactionID || CONST.DEFAULT_NUMBER_ID}`); - const isCardTransaction = isCardTransactionTransactionUtils(transaction); - - const shouldShowDeleteButton = - shouldShowTaskDeleteButton || (canDeleteRequest && (!isCardTransaction || (isCardTransaction && transaction?.comment?.liabilityType === CONST.TRANSACTION.LIABILITY_TYPE.ALLOW))); + const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID); + const shouldShowDeleteButton = shouldShowTaskDeleteButton || (canDeleteRequest && isCardTransactionCanBeDeleted); useEffect(() => { if (canDeleteRequest) { From f229d42d58103d514a088d0699b1c1b800021c3f Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Fri, 7 Mar 2025 05:57:36 +0200 Subject: [PATCH 2/2] clean up --- src/libs/ReportUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 50a51d55ed0da..4850891304afa 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -2175,7 +2175,7 @@ function canDeleteReportAction(reportAction: OnyxInputOrEntry, rep const policy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`] ?? null; if (isMoneyRequestAction(reportAction)) { - const iouTransactionID = isMoneyRequestAction(reportAction) ? getOriginalMessage(reportAction)?.IOUTransactionID : ''; + const iouTransactionID = getOriginalMessage(reportAction)?.IOUTransactionID; const isCardTransactionCanBeDeleted = canDeleteCardTransactionByLiabilityType(iouTransactionID); // For now, users cannot delete split actions const isSplitAction = getOriginalMessage(reportAction)?.type === CONST.IOU.REPORT_ACTION_TYPE.SPLIT;