From de91d91544e8a1f32530c1ea255b6f23b16f9c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucien=20Akchot=C3=A9?= Date: Tue, 16 Dec 2025 17:22:52 +0100 Subject: [PATCH 1/4] Revert "Merge pull request #77207 from DylanDylann/remove-candelete" This reverts commit 591394c16159f805a77324bb9962596263684a56, reversing changes made to 873537818014aad1d76aad01d50cf33513ee78b9. --- src/components/Search/index.tsx | 4 +++ src/components/Search/types.ts | 3 ++ src/libs/SearchUIUtils.ts | 1 + src/pages/Search/SearchPage.tsx | 32 ++++--------------- src/types/onyx/SearchResults.ts | 3 ++ tests/unit/MoneyRequestReportUtilsTest.ts | 1 + tests/unit/Search/SearchUIUtilsTest.ts | 16 ++++++++-- .../Search/handleActionButtonPressTest.ts | 2 ++ tests/unit/TransactionGroupListItemTest.tsx | 1 + 9 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/components/Search/index.tsx b/src/components/Search/index.tsx index 7df17422c8d3f..8b6ec55f493b0 100644 --- a/src/components/Search/index.tsx +++ b/src/components/Search/index.tsx @@ -107,6 +107,7 @@ function mapTransactionItemToSelectedEntry( item.keyForList, { isSelected: true, + canDelete: item.canDelete, canReject: canRejectRequest, canHold: canHoldRequest, isHeld: isOnHold(item), @@ -199,6 +200,7 @@ function prepareTransactionsList( ...selectedTransactions, [item.keyForList]: { isSelected: true, + canDelete: item.canDelete, canReject: canRejectRequest, canHold: canHoldRequest, isHeld: isOnHold(item), @@ -544,6 +546,7 @@ function Search({ ), // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing isSelected: areAllMatchingItemsSelected || selectedTransactions[transactionItem.transactionID]?.isSelected || isExpenseReportType, + canDelete: transactionItem.canDelete, canReject: canRejectRequest, reportID: transactionItem.reportID, policyID: transactionItem.report?.policyID, @@ -595,6 +598,7 @@ function Search({ ), // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing isSelected: areAllMatchingItemsSelected || selectedTransactions[transactionItem.transactionID].isSelected, + canDelete: transactionItem.canDelete, canReject: canRejectRequest, reportID: transactionItem.reportID, policyID: transactionItem.report?.policyID, diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index d756a65f7701f..e0997ba00990d 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -11,6 +11,9 @@ type SelectedTransactionInfo = { /** Whether the transaction is selected */ isSelected: boolean; + /** If the transaction can be deleted */ + canDelete: boolean; + /** If the transaction can be rejected */ canReject: boolean; diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index d2fb521c205d8..10271af04cc41 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -2839,6 +2839,7 @@ function getTransactionFromTransactionListItem(item: TransactionListItemType): O isTaxAmountColumnWide, violations, hash, + canDelete, accountID, policyID, ...transaction diff --git a/src/pages/Search/SearchPage.tsx b/src/pages/Search/SearchPage.tsx index a3b8ff0762334..cdad6302ee9c9 100644 --- a/src/pages/Search/SearchPage.tsx +++ b/src/pages/Search/SearchPage.tsx @@ -60,9 +60,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SearchFullscreenNavigatorParamList} from '@libs/Navigation/types'; import {getActiveAdminWorkspaces, hasDynamicExternalWorkflow, hasOnlyPersonalPolicies as hasOnlyPersonalPoliciesUtil, isPaidGroupPolicy} from '@libs/PolicyUtils'; -import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils'; import { - canDeleteMoneyRequestReport, generateReportID, getPolicyExpenseChat, getReportOrDraftReport, @@ -677,24 +675,7 @@ function SearchPage({route}: SearchPageProps) { }); } - const shouldShowDeleteOption = - !isOffline && - selectedTransactionsKeys.every((id) => { - const transaction = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${id}`]; - if (!transaction) { - return false; - } - const parentReportID = transaction.reportID; - const parentReport = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`]; - if (!parentReport) { - return false; - } - const reportActions = currentSearchResults?.data?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${parentReportID}`]; - const parentReportAction = Object.values(reportActions ?? {}).find( - (action) => (isMoneyRequestAction(action) ? getOriginalMessage(action)?.IOUTransactionID : undefined) === transaction.transactionID, - ); - return canDeleteMoneyRequestReport(parentReport, [transaction], parentReportAction ? [parentReportAction] : []); - }); + const shouldShowDeleteOption = !isOffline && selectedTransactionsKeys.every((id) => selectedTransactions[id].canDelete); if (shouldShowDeleteOption) { options.push({ @@ -741,16 +722,15 @@ function SearchPage({route}: SearchPageProps) { status, hash, selectedTransactions, - expensifyIcons, translate, areAllMatchingItemsSelected, isOffline, selectedReports, - queryJSON, + selectedTransactionReportIDs, lastPaymentMethods, selectedReportIDs, allTransactions, - selectedTransactionReportIDs, + queryJSON, selectedPolicyIDs, policies, integrationsExportTemplates, @@ -760,14 +740,14 @@ function SearchPage({route}: SearchPageProps) { dismissedRejectUseExplanation, bulkPayButtonOptions, onBulkPaySelected, - areAllTransactionsFromSubmitter, - dismissedHoldUseExplanation, allReports, - currentSearchResults?.data, theme.icon, styles.colorMuted, styles.fontWeightNormal, styles.textWrap, + expensifyIcons, + dismissedHoldUseExplanation, + areAllTransactionsFromSubmitter, ]); const handleDeleteExpenses = () => { diff --git a/src/types/onyx/SearchResults.ts b/src/types/onyx/SearchResults.ts index 8b90d653cbbb7..08b66a5086afc 100644 --- a/src/types/onyx/SearchResults.ts +++ b/src/types/onyx/SearchResults.ts @@ -86,6 +86,9 @@ type SearchTransaction = { /** The transaction amount */ amount: number; + /** If the transaction can be deleted */ + canDelete: boolean; + /** The edited transaction amount */ modifiedAmount: number; diff --git a/tests/unit/MoneyRequestReportUtilsTest.ts b/tests/unit/MoneyRequestReportUtilsTest.ts index 7c9780747afed..b56254c74b234 100644 --- a/tests/unit/MoneyRequestReportUtilsTest.ts +++ b/tests/unit/MoneyRequestReportUtilsTest.ts @@ -57,6 +57,7 @@ const transactionItemBaseMock: TransactionListItemType = { policy: policyBaseMock, reportAction: reportActionBaseMock, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index a74629224e10a..4295531015090 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -390,6 +390,7 @@ const searchResults: OnyxTypes.SearchResults = { [`report_${reportID5}`]: report5, [`transactions_${transactionID}`]: { amount: -5000, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -419,6 +420,7 @@ const searchResults: OnyxTypes.SearchResults = { }, [`transactions_${transactionID2}`]: { amount: -5000, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -449,6 +451,7 @@ const searchResults: OnyxTypes.SearchResults = { ...allViolations, [`transactions_${transactionID3}`]: { amount: 1200, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -478,6 +481,7 @@ const searchResults: OnyxTypes.SearchResults = { }, [`transactions_${transactionID4}`]: { amount: 3200, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -763,6 +767,7 @@ const transactionsListItems = [ policy, reportAction: reportAction1, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -818,6 +823,7 @@ const transactionsListItems = [ policy, reportAction: reportAction2, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -883,6 +889,7 @@ const transactionsListItems = [ policy, reportAction: reportAction3, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -943,6 +950,7 @@ const transactionsListItems = [ policy, reportAction: reportAction4, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1042,6 +1050,7 @@ const transactionReportGroupListItems = [ reportAction: reportAction1, holdReportAction: undefined, amount: -5000, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1142,6 +1151,7 @@ const transactionReportGroupListItems = [ reportAction: reportAction2, holdReportAction: undefined, amount: -5000, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1849,7 +1859,7 @@ describe('SearchUIUtils', () => { expect(distanceTransaction).toBeDefined(); expect(distanceTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); - const expectedPropertyCount = 49; + const expectedPropertyCount = 50; expect(Object.keys(distanceTransaction ?? {}).length).toBe(expectedPropertyCount); }); @@ -1882,7 +1892,7 @@ describe('SearchUIUtils', () => { expect(distanceTransaction).toBeDefined(); expect(distanceTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); - const expectedPropertyCount = 47; + const expectedPropertyCount = 48; expect(Object.keys(distanceTransaction ?? {}).length).toBe(expectedPropertyCount); }); @@ -2474,6 +2484,7 @@ describe('SearchUIUtils', () => { // eslint-disable-next-line @typescript-eslint/naming-convention transactions_1805965960759424086: { amount: 0, + canDelete: false, category: 'Employee Meals Remote (Fringe Benefit)', comment: { comment: '', @@ -2596,6 +2607,7 @@ describe('SearchUIUtils', () => { // eslint-disable-next-line @typescript-eslint/naming-convention transactions_1805965960759424086: { amount: 0, + canDelete: false, cardID: undefined, cardName: undefined, category: 'Employee Meals Remote (Fringe Benefit)', diff --git a/tests/unit/Search/handleActionButtonPressTest.ts b/tests/unit/Search/handleActionButtonPressTest.ts index 39e62e3ee2f7b..3da97338f22b0 100644 --- a/tests/unit/Search/handleActionButtonPressTest.ts +++ b/tests/unit/Search/handleActionButtonPressTest.ts @@ -96,6 +96,7 @@ const mockReportItemWithHold = { action: 'view', allActions: ['view'], amount: -1200, + canDelete: true, category: '', comment: { comment: '', @@ -188,6 +189,7 @@ const mockReportItemWithHold = { action: 'view', allActions: ['view'], amount: -12300, + canDelete: true, category: '', comment: { comment: '', diff --git a/tests/unit/TransactionGroupListItemTest.tsx b/tests/unit/TransactionGroupListItemTest.tsx index 9017036ffdc95..17d04c8350340 100644 --- a/tests/unit/TransactionGroupListItemTest.tsx +++ b/tests/unit/TransactionGroupListItemTest.tsx @@ -26,6 +26,7 @@ jest.mock('@libs/SearchUIUtils', () => ({ const mockTransaction: TransactionListItemType = { accountID: 1, amount: 0, + canDelete: true, category: '', groupAmount: 1284, groupCurrency: 'USD', From 599daaf76976da9e551fc8e87ded75a343e87b6f Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 16 Dec 2025 11:51:32 -0700 Subject: [PATCH 2/4] Fix test --- tests/unit/Search/SearchUIUtilsTest.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index 4295531015090..8c0cc76e3930e 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1268,6 +1268,7 @@ const transactionReportGroupListItems = [ policy, reportAction: reportAction3, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1326,6 +1327,7 @@ const transactionReportGroupListItems = [ policy, reportAction: reportAction4, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', From 0dfdc3abb0a4990d17de936d226e26fd25238457 Mon Sep 17 00:00:00 2001 From: Andrew Gable Date: Tue, 16 Dec 2025 12:09:07 -0700 Subject: [PATCH 3/4] Fix test more --- tests/unit/Search/SearchUIUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index 8c0cc76e3930e..684a2d8936f0e 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1894,7 +1894,7 @@ describe('SearchUIUtils', () => { expect(distanceTransaction).toBeDefined(); expect(distanceTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); - const expectedPropertyCount = 48; + const expectedPropertyCount = 47; expect(Object.keys(distanceTransaction ?? {}).length).toBe(expectedPropertyCount); }); From fd7e1349ba200f1aafaf7b12e030b59dc3a266dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucien=20Akchot=C3=A9?= Date: Tue, 16 Dec 2025 20:49:59 +0100 Subject: [PATCH 4/4] fix test --- tests/unit/Search/SearchUIUtilsTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index 684a2d8936f0e..8c0cc76e3930e 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -1894,7 +1894,7 @@ describe('SearchUIUtils', () => { expect(distanceTransaction).toBeDefined(); expect(distanceTransaction?.iouRequestType).toBe(CONST.IOU.REQUEST_TYPE.DISTANCE); - const expectedPropertyCount = 47; + const expectedPropertyCount = 48; expect(Object.keys(distanceTransaction ?? {}).length).toBe(expectedPropertyCount); });