class PageCursorResolver

Constants

MAX_CURSOR_COUNT

Attributes

context[R]
object[R]

Public Class Methods

new(object, context) click to toggle source
# File lib/page_cursor_resolver.rb, line 10
def initialize(object, context)
  @object = object
  @context = context
end

Public Instance Methods

page_cursors() click to toggle source
# File lib/page_cursor_resolver.rb, line 15
def page_cursors
  return if total_pages <= 1

  {
    around: around_cursors,
    first: first_cursor,
    last: last_cursor,
    previous: previous_cursor
  }.compact
end
total_count() click to toggle source
# File lib/page_cursor_resolver.rb, line 33
def total_count
  object_items.size
end
total_pages() click to toggle source
# File lib/page_cursor_resolver.rb, line 26
def total_pages
  return 0 if object_items.size.zero?
  return 1 if nodes_per_page.nil?

  (object_items.size.to_f / nodes_per_page).ceil
end

Private Instance Methods

around_cursors() click to toggle source
# File lib/page_cursor_resolver.rb, line 45
def around_cursors
  around_page_numbers.map { |page_num| page_cursor(page_num) }
end
around_page_numbers() click to toggle source
# File lib/page_cursor_resolver.rb, line 82
def around_page_numbers # rubocop:disable Metrics/AbcSize
  if total_pages <= MAX_CURSOR_COUNT
    (1..total_pages).to_a
  elsif current_page <= 3
    (1..4).to_a
  elsif current_page >= total_pages - 2
    ((total_pages - 3)..total_pages).to_a
  else
    [current_page - 1, current_page, current_page + 1]
  end
end
current_page() click to toggle source
# File lib/page_cursor_resolver.rb, line 78
def current_page
  nodes_before / nodes_per_page + 1
end
first_cursor() click to toggle source
# File lib/page_cursor_resolver.rb, line 49
def first_cursor
  exceeds_max_cursor_count = total_pages > MAX_CURSOR_COUNT
  include_first_cursor =
    exceeds_max_cursor_count && !around_page_numbers.include?(1)
  return unless include_first_cursor

  page_cursor(1)
end
last_cursor() click to toggle source
# File lib/page_cursor_resolver.rb, line 58
def last_cursor
  exceeds_max_cursor_count = total_pages > MAX_CURSOR_COUNT
  include_last_cursor =
    exceeds_max_cursor_count && !around_page_numbers.include?(total_pages)
  return unless include_last_cursor

  page_cursor(total_pages)
end
node_offset(node) click to toggle source
# File lib/page_cursor_resolver.rb, line 102
def node_offset(node)
  # this was previously accomplished by calling a private method:
  # object.send(:offset_from_cursor, object.cursor_from_node(object.edge_nodes.first))
  object_items.index(node) + 1
end
nodes_after() click to toggle source
# File lib/page_cursor_resolver.rb, line 98
def nodes_after
  node_offset(object.edge_nodes.last)
end
nodes_before() click to toggle source
# File lib/page_cursor_resolver.rb, line 94
def nodes_before
  node_offset(object.edge_nodes.first) - 1
end
nodes_per_page() click to toggle source
# File lib/page_cursor_resolver.rb, line 108
def nodes_per_page
  object.first || object.last
end
object_items() click to toggle source
# File lib/page_cursor_resolver.rb, line 39
def object_items
  return object.nodes unless object.respond_to?(:items)

  object.items
end
page_cursor(page_number) click to toggle source
# File lib/page_cursor_resolver.rb, line 74
def page_cursor(page_number)
  PageCursor.as_hash(current_page, page_number, nodes_per_page)
end
previous_cursor() click to toggle source
# File lib/page_cursor_resolver.rb, line 67
def previous_cursor
  include_previous_cursor = current_page > 1
  return unless include_previous_cursor

  page_cursor(current_page - 1)
end