class Lipstick::Helpers::PaginationLinkRenderer

Attributes

current[R]
items[R]
template[R]
total[R]

Public Instance Methods

prepare(collection, _options, template) click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 11
def prepare(collection, _options, template)
  @current = collection.current_page
  @total = collection.total_pages

  @items = [*prefix, *middle, *suffix]
  @template = template
end
to_html() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 19
def to_html
  template.content_tag('nav', class: 'pagination-wrapper') do
    template.content_tag('ul', class: 'pagination') do
      items.each do |item|
        template.concat(render_item(item))
      end
    end
  end
end

Private Instance Methods

disabled_item(content) click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 134
def disabled_item(content)
  template.content_tag('li', content, class: 'disabled')
end
gap_item() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 114
def gap_item
  template.content_tag('li') do
    template.content_tag('span', "\u2026", 'aria-hidden': 'true')
  end
end
middle() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 38
def middle
  return page_range(1, total) if short_list?

  page_range(*page_window)
end
next_item() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 106
def next_item
  icon = template.content_tag('span', "\u25B6", 'aria-hidden': 'true')

  return disabled_item(icon) if current >= total

  link_to_page(icon, page: current + 1, 'aria-label': 'Next')
end
page_range(start, finish) click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 61
def page_range(start, finish)
  [start, 1].max.upto([finish, total].min)
end
page_window() click to toggle source

Decides which pages to show in the links surrounding the “current” page.

# File lib/lipstick/helpers/pagination_link_renderer.rb, line 45
def page_window
  # If we're close to the start/end we can show a few extra page links.
  return [1, 8] if current < 5
  return [total - 7, total] if current > total - 4

  # Otherwise show 3 pages either side of the current page
  [current - 3, current + 3]
end
prefix() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 31
def prefix
  return [:prev] if !show_first? || short_list?
  return [:prev, 1, :gap] if prefix_gap?

  [:prev, 1]
end
prefix_gap?() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 77
def prefix_gap?
  !middle.include?(2)
end
prev_item() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 98
def prev_item
  icon = template.content_tag('span', "\u25C0", 'aria-hidden': 'true')

  return disabled_item(icon) if current < 2

  link_to_page(icon, page: current - 1, 'aria-label': 'Previous')
end
render_item(item) click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 85
def render_item(item)
  case item
  when :prev
    prev_item
  when :next
    next_item
  when :gap
    gap_item
  else
    link_to_page(item, page: item)
  end
end
short_list?() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 65
def short_list?
  total <= 10
end
show_first?() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 69
def show_first?
  !middle.include?(1)
end
show_last?() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 73
def show_last?
  !middle.include?(total)
end
suffix() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 54
def suffix
  return [:next] if !show_last? || short_list?
  return [:gap, total, :next] if suffix_gap?

  [total, :next]
end
suffix_gap?() click to toggle source
# File lib/lipstick/helpers/pagination_link_renderer.rb, line 81
def suffix_gap?
  !middle.include?(total - 1)
end