Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pagination #6

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 55 additions & 50 deletions app/pagination/controllers/main_controller.rb
Original file line number Diff line number Diff line change
@@ -1,34 +1,18 @@
module Pagination
class MainController < Volt::ModelController

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

def page_numbers
def page_numbers(i=nil)
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 i == 0
start_pos, end_pos = middle_window(controller._pages[2] - 3, total)
middle_window = (start_pos..end_pos).to_a
elsif i == 1
start_pos, end_pos = middle_window(controller._pages[2] + window + 2, total)
middle_window = (start_pos..end_pos).to_a
else
start_pos, end_pos = middle_window(current_page, total)
middle_window = (start_pos..end_pos).to_a
end

if outer_window == 0
pages = middle_window
Expand All @@ -44,14 +28,23 @@ def page_numbers
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 << 0 unless end_outer_pos == middle_window[-1] + 1
pages += end_window
end
controller._pages = pages
end
end

pages
def expand_pages x
page_numbers(x).then do |pages|
controller._pages = pages
end
end

def certain_page
controller._pages
end

def window
(attrs.window || 5).to_i
end
Expand All @@ -60,6 +53,27 @@ def outer_window
(attrs.outer_window || 1).to_i
end

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

[start_pos, end_pos]
end

def per_page
(attrs.per_page || 10).to_i
end
Expand All @@ -83,37 +97,28 @@ def first_page
current_page == 1
end

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)
def goto_next_page
Promise.when(current_page, total_pages).then do |current_page, total_pages|
page = [(current_page + 1), total_pages].min
set_page(page)
end
end

def previous_page_url
new_page = current_page - 1
if new_page < 1
return ''
def goto_previous_page
current_page.then do |current_page|
page = [(current_page - 1), 1].max
set_page(page)
end

return url_for_page(new_page)
end

def page_param_name
attrs.page_param_name || :page
end

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

def set_page(page_number)
page_number = page_number.to_i
params.send(:"_#{page_param_name}=", page_number)
def set_page page_number
page_number.then do
params.send(:"_#{page_param_name}=", page_number.to_i)
end
end
end
end
14 changes: 8 additions & 6 deletions app/pagination/views/main/index.html
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
<ul class="pagination">
<li class="{{ if first_page }}disabled{{ end }}">
<a href="{{ previous_page_url }}">&laquo;</a>
<a e-click="goto_previous_page">&laquo;</a>
</li>
{{ page_numbers.each do |page_number| }}
{{ if page_number.nil? }}
<li><a>...</a></li>
{{ certain_page.each do |page_number| }}
{{ if page_number.nil? }}<!-- first ... -->
<li><a e-click="expand_pages(0)">...</a></li>
{{ elsif page_number == 0 }}<!-- last ... -->
<li><a e-click="expand_pages(1)">...</a></li>
{{ else }}
<li class="{{ if current_page == page_number }}active{{ end }}">
<a href="{{ url_for_page(page_number) }}">{{ page_number }}</a>
<a e-click="set_page(page_number)">{{ page_number }}</a>
</li>
{{ end }}
{{ end }}
<li class="{{ if last_page }}disabled{{ end }}">
<a href="{{ next_page_url }}">&raquo;</a>
<a e-click="goto_next_page">&raquo;</a>
</li>
</ul>