From 5958dc5a9a5aa900c64b7b3554c09f22b0c904d0 Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Fri, 13 Jul 2018 20:08:19 +0200 Subject: [PATCH] out_of_range extra improvements (#68) Co-authored-by: Michael Grosser --- README.md | 4 +++ lib/pagy/extras/out_of_range.rb | 47 +++++++++++++++++---------- test/pagy/extras/out_of_range_test.rb | 8 ++++- 3 files changed, 40 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 82f326b3c..09ddc9650 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,10 @@ An alternative UI that combines the pagination feature with the navigation info Allow the client to request a custom number of items per page with a ready to use selector UI. _(see [more...](http://ddnexus.github.io/pagy/extras/items))_ +### Out Of Range Extra + +Allow for easy handling of out of range pages _(see [more...](http://ddnexus.github.io/pagy/extras/out_of_range))_ + ### Responsive Extra On resize, the number of page links will adapt in real-time to the available window or container width. _(see [more...](http://ddnexus.github.io/pagy/extras/responsive))_ diff --git a/lib/pagy/extras/out_of_range.rb b/lib/pagy/extras/out_of_range.rb index ce3f8087a..8c21a2cd9 100644 --- a/lib/pagy/extras/out_of_range.rb +++ b/lib/pagy/extras/out_of_range.rb @@ -4,26 +4,37 @@ class Pagy def out_of_range?; @out_of_range end - alias :create :initialize - - def initialize(vars) - create(vars) - rescue OutOfRangeError => e - raise e if @vars[:out_of_range_mode] == :exception - @out_of_range = true - if @vars[:out_of_range_mode] == :last_page - @page = @last # set as last page - elsif @vars[:out_of_range_mode] == :empty_page - @offset = @items = @from = @to = 0 # vars relative to the actual page - @prev = @last # the prev is the last page - define_singleton_method(:series) do |size=@vars[:size]| - @page = @last # series for last page - super(size).tap do |s| # call original series - s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page) - @page = @vars[:page] # restore the actual page - end + module OutOfRange + + def initialize(vars) + super + rescue OutOfRangeError => e + @out_of_range = true # adds the out_of_range flag + raise e if @vars[:out_of_range_mode] == :exception + if @vars[:out_of_range_mode] == :last_page + @page = @last # set as the last page + elsif @vars[:out_of_range_mode] == :empty_page + @offset = @items = @from = @to = 0 # vars relative to the actual page + @prev = @last + extend(Series) + else raise ArgumentError, "Unknown mode #{@vars[:out_of_range_mode]}" end end + end + module Series + + def series(size=@vars[:size]) + @page = @last # series for last page + super(size).tap do |s| # call original series + s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page) + @page = @vars[:page] # restore the actual page + end + end + + end + + prepend OutOfRange + end diff --git a/test/pagy/extras/out_of_range_test.rb b/test/pagy/extras/out_of_range_test.rb index ad8a3826b..7f1829e7f 100644 --- a/test/pagy/extras/out_of_range_test.rb +++ b/test/pagy/extras/out_of_range_test.rb @@ -29,7 +29,7 @@ describe "#initialize" do - it 'initializes with out of range page' do + it 'works in :last_page mode' do pagy.must_be_instance_of Pagy pagy.page.must_equal pagy.last pagy.vars[:page].must_equal 100 @@ -49,15 +49,21 @@ pagy.prev.must_equal pagy.last end + it 'raises ArgumentError' do + proc { Pagy.new(vars.merge(out_of_range_mode: :unknown)) }.must_raise ArgumentError + end + end describe "#series singleton for :empty_page mode" do + it 'computes series for last page' do pagy = Pagy.new(vars.merge(out_of_range_mode: :empty_page)) series = pagy.series series.must_equal [1, 2, 3, :gap, 9, 10, 11] pagy.page.must_equal 100 end + end end