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