diff --git a/app/pagination/controllers/main_controller.rb b/app/pagination/controllers/main_controller.rb index 35b95d6..9fde99d 100644 --- a/app/pagination/controllers/main_controller.rb +++ b/app/pagination/controllers/main_controller.rb @@ -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 @@ -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 @@ -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 @@ -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 diff --git a/app/pagination/views/main/index.html b/app/pagination/views/main/index.html index e313478..f48f492 100644 --- a/app/pagination/views/main/index.html +++ b/app/pagination/views/main/index.html @@ -1,17 +1,19 @@