Per-Series detail page, keyed by the composite the rest of the system uses #144
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent
Spec #134.
What to build
A page per Series whose address is derivable from a row the owner is already looking at, so a Series in the list is one hop from its own page. The key is the composite site-and-series-id in one path segment, matching the shape the wire and the store read already use -- a surrogate id would need a column and a migration to save nothing, the colon is legal unescaped in a path segment, and no observed series id carries a slash.
The page holds: a back ghost, a 28px display title, a mono key line carrying the key, the Site and the Library, a 160px hatched cover, and an uppercase mono meta row carrying the marks (pending, sighting-raised, no cover, unpollable, orphan). Then a two-column grid reserved for the intervention forms later tickets add, so those tickets add a form rather than reshaping the page.
Everything shown is a Series-level fact plus an anonymous Reader count. The owner never learns which Reader reads what, and never sees a Reader's progress -- the boundary is enforced by the shape of the type the store returns, not by this template happening not to print a field.
The only entry point into admin stays the owner-gated link in the application chrome. No per-Series admin link from the library cards: that is a second gated branch in the reading templates for a hop the Series list already provides.
Acceptance criteria
go test ./...greenBlocked by
Merged into
spec-134asf5b52e4(branchticket/144-series-detail, commits14990bd,09a094c).Per-Series detail page at
GET /admin/series/{key}, rendering every fact the admin read model holds plus the anonymous Reader count, 404 on an unknown key. The intervention grid ships empty by design — #146 fills it.One brief correction worth recording: the brief said the detail page should reuse
Page: "series", which cannot work, since a single{{if eq .Page}}chain takes the first matching branch and the Series list already owns that value. Resolved with a distinctseries-detailpage value and the Series nav link widened to(or (eq .Page "series") (eq .Page "series-detail")), so the tab still underlines. Agreed live with the #142 implementer before either landed.Known shortcut, marked in-tree with a
ponytail:comment: the detail row is found by walking the Site-narrowed pages ofSeriesPagerather than by a keyed read, because adding a store method here would have collided with #146's edits to the same package. Upgrade path is a keyed read alongsideSeriesPagewhen the library outgrows it.Review: spec axis one Important (page-1-only lookup, fixed with a regression test) and two Minors; standards axis clean.
go test ./...green on the merged base.