Workspace rate list display for auto-generated rates#96149
Conversation
|
Hey, I noticed you changed If you want to automatically generate translations for other locales, an Expensify employee will have to:
Alternatively, if you are an external contributor, you can run the translation script locally with your own OpenAI API key. To learn more, try running: npx ts-node ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@cretadn22 Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@neil-marcellini Could you please help trigger the translation workflow? Thanks |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5295e3c468
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb ChromeiOS: HybridAppiOS: mWeb SafariMacOS: Chrome / Safari |
|
@thelullabyy Mind taking a look at the failing typescript checks and Jest Unit Tests? Also, please upload the complete test videos when you get a chance |
|
The test failed due to missing copies. I requested it here #96149 (comment) |
joekaufmanexpensify
left a comment
There was a problem hiding this comment.
Good for product.
|
@neil-marcellini Please help run the translation workflow once you having time. Thanks |
|
@thelullabyy done |
🦜 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 6b8c6f2eadb..4b3b0b74ec9 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6993,6 +6993,7 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`,
amountPerUnit: (unit: string) => `Betrag pro ${unit}`,
startDate: 'Startdatum',
endDate: 'Enddatum',
+ autoGeneratedRateTooltip: 'Dieser Satz wurde automatisch erzeugt.',
},
editor: {
descriptionInputLabel: 'Beschreibung',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 9bf1359733e..520c9ea4001 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -6918,6 +6918,7 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
amountPerUnit: (unit: string) => `Importe por ${unit}`,
startDate: 'Fecha de inicio',
endDate: 'Fecha de fin',
+ autoGeneratedRateTooltip: 'Esta tasa se genera automáticamente.',
},
editor: {
nameInputLabel: 'Nombre',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 2f9ae12fa81..26e4b033992 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -7021,6 +7021,7 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`,
amountPerUnit: (unit: string) => `Montant par ${unit}`,
startDate: 'Date de début',
endDate: 'Date de fin',
+ autoGeneratedRateTooltip: 'Ce taux est généré automatiquement.',
},
editor: {
descriptionInputLabel: 'Description',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 6e49ff0d79c..8e8c686ac2d 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6977,6 +6977,7 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`,
amountPerUnit: (unit: string) => `Importo per ${unit}`,
startDate: 'Data di inizio',
endDate: 'Data di fine',
+ autoGeneratedRateTooltip: 'Questa tariffa è generata automaticamente.',
},
editor: {
descriptionInputLabel: 'Descrizione',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 2bde735c0fe..180bced4980 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6894,6 +6894,7 @@ Control プランは、アクティブメンバー1人あたり月額 $9 から
amountPerUnit: (unit: string) => `${unit}あたりの金額`,
startDate: '開始日',
endDate: '終了日',
+ autoGeneratedRateTooltip: 'このレートは自動生成されています。',
},
editor: {
descriptionInputLabel: '説明',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 3bf61f9c238..b043b325edc 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6960,6 +6960,7 @@ Het Control-abonnement begint bij $9 per actieve deelnemer per maand.`,
amountPerUnit: (unit: string) => `Bedrag per ${unit}`,
startDate: 'Startdatum',
endDate: 'Einddatum',
+ autoGeneratedRateTooltip: 'Dit tarief is automatisch gegenereerd.',
},
editor: {
descriptionInputLabel: 'Beschrijving',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index b4c34c53be2..5763693c374 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6940,6 +6940,7 @@ Plan Control zaczyna się od 9 USD za aktywnego członka miesięcznie.`,
amountPerUnit: (unit: string) => `Kwota za ${unit}`,
startDate: 'Data rozpoczęcia',
endDate: 'Data zakończenia',
+ autoGeneratedRateTooltip: 'Ta stawka jest generowana automatycznie.',
},
editor: {
descriptionInputLabel: 'Opis',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 429816f1f13..9a1b617fabc 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6952,6 +6952,7 @@ O plano Control começa em US$ 9 por membro ativo por mês.`,
amountPerUnit: (unit: string) => `Valor por ${unit}`,
startDate: 'Data de início',
endDate: 'Data de término',
+ autoGeneratedRateTooltip: 'Essa tarifa é gerada automaticamente.',
},
editor: {
descriptionInputLabel: 'Descrição',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 286066528d3..4b9289c9cd9 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6758,6 +6758,7 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
amountPerUnit: (unit: string) => `每${unit}金额`,
startDate: '开始日期',
endDate: '结束日期',
+ autoGeneratedRateTooltip: '此费率为自动生成。',
},
editor: {
descriptionInputLabel: '描述',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
@thelullabyy Could you please update the translations and resolve my earlier comments? |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@cretadn22 resolved the code issues. For the recordings, I will re-upload soon... |
Explanation of Change
Fixed Issues
$ #95280
PROPOSAL: NA
Tests
Setup:
Seed a mock government rate:
With the Distance rates page open, turn off internet, run this in the browser console:
Verify that:
In the rates table, the seeded rate shows a small lightning-bolt icon next to the amount in the Rate column.
Hover the icon: tooltip reads "This rate is auto-generated."
Other rates show no icon.
Shrink the browser window to mobile width (or test on the mobile web layout).
The bolt icon appears next to the "rate • date" line under the rate name, with the same tooltip behavior on hover.
Open the seeded rate > Rate, change the amount (e.g. 0.725 → 0.99), save.
Back in the list, the bolt icon is gone.
Change the amount back to exactly 0.725 and save.
The bolt icon reappears.
Edit the Start date (e.g. to 2026-02-01) → icon hides. Restore to 2026-01-01 → icon returns.
Edit the End date (e.g. to 2026-11-30) → icon hides. Restore to 2026-12-31 → icon returns.
Re-run the seed snippet but with endDate: null on the rate and no endDate key inside governmentRate → icon shows (omitted on both sides counts as a match).
Then set an end date on the rate via the UI → icon hides (omitted on only one side is not a match).
Rename the rate → icon stays (name isn't part of the snapshot).
Toggle the rate off/on via the switch → icon stays; only the status badge changes.
Sorting by any column and searching via Find rate work as before, with the icon following its row.
Open a workspace whose rates were never seeded: the list renders exactly as before, no icons, no layout shift in the Rate column.
Offline tests
QA Steps
Same as Tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, 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.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
Screen.Recording.2026-07-14.at.19.07.55.mov