Skip to content

Commit d97829e

Browse files
authored
Merge pull request Expensify#63095 from software-mansion-labs/fix/offline-pattern-in-reoprt-table-view-fixes
[Better Expense Report Views] Fix for grey rows flash on edit and ability to select rows deleted offline
2 parents 1ec6dd7 + 9e146a4 commit d97829e

5 files changed

Lines changed: 29 additions & 11 deletions

File tree

src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
wasMessageReceivedWhileOffline,
4444
} from '@libs/ReportActionsUtils';
4545
import {canUserPerformWriteAction, chatIncludesChronosWithID, getReportLastVisibleActionCreated, isUnread} from '@libs/ReportUtils';
46+
import {isTransactionPendingDelete} from '@libs/TransactionUtils';
4647
import Visibility from '@libs/Visibility';
4748
import isSearchTopmostFullScreenRoute from '@navigation/helpers/isSearchTopmostFullScreenRoute';
4849
import FloatingMessageCounter from '@pages/home/report/FloatingMessageCounter';
@@ -547,7 +548,7 @@ function MoneyRequestReportActionsList({
547548
if (selectedTransactionsID.length !== 0) {
548549
setSelectedTransactionsID([]);
549550
} else {
550-
setSelectedTransactionsID(transactions.map((t) => t.transactionID));
551+
setSelectedTransactionsID(transactions.filter((t) => !isTransactionPendingDelete(t)).map((t) => t.transactionID));
551552
}
552553
}}
553554
/>
@@ -557,7 +558,7 @@ function MoneyRequestReportActionsList({
557558
if (selectedTransactionsID.length === transactions.length) {
558559
setSelectedTransactionsID([]);
559560
} else {
560-
setSelectedTransactionsID(transactions.map((t) => t.transactionID));
561+
setSelectedTransactionsID(transactions.filter((t) => !isTransactionPendingDelete(t)).map((t) => t.transactionID));
561562
}
562563
}}
563564
accessibilityLabel={translate('workspace.people.selectAll')}

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {navigationRef} from '@libs/Navigation/Navigation';
2929
import {getIOUActionForTransactionID} from '@libs/ReportActionsUtils';
3030
import {getMoneyRequestSpendBreakdown, isIOUReport} from '@libs/ReportUtils';
3131
import {compareValues} from '@libs/SearchUIUtils';
32-
import {getTransactionPendingAction} from '@libs/TransactionUtils';
32+
import {getTransactionPendingAction, isTransactionPendingDelete} from '@libs/TransactionUtils';
3333
import shouldShowTransactionYear from '@libs/TransactionUtils/shouldShowTransactionYear';
3434
import Navigation from '@navigation/Navigation';
3535
import variables from '@styles/variables';
@@ -206,7 +206,7 @@ function MoneyRequestReportTransactionList({
206206
if (selectedTransactionsID.length !== 0) {
207207
setSelectedTransactionsID([]);
208208
} else {
209-
setSelectedTransactionsID(transactions.map((t) => t.transactionID));
209+
setSelectedTransactionsID(transactions.filter((t) => !isTransactionPendingDelete(t)).map((t) => t.transactionID));
210210
}
211211
}}
212212
accessibilityLabel={CONST.ROLE.CHECKBOX}
@@ -235,7 +235,6 @@ function MoneyRequestReportTransactionList({
235235
)}
236236
<View style={[listHorizontalPadding, styles.gap2, styles.pb4]}>
237237
{sortedTransactions.map((transaction) => {
238-
const isPendingDelete = getTransactionPendingAction(transaction) === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
239238
return (
240239
<PressableWithFeedback
241240
key={transaction.transactionID}
@@ -274,7 +273,7 @@ function MoneyRequestReportTransactionList({
274273
setSelectedTransactionID(transaction.transactionID);
275274
setIsModalVisible(true);
276275
}}
277-
disabled={isPendingDelete}
276+
disabled={isTransactionPendingDelete(transaction)}
278277
>
279278
<TransactionItemRow
280279
transactionItem={transaction}

src/components/TransactionItemRow/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import useHover from '@hooks/useHover';
1616
import useStyleUtils from '@hooks/useStyleUtils';
1717
import useTheme from '@hooks/useTheme';
1818
import useThemeStyles from '@hooks/useThemeStyles';
19-
import {getMerchant, getCreated as getTransactionCreated, getTransactionPendingAction, isPartialMerchant} from '@libs/TransactionUtils';
19+
import {getMerchant, getCreated as getTransactionCreated, getTransactionPendingAction, isPartialMerchant, isTransactionPendingDelete} from '@libs/TransactionUtils';
2020
import variables from '@styles/variables';
2121
import CONST from '@src/CONST';
2222
import type {SearchPersonalDetails, SearchTransactionAction} from '@src/types/onyx/SearchResults';
@@ -84,6 +84,7 @@ function TransactionItemRow({
8484
const StyleUtils = useStyleUtils();
8585
const theme = useTheme();
8686
const pendingAction = getTransactionPendingAction(transactionItem);
87+
const isPendingDelete = isTransactionPendingDelete(transactionItem);
8788
const viewRef = useRef<View>(null);
8889

8990
const hasCategoryOrTag = !!transactionItem.category || !!transactionItem.tag;
@@ -246,17 +247,15 @@ function TransactionItemRow({
246247
onMouseEnter={bindHover.onMouseEnter}
247248
ref={viewRef}
248249
>
249-
<OfflineWithFeedback
250-
pendingAction={pendingAction}
251-
shouldForceOpacity={!!pendingAction}
252-
>
250+
<OfflineWithFeedback pendingAction={pendingAction}>
253251
{shouldUseNarrowLayout ? (
254252
<Animated.View style={[isInReportRow ? {} : animatedHighlightStyle]}>
255253
<View style={[styles.expenseWidgetRadius, styles.justifyContentEvenly, styles.p3, bgActiveStyles]}>
256254
<View style={[styles.flexRow]}>
257255
{shouldShowCheckbox && (
258256
<View style={[styles.mr3, styles.justifyContentCenter]}>
259257
<Checkbox
258+
disabled={isPendingDelete}
260259
onPress={() => {
261260
onCheckboxPress(transactionItem.transactionID);
262261
}}
@@ -344,6 +343,7 @@ function TransactionItemRow({
344343
<View style={[styles.flex1, styles.flexRow, styles.alignItemsCenter, styles.gap3]}>
345344
<View style={[styles.mr1]}>
346345
<Checkbox
346+
disabled={isPendingDelete}
347347
onPress={() => {
348348
onCheckboxPress(transactionItem.transactionID);
349349
}}

src/libs/TransactionUtils/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,6 +1589,10 @@ function getTransactionPendingAction(transaction: OnyxEntry<Transaction>): Pendi
15891589
return hasPendingFields ? CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE : null;
15901590
}
15911591

1592+
function isTransactionPendingDelete(transaction: OnyxEntry<Transaction>): boolean {
1593+
return getTransactionPendingAction(transaction) === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE;
1594+
}
1595+
15921596
export {
15931597
buildOptimisticTransaction,
15941598
calculateTaxAmount,
@@ -1690,6 +1694,7 @@ export {
16901694
checkIfShouldShowMarkAsCashButton,
16911695
getOriginalTransactionWithSplitInfo,
16921696
getTransactionPendingAction,
1697+
isTransactionPendingDelete,
16931698
};
16941699

16951700
export type {TransactionChanges};

tests/unit/TransactionUtilsTest.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,4 +504,17 @@ describe('TransactionUtils', () => {
504504
expect(result).toEqual(pendingAction);
505505
});
506506
});
507+
508+
describe('isTransactionPendingDelete', () => {
509+
it.each([
510+
['when pendingAction is null', null, false],
511+
['when pendingAction is delete', CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, true],
512+
['when pendingAction is add', CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, false],
513+
['when pendingAction is update', CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, false],
514+
])('%s', (_description, pendingAction, expected) => {
515+
const transaction = generateTransaction({pendingAction});
516+
const result = TransactionUtils.isTransactionPendingDelete(transaction);
517+
expect(result).toEqual(expected);
518+
});
519+
});
507520
});

0 commit comments

Comments
 (0)