diff --git a/lib/music_library_web/live/wishlist_live/show.ex b/lib/music_library_web/live/wishlist_live/show.ex index 2c37885b..84f7cc42 100644 --- a/lib/music_library_web/live/wishlist_live/show.ex +++ b/lib/music_library_web/live/wishlist_live/show.ex @@ -58,6 +58,19 @@ defmodule MusicLibraryWeb.WishlistLive.Show do /> 0} class="text-xs font-medium">{@chat_count} + <.button + :if={@record.selected_release_id} + variant="soft" + phx-click={MusicLibraryWeb.Components.Release.open("release-with-tracks-sheet")} + > + {gettext("Show Tracks")} + <.icon + name="hero-numbered-list" + class="icon" + aria-hidden="true" + data-slot="icon" + /> + <.dropdown id={"actions-#{@record.id}"} placement="bottom-end"> <:toggle> <.button variant="soft"> @@ -252,6 +265,22 @@ defmodule MusicLibraryWeb.WishlistLive.Show do <.record_debug_sheet record={@record} embedding_text={@embedding_text} /> + <.sheet + :if={@record.selected_release_id} + id="release-with-tracks-sheet" + placement="right" + class="flex min-w-xs flex-col overflow-hidden p-0 sm:min-w-sm" + > + <.live_component + id="release-with-tracks" + sheet_id="release-with-tracks-sheet" + module={MusicLibraryWeb.Components.Release} + release_id={@record.selected_release_id} + show_print?={false} + timezone={@timezone} + /> + + <.live_component id="record-chat" sheet_id="record-chat-sheet" @@ -363,6 +392,10 @@ defmodule MusicLibraryWeb.WishlistLive.Show do RecordActions.handle_chats_changed(socket) end + def handle_info({MusicLibraryWeb.Components.Release, {:loaded, _release}}, socket) do + {:noreply, socket} + end + @impl true def handle_info({:update, record}, socket) do cond do diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index ad46ccb5..f53846e2 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -623,6 +623,7 @@ msgid "Loading release with tracks" msgstr "" #: lib/music_library_web/live/collection_live/show.ex +#: lib/music_library_web/live/wishlist_live/show.ex #, elixir-autogen, elixir-format msgid "Show Tracks" msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index e94912cc..feaf2219 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -623,6 +623,7 @@ msgid "Loading release with tracks" msgstr "" #: lib/music_library_web/live/collection_live/show.ex +#: lib/music_library_web/live/wishlist_live/show.ex #, elixir-autogen, elixir-format msgid "Show Tracks" msgstr "" diff --git a/test/music_library_web/live/wishlist_live/show_test.exs b/test/music_library_web/live/wishlist_live/show_test.exs index c5e2d07c..f1304c84 100644 --- a/test/music_library_web/live/wishlist_live/show_test.exs +++ b/test/music_library_web/live/wishlist_live/show_test.exs @@ -4,12 +4,25 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do import MusicLibrary.Fixtures.Records import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1] + alias MusicBrainz.Fixtures alias MusicLibrary.Assets.Transform alias MusicLibrary.Records alias MusicLibrary.Records.Record alias Phoenix.PubSub + defp stub_release(_) do + release_response = Fixtures.Release.release(:marbles) + + Req.Test.stub(MusicBrainz.API, fn conn -> + Req.Test.json(conn, release_response) + end) + + %{release_response: release_response} + end + describe "Edit record from show page" do + setup [:stub_release] + test "can navigate to the record edit form", %{conn: conn} do record = record(purchased_at: nil) @@ -22,6 +35,8 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do end describe "Show record" do + setup [:stub_release] + test "includes all needed information", %{conn: conn} do record = record(purchased_at: nil) transform = %Transform{hash: record.cover_hash, width: nil} @@ -55,6 +70,8 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do end describe "Delete record" do + setup [:stub_release] + test "deletes the record and navigates back to wishlist", %{conn: conn} do record = record(purchased_at: nil) @@ -70,6 +87,8 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do end describe "handle_info({:update, record}) with live_action guard" do + setup [:stub_release] + test "updates record when showing (live_action is :show)", %{conn: conn} do record = record(purchased_at: nil) updated_record = %{record | title: "Background Updated Title"} @@ -132,4 +151,34 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do |> refute_has("#toast-group", text: "Record updated in the background") end end + + describe "Side panel" do + setup [:stub_release] + + test "shows a record's tracks", %{conn: conn, release_response: release_response} do + record = record() + + session = + conn + |> visit(~p"/wishlist/#{record.id}") + |> assert_has("button", "Show Tracks") + |> render_async() + |> assert_has("a", "Connect Last.fm") + + release = + MusicBrainz.Release.from_api_response(release_response) + + for medium <- release.media do + session + |> within("#disc-#{medium.number}", fn inner_session -> + for track <- medium.tracks do + inner_session + |> assert_has("li", escape(track.title)) + end + + inner_session + end) + end + end + end end