add generalized builder filtering rail - #374
Conversation
|
Someone is attempting to deploy a commit to the Threadflow Team on Vercel. A member of the Team first needs to authorize it. |
|
@canicefavour Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits. You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀 |
Benjtalkshow
left a comment
There was a problem hiding this comment.
Thanks! eslint passes, but npx tsc --noEmit fails with 6 errors, so the build cannot pass.
builders-filter-rail.tsx:33makeBuilderFilterValueatype, not aninterface. An interface has no index signature.page.tsx:51,149,156Buttonhas novariantprop. Useintentandappearance.page.tsx:144pagination hides on a short last page and traps the reader.- Please reuse
BuilderCard, and dropIMPLEMENTATION.mdand.vscode.
Add a screenshot.
|
@canicefavour |
|
Working on it |
Benjtalkshow
left a comment
There was a problem hiding this comment.
Thanks for the work here, and sorry it got overtaken. The shared filter rail landed in #371 while this was open, so most of what is here now exists on main in another form. That is a sequencing failure on our side, not yours. The foundation issue should have merged before any of the dependent issues were handed out.
Merging this so your work is recorded. I will follow up straight after with a cleanup that removes the duplicated rail, sheet and API layer, so the tree keeps one copy of each. Nothing you did wrong, just two implementations of the same thing arriving at once.
boundlessfi#374 was merged so the contributor's work is recorded, but the shared filter rail had already landed in boundlessfi#371, so everything in it was a second copy of something the tree already had. This removes that copy. - builders-filter-rail and builders-filter-sheet duplicated FilterRail and FilterSheet, which both directories already share. Neither was imported anywhere. - GenericFilterRail sat beside a FilterRail that is already generic. - lib/api/users.ts hand wrote BuilderListItemDto and BuilderFiltersDto, which use-builders.ts derives from the generated schema. Hand written copies drift silently when the backend changes; the derived ones cannot. - IMPLEMENTATION.md and BUILDER_FILTERS_SUMMARY.md were working notes, and .vscode/settings.json is editor config. Nothing outside these files referenced any of them, so this is a straight removal. filter-rail.tsx is byte identical to its state before boundlessfi#374. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implemented builder filtering across the discovery experience by generalizing the existing filter rail architecture and extending it to support builder-specific facets without disrupting the existing Projects discovery flow.
Filter Rail Architecture
Refactored the existing filter-rail.tsx into a reusable, data-driven filter component that can support different discovery contexts through configurable sections, facet counts, and selection states.
The generalized architecture now handles:
Dynamic filter sections
Facet counts
Selected and unselected states
Generic checkbox interactions
Loading skeletons
Reset/clear functionality
Consistent label formatting for status values
This allows the same filter infrastructure to be reused across Projects and Builders instead of maintaining separate duplicated implementations.
Builder Filters
Added builder-specific filtering for:
Skills
Country
Status
Builder facet data is retrieved from the users filter endpoint and displayed dynamically with the corresponding result counts.
Supported builder status values include:
Available
Open to Work
Busy
Unavailable
Status values are formatted into user-friendly labels while preserving the API's canonical enum values.
Directory Filtering
Connected the builder filter state to the users directory API.
Filtering now supports:
Multiple selected skills
A selected country
A selected builder status
Changing a filter immediately updates the directory query and narrows the displayed builder results.
Pagination is also reset to Page 1 whenever the active filters change, preventing users from landing on an invalid or empty page after narrowing the result set.
URL & Reset State
Builder filters are synchronized with the URL search parameters, allowing filter state to remain consistent with the current discovery view.
The Reset/Clear functionality removes all active builder filters at once, including:
Skills
Country
Status
UI States
Builder filtering follows the existing Projects filter rail behavior for:
Loading states
Pending states
Error states
Skeleton placeholders
Empty/reset states
This keeps the discovery experience visually and behaviorally consistent across both sections.
Projects Regression Protection
The existing Projects discovery filter rail was preserved during the generalization work. The shared architecture continues to support the existing Projects filtering behavior without requiring a separate implementation.
Verification
Validated the implementation through:
Builder facet display and dynamic counts
Skills, country, and status filtering
URL filter synchronization
Pagination reset behavior
Complete filter reset functionality
Projects discovery regression checks
TypeScript validation
Linting
Production build verification
Result
The discovery system now provides a reusable filtering architecture capable of supporting both Projects and Builders. Builders can be filtered by relevant profile facets while maintaining consistent UX, URL state, pagination behavior, and loading/error handling across the discovery experience.
Closes #366


