fix: episode cards navigate to season detail + anchor (API SeasonId) (#220) #223

Closed
timothy wants to merge 0 commits from fix/220-episode-nav into main
Owner

Closes #220 (adversarial-reviewer#18 MUST-FIX gate for #91 phase b).

  • LibraryBrowseItemResponseModel gains optional SeasonId, populated at the single shared episode hydration site (LibraryBrowseItemMapper.GetEpisodes); OpenAPI + generated TS types regenerated.
  • mediaDetailPath: Episode → /app/media/seasons/{seasonId}#episode-{id} (Blazor Search.razor:241 parity); episode cards in Search, top-level episode browse, and season drill-in now navigate.
  • Season detail ChildGrid: stable episode-{id} anchors, hash-driven scroll-into-view + fade highlight.
  • Tests: 2 new handler tests (SeasonId populated/null), new mediaKinds + anchor/scroll web tests; 975 C# / 481 web green.
  • docs: blazor-route-parity row 118 (standalone episodes browse EXISTS) + Search cluster verdict corrected.

🤖 Generated with Claude Code

Closes #220 (adversarial-reviewer#18 MUST-FIX gate for #91 phase b). - `LibraryBrowseItemResponseModel` gains optional `SeasonId`, populated at the single shared episode hydration site (`LibraryBrowseItemMapper.GetEpisodes`); OpenAPI + generated TS types regenerated. - `mediaDetailPath`: Episode → `/app/media/seasons/{seasonId}#episode-{id}` (Blazor `Search.razor:241` parity); episode cards in Search, top-level episode browse, and season drill-in now navigate. - Season detail `ChildGrid`: stable `episode-{id}` anchors, hash-driven scroll-into-view + fade highlight. - Tests: 2 new handler tests (SeasonId populated/null), new mediaKinds + anchor/scroll web tests; 975 C# / 481 web green. - docs: blazor-route-parity row 118 (standalone episodes browse EXISTS) + Search cluster verdict corrected. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
timothy added 1 commit 2026-07-10 23:28:06 +02:00
fix: episode cards navigate to season detail + anchor (API SeasonId on browse items) (fixes #220)
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 8m23s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 13s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 10m31s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
7129d9c5b5
Episode cards in the SPA search and media-browse screens were inert (mediaDetailPath had no
Episode case, and LibraryBrowseItemResponseModel carried no parent-season id to route with).

- API: add nullable SeasonId to LibraryBrowseItemResponseModel; populate it in
  LibraryBrowseItemMapper.GetEpisodes (the single shared hydration site used by both the
  library-browse search/browse handler and the season episode drill-in), leave it null for
  every other kind. Regenerated v1.json + v1.d.ts per docs/api-conventions.md §5.
- SPA: mediaDetailPath now routes Episode items with a seasonId to
  /app/media/seasons/{seasonId}#episode-{id} (matching Blazor's Search.razor:241 link), null
  otherwise. MediaPosterCard accepts an id/highlighted pair; SeasonDetailScreen's episode grid
  gives each card a stable `episode-{id}` anchor and scrolls/highlights it on mount and on
  hashchange (deep-link support).
- Tests: GetLibraryBrowseItemsHandlerTests asserts SeasonId is populated for episode drill-in
  results and null for other kinds; web tests cover mediaDetailPath's episode cases and the
  anchor/scroll/highlight behavior (jsdom scrollIntoView stub).
- Docs: blazor-route-parity.md's episode-browse row and the Search cluster verdict updated —
  the standalone SPA episode browse exists and episode cards now navigate, closing the
  adversarial-reviewer#18 finding.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
timothy added 1 commit 2026-07-10 23:36:18 +02:00
fix(spa): episode anchor nav must handle in-app popstate + not re-scroll on refetch (#220 review)
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 7m30s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 11s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 9m53s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
5b945c308d
Adversarial review of #220 found in-grid episode card clicks never
scrolled/highlighted: navigateToPath() (routing.ts) does pushState +
a synthetic popstate, not a real hash change, so the anchor effect's
hashchange-only listener never fired for same-pathname navigation.
Now listens to both hashchange and popstate.

Also: track the last anchor value actually scrolled to so a
refetch/pagination that recreates the items array (anchor unchanged)
doesn't hijack scroll position; document the known CHILD_PAGE_SIZE
deep-link limitation (parity with the Blazor fragment link); and fix
the MediaPosterCard/shell.css comments that described the highlight
ring as "temporary" when only its glow pulse fades, not the ring
itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
timothy added 1 commit 2026-07-10 23:52:32 +02:00
docs(e2e): add local TV library seeding recipe (#220)
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 7m17s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Failing after 3s
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 11s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
0156077e18
Document the on-disk media + direct-SQLite LibraryPath + scan recipe for
E2E, since a local library is not API-seedable. Capture two gotchas hit
while verifying the episode-nav PR: deleting search-index/ leaves search
permanently empty (migration doesn't reindex from DB; rescan skips
unchanged files), and /api/search needs field/wildcard queries
(title:Alpha), not bare title words.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
timothy added 1 commit 2026-07-11 00:31:07 +02:00
Merge main: CI MySQL host-port unpin (collision fix)
Build ErsatzTV Image / Docs update reminder (pull_request) Successful in 12s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 10m2s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 10m8s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
6b9d76f948
Author
Owner

Merged to main via integration PR #239 (all six gate-batch branches integrated in one CI round after pairwise doc conflicts; this PR's commits are reachable from main — see the merge commits there). Closing manually since Gitea did not auto-detect the branch merge.

Merged to main via integration PR #239 (all six gate-batch branches integrated in one CI round after pairwise doc conflicts; this PR's commits are reachable from main — see the merge commits there). Closing manually since Gitea did not auto-detect the branch merge.
timothy closed this pull request 2026-07-11 11:37:50 +02:00

Pull request closed

This pull request cannot be reopened because the branch was deleted.
Sign in to join this conversation.