feat(ui): add /ui/jobs listing page with filters + pagination #47

Merged
goldstein merged 1 commit from feat/ui-jobs-list into main 2026-04-18 22:00:45 +00:00
Owner

Summary

  • Adds JobsRepo.list_recent(session, limit, offset, status, client_id) returning (list[Job], total); newest-first, limit capped at 200, accepts single or iterable status filter, exact client_id match, raises on negative offset.
  • New GET /ui/jobs route renders jobs_list.html (Pico CSS, same header style as existing UI): status badge, filename (from FileRef.display_name or URL basename), use_case, client_id, submitted + relative, elapsed, per-row link to /ui/jobs/{id}.
  • Filter bar: status checkboxes (multi) + client_id text + page-size; prev/next pagination; "Showing N of M" counter.
  • Persistent nav header on /ui and /ui/jobs/{id} gains a "Recent jobs" link.
  • AGENTS.md + README.md mention /ui/jobs alongside /ui.

Test plan

  • Unit suite green (uv run pytest tests/unit)
  • Integration tests run under CI (Postgres) — new tests in tests/integration/test_jobs_repo.py (list_recent: empty, ordering, single + iterable status, client_id filter, pagination, limit cap, negative offset) and tests/integration/test_ui_routes.py::TestJobsListPage (render, status single/multi, client filter, pagination, legacy fallback, header links)
  • Live smoke: /ui/jobs + /ui/jobs?status=error after deploy

🤖 Generated with Claude Code

## Summary - Adds `JobsRepo.list_recent(session, limit, offset, status, client_id)` returning `(list[Job], total)`; newest-first, limit capped at 200, accepts single or iterable status filter, exact client_id match, raises on negative offset. - New `GET /ui/jobs` route renders `jobs_list.html` (Pico CSS, same header style as existing UI): status badge, filename (from `FileRef.display_name` or URL basename), use_case, client_id, submitted + relative, elapsed, per-row link to `/ui/jobs/{id}`. - Filter bar: status checkboxes (multi) + client_id text + page-size; prev/next pagination; "Showing N of M" counter. - Persistent nav header on `/ui` and `/ui/jobs/{id}` gains a "Recent jobs" link. - `AGENTS.md` + `README.md` mention `/ui/jobs` alongside `/ui`. ## Test plan - [x] Unit suite green (`uv run pytest tests/unit`) - [ ] Integration tests run under CI (Postgres) — new tests in `tests/integration/test_jobs_repo.py` (list_recent: empty, ordering, single + iterable status, client_id filter, pagination, limit cap, negative offset) and `tests/integration/test_ui_routes.py::TestJobsListPage` (render, status single/multi, client filter, pagination, legacy fallback, header links) - [ ] Live smoke: `/ui/jobs` + `/ui/jobs?status=error` after deploy 🤖 Generated with [Claude Code](https://claude.com/claude-code)
goldstein added 1 commit 2026-04-18 20:28:31 +00:00
feat(ui): add /ui/jobs listing page with filters + pagination
All checks were successful
tests / test (push) Successful in 1m27s
tests / test (pull_request) Successful in 1m17s
673dc60178
* `JobsRepo.list_recent` — paginated, filterable view over ix_jobs,
  newest first, returning (jobs, total) so the template can render
  "Showing N of M".
* `GET /ui/jobs` — filter bar (multi status + client_id), prev/next
  pagination, links to `/ui/jobs/{id}` per row. Surfaces filename from
  `FileRef.display_name` with URL-basename fallback for legacy rows.
* Persistent nav header gets a "Recent jobs" link on both `/ui` and the
  per-job page so users can tab between submit and history.
* Integration tests cover: ordering, status/client filters (single +
  multi), pagination, legacy fallback, header links.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
goldstein merged commit 42a0086ba1 into main 2026-04-18 22:00:45 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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: goldstein/infoxtractor#47
No description provided.