Drops.Relation.Plugins.Pagination (drops_relation v0.1.0)

View Source

Plugin 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_page
  • page/2 - Load a specific page with custom per_page
  • per_page/1 - Set per_page for subsequent pagination
  • per_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

page(page_num, opts)

@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

page(page_num, per_page, opts)

@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 page
  • 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 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

per_page(per_page, opts)

@spec per_page(
  pos_integer(),
  keyword()
) :: struct()

Sets the per_page value for subsequent pagination operations.

Parameters

  • per_page - Number of records per page
  • opts - 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

per_page(other, per_page, opts)

@spec per_page(Ecto.Queryable.t(), pos_integer(), keyword()) :: struct()