% use POSIX;
% my $last_page = POSIX::ceil($total / $limit);
% my $current_page = int($offset / $limit) + 1;
% my $prev_offset = ($offset - $limit) < 0 ? 0 : $offset - $limit;
% my $next_offset = $offset + $limit;
% my $last_offset = ($last_page - 1) * $limit;
<nav class="text-center">
<ul class="pagination">
% if ($current_page == 1) {
<li class="page-item disabled">
<a class="page-link">First</a>
% }
% else {
<li class="page-item">
% my $url = url_with->query({offset => 0});
<a class="page-link" href="<%= $url %>">First</a>
% }
</li>
% if ($current_page == 1) {
<li class="page-item disabled">
<a class="page-link">Previous</a>
% }
% else {
<li class="page-item">
% my $url = url_with->query({offset => $prev_offset});
<a class="page-link" href="<%= $url %>">Previous</a>
% }
</li>
% my $start = $current_page >= 3 ? $current_page - 2 : 1;
% $start = $start >= ($last_page - 4) ? $last_page - 4 : $start;
% $start = 1 if $start < 1;
% my $end = $last_page < ($start + 4) ? $last_page : $start + 4;
% for my $i ($start .. $end) {
% if ($i == $current_page) {
<li class="page-item active"><a class="page-link"><%= $i %></a></li>
% }
% else {
<li class="page-item">
% my $url = url_with->query({offset => ($i - 1) * $limit});
<a class="page-link" href="<%= $url %>"><%= $i %></a>
</li>
% }
% }
% if ($current_page >= $last_page) {
<li class="page-item disabled">
<a class="page-link">Next</a>
% }
% else {
<li class="page-item">
% my $url = url_with->query({offset => $next_offset});
<a class="page-link" href="<%= $url %>">Next</a>
% }
</li>
% if ($current_page >= $last_page) {
<li class="page-item disabled">
<a class="page-link">Last</a>
% }
% else {
<li class="page-item">
% my $url = url_with->query({offset => $last_offset});
<a class="page-link" href="<%= $url %>">Last</a>
% }
</li>
</ul>
</nav>