32 lines
926 B
Elixir
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
|