Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,8 @@ const CONST = {
IS_TRAVEL_VERIFIED: 'isTravelVerified',
PLAID_COMPANY_CARDS: 'plaidCompanyCards',
TRACK_FLOWS: 'trackFlows',
NEWDOT_REVERT_SPLITS: 'newDotRevertSplits',
NEWDOT_UPDATE_SPLITS: 'newDotUpdateSplits',
EXPENSIFY_CARD_EU_UK: 'expensifyCardEuUk',
EUR_BILLING: 'eurBilling',
NO_OPTIMISTIC_TRANSACTION_THREADS: 'noOptimisticTransactionThreads',
Expand Down Expand Up @@ -5133,6 +5135,7 @@ const CONST = {
DISABLED: 'disabled',
},
SPACE_CHARACTER_WIDTH: 4,
CHARACTER_WIDTH: 8,

// The attribute used in the SelectionScraper.js helper to query all the DOM elements
// that should be removed from the copied contents in the getHTMLOfSelection() method
Expand Down
9 changes: 7 additions & 2 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import useOnyx from '@hooks/useOnyx';
import useParticipantsInvoiceReport from '@hooks/useParticipantsInvoiceReport';
import usePaymentAnimations from '@hooks/usePaymentAnimations';
import usePaymentOptions from '@hooks/usePaymentOptions';
import usePermissions from '@hooks/usePermissions';
import useReportIsArchived from '@hooks/useReportIsArchived';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useSelectedTransactionsActions from '@hooks/useSelectedTransactionsActions';
Expand Down Expand Up @@ -71,6 +72,7 @@ import {
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
import {
allHavePendingRTERViolation,
getOriginalTransactionWithSplitInfo,
hasDuplicateTransactions,
isDuplicate,
isExpensifyCardTransaction,
Expand Down Expand Up @@ -198,6 +200,7 @@ function MoneyReportHeader({
const [csvExportLayouts] = useOnyx(ONYXKEYS.NVP_CSV_EXPORT_LAYOUTS, {canBeMissing: true});
const [lastDistanceExpenseType] = useOnyx(ONYXKEYS.NVP_LAST_DISTANCE_EXPENSE_TYPE, {canBeMissing: true});
const exportTemplates = useMemo(() => getExportTemplates(integrationsExportTemplates ?? [], csvExportLayouts ?? {}, policy), [integrationsExportTemplates, csvExportLayouts, policy]);
const {isBetaEnabled} = usePermissions();

const requestParentReportAction = useMemo(() => {
if (!reportActions || !transactionThreadReport?.parentReportActionID) {
Expand Down Expand Up @@ -256,6 +259,7 @@ function MoneyReportHeader({
const {translate} = useLocalize();
const {isOffline} = useNetwork();
const isOnHold = isOnHoldTransactionUtils(transaction);
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction);

const [policies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: true});
const [isHoldMenuVisible, setIsHoldMenuVisible] = useState(false);
Expand Down Expand Up @@ -880,8 +884,9 @@ function MoneyReportHeader({
reportActions,
policies,
isChatReportArchived,
isNewDotUpdateSplitsBeta: isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS),
});
}, [moneyRequestReport, transactions, violations, policy, reportNameValuePairs, reportActions, policies, chatReport, isChatReportArchived, currentUserLogin]);
}, [moneyRequestReport, currentUserLogin, chatReport, transactions, violations, policy, reportNameValuePairs, reportActions, policies, isChatReportArchived, isBetaEnabled]);

const secondaryExportActions = useMemo(() => {
if (!moneyRequestReport) {
Expand Down Expand Up @@ -994,7 +999,7 @@ function MoneyReportHeader({
},
},
[CONST.REPORT.SECONDARY_ACTIONS.SPLIT]: {
text: translate('iou.split'),
text: isExpenseSplit ? translate('iou.editSplits') : translate('iou.split'),
icon: Expensicons.ArrowSplit,
value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT,
onSelected: () => {
Expand Down
2 changes: 1 addition & 1 deletion src/components/MoneyRequestConfirmationList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -720,7 +720,7 @@ function MoneyRequestConfirmationList({
onFormatAmount={convertToDisplayStringWithoutCurrency}
onAmountChange={(value: string) => onSplitShareChange(participantOption.accountID ?? CONST.DEFAULT_NUMBER_ID, Number(value))}
maxLength={formattedTotalAmount.length + 1}
contentWidth={(formattedTotalAmount.length + 1) * 8}
contentWidth={(formattedTotalAmount.length + 1) * CONST.CHARACTER_WIDTH}
shouldApplyPaddingToContainer
shouldUseDefaultLineHeightForPrefix={false}
shouldWrapInputInContainer={false}
Expand Down
19 changes: 16 additions & 3 deletions src/components/MoneyRequestHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import useDuplicateTransactionsAndViolations from '@hooks/useDuplicateTransactio
import useLoadingBarVisibility from '@hooks/useLoadingBarVisibility';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import useReportIsArchived from '@hooks/useReportIsArchived';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
import useTheme from '@hooks/useTheme';
Expand All @@ -26,6 +27,7 @@ import {getSecondaryTransactionThreadActions} from '@libs/ReportSecondaryActionU
import {changeMoneyRequestHoldStatus, isSelfDM, navigateToDetailsPage, rejectMoneyRequestReason} from '@libs/ReportUtils';
import {getReviewNavigationRoute} from '@libs/TransactionPreviewUtils';
import {
getOriginalTransactionWithSplitInfo,
hasPendingRTERViolation as hasPendingRTERViolationTransactionUtils,
isDuplicate as isDuplicateTransactionUtils,
isExpensifyCardTransaction,
Expand Down Expand Up @@ -110,13 +112,16 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
const isDuplicate = isDuplicateTransactionUtils(transaction);
const reportID = report?.reportID;
const {removeTransaction} = useSearchContext();
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction);

const {isDelegateAccessRestricted, showDelegateNoAccessModal} = useContext(DelegateNoAccessContext);
const isReportInRHP = route.name === SCREENS.SEARCH.REPORT_RHP;
const isFromReviewDuplicates = !!route.params.backTo?.replace(/\?.*/g, '').endsWith('/duplicates/review');
const shouldDisplayTransactionNavigation = !!(reportID && isReportInRHP);
const isParentReportArchived = useReportIsArchived(report?.parentReportID);

const {isBetaEnabled} = usePermissions();

const hasPendingRTERViolation = hasPendingRTERViolationTransactionUtils(transactionViolations);

const shouldShowBrokenConnectionViolation = shouldShowBrokenConnectionViolationTransactionUtils(parentReport, policy, transactionViolations);
Expand Down Expand Up @@ -259,8 +264,16 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
if (!transaction || !reportActions) {
return [];
}
return getSecondaryTransactionThreadActions(currentUserLogin ?? '', parentReport, transaction, Object.values(reportActions), policy, report);
}, [report, parentReport, policy, transaction, currentUserLogin]);
return getSecondaryTransactionThreadActions(
currentUserLogin ?? '',
parentReport,
transaction,
Object.values(reportActions),
policy,
report,
isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS),
);
}, [parentReport, transaction, currentUserLogin, policy, report, isBetaEnabled]);

const dismissModalAndUpdateUseReject = () => {
setIsRejectEducationalModalVisible(false);
Expand Down Expand Up @@ -301,7 +314,7 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
},
},
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.SPLIT]: {
text: translate('iou.split'),
text: isExpenseSplit ? translate('iou.editSplits') : translate('iou.split'),
icon: Expensicons.ArrowSplit,
value: CONST.REPORT.SECONDARY_ACTIONS.SPLIT,
onSelected: () => {
Expand Down
44 changes: 32 additions & 12 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import useActiveRoute from '@hooks/useActiveRoute';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useOnyx from '@hooks/useOnyx';
import usePermissions from '@hooks/usePermissions';
import usePrevious from '@hooks/usePrevious';
import useReportIsArchived from '@hooks/useReportIsArchived';
import useResponsiveLayout from '@hooks/useResponsiveLayout';
Expand All @@ -36,6 +37,7 @@ import {getReportIDForExpense} from '@libs/MergeTransactionUtils';
import {hasEnabledOptions} from '@libs/OptionsListUtils';
import {getLengthOfTag, getTagLists, hasDependentTags as hasDependentTagsPolicyUtils, isTaxTrackingEnabled} from '@libs/PolicyUtils';
import {getOriginalMessage, isMoneyRequestAction} from '@libs/ReportActionsUtils';
import {isSplitAction} from '@libs/ReportSecondaryActionUtils';
import {
canEditFieldOfMoneyRequest,
canEditMoneyRequest,
Expand All @@ -59,6 +61,7 @@ import {
getDescription,
getDistanceInMeters,
getFormattedCreated,
getOriginalTransactionWithSplitInfo,
getReimbursable,
getTagForDisplay,
getTaxName,
Expand All @@ -67,7 +70,6 @@ import {
hasRoute as hasRouteTransactionUtils,
isCardTransaction as isCardTransactionTransactionUtils,
isDistanceRequest as isDistanceRequestTransactionUtils,
isExpenseSplit,
isExpenseUnreported as isExpenseUnreportedTransactionUtils,
isManualDistanceRequest as isManualDistanceRequestTransactionUtils,
isPerDiemRequest as isPerDiemRequestTransactionUtils,
Expand All @@ -77,7 +79,7 @@ import {
import ViolationsUtils from '@libs/Violations/ViolationsUtils';
import Navigation from '@navigation/Navigation';
import AnimatedEmptyStateBackground from '@pages/home/report/AnimatedEmptyStateBackground';
import {updateMoneyRequestBillable, updateMoneyRequestReimbursable} from '@userActions/IOU';
import {initSplitExpense, updateMoneyRequestBillable, updateMoneyRequestReimbursable} from '@userActions/IOU';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -126,6 +128,7 @@ function MoneyRequestView({
const theme = useTheme();
const StyleUtils = useStyleUtils();
const {isOffline} = useNetwork();
const {isBetaEnabled} = usePermissions();
const {translate, toLocaleDigit} = useLocalize();
const {getReportRHPActiveRoute} = useActiveRoute();

Expand Down Expand Up @@ -168,9 +171,6 @@ function MoneyRequestView({
const transactionViolations = useTransactionViolations(transaction?.transactionID);
const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});

const originalTransactionIDFromComment = transaction?.comment?.originalTransactionID;
const [originalTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${originalTransactionIDFromComment ?? ''}`, {canBeMissing: true});

const {
created: transactionDate,
amount: transactionAmount,
Expand Down Expand Up @@ -232,9 +232,12 @@ function MoneyRequestView({
const isReportArchived = useReportIsArchived(report?.reportID);
const isEditable = !!canUserPerformWriteActionReportUtils(report, isReportArchived) && !readonly;
const canEdit = isMoneyRequestAction(parentReportAction) && canEditMoneyRequest(parentReportAction, transaction, isChatReportArchived) && isEditable;
const {isExpenseSplit} = getOriginalTransactionWithSplitInfo(transaction);
const isSplitAvailable = moneyRequestReport && transaction && isSplitAction(moneyRequestReport, [transaction], policy, isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS));

const canEditTaxFields = canEdit && !isDistanceRequest;
const canEditAmount = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT, undefined, isChatReportArchived);
const canEditAmount =
(isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.AMOUNT, undefined, isChatReportArchived)) || (isExpenseSplit && isSplitAvailable);
const canEditMerchant = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.MERCHANT, undefined, isChatReportArchived);
const canEditDate = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DATE, undefined, isChatReportArchived);
const canEditDistance = isEditable && canEditFieldOfMoneyRequest(parentReportAction, CONST.EDIT_REQUEST_FIELD.DISTANCE, undefined, isChatReportArchived);
Expand Down Expand Up @@ -346,19 +349,13 @@ function MoneyRequestView({
if (formattedOriginalAmount) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.original')} ${formattedOriginalAmount}`;
}
if (isExpenseSplit(transaction, originalTransaction)) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`;
}
if (isCancelled) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.canceled')}`;
}
} else {
if (!isDistanceRequest && !isPerDiemRequest) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.cash')}`;
}
if (isExpenseSplit(transaction, originalTransaction)) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`;
}
if (isCancelled) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.canceled')}`;
} else if (isApproved) {
Expand All @@ -367,6 +364,9 @@ function MoneyRequestView({
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.settledExpensify')}`;
}
}
if (isExpenseSplit) {
amountDescription += ` ${CONST.DOT_SEPARATOR} ${translate('iou.split')}`;
}

const hasErrors = hasMissingSmartscanFields(transaction);
const pendingAction = transaction?.pendingAction;
Expand Down Expand Up @@ -453,6 +453,11 @@ function MoneyRequestView({
return;
}

if (isExpenseSplit && isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS)) {
initSplitExpense(transaction);
return;
}

if (isManualDistanceRequest) {
Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_DISTANCE_MANUAL.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, report.reportID, getReportRHPActiveRoute()),
Expand All @@ -478,6 +483,12 @@ function MoneyRequestView({
if (!transaction?.transactionID || !report?.reportID) {
return;
}

if (isExpenseSplit && isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS)) {
initSplitExpense(transaction);
return;
}

Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_DISTANCE_RATE.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, report.reportID, getReportRHPActiveRoute()),
);
Expand Down Expand Up @@ -618,6 +629,15 @@ function MoneyRequestView({
interactive={canEditAmount}
shouldShowRightIcon={canEditAmount}
onPress={() => {
if (!transaction?.transactionID || !report?.reportID) {
return;
}

if (isExpenseSplit && isBetaEnabled(CONST.BETAS.NEWDOT_UPDATE_SPLITS)) {
initSplitExpense(transaction);
return;
}

Navigation.navigate(
ROUTES.MONEY_REQUEST_STEP_AMOUNT.getRoute(CONST.IOU.ACTION.EDIT, iouType, transaction.transactionID, report.reportID, '', '', getReportRHPActiveRoute()),
);
Expand Down
Loading