ecto_paginator v0.1.3 EctoPaginator View Source
Pagination library for Ecto
Usage
Context
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
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
<%= 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 %>
Link to this section Summary
Functions
Paginate an Ecto.Query
by adding Ecto.Query.offset/3
and Ecto.Query.limit/3
expressions.
Helper function that makes a struct that can be used for building "next" and "previous" links in templates.
Link to this section Types
Link to this type
t()
View Sourcet() :: %EctoPaginator{ current_page_number: pos_integer(), next_page_number: pos_integer() | nil, num_pages: pos_integer(), previous_page_number: pos_integer() | nil }
Link to this section Functions
Link to this function
paginate(query, page_number, paginate_by)
View Sourcepaginate(Ecto.Query.t(), pos_integer(), pos_integer()) :: Ecto.Query.t()
Paginate an Ecto.Query
by adding Ecto.Query.offset/3
and Ecto.Query.limit/3
expressions.
Examples
iex> from("table_name") |> EctoPaginator.paginate(4, 20)
#Ecto.Query<from t0 in "table_name", limit: ^20, offset: ^60>
Link to this function
paginate_helper(page_number, paginate_by, total)
View Sourcepaginate_helper(pos_integer(), pos_integer(), pos_integer()) :: t()
Helper function that makes a struct that can be used for building "next" and "previous" links in templates.
Examples
iex> EctoPaginator.paginate_helper(4, 20, 500)
%EctoPaginator{
current_page_number: 4,
next_page_number: 5,
num_pages: 25,
previous_page_number: 3
}
Use in Templates
<%= 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 %>