@@ -768,15 +768,18 @@ function Search({
768768 // This ensures report-level selection persists when new transactions are added.
769769 // Also check if the report itself was selected (when it was empty) by checking the reportID key
770770 const reportKey = transactionGroup . keyForList ;
771- const wasReportSelected = reportKey && reportKey in selectedTransactions ;
772- // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
773- const hasAnySelected = isExpenseReportType && ( wasReportSelected || transactionGroup . transactions . some ( ( transaction ) => transaction . transactionID in selectedTransactions ) ) ;
771+ const wasReportSelected = ! ! ( reportKey && reportKey in selectedTransactions ) ;
772+ const hasIndividualSelectedInGroup = transactionGroup . transactions . some (
773+ ( transaction ) => ( ! ! transaction . keyForList && transaction . keyForList in selectedTransactions ) || transaction . transactionID in selectedTransactions ,
774+ ) ;
775+ const propagateSelectionToAllRows = ( isExpenseReportType && ( wasReportSelected || hasIndividualSelectedInGroup ) ) || ( wasReportSelected && ! isExpenseReportType ) ;
774776
775777 for ( const transactionItem of transactionGroup . transactions ) {
776- const isSelected = transactionItem . transactionID in selectedTransactions ;
778+ const listKey = transactionItem . keyForList ?? transactionItem . transactionID ;
779+ const isSelected = listKey in selectedTransactions || transactionItem . transactionID in selectedTransactions ;
777780
778- // Include transaction if: already individually selected, part of select-all, or (for expense reports) part of a partially-selected report
779- const shouldInclude = isSelected || areAllMatchingItemsSelected || ( isExpenseReportType && hasAnySelected ) ;
781+ // Include transaction if: already individually selected, part of select-all, or group-level propagation ( expense report / empty group expanded)
782+ const shouldInclude = isSelected || areAllMatchingItemsSelected || propagateSelectionToAllRows ;
780783 if ( ! shouldInclude ) {
781784 continue ;
782785 }
@@ -797,7 +800,9 @@ function Search({
797800 searchResults ?. data ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ itemTransaction ?. comment ?. originalTransactionID } ` ] ??
798801 transactions ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ itemTransaction ?. comment ?. originalTransactionID } ` ] ;
799802
800- newTransactionList [ transactionItem . transactionID ] = {
803+ const previousSelection = selectedTransactions [ listKey ] ?? selectedTransactions [ transactionItem . transactionID ] ;
804+
805+ newTransactionList [ listKey ] = {
801806 transaction : transactionItem ,
802807 action : transactionItem . action ,
803808 canHold : canHoldRequest ,
@@ -814,7 +819,7 @@ function Search({
814819 policy : transactionItem . policy ,
815820 } ) ,
816821 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
817- isSelected : areAllMatchingItemsSelected || selectedTransactions [ transactionItem . transactionID ] ?. isSelected || isExpenseReportType ,
822+ isSelected : areAllMatchingItemsSelected || ! ! previousSelection ?. isSelected || propagateSelectionToAllRows ,
818823 canReject : canRejectRequest ,
819824 reportID : transactionItem . reportID ,
820825 policyID : transactionItem . report ?. policyID ,
@@ -836,7 +841,8 @@ function Search({
836841 if ( ! Object . hasOwn ( transactionItem , 'transactionID' ) || ! ( 'transactionID' in transactionItem ) ) {
837842 continue ;
838843 }
839- if ( ! ( transactionItem . transactionID in selectedTransactions ) && ! areAllMatchingItemsSelected ) {
844+ const listKey = transactionItem . keyForList ?? transactionItem . transactionID ;
845+ if ( ! ( listKey in selectedTransactions ) && ! ( transactionItem . transactionID in selectedTransactions ) && ! areAllMatchingItemsSelected ) {
840846 continue ;
841847 }
842848
@@ -853,7 +859,9 @@ function Search({
853859 const itemTransaction = searchResults ?. data ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ transactionItem . transactionID } ` ] as OnyxEntry < Transaction > ;
854860 const originalItemTransaction = searchResults ?. data ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ itemTransaction ?. comment ?. originalTransactionID } ` ] ;
855861
856- newTransactionList [ transactionItem . transactionID ] = {
862+ const flatPreviousSelection = selectedTransactions [ listKey ] ?? selectedTransactions [ transactionItem . transactionID ] ;
863+
864+ newTransactionList [ listKey ] = {
857865 transaction : transactionItem ,
858866 action : transactionItem . action ,
859867 canHold : canHoldRequest ,
@@ -870,7 +878,7 @@ function Search({
870878 policy : transactionItem . policy ,
871879 } ) ,
872880 // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
873- isSelected : areAllMatchingItemsSelected || selectedTransactions [ transactionItem . transactionID ] . isSelected ,
881+ isSelected : areAllMatchingItemsSelected || ! ! flatPreviousSelection ? .isSelected ,
874882 canReject : canRejectRequest ,
875883 reportID : transactionItem . reportID ,
876884 policyID : transactionItem . report ?. policyID ,
0 commit comments