Play all / Shuffle all on every page that lists tracks — the Tracks tab, genre details, artist details, and both playlist views — driven by one shared helper that owns the shuffle-mode semantics, with each host passing an honest queue Source (#14).
What changed and why
frontend/src/utils/play-all.ts (new) — the one place that owns "shuffle this collection". Load-bearing: SetQueue's shuffleStart only picks a random first track when shuffle mode is already on — it does not turn it on — so the helper toggles the mode before setting the queue.
track-list.ts — the pair as PageActions in the page header, queuing the displayed list (cachedSortedTracks) with effectiveQueueSource. One edit covers Tracks and genre-details (which embeds track-list).
artist-details.ts — the pair; paths from GetFilePathsByAlbums flattened in album order; source {type:'artist', …}. Plus a phone-width wrap (@media 599px) and an inline-failure notice.
playlist-details.ts — Shuffle all added beside Play all. Behaviour delta: Play all's shuffleStart: true is dropped — with shuffle already on it now starts at the first row, the album page's semantics.
smart-playlist-details.ts — fixes a live bug: its Shuffle was a no-op (shuffleStart without enabling mode played track 1 in order).
explore-album-details.ts — playOwned re-routed through the helper (pure refactor, identical behaviour).
e2e/specs/playback.spec.ts — exact: true on its Shuffle locator (would resolve to 2 elements once "Shuffle all" exists).
Verification run
Tier
Result
make ui-test
1147 passed (incl. a case that fails when the smart-playlist fix is reverted)
npx tsc --noEmit
clean
make e2e
255 passed (incl. 4 new play-all specs, the new Tracks header-fit case, the fixed playback spec)
screenshots
artist header read at 424×439 / 320×600 / 900 — name visible, both buttons reachable, pair wraps below the title on a phone
make lint / make test
0 issues × 3 configs / all 3 passes
make bindings-check / make css-check
current / clean
Deliberately not done
Page-level pairs on the card grids; per-card menu shuffleStart sites (honour-current-mode, unchanged). ui-visual/perf/generate/Android tiers not demanded (no baselines touched, no Go/schema change, Platform/Desktop).
## What this is
Play all / Shuffle all on every page that lists tracks — the Tracks tab, genre details, artist details, and both playlist views — driven by one shared helper that owns the shuffle-mode semantics, with each host passing an honest queue `Source` (#14).
## What changed and why
- `frontend/src/utils/play-all.ts` (new) — the one place that owns "shuffle this collection". Load-bearing: `SetQueue`'s `shuffleStart` only picks a random first track when shuffle mode is *already* on — it does not turn it on — so the helper toggles the mode **before** setting the queue.
- `track-list.ts` — the pair as `PageAction`s in the page header, queuing the displayed list (`cachedSortedTracks`) with `effectiveQueueSource`. One edit covers Tracks and genre-details (which embeds track-list).
- `artist-details.ts` — the pair; paths from `GetFilePathsByAlbums` flattened in album order; source `{type:'artist', …}`. Plus a phone-width wrap (`@media 599px`) and an inline-failure notice.
- `playlist-details.ts` — Shuffle all added beside Play all. **Behaviour delta:** Play all's `shuffleStart: true` is dropped — with shuffle already on it now starts at the first row, the album page's semantics.
- `smart-playlist-details.ts` — **fixes a live bug**: its Shuffle was a no-op (shuffleStart without enabling mode played track 1 in order).
- `explore-album-details.ts` — `playOwned` re-routed through the helper (pure refactor, identical behaviour).
- `e2e/specs/playback.spec.ts` — `exact: true` on its Shuffle locator (would resolve to 2 elements once "Shuffle all" exists).
## Verification run
| Tier | Result |
|---|---|
| `make ui-test` | 1147 passed (incl. a case that fails when the smart-playlist fix is reverted) |
| `npx tsc --noEmit` | clean |
| `make e2e` | 255 passed (incl. 4 new play-all specs, the new Tracks header-fit case, the fixed playback spec) |
| screenshots | artist header read at 424×439 / 320×600 / 900 — name visible, both buttons reachable, pair wraps below the title on a phone |
| `make lint` / `make test` | 0 issues × 3 configs / all 3 passes |
| `make bindings-check` / `make css-check` | current / clean |
## Deliberately not done
Page-level pairs on the card grids; per-card menu `shuffleStart` sites (honour-current-mode, unchanged). `ui-visual`/`perf`/`generate`/Android tiers not demanded (no baselines touched, no Go/schema change, Platform/Desktop).
Closes #31
Four pages that list tracks — Tracks, genre, artist, and both playlist
views — had no way to start the whole list, or had a broken one. One
shared helper (utils/play-all.ts) now owns what "shuffle this
collection" means: SetQueue's shuffleStart only picks a random first
track when shuffle mode is already on, it does not turn it on, so the
mode is toggled before the queue is set. Each host passes an honest
queue Source (#14): anything that builds a queue names what it built it
from, so "Playing from" stops lying.
Two behaviour changes ride along, both flagged: smart-playlist-details'
Shuffle was a live no-op (shuffleStart without enabling mode played
track 1 in order) and is fixed; playlist-details' Play all drops its
shuffleStart:true, so with shuffle mode already on it now starts at the
first row instead of a random one — the album page's existing
semantics.
Verified: make ui-test (1147, incl. a case that fails when the
smart-playlist fix is reverted), npx tsc --noEmit, make e2e (255,
incl. new play-all and header-fit specs), make lint, make test,
make bindings-check, make css-check; artist header read from
screenshots at 424/320/900 (the pair wraps below the name on a phone).
Closes#31
logan
merged commit ca00f8a803 into main2026-09-04 02:48:28 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What this is
Play all / Shuffle all on every page that lists tracks — the Tracks tab, genre details, artist details, and both playlist views — driven by one shared helper that owns the shuffle-mode semantics, with each host passing an honest queue
Source(#14).What changed and why
frontend/src/utils/play-all.ts(new) — the one place that owns "shuffle this collection". Load-bearing:SetQueue'sshuffleStartonly picks a random first track when shuffle mode is already on — it does not turn it on — so the helper toggles the mode before setting the queue.track-list.ts— the pair asPageActions in the page header, queuing the displayed list (cachedSortedTracks) witheffectiveQueueSource. One edit covers Tracks and genre-details (which embeds track-list).artist-details.ts— the pair; paths fromGetFilePathsByAlbumsflattened in album order; source{type:'artist', …}. Plus a phone-width wrap (@media 599px) and an inline-failure notice.playlist-details.ts— Shuffle all added beside Play all. Behaviour delta: Play all'sshuffleStart: trueis dropped — with shuffle already on it now starts at the first row, the album page's semantics.smart-playlist-details.ts— fixes a live bug: its Shuffle was a no-op (shuffleStart without enabling mode played track 1 in order).explore-album-details.ts—playOwnedre-routed through the helper (pure refactor, identical behaviour).e2e/specs/playback.spec.ts—exact: trueon its Shuffle locator (would resolve to 2 elements once "Shuffle all" exists).Verification run
make ui-testnpx tsc --noEmitmake e2emake lint/make testmake bindings-check/make css-checkDeliberately not done
Page-level pairs on the card grids; per-card menu
shuffleStartsites (honour-current-mode, unchanged).ui-visual/perf/generate/Android tiers not demanded (no baselines touched, no Go/schema change, Platform/Desktop).Closes #31