From 5e6fe53f6a062d924dfa5fde4b6134effb50d65e Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Wed, 21 Aug 2024 16:53:38 -0400 Subject: [PATCH 1/6] Fix next steps for pending transactions --- src/components/MoneyReportHeader.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 32c1a3852c86..ee3929292cd3 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -106,6 +106,9 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const connectedIntegration = PolicyUtils.getConnectedIntegration(policy); const navigateBackToAfterDelete = useRef(); const hasScanningReceipt = ReportUtils.getTransactionsWithReceipts(moneyRequestReport?.reportID).some((t) => TransactionUtils.isReceiptBeingScanned(t)); + const hasOnlyPendingTransactions = ReportUtils.getTransactionsWithReceipts(moneyRequestReport?.reportID).every( + (t) => TransactionUtils.isExpensifyCardTransaction(t) && TransactionUtils.isPending(t), + ); const transactionIDs = allTransactions.map((t) => t.transactionID); const allHavePendingRTERViolation = TransactionUtils.allHavePendingRTERViolation(transactionIDs); const hasOnlyHeldExpenses = ReportUtils.hasOnlyHeldExpenses(moneyRequestReport.reportID); @@ -131,7 +134,7 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const shouldDisableSubmitButton = shouldShowSubmitButton && !ReportUtils.isAllowedToSubmitDraftExpenseReport(moneyRequestReport); const isFromPaidPolicy = policyType === CONST.POLICY.TYPE.TEAM || policyType === CONST.POLICY.TYPE.CORPORATE; - const shouldShowStatusBar = allHavePendingRTERViolation || hasOnlyHeldExpenses || hasScanningReceipt || isPayAtEndExpense; + const shouldShowStatusBar = allHavePendingRTERViolation || hasOnlyHeldExpenses || hasScanningReceipt || isPayAtEndExpense || hasOnlyPendingTransactions; const shouldShowNextStep = !ReportUtils.isClosedExpenseReportWithNoExpenses(moneyRequestReport) && isFromPaidPolicy && !!nextStep?.message?.length && !shouldShowStatusBar; const shouldShowAnyButton = shouldShowSettlementButton || shouldShowApproveButton || shouldShowSubmitButton || shouldShowNextStep || allHavePendingRTERViolation || shouldShowExportIntegrationButton; @@ -217,6 +220,9 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea if (allHavePendingRTERViolation) { return {icon: getStatusIcon(Expensicons.Hourglass), description: translate('iou.pendingMatchWithCreditCardDescription')}; } + if (hasOnlyPendingTransactions) { + return {icon: getStatusIcon(Expensicons.CreditCardHourglass), description: translate('iou.transactionPendingDescription')}; + } if (hasScanningReceipt) { return {icon: getStatusIcon(Expensicons.ReceiptScan), description: translate('iou.receiptScanInProgressDescription')}; } From 9489e15654db51bdc9c0940a83f978b4a8008e8e Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Wed, 21 Aug 2024 17:56:49 -0400 Subject: [PATCH 2/6] include title in Next Steps (?) --- src/components/MoneyReportHeader.tsx | 4 ++++ src/components/MoneyReportHeaderStatusBar.tsx | 3 ++- src/libs/NextStepUtils.ts | 5 ++--- src/types/onyx/ReportNextStep.ts | 3 +++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index ee3929292cd3..4af943aeb504 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -109,6 +109,10 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const hasOnlyPendingTransactions = ReportUtils.getTransactionsWithReceipts(moneyRequestReport?.reportID).every( (t) => TransactionUtils.isExpensifyCardTransaction(t) && TransactionUtils.isPending(t), ); + const hasOnlyPostedTransactions = allTransactions.every( + (transaction) => !TransactionUtils.getReimbursable(transaction) && !TransactionUtils.isPending(transaction) && !TransactionUtils.isReceiptBeingScanned(transaction), + ); + const transactionIDs = allTransactions.map((t) => t.transactionID); const allHavePendingRTERViolation = TransactionUtils.allHavePendingRTERViolation(transactionIDs); const hasOnlyHeldExpenses = ReportUtils.hasOnlyHeldExpenses(moneyRequestReport.reportID); diff --git a/src/components/MoneyReportHeaderStatusBar.tsx b/src/components/MoneyReportHeaderStatusBar.tsx index 455f9e443610..957b71aac2fa 100644 --- a/src/components/MoneyReportHeaderStatusBar.tsx +++ b/src/components/MoneyReportHeaderStatusBar.tsx @@ -30,7 +30,8 @@ function MoneyReportHeaderStatusBar({nextStep}: MoneyReportHeaderStatusBarProps) const theme = useTheme(); const messageContent = useMemo(() => { const messageArray = nextStep.message; - return NextStepUtils.parseMessage(messageArray); + const title = nextStep.title ?? ''; + return NextStepUtils.parseMessage(messageArray, title); }, [nextStep.message]); return ( diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index 544bc228fa70..09dcac5b2a79 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -35,7 +35,7 @@ Onyx.connect({ callback: (value) => (allPolicies = value), }); -function parseMessage(messages: Message[] | undefined) { +function parseMessage(messages: Message[] | undefined, title: string | undefined) { let nextStepHTML = ''; messages?.forEach((part) => { @@ -48,8 +48,7 @@ function parseMessage(messages: Message[] | undefined) { tagType = 'next-step-email'; content = EmailUtils.prefixMailSeparatorsWithBreakOpportunities(content); } - - nextStepHTML += `<${tagType}>${content}`; + nextStepHTML += `<${tagType}>${[title, content].join(' ')}`; }); const formattedHtml = nextStepHTML diff --git a/src/types/onyx/ReportNextStep.ts b/src/types/onyx/ReportNextStep.ts index 2107cbfccaac..f921d396f627 100644 --- a/src/types/onyx/ReportNextStep.ts +++ b/src/types/onyx/ReportNextStep.ts @@ -55,6 +55,9 @@ type ReportNextStep = { /** The message parts of the next step */ message?: Message[]; + /** The tile the next step */ + title?: string; + /** The icon for the next step */ icon: ValueOf; From 47560047bdb30e9b9bd2bfbd91b46c5eba39b293 Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Thu, 22 Aug 2024 10:57:28 -0400 Subject: [PATCH 3/6] remove unused variable, fix lint --- src/components/MoneyReportHeader.tsx | 4 ---- src/components/MoneyReportHeaderStatusBar.tsx | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/MoneyReportHeader.tsx b/src/components/MoneyReportHeader.tsx index 4af943aeb504..ee3929292cd3 100644 --- a/src/components/MoneyReportHeader.tsx +++ b/src/components/MoneyReportHeader.tsx @@ -109,10 +109,6 @@ function MoneyReportHeader({policy, report: moneyRequestReport, transactionThrea const hasOnlyPendingTransactions = ReportUtils.getTransactionsWithReceipts(moneyRequestReport?.reportID).every( (t) => TransactionUtils.isExpensifyCardTransaction(t) && TransactionUtils.isPending(t), ); - const hasOnlyPostedTransactions = allTransactions.every( - (transaction) => !TransactionUtils.getReimbursable(transaction) && !TransactionUtils.isPending(transaction) && !TransactionUtils.isReceiptBeingScanned(transaction), - ); - const transactionIDs = allTransactions.map((t) => t.transactionID); const allHavePendingRTERViolation = TransactionUtils.allHavePendingRTERViolation(transactionIDs); const hasOnlyHeldExpenses = ReportUtils.hasOnlyHeldExpenses(moneyRequestReport.reportID); diff --git a/src/components/MoneyReportHeaderStatusBar.tsx b/src/components/MoneyReportHeaderStatusBar.tsx index 957b71aac2fa..cf9daabbe623 100644 --- a/src/components/MoneyReportHeaderStatusBar.tsx +++ b/src/components/MoneyReportHeaderStatusBar.tsx @@ -32,7 +32,7 @@ function MoneyReportHeaderStatusBar({nextStep}: MoneyReportHeaderStatusBarProps) const messageArray = nextStep.message; const title = nextStep.title ?? ''; return NextStepUtils.parseMessage(messageArray, title); - }, [nextStep.message]); + }, [nextStep.message, nextStep.title]); return ( From 0710913b3fa44d90b11b81018d50d0e59729055d Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Thu, 22 Aug 2024 11:01:26 -0400 Subject: [PATCH 4/6] Allow for empty title --- src/libs/NextStepUtils.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index 09dcac5b2a79..6d085a431968 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -48,7 +48,8 @@ function parseMessage(messages: Message[] | undefined, title: string | undefined tagType = 'next-step-email'; content = EmailUtils.prefixMailSeparatorsWithBreakOpportunities(content); } - nextStepHTML += `<${tagType}>${[title, content].join(' ')}`; + const nextStepMessage = title ? [title, content].join(' ') : content; + nextStepHTML += `<${tagType}>${nextStepMessage}`; }); const formattedHtml = nextStepHTML From 16b84a3a7cfc212dc362a1b6d0931ad5bdc9032f Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Thu, 22 Aug 2024 12:17:46 -0400 Subject: [PATCH 5/6] title span --- src/libs/NextStepUtils.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index 6d085a431968..1d0a2efc2754 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -36,7 +36,7 @@ Onyx.connect({ }); function parseMessage(messages: Message[] | undefined, title: string | undefined) { - let nextStepHTML = ''; + let nextStepHTML = title ? `${title}` : ''; messages?.forEach((part) => { const isEmail = Str.isValidEmail(part.text); @@ -48,8 +48,7 @@ function parseMessage(messages: Message[] | undefined, title: string | undefined tagType = 'next-step-email'; content = EmailUtils.prefixMailSeparatorsWithBreakOpportunities(content); } - const nextStepMessage = title ? [title, content].join(' ') : content; - nextStepHTML += `<${tagType}>${nextStepMessage}`; + nextStepHTML += `<${tagType}>${content}`; }); const formattedHtml = nextStepHTML From 0d03d839bb6d98b21f3e0360ade88c22c121abd1 Mon Sep 17 00:00:00 2001 From: Georgia Monahan Date: Thu, 22 Aug 2024 12:27:49 -0400 Subject: [PATCH 6/6] We decided not to do this --- src/components/MoneyReportHeaderStatusBar.tsx | 5 ++--- src/libs/NextStepUtils.ts | 5 +++-- src/types/onyx/ReportNextStep.ts | 3 --- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/components/MoneyReportHeaderStatusBar.tsx b/src/components/MoneyReportHeaderStatusBar.tsx index cf9daabbe623..455f9e443610 100644 --- a/src/components/MoneyReportHeaderStatusBar.tsx +++ b/src/components/MoneyReportHeaderStatusBar.tsx @@ -30,9 +30,8 @@ function MoneyReportHeaderStatusBar({nextStep}: MoneyReportHeaderStatusBarProps) const theme = useTheme(); const messageContent = useMemo(() => { const messageArray = nextStep.message; - const title = nextStep.title ?? ''; - return NextStepUtils.parseMessage(messageArray, title); - }, [nextStep.message, nextStep.title]); + return NextStepUtils.parseMessage(messageArray); + }, [nextStep.message]); return ( diff --git a/src/libs/NextStepUtils.ts b/src/libs/NextStepUtils.ts index 1d0a2efc2754..544bc228fa70 100644 --- a/src/libs/NextStepUtils.ts +++ b/src/libs/NextStepUtils.ts @@ -35,8 +35,8 @@ Onyx.connect({ callback: (value) => (allPolicies = value), }); -function parseMessage(messages: Message[] | undefined, title: string | undefined) { - let nextStepHTML = title ? `${title}` : ''; +function parseMessage(messages: Message[] | undefined) { + let nextStepHTML = ''; messages?.forEach((part) => { const isEmail = Str.isValidEmail(part.text); @@ -48,6 +48,7 @@ function parseMessage(messages: Message[] | undefined, title: string | undefined tagType = 'next-step-email'; content = EmailUtils.prefixMailSeparatorsWithBreakOpportunities(content); } + nextStepHTML += `<${tagType}>${content}`; }); diff --git a/src/types/onyx/ReportNextStep.ts b/src/types/onyx/ReportNextStep.ts index f921d396f627..2107cbfccaac 100644 --- a/src/types/onyx/ReportNextStep.ts +++ b/src/types/onyx/ReportNextStep.ts @@ -55,9 +55,6 @@ type ReportNextStep = { /** The message parts of the next step */ message?: Message[]; - /** The tile the next step */ - title?: string; - /** The icon for the next step */ icon: ValueOf;