From 9fb598e655121f93439865caf3db36fba27fb858 Mon Sep 17 00:00:00 2001 From: I Nyoman Jyotisa Date: Wed, 18 Mar 2026 01:42:09 +0800 Subject: [PATCH 1/2] Fix: Expense auto enters selection mode after clicking Move to report --- src/ROUTES.ts | 6 ++++-- src/components/MoneyReportHeader.tsx | 14 +++++++++++--- src/components/MoneyRequestHeader.tsx | 7 ++++--- src/libs/Navigation/types.ts | 1 + .../iou/request/step/IOURequestEditReport.tsx | 15 ++++++++------- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index c1cd30528c31e..89b978a499a63 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1160,13 +1160,15 @@ const ROUTES = { }, MONEY_REQUEST_EDIT_REPORT: { route: ':action/:iouType/report/:reportID/edit', - getRoute: (action: IOUAction, iouType: IOUType, reportID?: string, shouldTurnOffSelectionMode?: boolean, backTo = '') => { + getRoute: (action: IOUAction, iouType: IOUType, reportID?: string, shouldTurnOffSelectionMode?: boolean, backTo = '', transactionID?: string) => { if (!reportID) { Log.warn('Invalid reportID while building route MONEY_REQUEST_EDIT_REPORT'); } + const queryParams = [shouldTurnOffSelectionMode ? 'shouldTurnOffSelectionMode=true' : '', transactionID ? `transactionID=${transactionID}` : ''].filter(Boolean).join('&'); + const queryString = queryParams ? `?${queryParams}` : ''; // eslint-disable-next-line no-restricted-syntax -- Legacy route generation - return getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${reportID}/edit${shouldTurnOffSelectionMode ? '?shouldTurnOffSelectionMode=true' : ''}`, backTo); + return getUrlWithBackToParam(`${action as string}/${iouType as string}/report/${reportID}/edit${queryString}`, backTo); }, }, SET_DEFAULT_WORKSPACE: { diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 868ed3de8168e..31fe966a50896 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -531,7 +531,7 @@ function MoneyReportHeader({ > | null>(null); const {selectedTransactionIDs, currentSearchQueryJSON, currentSearchKey, currentSearchHash, currentSearchResults} = useSearchStateContext(); - const {removeTransaction, clearSelectedTransactions, setSelectedTransactions} = useSearchActionsContext(); + const {removeTransaction, clearSelectedTransactions} = useSearchActionsContext(); const shouldCalculateTotals = useSearchShouldCalculateTotals(currentSearchKey, currentSearchQueryJSON?.hash, true); const [shouldFailAllRequests] = useOnyx(ONYXKEYS.NETWORK, {selector: shouldFailAllRequestsSelector}); @@ -1901,8 +1901,16 @@ function MoneyReportHeader({ if (!transactionToMove?.transactionID) { return; } - setSelectedTransactions([transactionToMove.transactionID]); - Navigation.navigate(ROUTES.MONEY_REQUEST_EDIT_REPORT.getRoute(CONST.IOU.ACTION.EDIT, CONST.IOU.TYPE.SUBMIT, moneyRequestReport.reportID, true, Navigation.getActiveRoute())); + Navigation.navigate( + ROUTES.MONEY_REQUEST_EDIT_REPORT.getRoute( + CONST.IOU.ACTION.EDIT, + CONST.IOU.TYPE.SUBMIT, + moneyRequestReport.reportID, + true, + Navigation.getActiveRoute(), + transactionToMove.transactionID, + ), + ); }, }, [CONST.REPORT.SECONDARY_ACTIONS.CHANGE_APPROVER]: { diff --git a/src/components/MoneyRequestHeader.tsx b/src/components/MoneyRequestHeader.tsx index 873479b5ea7a7..6c733270c4bfd 100644 --- a/src/components/MoneyRequestHeader.tsx +++ b/src/components/MoneyRequestHeader.tsx @@ -170,7 +170,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre const isDuplicate = isDuplicateTransactionUtils(transaction, email ?? '', accountID, report, policy, transactionViolations); const reportID = report?.reportID; const {currentSearchHash} = useSearchStateContext(); - const {removeTransaction, setSelectedTransactions} = useSearchActionsContext(); + const {removeTransaction} = useSearchActionsContext(); const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID); const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction, originalTransaction); const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION); @@ -678,8 +678,9 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre ); return; } - setSelectedTransactions([transaction.transactionID]); - Navigation.navigate(ROUTES.MONEY_REQUEST_EDIT_REPORT.getRoute(CONST.IOU.ACTION.EDIT, iouType, parentReport.reportID, true, Navigation.getActiveRoute())); + Navigation.navigate( + ROUTES.MONEY_REQUEST_EDIT_REPORT.getRoute(CONST.IOU.ACTION.EDIT, iouType, parentReport.reportID, true, Navigation.getActiveRoute(), transaction.transactionID), + ); }, }, }; diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index b37080736f7dc..97b8c950498c0 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1779,6 +1779,7 @@ type MoneyRequestNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo: Routes; shouldTurnOffSelectionMode?: boolean; + transactionID?: string; }; [SCREENS.MONEY_REQUEST.STEP_REPORT]: { action: IOUAction; diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx index 27b70b8a3c534..c5601e693f513 100644 --- a/src/pages/iou/request/step/IOURequestEditReport.tsx +++ b/src/pages/iou/request/step/IOURequestEditReport.tsx @@ -33,9 +33,10 @@ type TransactionGroupListItem = ListItem & { type IOURequestEditReportProps = WithWritableReportOrNotFoundProps; function IOURequestEditReport({route}: IOURequestEditReportProps) { - const {backTo, reportID, action, shouldTurnOffSelectionMode} = route.params; + const {backTo, reportID, action, shouldTurnOffSelectionMode, transactionID: transactionIDFromParams} = route.params; const {translate, toLocaleDigit} = useLocalize(); const {selectedTransactionIDs} = useSearchStateContext(); + const transactionIDs = transactionIDFromParams ? [transactionIDFromParams] : selectedTransactionIDs; const {clearSelectedTransactions} = useSearchActionsContext(); const [allReports] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}`); const [selectedReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`); @@ -54,7 +55,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { ); const selectedReportPolicy = allPolicies?.[`${ONYXKEYS.COLLECTION.POLICY}${selectedReport?.policyID}`]; - const hasPerDiemTransactions = useHasPerDiemTransactions(selectedTransactionIDs); + const hasPerDiemTransactions = useHasPerDiemTransactions(transactionIDs); const {policyForMovingExpensesID, shouldSelectPolicy} = usePolicyForMovingExpenses(hasPerDiemTransactions, undefined, selectedReport?.policyID); const [transactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS); @@ -63,7 +64,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { const [allTransactions] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION); const [betas] = useOnyx(ONYXKEYS.BETAS); const selectReport = (item: TransactionGroupListItem, report?: OnyxEntry) => { - if (selectedTransactionIDs.length === 0 || item.value === reportID) { + if (transactionIDs.length === 0 || item.value === reportID) { Navigation.dismissToSuperWideRHP(); return; } @@ -72,7 +73,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { setNavigationActionToMicrotaskQueue(() => { changeTransactionsReport({ - transactionIDs: selectedTransactionIDs, + transactionIDs: transactionIDs, isASAPSubmitBetaEnabled, accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID, email: session?.email ?? '', @@ -92,11 +93,11 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { }; const removeFromReport = () => { - if (!selectedReport || selectedTransactionIDs.length === 0) { + if (!selectedReport || transactionIDs.length === 0) { return; } changeTransactionsReport({ - transactionIDs: selectedTransactionIDs, + transactionIDs: transactionIDs, isASAPSubmitBetaEnabled, accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID, email: session?.email ?? '', @@ -154,7 +155,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { Date: Wed, 18 Mar 2026 02:11:41 +0800 Subject: [PATCH 2/2] lint fix --- src/pages/iou/request/step/IOURequestEditReport.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/iou/request/step/IOURequestEditReport.tsx b/src/pages/iou/request/step/IOURequestEditReport.tsx index c5601e693f513..f80aa24b6c4cf 100644 --- a/src/pages/iou/request/step/IOURequestEditReport.tsx +++ b/src/pages/iou/request/step/IOURequestEditReport.tsx @@ -73,7 +73,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { setNavigationActionToMicrotaskQueue(() => { changeTransactionsReport({ - transactionIDs: transactionIDs, + transactionIDs, isASAPSubmitBetaEnabled, accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID, email: session?.email ?? '', @@ -97,7 +97,7 @@ function IOURequestEditReport({route}: IOURequestEditReportProps) { return; } changeTransactionsReport({ - transactionIDs: transactionIDs, + transactionIDs, isASAPSubmitBetaEnabled, accountID: session?.accountID ?? CONST.DEFAULT_NUMBER_ID, email: session?.email ?? '',