Helpers built to work with Scrivener's page struct to easily build HTML output for various CSS frameworks.
Add to mix.exs
# add :scrivener_html to depsdefpdepsdo[# ...{:scrivener_html,"~> 1.8"}# ...]end# add :scrivener_html to applications listdefpapplicationdo[# ...applications: [...,:scrivener_html,...]# ...]endFor use with Phoenix.HTML, configure the :routes_helper module in config/config.exs
like the following:
config:scrivener_html,routes_helper: MyApp.Router.Helpers,# If you use a single view style everywhere, you can configure it here. See View Styles below for more info.view_style: :bootstrapImport to your view.
defmoduleMyApp.UserViewdouseMyApp.Web,:viewimportScrivener.HTMLendUse in your template.
<%=foruser<-@pagedo%>...
<%end%>
<%=pagination_links @page%>Where @page is a %Scrivener.Page{} struct returned from Repo.paginate/2.
So the function in your controller is like:
# params = %{"page" => _page}defindex(conn,params)dopage=MyApp.User# Other query conditions can be done here|>MyApp.Repo.paginate(params)renderconn,"index.html",page: pageendIf your resource has any url parameters to be supplied, you should provide them as the 3rd parameter. For example, given a scope like:
scope"/:locale",Appdopipe_through[:browser]get"/page",PageController,:index,as: :pagesget"/pages/:id",PageController,:show,as: :pageendYou would need to pass in the :locale parameter and :path option like so:
(this would generate links like "/en/page?page=1")
<%=pagination_links@conn,@page,["en"],path: &pages_path/4%>With a nested resource, simply add it to the list:
(this would generate links like "/en/pages/1?page=1")
<%=pagination_links@conn,@page,["en",@page_id],path: &page_path/4,action: :show%>Any additional query string parameters can be passed in as well.
<%=pagination_links@conn,@page,["en"],some_parameter: "data"%>
# Or if there are no URL parameters<%=pagination_links@conn,@page,some_parameter: "data"%>If you need to hit a different action other than :index, simply pass the action name to use in the url helper.
<%=pagination_links@conn,@page,action: :show%>Below are the defaults which are used without passing in any options.
<%=pagination_links@conn,@page,[],distance: 5,next: ">>",previous: "<<",first: true,last: true,view_style: :bootstrap%>
# Which is the same as<%=pagination_links@conn, @page%>To prevent HTML escaping (i.e. seeing things like < on the page), simply use Phoenix.HTML.raw/1 for any & strings passed in, like so:
<%=pagination_links@conn,@page,previous: Phoenix.HTML.raw("←"),next: Phoenix.HTML.raw("→")%>To show icons instead of text, simply render custom html templates, like:
(this example uses materialize icons)
# Using Phoenix.HTML's sigil_E for EEx<%=pagination_links@conn,@page,previous: ~E(<i class="material-icons">chevron_left</i>),next: ~E(<i class="material-icons">chevron_right</i>)%>
# Or by calling render<%=pagination_links@conn,@page,previous: render("pagination.html",direction: :prev),next: render("pagination.html",direction: :next))%>The same can be done for first/last links as well (v1.7.0 or higher).
(this example uses materialize icons)
<%=pagination_links@conn,@page,first: ~E(<i class="material-icons">chevron_left</i>),last: ~E(<i class="material-icons">chevron_right</i>)%>There are six view styles currently supported:
:bootstrap(the default) This styles the pagination links in a manner that is expected by Bootstrap 3.x.:bootstrap_v4This styles the pagination links in a manner that is expected by Bootstrap 4.x.:foundationThis styles the pagination links in a manner that is expected by Foundation for Sites 6.x.:semanticThis styles the pagination links in a manner that is expected by Semantic UI 2.x.:materializeThis styles the pagination links in a manner that is expected by Materialize css 0.x.:bulmaThis styles the pagination links in a manner that is expected by Bulma 0.4.x, using theis-centeredas a default.
For custom HTML output, see Scrivener.HTML.raw_pagination_links/2.
See Scrivener.HTML.raw_pagination_links/2 for option descriptions.
Scrivener.HTML can be included in your view and then just used with a simple call to pagination_links/1.
iex>Scrivener.HTML.pagination_links(%Scrivener.Page{total_pages: 10,page_number: 5})|>Phoenix.HTML.safe_to_string()"<nav> <ul class=\"pagination\"> <li class=\"\"><a class=\"\" href=\"?page=4\"><<</a></li> <li class=\"\"><a class=\"\" href=\"?page=1\">1</a></li> <li class=\"\"><a class=\"\" href=\"?page=2\">2</a></li> <li class=\"\"><a class=\"\" href=\"?page=3\">3</a></li> <li class=\"\"><a class=\"\" href=\"?page=4\">4</a></li> <li class=\"active\"><a class=\"\" href=\"?page=5\">5</a></li> <li class=\"\"><a class=\"\" href=\"?page=6\">6</a></li> <li class=\"\"><a class=\"\" href=\"?page=7\">7</a></li> <li class=\"\"><a class=\"\" href=\"?page=8\">8</a></li> <li class=\"\"><a class=\"\" href=\"?page=9\">9</a></li> <li class=\"\"><a class=\"\" href=\"?page=10\">10</a></li> <li class=\"\"><a class=\"\" href=\"?page=6\">>></a></li> </ul></nav>"SEO attributes like rel are automatically added to pagination links. In addition, a helper for header <link> tags is available (v1.7.0 and higher) to be placed in the <head> tag.
See Scrivener.HTML.SEO documentation for more information.