Summary
The invoice marketplace list has no sorting, filtering, or shareable state. Build a data table with column sorting, filtering, pagination, and full URL-state sync so views are shareable and restorable.
Why this matters
A real data view needs sort/filter/paging that survive reload and can be shared. URL-syncing makes state a first-class, testable citizen.
Requirements
- Column sorting (asc/desc/none), text/enum filtering, and pagination on the invoice marketplace table.
- Reflect sort/filter/page in the URL query and restore from it on load.
- Debounce filter input and keep interactions keyboard-accessible.
- Empty/filtered-empty states are distinct and clear.
Technical guidance
- Treat the URL as the source of truth for view state.
- Memoize derived rows so unrelated state changes don't re-render them.
Edge cases — each must have a test
Acceptance criteria
Out of scope
- Server-side sorting/filtering
- Column reordering/resizing
Rewards
Part of the GrantFox OSS / Official Campaign (FWC26) — this task may be rewarded. PR quality is assessed by AI: depth, correctness under edge cases, meaningful tests, and clean design are what earn the reward. Shallow changes (typos, formatting, trivial docs) do not qualify.
Summary
The invoice marketplace list has no sorting, filtering, or shareable state. Build a data table with column sorting, filtering, pagination, and full URL-state sync so views are shareable and restorable.
Why this matters
A real data view needs sort/filter/paging that survive reload and can be shared. URL-syncing makes state a first-class, testable citizen.
Requirements
Technical guidance
Edge cases — each must have a test
Acceptance criteria
npm run lint,npm test, andnpm run buildall pass locallyCloses #<issue>Out of scope
Rewards
Part of the GrantFox OSS / Official Campaign (FWC26) — this task may be rewarded. PR quality is assessed by AI: depth, correctness under edge cases, meaningful tests, and clean design are what earn the reward. Shallow changes (typos, formatting, trivial docs) do not qualify.