Skip to content

Update CTA and workspace chat copy for track-intent users#86460

Draft
MelvinBot wants to merge 14 commits intomainfrom
claude-updateTrackIntentCopy
Draft

Update CTA and workspace chat copy for track-intent users#86460
MelvinBot wants to merge 14 commits intomainfrom
claude-updateTrackIntentCopy

Conversation

@MelvinBot
Copy link
Copy Markdown
Contributor

Explanation of Change

For users who onboarded with the "Track and budget expenses" intent (PERSONAL_SPEND / TRACK_WORKSPACE), the product copy still uses generic expense management language. This PR updates three areas to reflect the track-intent workflow:

  1. Workspace chat welcome text — changed from "This is where X will submit expenses to Y" to "This is where you will track expenses"
  2. CTA buttons — Submit and Approve buttons now display "Mark as done" instead of "Submit" / "Approve"
  3. System messages — "submitted" and "approved" messages now display "marked as done"

Detection uses NVP_INTRO_SELECTED at the user level per jayeshmangwani's direction — checking introSelected?.choice === CONST.ONBOARDING_CHOICES.TRACK_WORKSPACE || introSelected?.choice === CONST.ONBOARDING_CHOICES.PERSONAL_SPEND. A new isTrackIntentUserSelector in src/selectors/Onboarding.ts centralizes this check.

Fixed Issues

$ #86223

Tests

  1. Log in as a user who selected "Track and budget expenses" during onboarding
  2. Navigate to a workspace chat
  3. Verify the welcome message reads "This is where you will track expenses"
  4. Create an expense and navigate to the expense report
  5. Verify the CTA button says "Mark as done" instead of "Submit"
  6. Click "Mark as done" to submit
  7. Verify the system message says "marked as done" instead of "submitted"
  8. If the report moves to approval, verify the approve CTA also says "Mark as done"
  9. Approve and verify the system message says "marked as done" instead of "approved"
  10. Log in as a user who selected a different onboarding intent (e.g., "Manage team expenses")
  11. Verify the original copy ("Submit", "Approve", "submitted", "approved") still appears
  • Verify that no errors appear in the JS console

Offline tests

  1. Go offline while viewing an expense report as a track-intent user
  2. Verify CTA buttons still show "Mark as done"
  3. Click "Mark as done" while offline
  4. Go back online and verify the action completes with the "marked as done" system message

QA Steps

  1. Create a new account and select "Track and budget expenses" during onboarding
  2. Navigate to the workspace chat and verify the welcome text says "This is where you will track expenses"
  3. Create an expense in the workspace
  4. Verify the Submit CTA says "Mark as done"
  5. Click "Mark as done" and verify the system message says "marked as done"
  6. If approval is configured, verify the Approve button also says "Mark as done"
  7. Log in with a different account that selected "Manage team expenses" during onboarding
  8. Verify standard copy ("Submit", "Approve", "submitted", "approved") still appears
  • Verify that no errors appear in the JS console

PR Author Checklist

  • I linked the correct issue in the ### Fixed Issues section above
  • I wrote clear testing steps that cover the changes made in this PR
    • I added steps for local testing in the Tests section
    • I added steps for the expected offline behavior in the Offline steps section
    • I added steps for Staging and/or Production testing in the QA steps section
    • I added steps to cover failure scenarios (i.e. verify an input displays the correct error message if the entered data is not correct)
    • I turned off my network connection and tested it while offline to ensure it matches the expected behavior (i.e. verify the default avatar icon is displayed if app is offline)
    • I tested this PR with a High Traffic account against the staging or production API to ensure there are no regressions (e.g. long loading states that impact usability).
  • I included screenshots or videos for tests on all platforms
  • I ran the tests on all platforms & verified they passed on:
    • Android: Native
    • Android: mWeb Chrome
    • iOS: Native
    • iOS: mWeb Safari
    • MacOS: Chrome / Safari
  • I verified there are no console errors (if there's a console error not related to the PR, report it or open an issue for it to be fixed)
  • I followed proper code patterns (see Reviewing the code)
    • I verified that any callback methods that were added or modified are named for what the method does and never what callback they handle (i.e. toggleReport and not onIconClick)
    • I verified that comments were added to code that is not self explanatory
    • I verified that any new or modified comments were clear, correct English, and explained "why" the code was doing something instead of only explaining "what" the code was doing.
    • I verified any copy / text shown in the product is localized by adding it to src/languages/* files and using the translation method
      • If any non-english text was added/modified, I used JaimeGPT to get English > Spanish translation. I then posted it in #expensify-open-source and it was approved by an internal Expensify engineer. Link to Slack message:
    • I verified all numbers, amounts, dates and phone numbers shown in the product are using the localization methods
    • I verified any copy / text that was added to the app is grammatically correct in English. It adheres to proper capitalization guidelines (note: only the first word of header/labels should be capitalized), and is either coming verbatim from figma or has been approved by marketing (in order to get marketing approval, ask the Bug Zero team member to add the Waiting for copy label to the issue)
    • I verified proper file naming conventions were followed for any new files or renamed files. All non-platform specific files are named after what they export and are not named "index.js". All platform-specific files are named for the platform the code supports as outlined in the README.
    • I verified the JSDocs style guidelines (in STYLE.md) were followed
  • If a new code pattern is added I verified it was agreed to be used by multiple Expensify engineers
  • I followed the guidelines as stated in the Review Guidelines
  • I tested other components that can be impacted by my changes (i.e. if the PR modifies a shared library or component like Avatar, I verified the components using Avatar are working as expected)
  • I verified all code is DRY (the PR doesn't include any logic written more than once, with the exception of tests)
  • I verified any variables that can be defined as constants (ie. in CONST.ts or at the top of the file that uses the constant) are defined as such
  • I verified that if a function's arguments changed that all usages have also been updated correctly
  • If any new file was added I verified that:
    • The file has a description of what it does and/or why is needed at the top of the file if the code is not self explanatory
  • If a new CSS style is added I verified that:
    • A similar style doesn't already exist
    • The style can't be created with an existing StyleUtils function (i.e. StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))
  • If new assets were added or existing ones were modified, I verified that:
    • The assets are optimized and compressed (for SVG files, run npm run compress-svg)
    • The assets load correctly across all supported platforms.
  • If the PR modifies code that runs when editing or sending messages, I tested and verified there is no unexpected behavior for all supported markdown - URLs, single line code, code blocks, quotes, headings, bold, strikethrough, and italic.
  • If the PR modifies a generic component, I tested and verified that those changes do not break usages of that component in the rest of the App (i.e. if a shared library or component like Avatar is modified, I verified that Avatar is working as expected in all cases)
  • If the PR modifies a component related to any of the existing Storybook stories, I tested and verified all stories for that component are still working as expected.
  • If the PR modifies a component or page that can be accessed by a direct deeplink, I verified that the code functions as expected when the deeplink is used - from a logged in and logged out account.
  • If the PR modifies the UI (e.g. new buttons, new UI components, changing the padding/spacing/sizing, moving components, etc) or modifies the form input styles:
    • I verified that all the inputs inside a form are aligned with each other.
    • I added Design label and/or tagged @Expensify/design so the design team can review the changes.
  • If a new page is added, I verified it's using the ScrollView component to make it scrollable when more elements are added to the page.
  • I added unit tests for any new feature or bug fix in this PR to help automatically prevent regressions in this user flow.
  • If the main branch was merged into this PR after a review, I tested again and verified the outcome was still expected according to the Test steps.

Screenshots/Videos

Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari

Verified on web that app builds correctly, workspace chat welcome text renders, and Submit/Approve CTA buttons display without errors. The track-intent copy ("Mark as done") requires a user who selected "Track and budget expenses" during onboarding.

Uses NVP_INTRO_SELECTED at the user level to identify track-intent
users and conditionally update copy across three areas:
- Workspace chat welcome text: "This is where you will track expenses"
- CTA buttons (Submit/Approve): "Mark as done"
- System messages (submitted/approved): "marked as done"

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@OSBotify

This comment has been minimized.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing Prettier check: ran Prettier to fix import ordering in 4 files (ApproveActionButton.tsx, SubmitActionButton.tsx, ReportWelcomeText.tsx, PureReportActionItem.tsx). The @selectors/Onboarding import was placed after other imports but Prettier's sort order expects it before react and other module imports.

Add markAsDone, beginningOfChatHistoryPolicyExpenseChatTrack, and
markedAsDone keys to de, fr, it, ja, nl, pl, pt-BR, and zh-hans
translation files with English fallback values.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing typecheck: added the three missing translation keys (markAsDone, beginningOfChatHistoryPolicyExpenseChatTrack, markedAsDone) to all 8 non-English language files (de, fr, it, ja, nl, pl, pt-BR, zh-hans) with English fallback values.

@codecov
Copy link
Copy Markdown

codecov bot commented Mar 26, 2026

Codecov Report

❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.

Files with missing lines Coverage Δ
src/components/LHNOptionsList/OptionRowLHNData.tsx 86.74% <ø> (ø)
src/components/ReportWelcomeText.tsx 94.59% <100.00%> (+0.15%) ⬆️
src/selectors/Onboarding.ts 86.36% <100.00%> (+1.36%) ⬆️
src/components/LHNOptionsList/OptionRowLHN.tsx 80.34% <80.00%> (+1.05%) ⬆️
.../MoneyRequestReportPreview/ApproveActionButton.tsx 0.00% <0.00%> (ø)
...m/MoneyRequestReportPreview/SubmitActionButton.tsx 0.00% <0.00%> (ø)
src/libs/SidebarUtils.ts 79.93% <60.00%> (-0.21%) ⬇️
src/pages/inbox/report/PureReportActionItem.tsx 56.60% <71.42%> (+0.02%) ⬆️
...ts/Search/SearchList/ListItem/ActionCell/index.tsx 63.63% <25.00%> (-4.79%) ⬇️
src/components/AnimatedSubmitButton/index.tsx 0.00% <0.00%> (ø)
... and 2 more
... and 16 files with indirect coverage changes

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I ran out of time before I could finish helping you. This usually means the task was too complex or I got stuck exploring. Please try again with a more specific request or post in the #melvinbot-ai.

Run details: https://github.com/Expensify/Expensify/actions/runs/23605388227

…g delimiters

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing checks (Prettier, typecheck, Storybook). The fr.ts file had Unicode smart/curly quotes (U+2018 ' and U+2019 ') used as JavaScript string delimiters instead of straight quotes (U+0027 ') on three lines: beginningOfChatHistoryPolicyExpenseChatTrack, markedAsDone, and queuedToSubmitViaDEW. JavaScript doesn't recognize smart quotes as valid string delimiters, causing parse failures across all three checks. Restored the file from main and re-applied all changes with correct straight quote delimiters.

…corruption

The previous commit accidentally replaced ASCII single quote delimiters
with Unicode smart quotes (U+2018/U+2019) on several lines in fr.ts,
causing Prettier and TypeScript check failures. This restores the file
from main and cleanly reapplies the intended changes (markAsDone,
beginningOfChatHistoryPolicyExpenseChatTrack, markedAsDone, and removal
of increasedDistance).

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing Prettier and TypeScript checks.

Root cause: The previous commit introduced Unicode smart quotes (U+2018 ' / U+2019 ') as string delimiters in fr.ts instead of ASCII single quotes ('). These look identical visually but are invalid JavaScript/TypeScript syntax when used as string delimiters, causing both Prettier (SyntaxError: Unexpected character) and TypeScript (TS1127: Invalid character) to fail.

Fix: Restored fr.ts from main and cleanly reapplied the intended changes (markAsDone, beginningOfChatHistoryPolicyExpenseChatTrack, markedAsDone, removal of increasedDistance). New simple string values use backtick template literals instead of single quotes to avoid the encoding issue.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

The previously failing checks (Prettier and TypeScript errors from smart quote corruption in fr.ts) were already fixed by the latest commit (177b9ada). All linting, type checking, and build checks are now passing. The remaining test jobs are still running but no failures so far.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@dylanexpensify When creating an expense in the workspace, we currently see a Submit button on staging and production after creating it. In this PR, we are changing the CTA to Mark as done. Is this expected?

Adding screenshots below to show the difference between staging and our PR changes.

staging

Screenshot 2026-03-27 at 12 26 14 AM

PR changes

Screenshot 2026-03-27 at 12 26 29 AM

If yes:

  1. Should we also update the sidebar badge text?
Screenshot 2026-03-27 at 12 26 29 AM
  1. Do we need to change the CTA in the Reports tab and Reports section as well?
Screenshot 2026-03-27 at 12 26 21 AM

@jayeshmangwani
Copy link
Copy Markdown
Contributor

When we press the Mark as done button, we briefly see the text Submitted after the action completes. Should this text also be updated?

mark-as-done.mov

@dylanexpensify
Copy link
Copy Markdown
Contributor

@jayeshmangwani great catches, yes to all:

Should we also update the sidebar badge text?

Yes

When we press the Mark as done button, we briefly see the text Submitted after the action completes. Should this text also be updated?

Yes

Do we need to change the CTA in the Reports tab and Reports section as well?

Yes

@dylanexpensify
Copy link
Copy Markdown
Contributor

Essentially, wherever there is submit for this group, we change it to the mark as done verbiage (or for system messages, marked as done)

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@dylanexpensify When we use Submit as the CTA, we display Submitted as the status label, indicating that the item has been sent.

For the track intent flow, we are updating the CTA to Mark as done. After this action is completed, what should the corresponding status label be? Should we use Marked as done or something else?

I’ve used Marked as done below as an example, please take a look and let me know how it feels.

button-confirmation.mov

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot The sidebar badge still shows Submit instead of Mark as done.
Screenshot 2026-03-27 at 12 26 29 AM

and the Reports tab/Reports also still has the Submit CTA.

Screenshot 2026-03-27 at 12 26 21 AM

…e' for track-intent users

The sidebar LHN badge and Reports tab action buttons still showed 'Submit'/'Approve'
instead of 'Mark as done' for track-intent users. Updated three locations:
- OptionRowLHN: sidebar action badge text
- ActionCell: search/reports list item action buttons
- useSearchBulkActions: bulk action submit/approve buttons

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the sidebar badge and Reports tab CTA to show "Mark as done" for track-intent users. Updated three locations:

  1. Sidebar LHN badge (OptionRowLHN.tsx): The actionBadgeText now checks if the user is a track-intent user and the badge is submit or approve, and displays "Mark as done" instead.

  2. Search/Reports list action buttons (ActionCell/index.tsx): Individual report/transaction action buttons in the Reports tab now display "Mark as done" for track-intent users when the action is submit or approve.

  3. Bulk action buttons (useSearchBulkActions.ts): The bulk "Submit" and "Approve" options also display "Mark as done" for track-intent users.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing Prettier check: ran Prettier on OptionRowLHN.tsx to collapse a line break in the shouldUseMarkAsDone assignment.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing ESLint check:

  1. OptionRowLHN.tsx:168 — Replaced nested ternary with an if-block to satisfy no-nested-ternary rule (this was the error blocking CI)
  2. MoneyReportHeader.tsx:1643 — Added missing approveButtonText and submitButtonText to useMemo dependency array
  3. useSearchBulkActions.ts:1139 — Added missing isTrackIntentUser and shouldShowBusinessBankAccountOptions to useMemo dependency array

The test (job 8) failure is unrelated — all tests passed but the process hit a segmentation fault (exit code 139) during cleanup, which is a pre-existing infrastructure issue.

@MelvinBot
Copy link
Copy Markdown
Contributor Author

All checks are now passing (ESLint, Prettier, typecheck, all 8 test shards, builds, etc.). The only remaining check is perf-tests which is still pending/running.

The previous failures were:

  • ESLint/Prettier — already fixed by a subsequent commit on this branch
  • Jest test (job 8) — failed with a segmentation fault (Node.js infrastructure crash), unrelated to PR code

No code fix is needed at this time.

@dylanexpensify
Copy link
Copy Markdown
Contributor

@jayeshmangwani

I’ve used Marked as done below as an example

Marked as done is correct! Thanks!

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot For track intent users, Submitted is currently shown, but it should be updated to Marked as done. See this comment for more context: #86460 (comment)

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23640602362

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot For track intent users, Submitted is currently shown, but it should be updated to Marked as done. See this comment for more context: #86460 (comment)

…ack-intent users

After clicking 'Mark as done', the AnimatedSubmitButton briefly showed 'Submitted'
as the status label. Added isTrackIntentUser check to display 'Marked as done'
instead. Added new common.markedAsDoneStatus translation key for this status label.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the "Submitted" status label for track-intent users. After clicking "Mark as done", the AnimatedSubmitButton now briefly shows "Marked as done" instead of "Submitted".

Changes:

  • AnimatedSubmitButton/index.tsx: Added isTrackIntentUser check via useOnyx to conditionally display "Marked as done" instead of "Submitted" during the submit animation
  • Added new common.markedAsDoneStatus translation key ("Marked as done") to all 10 language files for the status label

@OSBotify
Copy link
Copy Markdown
Contributor

🦜 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 diff
diff --git a/src/languages/de.ts b/src/languages/de.ts
index cb9425ba..65cdeccc 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Mehrfachauswahl',
         saveChanges: 'Änderungen speichern',
         submit: 'Senden',
-        markAsDone: 'Mark as done',
+        markAsDone: 'Als erledigt markieren',
         submitted: 'Übermittelt',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Als erledigt markiert',
         rotate: 'Drehen',
         zoom: 'Zoom',
         password: 'Passwort',
@@ -876,7 +876,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Dieser Chat ist mit ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `Hier reicht <strong>${submitterDisplayName}</strong> Auslagen bei <strong>${workspaceName}</strong> ein. Nutze einfach die +-Taste.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'Hier können Sie Ausgaben nachverfolgen',
         beginningOfChatHistorySelfDM: 'Dies ist dein persönlicher Bereich. Nutze ihn für Notizen, Aufgaben, Entwürfe und Erinnerungen.',
         beginningOfChatHistorySystemDM: 'Willkommen! Lassen Sie uns Ihre Einrichtung vornehmen.',
         chatWithAccountManager: 'Chatte hier mit deiner/deinem Account Manager',
@@ -1331,7 +1331,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `${amount}-Rechnung senden`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `für ${comment}` : ''}`,
         submitted: (memo?: string) => `eingereicht${memo ? `, mit dem Vermerk ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `als erledigt markiert${memo ? `, mit dem Vermerk ${memo}` : ''}`,
         automaticallySubmitted: `eingereicht über <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">Einreichungen verzögern</a>`,
         queuedToSubmitViaDEW: 'zur Einreichung über benutzerdefinierten Genehmigungsworkflow eingereiht',
         queuedToApproveViaDEW: 'Zur Genehmigung über benutzerdefinierten Genehmigungsworkflow eingereiht',
@@ -7434,7 +7434,14 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
         searchIn: 'Suchen in',
         searchPlaceholder: 'Nach etwas suchen',
         suggestions: 'Vorschläge',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Vorschläge verfügbar${query ? ` für ${query}` : ''}. ${count} Ergebnis.`,
             other: (resultCount: number) => `Vorschläge verfügbar${query ? ` für ${query}` : ''}. ${resultCount} Ergebnisse.`,
         }),
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index a390df3f..0fe8c95f 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Sélection multiple',
         saveChanges: 'Enregistrer les modifications',
         submit: 'Soumettre',
-        markAsDone: `Mark as done`,
+        markAsDone: 'Marquer comme terminé',
         submitted: 'Soumis',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Marqué comme terminé',
         rotate: 'Pivoter',
         zoom: 'Zoom',
         password: 'Mot de passe',
@@ -879,7 +879,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Cette discussion est avec ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `C’est ici que <strong>${submitterDisplayName}</strong> soumettra des dépenses à <strong>${workspaceName}</strong>. Utilisez simplement le bouton +.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: `This is where you will track expenses`,
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'C’est ici que vous suivrez les dépenses',
         beginningOfChatHistorySelfDM: 'Ceci est votre espace personnel. Utilisez-le pour vos notes, tâches, brouillons et rappels.',
         beginningOfChatHistorySystemDM: 'Bienvenue ! Procédons à la configuration.',
         chatWithAccountManager: 'Discutez avec votre gestionnaire de compte ici',
@@ -1335,7 +1335,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `Envoyer la facture de ${amount}`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `pour ${comment}` : ''}`,
         submitted: (memo?: string) => `soumis${memo ? `, indiquant « ${memo} »` : ''}`,
-        markedAsDone: (memo?: string) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `marqué comme terminé${memo ? `, avec la note ${memo}` : ''}`,
         automaticallySubmitted: `soumis via <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">soumissions différées</a>`,
         queuedToSubmitViaDEW: 'en file d’attente pour être soumis via le circuit d’approbation personnalisé',
         queuedToApproveViaDEW: 'mis en file d’attente pour approbation via un processus d’approbation personnalisé',
@@ -7458,7 +7458,14 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
         searchIn: 'Rechercher dans',
         searchPlaceholder: 'Rechercher quelque chose',
         suggestions: 'Suggestions',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Suggestions disponibles${query ? ` pour ${query}` : ''}. ${count} résultat.`,
             other: (resultCount: number) => `Suggestions disponibles${query ? ` pour ${query}` : ''}. ${resultCount} résultats.`,
         }),
diff --git a/src/languages/it.ts b/src/languages/it.ts
index f36ae944..00af7f80 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Selezione multipla',
         saveChanges: 'Salva modifiche',
         submit: 'Invia',
-        markAsDone: 'Mark as done',
+        markAsDone: 'Segna come completato',
         submitted: 'Inviato',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Contrassegnato come completato',
         rotate: 'Ruota',
         zoom: 'Zoom',
         password: 'Password',
@@ -877,7 +877,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Questa chat è con ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `Qui è dove <strong>${submitterDisplayName}</strong> invierà le spese a <strong>${workspaceName}</strong>. Usa semplicemente il pulsante +.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'Qui è dove terrai traccia delle spese',
         beginningOfChatHistorySelfDM: 'Questo è il tuo spazio personale. Usalo per note, attività, bozze e promemoria.',
         beginningOfChatHistorySystemDM: 'Benvenuto/a! Procediamo con la configurazione.',
         chatWithAccountManager: 'Chatta qui con il tuo account manager',
@@ -1330,7 +1330,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `Invia fattura da ${amount}`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `per ${comment}` : ''}`,
         submitted: (memo?: string) => `inviato${memo ? `, con nota: ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `segnato come completato${memo ? `, con messaggio: ${memo}` : ''}`,
         automaticallySubmitted: `inviato tramite <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">invio posticipato</a>`,
         queuedToSubmitViaDEW: 'in coda per l’invio tramite flusso di approvazione personalizzato',
         queuedToApproveViaDEW: 'in coda per l’approvazione tramite flusso di approvazione personalizzato',
@@ -7422,7 +7422,14 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
         searchIn: 'Cerca in',
         searchPlaceholder: 'Cerca qualcosa',
         suggestions: 'Suggerimenti',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Suggerimenti disponibili${query ? ` per ${query}` : ''}. ${count} risultato.`,
             other: (resultCount: number) => `Suggerimenti disponibili${query ? ` per ${query}` : ''}. ${resultCount} risultati.`,
         }),
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 781a399d..1539dc44 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: '複数選択',
         saveChanges: '変更を保存',
         submit: '送信',
-        markAsDone: 'Mark as done',
+        markAsDone: '完了にする',
         submitted: '送信済み',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: '完了済み',
         rotate: '回転',
         zoom: 'ズーム',
         password: 'パスワード',
@@ -863,7 +863,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `このチャットの相手は${users}です。`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `ここは<strong>${submitterDisplayName}</strong>さんが<strong>${workspaceName}</strong>に経費精算を提出する場所です。+ボタンを押すだけでOKです。`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'ここで経費を管理します',
         beginningOfChatHistorySelfDM: 'ここはあなたの個人スペースです。メモ、タスク、下書き、リマインダーに活用してください。',
         beginningOfChatHistorySystemDM: 'ようこそ!設定を始めましょう。',
         chatWithAccountManager: 'ここでアカウントマネージャーとチャットする',
@@ -1313,7 +1313,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `${amount} の請求書を送信`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `${comment}用` : ''}`,
         submitted: (memo?: string) => `送信済み${memo ? `、メモ: ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `完了としてマークしました${memo ? `、内容:${memo}` : ''}`,
         automaticallySubmitted: `<a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">提出の延期</a> 経由で提出されました`,
         queuedToSubmitViaDEW: 'カスタム承認ワークフローで提出待ち',
         queuedToApproveViaDEW: 'カスタム承認ワークフローで承認待ちに設定されました',
@@ -7330,7 +7330,14 @@ ${reportName}
         searchIn: '検索対象',
         searchPlaceholder: '何かを検索',
         suggestions: '提案',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `候補があります${query ? `: ${query}` : ''}。${count}件の結果。`,
             other: (resultCount: number) => `候補があります${query ? `: ${query}` : ''}。${resultCount}件の結果。`,
         }),
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index b440e860..1ad2d980 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Meerdere selecteren',
         saveChanges: 'Wijzigingen opslaan',
         submit: 'Verzenden',
-        markAsDone: 'Mark as done',
+        markAsDone: 'Markeren als voltooid',
         submitted: 'Ingediend',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Als voltooid gemarkeerd',
         rotate: 'Draaien',
         zoom: 'Zoom',
         password: 'Wachtwoord',
@@ -875,7 +875,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Deze chat is met ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `Dit is waar <strong>${submitterDisplayName}</strong> declaraties indient bij <strong>${workspaceName}</strong>. Gebruik gewoon de +-knop.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'Hier houd je je uitgaven bij',
         beginningOfChatHistorySelfDM: 'Dit is je persoonlijke ruimte. Gebruik het voor notities, taken, concepten en herinneringen.',
         beginningOfChatHistorySystemDM: 'Welkom! Laten we je instellen.',
         chatWithAccountManager: 'Chat hier met je accountmanager',
@@ -1329,7 +1329,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `Verzend factuur van ${amount}`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `voor ${comment}` : ''}`,
         submitted: (memo?: string) => `ingediend${memo ? `, met de omschrijving ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `gemarkeerd als voltooid${memo ? `, met de omschrijving ${memo}` : ''}`,
         automaticallySubmitted: `ingediend via <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">uitgestelde indieningen</a>`,
         queuedToSubmitViaDEW: 'in wachtrij om via aangepast goedkeuringsproces in te dienen',
         queuedToApproveViaDEW: 'in de wachtrij gezet voor goedkeuring via aangepaste goedkeuringsworkflow',
@@ -7388,7 +7388,14 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
         searchIn: 'Zoeken in',
         searchPlaceholder: 'Zoek iets',
         suggestions: 'Suggesties',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Suggesties beschikbaar${query ? ` voor ${query}` : ''}. ${count} resultaat.`,
             other: (resultCount: number) => `Suggesties beschikbaar${query ? ` voor ${query}` : ''}. ${resultCount} resultaten.`,
         }),
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 6e81404e..4949a261 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Wielokrotny wybór',
         saveChanges: 'Zapisz zmiany',
         submit: 'Wyślij',
-        markAsDone: 'Mark as done',
+        markAsDone: 'Oznacz jako gotowe',
         submitted: 'Przesłano',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Oznaczone jako ukończone',
         rotate: 'Obróć',
         zoom: 'Powiększenie',
         password: 'Hasło',
@@ -876,7 +876,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Ten czat jest z ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `Tutaj <strong>${submitterDisplayName}</strong> będzie przesyłać wydatki do <strong>${workspaceName}</strong>. Po prostu użyj przycisku +.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'Tutaj będziesz śledzić wydatki',
         beginningOfChatHistorySelfDM: 'To Twoja osobista przestrzeń. Używaj jej na notatki, zadania, szkice i przypomnienia.',
         beginningOfChatHistorySystemDM: 'Witamy! Zacznijmy konfigurację.',
         chatWithAccountManager: 'Porozmawiaj tutaj z opiekunem konta',
@@ -1329,7 +1329,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `Wyślij fakturę na ${amount}`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `za ${comment}` : ''}`,
         submitted: (memo?: string) => `przesłano${memo ? `, wpisując ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `oznaczone jako wykonane${memo ? `, o treści: ${memo}` : ''}`,
         automaticallySubmitted: `przesłano przez <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">opóźnianie wysyłania</a>`,
         queuedToSubmitViaDEW: 'w kolejce do przesłania przez niestandardowy proces zatwierdzania',
         queuedToApproveViaDEW: 'oczekuje na zatwierdzenie w niestandardowym procesie akceptacji',
@@ -7389,7 +7389,14 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
         searchIn: 'Szukaj w',
         searchPlaceholder: 'Wyszukaj coś',
         suggestions: 'Sugestie',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Dostępne sugestie${query ? ` dla ${query}` : ''}. ${count} wynik.`,
             other: (resultCount: number) => `Dostępne sugestie${query ? ` dla ${query}` : ''}. ${resultCount} wyniki.`,
         }),
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 5cdf58dd..7435de92 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: 'Seleção múltipla',
         saveChanges: 'Salvar alterações',
         submit: 'Enviar',
-        markAsDone: 'Mark as done',
+        markAsDone: 'Marcar como concluída',
         submitted: 'Enviado',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: 'Marcado como concluído',
         rotate: 'Girar',
         zoom: 'Zoom',
         password: 'Senha',
@@ -875,7 +875,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `Este chat é com ${users}.`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `É aqui que <strong>${submitterDisplayName}</strong> enviará despesas para <strong>${workspaceName}</strong>. Basta usar o botão +.`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: 'É aqui que você vai acompanhar as despesas',
         beginningOfChatHistorySelfDM: 'Este é o seu espaço pessoal. Use-o para anotações, tarefas, rascunhos e lembretes.',
         beginningOfChatHistorySystemDM: 'Bem-vindo(a)! Vamos fazer a sua configuração.',
         chatWithAccountManager: 'Converse com seu gerente de conta aqui',
@@ -1328,7 +1328,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `Enviar fatura de ${amount}`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `para ${comment}` : ''}`,
         submitted: (memo?: string) => `enviado${memo ? `, dizendo ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `marcou como concluída${memo ? `, dizendo ${memo}` : ''}`,
         automaticallySubmitted: `enviado via <a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">atrasar envios</a>`,
         queuedToSubmitViaDEW: 'na fila para enviar via fluxo de aprovação personalizado',
         queuedToApproveViaDEW: 'na fila para aprovar via fluxo de aprovação personalizado',
@@ -7376,7 +7376,14 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
         searchIn: 'Pesquisar em',
         searchPlaceholder: 'Pesquisar algo',
         suggestions: 'Sugestões',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `Sugestões disponíveis${query ? ` para ${query}` : ''}. ${count} resultado.`,
             other: (resultCount: number) => `Sugestões disponíveis${query ? ` para ${query}` : ''}. ${resultCount} resultados.`,
         }),
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 02e5bef5..ae3c5af0 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -147,9 +147,9 @@ const translations: TranslationDeepObject<typeof en> = {
         selectMultiple: '多选',
         saveChanges: '保存更改',
         submit: '提交',
-        markAsDone: 'Mark as done',
+        markAsDone: '标记为完成',
         submitted: '已提交',
-        markedAsDoneStatus: 'Marked as done',
+        markedAsDoneStatus: '已标记为完成',
         rotate: '旋转',
         zoom: '缩放',
         password: '密码',
@@ -851,7 +851,7 @@ const translations: TranslationDeepObject<typeof en> = {
         beginningOfChatHistory: (users: string) => `此聊天对象为 ${users}。`,
         beginningOfChatHistoryPolicyExpenseChat: (workspaceName: string, submitterDisplayName: string) =>
             `这是 <strong>${submitterDisplayName}</strong> 向 <strong>${workspaceName}</strong> 提交报销的地方。只需使用”+”按钮即可。`,
-        beginningOfChatHistoryPolicyExpenseChatTrack: 'This is where you will track expenses',
+        beginningOfChatHistoryPolicyExpenseChatTrack: '您可以在这里跟踪报销费用',
         beginningOfChatHistorySelfDM: '这是你的个人空间。可在此记录笔记、任务、草稿和提醒事项。',
         beginningOfChatHistorySystemDM: '欢迎!让我们帮你完成设置。',
         chatWithAccountManager: '在这里与您的客户经理聊天',
@@ -1290,7 +1290,7 @@ const translations: TranslationDeepObject<typeof en> = {
         sendInvoice: (amount: string) => `发送 ${amount} 发票`,
         expenseAmount: (formattedAmount: string, comment?: string) => `${formattedAmount}${comment ? `用于 ${comment}` : ''}`,
         submitted: (memo?: string) => `已提交${memo ? `,备注为 ${memo}` : ''}`,
-        markedAsDone: (memo) => `marked as done${memo ? `, saying ${memo}` : ''}`,
+        markedAsDone: (memo?: string) => `标记为已完成${memo ? `,备注为「${memo}」` : ''}`,
         automaticallySubmitted: `通过<a href="${CONST.SELECT_WORKFLOWS_HELP_URL}">延迟提交</a>提交`,
         queuedToSubmitViaDEW: '已排队,待通过自定义审批流程提交',
         queuedToApproveViaDEW: '已排队,等待通过自定义审批流程批准',
@@ -7205,7 +7205,14 @@ ${reportName}
         searchIn: '搜索范围',
         searchPlaceholder: '搜索内容',
         suggestions: '建议',
-        suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+        suggestionsAvailable: (
+            {
+                count,
+            }: {
+                count: number;
+            },
+            query = '',
+        ) => ({
             one: `有可用建议${query ? `:${query}` : ''}。共${count}条结果。`,
             other: (resultCount: number) => `有可用建议${query ? `:${query}` : ''}。共${resultCount}条结果。`,
         }),

Note

You can apply these changes to your branch by copying the patch to your clipboard, then running pbpaste | git apply 😉

View workflow run

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot Can we fix this? Mark as done isn’t fully visible in ActionCell. Let’s try not to impact other buttons to avoid regressions.
Screenshot 2026-03-27 at 4 26 06 PM

…t text truncation

The 'Mark as done' text is longer than 'Submit'/'Approve' and gets truncated
within the 80px ACTION column. Using extraSmall button size (smaller font and
padding) allows the text to fit without changing the column width or affecting
other action buttons.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the "Mark as done" text truncation in ActionCell.

Root cause: The ACTION column has a fixed width of 80px (variables.w80 in getReportTableColumnStyles). The small button style uses fontSize: 11 with paddingHorizontal: 12, leaving only ~56px for text — not enough for "Mark as done".

Fix: When shouldUseMarkAsDone is true, the button now uses extraSmall size (fontSize: 9, paddingHorizontal: 8) which fits within the 80px column. This only affects the "Mark as done" button — all other action buttons (Submit, Approve, Pay, View, Export) continue to use their original small size.

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@dylanexpensify , one thing doesn’t look right and I need your confirmation:

When a track-intent user has a workspace where Approvals are enabled (via Workspace → Workflows), and that user (as an admin) invites another user to the workspace:

  • The invited user creates an expense
  • The track-intent admin sees a Mark as done button instead of Submit.
  • After clicking it, the admin still sees Mark as done again

This doesn’t look correct to me.

On staging, we see Submit first, and after clicking it, we see Approve.

I’ve attached screenshots below to highlight the difference between staging and our PR—could you confirm the expected behavior?


staging

Screenshot 2026-03-27 at 4 46 20 PM
staging-behavior-2.mov

PR behavior

dev-behavior-2.mov
Screenshot 2026-03-27 at 4 46 28 PM

@dylanexpensify
Copy link
Copy Markdown
Contributor

@jayeshmangwani yeah great catch, so the default settings will have approvals disabled, BUT, if the choose to enable it and invite someone, we should have these actions revert to their traditional Submit, Submitted, Approve terminology 👍

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot when Approvals are enabled for a workspace, these actions should use the standard Submit, Submitted, and Approve terminology. Please review the two comments #86460 (comment) and #86460 (comment) for details .

@MelvinBot
Copy link
Copy Markdown
Contributor Author

I have failed to help you. I let you down and for that I am sorry. Please try again later. This may be due to a Claude outage (check here).

Failure details: https://github.com/Expensify/Expensify/actions/runs/23647077540

@jayeshmangwani
Copy link
Copy Markdown
Contributor

@MelvinBot please merge main and check this comment: #86460 (comment)

MelvinBot and others added 2 commits March 30, 2026 11:02
…entCopy

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>

# Conflicts:
#	src/components/MoneyReportHeader.tsx
#	src/pages/inbox/report/PureReportActionItem.tsx
When a track-intent user has a workspace with Approvals enabled, the CTA
buttons and system messages should use the standard Submit/Approve
terminology. The 'Mark as done' copy should only apply when the workspace
has approvals disabled (submit-and-close mode).

Added isSubmitAndClose(policy) check alongside the existing
isTrackIntentUser check across all affected components:
- SubmitActionButton, ApproveActionButton, MoneyReportHeader
- AnimatedSubmitButton (new policyID prop)
- OptionRowLHN sidebar badge (new isApprovalDisabledForReport prop)
- ActionCell in search/reports list
- useSearchBulkActions bulk action buttons
- PureReportActionItem system messages

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Merged main and addressed the feedback from the referenced comments.

What changed: When a track-intent user has a workspace with Approvals enabled, the CTA buttons and system messages now correctly use the standard Submit/Approve/Submitted terminology. The Mark as done / Marked as done copy only applies when the workspace has approvals disabled (submit-and-close mode).

How: Added isSubmitAndClose(policy) check from PolicyUtils alongside the existing isTrackIntentUser check. When policy.approvalMode === 'OPTIONAL' (approvals disabled), track-intent copy is used; otherwise, standard copy is used.

Files updated (10):

  • SubmitActionButton.tsx — added isSubmitAndClose(policy) check
  • ApproveActionButton.tsx — added policy lookup + isSubmitAndClose check
  • MoneyReportHeader.tsx — added isSubmitAndClose(policy) check for both submit/approve text
  • AnimatedSubmitButton/index.tsx — new policyID prop to check approval mode for status text
  • OptionRowLHN.tsx — uses new isApprovalDisabledForReport prop for sidebar badge
  • OptionRowLHNData.tsx / types.ts — computes and forwards isApprovalDisabledForReport
  • ActionCell/index.tsx — policy lookup via existing policyID prop
  • useSearchBulkActions.ts — per-report policy check for bulk submit/approve
  • PureReportActionItem.tsx — policy check for system messages

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing Prettier check: import statements in OptionRowLHNData.tsx were out of order (PolicyUtils before OptionsListUtils). Ran prettier to sort them correctly.

Co-authored-by: Jayesh Mangwani <jayeshmangwani@users.noreply.github.com>
@MelvinBot
Copy link
Copy Markdown
Contributor Author

Fixed the failing ESLint check: removed unused datetimeToCalendarTime from the useLocalize() destructuring in PureReportActionItem.tsx.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants