From 3e7341d4cac400a453df4233fb86d8052b1d777c Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 1 May 2025 17:42:40 +0100 Subject: [PATCH] Support choosing a selected release --- lib/music_brainz/release_group.ex | 5 ++++ lib/music_library/records/record.ex | 25 +++++++++++++++++++ .../components/form_component.ex | 7 ++++++ .../components/record_components.ex | 8 ++++++ .../live/collection_live/show.ex | 8 +++++- .../live/collection_live/show.html.heex | 8 ++++++ .../live/wishlist_live/show.ex | 8 +++++- .../live/wishlist_live/show.html.heex | 8 ++++++ priv/gettext/default.pot | 21 ++++++++++++++++ priv/gettext/en/LC_MESSAGES/default.po | 21 ++++++++++++++++ ...914_add_selected_release_id_to_records.exs | 9 +++++++ .../live/collection_live/show_test.exs | 6 ++++- .../live/wishlist_live/show_test.exs | 6 ++++- .../support/fixtures/music_library/records.ex | 1 + 14 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 priv/repo/migrations/20250501160914_add_selected_release_id_to_records.exs diff --git a/lib/music_brainz/release_group.ex b/lib/music_brainz/release_group.ex index 0bc7aab4..c516faf2 100644 --- a/lib/music_brainz/release_group.ex +++ b/lib/music_brainz/release_group.ex @@ -9,6 +9,11 @@ defmodule MusicBrainz.ReleaseGroup do end) end + def releases(release_group) do + release_group + |> Map.get("releases", []) + end + def release_ids(release_group) do release_group |> Map.get("releases", []) diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index 1dde4c22..ffa6409c 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -22,6 +22,7 @@ defmodule MusicLibrary.Records.Record do field :genres, {:array, :string} field :release_date, :string field :purchased_at, :utc_datetime + field :selected_release_id, :string field :release_ids, {:array, :string}, default: [] field :included_release_group_ids, {:array, :string}, default: [] @@ -70,6 +71,29 @@ defmodule MusicLibrary.Records.Record do end end + def selected_release_id_options(record) do + record.musicbrainz_data + |> ReleaseGroup.releases() + |> Enum.map(fn release -> + { + selected_release_label(release), + release["id"] + } + end) + end + + def selected_release(record) do + record.musicbrainz_data + |> ReleaseGroup.releases() + |> Enum.find(fn release -> release["id"] == record.selected_release_id end) + end + + def selected_release_label(release) do + [release["date"], release["country"], release["packaging"]] + |> Enum.reject(&is_nil/1) + |> Enum.join(" ") + end + def changeset(record, attrs) do record |> cast(attrs, [ @@ -81,6 +105,7 @@ defmodule MusicLibrary.Records.Record do :release_date, :genres, :release_ids, + :selected_release_id, :included_release_group_ids, :cover_url, :cover_data, diff --git a/lib/music_library_web/components/form_component.ex b/lib/music_library_web/components/form_component.ex index b393a65c..b305ca5a 100644 --- a/lib/music_library_web/components/form_component.ex +++ b/lib/music_library_web/components/form_component.ex @@ -55,6 +55,13 @@ defmodule MusicLibraryWeb.FormComponent do type="text" label={gettext("MusicBrainz ID")} /> + <.input + field={@form[:selected_release_id]} + type="select" + label={gettext("Selected Release")} + prompt={gettext("Choose a Release")} + options={Record.selected_release_id_options(@record)} + />
<.input field={@form[:release_date]} type="text" label={gettext("Release Date")} /> <.input diff --git a/lib/music_library_web/components/record_components.ex b/lib/music_library_web/components/record_components.ex index 1a19a078..5527d21f 100644 --- a/lib/music_library_web/components/record_components.ex +++ b/lib/music_library_web/components/record_components.ex @@ -293,6 +293,14 @@ defmodule MusicLibraryWeb.RecordComponents do def type_label(:single), do: gettext("Single") def type_label(:other), do: gettext("Other") + def selected_release_label(record) do + if release = Records.Record.selected_release(record) do + Records.Record.selected_release_label(release) + else + gettext("No release selected") + end + end + def toggle_actions_menu(record_id) do JS.toggle(to: "#actions-#{record_id}") |> JS.toggle_class("pointer-events-none", to: "#records > li") diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index 6e6d42f1..922c921c 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -2,7 +2,13 @@ defmodule MusicLibraryWeb.CollectionLive.Show do use MusicLibraryWeb, :live_view import MusicLibraryWeb.RecordComponents, - only: [toggle_actions_menu: 1, close_actions_menu: 1, format_label: 1, type_label: 1] + only: [ + toggle_actions_menu: 1, + close_actions_menu: 1, + format_label: 1, + type_label: 1, + selected_release_label: 1 + ] alias MusicLibrary.Records alias Phoenix.LiveView.JS diff --git a/lib/music_library_web/live/collection_live/show.html.heex b/lib/music_library_web/live/collection_live/show.html.heex index 7b749278..5bb76b89 100644 --- a/lib/music_library_web/live/collection_live/show.html.heex +++ b/lib/music_library_web/live/collection_live/show.html.heex @@ -211,6 +211,14 @@ {Records.Record.release_count(@record)}
+
+
+ {gettext("Collected release")} +
+
+ {selected_release_label(@record)} +
+
0} class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0" diff --git a/lib/music_library_web/live/wishlist_live/show.ex b/lib/music_library_web/live/wishlist_live/show.ex index 4cd84643..1db22f8d 100644 --- a/lib/music_library_web/live/wishlist_live/show.ex +++ b/lib/music_library_web/live/wishlist_live/show.ex @@ -2,7 +2,13 @@ defmodule MusicLibraryWeb.WishlistLive.Show do use MusicLibraryWeb, :live_view import MusicLibraryWeb.RecordComponents, - only: [toggle_actions_menu: 1, close_actions_menu: 1, format_label: 1, type_label: 1] + only: [ + toggle_actions_menu: 1, + close_actions_menu: 1, + format_label: 1, + type_label: 1, + selected_release_label: 1 + ] alias MusicLibrary.Records diff --git a/lib/music_library_web/live/wishlist_live/show.html.heex b/lib/music_library_web/live/wishlist_live/show.html.heex index e4352011..bd5b8fcf 100644 --- a/lib/music_library_web/live/wishlist_live/show.html.heex +++ b/lib/music_library_web/live/wishlist_live/show.html.heex @@ -226,6 +226,14 @@ {Records.Record.release_count(@record)}
+
+
+ {gettext("Collected release")} +
+
+ {selected_release_label(@record)} +
+
0} class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index ddf2e017..7c47e4a8 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -742,3 +742,24 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Release Date" msgstr "" + +#: lib/music_library_web/components/form_component.ex +#, elixir-autogen, elixir-format +msgid "Choose a Release" +msgstr "" + +#: lib/music_library_web/live/collection_live/show.html.heex +#: lib/music_library_web/live/wishlist_live/show.html.heex +#, elixir-autogen, elixir-format +msgid "Collected release" +msgstr "" + +#: lib/music_library_web/components/record_components.ex +#, elixir-autogen, elixir-format +msgid "No release selected" +msgstr "" + +#: lib/music_library_web/components/form_component.ex +#, elixir-autogen, elixir-format +msgid "Selected Release" +msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index a1525dcf..ab5d8a59 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -742,3 +742,24 @@ msgstr "" #, elixir-autogen, elixir-format msgid "Release Date" msgstr "" + +#: lib/music_library_web/components/form_component.ex +#, elixir-autogen, elixir-format, fuzzy +msgid "Choose a Release" +msgstr "" + +#: lib/music_library_web/live/collection_live/show.html.heex +#: lib/music_library_web/live/wishlist_live/show.html.heex +#, elixir-autogen, elixir-format, fuzzy +msgid "Collected release" +msgstr "" + +#: lib/music_library_web/components/record_components.ex +#, elixir-autogen, elixir-format +msgid "No release selected" +msgstr "" + +#: lib/music_library_web/components/form_component.ex +#, elixir-autogen, elixir-format +msgid "Selected Release" +msgstr "" diff --git a/priv/repo/migrations/20250501160914_add_selected_release_id_to_records.exs b/priv/repo/migrations/20250501160914_add_selected_release_id_to_records.exs new file mode 100644 index 00000000..998bf9c8 --- /dev/null +++ b/priv/repo/migrations/20250501160914_add_selected_release_id_to_records.exs @@ -0,0 +1,9 @@ +defmodule MusicLibrary.Repo.Migrations.AddSelectedReleaseIdToRecords do + use Ecto.Migration + + def change do + alter table(:records) do + add :selected_release_id, :string + end + end +end diff --git a/test/music_library_web/live/collection_live/show_test.exs b/test/music_library_web/live/collection_live/show_test.exs index 2cf4172d..413692e7 100644 --- a/test/music_library_web/live/collection_live/show_test.exs +++ b/test/music_library_web/live/collection_live/show_test.exs @@ -2,7 +2,10 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do use MusicLibraryWeb.ConnCase import MusicLibrary.Fixtures.Records - import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1] + + import MusicLibraryWeb.RecordComponents, + only: [format_label: 1, type_label: 1, selected_release_label: 1] + alias MusicLibrary.Records.Record describe "Edit record from show page" do @@ -32,6 +35,7 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do |> assert_has("dd", text: Record.format_as_date(record.purchased_at)) |> assert_has("dd", text: record.id) |> assert_has("a", text: record.musicbrainz_id) + |> assert_has("dd", text: selected_release_label(record)) |> assert_has("dd", text: Record.format_as_date(record.inserted_at)) |> assert_has("dd", text: Record.format_as_date(record.updated_at)) |> assert_has("img[src='#{cover_url}']") 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 fbb6e0f4..c345345f 100644 --- a/test/music_library_web/live/wishlist_live/show_test.exs +++ b/test/music_library_web/live/wishlist_live/show_test.exs @@ -2,7 +2,10 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do use MusicLibraryWeb.ConnCase import MusicLibrary.Fixtures.Records - import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1] + + import MusicLibraryWeb.RecordComponents, + only: [format_label: 1, type_label: 1, selected_release_label: 1] + alias MusicLibrary.Records.Record describe "Edit record from show page" do @@ -31,6 +34,7 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do |> assert_has("p", text: type_label(record.type)) |> assert_has("dd", text: record.id) |> assert_has("a", text: record.musicbrainz_id) + |> assert_has("dd", text: selected_release_label(record)) |> assert_has("dd", text: Record.format_as_date(record.inserted_at)) |> assert_has("dd", text: Record.format_as_date(record.updated_at)) |> assert_has("img[src='#{cover_url}']") diff --git a/test/support/fixtures/music_library/records.ex b/test/support/fixtures/music_library/records.ex index 8e3d7137..f507ceed 100644 --- a/test/support/fixtures/music_library/records.ex +++ b/test/support/fixtures/music_library/records.ex @@ -66,6 +66,7 @@ defmodule MusicLibrary.Fixtures.Records do title: Enum.random(@titles), type: :album, format: Record.formats() |> Enum.random(), + selected_release_id: "d3f9b9e2-73f5-4b47-a2a7-2c2199aad608", release_date: Enum.random(1969..2024) |> Integer.to_string(), purchased_at: current_time, artists: [artist_attrs(artist_name)]