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)]