Show a Collection's own movies list on its detail page - #75
Merged
Conversation
A BoxSet's detail page previously fell through to MovieDetailView, which has no listing of the collection's contents and rendered a Play/Resume row for an item that isn't itself playable. - CollectionDetailView: a dedicated layout for BoxSets — hero, metadata, tabs, the new movies list, then the "Included In"/"More Like This" rails. No Play/Resume row. - CollectionItemList: an ordered list of the collection's movies, oldest to newest by release date, mirroring ShowDetailView's SeasonEpisodeList (poster thumbnail with a direct-play button, title/year/duration/synopsis snippet that pushes into that movie's own detail page) but with no season picker. The text column is capped to the poster's own height via frame+clip regardless of title length, so a 2-line title never pushes the row taller than its own thumbnail. - AssetDetailViewModel: new `collectionItems`, fetched by ParentId (sorted by PremiereDate) alongside similar/collections in load(), and re-fetched at the end of refreshItem() so a movie played directly from the list picks up its watched/progress state once the player closes. - DetailTabsView: hides the "Cast & Crew" tab when an item has no cast/crew credits, and drops the segmented picker entirely when only "About" is left (the common case for a Collection) — applies to every detail page (movie/show/collection), not just collections. 419 tests, 0 failures. Verified live against a real server: Collection pages show their movies in release order with working direct-play and navigate-to-detail taps, and the tab picker correctly disappears/ reappears depending on what data an item actually has.
…-detail-item-grid # Conflicts: # TESTING.md
Same reasoning as this branch's TESTING.md conflict fix: a hand-copied test count only ever drifts out of date (this one still said 409, long stale) — CI runs and logs the real count on every push. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A Collection (BoxSet) detail page previously fell through to
MovieDetailView, which has no listing of the collection's contents and rendered a Play/Resume row for an item that isn't itself playable.CollectionDetailView— a dedicated layout for BoxSets: hero, metadata, tabs, the new movies list, then "Included In"/"More Like This". No Play/Resume row.CollectionItemList— an ordered list of the collection's movies, oldest to newest by release date. MirrorsShowDetailView'sSeasonEpisodeList(poster thumbnail with a direct-play button; title/year/duration/synopsis snippet that pushes into that movie's own detail page) but with no season picker. The text column is capped to the poster's own height (frame + clip) regardless of title length, so a 2-line title never makes the row taller than its own thumbnail.AssetDetailViewModel— newcollectionItems, fetched byParentId(sortedPremiereDateascending) alongsidesimilar/collectionsinload(), and re-fetched at the end ofrefreshItem()so a movie played directly from the list picks up its watched/progress state once the player closes.DetailTabsView— hides "Cast & Crew" when an item has no cast/crew credits, and drops the segmented picker entirely when only "About" is left (the common case for a Collection). Applies to every detail page (movie/show/collection), not just collections.Testing
xcodebuild test).Known issue, not addressed here
While testing this branch I hit a genuine SwiftUI freeze (~100% CPU, sustained) navigating from Home into a Show's detail page — a CPU sample shows it stuck in
AttributeGraph/StackLayoutrecursion inside aLazyHStackrail, the same signature as a previously-fixed bug class in this codebase (PosterCard/LandscapeMediaCard's requiredZStackwrapper around theirNavigationLink). That wrapper is present and unmodified by this branch, and a Movie detail page loaded fine in the same session, so I wasn't able to pin down a repro tied to this branch's changes before running out of time — flagging it rather than guessing at a fix. Worth a fresh look with a clean repro.🤖 Generated with Claude Code