class Ariadne::PaginationCalculator
Handles pagination calculations and data structure
def calculate_total_pages
def calculate_total_pages return 1 if total_count.zero? (total_count.to_f / items_per_page).ceil end
def from
def from return 0 if total_count.zero? (page - 1) * items_per_page + 1 end
def handle_page_overflow(requested_page)
def handle_page_overflow(requested_page) return 1 if requested_page < 1 return pages if requested_page > pages requested_page end
def initialize(total_count:, page: 1, items_per_page: 10)
def initialize(total_count:, page: 1, items_per_page: 10) @total_count = total_count @items_per_page = items_per_page @pages = calculate_total_pages @page = handle_page_overflow(page) end
def next_page
def next_page page < pages ? page + 1 : nil end
def page_series
def page_series return [] if pages <= 1 return (1..pages).to_a if pages <= 5 links = [] links << 1 if page <= 3 # Near the beginning: 1 2 3 4 5 6 7 8 ... 20 (2..8).each { |n| links << n if n <= pages } links << nil if pages > 8 links << pages if pages > 8 elsif page >= pages - 2 # Near the end: 1 ... 13 14 15 16 17 18 19 20 links << nil ((pages - 7)..pages).each { |n| links << n if n > 1 } else # Middle range: 1 ... 9 10 11 12 13 14 ... 20 links << nil ((page - 2)..(page + 2)).each { |n| links << n } links << nil links << pages end links end
def prev_page
def prev_page page > 1 ? page - 1 : nil end
def to
def to return 0 if total_count.zero? [page * items_per_page, total_count].min end