Repository navigation
[Due for payment 2026-11-05] Reorganize the Search Filters page into clearer sections and add a filter search #104330
Description
Background
The Filters page in Search lists the available filters in four sections, split by dividers. The first section holds the most common filters, the second expense/report details, the third dates of expense/report actions, and the fourth is a set of reimbursement filters. The second section is one very long list: 26 filters for the Expense type, 15 for Expense report, and 13 each for Invoice and Trip.
That middle section doesn't group related filters together, which makes the page hard to scan:
Keyword, the filter we set when someone types a quick search above a table, is the last row of the middle section for each of these types.- For
Expense,Amountsits belowExpense typeandDate, and the card filters sit betweenBillableandPurchase amount. Postedis a card transaction date, but it sits with the report action dates.- For
Expense report,Exported to,Paid status, andPaid bysit in the middle section, apart fromExportedandPaid. - For
InvoiceandTrip,Total,Title, andReport IDsit in the report action dates section, afterPosted.
Better grouping helps, but the lists stay long. Expense alone has 42 filters, which takes several screens to scroll through.
This issue reorders the filters for the Expense, Expense report, Invoice, and Trip types into the same set of sections, so related filters sit together and each section is in the same place across those four types. It also adds a search input at the top of Filters, so people can jump straight to the filter they want.
Product and design details
[Mock: Filter search, with results and with no results] cc @dubielzyk-expensify
Sections
For the expense, expense-report, invoice and trip types, the page uses seven sections, always in this order. Each is separated by the existing divider. The section names are for this issue only; we don't add section headers to the page.
- Core
- Details
- Card transactions (new)
- Report fields (new)
- Report actions
- Exports (new)
- Withdrawals
Expense order
- Core:
Type,Status,From,To,Workspace,Keyword - Details:
Amount,Currency,Date,Merchant,Description,Category,Tag,Reimbursable,Billable,Attendees,Tax rate,Expense type,Receipt type,Has,Purchase amount,Purchase currency - Card transactions:
Card,Bank account,Feed,Transaction status,Posted - Report fields:
Report ID,Report field,Custom field 1,Custom field 2 - Report actions:
Submitted,Rejected,Held,Approved,Paid,Paid by - Exports:
Exported,Exported to - Withdrawals:
Withdrawal ID,Withdrawal type,Withdrawal status,Withdrawn,International reimbursement IDs
Expense report order
- Core:
Type,Status,From,To,Workspace,Keyword - Details:
Total,Currency,Created date,Title,Amount debited,Amount reimbursed - Card transactions: not shown for this type.
- Report fields:
Report ID,Report field,Custom field 1,Custom field 2 - Report actions:
Submitted,Rejected,Held,Approved,Paid,Paid by,Paid status - Exports:
Exported,Exported to - Withdrawals:
Withdrawal ID,Withdrawal type,Withdrawal status,Withdrawn,International reimbursement IDs
The details section mirrors the Expense order: amount and currency first, then date, then the descriptive field, with the secondary amounts (Amount debited, Amount reimbursed) last, like Purchase amount and Purchase currency.
Invoice order
- Core:
Type,Status,From,To,Workspace,Keyword - Details:
Total,Amount,Currency,Created date,Title,Merchant,Description,Category,Tag,Tax rate,Purchase amount,Purchase currency - Card transactions:
Card,Feed,Posted - Report fields:
Report ID - Report actions:
Submitted,Rejected,Held,Approved,Paid,Paid by - Exports:
Exported - Withdrawals:
Withdrawal ID,Withdrawal type,Withdrawal status,Withdrawn
Created date is today's Date filter with a new label; what it filters on doesn't change. An invoice has both invoice-level fields (Total, Title) and line-level fields (Amount, Merchant), so the details section puts the amounts and Currency first, then Created date, then the descriptive fields.
Trip order
- Core:
Type,Status,From,To,Workspace,Keyword - Details:
Total,Amount,Currency,Date,Title,Merchant,Description,Category,Tag,Tax rate,Purchase amount,Purchase currency - Card transactions:
Card,Feed,Posted - Report fields:
Report ID - Report actions:
Submitted,Rejected,Held,Approved,Paid,Paid by - Exports:
Exported,Exported to - Withdrawals:
Withdrawal ID,Withdrawal type,Withdrawn
The details section uses the same order as Invoice, but keeps the Date label, since trips behave like expenses.
Conditional filters
Some filters only appear when the user has the relevant setup, for example Custom field 1 and Custom field 2.
- When a filter doesn't apply, we hide it, and the rest of its section keeps the order above.
- When no filter in a section applies, we hide the whole section, including its divider. The page never shows two dividers in a row, or a divider at the top or bottom of the list.
- Each filter's own visibility rules don't change.
Filter search
We add a search input at the top of Filters, above Type. It shows on web, where Filters opens as a popover, and on mobile, where it opens full screen. It shows for every type, including Chat and Task.
- Placeholder:
Search filters. - Reuse: we reuse the existing search input from our selection lists, like the one in the
Categorypicker. No new component. - Matching: as the user types, we show only the filters whose name contains the text, ignoring case. For example,
paidmatchesPaid,Paid by, andPaid status. We match filter names only, not the values set on them. - Sections: matching filters keep their section and order. Sections with no matches are hidden.
- No matches: we show
No results foundin place of the list, matching our other selection lists. - Clearing: clearing the input brings back the full list. The search text stays when the user opens a filter and comes back, and resets when
Filterscloses. - Focus: on web, the input is focused when the popover opens, so the user can type right away. On mobile it isn't, so the keyboard doesn't cover the list.
Apply filtersstays at the bottom and works the same during a search.
Issue Owner
Current Issue Owner: @Krishna2323Metadata
Metadata
Labels
Type
Projects
- StatusShow more project fieldsNo status
Activity
dubielzyk-expensify commentedon Oct 20, 2026
I'll look into the list itself, but I know one idea was to add a search field to filter the list of filters:
CleanShot.2026-10-20.at.2.01.12.PM.mp4
Test out the adhoc build on the PR over here
JmillsExpensify commentedon Oct 20, 2026
That looks great. Also @Krishna2323 one thing I realized testing another PR is that we have recently added a
Rejectedfilter and we are also adding aHeldfilter. I've added them to the "report actions" sections above.JS00001 commentedon Oct 20, 2026
Ooh yeah I really like that idea @dubielzyk-expensify
dubielzyk-expensify commentedon Oct 21, 2026
Forgot to cc @Expensify/design for thoughts
shawnborton commentedon Oct 21, 2026
Yup, nice and clean - I like it!
shawnborton commentedon Oct 21, 2026
In this case, should we also clear out the right pane though? Otherwise it can feel a bit odd and disconnected.
JmillsExpensify commentedon Oct 21, 2026
Good point. I agree with that.
12 remaining items
daledah commentedon Oct 26, 2026
I assigned my self since i was the C+ on this PR
melvin-bot commentedon Oct 27, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
mitarachim commentedon Oct 27, 2026
Deploy Blocker #105197 was identified to be related to the PR #104668 that attempted to fix this issue.
melvin-bot commentedon Oct 28, 2026
If you are the assigned CME please investigate whether the linked PR caused a regression and leave a comment with the results.
If a regression has occurred and you are the assigned CM follow the instructions here.
If this regression could have been avoided please consider also proposing a recommendation to the PR checklist so that we can avoid it in the future.
[-]Reorganize the Search `Filters` page into clearer sections and add a filter search[/-][+][Due for payment 2026-11-05] Reorganize the Search `Filters` page into clearer sections and add a filter search[/+]melvin-bot commentedon Oct 29, 2026
@Krishna2323 / @daledah
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.24-8 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue:
If no regressions arise, payment will be issued on 2026-11-05. 🎊
The following checklist (instructions) will need to be completed before the issue can be closed. Please copy/paste the Contributor+ Checklist from here into a new comment on this GH and complete it. If you have the K2 extension, you can simply click: [this button]. If no checklist is needed for this issue, you can click: [no checklist button]
daledah commentedon Oct 29, 2026
Contributor+ Checklist:
[Contributor] The offending PR and associated issue have been commented on, pointing out the bug it caused and why, so the author and reviewers can learn from the mistake.
Link to the comment on the PR: N/A, improvement
[Contributor] If the regression was CRITICAL (e.g. interrupts a core flow) A discussion in #expensify-open-source has been started about whether any other steps should be taken (e.g. updating the PR review checklist) in order to catch this type of bug sooner.
Link to discussion:
[Contributor] If it was decided to create a regression test for the bug, please propose the regression test steps using the template below to ensure the same bug will not reach production again.
Regression Test Proposal
Precondition:
Test:
Go to Spend > Expenses and click Filters.
Verify Keyword is the last row in the Core section, right after Workspace if it is shown.
Verify the filters appear in this order:
Use an account with no cards. Verify the Card transactions section is hidden and there are no consecutive dividers.
Change Type to Invoice. Verify:
Type paid in the search input. Verify only Paid and Paid by appear, each in its own section.
Type xyz. Verify No results found appears and the right pane is empty (web only).
Clear the search input. Verify the full filter list returns.
On a narrow layout, open Filters, type paid, open Paid, then go back. Verify paid remains in the search input.
Verify that no errors appear in the JS console.
Do we agree 👍 or 👎