LostKobrakai
Numerator - calculate paginations without creating any markup
For pagination many people (like me) use scrivener and scrivener_ecto, which works great for offset based pagination. What never really fit my work though was scrivener_html, because I often don’t use frameworks and it took over link generation and styles so extensively.
A thread here on the forums today made me clean up some code I wrote a few days ago for a new project and release it on hex:
https://github.com/madeitGmbH/numerator
The package does not generate any markup at all, but instead creates a list of elements, which describe the pagination. You need to keep GET parameters on the urls, because the paginated content is filtered? Numerator doesn’t care. You want to use custom styles? Go ahead. You need to display the pagination in a CLI? No problem.
iex(1)> Numerator.build(%{page: 6, last: 17}, show_first: true, show_last: true)
[
%{page: 5, type: :prev},
%{page: 1, type: :page},
%{type: :ellipsis},
%{page: 4, type: :page},
%{page: 5, type: :page},
%{page: 6, type: :current},
%{page: 7, type: :page},
%{page: 8, type: :page},
%{type: :ellipsis},
%{page: 17, type: :page},
%{page: 7, type: :next}
]
It does support a scrivener page struct as first argument as well, so there’s no need to convert the map parameters manually.
I’ve also added an example implementation for bootstrap in the readme: numerator/README.md at master · LostKobrakai/numerator · GitHub
Most Liked
LostKobrakai
I just pushed an update with a breaking change (0.3.0) where :show_first and :show_last pages are tagged :first and :last respectively – instead of just :page – when they’re separated from the normal pagination pages by an :ellipsis. So now they can be styled differently once the ellipsis starts appearing.
LostKobrakai
I just released an update to the package:
0.2.1
- Extracted the chunk generation; The part calculating which pages around the current one to show.
- Improved the performance especially when paginating a large number of pages
Small number: 1..100; Large number: 1..100_000; Number of pages to show: 5
Before:
Name ips average deviation median 99th %
Small number of pages 23.33 K 0.0429 ms ±7.68% 0.0420 ms 0.0520 ms
Large number of pages 0.0169 K 59.31 ms ±9.67% 59.26 ms 73.17 ms
Comparison:
Small number of pages 23.33 K
Large number of pages 0.0169 K - 1383.32x slower +59.26 ms
After:
Name ips average deviation median 99th %
Small number of pages 219.65 K 4.55 μs ±290.11% 3.99 μs 5.99 μs
Large number of pages 210.09 K 4.76 μs ±298.51% 3.99 μs 5.99 μs
Comparison:
Small number of pages 219.65 K
Large number of pages 210.09 K - 1.05x slower +0.21 μs
Additionally I’d like to note, that for all of you using liveview this library might be worth looking into. It will allow proper change tracking as all the markup is handled in the template and not in some function call the template engine has no way to look into.
LostKobrakai
I haven’t been in the need for implementing pagination in a while, but I’d still use this. The returned list should play well with liveviews change tracking ![]()
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









