diff --git a/lib/music_library_web/live/record_set_live/index.ex b/lib/music_library_web/live/record_set_live/index.ex index 7275310f..d7afcf87 100644 --- a/lib/music_library_web/live/record_set_live/index.ex +++ b/lib/music_library_web/live/record_set_live/index.ex @@ -67,196 +67,12 @@ defmodule MusicLibraryWeb.RecordSetLive.Index do

-
  • -
    -
    -
    -

    - <.link navigate={~p"/record-sets/#{record_set}"} class="hover:underline"> - {record_set.name} - -

    - - {gettext("%{collected}/%{total} records", RecordSet.count_by_status(record_set))} - -
    -
    - {render_description(record_set.description)} -
    -
    -
    - <.dropdown id={"set-actions-#{record_set.id}"} placement="bottom-end"> - <:toggle> - <.button variant="soft"> - {gettext("Actions")} - <.icon - name="hero-ellipsis-vertical" - class="h-5 w-5 text-zinc-500 dark:text-zinc-400 cursor-pointer" - aria-hidden="true" - data-slot="icon" - /> - - - <.dropdown_link - id={"set-actions-#{record_set.id}-edit"} - patch={ - ~p"/record-sets/#{record_set}/edit?#{Map.take(@list_params, [:query, :page, :page_size, :order]) |> Enum.filter(fn {_, v} -> v not in ["", nil] end)}" - } - > - {gettext("Edit")} - - <.separator /> - <.dropdown_button - phx-click="delete_set" - phx-value-id={record_set.id} - data-confirm={gettext("Are you sure?")} - class={[ - "text-red-900! hover:bg-red-50! dark:text-red-500! dark:hover:bg-red-900/30! dark:hover:text-red-600!" - ]} - > - {gettext("Delete")} - - -
    -
    - -
    -
    - <.link - :if={item.record.purchased_at} - navigate={~p"/collection/#{item.record}"} - > - - - <.link - :if={!item.record.purchased_at} - navigate={~p"/wishlist/#{item.record}"} - > - - -
    - <.icon - name="hero-bars-2" - class="size-3.5 text-zinc-800 dark:text-zinc-200" - aria-hidden="true" - /> -
    -
    - <.dropdown - id={"item-actions-#{record_set.id}-#{item.record.id}"} - placement="bottom-end" - > - <:toggle> - {gettext("Actions")} - <.icon - name="hero-ellipsis-vertical" - class="size-5 text-zinc-800 dark:text-zinc-200 cursor-pointer" - aria-hidden="true" - data-slot="icon" - /> - - <.dropdown_button - :if={item.position > 0} - phx-click="move_up" - phx-value-set-id={record_set.id} - phx-value-record-id={item.record.id} - > - {gettext("Move left")} - - <.dropdown_button - :if={item.position < length(record_set.items) - 1} - phx-click="move_down" - phx-value-set-id={record_set.id} - phx-value-record-id={item.record.id} - > - {gettext("Move right")} - - <.separator /> - <.dropdown_button - phx-click="remove_record" - phx-value-set-id={record_set.id} - phx-value-record-id={item.record.id} - data-confirm={gettext("Remove this record from the set?")} - class={[ - "text-red-900! hover:bg-red-50! dark:text-red-500! dark:hover:bg-red-900/30! dark:hover:text-red-600!" - ]} - > - {gettext("Remove")} - - -
    -

    - <.artist_links joinphrase_class="text-sm" artists={item.record.artists} /> -

    -

    - {item.record.title} -

    -

    - {format_label(item.record.format)} · {type_label(item.record.type)} -

    -

    - <.icon - name="hero-calendar-days" - class="-mt-1 h-4 w-4" - aria-hidden="true" - data-slot="icon" - /> - {Records.Record.format_release_date(item.record.release_date)} -

    -
    - - <.link - patch={~p"/record-sets/#{record_set}/add-record"} - class={[ - "flex-none aspect-square", - "border-2 border-dashed border-zinc-300 dark:border-zinc-600", - "rounded-lg flex items-center justify-center", - "hover:border-zinc-400 dark:hover:border-zinc-500", - "hover:bg-zinc-50 dark:hover:bg-zinc-800", - "transition-colors cursor-pointer" - ]} - > - <.icon - name="hero-plus" - class="h-8 w-8 text-zinc-400 dark:text-zinc-500" - aria-hidden="true" - data-slot="icon" - /> - -
    -
  • + record_set={record_set} + list_params={@list_params} + /> <.pagination id={:bottom_pagination} pagination_params={@list_params} /> @@ -451,6 +267,204 @@ defmodule MusicLibraryWeb.RecordSetLive.Index do ~p"/record-sets?#{qs}" end + attr :id, :string, required: true + attr :record_set, RecordSet, required: true + attr :list_params, :map, required: true + + defp record_set_card(assigns) do + ~H""" +
  • +
    +
    +
    +

    + <.link navigate={~p"/record-sets/#{@record_set}"} class="hover:underline"> + {@record_set.name} + +

    + + {gettext("%{collected}/%{total} records", RecordSet.count_by_status(@record_set))} + +
    +
    + {render_description(@record_set.description)} +
    +
    +
    + <.dropdown id={"set-actions-#{@record_set.id}"} placement="bottom-end"> + <:toggle> + <.button variant="soft"> + {gettext("Actions")} + <.icon + name="hero-ellipsis-vertical" + class="h-5 w-5 text-zinc-500 dark:text-zinc-400 cursor-pointer" + aria-hidden="true" + data-slot="icon" + /> + + + <.dropdown_link + id={"set-actions-#{@record_set.id}-edit"} + patch={ + ~p"/record-sets/#{@record_set}/edit?#{Map.take(@list_params, [:query, :page, :page_size, :order]) |> Enum.filter(fn {_, v} -> v not in ["", nil] end)}" + } + > + {gettext("Edit")} + + <.separator /> + <.dropdown_button + phx-click="delete_set" + phx-value-id={@record_set.id} + data-confirm={gettext("Are you sure?")} + class={[ + "text-red-900! hover:bg-red-50! dark:text-red-500! dark:hover:bg-red-900/30! dark:hover:text-red-600!" + ]} + > + {gettext("Delete")} + + +
    +
    + +
    +
    + <.link + :if={item.record.purchased_at} + navigate={~p"/collection/#{item.record}"} + > + + + <.link + :if={!item.record.purchased_at} + navigate={~p"/wishlist/#{item.record}"} + > + + +
    + <.icon + name="hero-bars-2" + class="size-3.5 text-zinc-800 dark:text-zinc-200" + aria-hidden="true" + /> +
    +
    + <.dropdown + id={"item-actions-#{@record_set.id}-#{item.record.id}"} + placement="bottom-end" + > + <:toggle> + {gettext("Actions")} + <.icon + name="hero-ellipsis-vertical" + class="size-5 text-zinc-800 dark:text-zinc-200 cursor-pointer" + aria-hidden="true" + data-slot="icon" + /> + + <.dropdown_button + :if={item.position > 0} + phx-click="move_up" + phx-value-set-id={@record_set.id} + phx-value-record-id={item.record.id} + > + {gettext("Move left")} + + <.dropdown_button + :if={item.position < length(@record_set.items) - 1} + phx-click="move_down" + phx-value-set-id={@record_set.id} + phx-value-record-id={item.record.id} + > + {gettext("Move right")} + + <.separator /> + <.dropdown_button + phx-click="remove_record" + phx-value-set-id={@record_set.id} + phx-value-record-id={item.record.id} + data-confirm={gettext("Remove this record from the set?")} + class={[ + "text-red-900! hover:bg-red-50! dark:text-red-500! dark:hover:bg-red-900/30! dark:hover:text-red-600!" + ]} + > + {gettext("Remove")} + + +
    +

    + <.artist_links joinphrase_class="text-sm" artists={item.record.artists} /> +

    +

    + {item.record.title} +

    +

    + {format_label(item.record.format)} · {type_label(item.record.type)} +

    +

    + <.icon + name="hero-calendar-days" + class="-mt-1 h-4 w-4" + aria-hidden="true" + data-slot="icon" + /> + {Records.Record.format_release_date(item.record.release_date)} +

    +
    + + <.link + patch={~p"/record-sets/#{@record_set}/add-record"} + class={[ + "flex-none aspect-square", + "border-2 border-dashed border-zinc-300 dark:border-zinc-600", + "rounded-lg flex items-center justify-center", + "hover:border-zinc-400 dark:hover:border-zinc-500", + "hover:bg-zinc-50 dark:hover:bg-zinc-800", + "transition-colors cursor-pointer" + ]} + > + <.icon + name="hero-plus" + class="h-8 w-8 text-zinc-400 dark:text-zinc-500" + aria-hidden="true" + data-slot="icon" + /> + +
    +
  • + """ + end + defp render_description(description) do description |> Markdown.to_html()