From 8db324d74ac0cb454bae2a16b95620a9effd8fc7 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Tue, 14 Apr 2026 16:50:40 +0100 Subject: [PATCH] Extract shared badge/dropdown to ScrobbleComponents --- .../components/scrobble_components.ex | 19 +++--- .../live/stats_live/top_albums.ex | 65 ++----------------- priv/gettext/default.pot | 2 - priv/gettext/en/LC_MESSAGES/default.po | 2 - 4 files changed, 13 insertions(+), 75 deletions(-) diff --git a/lib/music_library_web/components/scrobble_components.ex b/lib/music_library_web/components/scrobble_components.ex index 3b040af8..40583bb1 100644 --- a/lib/music_library_web/components/scrobble_components.ex +++ b/lib/music_library_web/components/scrobble_components.ex @@ -1,6 +1,7 @@ defmodule MusicLibraryWeb.ScrobbleComponents do @moduledoc """ - Universal search modal and related components. + Scrobble activity display components: status badges, import dropdowns, + metadata tooltips, and record-matching UI. """ alias LastFm.Track @@ -153,7 +154,7 @@ defmodule MusicLibraryWeb.ScrobbleComponents do attr :record, :map, required: true - defp record_dropdown_link(assigns) do + def record_dropdown_link(assigns) do path = if assigns.record.purchased_at, do: ~p"/collection/#{assigns.record.id}", @@ -171,9 +172,7 @@ defmodule MusicLibraryWeb.ScrobbleComponents do {gettext("W")} - {format_label(String.to_existing_atom(@record.format))} · {type_label( - String.to_existing_atom(@record.type) - )} + {format_label(@record.format)} · {type_label(@record.type)} · {Records.Record.format_as_date(@record.purchased_at)} @@ -183,9 +182,9 @@ defmodule MusicLibraryWeb.ScrobbleComponents do """ end - defp badge_status([]), do: nil + def badge_status([]), do: nil - defp badge_status(records) do + def badge_status(records) do all_collected = Enum.all?(records, & &1.purchased_at) all_wishlisted = Enum.all?(records, &is_nil(&1.purchased_at)) @@ -196,15 +195,15 @@ defmodule MusicLibraryWeb.ScrobbleComponents do end end - defp badge_classes(:collected), + def badge_classes(:collected), do: "bg-emerald-50 text-emerald-700 ring-1 ring-emerald-600/20 dark:bg-emerald-400/10 dark:text-emerald-400 dark:ring-emerald-400/20" - defp badge_classes(:wishlisted), + def badge_classes(:wishlisted), do: "bg-yellow-50 text-yellow-800 ring-1 ring-yellow-600/20 dark:bg-yellow-400/10 dark:text-yellow-500 dark:ring-yellow-400/20" - defp badge_classes(:mixed), + def badge_classes(:mixed), do: "bg-yellow-50 text-emerald-700 ring-1 ring-emerald-600/40 dark:bg-yellow-400/10 dark:text-emerald-400 dark:ring-emerald-400/40" diff --git a/lib/music_library_web/live/stats_live/top_albums.ex b/lib/music_library_web/live/stats_live/top_albums.ex index bc108b40..c633198b 100644 --- a/lib/music_library_web/live/stats_live/top_albums.ex +++ b/lib/music_library_web/live/stats_live/top_albums.ex @@ -1,11 +1,11 @@ defmodule MusicLibraryWeb.StatsLive.TopAlbums do use MusicLibraryWeb, :html - import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1] + import MusicLibraryWeb.ScrobbleComponents, + only: [record_dropdown_link: 1, badge_status: 1, badge_classes: 1] alias MusicLibrary.Assets.Transform alias MusicLibrary.ListeningStats - alias MusicLibrary.Records alias MusicLibraryWeb.StatsLive.TopByPeriod attr :id, :string, required: true @@ -79,12 +79,12 @@ defmodule MusicLibraryWeb.StatsLive.TopAlbums do <:toggle> {@album.play_count} - <.top_album_dropdown_link + <.record_dropdown_link :for={record <- @album.matching_records} record={record} /> @@ -93,38 +93,6 @@ defmodule MusicLibraryWeb.StatsLive.TopAlbums do """ end - attr :record, :map, required: true - - defp top_album_dropdown_link(assigns) do - path = - if assigns.record.purchased_at, - do: ~p"/collection/#{assigns.record.id}", - else: ~p"/wishlist/#{assigns.record.id}" - - assigns = assign(assigns, :path, path) - - ~H""" - <.dropdown_link navigate={@path}> - - <.badge :if={@record.purchased_at} color="success" size="sm"> - {gettext("C")} - - <.badge :if={!@record.purchased_at} color="warning" size="sm"> - {gettext("W")} - - - {format_label(String.to_existing_atom(@record.format))} · {type_label( - String.to_existing_atom(@record.type) - )} - - · {Records.Record.format_as_date(@record.purchased_at)} - - - - - """ - end - defp navigate_to_record(%{matching_records: [record]}) do if record.purchased_at do JS.navigate(~p"/collection/#{record.id}") @@ -138,31 +106,6 @@ defmodule MusicLibraryWeb.StatsLive.TopAlbums do defp navigable?(%{matching_records: [_]}), do: true defp navigable?(_), do: false - defp badge_status([]), do: nil - - defp badge_status(records) do - all_collected = Enum.all?(records, & &1.purchased_at) - all_wishlisted = Enum.all?(records, &is_nil(&1.purchased_at)) - - cond do - all_collected -> :collected - all_wishlisted -> :wishlisted - true -> :mixed - end - end - - defp play_count_badge_classes(:collected), - do: - "bg-emerald-50 text-emerald-700 ring-1 ring-emerald-600/20 dark:bg-emerald-400/10 dark:text-emerald-400 dark:ring-emerald-400/20" - - defp play_count_badge_classes(:wishlisted), - do: - "bg-yellow-50 text-yellow-800 ring-1 ring-yellow-600/20 dark:bg-yellow-400/10 dark:text-yellow-500 dark:ring-yellow-400/20" - - defp play_count_badge_classes(:mixed), - do: - "bg-yellow-50 text-emerald-700 ring-1 ring-emerald-600/40 dark:bg-yellow-400/10 dark:text-emerald-400 dark:ring-emerald-400/40" - defp cover_url(album) when is_nil(album.cover_hash) do album.cover_url end diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index d12031c8..20ba0f96 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -2424,13 +2424,11 @@ msgid "Chat" msgstr "" #: lib/music_library_web/components/scrobble_components.ex -#: lib/music_library_web/live/stats_live/top_albums.ex #, elixir-autogen, elixir-format msgid "C" msgstr "" #: lib/music_library_web/components/scrobble_components.ex -#: lib/music_library_web/live/stats_live/top_albums.ex #, elixir-autogen, elixir-format msgid "W" msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 8d59b5c7..0f80d4ba 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -2424,13 +2424,11 @@ msgid "Chat" msgstr "" #: lib/music_library_web/components/scrobble_components.ex -#: lib/music_library_web/live/stats_live/top_albums.ex #, elixir-autogen, elixir-format, fuzzy msgid "C" msgstr "" #: lib/music_library_web/components/scrobble_components.ex -#: lib/music_library_web/live/stats_live/top_albums.ex #, elixir-autogen, elixir-format msgid "W" msgstr ""