Skip to content

Commit 106e288

Browse files
committed
propagate group selection into transactions when expanded
1 parent 250e309 commit 106e288

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

src/components/Search/index.tsx

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)