Support choosing a selected release
This commit is contained in:
@@ -9,6 +9,11 @@ defmodule MusicBrainz.ReleaseGroup do
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def releases(release_group) do
|
||||||
|
release_group
|
||||||
|
|> Map.get("releases", [])
|
||||||
|
end
|
||||||
|
|
||||||
def release_ids(release_group) do
|
def release_ids(release_group) do
|
||||||
release_group
|
release_group
|
||||||
|> Map.get("releases", [])
|
|> Map.get("releases", [])
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
field :genres, {:array, :string}
|
field :genres, {:array, :string}
|
||||||
field :release_date, :string
|
field :release_date, :string
|
||||||
field :purchased_at, :utc_datetime
|
field :purchased_at, :utc_datetime
|
||||||
|
field :selected_release_id, :string
|
||||||
field :release_ids, {:array, :string}, default: []
|
field :release_ids, {:array, :string}, default: []
|
||||||
field :included_release_group_ids, {:array, :string}, default: []
|
field :included_release_group_ids, {:array, :string}, default: []
|
||||||
|
|
||||||
@@ -70,6 +71,29 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
end
|
end
|
||||||
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
|
def changeset(record, attrs) do
|
||||||
record
|
record
|
||||||
|> cast(attrs, [
|
|> cast(attrs, [
|
||||||
@@ -81,6 +105,7 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
:release_date,
|
:release_date,
|
||||||
:genres,
|
:genres,
|
||||||
:release_ids,
|
:release_ids,
|
||||||
|
:selected_release_id,
|
||||||
:included_release_group_ids,
|
:included_release_group_ids,
|
||||||
:cover_url,
|
:cover_url,
|
||||||
:cover_data,
|
:cover_data,
|
||||||
|
|||||||
@@ -55,6 +55,13 @@ defmodule MusicLibraryWeb.FormComponent do
|
|||||||
type="text"
|
type="text"
|
||||||
label={gettext("MusicBrainz ID")}
|
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">
|
<div class="sm:columns-2">
|
||||||
<.input field={@form[:release_date]} type="text" label={gettext("Release Date")} />
|
<.input field={@form[:release_date]} type="text" label={gettext("Release Date")} />
|
||||||
<.input
|
<.input
|
||||||
|
|||||||
@@ -293,6 +293,14 @@ defmodule MusicLibraryWeb.RecordComponents do
|
|||||||
def type_label(:single), do: gettext("Single")
|
def type_label(:single), do: gettext("Single")
|
||||||
def type_label(:other), do: gettext("Other")
|
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
|
def toggle_actions_menu(record_id) do
|
||||||
JS.toggle(to: "#actions-#{record_id}")
|
JS.toggle(to: "#actions-#{record_id}")
|
||||||
|> JS.toggle_class("pointer-events-none", to: "#records > li")
|
|> JS.toggle_class("pointer-events-none", to: "#records > li")
|
||||||
|
|||||||
@@ -2,7 +2,13 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
use MusicLibraryWeb, :live_view
|
use MusicLibraryWeb, :live_view
|
||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
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 MusicLibrary.Records
|
||||||
alias Phoenix.LiveView.JS
|
alias Phoenix.LiveView.JS
|
||||||
|
|||||||
@@ -211,6 +211,14 @@
|
|||||||
{Records.Record.release_count(@record)}
|
{Records.Record.release_count(@record)}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</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
|
<div
|
||||||
:if={Records.Record.included_release_groups_count(@record) > 0}
|
:if={Records.Record.included_release_groups_count(@record) > 0}
|
||||||
class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-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
|
use MusicLibraryWeb, :live_view
|
||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
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 MusicLibrary.Records
|
||||||
|
|
||||||
|
|||||||
@@ -226,6 +226,14 @@
|
|||||||
{Records.Record.release_count(@record)}
|
{Records.Record.release_count(@record)}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</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
|
<div
|
||||||
:if={Records.Record.included_release_groups_count(@record) > 0}
|
:if={Records.Record.included_release_groups_count(@record) > 0}
|
||||||
class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"
|
class="py-2 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-0"
|
||||||
|
|||||||
@@ -742,3 +742,24 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Release Date"
|
msgid "Release Date"
|
||||||
msgstr ""
|
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 ""
|
||||||
|
|||||||
@@ -742,3 +742,24 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Release Date"
|
msgid "Release Date"
|
||||||
msgstr ""
|
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 ""
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -2,7 +2,10 @@ defmodule MusicLibraryWeb.CollectionLive.ShowTest do
|
|||||||
use MusicLibraryWeb.ConnCase
|
use MusicLibraryWeb.ConnCase
|
||||||
|
|
||||||
import MusicLibrary.Fixtures.Records
|
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
|
alias MusicLibrary.Records.Record
|
||||||
|
|
||||||
describe "Edit record from show page" do
|
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.format_as_date(record.purchased_at))
|
||||||
|> assert_has("dd", text: record.id)
|
|> assert_has("dd", text: record.id)
|
||||||
|> assert_has("a", text: record.musicbrainz_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.inserted_at))
|
||||||
|> assert_has("dd", text: Record.format_as_date(record.updated_at))
|
|> assert_has("dd", text: Record.format_as_date(record.updated_at))
|
||||||
|> assert_has("img[src='#{cover_url}']")
|
|> assert_has("img[src='#{cover_url}']")
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ defmodule MusicLibraryWeb.WishlistLive.ShowTest do
|
|||||||
use MusicLibraryWeb.ConnCase
|
use MusicLibraryWeb.ConnCase
|
||||||
|
|
||||||
import MusicLibrary.Fixtures.Records
|
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
|
alias MusicLibrary.Records.Record
|
||||||
|
|
||||||
describe "Edit record from show page" do
|
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("p", text: type_label(record.type))
|
||||||
|> assert_has("dd", text: record.id)
|
|> assert_has("dd", text: record.id)
|
||||||
|> assert_has("a", text: record.musicbrainz_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.inserted_at))
|
||||||
|> assert_has("dd", text: Record.format_as_date(record.updated_at))
|
|> assert_has("dd", text: Record.format_as_date(record.updated_at))
|
||||||
|> assert_has("img[src='#{cover_url}']")
|
|> assert_has("img[src='#{cover_url}']")
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ defmodule MusicLibrary.Fixtures.Records do
|
|||||||
title: Enum.random(@titles),
|
title: Enum.random(@titles),
|
||||||
type: :album,
|
type: :album,
|
||||||
format: Record.formats() |> Enum.random(),
|
format: Record.formats() |> Enum.random(),
|
||||||
|
selected_release_id: "d3f9b9e2-73f5-4b47-a2a7-2c2199aad608",
|
||||||
release_date: Enum.random(1969..2024) |> Integer.to_string(),
|
release_date: Enum.random(1969..2024) |> Integer.to_string(),
|
||||||
purchased_at: current_time,
|
purchased_at: current_time,
|
||||||
artists: [artist_attrs(artist_name)]
|
artists: [artist_attrs(artist_name)]
|
||||||
|
|||||||
Reference in New Issue
Block a user