Series list page: eight hygiene filters, Site and Library narrowing, paging #142
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
The owner gets a filterable, bookmarkable list of every Series across every Reader's library at once, so broken rows can be found without asking about one Reader at a time. Filter state lives in the query string -- filter, Site, Library, page -- so "the Series with no cover" is a bookmark to come back to, not a click path to repeat.
Eight named hygiene filters, one at a time, each labelled as the repair it needs: no series URL, never read a chapter, no Readers, never checked, not checked in the window, no cover, latest from a Reader's report, all Series. On top of a hygiene filter the owner can narrow by Site and by Library without losing the filter. The filter control is a select whose option labels carry their counts, not a row of eight plain links -- eight hygiene labels do not read as a chip row. Site is a second select; Library is a three-way segmented row marked active in patina.
The heading states the count and the filter, so the number the landing page promised and the number the list shows come from one query. An empty filtered list names the filter it is empty for, so an empty hygiene list reads as good news rather than as a broken page. Paging is 50 rows with a stable order; asking for a page past the end re-reads at page 1 rather than showing an empty table.
Rows are the two-line form: a subgrid row with the title on its own full-width line and the facts on the line under it, so a long title never breaks column rhythm. Separation is banding rather than hairlines, so a title and its facts read as one record -- and banding is a class, not an nth-of-type, because the confirm rows later tickets add are row siblings and would throw the alternation off. Notes chips cap at two plus a faint tail rather than stacking.
Nothing new on the frontend. The vendored htmx already carries every primitive this needs, and URL-addressable filters are the same pushed-URL pattern the reading tabs already prove. The existing client-side filter script is not reusable: it is a pure title filter over an already-rendered list, it issues no requests, it changes no URL, and it is not loaded on admin at all -- and client-side filter state cannot be bookmarkable without hand-written history calls, which is exactly what these routes must avoid. So filtering is server-side. Delete branch
research/htmx-series-listonce this lands.Acceptance criteria
research/htmx-series-listis deletedgo test ./...greenBlocked by
Merged into
spec-134asbf08d6e(branchticket/142-series-list, commitse8a3c5f,134c930).Series list ships with the eight hygiene filters over the landed
store.SeriesFilter*vocabulary, Site and Library narrowing, stable paging offSeriesPage.Total, and the two-line banded.tbl.seriesrow.ownerWindow(12h) declared once ininternal/web/admin.go;latest.SiteNames()added for the Site select. Site colour lands as asite-*class rather than an inlinestyleattribute —siteis client-supplied and unvalidated, and a class attribute is not a CSS context.Review: spec axis found one blocker (stale-count cutoff) plus two minors, all fixed; standards axis clean.
Two orchestrator notes:
research/htmx-series-listwas left to me and is done at merge time.newRouter; #145 deleted that parameter in the same wave, so I dropped the argument during the merge. Suite green after.go test ./...green on the merged base.