4.9 KiB
4.9 KiB
id, title, status, assignee, created_date, updated_date, labels, dependencies, references, documentation, priority, ordinal
| id | title | status | assignee | created_date | updated_date | labels | dependencies | references | documentation | priority | ordinal | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ML-142 | Improve scrobble UI in the Release component | Done | 2026-04-20 09:32 | 2026-04-22 13:27 |
|
|
|
medium | 1000 |
Description
The Release component's scrobble interface has several usability gaps that make scrobbling cumbersome, especially for multi-medium releases. This task improves the experience across three areas: custom scrobble time, button visual clarity, and per-medium scrobble access.
Acceptance Criteria
- #1 The release-sheet header renders a
Finished atdate/time picker that displays 'Now' when unset and an explicit time when set - #2 The release-sheet header renders a solid-primary
Scrobble releasebutton that scrobbles the whole release using the picker value orDateTime.utc_now()when unset - #3 The release-sheet header renders a
⋯overflow menu containingPrint tracklist, plusConnect Last.fmwhen the session key is missing - #4 The duplicate top-level
Tracksmaster checkbox shown on single-medium releases is removed - #5 Each medium header renders a soft-primary
Scrobble discbutton that is enabled regardless of cross-medium track selection - #6 Each medium header renders a
⋯overflow menu containingPrint tracklistfor that medium - #7 A sticky bar appears at the bottom of the sheet body whenever
MapSet.size(@selected_tracks) > 0, showing track count, medium count, aggregate duration, and aScrobble selectedbutton - #8 The sticky bar is not rendered when no tracks are selected
- #9
Scrobble selectedscrobbles only the ticked tracks using the picker value orDateTime.utc_now()when unset - #10 Clicking a per-medium
Scrobble discsubmits that medium regardless of selection elsewhere, using the picker value orDateTime.utc_now() - #11 The picker has a reset affordance that clears the value back to 'Now'
- #12 Disabled scrobble buttons are visibly distinct from enabled ones in both light and dark mode (verified in browser)
- #13 On viewports ≤ 380px the header reflows: title row above a second row containing the picker (flex-1) and the
Scrobble releasebutton; per-medium scrobble collapses to icon-only; sticky bar stays legible - #14
ScrobbleLive.Showper-medium scrobble handler works with tracks selected (regression test) - #15 All new user-facing strings wrapped in gettext;
.pot/.pofiles regenerated viamix gettext.extract --merge - #16 New LiveComponent tests cover: default picker state, picker value propagating to all three scrobble handlers, sticky-bar rendering, and medium-button enabled-with-selection
Implementation Notes
Implementation complete 2026-04-22.
Changes:
lib/music_library_web/components/release.ex— header restructure (title + subtitle + picker + solidScrobble release+ ⋯ dropdown),.medium/1updated (removed selection-blocks-medium disable, label visible, print moved to ⋯ dropdown), new.selection_bar/1function component + privateselected_tracks_summary/2helper,finished_atwired into the form viaparse_finished_at/1, newclear_finished_atevent handler, and all three scrobble handlers now resolvesocket.assigns.finished_at || DateTime.utc_now()at call time.test/music_library_web/live/collection_live/show_test.exs— updated assertion from "Connect your Last.fm account" to new "Connect Last.fm" link label.test/music_library_web/live/scrobble_live/show_test.exs— regression test added: medium scrobble works with a cross-medium track selected.test/music_library_web/components/release_test.exs— new file, 10 integration tests throughCollectionLive.Showcovering picker defaults, picker → handler arg propagation, reset-to-now, sticky bar render, cross-medium copy, and scrobble-selected using the picker value.priv/gettext/default.pot+priv/gettext/en/LC_MESSAGES/default.po— regenerated viamix gettext.extract --merge.
Verification:
mise run dev:precommit— all green (credo, sobelow, formatting, translations, 823 tests passing).- Browser-verified at :4003: desktop 1440px (4-disc release showed new header, per-medium buttons, sticky bar with cross-medium count), mobile 360px (header stacks to title + picker + Release button, medium scrobble collapses to icon-only), picker open/select/reset cycle worked, overflow menus rendered Print tracklist.
grep -n "MapSet.size(@selected_tracks) > 0" lib/music_library_web/components/release.exreturns only the sticky-bar visibility guard, as planned.