Class: Pagination::MainController

Inherits:
Volt::ModelController
  • Object
show all
Defined in:
app/pagination/controllers/main_controller.rb

Instance Method Summary collapse

Instance Method Details

#current_pageObject



67
68
69
# File 'app/pagination/controllers/main_controller.rb', line 67

def current_page
  (params.send(:"_#{page_param_name}") || 1).to_i
end

#first_pageObject



82
83
84
# File 'app/pagination/controllers/main_controller.rb', line 82

def first_page
  current_page == 1
end

#last_pageObject



78
79
80
# File 'app/pagination/controllers/main_controller.rb', line 78

def last_page
  current_page == page_numbers.last
end

#middle_window(cpage, total) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'app/pagination/controllers/main_controller.rb', line 4

def middle_window(cpage, total)
  side_size = ((window - 1) / 2).ceil

  start_pos = cpage - side_size
  end_pos = cpage + side_size

  if start_pos <= 0
    end_pos += (0 - start_pos) + 1
    start_pos = 1
  end

  if end_pos > total
    start_pos = [start_pos - (end_pos - total), 1].max
    end_pos = total
  end

  end_pos = [end_pos, 1].max

  return start_pos, end_pos
end

#next_page_urlObject



86
87
88
89
90
91
92
93
94
95
# File 'app/pagination/controllers/main_controller.rb', line 86

def next_page_url
  total_pages.then do |total_pages|
    new_page = current_page + 1
    if new_page > total_pages
      next ''
    end

    url_for_page(new_page)
  end
end

#outer_windowObject



59
60
61
# File 'app/pagination/controllers/main_controller.rb', line 59

def outer_window
  (attrs.outer_window || 1).to_i
end

#page_numbersObject



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'app/pagination/controllers/main_controller.rb', line 25

def page_numbers
  total_pages.then do |total|

    cpage = current_page()

    start_pos, end_pos = middle_window(cpage, total)
    middle_window = (start_pos..end_pos).to_a

    if outer_window == 0
      pages = middle_window
    else
      side_size = ((outer_window - 1) / 2).ceil

      start_outer_pos = [1 + side_size, start_pos-1].min
      end_outer_pos = [total - side_size, end_pos + 1].max

      start_window = (1..start_outer_pos).to_a
      end_window = (end_outer_pos..total).to_a

      pages = start_window
      pages << nil unless start_outer_pos == (middle_window[0] - 1)
      pages += middle_window
      pages << nil unless end_outer_pos == middle_window[-1] + 1
      pages += end_window
    end

    pages
  end
end

#page_param_nameObject



106
107
108
# File 'app/pagination/controllers/main_controller.rb', line 106

def page_param_name
  attrs.page_param_name || :page
end

#per_pageObject



63
64
65
# File 'app/pagination/controllers/main_controller.rb', line 63

def per_page
  (attrs.per_page || 10).to_i
end

#previous_page_urlObject



97
98
99
100
101
102
103
104
# File 'app/pagination/controllers/main_controller.rb', line 97

def previous_page_url
  new_page = current_page - 1
  if new_page < 1
    return ''
  end

  return url_for_page(new_page)
end

#set_page(page_number) ⇒ Object



114
115
116
117
# File 'app/pagination/controllers/main_controller.rb', line 114

def set_page(page_number)
  page_number = page_number.to_i
  params.send(:"_#{page_param_name}=", page_number)
end

#total_pagesObject

Assumes a promise and returns a promise



72
73
74
75
76
# File 'app/pagination/controllers/main_controller.rb', line 72

def total_pages
  attrs.total.then do |total|
    (total.to_i / per_page.to_f).ceil
  end
end

#url_for_page(page_number) ⇒ Object



110
111
112
# File 'app/pagination/controllers/main_controller.rb', line 110

def url_for_page(page_number)
  url_with({page_param_name => page_number})
end

#windowObject



55
56
57
# File 'app/pagination/controllers/main_controller.rb', line 55

def window
  (attrs.window || 5).to_i
end