Drops.Relation.Plugins.Pagination (drops_relation v0.1.0)
View SourcePlugin that provides pagination functionality for relation modules.
This plugin adds pagination functions that return Drops.Relation.Loaded
structs
containing both the paginated data and metadata for navigation.
Functions Added
page/1
- Load a specific page with default per_pagepage/2
- Load a specific page with custom per_pageper_page/1
- Set per_page for subsequent paginationper_page/2
- Set per_page on an existing relation
Examples
iex> # Basic pagination - first page with default per_page
iex> loaded = MyApp.Users.page(1)
iex> loaded.meta.pagination.page
1
iex> loaded.meta.pagination.per_page
20
iex> loaded.meta.pagination.total_count
3
iex> loaded.meta.pagination.total_pages
1
iex> loaded.meta.pagination.has_next
false
iex> loaded.meta.pagination.has_prev
false
iex> length(loaded.data)
3
iex> # Pagination with custom per_page
iex> loaded = MyApp.Users.page(1, 2)
iex> loaded.meta.pagination.page
1
iex> loaded.meta.pagination.per_page
2
iex> loaded.meta.pagination.total_count
3
iex> loaded.meta.pagination.total_pages
2
iex> loaded.meta.pagination.has_next
true
iex> loaded.meta.pagination.has_prev
false
iex> length(loaded.data)
2
iex> # Second page
iex> loaded = MyApp.Users.page(2, 2)
iex> loaded.meta.pagination.page
2
iex> loaded.meta.pagination.per_page
2
iex> loaded.meta.pagination.total_count
3
iex> loaded.meta.pagination.total_pages
2
iex> loaded.meta.pagination.has_next
false
iex> loaded.meta.pagination.has_prev
true
iex> length(loaded.data)
1
iex> # Set per_page first, then paginate
iex> relation = MyApp.Users.per_page(2)
iex> loaded = MyApp.Users.page(relation, 1)
iex> loaded.meta.pagination.per_page
2
iex> length(loaded.data)
2
iex> # Access data using Enumerable protocol
iex> loaded = MyApp.Users.page(1, 2)
iex> users = Enum.to_list(loaded)
iex> length(users)
2
iex> first_user = Enum.at(loaded, 0)
iex> first_user.name
"John Doe"
iex> user_names = Enum.map(loaded, & &1.name)
iex> length(user_names)
2
Configuration
The default per_page value can be configured:
config :my_app, :drops,
relation: [
default_per_page: 25
]
If not configured, the default per_page is 20.
Summary
Functions
Loads a specific page with the default per_page setting.
Loads a specific page with a custom per_page setting.
Sets the per_page value for subsequent pagination operations.
Functions
@spec page( pos_integer(), keyword() ) :: Drops.Relation.Loaded.t()
Loads a specific page with the default per_page setting.
Parameters
page_num
- The page number to load (1-based)opts
- Additional options (automatically provided by delegate_to)
Returns
Returns a Drops.Relation.Loaded
struct with the paginated data and metadata.
Examples
iex> # Load first page with default per_page
iex> loaded = MyApp.Users.page(1)
iex> loaded.meta.pagination.page
1
iex> loaded.meta.pagination.per_page
20
iex> length(loaded.data)
3
@spec page(pos_integer(), pos_integer(), keyword()) :: Drops.Relation.Loaded.t()
@spec page(struct(), pos_integer(), keyword()) :: Drops.Relation.Loaded.t()
Loads a specific page with a custom per_page setting.
Parameters
page_num
- The page number to load (1-based)per_page
- Number of records per pageopts
- Additional options (automatically provided by delegate_to)
Returns
Returns a Drops.Relation.Loaded
struct with the paginated data and metadata.
Examples
iex> # Load first page with 2 records per page
iex> loaded = MyApp.Users.page(1, 2)
iex> loaded.meta.pagination.page
1
iex> loaded.meta.pagination.per_page
2
iex> length(loaded.data)
2
iex> # Load second page with 2 records per page
iex> loaded = MyApp.Users.page(2, 2)
iex> loaded.meta.pagination.page
2
iex> length(loaded.data)
1
@spec per_page( pos_integer(), keyword() ) :: struct()
Sets the per_page value for subsequent pagination operations.
Parameters
per_page
- Number of records per pageopts
- Additional options (automatically provided by delegate_to)
Returns
Returns a relation struct with per_page metadata.
Examples
iex> # Set per_page for later use
iex> relation = MyApp.Users.per_page(2)
iex> loaded = MyApp.Users.page(relation, 1)
iex> loaded.meta.pagination.per_page
2
iex> length(loaded.data)
2
@spec per_page(Ecto.Queryable.t(), pos_integer(), keyword()) :: struct()