feat(explore): add search input box to explore tab views #361

Merged
fuzzy merged 14 commits from feat/352-explore-search into main 2026-07-08 09:52:51 +00:00
Owner

What

Add search InputField to Explore tab. / focuses search, typing filters client-side, Enter triggers API search, Escape clears.

Closes #352

## What Add search InputField to Explore tab. `/` focuses search, typing filters client-side, Enter triggers API search, Escape clears. Closes #352
feat(explore): add search input box to explore tab views
Some checks failed
Test and Release / lint (pull_request) Has been cancelled
Test and Release / test (pull_request) Has been cancelled
ed9daea541
- Search input field with / keybinding to focus
- Client-side filtering on text change for all views
- Enter triggers API search for users and repos
- Escape clears search and resets to full list
- No results / empty state handling per view
the.auditor approved these changes 2026-07-08 09:13:21 +00:00
Dismissed
the.auditor left a comment

Review

Result: Approved — no blocking issues.

Summary: Adds search to Explore tab. / focuses input field, typing filters client-side via substring match on both columns, Enter triggers API-backed search (users/repos only). Escape clears search text. Search resets on sub-view switch. Keybar updated.

Non-blocking:

  • #362 — Dead code: SearchInputChanged/SearchInputDone are exported but unused (callbacks set directly in constructor)

Checklist:

  • Correctness: Client-side filter case-insensitive, API search works for users+repos, sub-view switch resets search
  • Completeness: Covers all 3 sub-views with client-side filtering, API search for users+repos
  • Error handling: API errors shown in title bar, empty results show contextual "No X matching 'query'" message
  • Build: Passes clean
## Review **Result: Approved** — no blocking issues. **Summary:** Adds search to Explore tab. `/` focuses input field, typing filters client-side via substring match on both columns, Enter triggers API-backed search (users/repos only). Escape clears search text. Search resets on sub-view switch. Keybar updated. **Non-blocking:** - #362 — Dead code: `SearchInputChanged`/`SearchInputDone` are exported but unused (callbacks set directly in constructor) **Checklist:** - Correctness: ✅ Client-side filter case-insensitive, API search works for users+repos, sub-view switch resets search - Completeness: ✅ Covers all 3 sub-views with client-side filtering, API search for users+repos - Error handling: ✅ API errors shown in title bar, empty results show contextual "No X matching 'query'" message - Build: ✅ Passes clean
fuzzy self-assigned this 2026-07-08 09:14:18 +00:00
style(explore): add horizontal bars above and below search input
Some checks failed
Test and Release / test (pull_request) Successful in 2m40s
Test and Release / lint (pull_request) Has been cancelled
3dd70d1610
fuzzy dismissed the.auditor's review 2026-07-08 09:14:32 +00:00
Reason:

New commits pushed, approval review dismissed automatically according to repository settings

feat(explore): add pagination with n key to load more results
Some checks failed
Test and Release / lint (pull_request) Has been cancelled
Test and Release / test (pull_request) Has been cancelled
361e337957
style(explore): add 1-column horizontal padding around results table
Some checks failed
Test and Release / test (pull_request) Successful in 1m17s
Test and Release / lint (pull_request) Has been cancelled
0282cc8d26
fix(explore): force redraw after loading more results
Some checks failed
Test and Release / lint (pull_request) Successful in 3m44s
Test and Release / test (pull_request) Has been cancelled
2b364c5e2c
fix(explore): fetch all pages on load, remove n keybinding
Some checks failed
Test and Release / test (pull_request) Has been cancelled
Test and Release / lint (pull_request) Has been cancelled
d9c099839b
Load all available results (up to 500, 10 pages of 50) on tab open.
No manual pagination required.
fix(explore): remove real-time client-side filter, only search on Enter
Some checks failed
Test and Release / test (pull_request) Has been cancelled
Test and Release / lint (pull_request) Has been cancelled
0fb5848316
Rebuilding 500+ table rows on every keystroke locks the event loop.
Search now triggers via Enter (API call), not on text change.
fix(tui): pass Backspace/Escape through to focused primitive on main tabs
Some checks failed
Test and Release / test (pull_request) Has been cancelled
Test and Release / lint (pull_request) Has been cancelled
ed9168f3f6
The global handler unconditionally returned nil for Backspace/Escape/DEL,
consuming the key even on main tab pages where InputFields need them.
Now only consumes when the help modal is open or navigating back.
fix(tui): pass Backspace/DEL through to focused primitive on main tabs
Some checks failed
Test and Release / test (pull_request) Has been cancelled
Test and Release / lint (pull_request) Has been cancelled
e88ffd19ad
Keep Escape behavior unchanged (always consumed). Only Backspace
and DEL pass through to InputField when on main tab pages.
fix(explore): fetch results in background goroutine, not on main thread
All checks were successful
Test and Release / test (pull_request) Successful in 2m38s
Test and Release / lint (pull_request) Successful in 2m44s
8236d9b488
Sequential API calls block the tview event loop, freezing the UI
including Ctrl+C. Fetch in goroutine, render via QueueUpdateDraw.
fix(explore): use separate Box primitives for table padding
All checks were successful
Test and Release / test (pull_request) Successful in 2m39s
Test and Release / lint (pull_request) Successful in 2m47s
6a86a8d3c0
fix(explore): run searchAPI in goroutine, render via QueueUpdateDraw
All checks were successful
Test and Release / test (pull_request) Successful in 2m41s
Test and Release / lint (pull_request) Successful in 2m48s
86e3c74590
fix(explore): escape blurs search input to table, skip refresh on active search
Some checks failed
Test and Release / lint (pull_request) Successful in 2m46s
Test and Release / test (pull_request) Has been cancelled
1b448154a9
- Escape with search focused: clear, blur, focus table
- Auto-refresh and Ctrl+R skip reload when search is active
feat(explore): Tab moves focus from search input to table
All checks were successful
Test and Release / test (pull_request) Successful in 2m46s
Test and Release / lint (pull_request) Successful in 2m56s
fd50c3c715
the.auditor left a comment

Re-Review

Result: Approved — no blocking issues. Significant restructuring from previous version.

Changes since previous review:

  • Async loading with goroutines and full pagination (up to 10 pages × 50 items)
  • Loading indicator ("Loading...") shown in title during fetch
  • Tab key toggles focus between search input and table
  • Escape logic split from Backspace in global handler — Escape clears search, Backspace navigates back
  • Auto-refresh/Ctrl+R skips reload when search input has text (preserves results)
  • Separators around search input
  • loaded field removed (async doesn't need it)
  • SearchInputChanged/SearchInputDone dead code removed

Non-blocking:

  • #362 — Already filed (resolved by this update)
  • #363SetChangedFunc removed — typing no longer filters in real-time. Filter functions exist but only run on data load or API search

Checklist:

  • Correctness: Pagination, async loading, concurrency-safe via QueueUpdateDraw
  • Completeness: Search, filter, pagination, sub-view switching all functional
  • Concurrency: All UI updates via QueueUpdateDraw, goroutine-safe
## Re-Review **Result: Approved** — no blocking issues. Significant restructuring from previous version. **Changes since previous review:** - Async loading with goroutines and full pagination (up to 10 pages × 50 items) - Loading indicator ("Loading...") shown in title during fetch - Tab key toggles focus between search input and table - Escape logic split from Backspace in global handler — Escape clears search, Backspace navigates back - Auto-refresh/Ctrl+R skips reload when search input has text (preserves results) - Separators around search input - `loaded` field removed (async doesn't need it) - `SearchInputChanged`/`SearchInputDone` dead code removed **Non-blocking:** - #362 — Already filed (resolved by this update) - #363 — `SetChangedFunc` removed — typing no longer filters in real-time. Filter functions exist but only run on data load or API search **Checklist:** - Correctness: ✅ Pagination, async loading, concurrency-safe via QueueUpdateDraw - Completeness: ✅ Search, filter, pagination, sub-view switching all functional - Concurrency: ✅ All UI updates via QueueUpdateDraw, goroutine-safe
fuzzy scheduled this pull request to auto merge when all checks succeed 2026-07-08 09:52:09 +00:00
fuzzy merged commit fd50c3c715 into main 2026-07-08 09:52:51 +00:00
fuzzy deleted branch feat/352-explore-search 2026-07-08 09:52:52 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
thwap/steeper!361
No description provided.