diff --git a/lib/music_library_web/components/stats_components.ex b/lib/music_library_web/components/stats_components.ex
index 0df55606..ab9fb13c 100644
--- a/lib/music_library_web/components/stats_components.ex
+++ b/lib/music_library_web/components/stats_components.ex
@@ -66,68 +66,6 @@ defmodule MusicLibraryWeb.StatsComponents do
"""
end
- attr :albums, :list, required: true
- attr :collected_releases, :list, required: true
- attr :wishlisted_releases, :list, required: true
-
- def top_albums_by_period(assigns) do
- ~H"""
-
-
-
-

-
- <.link
- class="text-xs text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300 truncate"
- navigate={~p"/artists/#{album.artist_musicbrainz_id}"}
- >
- {album.artist_name}
-
-
- {album.album_title}
-
-
- <.badge :if={album.album_musicbrainz_id == ""}>
- {album.play_count}
-
- <.badge :if={
- album.album_musicbrainz_id !== "" and
- !tracked_record?(
- @collected_releases ++ @wishlisted_releases,
- album.album_musicbrainz_id
- )
- }>
- {album.play_count}
-
- <.badge :if={tracked_record?(@collected_releases, album.album_musicbrainz_id)} color="green">
- {album.play_count}
-
- <.badge
- :if={tracked_record?(@wishlisted_releases, album.album_musicbrainz_id)}
- color="yellow"
- >
- {album.play_count}
-
-
-
-
- """
- end
-
attr :artists, :list, required: true
def top_artists_by_period(assigns) do
@@ -191,17 +129,4 @@ defmodule MusicLibraryWeb.StatsComponents do
if tracked_release.release_id == release_id, do: tracked_release.record_id
end)
end
-
- defp navigate_to_record(collected_releases, wishlisted_releases, musicbrainz_id) do
- cond do
- record_id = tracked_record?(collected_releases, musicbrainz_id) ->
- JS.navigate(~p"/collection/#{record_id}")
-
- record_id = tracked_record?(wishlisted_releases, musicbrainz_id) ->
- JS.navigate(~p"/wishlist/#{record_id}")
-
- true ->
- nil
- end
- end
end
diff --git a/lib/music_library_web/live/stats_live/index.ex b/lib/music_library_web/live/stats_live/index.ex
index d5fa6f46..72a25fe6 100644
--- a/lib/music_library_web/live/stats_live/index.ex
+++ b/lib/music_library_web/live/stats_live/index.ex
@@ -6,6 +6,7 @@ defmodule MusicLibraryWeb.StatsLive.Index do
import MusicLibraryWeb.StatsComponents
alias MusicLibrary.{Collection, Records, ScrobbleActivity, Wishlist}
+ alias MusicLibraryWeb.StatsLive.TopAlbums
def mount(_params, _session, socket) do
latest_record = Collection.get_latest_record!()
@@ -28,7 +29,6 @@ defmodule MusicLibraryWeb.StatsLive.Index do
)
|> assign_counts()
|> assign_scrobble_activity(recent_tracks)
- |> assign_top_albums()
|> assign_top_artists()
|> assign(
scrobble_activity_mode: "albums",
@@ -87,7 +87,6 @@ defmodule MusicLibraryWeb.StatsLive.Index do
{:noreply,
socket
- |> assign_top_albums()
|> assign_top_artists()
|> assign_scrobble_activity(recent_tracks)}
end
@@ -129,22 +128,6 @@ defmodule MusicLibraryWeb.StatsLive.Index do
)
end
- defp assign_top_albums(socket) do
- timezone = socket.assigns.timezone
- current_time = DateTime.utc_now()
-
- assign_async(socket, :top_albums, fn ->
- top_albums =
- ScrobbleActivity.get_top_albums_by_periods(
- limit: 10,
- current_time: current_time,
- timezone: timezone
- )
-
- {:ok, %{top_albums: top_albums}}
- end)
- end
-
defp assign_top_artists(socket) do
timezone = socket.assigns.timezone
current_time = DateTime.utc_now()
diff --git a/lib/music_library_web/live/stats_live/index.html.heex b/lib/music_library_web/live/stats_live/index.html.heex
index e3dc5637..131c2e36 100644
--- a/lib/music_library_web/live/stats_live/index.html.heex
+++ b/lib/music_library_web/live/stats_live/index.html.heex
@@ -102,54 +102,7 @@
-
-
- {gettext("Top Albums")}
-
- <.async_result :let={top_albums} assign={@top_albums}>
- <:loading>
-
- <.loading />
-
-
- <.tabs class="mt-4">
- <.tabs_list active_tab="top_albums_last_30_days" variant="segmented">
- <:tab class="flex-1" name="top_albums_last_30_days">{gettext("Last 30 days")}
- <:tab class="flex-1" name="top_albums_last_90_days">{gettext("Last 90 days")}
- <:tab class="flex-1" name="top_albums_last_365_days">{gettext("Last year")}
- <:tab class="flex-1" name="top_albums_all_time">{gettext("All time")}
-
- <.tabs_panel active name="top_albums_last_30_days">
- <.top_albums_by_period
- albums={top_albums.last_30_days}
- collected_releases={top_albums.collected_releases}
- wishlisted_releases={top_albums.wishlisted_releases}
- />
-
- <.tabs_panel name="top_albums_last_90_days">
- <.top_albums_by_period
- albums={top_albums.last_90_days}
- collected_releases={top_albums.collected_releases}
- wishlisted_releases={top_albums.wishlisted_releases}
- />
-
- <.tabs_panel name="top_albums_last_365_days">
- <.top_albums_by_period
- albums={top_albums.last_365_days}
- collected_releases={top_albums.collected_releases}
- wishlisted_releases={top_albums.wishlisted_releases}
- />
-
- <.tabs_panel name="top_albums_all_time">
- <.top_albums_by_period
- albums={top_albums.all_time}
- collected_releases={top_albums.collected_releases}
- wishlisted_releases={top_albums.wishlisted_releases}
- />
-
-
-
-
+
diff --git a/lib/music_library_web/live/stats_live/top_albums.ex b/lib/music_library_web/live/stats_live/top_albums.ex
new file mode 100644
index 00000000..4d2e5ec0
--- /dev/null
+++ b/lib/music_library_web/live/stats_live/top_albums.ex
@@ -0,0 +1,166 @@
+defmodule MusicLibraryWeb.StatsLive.TopAlbums do
+ use MusicLibraryWeb, :live_component
+
+ import MusicLibraryWeb.StatsComponents, only: [tracked_record?: 2]
+
+ alias MusicLibrary.ScrobbleActivity
+
+ def live(assigns) do
+ ~H"""
+ <.live_component module={__MODULE__} {assigns} id={@id} />
+ """
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+
+ {gettext("Top Albums")}
+
+ <.async_result :let={top_albums} assign={@top_albums}>
+ <:loading>
+
+ <.loading />
+
+
+ <.tabs class="mt-4">
+ <.tabs_list active_tab="top_albums_last_30_days" variant="segmented">
+ <:tab class="flex-1" name="top_albums_last_30_days">{gettext("Last 30 days")}
+ <:tab class="flex-1" name="top_albums_last_90_days">{gettext("Last 90 days")}
+ <:tab class="flex-1" name="top_albums_last_365_days">{gettext("Last year")}
+ <:tab class="flex-1" name="top_albums_all_time">{gettext("All time")}
+
+ <.tabs_panel active name="top_albums_last_30_days">
+ <.top_albums_by_period
+ albums={top_albums.last_30_days}
+ collected_releases={top_albums.collected_releases}
+ wishlisted_releases={top_albums.wishlisted_releases}
+ />
+
+ <.tabs_panel name="top_albums_last_90_days">
+ <.top_albums_by_period
+ albums={top_albums.last_90_days}
+ collected_releases={top_albums.collected_releases}
+ wishlisted_releases={top_albums.wishlisted_releases}
+ />
+
+ <.tabs_panel name="top_albums_last_365_days">
+ <.top_albums_by_period
+ albums={top_albums.last_365_days}
+ collected_releases={top_albums.collected_releases}
+ wishlisted_releases={top_albums.wishlisted_releases}
+ />
+
+ <.tabs_panel name="top_albums_all_time">
+ <.top_albums_by_period
+ albums={top_albums.all_time}
+ collected_releases={top_albums.collected_releases}
+ wishlisted_releases={top_albums.wishlisted_releases}
+ />
+
+
+
+
+ """
+ end
+
+ @impl true
+ def update(assigns, socket) do
+ {:ok,
+ socket
+ |> assign(assigns)
+ |> assign_top_albums()}
+ end
+
+ attr :albums, :list, required: true
+ attr :collected_releases, :list, required: true
+ attr :wishlisted_releases, :list, required: true
+
+ defp top_albums_by_period(assigns) do
+ ~H"""
+
+
+
+

+
+ <.link
+ class="text-xs text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300 truncate"
+ navigate={~p"/artists/#{album.artist_musicbrainz_id}"}
+ >
+ {album.artist_name}
+
+
+ {album.album_title}
+
+
+ <.badge :if={album.album_musicbrainz_id == ""}>
+ {album.play_count}
+
+ <.badge :if={
+ album.album_musicbrainz_id !== "" and
+ !tracked_record?(
+ @collected_releases ++ @wishlisted_releases,
+ album.album_musicbrainz_id
+ )
+ }>
+ {album.play_count}
+
+ <.badge :if={tracked_record?(@collected_releases, album.album_musicbrainz_id)} color="green">
+ {album.play_count}
+
+ <.badge
+ :if={tracked_record?(@wishlisted_releases, album.album_musicbrainz_id)}
+ color="yellow"
+ >
+ {album.play_count}
+
+
+
+
+ """
+ end
+
+ defp assign_top_albums(socket) do
+ timezone = socket.assigns.timezone
+ current_time = DateTime.utc_now()
+
+ assign_async(socket, :top_albums, fn ->
+ top_albums =
+ ScrobbleActivity.get_top_albums_by_periods(
+ limit: 10,
+ current_time: current_time,
+ timezone: timezone
+ )
+
+ {:ok, %{top_albums: top_albums}}
+ end)
+ end
+
+ defp navigate_to_record(collected_releases, wishlisted_releases, musicbrainz_id) do
+ cond do
+ record_id = tracked_record?(collected_releases, musicbrainz_id) ->
+ JS.navigate(~p"/collection/#{record_id}")
+
+ record_id = tracked_record?(wishlisted_releases, musicbrainz_id) ->
+ JS.navigate(~p"/wishlist/#{record_id}")
+
+ true ->
+ nil
+ end
+ end
+end
diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot
index b50b23ee..be6bbfc9 100644
--- a/priv/gettext/default.pot
+++ b/priv/gettext/default.pot
@@ -894,21 +894,24 @@ msgid "Record deleted"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Last 30 days"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Last 90 days"
msgstr ""
-#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Top Albums"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Last year"
msgstr ""
@@ -934,6 +937,7 @@ msgid "Top Artists"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "All time"
msgstr ""
diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po
index 859c5486..2a166a1c 100644
--- a/priv/gettext/en/LC_MESSAGES/default.po
+++ b/priv/gettext/en/LC_MESSAGES/default.po
@@ -894,21 +894,24 @@ msgid "Record deleted"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Last 30 days"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "Last 90 days"
msgstr ""
-#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Top Albums"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format, fuzzy
msgid "Last year"
msgstr ""
@@ -934,6 +937,7 @@ msgid "Top Artists"
msgstr ""
#: lib/music_library_web/live/stats_live/index.html.heex
+#: lib/music_library_web/live/stats_live/top_albums.ex
#, elixir-autogen, elixir-format
msgid "All time"
msgstr ""