README.md

# EctoPaginator

![CI](https://github.com/nwjlyons/paginator/workflows/CI/badge.svg)

Pagination library for Ecto

## Usage

### Context

```elixir
defmodule Foo.Accounts do
  import Ecto.Query, warn: false
  alias Foo.Repo

  alias Foo.Accounts.User

  def list_users_with_pagination(page_number, paginate_by) do
    list_users_query()
    |> EctoPaginator.paginate(page_number, paginate_by)
    |> Repo.all()
  end

  def count_users() do
    Repo.aggregate(list_users_query(), :count)
  end

  defp list_users_query() do
    from(User)
    |> order_by(asc: :inserted_at)
  end
end
```

### Controller

```elixir
defmodule FooWeb.UserController do
  use FooWeb, :controller

  alias Foo.Accounts
  alias Foo.Repo

  @paginate_by 20

  def index(conn, %{"page" => current_page}) do
    {current_page, _} = Integer.parse(current_page)

    users = Accounts.list_users_with_pagination(current_page, @paginate_by)
    paginator = EctoPaginator.paginate_helper(current_page, @paginate_by, Accounts.count_users())

    render(conn, "index.html", users: users, paginator: paginator)
  end

  def index(conn, _params), do: index(conn, %{"page" => "1"})
end
```

### Template

```html
<%= if @paginator.previous_page_number do %>
  <a href="?page=1">First</a>
  <a href="?page=<%= @paginator.previous_page_number %>">Previous</a>
<% end %>

Page <%= @paginator.current_page_number %> of <%= @paginator.num_pages %>.

<%= if @paginator.next_page_number do %>
  <a href="?page=<%= @paginator.next_page_number %>">Next</a>
  <a href="?page=<%= @paginator.num_pages %>">Last</a>
<% end %>
```