Support choosing a selected release
This commit is contained in:
@@ -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", [])
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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 ""
|
||||
|
||||
@@ -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
|
||||
|
||||
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}']")
|
||||
|
||||
@@ -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}']")
|
||||
|
||||
@@ -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)]
|
||||
|
||||
Reference in New Issue
Block a user