Improve RTER messaging and add submit confirmation for pending card matches#85167
Improve RTER messaging and add submit confirmation for pending card matches#85167stitesExpensify merged 16 commits intomainfrom
Conversation
…atches - Update movedTransactionFrom translation to include 'pending a match with a credit card transaction' for clearer auto-move messaging - Add confirmation modal before submitting reports with RTER-pending expenses - Both 'Yes' (mark as cash + submit) and 'No' (just submit) paths proceed to submit - Consistent behavior across MoneyReportHeader and MoneyRequestReportPreviewContent Co-authored-by: huult <huult@users.noreply.github.com>
This comment has been minimized.
This comment has been minimized.
|
The failing checks are unrelated to this PR's changes. PR changes: Failing tests:
Evidence: All three recent test runs on These failures should resolve on a re-run, or can be investigated separately as flaky test issues. |
| const [isSelfTourViewed] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {selector: hasSeenTourSelector}); | ||
| const isDEWBetaEnabled = isBetaEnabled(CONST.BETAS.NEW_DOT_DEW); | ||
| const hasViolations = hasViolationsReportUtils(iouReport?.reportID, transactionViolations, currentUserAccountID, currentUserEmail); | ||
| const hasAnyPendingRTERViolation = useMemo( |
There was a problem hiding this comment.
const hasAnyPendingRTERViolation = useMemo(
() =>
transactions.some((t) => {
const txViolations = allTransactionViolations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${t.transactionID}`];
return hasPendingRTERViolationTransactionUtils(txViolations);
}),
[transactions, allTransactionViolations],
);@MelvinBot It seems duplicated. If possible, please create a utility function so it can be reusable.
There was a problem hiding this comment.
Extracted the duplicated logic into a reusable hasAnyPendingRTERViolation(transactions, allTransactionViolations) utility function in TransactionUtils. Both MoneyReportHeader and MoneyRequestReportPreviewContent now call this shared utility instead of inlining the same logic.
|
The failing checks (excluding Failing tests:
Evidence:
|
Move the duplicated hasAnyPendingRTERViolation logic from both MoneyReportHeader and MoneyRequestReportPreviewContent into a reusable utility function in TransactionUtils. Co-authored-by: huult <huult@users.noreply.github.com>
|
@MelvinBot Ready for review |
Use Array<OnyxEntry<Transaction>> instead of OnyxEntry<Transaction>[] to satisfy @typescript-eslint/array-type rule, and fix Prettier formatting in MoneyReportHeader and MoneyRequestReportPreviewContent. Co-authored-by: huult <huult@users.noreply.github.com>
|
Fixed the failing checks:
|
|
@MelvinBot Please update |
|
Updated the PR checklist with the Slack message link: https://expensify.slack.com/archives/C01GTK53T8Q/p1773373798739869 |
@MelvinBot Please update this part in the PR. I think it's correct. |
Instead of unconditionally modifying movedTransactionFrom, add a new movedTransactionFromPendingMatch translation key and check the reasoning field in getMovedTransactionMessage() to use it only when the server indicates a pending card match. Co-authored-by: huult <huult@users.noreply.github.com>
|
Updated the moved transaction message logic as described:
Note: The backend (Auth repo) still needs to populate the |
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 8c98c434..61cad924 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1265,7 +1265,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `hat diese Ausgabe verschoben${reportName ? `zu <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `hat diese Ausgabe verschoben${reportName ? `von <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `hat diese Ausgabe verschoben${reportName ? `von <a href="${reportUrl}">${reportName}</a>` : ''} ausstehende Zuordnung mit einer Kreditkartentransaktion`,
+ `hat diese Ausgabe${reportName ? `von <a href="${reportUrl}">${reportName}</a>` : ''} verschoben, bis sie mit einer Kreditkartentransaktion abgeglichen ist`,
unreportedTransaction: (reportUrl: string) => `hat diese Ausgabe in deinen <a href="${reportUrl}">persönlichen Bereich</a> verschoben`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1277,8 +1277,8 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatch: 'Ausstehende Zuordnung',
pendingMatchWithCreditCardDescription: 'Beleg wartet auf Abgleich mit Kartenumsatz. Als Barzahlung markieren, um abzubrechen.',
markAsCash: 'Als Bar markieren',
- pendingMatchSubmitTitle: 'Bericht einreichen',
- pendingMatchSubmitDescription: 'Einige Ausgaben warten auf die Zuordnung mit einer Kreditkartentransaktion. Möchten Sie sie als Bar markieren?',
+ pendingMatchSubmitTitle: 'Abrechnung einreichen',
+ pendingMatchSubmitDescription: 'Einige Ausgaben warten noch auf eine Zuordnung zu einer Kreditkartentransaktion. Möchten Sie sie als Barzahlung markieren?',
routePending: 'Routing ausstehend ...',
automaticallyEnterExpenseDetails: 'Concierge wird automatisch die Ausgabendetails für Sie eingeben, oder Sie können sie manuell hinzufügen.',
receiptScanning: () => ({
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 2a962750..74236dd2 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1269,7 +1269,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `a déplacé cette dépense${reportName ? `vers <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `a déplacé cette dépense${reportName ? `depuis <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `a déplacé cette dépense${reportName ? `depuis <a href="${reportUrl}">${reportName}</a>` : ''} en attente de rapprochement avec une transaction par carte de crédit`,
+ `a déplacé cette dépense${reportName ? `depuis <a href="${reportUrl}">${reportName}</a>` : ''} en attente d’une correspondance avec une transaction de carte de crédit`,
unreportedTransaction: (reportUrl: string) => `a déplacé cette dépense vers votre <a href="${reportUrl}">espace personnel</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1281,8 +1281,8 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatch: 'Correspondance en attente',
pendingMatchWithCreditCardDescription: 'Reçu en attente de rapprochement avec une transaction par carte. Marquez comme paiement en espèces pour annuler.',
markAsCash: 'Marquer comme espèces',
- pendingMatchSubmitTitle: 'Soumettre le rapport',
- pendingMatchSubmitDescription: 'Certaines dépenses sont en attente de rapprochement avec une transaction par carte de crédit. Voulez-vous les marquer comme espèces ?',
+ pendingMatchSubmitTitle: 'Soumettre la note de frais',
+ pendingMatchSubmitDescription: 'Certaines dépenses sont en attente de rapprochement avec une transaction de carte de crédit. Voulez-vous les marquer comme réglées en espèces ?',
routePending: 'Acheminement en attente...',
automaticallyEnterExpenseDetails: 'Concierge saisira automatiquement les détails de la dépense pour vous, ou vous pouvez les ajouter manuellement.',
receiptScanning: () => ({
diff --git a/src/languages/it.ts b/src/languages/it.ts
index a56ca459..0e863ba4 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1263,7 +1263,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `ha spostato questa spesa${reportName ? `a <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `ha spostato questa spesa${reportName ? `da <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `ha spostato questa spesa${reportName ? `da <a href="${reportUrl}">${reportName}</a>` : ''} in attesa di abbinamento con una transazione della carta di credito`,
+ `ha spostato questa spesa${reportName ? `da <a href="${reportUrl}">${reportName}</a>` : ''} in attesa di un abbinamento con una transazione della carta di credito`,
unreportedTransaction: (reportUrl: string) => `ha spostato questa spesa nel tuo <a href="${reportUrl}">spazio personale</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1275,8 +1275,8 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatch: 'Corrispondenza in sospeso',
pendingMatchWithCreditCardDescription: 'Ricevuta in attesa di abbinamento con la transazione della carta. Contrassegna come contante per annullare.',
markAsCash: 'Segna come contante',
- pendingMatchSubmitTitle: 'Invia report',
- pendingMatchSubmitDescription: 'Alcune spese sono in attesa di abbinamento con una transazione della carta di credito. Vuoi segnarle come contante?',
+ pendingMatchSubmitTitle: 'Invia rapporto',
+ pendingMatchSubmitDescription: 'Alcune spese sono in attesa di essere abbinate a una transazione con carta di credito. Vuoi contrassegnarle come pagate in contanti?',
routePending: 'Instradamento in sospeso...',
automaticallyEnterExpenseDetails: 'Concierge inserirà automaticamente i dettagli della spesa per te, oppure puoi aggiungerli manualmente.',
receiptScanning: () => ({
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index cec4e27f..2854f277 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1255,7 +1255,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `この経費を移動しました${reportName ? `<a href="${reportUrl}">${reportName}</a>へ` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `この経費を移動しました${reportName ? `<a href="${reportUrl}">${reportName}</a> から` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `この経費を移動しました${reportName ? `<a href="${reportUrl}">${reportName}</a> から` : ''}(クレジットカード取引との照合待ち)`,
+ `この経費${reportName ? `from <a href="${reportUrl}">${reportName}</a>` : ''}を、クレジットカード取引との照合待ちに移動しました`,
unreportedTransaction: (reportUrl: string) => `この経費をあなたの<a href="${reportUrl}">個人スペース</a>に移動しました`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1267,8 +1267,8 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatch: '保留中の照合',
pendingMatchWithCreditCardDescription: 'レシートはカード取引との照合待ちです。現金としてマークしてキャンセルします。',
markAsCash: '現金としてマーク',
- pendingMatchSubmitTitle: 'レポートを提出',
- pendingMatchSubmitDescription: '一部の経費がクレジットカード取引との照合待ちです。現金としてマークしますか?',
+ pendingMatchSubmitTitle: 'レポートを送信',
+ pendingMatchSubmitDescription: '一部の経費がクレジットカード明細との照合待ちです。現金としてマークしますか?',
routePending: 'ルート保留中…',
automaticallyEnterExpenseDetails: 'コンシェルジュが自動的に経費の詳細を入力するか、手動で追加することができます。',
receiptScanning: () => ({
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index a8d1383b..6384eaf5 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1262,7 +1262,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `heeft deze uitgave verplaatst${reportName ? `naar <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `heeft deze uitgave verplaatst${reportName ? `van <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `heeft deze uitgave verplaatst${reportName ? `van <a href="${reportUrl}">${reportName}</a>` : ''} in afwachting van koppeling met een creditcardtransactie`,
+ `heeft deze uitgave${reportName ? `van <a href="${reportUrl}">${reportName}</a>` : ''} verplaatst in afwachting van een overeenkomst met een creditcardtransactie`,
unreportedTransaction: (reportUrl: string) => `heeft deze uitgave verplaatst naar je <a href="${reportUrl}">persoonlijke ruimte</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1275,7 +1275,7 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatchWithCreditCardDescription: 'Bon wordt nog gekoppeld aan kaarttransactie. Markeer als contant om te annuleren.',
markAsCash: 'Markeren als contant',
pendingMatchSubmitTitle: 'Rapport indienen',
- pendingMatchSubmitDescription: 'Sommige uitgaven wachten op koppeling met een creditcardtransactie. Wilt u ze als contant markeren?',
+ pendingMatchSubmitDescription: 'Sommige uitgaven wachten op een match met een creditcardtransactie. Wil je ze als contant markeren?',
routePending: 'Routeren in behandeling...',
automaticallyEnterExpenseDetails: 'Concierge zal automatisch de uitgavendetails voor je invoeren, of je kunt ze handmatig toevoegen.',
receiptScanning: () => ({
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 857bd858..dd257c71 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1262,7 +1262,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `przeniósł ten wydatek${reportName ? `do <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `przeniósł(-ę) ten wydatek${reportName ? `z <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `przeniósł(-ę) ten wydatek${reportName ? `z <a href="${reportUrl}">${reportName}</a>` : ''} w oczekiwaniu na dopasowanie z transakcją kartą kredytową`,
+ `przeniósł/przeniosła ten wydatek${reportName ? `z <a href="${reportUrl}">${reportName}</a>` : ''}, oczekując na dopasowanie do transakcji z karty kredytowej`,
unreportedTransaction: (reportUrl: string) => `przeniósł ten wydatek do Twojej <a href="${reportUrl}">przestrzeni osobistej</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1275,7 +1275,7 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatchWithCreditCardDescription: 'Oczekuje na dopasowanie paragonu do transakcji kartą. Oznacz jako gotówkę, aby anulować.',
markAsCash: 'Oznacz jako gotówkę',
pendingMatchSubmitTitle: 'Wyślij raport',
- pendingMatchSubmitDescription: 'Niektóre wydatki oczekują na dopasowanie z transakcją kartą kredytową. Czy chcesz oznaczyć je jako gotówkę?',
+ pendingMatchSubmitDescription: 'Niektóre wydatki czekają na dopasowanie do transakcji z karty kredytowej. Czy chcesz oznaczyć je jako gotówkowe?',
routePending: 'Trasa w toku…',
automaticallyEnterExpenseDetails: 'Concierge automatycznie wprowadzi szczegóły wydatku za Ciebie lub możesz dodać je ręcznie.',
receiptScanning: () => ({
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index fa200a9c..8f434ab1 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1261,7 +1261,7 @@ const translations: TranslationDeepObject<typeof en> = {
movedTransactionTo: (reportUrl: string, reportName?: string) => `moveu esta despesa${reportName ? `para <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `moveu esta despesa${reportName ? `de <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
- `moveu esta despesa${reportName ? `de <a href="${reportUrl}">${reportName}</a>` : ''} pendente de correspondência com uma transação de cartão de crédito`,
+ `moveu esta despesa${reportName ? `de <a href="${reportUrl}">${reportName}</a>` : ''} para pendente, aguardando correspondência com uma transação de cartão de crédito`,
unreportedTransaction: (reportUrl: string) => `moveu esta despesa para o seu <a href="${reportUrl}">espaço pessoal</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1274,7 +1274,7 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatchWithCreditCardDescription: 'Recibo aguardando correspondência com transação do cartão. Marque como dinheiro para cancelar.',
markAsCash: 'Marcar como dinheiro',
pendingMatchSubmitTitle: 'Enviar relatório',
- pendingMatchSubmitDescription: 'Algumas despesas estão pendentes de correspondência com uma transação de cartão de crédito. Deseja marcá-las como dinheiro?',
+ pendingMatchSubmitDescription: 'Algumas despesas estão aguardando correspondência com uma transação de cartão de crédito. Você quer marcá-las como dinheiro?',
routePending: 'Rota pendente...',
automaticallyEnterExpenseDetails: 'O Concierge inserirá automaticamente os detalhes da despesa para você, ou você pode adicioná-los manualmente.',
receiptScanning: () => ({
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index d15f6d9f..dd79d169 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1237,7 +1237,8 @@ const translations: TranslationDeepObject<typeof en> = {
movedFromReport: (reportName: string) => `已移动一笔报销${reportName ? `来自${reportName}` : ''}`,
movedTransactionTo: (reportUrl: string, reportName?: string) => `已移动此报销${reportName ? `到 <a href="${reportUrl}">${reportName}</a>` : ''}`,
movedTransactionFrom: (reportUrl: string, reportName?: string) => `已移动此报销${reportName ? `来自 <a href="${reportUrl}">${reportName}</a>` : ''}`,
- movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) => `已移动此报销${reportName ? `来自 <a href="${reportUrl}">${reportName}</a>` : ''},等待与信用卡交易匹配`,
+ movedTransactionFromPendingMatch: (reportUrl: string, reportName?: string) =>
+ `已将此报销单${reportName ? `来自 <a href="${reportUrl}">${reportName}</a>` : ''}移至“等待与信用卡交易匹配”状态`,
unreportedTransaction: (reportUrl: string) => `已将此报销移动到你的<a href="${reportUrl}">个人空间</a>`,
movedAction: (shouldHideMovedReportUrl: boolean, movedReportUrl: string, newParentReportUrl: string, toPolicyName: string) => {
if (shouldHideMovedReportUrl) {
@@ -1249,8 +1250,8 @@ const translations: TranslationDeepObject<typeof en> = {
pendingMatch: '待匹配',
pendingMatchWithCreditCardDescription: '收据正在等待与卡片交易匹配。将其标记为现金以取消。',
markAsCash: '标记为现金',
- pendingMatchSubmitTitle: '提交报告',
- pendingMatchSubmitDescription: '部分费用正在等待与信用卡交易匹配。您要将它们标记为现金吗?',
+ pendingMatchSubmitTitle: '提交报表',
+ pendingMatchSubmitDescription: '部分报销正在等待与信用卡交易匹配。你要将它们标记为现金支出吗?',
routePending: '路由处理中…',
automaticallyEnterExpenseDetails: 'Concierge 将自动为您输入费用详情,或者您可以手动添加。',
receiptScanning: () => ({
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Co-authored-by: huult <huult@users.noreply.github.com>
|
Fixed the failing Prettier check: the |
|
@MelvinBot Please mark this PR as ready for review |
|
Done — this PR has been marked as ready for review. 🤖 |
|
Reviewed and addressed the feedback: Code change (pushed):
Codex review responses (replied to each thread):
|
|
@huult what's the deal? |
|
@MelvinBot please resolve the conflict |
… conflict Co-authored-by: huult <huult@users.noreply.github.com>
|
Resolved the merge conflict in The conflict was between the PR's object-based action pattern and main's individual variable + switch pattern. I kept main's structure (individual variables with |
|
The failing ESLint check is unrelated to this PR's changes. Analysis: The full-repo ESLint check is failing with 316 warnings (0 errors) in files not modified by this PR:
Evidence: This PR only modifies |
|
Both failing checks are unrelated to this PR's changes. 1. ESLint check — The 316 warnings are all in files NOT modified by this PR (e.g., 2. build (New Expensify Dev, DebugDevelopment, false) — The iOS build failed in the "Rock Remote Build" step with a remote cache error ( No code fix is needed from this PR. These failures should resolve when the underlying repo-wide ESLint warnings are addressed and the iOS build cache is refreshed. |
@trjExpensify Melvin bot has updated the feedback, and I re-tested to make sure it works. |
It works. @stitesExpensify, it's all yours. Could you review it again? |
|
@MelvinBot Please sync with main |
…edTransactionMessage Co-authored-by: huult <huult@users.noreply.github.com>
|
Synced with main — merged the latest |
|
The failing ESLint check is unrelated to this PR's changes. Analysis: The failures are in files not modified by this PR:
Evidence: This PR only modifies files in |
|
The failing check (ESLint check) is unrelated to this PR. Analysis: The full-repo ESLint check is failing due to 316 pre-existing warnings (0 errors) in files not changed by this PR:
Evidence: The same ESLint check is also failing on |
|
@MelvinBot pull main again and fix the conflicts |
|
The PR currently has merge conflicts again (mergeable state: However, I can only make code changes when directed by the PR author, an assignee, or an existing co-author. To have me implement this, the PR assignee ( |
|
@huult there are conflicts :/ |
|
@MelvinBot please resolve the conflict |
…tReportPreviewContent Co-authored-by: huult <huult@users.noreply.github.com>
|
Resolved merge conflicts with
|
|
🚧 @stitesExpensify has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚀 Deployed to staging by https://github.com/stitesExpensify in version: 9.3.44-0 🚀
Bundle Size Analysis (Sentry): |
|
🚀 Deployed to staging by https://github.com/stitesExpensify in version: 9.3.47-0 🚀
Bundle Size Analysis (Sentry): |
|
🚀 Deployed to production by https://github.com/grgia in version: 9.3.48-2 🚀
|
Explanation of Change
This PR adds a confirmation modal before submitting a report that contains expenses with pending RTER (Receipt-To-Expense-Receipt) violations. When the user clicks Submit (in both
MoneyReportHeaderandMoneyRequestReportPreviewContent), if any expenses are awaiting a credit card match:Both components (
MoneyReportHeader.tsxprimary + secondary submit,MoneyRequestReportPreviewContent.tsxsubmit) have consistent behavior.Fixed Issues
$ #83108
PROPOSAL: #83108 (comment)
Tests
Offline tests
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari