Rename Search "Date" filter to "Created date" and column to "Created" for expense reports - #99216
Conversation
Add dedicated search.filters.createdDate / search.filters.created keys (all 11 locales), repoint FILTER_VIEW_MAP[DATE] and getSearchColumnTranslationKey plus the three SearchTableHeader builders, and widen the narrow DATE column (w62 -> w80) so "Created" + sort arrow fit without truncation. common.date is left untouched.
getTableMinWidth adds 48 for DATE vs 72 for SUBMITTED/APPROVED/POSTED; the "Created" header needs the same room, so bump it to 72 to keep the fixed cell width (w80) and the horizontal-scroll min-width consistent.
Per the issue clarification, keep "Date" for type:expense (and the opened single-report table) and show "Created"/"Created date" only for type:expense-report. Thread the active Search type through the date label sources (getSearchColumnTranslationKey, filter-menu labels via getFilterViewLabelKey) and gate the DATE column widening on expense-report.
Asserts getSearchColumnTranslationKey, getFilterViewLabelKey, the expense column builder and getTableMinWidth all keep "Date" for every type except expense-report, so the scoped behavior can't silently regress to all types.
…stay Date) Per the team clarification (invoice is treated like a report, trip is an expense), the report-style rename now covers type:invoice as well as type:expense-report. Introduce an isCreatedDateType(type) predicate (expense-report OR invoice) and use it at every date-label source: getSearchColumnTranslationKey, getFilterViewLabelKey, getTableMinWidth, the SortableTableHeader isDateColumnCreated prop, and getExpenseHeaders (now type-aware so shared expense/trip/opened-report callers stay on Date).
…n misalignment) The header/min-width for type:invoice now render the wider Created column, but invoice results render through ExpenseFlatSearchView -> TransactionItemRow (the same transaction-row path as expense), whose DATE cell was fixed at w62. That left the invoice header at w80 while its rows stayed w62 -> misaligned columns. Thread an isDateColumnCreated flag from ExpenseFlatSearchView (true only for type:invoice) through TransactionListItem -> TransactionItemRow to the DATE cell so rows match the header. The opened single-report table passes nothing (defaults false), so it stays on the narrow Date column.
|
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 bun ./scripts/generateTranslations.ts --helpTypically, you'd want to translate only what you changed by running |
|
@arosiclair 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] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a205a3b023
ℹ️ 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".
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.
|
… with the widened Created header
|
@codex review |
|
Quick heads-up @FitseTLT: the one red test ( |
Reviewer Checklist
Screenshots/VideosAndroid: HybridApp2026-09-03.17-55-04.mp4Android: mWeb Chrome2026-09-03.17-28-45.mp4iOS: HybridApp2026-09-03.20-53-48.mp4iOS: mWeb Safari2026-09-03.17-26-08.mp4MacOS: Chrome / Safari2026-09-03.17-24-01.mp4 |
|
@dilshodmackbook-sketch pls make the test steps cover all changes. |
|
@MelvinBot @codex review |
|
Codex Review: Something went wrong. Try again later by commenting “@codex review”. ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
|
@codex review |
Code reviewTwo things I'd change before merge — one is an actual layout regression on types this PR is supposed to leave alone, the other is ~4 files of prop plumbing that nothing reads. The label logic itself ( 1.
|
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
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". |
|
Updated the Tests/QA steps to cover every surface the diff touches. Grouped by renamed types (expense-report + task) vs untouched types:
|
|
Melvin comments @dilshodmackbook-sketch |
- getTableMinWidth: restore the 48 budget for non-created DATE columns (expense/invoice/trip/opened report) and use 72 for the created column, matching the sibling date columns and the PR description. The previous 62/80 shifted the horizontal-scroll threshold for types this PR leaves alone. - Remove the isDateColumnCreated prop that was threaded through TransactionListItem but never passed in (invoice was descoped, and its only render site is flat-expense where the flag is always false). The live header path (SearchStaticList/SearchTableHeader -> SortableTableHeader/TransactionItemRow) is untouched. - zh-hans/ja: match the completed aspect of the sibling status labels (已创建, 作成済み) instead of the bare verb form. - ColumnsSettingsList: document the type prop (the only one without a comment). - Tests: assert absolute getTableMinWidth values so a non-created regression can't pass, and cover getReportTableColumnStyles DATE cell width.
|
@FitseTLT thanks for the review. Addressed all four in 314ad30.
|
|
@dilshodmackbook-sketch from now on, do not apply translation by yourself just add the english translations and translation workflows will do the translation. @JS00001 pls run translations |
Per review: don't hand-apply translations. The generateTranslations workflow generates the non-English locales from the added en.ts keys (search.filters.created and search.filters.createdDate).
|
Reverted the locales, en.ts only now. The red typecheck is just the missing generated keys, so it'll clear once the translation workflow runs. @JS00001 whenever you get a chance. |
Per FitseTLT: DATE is fixed-width, so getTableMinWidth should budget its real rendered width (w62, or w80 for the Created column), not the stale 48 (drift from when the cell was w52) or the sibling columns' 72. Updated the PR description so the min-width note matches the code.
|
@trjExpensify @sakluger Can u give us 👀 on the final result? I mean I want you to confirm the places where 2026-09-03.20-58-35.mp4 |
|
@FitseTLT sorry about this, you're right. I've been buried and running on barely any sleep the last couple of days, and I moved too fast reacting to Melvin instead of stopping to think it through. Restored the 80/62 widths and fixed the description to match. Won't push over your review like that again. |
@dubielzyk-expensify on this. I believe the intention of the suggestion was that everywhere but the
|
|
It wasn't my suggestion to change this, but yeah I think that makes sense. I think the only place we'd list |
Oh, my bad. I thought it was! 😅 |
|
cc @sakluger as it's his baby :) |
Not Jon or Sasha, but I totally agree with this. |
|
@JS00001 quick bump, merged main so en.ts changed again, translations workflow needs another run to clear the typecheck whenever you're free |
🦜 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 dd60e29e..ac50bf55 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -9568,6 +9568,8 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Export',
},
filterType: {label: 'Filtertyp', has: {positive: 'hat', negative: 'hat nicht'}, is: {positive: 'ist', negative: 'ist nicht'}},
+ created: 'Erstellt',
+ createdDate: 'Erstellungsdatum',
},
display: {
label: 'Anzeige',
diff --git a/src/languages/el.ts b/src/languages/el.ts
index 99404a7e..cb3a2f67 100644
--- a/src/languages/el.ts
+++ b/src/languages/el.ts
@@ -9777,6 +9777,8 @@ ${reportName}`,
has: {positive: 'έχει', negative: 'δεν έχει'},
is: {positive: 'είναι', negative: 'δεν είναι'},
},
+ created: 'Δημιουργήθηκε',
+ createdDate: 'Ημερομηνία δημιουργίας',
},
display: {
label: 'Εμφάνιση',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index 2790fe3a..64d88baf 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -9436,6 +9436,8 @@ ${reportName}`,
},
reportField: (name, value) => `${name} es ${value}`,
filterType: {label: 'Tipo de filtro', has: {positive: 'tiene', negative: 'no tiene'}, is: {positive: 'es', negative: 'no es'}},
+ created: 'Creado',
+ createdDate: 'Fecha de creación',
},
chartTitles: {
[CONST.SEARCH.GROUP_BY.FROM]: 'De',
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index ef895335..18de89a4 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -9588,6 +9588,8 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exporter',
},
filterType: {label: 'Type de filtre', has: {positive: 'a', negative: 'n’a pas'}, is: {positive: 'est', negative: 'n’est pas'}},
+ created: 'Créé',
+ createdDate: 'Date de création',
},
display: {
label: 'Affichage',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 297292d6..cf183d1b 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -9526,6 +9526,8 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Esporta',
},
filterType: {label: 'Tipo di filtro', has: {positive: 'ha', negative: 'non ha'}, is: {positive: 'è', negative: 'non è'}},
+ created: 'Creato',
+ createdDate: 'Data di creazione',
},
display: {
label: 'Visualizza',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index b4814ff2..fcf1e79e 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -9405,6 +9405,8 @@ ${reportName}`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'エクスポート',
},
filterType: {label: 'フィルタータイプ', has: {positive: '持っています', negative: '持っていません'}, is: {positive: 'は', negative: 'ではありません'}},
+ created: '作成しました',
+ createdDate: '作成日',
},
display: {
label: '表示',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 5d748df2..c9ff74d4 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -9494,6 +9494,8 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exporteren',
},
filterType: {label: 'Filtertype', has: {positive: 'heeft', negative: 'heeft niet'}, is: {positive: 'is', negative: 'is niet'}},
+ created: 'Aangemaakt',
+ createdDate: 'Aanmaakdatum',
},
display: {
label: 'Weergave',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 907f0844..180f6545 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -9518,6 +9518,8 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Eksportuj',
},
filterType: {label: 'Typ filtra', has: {positive: 'ma', negative: 'nie ma'}, is: {positive: 'jest', negative: 'nie jest'}},
+ created: 'Utworzono',
+ createdDate: 'Data utworzenia',
},
display: {
label: 'Wyświetl',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index f44b1081..9a1e41c2 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -9494,6 +9494,8 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: 'Exportar',
},
filterType: {label: 'Tipo de filtro', has: {positive: 'tem', negative: 'não tem'}, is: {positive: 'é', negative: 'não é'}},
+ created: 'Criado',
+ createdDate: 'Data de criação',
},
display: {
label: 'Exibir',
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index c6ebe04d..6aa576eb 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -9157,6 +9157,8 @@ ${reportName}`,
[CONST.SEARCH.ACTION_FILTERS.EXPORT]: '导出',
},
filterType: {label: '筛选类型', has: {positive: '有', negative: '没有'}, is: {positive: '是', negative: '不是'}},
+ created: '已创建',
+ createdDate: '创建日期',
},
display: {
label: '显示',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
|
Quick heads-up @FitseTLT: the red |

Explanation of Change
Renames the Search
Datefilter toCreated dateand the table column header toCreated, scoped to the types whose date column is a non-editable created timestamp:type:expense-reportandtype:task. Every other type keepsDate:invoice,expenseandtriprender the editable transaction date,chathas no date column, and the opened single-report table plus every non-Search surface keepDatetoo.The rename is gated on a single shared predicate (
isCreatedDateType) reused at every label source: the column-header builders,getSearchColumnTranslationKey(Sort by / Edit columns / saved search / Export current view CSV) and the filter-menu label. The date column is widened tow80(fromw62) only for those types so the longerCreatedheader doesn't clip against its active-sort caret.getTableMinWidthfollows the actual rendered width of the fixed DATE cell (62, or80for the widened Created column) instead of the previous48, which was stale drift from when the cell rendered atw52. Thedate:query key andsortBywire value never change, so saved searches, deep links and optimistic rows keep working, so only visible labels move.Fixed Issues
$ #98148
PROPOSAL: #98148 (comment)
Tests
Rename applies to
type:expense-reportandtype:taskonly (their date column is a non-editable created timestamp).expense,invoice,tripandchatkeepDateeverywhere, as does the opened single-report table and every non-Search surface.A. Renamed types show
Created/Created date(do this for BOTHExpense reportsandTasks)Expense reports, then repeat all of the below with typeTasks.Created(notDate), and the header is not clipped by its sort caret when you sort by it.Created date. Apply a date filter and confirm the applied-filter chip in the filters bar readsCreated date.Created. Select it, then reopen the Display popup and confirm the Sort by summary row readsCreated.Created.Created date.Created.Created.B. Untouched types keep
DateExpenses,Invoices,TripsandChats. For each, verify the column header (where present), Filters row, applied chip, Sort by, Edit columns, Export CSV and Save search all still readDate. (Chats has no date column - just verify noCreatedlabel appears anywhere for it.)Expenses,InvoicesandTrips- header and rows line up as before (this PR must not widen those).C. Opened single report + unrelated labels
Date.Datelabel outside Search (e.g. the IOU/transaction date field) is unchanged.Offline tests
Same as Tests. This is a pure relabel with no API calls, so behavior is identical online and offline.
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
Screen.Recording.2026-08-23.at.11.13.57.mov
Android: mWeb Chrome
PR99216_mWeb_responsive.mp4
iOS: Native
Screen.Recording.2026-08-23.at.12.03.23.mov
iOS: mWeb Safari
PR99216_mWeb_responsive.mp4
MacOS: Chrome / Safari
demo-video.mp4
The
type:expensetable keeps theDatecolumn header. The rename only applies to the report-style types.