diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 77cd66f78769..3fe9eaf8006f 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6852,6 +6852,7 @@ const CONST = { COMPLETED: 'completed', }, }, + GROUP_COLUMN_PREFIX: 'group', TABLE_COLUMNS: { RECEIPT: 'receipt', DATE: 'date', diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx index 7bd6344f4438..8c0dd8800be0 100644 --- a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx +++ b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx @@ -174,7 +174,7 @@ function TransactionGroupListExpanded({ openReportInRHP(transaction); }; - const minTableWidth = getTableMinWidth(columns ?? []); + const minTableWidth = getTableMinWidth(currentColumns.filter((column) => !column.startsWith(CONST.SEARCH.GROUP_COLUMN_PREFIX)) ?? []); const shouldScrollHorizontally = isLargeScreenWidth && minTableWidth > windowWidth; const content = ( diff --git a/src/components/TransactionItemRow/index.tsx b/src/components/TransactionItemRow/index.tsx index 06c8d563debe..26d47a3a5fa5 100644 --- a/src/components/TransactionItemRow/index.tsx +++ b/src/components/TransactionItemRow/index.tsx @@ -24,14 +24,16 @@ import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import {isCategoryMissing} from '@libs/CategoryUtils'; import getBase62ReportID from '@libs/getBase62ReportID'; +import {computeReportName} from '@libs/ReportNameUtils'; import {isExpenseReport, isSettled} from '@libs/ReportUtils'; import StringUtils from '@libs/StringUtils'; import { getDescription, getExchangeRate, getMerchant, - getOriginalAmount, - getOriginalCurrency, + getOriginalAmountForDisplay, + getOriginalCurrencyForDisplay, + getTaxName, getCreated as getTransactionCreated, hasMissingSmartscanFields, isAmountMissing, @@ -202,21 +204,6 @@ function TransactionItemRow({ const merchant = useMemo(() => getMerchantName(transactionItem, translate), [transactionItem, translate]); const description = getDescription(transactionItem); - const formattedTaxRate = useMemo(() => { - const taxRateName = transactionItem?.policy?.taxRates?.taxes?.[transactionItem.taxCode ?? '']?.name ?? ''; - const taxRateValue = transactionItem?.policy?.taxRates?.taxes?.[transactionItem.taxCode ?? '']?.value ?? ''; - - if (!taxRateName && !taxRateValue) { - return ''; - } - - if (!taxRateValue) { - return taxRateName; - } - - return `${taxRateName} (${taxRateValue})`; - }, [transactionItem?.policy?.taxRates?.taxes, transactionItem.taxCode]); - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing const merchantOrDescription = merchant || description; @@ -505,8 +492,8 @@ function TransactionItemRow({ style={[StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.ORIGINAL_AMOUNT, undefined, isAmountColumnWide)]} > ), @@ -525,7 +512,7 @@ function TransactionItemRow({ key={CONST.SEARCH.TABLE_COLUMNS.TAX_RATE} style={[StyleUtils.getReportTableColumnStyles(CONST.SEARCH.TABLE_COLUMNS.TAX_RATE)]} > - + ), [CONST.SEARCH.TABLE_COLUMNS.TAX_AMOUNT]: ( @@ -550,7 +537,7 @@ function TransactionItemRow({ [CONST.SEARCH.TABLE_COLUMNS.TITLE]: ( @@ -595,7 +582,6 @@ function TransactionItemRow({ isInSingleTransactionReport, exchangeRateMessage, isAmountColumnWide, - formattedTaxRate, isTaxAmountColumnWide, isLargeScreenWidth, ], diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index 6cd6b07ec993..13a6b8486079 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -120,8 +120,10 @@ import { getCategory, getDescription, getExchangeRate, + getOriginalAmountForDisplay, getTag, getTaxAmount, + getTaxName, getAmount as getTransactionAmount, getCreated as getTransactionCreatedDate, getMerchant as getTransactionMerchant, @@ -2235,12 +2237,20 @@ function getSortedTransactionData( if (sortBy === CONST.SEARCH.TABLE_COLUMNS.TAX_RATE) { return data.sort((a, b) => { - const aValue = `${a.policy?.taxRates?.taxes?.[a.taxCode ?? '']?.name ?? ''} (${a.policy?.taxRates?.taxes?.[a.taxCode ?? '']?.value ?? ''})`; - const bValue = `${b.policy?.taxRates?.taxes?.[b.taxCode ?? '']?.name ?? ''} (${b.policy?.taxRates?.taxes?.[b.taxCode ?? '']?.value ?? ''})`; + const aValue = getTaxName(a.policy, a); + const bValue = getTaxName(b.policy, b); return compareValues(aValue, bValue, sortOrder, sortBy, localeCompare); }); } + if (sortBy === CONST.SEARCH.TABLE_COLUMNS.ORIGINAL_AMOUNT) { + return data.sort((a, b) => { + const aValue = getOriginalAmountForDisplay(a, a.report?.type === CONST.REPORT.TYPE.EXPENSE); + const bValue = getOriginalAmountForDisplay(b, b.report?.type === CONST.REPORT.TYPE.EXPENSE); + return compareValues(aValue, bValue, sortOrder, sortBy, localeCompare, true); + }); + } + if (!sortingProperty) { return data; } diff --git a/src/libs/TransactionUtils/index.ts b/src/libs/TransactionUtils/index.ts index b52233516379..67dee434e129 100644 --- a/src/libs/TransactionUtils/index.ts +++ b/src/libs/TransactionUtils/index.ts @@ -843,6 +843,29 @@ function getOriginalAmount(transaction: Transaction): number { return Math.abs(amount); } +/** + * Return the original amount for display/sorting purposes. + * For expense reports, returns the negated value of (originalAmount || amount || modifiedAmount). + * For non-expense reports, returns getOriginalAmount() or Math.abs(amount) or Math.abs(modifiedAmount). + */ +function getOriginalAmountForDisplay(transaction: Pick, isExpenseReport: boolean): number { + /* eslint-disable @typescript-eslint/prefer-nullish-coalescing */ + if (isExpenseReport) { + return -((transaction.originalAmount || transaction.amount || transaction.modifiedAmount) ?? 0); + } + return getOriginalAmount(transaction as Transaction) || Math.abs(transaction.amount ?? 0) || Math.abs(transaction.modifiedAmount ?? 0); + /* eslint-enable @typescript-eslint/prefer-nullish-coalescing */ +} + +/** + * Return the original currency for display/sorting purposes. + * Falls back to originalCurrency, then currency, then modifiedCurrency. + */ +function getOriginalCurrencyForDisplay(transaction: Pick): string { + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + return transaction.originalCurrency || (transaction.amount === 0 ? transaction.modifiedCurrency : transaction.currency) || CONST.CURRENCY.USD; +} + /** * Verify if the transaction is expecting the distance to be calculated on the server */ @@ -2428,6 +2451,8 @@ export { getReportOwnerAsAttendee, getExchangeRate, shouldReuseInitialTransaction, + getOriginalAmountForDisplay, + getOriginalCurrencyForDisplay, }; export type {TransactionChanges}; diff --git a/src/pages/iou/MoneyRequestAmountForm.tsx b/src/pages/iou/MoneyRequestAmountForm.tsx index 50c2cfd7e657..9bb0f505b92e 100644 --- a/src/pages/iou/MoneyRequestAmountForm.tsx +++ b/src/pages/iou/MoneyRequestAmountForm.tsx @@ -139,7 +139,7 @@ function MoneyRequestAmountForm({ */ const submitAndNavigateToNextPage = useCallback( (iouPaymentType?: PaymentMethodType | undefined) => { - const isTaxAmountForm = Navigation.getActiveRoute().includes('taxAmount'); + const isTaxAmountForm = Navigation.getActiveRouteWithoutParams().includes('taxAmount'); // Skip the check for tax amount form as 0 is a valid input const currentAmount = moneyRequestAmountInputRef.current?.getNumber() ?? '';