Display rich release summary in form and details
This commit is contained in:
@@ -8,8 +8,8 @@ defmodule MusicBrainz.ReleaseSearchResult do
|
|||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
id: r["id"],
|
id: r["id"],
|
||||||
title: r["title"],
|
title: r["title"],
|
||||||
release_group: parse_release_group(r["release-group"]),
|
release_group: r["release-group"] && parse_release_group(r["release-group"]),
|
||||||
artists: Enum.map_join(r["artist-credit"], ", ", fn ac -> ac["artist"]["name"] end),
|
artists: Enum.map_join(r["artist-credit"] || [], ", ", fn ac -> ac["artist"]["name"] end),
|
||||||
date: r["date"],
|
date: r["date"],
|
||||||
barcode: r["barcode"],
|
barcode: r["barcode"],
|
||||||
media: parse_media(r["media"])
|
media: parse_media(r["media"])
|
||||||
@@ -36,7 +36,7 @@ defmodule MusicBrainz.ReleaseSearchResult do
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp parse_media(media) do
|
def parse_media(media) do
|
||||||
Enum.map(media, fn m ->
|
Enum.map(media, fn m ->
|
||||||
%{
|
%{
|
||||||
format: m["format"],
|
format: m["format"],
|
||||||
|
|||||||
@@ -80,9 +80,13 @@ defmodule MusicLibrary.Records.Record do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def selected_release(record) do
|
def selected_release(record) do
|
||||||
|
find_release(record, record.selected_release_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_release(record, release_id) do
|
||||||
record
|
record
|
||||||
|> releases()
|
|> releases()
|
||||||
|> Enum.find(fn release -> release.id == record.selected_release_id end)
|
|> Enum.find(fn release -> release.id == release_id end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeset(record, attrs) do
|
def changeset(record, attrs) do
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ defmodule MusicLibraryWeb.FormComponent do
|
|||||||
use MusicLibraryWeb, :live_component
|
use MusicLibraryWeb, :live_component
|
||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
import MusicLibraryWeb.RecordComponents,
|
||||||
only: [format_label: 1, type_label: 1, release_label: 1]
|
only: [format_label: 1, type_label: 1, release_label: 1, release_summary: 1]
|
||||||
|
|
||||||
alias MusicLibrary.Records
|
alias MusicLibrary.Records
|
||||||
alias MusicLibrary.Records.{Cover, Record}
|
alias MusicLibrary.Records.{Cover, Record}
|
||||||
@@ -45,7 +45,11 @@ defmodule MusicLibraryWeb.FormComponent do
|
|||||||
field={@form[:selected_release_id]}
|
field={@form[:selected_release_id]}
|
||||||
label={gettext("Selected Release")}
|
label={gettext("Selected Release")}
|
||||||
options={selected_release_id_options(@record)}
|
options={selected_release_id_options(@record)}
|
||||||
/>
|
>
|
||||||
|
<:option :let={{_label, value}}>
|
||||||
|
<.release_option release={Records.Record.find_release(@record, value)} />
|
||||||
|
</:option>
|
||||||
|
</.select>
|
||||||
<div class={[@show_purchased_at && "sm:columns-2", "space-y-2"]}>
|
<div class={[@show_purchased_at && "sm:columns-2", "space-y-2"]}>
|
||||||
<.input field={@form[:release_date]} label={gettext("Release Date")} />
|
<.input field={@form[:release_date]} label={gettext("Release Date")} />
|
||||||
<.date_time_picker
|
<.date_time_picker
|
||||||
@@ -124,6 +128,20 @@ defmodule MusicLibraryWeb.FormComponent do
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
attr :release, :map, required: true
|
||||||
|
|
||||||
|
defp release_option(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div class={[
|
||||||
|
"cursor-default px-3 py-2 rounded-lg",
|
||||||
|
"in-data-highlighted:bg-zinc-100 dark:in-data-highlighted:bg-zinc-600",
|
||||||
|
"[[data-highlighted]_&]:flx-focus:bg-zinc-100"
|
||||||
|
]}>
|
||||||
|
<.release_summary release={@release} />
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def update(%{record: record} = assigns, socket) do
|
def update(%{record: record} = assigns, socket) do
|
||||||
{:ok,
|
{:ok,
|
||||||
|
|||||||
@@ -280,12 +280,45 @@ defmodule MusicLibraryWeb.RecordComponents do
|
|||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
attr :release, :map, required: true
|
||||||
|
|
||||||
|
def release_summary(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div class="grid w-full grid-cols-2 space-x-1 text-zinc-700 dark:text-zinc-300">
|
||||||
|
<div class="space-x-1">
|
||||||
|
<span :if={@release.catalog_number} class="font-mono text-sm">
|
||||||
|
{@release.catalog_number}
|
||||||
|
</span>
|
||||||
|
<.format_badge release={@release} />
|
||||||
|
</div>
|
||||||
|
<div class="text-right">
|
||||||
|
<span class="text-sm">{@release.date}</span>
|
||||||
|
<span>{country_label(@release.country)}</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-span-2">
|
||||||
|
<span class="text-xs text-zinc-900 dark:text-zinc-400">{@release.disambiguation}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :release, :map, required: true
|
||||||
|
|
||||||
|
defp format_badge(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.badge>
|
||||||
|
{@release |> ReleaseSearchResult.format() |> format_label()}
|
||||||
|
</.badge>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
def format_label(:cd), do: gettext("CD")
|
def format_label(:cd), do: gettext("CD")
|
||||||
def format_label(:backup), do: gettext("Backup")
|
def format_label(:backup), do: gettext("Backup")
|
||||||
def format_label(:vinyl), do: gettext("Vinyl")
|
def format_label(:vinyl), do: gettext("Vinyl")
|
||||||
def format_label(:blu_ray), do: gettext("Blu-ray")
|
def format_label(:blu_ray), do: gettext("Blu-ray")
|
||||||
def format_label(:dvd), do: gettext("DVD")
|
def format_label(:dvd), do: gettext("DVD")
|
||||||
def format_label(:multi), do: gettext("Multi")
|
def format_label(:multi), do: gettext("Multi")
|
||||||
|
def format_label(:digital_download), do: gettext("Digital Download")
|
||||||
|
|
||||||
def type_label(:album), do: gettext("Album")
|
def type_label(:album), do: gettext("Album")
|
||||||
def type_label(:ep), do: gettext("EP")
|
def type_label(:ep), do: gettext("EP")
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
close_actions_menu: 1,
|
close_actions_menu: 1,
|
||||||
format_label: 1,
|
format_label: 1,
|
||||||
type_label: 1,
|
type_label: 1,
|
||||||
selected_release_label: 1
|
release_summary: 1
|
||||||
]
|
]
|
||||||
|
|
||||||
alias MusicLibrary.{Records, ScrobbleActivity}
|
alias MusicLibrary.{Records, ScrobbleActivity}
|
||||||
|
|||||||
@@ -216,11 +216,22 @@
|
|||||||
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
|
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
|
||||||
{gettext("Collected release")}
|
{gettext("Collected release")}
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="mt-1 text-xs md:text-sm flex justify-between leading-6 text-zinc-700 dark:text-zinc-300 sm:col-span-2 sm:mt-0">
|
<dd class="mt-1 flex justify-between space-x-2 leading-6 sm:col-span-2 sm:mt-0">
|
||||||
<span>{selected_release_label(@record)}</span>
|
<span
|
||||||
|
:if={!@record.selected_release_id}
|
||||||
|
class="text-xs md:text-sm text-zinc-700 dark:text-zinc-300"
|
||||||
|
>
|
||||||
|
{gettext("No release selected")}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<.release_summary
|
||||||
|
:if={@record.selected_release_id}
|
||||||
|
release={Records.Record.selected_release(@record)}
|
||||||
|
/>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
:if={@record.selected_release_id}
|
:if={@record.selected_release_id}
|
||||||
|
class="text-xs md:text-sm text-zinc-700 dark:text-zinc-300"
|
||||||
phx-click={MusicLibraryWeb.ReleaseComponent.open("release-with-tracks-sheet")}
|
phx-click={MusicLibraryWeb.ReleaseComponent.open("release-with-tracks-sheet")}
|
||||||
>
|
>
|
||||||
<span class="sr-only">{gettext("Show Tracks")}</span>
|
<span class="sr-only">{gettext("Show Tracks")}</span>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
|
|||||||
close_actions_menu: 1,
|
close_actions_menu: 1,
|
||||||
format_label: 1,
|
format_label: 1,
|
||||||
type_label: 1,
|
type_label: 1,
|
||||||
selected_release_label: 1
|
release_summary: 1
|
||||||
]
|
]
|
||||||
|
|
||||||
alias MusicLibrary.Records
|
alias MusicLibrary.Records
|
||||||
|
|||||||
@@ -231,8 +231,18 @@
|
|||||||
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
|
<dt class="text-xs md:text-sm font-medium leading-6 text-zinc-900 dark:text-zinc-400">
|
||||||
{gettext("Collected release")}
|
{gettext("Collected release")}
|
||||||
</dt>
|
</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">
|
<dd class="mt-1 flex justify-between space-x-2 leading-6 sm:col-span-2 sm:mt-0">
|
||||||
{selected_release_label(@record)}
|
<span
|
||||||
|
:if={!@record.selected_release_id}
|
||||||
|
class="text-xs md:text-sm text-zinc-700 dark:text-zinc-300"
|
||||||
|
>
|
||||||
|
{gettext("No release selected")}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<.release_summary
|
||||||
|
:if={@record.selected_release_id}
|
||||||
|
release={Records.Record.selected_release(@record)}
|
||||||
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -732,6 +732,8 @@ msgid "Collected release"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/components/record_components.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
|
#: lib/music_library_web/live/collection_live/show.html.heex
|
||||||
|
#: lib/music_library_web/live/wishlist_live/show.html.heex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No release selected"
|
msgid "No release selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -860,3 +862,8 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Discogs data"
|
msgid "Discogs data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Digital Download"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
@@ -732,6 +732,8 @@ msgid "Collected release"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/components/record_components.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
|
#: lib/music_library_web/live/collection_live/show.html.heex
|
||||||
|
#: lib/music_library_web/live/wishlist_live/show.html.heex
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "No release selected"
|
msgid "No release selected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -860,3 +862,8 @@ msgstr ""
|
|||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Discogs data"
|
msgid "Discogs data"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
|
#, elixir-autogen, elixir-format
|
||||||
|
msgid "Digital Download"
|
||||||
|
msgstr ""
|
||||||
|
|||||||
Reference in New Issue
Block a user