[Payment due @thesahindia] Add export current view#90714
Conversation
🦜 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 26922d8d..d2264b1e 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9104,6 +9104,7 @@ Hier ist ein *Testbeleg*, um dir zu zeigen, wie es funktioniert:`,
expenseLevelExport: 'Alle Daten – Ausgabenebene',
exportInProgress: 'Export wird ausgeführt',
conciergeWillSend: 'Concierge wird dir die Datei in Kürze senden.',
+ currentView: 'Aktuelle Ansicht exportieren',
},
domain: {
notVerified: 'Nicht verifiziert',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 33954fca..d064f6e4 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1690,10 +1690,8 @@ const translations: TranslationDeepObject<typeof en> = {
backdropLabel: 'Fondo del Modal',
},
nextStep: {
- /* eslint-disable @typescript-eslint/no-unused-vars */
message: {
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_ADD_TRANSACTIONS]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> añadas gastos.`;
@@ -1704,7 +1702,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_SUBMIT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> envíes los gastos.`;
@@ -1716,7 +1713,6 @@ const translations: TranslationDeepObject<typeof en> = {
},
[CONST.NEXT_STEP.MESSAGE_KEY.NO_FURTHER_ACTION]: (_actor, _actorType, _eta, _etaType) => `¡No se requiere ninguna acción adicional!`,
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_SUBMITTER_ACCOUNT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> añadas una cuenta bancaria.`;
@@ -1731,7 +1727,6 @@ const translations: TranslationDeepObject<typeof en> = {
if (eta) {
formattedETA = etaType === CONST.NEXT_STEP.ETA_TYPE.DATE_TIME ? ` el ${eta} de cada mes` : ` ${eta}`;
}
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que tus gastos se envíen automáticamente${formattedETA}.`;
@@ -1742,7 +1737,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_FIX_ISSUES]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> soluciones ellos problemas.`;
@@ -1753,7 +1747,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_APPROVE]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> apruebes los gastos.`;
@@ -1764,7 +1757,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_EXPORT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> exportes este informe.`;
@@ -1775,7 +1767,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_PAY]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> pagues los gastos.`;
@@ -1786,7 +1777,6 @@ const translations: TranslationDeepObject<typeof en> = {
}
},
[CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_POLICY_BANK_ACCOUNT]: (actor, actorType, _eta, _etaType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Esperando a que <strong>tú</strong> termines de configurar una cuenta bancaria de empresa.`;
@@ -1806,7 +1796,6 @@ const translations: TranslationDeepObject<typeof en> = {
[CONST.NEXT_STEP.MESSAGE_KEY.SUBMITTING_TO_SELF]: (_actor, _actorType, _eta, _etaType) =>
`¡Ups! Parece que estás enviando el informe a <strong>ti mismo</strong>. Aprobar tus propios informes está <strong>prohibido</strong> por tu espacio de trabajo. Por favor, envía este informe a otra persona o contacta a tu administrador para cambiar la persona a la que lo envías.`,
[CONST.NEXT_STEP.MESSAGE_KEY.REJECTED_REPORT]: (actor, actorType) => {
- // eslint-disable-next-line default-case
switch (actorType) {
case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER:
return `Este informe fue rechazado. Esperando a que <strong>tú</strong> corrijas los problemas y lo vuelvas a enviar manualmente.`;
@@ -2462,7 +2451,6 @@ ${amount} para ${merchant} - ${date}`,
two: 'º',
few: 'º',
other: 'º',
- /* eslint-disable @typescript-eslint/naming-convention */
'1': 'Primero',
'2': 'Segundo',
'3': 'Tercero',
@@ -2473,7 +2461,6 @@ ${amount} para ${merchant} - ${date}`,
'8': 'Octavo',
'9': 'Noveno',
'10': 'Décimo',
- /* eslint-enable @typescript-eslint/naming-convention */
},
},
approverInMultipleWorkflows: 'Este miembro ya pertenece a otro flujo de aprobación. Cualquier actualización aquí se reflejará allí también.',
@@ -6957,7 +6944,6 @@ ${amount} para ${merchant} - ${date}`,
restrictedDescription: 'Sólo las personas en tu espacio de trabajo pueden encontrar esta sala',
privateDescription: 'Sólo las personas que están invitadas a esta sala pueden encontrarla',
publicDescription: 'Cualquier persona puede unirse a esta sala',
- // eslint-disable-next-line @typescript-eslint/naming-convention
public_announceDescription: 'Cualquier persona puede unirse a esta sala',
createRoom: 'Crea una sala de chat',
roomAlreadyExistsError: 'Ya existe una sala con este nombre',
@@ -6977,7 +6963,6 @@ ${amount} para ${merchant} - ${date}`,
restricted: 'Espacio de trabajo',
private: 'Privada',
public: 'Público',
- // eslint-disable-next-line @typescript-eslint/naming-convention
public_announce: 'Anuncio Público',
},
},
@@ -7292,7 +7277,6 @@ ${amount} para ${merchant} - ${date}`,
updatedDefaultTitle: (newDefaultTitle, oldDefaultTitle) => `cambió la fórmula personalizada del nombre del informe a "${newDefaultTitle}" (previamente "${oldDefaultTitle}")`,
updatedOwnership: (oldOwnerEmail, oldOwnerName, policyName) => `asumió la propiedad del espacio de trabajo ${policyName} de ${oldOwnerName} (${oldOwnerEmail})`,
updatedAutoHarvesting: (enabled) => `${enabled ? 'habilitó' : 'deshabilitó'} el envío programado`,
- // eslint-disable-next-line @typescript-eslint/max-params
updatedIndividualBudgetNotification: (
budgetAmount,
budgetFrequency,
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index c34cd360..f5acfd54 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -9125,6 +9125,7 @@ Voici un *reçu test* pour vous montrer comment ça fonctionne :`,
expenseLevelExport: 'Toutes les données - niveau dépense',
exportInProgress: 'Export en cours',
conciergeWillSend: 'Concierge vous enverra le fichier sous peu.',
+ currentView: 'Exporter la vue actuelle',
},
domain: {
notVerified: 'Non vérifié',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 3aa5631f..91bcb341 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9094,6 +9094,7 @@ Ecco una *ricevuta di prova* per mostrarti come funziona:`,
expenseLevelExport: 'Tutti i dati - livello spesa',
exportInProgress: 'Esportazione in corso',
conciergeWillSend: 'Concierge ti invierà il file a breve.',
+ currentView: 'Esporta vista corrente',
},
domain: {
notVerified: 'Non verificato',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 608cb8a7..50a912f3 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -8981,6 +8981,7 @@ ${reportName}
expenseLevelExport: 'すべてのデータ - 経費レベル',
exportInProgress: 'エクスポート処理中',
conciergeWillSend: 'Conciergeがまもなくファイルを送信します。',
+ currentView: '現在の表示をエクスポート',
},
domain: {
notVerified: '未確認',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 6207a482..99a4dd74 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9064,6 +9064,7 @@ Hier is een *proefbon* om je te laten zien hoe het werkt:`,
expenseLevelExport: 'Alle gegevens - uitgaveniveau',
exportInProgress: 'Export bezig',
conciergeWillSend: 'Concierge stuurt je het bestand zo meteen.',
+ currentView: 'Huidige weergave exporteren',
},
domain: {
notVerified: 'Niet geverifieerd',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 5832a290..fe7a2cd8 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9049,6 +9049,7 @@ Oto *paragon testowy*, żeby pokazać Ci, jak to działa:`,
expenseLevelExport: 'Wszystkie dane – poziom wydatku',
exportInProgress: 'Trwa eksport',
conciergeWillSend: 'Concierge wkrótce wyśle Ci plik.',
+ currentView: 'Eksportuj bieżący widok',
},
domain: {
notVerified: 'Niezweryfikowane',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index b3b05fa4..f968fff2 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9057,6 +9057,7 @@ Aqui está um *comprovante de teste* para mostrar como funciona:`,
expenseLevelExport: 'Todos os dados - nível de despesa',
exportInProgress: 'Exportação em andamento',
conciergeWillSend: 'O Concierge enviará o arquivo para você em breve.',
+ currentView: 'Exportar visualização atual',
},
domain: {
notVerified: 'Não verificado',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 96e791f7..efb7db8c 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -8825,6 +8825,7 @@ ${reportName}
expenseLevelExport: '所有数据 - 报销级别',
exportInProgress: '导出进行中',
conciergeWillSend: 'Concierge 将很快把文件发送给你。',
+ currentView: '导出当前视图',
},
domain: {
notVerified: '未验证',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
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.
|
|
⏱️ Ran out of time before I could finish. This usually means the task was too complex or I got stuck exploring. Please try again with a more specific request or post in #melvinbot-ai. |
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 447fed347c
ℹ️ About Codex in GitHub
Your team has set up Codex to 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 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@thesahindia 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] |
|
Hey @thesahindia please review this one when you get a chance 😄 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b71bfd3a43
ℹ️ About Codex in GitHub
Your team has set up Codex to 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 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
joekaufmanexpensify
left a comment
There was a problem hiding this comment.
Design doc issue
|
Bump @thesahindia |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid build crashingAndroid: mWeb ChromeScreen.Recording.2026-05-29.at.1.24.09.AM.moviOS: HybridAppScreen.Recording.2026-05-29.at.1.15.11.AM.moviOS: mWeb SafariScreen.Recording.2026-05-29.at.1.17.39.AM.movMacOS: Chrome / SafariScreen.Recording.2026-05-28.at.11.28.17.PM.mov |
|
Nice catch, group by exports are being handled here #88577. I will remove export current view from them for now. |
|
Removed and conflicts resolved @thesahindia ! |
Friendly bump @flaviadefaria |
|
🎯 @thesahindia, thanks for reviewing and testing this PR! 🎉 A payment issue will be created for your review once this PR is deployed to production. If payment is not needed (e.g., regression PR review fix etc), react with 👎 to this comment to prevent the payment issue from being created. |
|
🚧 @inimaga has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/inimaga in version: 9.3.90-0 🚀
Bundle Size Analysis (Sentry): |
Help site review — changes requiredThis PR adds a new Export current view option to the bulk Export menu on the Spend page, which downloads a CSV matching the columns currently displayed (set via Display > Edit columns) instead of a fixed template. It appears on the ungrouped Expenses and Reports views and is hidden when a Group by filter is applied. This behavior is documented in three help articles that previously did not mention it — one of which (Search and Download Expenses) had a now-incorrect FAQ stating columns follow a fixed template. I created a draft help site PR with the updates: Draft docs PR: #92191 Files updated
All button, tab, and menu labels were verified against the current UI strings in @rlinoz, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |
|
Deploy Blocker #92256 was identified to be related to this PR. |
|
Deploy Blocker #92257 was identified to be related to this PR. |
|
🚀 Deployed to production by https://github.com/lakchote in version: 9.3.90-3 🚀
|
|
🤖 Payment issue created: #92314 |
Document the new Export current view option added in Expensify#90714, which exports a CSV matching the columns currently shown on the Spend page. Co-authored-by: Rodrigo Lino da Costa <rlinoz@users.noreply.github.com>
Explanation of Change
We want to enable the possibility to export what the user is currently seeing on the search screen, for that we start sending some extra parameters when calling export commands,
exportColumnLabels, for column names in the csv, andisBasicExportto decide which data and how to format it.We also add a new button
Export current viewthat exports asisBasicExport=falseFixed Issues
$ https://github.com/Expensify/Expensify/issues/633210
PROPOSAL:
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
Screen.Recording.2026-05-18.at.16.13.22.mov