defmodule Moon.Components.PaginationButton do @moduledoc false use Moon.StatelessComponent alias Moon.Components.Button prop(size, :string, required: true) prop(page_number, :integer, required: true) prop(current_page_number, :integer, required: true) prop(label, :string) prop(variant, :string) prop(disabled, :boolean, default: false) prop(class, :string) prop(on_click, :event) def render(assigns) do ~F""" """ end end defmodule Moon.Components.Pagination do @moduledoc false use Moon.StatelessComponent alias Moon.Components.PaginationButton prop(current_page_number, :integer, required: true) prop(total_pages, :integer, required: true) prop(range_before, :integer, default: 1) prop(range_after, :integer, default: 1) prop(size, :string, values: ["xsmall", "small", "medium", "large"], default: "xsmall") prop(previous_button_label, :string, default: "Previous") prop(next_button_label, :string, default: "Next") prop(on_change, :event) def render(assigns) do ~F"""
2} class="mx-2">…
2} :for={page <- page_range(@current_page_number, @range_before, @range_after, @total_pages)} size={@size} page_number={page} current_page_number={@current_page_number} variant="tertiary" on_click={@on_change} />
1} size={@size} page_number={@total_pages} current_page_number={@current_page_number} variant="tertiary" on_click={@on_change} />
= @total_pages} class="block mx-auto" on_click={@on_change} />
""" end def page_range(current_page, range_before, range_after, total_pages) do min_page = max(2, current_page - range_before) max_page = min(current_page + range_after, total_pages - 1) min_page..max_page end end