Consolidate a few components

This commit is contained in:
Claudio Ortolina
2026-02-10 19:31:12 +00:00
parent 29b1c04433
commit 48c7d16c89
7 changed files with 60 additions and 73 deletions
@@ -1,29 +0,0 @@
defmodule MusicLibraryWeb.ArtistComponents do
use MusicLibraryWeb, :html
alias MusicLibrary.Assets.Transform
attr :artist, :map, required: true
attr :image_hash, :string, required: true
attr :class, :string, required: false, default: nil
attr :width, :integer, default: nil
attr :rest, :global
def artist_image(assigns) do
payload =
Transform.new(hash: assigns.image_hash, width: assigns.width)
|> Transform.encode!()
assigns = assign(assigns, :payload, payload)
~H"""
<img
class={@class}
src={~p"/assets/#{@payload}"}
alt={@artist.name}
onerror={"this.src = '" <> ~p"/images/cover-not-found.png" <> "';"}
{@rest}
/>
"""
end
end
@@ -6,6 +6,27 @@ defmodule MusicLibraryWeb.RecordComponents do
alias MusicLibrary.Records
alias Phoenix.LiveView.JS
attr :record, :map, required: true
attr :size, :atom, values: [:sm, :md], default: :sm
def release_groups_badge(assigns) do
~H"""
<span
:if={Records.Record.included_release_groups_count(@record) > 0}
class={[
"absolute right-0 bottom-0 rounded-br-lg rounded-tl-lg",
"font-medium",
"border border-zinc-600/20 dark:border-zinc-500/20",
@size == :sm &&
"px-1 text-xs bg-zinc-200/80 dark:bg-zinc-500/70 text-zinc-700 dark:text-zinc-200",
@size == :md && "px-2 text-sm bg-zinc-50 dark:bg-zinc-500/10 text-zinc-700 dark:text-zinc-400"
]}
>
{Records.Record.included_release_groups_count(@record)}
</span>
"""
end
attr :record, :map, required: true
attr :class, :string, required: false, default: "rounded-lg"
attr :width, :integer, default: nil
@@ -67,18 +88,7 @@ defmodule MusicLibraryWeb.RecordComponents do
<div class="flex min-w-0 gap-x-4 items-center">
<div class="relative w-20 flex-none">
<.record_cover record={record} width={160} />
<span
:if={Records.Record.included_release_groups_count(record) > 0}
class={[
"absolute right-0 bottom-0 rounded-br-lg rounded-tl-lg px-1",
"text-xs font-medium",
"bg-zinc-200/80 dark:bg-zinc-500/70",
"text-zinc-700 dark:text-zinc-200",
"border border-zinc-600/20 dark:border-zinc-500/20"
]}
>
{Records.Record.included_release_groups_count(record)}
</span>
<.release_groups_badge record={record} />
</div>
<div class="min-w-0 flex-auto">
<h1 class="text-sm leading-6 text-zinc-700">
@@ -251,18 +261,7 @@ defmodule MusicLibraryWeb.RecordComponents do
class="aspect-square object-cover rounded-lg group-hover:shadow-lg/20"
width={460}
/>
<span
:if={Records.Record.included_release_groups_count(record) > 0}
class={[
"absolute right-0 bottom-0 rounded-br-lg rounded-tl-lg px-2",
"text-sm font-medium",
"bg-zinc-50 dark:bg-zinc-500/10",
"text-zinc-700 dark:text-zinc-400",
"border border-zinc-600/20 dark:border-zinc-500/20"
]}
>
{Records.Record.included_release_groups_count(record)}
</span>
<.release_groups_badge record={record} size={:md} />
<div class="absolute right-2 top-2 rounded-full bg-zinc-100/50 hover:bg-zinc-100/75 dark:bg-zinc-700/50 dark:hover:bg-zinc-700/75 size-5">
<.dropdown id={"actions-#{record.id}"} placement="bottom-end">
<:toggle>
@@ -529,4 +528,28 @@ defmodule MusicLibraryWeb.RecordComponents do
</.sheet>
"""
end
attr :artist, :map, required: true
attr :image_hash, :string, required: true
attr :class, :string, required: false, default: nil
attr :width, :integer, default: nil
attr :rest, :global
def artist_image(assigns) do
payload =
Transform.new(hash: assigns.image_hash, width: assigns.width)
|> Transform.encode!()
assigns = assign(assigns, :payload, payload)
~H"""
<img
class={@class}
src={~p"/assets/#{@payload}"}
alt={@artist.name}
onerror={"this.src = '" <> ~p"/images/cover-not-found.png" <> "';"}
{@rest}
/>
"""
end
end
@@ -5,8 +5,8 @@ defmodule MusicLibraryWeb.SearchComponents do
use MusicLibraryWeb, :html
import MusicLibraryWeb.RecordComponents, only: [format_label: 1, type_label: 1, record_cover: 1]
import MusicLibraryWeb.ArtistComponents, only: [artist_image: 1]
import MusicLibraryWeb.RecordComponents,
only: [format_label: 1, type_label: 1, record_cover: 1, artist_image: 1]
alias MusicLibrary.Records.Record
alias MusicLibraryWeb.Markdown
@@ -2,7 +2,13 @@ defmodule MusicLibraryWeb.StatsComponents do
use MusicLibraryWeb, :live_component
import MusicLibraryWeb.RecordComponents,
only: [format_label: 1, type_label: 1, artist_links: 1, record_cover: 1]
only: [
format_label: 1,
type_label: 1,
artist_links: 1,
record_cover: 1,
release_groups_badge: 1
]
alias MusicLibrary.Records
@@ -167,18 +173,7 @@ defmodule MusicLibraryWeb.StatsComponents do
<div class="flex min-w-0 gap-x-4 items-center">
<div class="relative w-12 flex-none">
<.record_cover record={record} width={96} />
<span
:if={Records.Record.included_release_groups_count(record) > 0}
class={[
"absolute right-0 bottom-0 rounded-br-lg rounded-tl-lg px-1",
"text-xs font-medium",
"bg-zinc-200/80 dark:bg-zinc-500/70",
"text-zinc-700 dark:text-zinc-200",
"border border-zinc-600/20 dark:border-zinc-500/20"
]}
>
{Records.Record.included_release_groups_count(record)}
</span>
<.release_groups_badge record={record} />
</div>
<div class="min-w-0 flex-auto">
<h1 class="text-sm leading-6 text-zinc-700">
@@ -1,7 +1,7 @@
defmodule MusicLibraryWeb.ArtistLive.Form do
use MusicLibraryWeb, :live_component
import MusicLibraryWeb.ArtistComponents, only: [artist_image: 1]
import MusicLibraryWeb.RecordComponents, only: [artist_image: 1]
alias MusicLibrary.Artists
alias MusicLibrary.Assets
@@ -2,9 +2,7 @@ defmodule MusicLibraryWeb.ArtistLive.Show do
use MusicLibraryWeb, :live_view
import MusicLibraryWeb.RecordComponents,
only: [record_grid: 1, country_label: 1]
import MusicLibraryWeb.ArtistComponents, only: [artist_image: 1]
only: [record_grid: 1, country_label: 1, artist_image: 1]
alias MusicLibrary.{Artists, Records}
alias MusicLibrary.Artists.ArtistInfo
@@ -1,7 +1,7 @@
defmodule MusicLibraryWeb.StatsLive.TopArtists do
use MusicLibraryWeb, :live_component
import MusicLibraryWeb.ArtistComponents, only: [artist_image: 1]
import MusicLibraryWeb.RecordComponents, only: [artist_image: 1]
alias MusicLibrary.ScrobbleActivity