From e3d492e1303b282b1dfaa2dd930f9b3ce8af03d8 Mon Sep 17 00:00:00 2001 From: Caleb Allen Date: Mon, 17 Aug 2026 22:10:23 -0400 Subject: [PATCH] fix(downloads): call a request a request, and mark it with a bookmark The feature was renamed to requests and the copy was not. The badge on every Explore card and track row still offered "Want track X", the album page's button read "Want this" / "Wanted", the artist page's release menu said "Want This", and the Downloads empty state told the user to look for a control by a name nothing rendered. The `queued` badge is a bookmark rather than an hourglass. An hourglass says "wait, this is under way", which overstates what a request is: nothing may be downloading, nothing may ever be found, and the list is somewhere a user can leave one indefinitely. A bookmark says the honest thing -- it is on your list -- and reads as the opposite of the plus that put it there, which is what a toggle's two states have to do. The backend's `'wanted'` request state is deliberately untouched: it is a stored enum, not copy. Also removes a dead duplicate branch in the badge's `render()`. The first `if (this.actionable)` returned before the ring was built, so a partly-held album that could still be requested drew a plus instead of its progress arc. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01MeQt5hgXg5YGoNZQ9ozG7L --- e2e/specs/requested-badge.spec.ts | 4 +-- .../downloads-view/downloads-view.ts | 2 +- .../explore-album-details.ts | 2 +- .../explore-artist-details.ts | 2 +- .../library-status-indicator.ts | 36 ++++++++----------- .../components/artist-release-menu.test.ts | 6 ++-- frontend/test/components/chrome.test.ts | 2 +- .../test/components/library-status.test.ts | 2 +- 8 files changed, 24 insertions(+), 32 deletions(-) diff --git a/e2e/specs/requested-badge.spec.ts b/e2e/specs/requested-badge.spec.ts index 3d3520d..2d3a3de 100644 --- a/e2e/specs/requested-badge.spec.ts +++ b/e2e/specs/requested-badge.spec.ts @@ -7,7 +7,7 @@ import { test, expect, callBinding } from '../support/fixtures.js'; * and produced two: every one of the eight call sites was a two-way * ternary, so an album already on the request list showed a plus and * said "is not in your library" — on the same page, forty pixels from a - * filled button reading "Wanted". + * filled button reading "Requested". * * This spec exists at this tier rather than only in the component one * because of what it drags in with it: reaching the requested state is @@ -181,7 +181,7 @@ test.describe('the requested badge', () => { const ds = document.querySelector('explore-album-details') ?.shadowRoot; const btn = [...(ds?.querySelectorAll('wa-button') ?? [])].find( - (b) => /Wanted/.test(b.textContent ?? ''), + (b) => /Requested/.test(b.textContent ?? ''), ); return btn?.querySelector('wa-icon')?.getAttribute('name') ?? ''; diff --git a/frontend/src/components/downloads-view/downloads-view.ts b/frontend/src/components/downloads-view/downloads-view.ts index d774ab0..8047e34 100644 --- a/frontend/src/components/downloads-view/downloads-view.ts +++ b/frontend/src/components/downloads-view/downloads-view.ts @@ -400,7 +400,7 @@ export class DownloadsView extends ViewLifecycleMixin(LitElement) { private renderEmptyRequests() { return html`
- Nothing requested yet. Use “Want this” on an album or artist + Nothing requested yet. Use “Request this” on an album or artist to add it here.
`; diff --git a/frontend/src/components/explore-album-details/explore-album-details.ts b/frontend/src/components/explore-album-details/explore-album-details.ts index 41abd21..45a02d5 100644 --- a/frontend/src/components/explore-album-details/explore-album-details.ts +++ b/frontend/src/components/explore-album-details/explore-album-details.ts @@ -2680,7 +2680,7 @@ export class ExploreAlbumDetails extends LitElement implements ContextMenuHost { slot="start" name=${this.isRequested ? 'solid/bookmark' : 'regular/bookmark'} > - ${this.isRequested ? 'Wanted' : 'Want this'} + ${this.isRequested ? 'Requested' : 'Request this'} `; } diff --git a/frontend/src/components/explore-artist-details/explore-artist-details.ts b/frontend/src/components/explore-artist-details/explore-artist-details.ts index eafb75f..c18ca92 100644 --- a/frontend/src/components/explore-artist-details/explore-artist-details.ts +++ b/frontend/src/components/explore-artist-details/explore-artist-details.ts @@ -2753,7 +2753,7 @@ export class ExploreArtistDetails extends LitElement implements ContextMenuHost slot="icon" name=${requested ? 'xmark' : 'bookmark'} > - ${requested ? 'Cancel Request' : 'Want This'} + ${requested ? 'Cancel Request' : 'Request This'} ` : nothing} diff --git a/frontend/src/components/library-status-indicator/library-status-indicator.ts b/frontend/src/components/library-status-indicator/library-status-indicator.ts index b576c65..93281a4 100644 --- a/frontend/src/components/library-status-indicator/library-status-indicator.ts +++ b/frontend/src/components/library-status-indicator/library-status-indicator.ts @@ -48,7 +48,7 @@ export type LibraryStatus = * * Colours and glyphs: * - in-library → green circle, check mark - * - queued → amber circle, hourglass + * - queued → amber circle, bookmark ("on your list") * - not-in-library → grey circle, plus sign * * Usage: @@ -241,12 +241,23 @@ export class LibraryStatusIndicator extends LitElement { } `; + /** + * The glyph for each state. + * + * `queued` is a **bookmark**, not the hourglass it used to be. An + * hourglass says "wait, this is under way", which overstates what a + * request is: nothing may be downloading, nothing may ever be found, + * and the user can leave one sitting on the list indefinitely. A + * bookmark says the honest thing — it is on your list — and reads as + * the opposite of the plus that put it there, which is what a + * toggle's two states have to do. + */ private iconName(): string { switch (this.status) { case 'in-library': return 'check'; case 'queued': - return 'hourglass-half'; + return 'bookmark'; default: return 'plus'; } @@ -276,7 +287,7 @@ export class LibraryStatusIndicator extends LitElement { if (this.actionable) { return this.status === 'queued' ? `Cancel the request for ${kind}${name}` - : `Want ${kind}${name}`; + : `Request ${kind}${name}`; } switch (this.status) { @@ -354,25 +365,6 @@ export class LibraryStatusIndicator extends LitElement { } const title = this.tooltip(); - const icon = this.iconName() - ? html`` - : nothing; - - if (this.actionable) { - return html` - - `; - } // The ring stands in for the icon wherever the icon would go — // including inside the button, because a partly-held album is diff --git a/frontend/test/components/artist-release-menu.test.ts b/frontend/test/components/artist-release-menu.test.ts index 9829a9e..cb5ed00 100644 --- a/frontend/test/components/artist-release-menu.test.ts +++ b/frontend/test/components/artist-release-menu.test.ts @@ -120,7 +120,7 @@ describe('the context menu on an artist page release', () => { expect(items).toContain('Add to Queue'); expect(items).toContain('Play Next'); // Owned: there is nothing left to ask for. - expect(items).not.toContain('Want This'); + expect(items).not.toContain('Request This'); }); it('offers a request, and no playback, for a release nobody owns', async () => { @@ -132,7 +132,7 @@ describe('the context menu on an artist page release', () => { expect(items).not.toContain('Play'); expect(items).not.toContain('Add to Queue'); - expect(items).toContain('Want This'); + expect(items).toContain('Request This'); expect(items).toContain('View on MusicBrainz'); }); @@ -148,7 +148,7 @@ describe('the context menu on an artist page release', () => { // …but a `local:` id names nothing upstream, and wanting something // already in the library is not a thing to offer. expect(items).not.toContain('View on MusicBrainz'); - expect(items).not.toContain('Want This'); + expect(items).not.toContain('Request This'); }); it('opens from the keyboard on Shift+F10', async () => { diff --git a/frontend/test/components/chrome.test.ts b/frontend/test/components/chrome.test.ts index 6a8dec5..4d11c12 100644 --- a/frontend/test/components/chrome.test.ts +++ b/frontend/test/components/chrome.test.ts @@ -166,7 +166,7 @@ describe('', () => { glyphs.push(shadow(el, 'wa-icon')?.getAttribute('name')); } - expect(glyphs).toEqual(['check', 'hourglass-half', 'plus']); + expect(glyphs).toEqual(['check', 'bookmark', 'plus']); }); it('phrases its label around the entity it describes', async () => { diff --git a/frontend/test/components/library-status.test.ts b/frontend/test/components/library-status.test.ts index 317b2e1..6945552 100644 --- a/frontend/test/components/library-status.test.ts +++ b/frontend/test/components/library-status.test.ts @@ -249,7 +249,7 @@ describe(' as a control', () => { const el = await badge({ requestMbid: 'rg-1' }); expect(shadow(el, '.badge')?.getAttribute('aria-label')).toBe( - 'Want album "Abbey Road"', + 'Request album "Abbey Road"', ); await update(el, { status: 'queued' });