Support choosing a selected release

This commit is contained in:
Claudio Ortolina
2025-05-01 17:42:40 +01:00
parent cba06ec5dc
commit 3e7341d4ca
14 changed files with 137 additions and 4 deletions
+5
View File
@@ -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", [])
+25
View File
@@ -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,
@@ -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)}
/>
<div class="sm:columns-2">
<.input field={@form[:release_date]} type="text" label={gettext("Release Date")} />
<.input
@@ -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")
@@ -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
@@ -211,6 +211,14 @@
{Records.Record.release_count(@record)}
</dd>
</div>
<div class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
{gettext("Collected release")}
</dt>
<dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
{selected_release_label(@record)}
</dd>
</div>
<div
:if={Records.Record.included_release_groups_count(@record) > 0}
class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"
@@ -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
@@ -226,6 +226,14 @@
{Records.Record.release_count(@record)}
</dd>
</div>
<div class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0">
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
{gettext("Collected release")}
</dt>
<dd class="mt-1 text-xs md:text-sm leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
{selected_release_label(@record)}
</dd>
</div>
<div
:if={Records.Record.included_release_groups_count(@record) > 0}
class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"