legendary-doc-site/apps/admin/kaffy/lib/kaffy/pagination.ex
2020-07-27 20:28:41 +00:00

32 lines
926 B
Elixir

defmodule Kaffy.Pagination do
@moduledoc false
# number of pages to show on the showleft/right of the current page
@pagination_delta 2
def get_pages(0, 0), do: []
def get_pages(current_page, total_page) do
showleft = current_page - @pagination_delta
showright = current_page + @pagination_delta + 1
1..total_page
|> Enum.filter(fn x -> x == 1 || x == total_page || (x >= showleft && x < showright) end)
|> add_dots()
end
defp add_dots(range) do
{added_dots, _acc} =
Enum.map_reduce(range, 0, fn x, last ->
current_page = if adding_page = add_dots_check(x, last), do: [adding_page, x], else: [x]
{current_page, x}
end)
added_dots
|> List.flatten()
end
defp add_dots_check(x, last) when last > 0 and x - last == 2, do: last + 1
defp add_dots_check(x, last) when last > 0 and x - last != 1, do: "..."
defp add_dots_check(_, _), do: nil
end