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""" -
-
-
- {album.album_title} -
- <.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""" +
+
+
+ {album.album_title} +
+ <.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 ""