Every module solved this locally. Nothing matched the module next to it.
In an ERP, the filter is how work is found. Each team solved it locally: some screens had filters, some had half of one, some had a control that didn't match the next module over. If applying one is slow, people export to Excel. If a new module needs a filter from scratch, the system doesn't scale. It forks.
Every module filtered differently, or not at all.
One pattern, used everywhere. Fast to apply. Impossible to forget what's on. Built around the column's data type, not whichever module owns the page.
Lock behavior by data type, then make the state impossible to hide.
02/Control by data type
Which control does this column get?
Drag or tap a fieldFive columns from across the ERP. Pick one, then the control that fits its data.
Behavior is locked by the kind of field first: a buyer name, a quantity, a delivery window, a status.
Step 1 of 4
Two layers: what you set, and what you see once it's set.
An exported sheet. Tap every row that doesn't match to strike it out.
0 clicks. A spreadsheet, a pen, and patience.
Sales Order
4Column-specific filtering
- Text: Contains for the daily path, Exact Match for when “KM” shouldn't also return “KMS”
- Numeric: greater than, less than, ranges, so “SOs over X units” doesn't need an export
- Date: calendar range plus shortcuts like Last 7 days
- Predefined lists: dropdowns for closed sets, so nobody types a string that almost matches
Tag-based filter visualization
- Every active condition is a tag in plain language, not an icon that means “something is on”
- Edit reopens it in place, × removes just that condition, Reset clears the view
Sales Order
4Filter by column
Interactions around the control
- Filtering and sorting feel like one family, because both rewrite the list in front of you
- Apply, edit, and clear cut down to fewer clicks on purpose
- Real-time validation stops a query that would return a silent wrong list
The architecture underneath
- One modular component. Modules consume it; they don't restyle it.
- A uniform experience without a design pass every time someone adds a column called “Buyer”
A merchandiser pulling delayed styles for one buyer in the last week is three tags, not a custom report. A planner clearing the view is one reset, not a memory test.
80% less time, not a prettier chip.
less time to retrieve the view they came for
- 01Visible filters: people stop double-filtering and stop trusting a list they didn't mean to load.
- 02One pattern across modules: training and muscle memory transfer.
- 03Designed as a set: apply, edit, clear, and sort all take less effort.
I don't have a locked count of modules shipped on this pattern. If I get it, it belongs next to the 80%. Until then I'm not padding the hook.
Where the pattern goes from here.
- 01Advanced filters with group logic: AND/OR conditions, e.g. “Orders for Summer’24 AND Approved Stage OR Sampling Stage”
- 02Saved filter presets: reusable combinations for repetitive work like weekly production planning
- 03Global search integration: a unified search across modules
- 04Predictive filtering with AI: suggested filter combinations based on behavior and history