defmodule MusicLibraryWeb.PaginationComponent do
use Phoenix.Component
use Gettext, backend: MusicLibraryWeb.Gettext
alias Phoenix.LiveView.JS
attr :pagination_params, :map, required: true
attr :id, :atom, required: true
def pagination(assigns) do
page_links = generate_page_links(assigns.pagination_params)
assigns = assign(assigns, :page_links, page_links)
~H"""
<%!-- TODO: replace with OSS version --%>
1}
id={@id}
class="flex items-center justify-between px-4 py-6 mb-4"
>
<%!-- Only on smallest viewport --%>
<.link
:if={@page_links.prev_page}
patch={"?" <> encode_query(page: @page_links.prev_page, page_size: @pagination_params.page_size, query: @pagination_params.query, order: @pagination_params.order)}
phx-click={JS.dispatch("music_library:scroll_top")}
class={[
"relative inline-flex items-center rounded-md border",
"px-3 py-2 text-sm font-medium",
"bg-zinc-900 hover:bg-zinc-700 dark:bg-zinc-100 dark:hover:bg-zinc-400",
"text-white active:text-white/80 dark:text-zinc-900 dark:active:text-zinc-900/80",
"focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-zinc-600"
]}
>
{gettext("Previous")}
<.link
:if={@page_links.next_page}
patch={"?" <> encode_query(page: @page_links.next_page, page_size: @pagination_params.page_size, query: @pagination_params.query, order: @pagination_params.order)}
phx-click={JS.dispatch("music_library:scroll_top")}
class={[
"relative ml-3 inline-flex items-center rounded-md border",
"px-3 py-2 text-sm font-medium",
"bg-zinc-900 hover:bg-zinc-700 dark:bg-zinc-100 dark:hover:bg-zinc-400",
"text-white active:text-white/80 dark:text-zinc-900 dark:active:text-zinc-900/80",
"focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-zinc-600"
]}
>
{gettext("Next")}
"""
end
defp justify_content(nil, _next_page), do: "justify-end"
defp justify_content(_prev_page, nil), do: "justify-start"
defp justify_content(_prev_page, _next_page), do: "justify-between"
attr :page_number, :integer, required: true
attr :page_size, :integer, required: true
attr :query, :string, required: true
attr :order, :atom, values: [:alphabetical, :purchase], required: true
defp next_link(assigns) do
~H"""
<.link
class={[
"relative inline-flex items-center rounded-r-md px-2 py-2",
"text-zinc-400 ring-1 ring-inset ring-zinc-300 hover:bg-zinc-50 focus:z-20 focus:outline-offset-0"
]}
phx-click={JS.dispatch("music_library:scroll_top")}
patch={"?" <> encode_query(page: @page_number, page_size: @page_size, query: @query, order: @order)}
>