Web: lists load as you scroll, Liked tabs, missing files greyed and kept out of the queue #154

Merged
bvandeusen merged 4 commits from dev into main 2026-10-08 20:08:05 -04:00
Owner

Three web fixes from dev.

  • #5416: every paged list loads as you scroll.
    • There are no more "Load more" buttons.
    • A shared ListContinuation shows "Loading more…", and if a page fails, an inline error with Try again.
    • Liked becomes tabs (Artists | Albums | Tracks) via a new TabStrip.
    • Admin Playback errors and Requests use TabStrip too.
    • A failed later page no longer wipes the list. This covers the TanStack isFetchNextPageError scoping and Genres/Years.
  • #5417: admin error lines use text-error-fg. They used text-oxblood, which isn't in the theme, so they rendered uncoloured.
  • #5418: TrackRef gains unavailable, which the server already sends.
    • Album, search and Liked rows grey out a missing file with "· File missing" and hide its actions.
    • Every player-store entry point keeps missing files out of the queue: play, enqueue, play next, bulk, and a refetched mix.

Commits: 0f9ddbca, 015fe1d3, 8bd2f664, bf0bc45c. dev run 8867 is green.

🤖 Generated with Claude Code

Three web fixes from dev. - **#5416: every paged list loads as you scroll.** - There are no more "Load more" buttons. - A shared `ListContinuation` shows "Loading more…", and if a page fails, an inline error with Try again. - Liked becomes tabs (Artists | Albums | Tracks) via a new `TabStrip`. - Admin Playback errors and Requests use `TabStrip` too. - A failed later page no longer wipes the list. This covers the TanStack `isFetchNextPageError` scoping and Genres/Years. - **#5417:** admin error lines use `text-error-fg`. They used `text-oxblood`, which isn't in the theme, so they rendered uncoloured. - **#5418:** `TrackRef` gains `unavailable`, which the server already sends. - Album, search and Liked rows grey out a missing file with "· File missing" and hide its actions. - Every player-store entry point keeps missing files out of the queue: play, enqueue, play next, bulk, and a refetched mix. Commits: 0f9ddbca, 015fe1d3, 8bd2f664, bf0bc45c. dev run 8867 is green. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 4 commits 2026-10-08 20:08:01 -04:00
feat(web): every paged list loads as you scroll; Liked becomes tabs (#5416)
release / go (push) Successful in 1m53s
release / govulncheck (push) Successful in 49s
release / web (push) Successful in 1m50s
release / android (push) Successful in 6m44s
release / Build signed APK (releases and dev) (push) Successful in 6m30s
release / Attach APK to the Release (tag releases only) (push) Canceled after 0s
release / Build + push container image (push) Canceled after 0s
release / Verify release artifacts (tag releases only) (push) Canceled after 0s
release / integration (push) Canceled after 21m41s
0f9ddbca97
Preference 172: no "Load more" buttons. Eight remained, on Liked (three
sections), the three Search overflow pages, Genres and Years.

- ListContinuation: the one bottom-of-list block. It loads the next page
  ahead of the reader, announces "Loading more…" through aria-live, shows an
  optional end line, and on a failed page shows the error with Try again,
  dropping the sentinel so a dead endpoint isn't re-hit on every scroll.
  Used on all ten paged lists, including the four that already autoloaded.
- A failed next page no longer replaces the list. TanStack sets isError for
  it, so the page-level error branches now apply only to a failed first
  load. Genres and Years did the same with their own loader; a later
  page's failure now keeps the grid.
- Liked: Artists | Albums | Tracks tabs (operator's choice). Stacked, a
  long Artists list loading as you scroll would bury the other two. It
  opens on the first tab that has likes.
- TabStrip: the in-page tab strip, now shared by Liked, Playback errors
  and Requests.
- test-utils/intersectionObserver: a stand-in so tests can scroll to the end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(web): admin error lines use text-error-fg, not the untokened text-oxblood (#5417)
release / govulncheck (push) Successful in 36s
release / web (push) Successful in 1m42s
release / go (push) Successful in 1m52s
release / integration (push) Successful in 5m7s
release / android (push) Successful in 5m48s
release / Build signed APK (releases and dev) (push) Successful in 5m22s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 1m28s
release / Verify release artifacts (tag releases only) (push) Skipped
015fe1d3b2
text-oxblood is not a theme token, so Tailwind emits nothing and the scan
error on Admin → Overview and "It stopped early" on Duplicates rendered as
body text. Same fix as the album page in #5392; no uses remain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(web): missing files show greyed in track lists and never enter the queue (#5418)
release / web (push) Failing after 1m23s
release / govulncheck (push) Successful in 25s
release / go (push) Successful in 1m35s
release / Attach APK to the Release (tag releases only) (push) Canceled after 0s
release / Build + push container image (push) Canceled after 0s
release / Verify release artifacts (tag releases only) (push) Canceled after 0s
release / integration (push) Canceled after 4m34s
release / android (push) Canceled after 4m39s
release / Build signed APK (releases and dev) (push) Canceled after 3m21s
8bd2f66416
TrackRef gains the unavailable flag the server already sends on album
detail and search. TrackRow greys such a row with '· File missing' and
hides like, radio, add and the menu, as playlist rows already do. Every
player-store entry point (playQueue, enqueue, play next, and a refetched
mix) drops missing files; playQueue keeps the chosen track as the start.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(web): filter a refetched mix inside the self-heal step, not by wrapping the closure (#5418)
release / govulncheck (push) Successful in 21s
release / web (push) Successful in 1m31s
release / go (push) Successful in 1m42s
release / android (push) Successful in 5m9s
release / Build signed APK (releases and dev) (push) Successful in 5m16s
release / integration (push) Successful in 17m42s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 22s
release / Verify release artifacts (tag releases only) (push) Skipped
bf0bc45c4b
The wrapper added a promise hop, so the self-heal test's single
microtask wait saw 'loading' instead of 'error'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bvandeusen merged commit 05bc85f2b8 into main 2026-10-08 20:08:05 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/minstrel#154