Skip to content

Redesign detail views with type-specific rich field layouts #88

@mforce

Description

@mforce

Motivation

The current DetailView.tsx uses one shared component with three nearly identical inner functions. Each view shows the same boilerplate sections (info grid, acquisition, notes, condition) with minimal differentiation. The goal is dedicated, type-aware detail views that surface the fields that matter most for each medium.

Target layouts

Movies

Section Fields
Hero Cover art, title, original title
Release Theatrical release date, runtime, year
Credits Director, main cast (top 5)
Metadata Genre, studio, formats owned
Ratings Personal rating (★ /10), TMDB rating (if available)
Watching Watch status, watch count, last watched
Description Synopsis (from TMDB)
Tags Tag chips
Acquisition Date, price, source, condition

Games

Section Fields
Hero Cover art, title
Platform Platform badge, physical/digital + store
Release Release date, year
Credits Developer, publisher
Metadata Genre, age rating (PEGI/ESRB if available)
Personal Rating (★ /10), completion status, hours played, last played
Description Summary (from IGDB)
Tags Tag chips
Acquisition Date, price, source, condition

Music

Section Fields
Hero Cover art, title, artist
Release Release date, year, format (CD/vinyl/other)
Metadata Genre, label
Personal Rating (★ /10), listen count, last played
Description Synopsis/notes from MusicBrainz
Tags Tag chips
Acquisition Date, price, source, condition

New fields needed

Domain entities

Entity New field Type Source
Movie ReleaseDate DateOnly? TMDB release_date
Movie Cast string? (CSV or JSON) TMDB credits, top 5 actors
Movie ProviderRating float? (0–10) TMDB vote_average
Game ReleaseDate DateOnly? IGDB first_release_date (epoch → date)
Game AgeRating string? IGDB age ratings (e.g. "PEGI 16", "ESRB M")

Genres already exists on all three types. Studio, Director, Developer, Publisher, Label are already in the domain.

Provider-side changes

  • TMDB: Parse release_dateDateOnly, vote_averagefloat, credits.cast → top 5 actor names. Extend TmdbMovieDetail, TmdbMovieProvider, and MovieLookupResult.
  • IGDB: Parse first_release_date (unix timestamp) → DateOnly, age_ratings → display string. Extend IgdbGameDetail, IgdbGameProvider, and GameLookupResult.
  • MusicBrainz: Parse release dateDateOnly. Extend MusicBrainzAlbum, MusicBrainzProvider, and MusicLookupResult.

Frontend

  • Replace the single DetailView.tsx with three dedicated components: MovieDetail.tsx, MusicDetail.tsx, GameDetail.tsx
  • Each follows its own layout tailored to the medium
  • Reuse existing InfoRow, StatusPill, TagChip, CoverPreview primitives
  • Route still uses the same DetailView wrapper for header/back/edit

Out of scope

  • Full cast list with photos (just names for now)
  • Per-format rating aggregates (e.g. Metacritic)
  • Tracklists, discographies, game expansions
  • Backfill existing rows from provider data

Acceptance criteria

  • Movie detail view shows release date, director, cast, provider rating, genres, studio, formats
  • Game detail view shows platform, release date, developer, publisher, genre, age rating
  • Music detail view shows release date, format, genre, label
  • All three views show personal rating, description, tags, acquisition info
  • New fields persisted via metadata lookup when available
  • New fields available on manual edit forms
  • Migration adds new columns; existing rows show empty sections gracefully
  • Server and client tests pass

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions