Class: PagedScopes::Paginator

Inherits:
Object
  • Object
show all
Defined in:
lib/paged_scopes/paginator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(page) ⇒ Paginator

Returns a new instance of Paginator.



5
6
7
# File 'lib/paged_scopes/paginator.rb', line 5

def initialize(page)
  @page = page
end

Instance Attribute Details

#pageObject (readonly)

Returns the value of attribute page.



3
4
5
# File 'lib/paged_scopes/paginator.rb', line 3

def page
  @page
end

Instance Method Details

#firstObject



25
26
27
# File 'lib/paged_scopes/paginator.rb', line 25

def first
  path.call(@page.class.first)
end

#lastObject



29
30
31
# File 'lib/paged_scopes/paginator.rb', line 29

def last
  path.call(@page.class.last)
end

#nextObject



21
22
23
# File 'lib/paged_scopes/paginator.rb', line 21

def next
  path.call(@page.next) unless @page.last?
end

#pathObject



13
14
15
# File 'lib/paged_scopes/paginator.rb', line 13

def path
  @path || raise(RuntimeError, "No path proc supplied.")
end

#previousObject



17
18
19
# File 'lib/paged_scopes/paginator.rb', line 17

def previous
  path.call(@page.previous) unless @page.first?
end

#set_path(&block) ⇒ Object



9
10
11
# File 'lib/paged_scopes/paginator.rb', line 9

def set_path(&block)
  @path = block
end

#window(options) ⇒ Object

Raises:

  • (ArgumentError)


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/paged_scopes/paginator.rb', line 33

def window(options)
  raise ArgumentError, "No window block supplied." unless block_given?
  raise ArgumentError, "please specify a :inner option" unless inner = options[:inner]
  return if @page.page_count < 2
  outer = options[:outer] || 0
  extras = [ options[:extras] ].flatten.compact
  numbers = case
  when @page.number <= inner + 1
    1 .. 1 + 2 * inner
  when @page.number >= @page.page_count - inner
    @page.page_count - 2 * inner .. @page.page_count
  else
    @page.number - inner .. @page.number + inner
  end.to_a
  1.upto(outer) { |n| numbers << n << @page.page_count-n+1 }
  numbers.uniq!
  numbers.sort!
  numbers.reject! { |number| !number.between?(1, @page.page_count) }
  returning [] do |results|
    results << yield(:first, @page.first? ? nil : first, []) if extras.include?(:first)
    results << yield(:previous, previous, []) if extras.include?(:previous)
    numbers.zip([nil]+numbers, numbers[1..-1]) do |number, prev_number, next_number|
      page = @page.class.find(number)
      path = page == @page ? nil : @path.call(page)
      classes = []
      classes << :selected if page == @page
      classes << :gap_before if prev_number && prev_number < number - 1
      classes << :gap_after  if next_number && next_number > number + 1
      results << yield(page, path, classes)
    end        
    results << yield(:next, self.next, []) if extras.include?(:next)
    results << yield(:last, @page.last? ? nil : last, []) if extras.include?(:last)
  end.join("\n")
end