defmodule MicrowavepropWeb.LiveTableFooter do @moduledoc false use Phoenix.Component @spec render(map()) :: Phoenix.LiveView.Rendered.t() def render(assigns) do options = assigns.options table_options = assigns.table_options paginate? = get_in(options, ["pagination", "paginate?"]) mode = get_in(table_options, [:pagination, :mode]) page = parse_page(get_in(options, ["pagination", "page"])) has_next? = get_in(options, ["pagination", :has_next_page]) || false assigns = assigns |> assign(:show_pagination?, paginate? && mode != :infinite_scroll) |> assign(:page, page) |> assign(:has_next_page?, has_next?) |> assign(:page_items, page_items(page, has_next?)) ~H""" """ end # Without a total count from live_table we can only show pages we know exist: # everything up to and including `page` (we got here), plus `page + 1` when # `has_next?` is true. Collapses a gap to "…" once we're past page 4. @doc false @spec page_items(pos_integer(), boolean()) :: [pos_integer() | :ellipsis] def page_items(page, has_next?) when page >= 1 do window_start = max(1, page - 2) window_end = if has_next?, do: page + 1, else: page window = Enum.to_list(window_start..window_end) cond do window_start == 1 -> window window_start == 2 -> [1 | window] true -> [1, :ellipsis | window] end end defp parse_page(page) when is_integer(page) and page >= 1, do: page defp parse_page(page) when is_binary(page) do case Integer.parse(page) do {n, ""} when n >= 1 -> n _ -> 1 end end defp parse_page(_), do: 1 end