diff --git a/lib/music_library_web/components/record_components.ex b/lib/music_library_web/components/record_components.ex index 1f490237..a332daa7 100644 --- a/lib/music_library_web/components/record_components.ex +++ b/lib/music_library_web/components/record_components.ex @@ -1,10 +1,12 @@ defmodule MusicLibraryWeb.RecordComponents do use MusicLibraryWeb, :html + alias MusicBrainz.ReleaseGroup alias MusicBrainz.ReleaseSearchResult alias MusicLibrary.Assets.Transform alias MusicLibrary.Country alias MusicLibrary.Records + alias MusicLibrary.RecordSets.RecordSet alias Phoenix.LiveView.JS attr :record, :map, required: true @@ -550,4 +552,201 @@ defmodule MusicLibraryWeb.RecordComponents do /> """ end + + attr :record, Records.Record, required: true + attr :current_date, Date, default: nil + + def record_title_and_metadata(assigns) do + ~H""" +
+

+ {@record.title} +

+

+ <.record_colors record={@record} /> + + <.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)} + + ({gettext("Unreleased")}) + + · {format_label(@record.format)} · {type_label(@record.type)} + +

+
+ """ + end + + attr :record, Records.Record, required: true + + def record_external_links(assigns) do + ~H""" +
+ + + <.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 + 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 + 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")} + +
+ """ + 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} + + + + """ + end + + attr :record, Records.Record, required: true + + def record_published_releases(assigns) do + ~H""" + <.dl_row label={gettext("Published releases")}> +
+ {Records.Record.release_count(@record)} + <.release_list record={@record} /> + +
+ + """ + 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")} + > + + + """ + end + + attr :record_sets, :list, required: true + + def record_sets_list(assigns) do + ~H""" + <.dl_row :if={@record_sets != []} label={gettext("Record sets")}> + + + """ + end + + attr :record, Records.Record, required: true + + def record_timestamps(assigns) do + ~H""" +

+ <.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))} + · + {gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))} +

+ """ + 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 diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index 40374bb4..4682c735 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -5,19 +5,22 @@ defmodule MusicLibraryWeb.CollectionLive.Show do import MusicLibraryWeb.RecordComponents, only: [ - format_label: 1, - type_label: 1, - release_summary: 1, artist_links: 1, - record_colors: 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 ] alias MusicLibrary.{Records, RecordSets, ScrobbleActivity} alias MusicLibrary.Records.Similarity - alias MusicLibrary.RecordSets.RecordSet alias Phoenix.LiveView.JS @impl true @@ -212,75 +215,11 @@ defmodule MusicLibraryWeb.CollectionLive.Show do -
-

- {@record.title} -

-

- <.record_colors record={@record} /> - - <.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)} - -

-
-
- - - <.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 - 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 - 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")} - -
+ <.record_title_and_metadata record={@record} /> + <.record_external_links record={@record} />
- <.dl_row label={gettext("Genres")}> - <.link - :for={genre <- @record.genres} - patch={~p"/collection?#{%{query: ~s(genre:"#{genre}")}}"} - > - <.badge variant="soft"> - {genre} - - - + <.record_genres record={@record} section={:collection} /> <.dl_row label={gettext("Purchased on")}> {Records.Record.format_as_date(@record.purchased_at)} @@ -295,23 +234,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do {ngettext("(1 scrobble)", "(%{count} scrobbles)", @play_count)} - <.dl_row label={gettext("Published releases")}> -
- {Records.Record.release_count(@record)} - <.release_list record={@record} /> - -
- + <.record_published_releases record={@record} /> <.dl_row label={gettext("Collected release")}>
- <.dl_row - :if={Records.Record.included_release_groups_count(@record) > 0} - label={gettext("Includes")} - > - - - <.dl_row :if={@record_sets != []} label={gettext("Record sets")}> - - + <.record_includes record={@record} /> + <.record_sets_list record_sets={@record_sets} />
-

- <.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))} - · - {gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))} -

+ <.record_timestamps record={@record} />
@@ -383,18 +275,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do section={:collection} /> - <.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} - ]} - /> + <.record_debug_sheet record={@record} embedding_text={@embedding_text} /> <.live_component id="release-with-tracks" diff --git a/lib/music_library_web/live/wishlist_live/show.ex b/lib/music_library_web/live/wishlist_live/show.ex index 487aa758..f4e5c383 100644 --- a/lib/music_library_web/live/wishlist_live/show.ex +++ b/lib/music_library_web/live/wishlist_live/show.ex @@ -3,19 +3,22 @@ defmodule MusicLibraryWeb.WishlistLive.Show do import MusicLibraryWeb.RecordComponents, only: [ - format_label: 1, - type_label: 1, - release_summary: 1, artist_links: 1, - record_colors: 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.{Records, RecordSets} alias MusicLibrary.Records.Similarity - alias MusicLibrary.RecordSets.RecordSet @impl true def render(assigns) do @@ -188,95 +191,12 @@ defmodule MusicLibraryWeb.WishlistLive.Show do -
-

- {@record.title} -

-

- <.record_colors record={@record} /> - - - <.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)} - - ({gettext("Unreleased")}) - - · {format_label(@record.format)} · {type_label(@record.type)} - -

-
-
- - - <.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 - 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 - 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")} - -
+ <.record_title_and_metadata record={@record} current_date={@current_date} /> + <.record_external_links record={@record} />
- <.dl_row label={gettext("Genres")}> - <.link - :for={genre <- @record.genres} - patch={~p"/wishlist?#{%{query: ~s(genre:"#{genre}")}}"} - > - <.badge variant="soft"> - {genre} - - - - <.dl_row label={gettext("Published releases")}> -
- {Records.Record.release_count(@record)} - <.release_list record={@record} /> - -
- + <.record_genres record={@record} section={:wishlist} /> + <.record_published_releases record={@record} /> <.dl_row label={gettext("Wishlisted release")}>
- <.dl_row - :if={Records.Record.included_release_groups_count(@record) > 0} - label={gettext("Includes")} - > - - - <.dl_row :if={@record_sets != []} label={gettext("Record sets")}> - - + <.record_includes record={@record} /> + <.record_sets_list record_sets={@record_sets} />
-

- <.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))} - · - {gettext("Updated %{date}", date: Records.Record.format_as_date(@record.updated_at))} -

+ <.record_timestamps record={@record} />
@@ -359,18 +248,7 @@ defmodule MusicLibraryWeb.WishlistLive.Show do - <.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} - ]} - /> + <.record_debug_sheet record={@record} embedding_text={@embedding_text} /> <.live_component id="record-chat" diff --git a/priv/gettext/default.pot b/priv/gettext/default.pot index 9f7d4aac..9f29f6b2 100644 --- a/priv/gettext/default.pot +++ b/priv/gettext/default.pot @@ -79,9 +79,8 @@ msgstr "" msgid "Formats" msgstr "" +#: lib/music_library_web/components/record_components.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 msgid "Genres" msgstr "" @@ -263,8 +262,7 @@ msgstr "" msgid "Wishlisted" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Includes" msgstr "" @@ -389,7 +387,6 @@ msgstr[0] "" msgstr[1] "" #: lib/music_library_web/components/record_components.ex -#: lib/music_library_web/live/wishlist_live/show.ex #, elixir-autogen, elixir-format msgid "Unreleased" msgstr "" @@ -471,8 +468,7 @@ msgstr "" msgid "Record added to the collection" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Published releases" msgstr "" @@ -1578,8 +1574,7 @@ msgstr "" msgid "Available releases" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Show releases included in the record" msgstr "" @@ -1881,14 +1876,12 @@ msgstr "" msgid "Try a different search term or check the spelling" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "%{collected}/%{total} collected" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Record sets" msgstr "" @@ -1967,33 +1960,28 @@ msgstr "" msgid "Could not search MusicBrainz. Please try again." msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Added %{date}" msgstr "" +#: lib/music_library_web/components/record_components.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 msgid "MusicBrainz" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Updated %{date}" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Copy ID" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Copy MB ID" msgstr "" @@ -2011,8 +1999,7 @@ msgstr "" msgid "Discogs" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Embedding" msgstr "" diff --git a/priv/gettext/en/LC_MESSAGES/default.po b/priv/gettext/en/LC_MESSAGES/default.po index 122d14a6..a48ae435 100644 --- a/priv/gettext/en/LC_MESSAGES/default.po +++ b/priv/gettext/en/LC_MESSAGES/default.po @@ -79,9 +79,8 @@ msgstr "" msgid "Formats" msgstr "" +#: lib/music_library_web/components/record_components.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 msgid "Genres" msgstr "" @@ -263,8 +262,7 @@ msgstr "" msgid "Wishlisted" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Includes" msgstr "" @@ -389,7 +387,6 @@ msgstr[0] "" msgstr[1] "" #: lib/music_library_web/components/record_components.ex -#: lib/music_library_web/live/wishlist_live/show.ex #, elixir-autogen, elixir-format msgid "Unreleased" msgstr "" @@ -471,8 +468,7 @@ msgstr "" msgid "Record added to the collection" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Published releases" msgstr "" @@ -1578,8 +1574,7 @@ msgstr "" msgid "Available releases" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Show releases included in the record" msgstr "" @@ -1881,14 +1876,12 @@ msgstr "" msgid "Try a different search term or check the spelling" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format, fuzzy msgid "%{collected}/%{total} collected" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format, fuzzy msgid "Record sets" msgstr "" @@ -1967,33 +1960,28 @@ msgstr "" msgid "Could not search MusicBrainz. Please try again." msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Added %{date}" msgstr "" +#: lib/music_library_web/components/record_components.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 msgid "MusicBrainz" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format, fuzzy msgid "Updated %{date}" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Copy ID" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format, fuzzy msgid "Copy MB ID" msgstr "" @@ -2011,8 +1999,7 @@ msgstr "" msgid "Discogs" msgstr "" -#: lib/music_library_web/live/collection_live/show.ex -#: lib/music_library_web/live/wishlist_live/show.ex +#: lib/music_library_web/components/record_components.ex #, elixir-autogen, elixir-format msgid "Embedding" msgstr ""