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..8c0cc76e3930e 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: '', @@ -1258,6 +1268,7 @@ const transactionReportGroupListItems = [ policy, reportAction: reportAction3, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1316,6 +1327,7 @@ const transactionReportGroupListItems = [ policy, reportAction: reportAction4, holdReportAction: undefined, + canDelete: true, cardID: undefined, cardName: undefined, category: '', @@ -1849,7 +1861,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 +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); }); @@ -2474,6 +2486,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 +2609,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',