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 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 49b30a513d
ℹ️ 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".
src/components/SelectionListWithSections/Search/TransactionListItem.tsx
Outdated
Show resolved
Hide resolved
|
@luacmartins can you run translations script, please 🙏 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 034fb9b7f0
ℹ️ 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".
| changeTransactionsReport({ | ||
| transactionIDs: selectedTransactionsKeys, | ||
| isASAPSubmitBetaEnabled, | ||
| accountID: currentUserPersonalDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID, | ||
| email: currentUserPersonalDetails?.email ?? '', |
There was a problem hiding this comment.
Respect the “all matching” selection in bulk undelete
When a deleted search has more than one page of results and the user uses Search’s “select all matching” flow, this handler still restores only selectedTransactionsKeys. Unlike the other bulk actions in this hook, it never branches on areAllMatchingItemsSelected/hash, so the menu says “Undelete” for the whole result set but only the currently materialized rows are actually restored.
Useful? React with 👍 / 👎.
| changeTransactionsReport({ | ||
| transactionIDs: selectedTransactionsKeys, | ||
| isASAPSubmitBetaEnabled, | ||
| accountID: currentUserPersonalDetails?.accountID ?? CONST.DEFAULT_NUMBER_ID, | ||
| email: currentUserPersonalDetails?.email ?? '', | ||
| policy: policies?.[`${ONYXKEYS.COLLECTION.POLICY}${personalPolicyID}`], | ||
| allTransactions, | ||
| translate, | ||
| toLocaleDigit, | ||
| }); |
There was a problem hiding this comment.
Use a search-aware update when restoring deleted expenses
This bulk action calls the generic changeTransactionsReport() path, but the Search page renders from currentSearchResults.data (ONYXKEYS.COLLECTION.SNAPSHOT). changeTransactionsReport() updates reports/transactions/next steps only, so in the Deleted view the restored rows can remain visible until a full search refresh, unlike the existing search bulk actions that patch the snapshot for the active hash immediately.
Useful? React with 👍 / 👎.
| [CONST.SEARCH.STATUS.EXPENSE.UNREPORTED]: (expenseReport: OnyxEntry<OnyxTypes.Report>) => !expenseReport, | ||
| [CONST.SEARCH.STATUS.EXPENSE.DELETED]: (expenseReport: OnyxEntry<OnyxTypes.Report>) => !expenseReport, |
There was a problem hiding this comment.
Distinguish deleted expenses from unreported ones
The new deleted-status predicate is identical to the unreported one (!expenseReport). In shouldOptimisticallyUpdateSearch() this makes any expense without a loaded IOU report look “deleted”, so while a Deleted search is open, creating or moving an ordinary unreported expense can patch that expense into the Deleted results until the next refetch. The deleted check needs to use the trash sentinel, not mere report absence.
Useful? React with 👍 / 👎.
|
Running the translation script. We have a few failing checks |
🦜 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 b622da7e..6c151fde 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1593,6 +1593,7 @@ const translations: TranslationDeepObject<typeof en> = {
failedToApproveViaDEW: (reason: string) => `Genehmigung fehlgeschlagen. ${reason}`,
cannotDuplicateDistanceExpense:
'Sie können Entfernungsausgaben nicht über mehrere Arbeitsbereiche hinweg duplizieren, da sich die Sätze zwischen den Arbeitsbereichen unterscheiden können.',
+ deleted: 'Gelöscht',
},
transactionMerge: {
listPage: {
@@ -7284,6 +7285,7 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
unhold: 'Zurückhalten aufheben',
reject: 'Ablehnen',
noOptionsAvailable: 'Für die ausgewählte Ausgabengruppe sind keine Optionen verfügbar.',
+ undelete: 'Wiederherstellen',
},
filtersHeader: 'Filter',
filters: {
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index ea7ca3d2..382fb5e0 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1598,6 +1598,7 @@ const translations: TranslationDeepObject<typeof en> = {
`impossible d’approuver via les <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">règles de l’espace de travail</a>. ${reason}`,
failedToApproveViaDEW: (reason: string) => `échec de l’approbation. ${reason}`,
cannotDuplicateDistanceExpense: 'Vous ne pouvez pas dupliquer des dépenses de distance entre espaces de travail, car les taux peuvent différer d’un espace de travail à l’autre.',
+ deleted: 'Supprimé',
},
transactionMerge: {
listPage: {
@@ -7308,6 +7309,7 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
unhold: 'Supprimer la mise en attente',
reject: 'Rejeter',
noOptionsAvailable: 'Aucune option n’est disponible pour le groupe de dépenses sélectionné.',
+ undelete: 'Restaurer',
},
filtersHeader: 'Filtres',
filters: {
diff --git a/src/languages/it.ts b/src/languages/it.ts
index e101563e..f70142c6 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1591,6 +1591,7 @@ const translations: TranslationDeepObject<typeof en> = {
`approvazione non riuscita tramite le <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">regole dello spazio di lavoro</a>. ${reason}`,
failedToApproveViaDEW: (reason: string) => `approvazione non riuscita. ${reason}`,
cannotDuplicateDistanceExpense: 'Non puoi duplicare le spese chilometriche tra diversi spazi di lavoro perché le tariffe potrebbero essere diverse.',
+ deleted: 'Eliminato',
},
transactionMerge: {
listPage: {
@@ -7272,6 +7273,7 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
unhold: 'Rimuovi blocco',
reject: 'Rifiuta',
noOptionsAvailable: 'Nessuna opzione disponibile per il gruppo di spese selezionato.',
+ undelete: 'Ripristina',
},
filtersHeader: 'Filtri',
filters: {
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 33c0e0c8..ba77f8cd 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1580,6 +1580,7 @@ const translations: TranslationDeepObject<typeof en> = {
failedToAutoApproveViaDEW: (reason: string) => `<a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">ワークスペースルール</a>で承認に失敗しました。${reason}`,
failedToApproveViaDEW: (reason: string) => `承認に失敗しました。${reason}`,
cannotDuplicateDistanceExpense: '距離精算はワークスペースごとにレートが異なる可能性があるため、ワークスペース間で複製することはできません。',
+ deleted: '削除済み',
},
transactionMerge: {
listPage: {
@@ -7195,6 +7196,7 @@ ${reportName}
unhold: '保留を解除',
reject: '却下',
noOptionsAvailable: '選択した経費グループには利用できるオプションがありません。',
+ undelete: '削除を取り消す',
},
filtersHeader: 'フィルター',
filters: {
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index afc5fcd8..de35df6f 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1587,6 +1587,7 @@ const translations: TranslationDeepObject<typeof en> = {
failedToAutoApproveViaDEW: (reason: string) => `goedkeuren via <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">werkruimteregels</a> is mislukt. ${reason}`,
failedToApproveViaDEW: (reason: string) => `goedkeuren mislukt. ${reason}`,
cannotDuplicateDistanceExpense: 'Je kunt afstandsvergoedingen niet dupliceren tussen werkruimtes, omdat de tarieven per werkruimte kunnen verschillen.',
+ deleted: 'Verwijderd',
},
transactionMerge: {
listPage: {
@@ -7250,6 +7251,7 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
unhold: 'Blokkering opheffen',
reject: 'Afwijzen',
noOptionsAvailable: 'Geen opties beschikbaar voor de geselecteerde groep onkosten.',
+ undelete: 'Terugzetten',
},
filtersHeader: 'Filters',
filters: {
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index f599403f..4a66cf9d 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1588,6 +1588,7 @@ const translations: TranslationDeepObject<typeof en> = {
`nie udało się zatwierdzić przez <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">zasady w przestrzeni roboczej</a>. ${reason}`,
failedToApproveViaDEW: (reason: string) => `nie udało się zaakceptować. ${reason}`,
cannotDuplicateDistanceExpense: 'Nie możesz duplikować wydatków za przejazdy między przestrzeniami roboczymi, ponieważ stawki mogą się różnić między poszczególnymi przestrzeniami.',
+ deleted: 'Usunięto',
},
transactionMerge: {
listPage: {
@@ -7239,6 +7240,7 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
unhold: 'Usuń blokadę',
reject: 'Odrzuć',
noOptionsAvailable: 'Brak opcji dostępnych dla wybranej grupy wydatków.',
+ undelete: 'Cofnij usunięcie',
},
filtersHeader: 'Filtry',
filters: {
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 37a71eca..4391f011 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1584,6 +1584,7 @@ const translations: TranslationDeepObject<typeof en> = {
failedToAutoApproveViaDEW: (reason: string) => `falha ao aprovar pelas <a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">regras do workspace</a>. ${reason}`,
failedToApproveViaDEW: (reason: string) => `falha ao aprovar. ${reason}`,
cannotDuplicateDistanceExpense: 'Você não pode duplicar despesas de distância entre espaços de trabalho porque as tarifas podem ser diferentes entre eles.',
+ deleted: 'Excluído',
},
transactionMerge: {
listPage: {
@@ -7242,6 +7243,7 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
unhold: 'Remover bloqueio',
reject: 'Rejeitar',
noOptionsAvailable: 'Nenhuma opção disponível para o grupo de despesas selecionado.',
+ undelete: 'Restaurar',
},
filtersHeader: 'Filtros',
filters: {
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 8f83764a..84963c4b 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1554,6 +1554,7 @@ const translations: TranslationDeepObject<typeof en> = {
failedToAutoApproveViaDEW: (reason: string) => `未能通过<a href="${CONST.CONFIGURE_EXPENSE_REPORT_RULES_HELP_URL}">工作区规则</a>批准。${reason}`,
failedToApproveViaDEW: (reason: string) => `批准失败。${reason}`,
cannotDuplicateDistanceExpense: '你无法在不同工作区之间复制里程报销,因为各个工作区的费率可能不同。',
+ deleted: '已删除',
},
transactionMerge: {
listPage: {
@@ -7073,6 +7074,7 @@ ${reportName}
unhold: '解除保留',
reject: '拒绝',
noOptionsAvailable: '所选报销的费用组没有可用选项。',
+ undelete: '取消删除',
},
filtersHeader: '筛选器',
filters: {
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
🚧 @trjExpensify 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! 🧪🧪
|
|
Took it for a spin! Noting I can't test receipts, because of a deploy blocker bug that's preventing me add them.
2026-03-19_16-22-38.mp4
I assume this is because #84657 isn't merged yet.
2026-03-19_16-40-06.mp4 |
|
Okey, I fixed colour and actions issues: I've tried to fixed As to this one: |



@luacmartins
Explanation of Change
This PR adds support deleted transactions on search.
Fixed Issues
$ https://github.com/Expensify/Expensify/issues/608639
PROPOSAL: N/A
Tests
Deletedstatus fileterOffline tests
QA Steps
Deletedstatus fileterPR 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