Skip to content

impl(web): add /series/<id> page for viewing a media series#68

Draft
andykais-claude wants to merge 1 commit into
mainfrom
cursor/series-view-page-1fd2
Draft

impl(web): add /series/<id> page for viewing a media series#68
andykais-claude wants to merge 1 commit into
mainfrom
cursor/series-view-page-1fd2

Conversation

@andykais-claude

Copy link
Copy Markdown
Collaborator

Summary

Adds a new /series/<series_id> page to @forager/web for viewing the contents of a media series. The new page mirrors the /browse layout (Header with filters, Sidebar with details, Footer with view controls, MediaList/MediaView in the main area) but drives its results from forager.series.search scoped to the given series_id.

Differences from /browse

  • Each media tile displays its series_index underneath (#0, #1, …) so you can see what "page" of the series it corresponds to.
  • The sort dropdown defaults to Series Index and includes series_index alongside the standard sort options. The group_by-only Count option is excluded.
  • Default order is ascending.
  • The search mode / group-by controls are omitted since they don't apply inside a series.

Cross-linking from /browse

Every media-series tile on /browse now renders a View series link under the tile that navigates to /series/<id>.

Shared components

Per the task requirements, components are shared rather than imported across routes:

  • Moved Footer, SearchParams, SearchResults, MediaList, MediaView, MediaDetails, MediaDetailEntry, and SearchLink from routes/browse/components/ into $lib/components/browse_like/.
  • Moved dimensions and media_selections runes from routes/browse/runes/ into $lib/runes/.
  • Introduced a BrowseLikeController base class in $lib/base_controller.ts with a BrowseLikeQueryParams contract so both routes can drive the shared components uniformly.
  • SearchParams accepts sort_options and extra_filters snippets so each route can contribute its own sort options and route-specific filter controls without importing across routes.
  • SearchResults / MediaList accept show_series_index and show_series_link props to toggle the per-tile labels.
  • Widened MediaListRune to accept a new 'series_search' paginate input backed by forager.series.search.

Walkthrough

series_view_walkthrough.mp4

Walkthrough of /browse → click View series → arrive at /series/6 with #0/#1/#2 labels → open the sort dropdown showing Series Index → click a tile to open the details sidebar → return to /browse.

Browse page showing the new View series links

Browse page with the new "View series" links underneath each media-series tile.

Series page showing #0, #1, #2 series_index labels

Series detail page showing #0, #1, #2 labels under each tile.

Sort dropdown with Series Index as the default option

Sort dropdown with Series Index as the default option (and no Count option).

Sidebar details for a selected series tile

Sidebar details appear as on /browse when a tile is clicked.

Testing

  • Built the web package with deno task --cwd packages/web build (succeeds).
  • Seeded a local forager DB with a few media files and two series (/series/6 = "Cat Series" with 3 items, /series/7 = "Mixed Series" with 2 items).
  • Ran deno task --cwd packages/cli develop --config=... gui and manually walked through /browse/series/6 in Chrome, verifying: the View series link navigates correctly, series tiles display with their series_index, the sort dropdown shows Series Index as the default and re-orders correctly on change, the sidebar opens with details when a tile is clicked, and the browser back/forward continues to work. See the walkthrough video and screenshots above.
  • Ran deno run -A npm:svelte-check. My change results in fewer type errors than main (133 vs. 190) because consolidating the duplicated code removed a number of small pre-existing mismatches; no new errors are introduced by this PR.

Notes

  • No existing routes import components from another route — the split is strictly routes/*$lib/*.
  • The pre-existing hard-to-see filter toggle icon is out of scope for this PR.

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

Moves the media browsing UI components (MediaList, MediaDetails,
MediaView, Footer, SearchParams, SearchResults, SearchLink,
MediaDetailEntry) and their supporting runes (dimensions,
media_selections) out of the route-local browse folder into
$lib/components/browse_like and $lib/runes so they can be reused
by the upcoming /series/<series_id> route. Introduces a
BrowseLikeController base with a BrowseLikeQueryParams contract
that shared components rely on. Widens MediaListRune to accept a
new 'series_search' paginate type.

Co-authored-by: andykais-claude <andykais-claude@users.noreply.github.com>
@andykais andykais changed the title impl(web): add /series/&lt;id&gt; page for viewing a media series impl(web): add /series/<id> page for viewing a media series Jul 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants