Extract common elements from record detail pages
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
defmodule MusicLibraryWeb.RecordComponents do
|
defmodule MusicLibraryWeb.RecordComponents do
|
||||||
use MusicLibraryWeb, :html
|
use MusicLibraryWeb, :html
|
||||||
|
|
||||||
|
alias MusicBrainz.ReleaseGroup
|
||||||
alias MusicBrainz.ReleaseSearchResult
|
alias MusicBrainz.ReleaseSearchResult
|
||||||
alias MusicLibrary.Assets.Transform
|
alias MusicLibrary.Assets.Transform
|
||||||
alias MusicLibrary.Country
|
alias MusicLibrary.Country
|
||||||
alias MusicLibrary.Records
|
alias MusicLibrary.Records
|
||||||
|
alias MusicLibrary.RecordSets.RecordSet
|
||||||
alias Phoenix.LiveView.JS
|
alias Phoenix.LiveView.JS
|
||||||
|
|
||||||
attr :record, :map, required: true
|
attr :record, :map, required: true
|
||||||
@@ -550,4 +552,201 @@ defmodule MusicLibraryWeb.RecordComponents do
|
|||||||
/>
|
/>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
attr :current_date, Date, default: nil
|
||||||
|
|
||||||
|
def record_title_and_metadata(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div>
|
||||||
|
<h2 class="mt-1 flex font-semibold text-lg md:text-2xl text-zinc-700 dark:text-zinc-300 text-wrap">
|
||||||
|
{@record.title}
|
||||||
|
</h2>
|
||||||
|
<p class="mt-2 flex items-center text-sm text-zinc-500 dark:text-zinc-400">
|
||||||
|
<.record_colors record={@record} />
|
||||||
|
<span class="ml-1">
|
||||||
|
<.icon
|
||||||
|
name="hero-calendar-days"
|
||||||
|
class="-mt-1 h-4 w-4"
|
||||||
|
aria-hidden="true"
|
||||||
|
data-slot="icon"
|
||||||
|
/>
|
||||||
|
{Records.Record.format_release_date(@record.release_date)}
|
||||||
|
<span :if={@current_date && !Records.Record.released?(@record, @current_date)}>
|
||||||
|
({gettext("Unreleased")})
|
||||||
|
</span>
|
||||||
|
· {format_label(@record.format)} · {type_label(@record.type)}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
|
||||||
|
def record_external_links(assigns) do
|
||||||
|
~H"""
|
||||||
|
<div class="mt-2 flex items-center gap-2">
|
||||||
|
<code id={"record-#{@record.id}"} class="hidden">{@record.id}</code>
|
||||||
|
<code id={"mb-#{@record.musicbrainz_id}"} class="hidden">
|
||||||
|
{@record.musicbrainz_id}
|
||||||
|
</code>
|
||||||
|
<.button
|
||||||
|
href={ReleaseGroup.url(@record.musicbrainz_id)}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
variant="ghost"
|
||||||
|
size="xs"
|
||||||
|
>
|
||||||
|
<.icon name="hero-arrow-top-right-on-square" class="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
{gettext("MusicBrainz")}
|
||||||
|
</.button>
|
||||||
|
<.button
|
||||||
|
variant="ghost"
|
||||||
|
size="xs"
|
||||||
|
phx-click={
|
||||||
|
JS.dispatch("music_library:clipcopy", to: "#record-#{@record.id}")
|
||||||
|
|> JS.transition("animate-shake")
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
{gettext("Copy ID")}
|
||||||
|
</.button>
|
||||||
|
<.button
|
||||||
|
variant="ghost"
|
||||||
|
size="xs"
|
||||||
|
phx-click={
|
||||||
|
JS.dispatch("music_library:clipcopy", to: "#mb-#{@record.musicbrainz_id}")
|
||||||
|
|> JS.transition("animate-shake")
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
{gettext("Copy MB ID")}
|
||||||
|
</.button>
|
||||||
|
</div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
attr :section, :atom, values: [:collection, :wishlist], required: true
|
||||||
|
|
||||||
|
def record_genres(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.dl_row label={gettext("Genres")}>
|
||||||
|
<.link
|
||||||
|
:for={genre <- @record.genres}
|
||||||
|
patch={genre_search_path(@section, genre)}
|
||||||
|
>
|
||||||
|
<.badge variant="soft">
|
||||||
|
{genre}
|
||||||
|
</.badge>
|
||||||
|
</.link>
|
||||||
|
</.dl_row>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
|
||||||
|
def record_published_releases(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.dl_row label={gettext("Published releases")}>
|
||||||
|
<div class="flex justify-between">
|
||||||
|
{Records.Record.release_count(@record)}
|
||||||
|
<.release_list record={@record} />
|
||||||
|
<button phx-click={Fluxon.open_dialog("release-list-" <> @record.id)}>
|
||||||
|
<span class="sr-only">
|
||||||
|
{gettext("Show releases included in the record")}
|
||||||
|
</span>
|
||||||
|
<.icon
|
||||||
|
name="hero-magnifying-glass-plus"
|
||||||
|
class="-mt-1 h-5 w-5"
|
||||||
|
aria-hidden="true"
|
||||||
|
data-slot="icon"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</.dl_row>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
|
||||||
|
def record_includes(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.dl_row
|
||||||
|
:if={Records.Record.included_release_groups_count(@record) > 0}
|
||||||
|
label={gettext("Includes")}
|
||||||
|
>
|
||||||
|
<ul>
|
||||||
|
<li :for={included_release_group <- Records.Record.included_release_groups(@record)}>
|
||||||
|
{included_release_group.artists} - {included_release_group.title}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</.dl_row>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record_sets, :list, required: true
|
||||||
|
|
||||||
|
def record_sets_list(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.dl_row :if={@record_sets != []} label={gettext("Record sets")}>
|
||||||
|
<ul>
|
||||||
|
<li :for={record_set <- @record_sets} class="flex items-baseline gap-2">
|
||||||
|
<.link
|
||||||
|
navigate={~p"/record-sets/#{record_set}"}
|
||||||
|
class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300 hover:underline"
|
||||||
|
>
|
||||||
|
{record_set.name}
|
||||||
|
</.link>
|
||||||
|
<span class="text-xs text-zinc-500 dark:text-zinc-400">
|
||||||
|
{gettext(
|
||||||
|
"%{collected}/%{total} collected",
|
||||||
|
RecordSet.count_by_status(record_set)
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</.dl_row>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
|
||||||
|
def record_timestamps(assigns) do
|
||||||
|
~H"""
|
||||||
|
<p class="mt-2 flex items-center gap-1.5 text-xs text-zinc-400 dark:text-zinc-500">
|
||||||
|
<.icon name="hero-clock" class="h-3.5 w-3.5" aria-hidden="true" />
|
||||||
|
{gettext("Added %{date}", date: Records.Record.format_as_date(@record.inserted_at))}
|
||||||
|
<span>·</span>
|
||||||
|
{gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))}
|
||||||
|
</p>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :record, Records.Record, required: true
|
||||||
|
attr :embedding_text, :string, required: true
|
||||||
|
|
||||||
|
def record_debug_sheet(assigns) do
|
||||||
|
~H"""
|
||||||
|
<.debug_data_sheet
|
||||||
|
id="debug-data"
|
||||||
|
items={[
|
||||||
|
%{
|
||||||
|
name: "musicbrainz",
|
||||||
|
title: gettext("MusicBrainz"),
|
||||||
|
data: @record.musicbrainz_data,
|
||||||
|
type: :json
|
||||||
|
},
|
||||||
|
%{name: "embedding", title: gettext("Embedding"), data: @embedding_text, type: :text}
|
||||||
|
]}
|
||||||
|
/>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
defp genre_search_path(:collection, genre),
|
||||||
|
do: ~p"/collection?#{%{query: ~s(genre:"#{genre}")}}"
|
||||||
|
|
||||||
|
defp genre_search_path(:wishlist, genre),
|
||||||
|
do: ~p"/wishlist?#{%{query: ~s(genre:"#{genre}")}}"
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,19 +5,22 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
import MusicLibraryWeb.RecordComponents,
|
||||||
only: [
|
only: [
|
||||||
format_label: 1,
|
|
||||||
type_label: 1,
|
|
||||||
release_summary: 1,
|
|
||||||
artist_links: 1,
|
artist_links: 1,
|
||||||
record_colors: 1,
|
|
||||||
record_cover: 1,
|
record_cover: 1,
|
||||||
release_list: 1,
|
record_debug_sheet: 1,
|
||||||
|
record_external_links: 1,
|
||||||
|
record_genres: 1,
|
||||||
|
record_includes: 1,
|
||||||
|
record_published_releases: 1,
|
||||||
|
record_sets_list: 1,
|
||||||
|
record_timestamps: 1,
|
||||||
|
record_title_and_metadata: 1,
|
||||||
|
release_summary: 1,
|
||||||
similar_records: 1
|
similar_records: 1
|
||||||
]
|
]
|
||||||
|
|
||||||
alias MusicLibrary.{Records, RecordSets, ScrobbleActivity}
|
alias MusicLibrary.{Records, RecordSets, ScrobbleActivity}
|
||||||
alias MusicLibrary.Records.Similarity
|
alias MusicLibrary.Records.Similarity
|
||||||
alias MusicLibrary.RecordSets.RecordSet
|
|
||||||
alias Phoenix.LiveView.JS
|
alias Phoenix.LiveView.JS
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
@@ -212,75 +215,11 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
</.button_group>
|
</.button_group>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<.record_title_and_metadata record={@record} />
|
||||||
<h2 class="mt-1 flex font-semibold text-lg md:text-2xl text-zinc-700 dark:text-zinc-300 text-wrap">
|
<.record_external_links record={@record} />
|
||||||
{@record.title}
|
|
||||||
</h2>
|
|
||||||
<p class="mt-2 flex items-center text-sm text-zinc-500 dark:text-zinc-400">
|
|
||||||
<.record_colors record={@record} />
|
|
||||||
<span class="ml-1">
|
|
||||||
<.icon
|
|
||||||
name="hero-calendar-days"
|
|
||||||
class="-mt-1 h-4 w-4"
|
|
||||||
aria-hidden="true"
|
|
||||||
data-slot="icon"
|
|
||||||
/>
|
|
||||||
{Records.Record.format_release_date(@record.release_date)} · {format_label(
|
|
||||||
@record.format
|
|
||||||
)} · {type_label(@record.type)}
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="mt-2 flex items-center gap-2">
|
|
||||||
<code id={"record-#{@record.id}"} class="hidden">{@record.id}</code>
|
|
||||||
<code id={"mb-#{@record.musicbrainz_id}"} class="hidden">
|
|
||||||
{@record.musicbrainz_id}
|
|
||||||
</code>
|
|
||||||
<.button
|
|
||||||
href={MusicBrainz.ReleaseGroup.url(@record.musicbrainz_id)}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
>
|
|
||||||
<.icon name="hero-arrow-top-right-on-square" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("MusicBrainz")}
|
|
||||||
</.button>
|
|
||||||
<.button
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
phx-click={
|
|
||||||
JS.dispatch("music_library:clipcopy", to: "#record-#{@record.id}")
|
|
||||||
|> JS.transition("animate-shake")
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Copy ID")}
|
|
||||||
</.button>
|
|
||||||
<.button
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
phx-click={
|
|
||||||
JS.dispatch("music_library:clipcopy", to: "#mb-#{@record.musicbrainz_id}")
|
|
||||||
|> JS.transition("animate-shake")
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Copy MB ID")}
|
|
||||||
</.button>
|
|
||||||
</div>
|
|
||||||
<div class="mt-4 md:mt-8">
|
<div class="mt-4 md:mt-8">
|
||||||
<dl class="divide-y divide-zinc-100 dark:divide-slate-300/30">
|
<dl class="divide-y divide-zinc-100 dark:divide-slate-300/30">
|
||||||
<.dl_row label={gettext("Genres")}>
|
<.record_genres record={@record} section={:collection} />
|
||||||
<.link
|
|
||||||
:for={genre <- @record.genres}
|
|
||||||
patch={~p"/collection?#{%{query: ~s(genre:"#{genre}")}}"}
|
|
||||||
>
|
|
||||||
<.badge variant="soft">
|
|
||||||
{genre}
|
|
||||||
</.badge>
|
|
||||||
</.link>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row label={gettext("Purchased on")}>
|
<.dl_row label={gettext("Purchased on")}>
|
||||||
{Records.Record.format_as_date(@record.purchased_at)}
|
{Records.Record.format_as_date(@record.purchased_at)}
|
||||||
</.dl_row>
|
</.dl_row>
|
||||||
@@ -295,23 +234,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
{ngettext("(1 scrobble)", "(%{count} scrobbles)", @play_count)}
|
{ngettext("(1 scrobble)", "(%{count} scrobbles)", @play_count)}
|
||||||
</span>
|
</span>
|
||||||
</.dl_row>
|
</.dl_row>
|
||||||
<.dl_row label={gettext("Published releases")}>
|
<.record_published_releases record={@record} />
|
||||||
<div class="flex justify-between">
|
|
||||||
{Records.Record.release_count(@record)}
|
|
||||||
<.release_list record={@record} />
|
|
||||||
<button phx-click={Fluxon.open_dialog("release-list-" <> @record.id)}>
|
|
||||||
<span class="sr-only">
|
|
||||||
{gettext("Show releases included in the record")}
|
|
||||||
</span>
|
|
||||||
<.icon
|
|
||||||
name="hero-magnifying-glass-plus"
|
|
||||||
class="-mt-1 h-5 w-5"
|
|
||||||
aria-hidden="true"
|
|
||||||
data-slot="icon"
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row label={gettext("Collected release")}>
|
<.dl_row label={gettext("Collected release")}>
|
||||||
<div class="flex justify-between space-x-2">
|
<div class="flex justify-between space-x-2">
|
||||||
<span
|
<span
|
||||||
@@ -338,41 +261,10 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</.dl_row>
|
</.dl_row>
|
||||||
<.dl_row
|
<.record_includes record={@record} />
|
||||||
:if={Records.Record.included_release_groups_count(@record) > 0}
|
<.record_sets_list record_sets={@record_sets} />
|
||||||
label={gettext("Includes")}
|
|
||||||
>
|
|
||||||
<ul>
|
|
||||||
<li :for={included_release_group <- Records.Record.included_release_groups(@record)}>
|
|
||||||
{included_release_group.artists} - {included_release_group.title}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row :if={@record_sets != []} label={gettext("Record sets")}>
|
|
||||||
<ul>
|
|
||||||
<li :for={record_set <- @record_sets} class="flex items-baseline gap-2">
|
|
||||||
<.link
|
|
||||||
navigate={~p"/record-sets/#{record_set}"}
|
|
||||||
class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300 hover:underline"
|
|
||||||
>
|
|
||||||
{record_set.name}
|
|
||||||
</.link>
|
|
||||||
<span class="text-xs text-zinc-500 dark:text-zinc-400">
|
|
||||||
{gettext(
|
|
||||||
"%{collected}/%{total} collected",
|
|
||||||
RecordSet.count_by_status(record_set)
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</.dl_row>
|
|
||||||
</dl>
|
</dl>
|
||||||
<p class="mt-2 flex items-center gap-1.5 text-xs text-zinc-400 dark:text-zinc-500">
|
<.record_timestamps record={@record} />
|
||||||
<.icon name="hero-clock" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Added %{date}", date: Records.Record.format_as_date(@record.inserted_at))}
|
|
||||||
<span>·</span>
|
|
||||||
{gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -383,18 +275,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
|
|||||||
section={:collection}
|
section={:collection}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<.debug_data_sheet
|
<.record_debug_sheet record={@record} embedding_text={@embedding_text} />
|
||||||
id="debug-data"
|
|
||||||
items={[
|
|
||||||
%{
|
|
||||||
name: "musicbrainz",
|
|
||||||
title: gettext("MusicBrainz"),
|
|
||||||
data: @record.musicbrainz_data,
|
|
||||||
type: :json
|
|
||||||
},
|
|
||||||
%{name: "embedding", title: gettext("Embedding"), data: @embedding_text, type: :text}
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<.live_component
|
<.live_component
|
||||||
id="release-with-tracks"
|
id="release-with-tracks"
|
||||||
|
|||||||
@@ -3,19 +3,22 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
|
|||||||
|
|
||||||
import MusicLibraryWeb.RecordComponents,
|
import MusicLibraryWeb.RecordComponents,
|
||||||
only: [
|
only: [
|
||||||
format_label: 1,
|
|
||||||
type_label: 1,
|
|
||||||
release_summary: 1,
|
|
||||||
artist_links: 1,
|
artist_links: 1,
|
||||||
record_colors: 1,
|
|
||||||
record_cover: 1,
|
record_cover: 1,
|
||||||
release_list: 1
|
record_debug_sheet: 1,
|
||||||
|
record_external_links: 1,
|
||||||
|
record_genres: 1,
|
||||||
|
record_includes: 1,
|
||||||
|
record_published_releases: 1,
|
||||||
|
record_sets_list: 1,
|
||||||
|
record_timestamps: 1,
|
||||||
|
record_title_and_metadata: 1,
|
||||||
|
release_summary: 1
|
||||||
]
|
]
|
||||||
|
|
||||||
alias MusicLibrary.OnlineStoreTemplates
|
alias MusicLibrary.OnlineStoreTemplates
|
||||||
alias MusicLibrary.{Records, RecordSets}
|
alias MusicLibrary.{Records, RecordSets}
|
||||||
alias MusicLibrary.Records.Similarity
|
alias MusicLibrary.Records.Similarity
|
||||||
alias MusicLibrary.RecordSets.RecordSet
|
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
@@ -188,95 +191,12 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
|
|||||||
</.button_group>
|
</.button_group>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<.record_title_and_metadata record={@record} current_date={@current_date} />
|
||||||
<h2 class="mt-1 flex font-semibold text-lg md:text-2xl text-zinc-700 dark:text-zinc-300 text-wrap">
|
<.record_external_links record={@record} />
|
||||||
{@record.title}
|
|
||||||
</h2>
|
|
||||||
<p class="flex items-center mt-2 text-sm text-zinc-500 dark:text-zinc-400">
|
|
||||||
<.record_colors record={@record} />
|
|
||||||
|
|
||||||
<span class="ml-1">
|
|
||||||
<.icon
|
|
||||||
name="hero-calendar-days"
|
|
||||||
class="-mt-1 h-4 w-4"
|
|
||||||
aria-hidden="true"
|
|
||||||
data-slot="icon"
|
|
||||||
/>
|
|
||||||
{Records.Record.format_release_date(@record.release_date)}
|
|
||||||
<span :if={@current_date && !Records.Record.released?(@record, @current_date)}>
|
|
||||||
({gettext("Unreleased")})
|
|
||||||
</span>
|
|
||||||
· {format_label(@record.format)} · {type_label(@record.type)}
|
|
||||||
</span>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="mt-2 flex items-center gap-2">
|
|
||||||
<code id={"record-#{@record.id}"} class="hidden">{@record.id}</code>
|
|
||||||
<code id={"mb-#{@record.musicbrainz_id}"} class="hidden">
|
|
||||||
{@record.musicbrainz_id}
|
|
||||||
</code>
|
|
||||||
<.button
|
|
||||||
href={MusicBrainz.ReleaseGroup.url(@record.musicbrainz_id)}
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
>
|
|
||||||
<.icon name="hero-arrow-top-right-on-square" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("MusicBrainz")}
|
|
||||||
</.button>
|
|
||||||
<.button
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
phx-click={
|
|
||||||
JS.dispatch("music_library:clipcopy", to: "#record-#{@record.id}")
|
|
||||||
|> JS.transition("animate-shake")
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Copy ID")}
|
|
||||||
</.button>
|
|
||||||
<.button
|
|
||||||
variant="ghost"
|
|
||||||
size="xs"
|
|
||||||
phx-click={
|
|
||||||
JS.dispatch("music_library:clipcopy", to: "#mb-#{@record.musicbrainz_id}")
|
|
||||||
|> JS.transition("animate-shake")
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<.icon name="hero-clipboard-document" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Copy MB ID")}
|
|
||||||
</.button>
|
|
||||||
</div>
|
|
||||||
<div class="mt-4 md:mt-8">
|
<div class="mt-4 md:mt-8">
|
||||||
<dl class="divide-y divide-zinc-100 dark:divide-slate-300/30">
|
<dl class="divide-y divide-zinc-100 dark:divide-slate-300/30">
|
||||||
<.dl_row label={gettext("Genres")}>
|
<.record_genres record={@record} section={:wishlist} />
|
||||||
<.link
|
<.record_published_releases record={@record} />
|
||||||
:for={genre <- @record.genres}
|
|
||||||
patch={~p"/wishlist?#{%{query: ~s(genre:"#{genre}")}}"}
|
|
||||||
>
|
|
||||||
<.badge variant="soft">
|
|
||||||
{genre}
|
|
||||||
</.badge>
|
|
||||||
</.link>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row label={gettext("Published releases")}>
|
|
||||||
<div class="flex justify-between">
|
|
||||||
{Records.Record.release_count(@record)}
|
|
||||||
<.release_list record={@record} />
|
|
||||||
<button phx-click={Fluxon.open_dialog("release-list-" <> @record.id)}>
|
|
||||||
<span class="sr-only">
|
|
||||||
{gettext("Show releases included in the record")}
|
|
||||||
</span>
|
|
||||||
<.icon
|
|
||||||
name="hero-magnifying-glass-plus"
|
|
||||||
class="-mt-1 h-5 w-5"
|
|
||||||
aria-hidden="true"
|
|
||||||
data-slot="icon"
|
|
||||||
/>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row label={gettext("Wishlisted release")}>
|
<.dl_row label={gettext("Wishlisted release")}>
|
||||||
<div class="flex justify-between space-x-2">
|
<div class="flex justify-between space-x-2">
|
||||||
<span
|
<span
|
||||||
@@ -291,41 +211,10 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</.dl_row>
|
</.dl_row>
|
||||||
<.dl_row
|
<.record_includes record={@record} />
|
||||||
:if={Records.Record.included_release_groups_count(@record) > 0}
|
<.record_sets_list record_sets={@record_sets} />
|
||||||
label={gettext("Includes")}
|
|
||||||
>
|
|
||||||
<ul>
|
|
||||||
<li :for={included_release_group <- Records.Record.included_release_groups(@record)}>
|
|
||||||
{included_release_group.artists} - {included_release_group.title}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</.dl_row>
|
|
||||||
<.dl_row :if={@record_sets != []} label={gettext("Record sets")}>
|
|
||||||
<ul>
|
|
||||||
<li :for={record_set <- @record_sets} class="flex items-baseline gap-2">
|
|
||||||
<.link
|
|
||||||
navigate={~p"/record-sets/#{record_set}"}
|
|
||||||
class="text-zinc-700 hover:text-zinc-500 dark:text-zinc-400 dark:hover:text-zinc-300 hover:underline"
|
|
||||||
>
|
|
||||||
{record_set.name}
|
|
||||||
</.link>
|
|
||||||
<span class="text-xs text-zinc-500 dark:text-zinc-400">
|
|
||||||
{gettext(
|
|
||||||
"%{collected}/%{total} collected",
|
|
||||||
RecordSet.count_by_status(record_set)
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</.dl_row>
|
|
||||||
</dl>
|
</dl>
|
||||||
<p class="mt-2 flex items-center gap-1.5 text-xs text-zinc-400 dark:text-zinc-500">
|
<.record_timestamps record={@record} />
|
||||||
<.icon name="hero-clock" class="h-3.5 w-3.5" aria-hidden="true" />
|
|
||||||
{gettext("Added %{date}", date: Records.Record.format_as_date(@record.inserted_at))}
|
|
||||||
<span>·</span>
|
|
||||||
{gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -359,18 +248,7 @@ defmodule MusicLibraryWeb.WishlistLive.Show do
|
|||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<.debug_data_sheet
|
<.record_debug_sheet record={@record} embedding_text={@embedding_text} />
|
||||||
id="debug-data"
|
|
||||||
items={[
|
|
||||||
%{
|
|
||||||
name: "musicbrainz",
|
|
||||||
title: gettext("MusicBrainz"),
|
|
||||||
data: @record.musicbrainz_data,
|
|
||||||
type: :json
|
|
||||||
},
|
|
||||||
%{name: "embedding", title: gettext("Embedding"), data: @embedding_text, type: :text}
|
|
||||||
]}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<.live_component
|
<.live_component
|
||||||
id="record-chat"
|
id="record-chat"
|
||||||
|
|||||||
+12
-25
@@ -79,9 +79,8 @@ msgstr ""
|
|||||||
msgid "Formats"
|
msgid "Formats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/components/record_form.ex
|
#: lib/music_library_web/components/record_form.ex
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Genres"
|
msgid "Genres"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -263,8 +262,7 @@ msgstr ""
|
|||||||
msgid "Wishlisted"
|
msgid "Wishlisted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Includes"
|
msgid "Includes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -389,7 +387,6 @@ msgstr[0] ""
|
|||||||
msgstr[1] ""
|
msgstr[1] ""
|
||||||
|
|
||||||
#: lib/music_library_web/components/record_components.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Unreleased"
|
msgid "Unreleased"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -471,8 +468,7 @@ msgstr ""
|
|||||||
msgid "Record added to the collection"
|
msgid "Record added to the collection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published releases"
|
msgid "Published releases"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1578,8 +1574,7 @@ msgstr ""
|
|||||||
msgid "Available releases"
|
msgid "Available releases"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show releases included in the record"
|
msgid "Show releases included in the record"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1881,14 +1876,12 @@ msgstr ""
|
|||||||
msgid "Try a different search term or check the spelling"
|
msgid "Try a different search term or check the spelling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "%{collected}/%{total} collected"
|
msgid "%{collected}/%{total} collected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Record sets"
|
msgid "Record sets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1967,33 +1960,28 @@ msgstr ""
|
|||||||
msgid "Could not search MusicBrainz. Please try again."
|
msgid "Could not search MusicBrainz. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{date}"
|
msgid "Added %{date}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/artist_live/show.ex
|
#: lib/music_library_web/live/artist_live/show.ex
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "MusicBrainz"
|
msgid "MusicBrainz"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Updated %{date}"
|
msgid "Updated %{date}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy ID"
|
msgid "Copy ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy MB ID"
|
msgid "Copy MB ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2011,8 +1999,7 @@ msgstr ""
|
|||||||
msgid "Discogs"
|
msgid "Discogs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Embedding"
|
msgid "Embedding"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -79,9 +79,8 @@ msgstr ""
|
|||||||
msgid "Formats"
|
msgid "Formats"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/components/record_form.ex
|
#: lib/music_library_web/components/record_form.ex
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Genres"
|
msgid "Genres"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -263,8 +262,7 @@ msgstr ""
|
|||||||
msgid "Wishlisted"
|
msgid "Wishlisted"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Includes"
|
msgid "Includes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -389,7 +387,6 @@ msgstr[0] ""
|
|||||||
msgstr[1] ""
|
msgstr[1] ""
|
||||||
|
|
||||||
#: lib/music_library_web/components/record_components.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Unreleased"
|
msgid "Unreleased"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -471,8 +468,7 @@ msgstr ""
|
|||||||
msgid "Record added to the collection"
|
msgid "Record added to the collection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Published releases"
|
msgid "Published releases"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1578,8 +1574,7 @@ msgstr ""
|
|||||||
msgid "Available releases"
|
msgid "Available releases"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Show releases included in the record"
|
msgid "Show releases included in the record"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1881,14 +1876,12 @@ msgstr ""
|
|||||||
msgid "Try a different search term or check the spelling"
|
msgid "Try a different search term or check the spelling"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "%{collected}/%{total} collected"
|
msgid "%{collected}/%{total} collected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Record sets"
|
msgid "Record sets"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -1967,33 +1960,28 @@ msgstr ""
|
|||||||
msgid "Could not search MusicBrainz. Please try again."
|
msgid "Could not search MusicBrainz. Please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Added %{date}"
|
msgid "Added %{date}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/artist_live/show.ex
|
#: lib/music_library_web/live/artist_live/show.ex
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "MusicBrainz"
|
msgid "MusicBrainz"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Updated %{date}"
|
msgid "Updated %{date}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Copy ID"
|
msgid "Copy ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format, fuzzy
|
#, elixir-autogen, elixir-format, fuzzy
|
||||||
msgid "Copy MB ID"
|
msgid "Copy MB ID"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -2011,8 +1999,7 @@ msgstr ""
|
|||||||
msgid "Discogs"
|
msgid "Discogs"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/music_library_web/live/collection_live/show.ex
|
#: lib/music_library_web/components/record_components.ex
|
||||||
#: lib/music_library_web/live/wishlist_live/show.ex
|
|
||||||
#, elixir-autogen, elixir-format
|
#, elixir-autogen, elixir-format
|
||||||
msgid "Embedding"
|
msgid "Embedding"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
Reference in New Issue
Block a user