Scrivener List Save

A Scrivener compatible extension that allows pagination of a list of elements.

Project README

Scrivener.List

Build Status Hex Version Hex docs

Scrivener.List is a Scrivener compatible extension that allows the pagination of a list of elements.

Features

  1. Scrivener.List extends the protocol Scrivener.Paginater.paginate/2 from the scrivener library.
  2. Scrivener.List also extends the function MyApp.Repo.paginate/2 from the scrivener_ecto library.

Using the second feature is entirely optional. It's provided as a convenience where the scrivener_ecto library is also being used in the project and gives access to the pre-configured MyApp.Repo module.

Usage

1. Usage without a Repo module

Scrivener.paginate(list, config)

Arguments (without a repo)

  • list: A list of elements to be paginated

  • config: A configuration object with the pagination details. Can be in any of the following formats:

    • %{page: page_number, page_size: page_size} (map)
    • [page: page_number, page_size: page_size] (Keyword.t)
    • %Scrivener.Config{page_number: page_number, page_size: page_size} (Scrivener.Config.t)

max_page_size cannot be configured with method 1.

Examples

def index(conn, params) do
  config = maybe_put_default_config(params)

  page = 
    ["C#", "C++", "Clojure", "Elixir", "Erlang", "Go", "JAVA", "JavaScript", "Lisp",
      "PHP", "Perl", "Python", "Ruby", "Rust", "SQL"]
    |> Enum.map(&(&1 <> "  " <> "language"))
    |> Scrivener.paginate(config)

  render conn, :index,
    people: page.entries,
    page_number: page.page_number,
    page_size: page.page_size,
    total_pages: page.total_pages,
    total_entries: page.total_entries
end

defp maybe_put_default_config(%{page: page_number, page_size: page_size} = params), do: params
defp maybe_put_default_config(_params), do: %Scrivener.Config{page_number: 1, page_size: 10}
list = ["C#", "C++", "Clojure", "Elixir", "Erlang", "Go", "JAVA", "JavaScript", "Lisp",
        "PHP", "Perl", "Python", "Ruby", "Rust", "SQL"]
        
Scrivener.paginate(list, %Scrivener.Config{page_number: 1, page_size: 4}) # %Scrivener.Config{}
Scrivener.paginate(list, page: 1, page_size: 4) # keyword list
Scrivener.paginate(list, %{page: 1, page_size: 4}) # map
Scrivener.paginate(list, %{page: 1}) # map with only page number (page_size defaults to 10)

2. Usage with a Repo module

Usage without a Repo is entirely optional and is added to Scrivener.List for convenience. Firstly, see Scrivener.Ecto and configure the MyApp.Repo module.

Example Repo configuration

defmodule MyApp.Repo do
  use Ecto.Repo,
    otp_app: :my_app,
    adapter: Ecto.Adapters.Postgres
  use Scrivener,
    page_size: 10,
    max_page_size: 100
end
MyApp.Repo.paginate(list, config)

Arguments (with a repo)

  • list: A list of elements to be paginated

  • config: A configuration object with the pagination details. Can be in any of the following formats:

    • %{page: page_number, page_size: page_size} (map)
    • [page: page_number, page_size: page_size] (Keyword.t)

max_page_size can be configured with method 1. See Scrivener.Ecto.

Example

Example based on scrivener_ecto readme.

def index(conn, params) do
  %{age: age, name: name} = params["search"] 
  
  page = MyApp.Person
  |> where([p], p.age > ^age)
  |> order_by([p], desc: p.age)
  |> preload(:friends)
  |> MyApp.Repo.all()
  |> Enum.filter(fn(person) -> person.data.friend.name = name end)
  |> MyApp.Repo.paginate(params)

  render conn, :index,
    people: page.entries,
    page_number: page.page_number,
    page_size: page.page_size,
    total_pages: page.total_pages,
    total_entries: page.total_entries
end

Installation

Add scrivener_list to your list of dependencies in mix.exs:

def deps do
  [
    {:scrivener_list, "~> 2.0"}
  ]
end

Tests

MIX_ENV=test mix test

Acknowledgements

The introduction of the protocol for scrivener enabled the separation of this package into it's own repository.

Licence

MIT

Open Source Agenda is not affiliated with "Scrivener List" Project. README Source: stephenmoloney/scrivener_list
Stars
27
Open Issues
2
Last Commit
5 years ago
License
MIT

Open Source Agenda Badge

Open Source Agenda Rating