))
+ html = +%()
end
# Javascript pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_bootstrap_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next
- tags = { 'before' => p_prev ? %(
) }
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %() + %(
' }
- %(#{pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)})
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination for Bulma: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_bulma_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %() \
- + %(
#{
+ pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
+ })
end
+ private
+
+ def pagy_bulma_prev_next_html(pagy, link)
+ html = if (p_prev = pagy.prev)
+ link.call p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"'
+ else
+ %(#{pagy_t 'pagy.nav.prev'})
+ end
+ html << if (p_next = pagy.next)
+ link.call p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"'
+ else
+ %(#{pagy_t 'pagy.nav.next' })
+ end
+ end
+
end
end
diff --git a/lib/pagy/extras/countless.rb b/lib/pagy/extras/countless.rb
index 2b50ec9d4..d7bbdd33b 100644
--- a/lib/pagy/extras/countless.rb
+++ b/lib/pagy/extras/countless.rb
@@ -1,17 +1,17 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/countless
-# encoding: utf-8
# frozen_string_literal: true
require 'pagy/countless'
class Pagy
- module Backend ; private # the whole module is private so no problem with including it in a controller
+ module Backend
+ private # the whole module is private so no problem with including it in a controller
# Return Pagy object and items
def pagy_countless(collection, vars={})
pagy = Pagy::Countless.new(pagy_countless_get_vars(collection, vars))
- return pagy, pagy_countless_get_items(collection, pagy)
+ [ pagy, pagy_countless_get_items(collection, pagy) ]
end
# Sub-method called only by #pagy_countless: here for easy customization of variables by overriding
@@ -26,7 +26,8 @@ def pagy_countless_get_items(collection, pagy)
items = collection.offset(pagy.offset).limit(pagy.items + 1).to_a
items_size = items.size
items.pop if items_size == pagy.items + 1
- pagy.finalize(items_size) # finalize may adjust pagy.items, so must be used after checking the size
+ # finalize may adjust pagy.items, so must be used after checking the size
+ pagy.finalize(items_size)
items
end
diff --git a/lib/pagy/extras/elasticsearch_rails.rb b/lib/pagy/extras/elasticsearch_rails.rb
index a16b03ffc..f3121df59 100644
--- a/lib/pagy/extras/elasticsearch_rails.rb
+++ b/lib/pagy/extras/elasticsearch_rails.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/elasticsearch_rails
-# encoding: utf-8
# frozen_string_literal: true
class Pagy
@@ -28,7 +27,8 @@ def self.new_from_elasticsearch_rails(response, vars={})
end
# Add specialized backend methods to paginate ElasticsearchRails searches
- module Backend ; private
+ module Backend
+ private
# Return Pagy object and items
def pagy_elasticsearch_rails(pagy_search_args, vars={})
@@ -39,12 +39,13 @@ def pagy_elasticsearch_rails(pagy_search_args, vars={})
response = model.search(query_or_payload, **options)
total = response.respond_to?(:raw_response) ? response.raw_response['hits']['total'] : response.response['hits']['total']
vars[:count] = total.is_a?(Hash) ? total['value'] : total
+
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
- if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
- return pagy_elasticsearch_rails(pagy_search_args, vars.merge(page: pagy.page))
- end
- return pagy, called.empty? ? response : response.send(*called)
+ return pagy_elasticsearch_rails(pagy_search_args, vars.merge(page: pagy.page)) \
+ if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
+
+ [ pagy, called.empty? ? response : response.send(*called) ]
end
# Sub-method called only by #pagy_elasticsearch_rails: here for easy customization of variables by overriding
diff --git a/lib/pagy/extras/foundation.rb b/lib/pagy/extras/foundation.rb
index dcefc3d09..e2b22c2dc 100644
--- a/lib/pagy/extras/foundation.rb
+++ b/lib/pagy/extras/foundation.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/foundation
-# encoding: utf-8
# frozen_string_literal: true
require 'pagy/extras/shared'
@@ -9,49 +8,73 @@ module Frontend
# Pagination for Foundation: it returns the html with the series of links to the pages
def pagy_foundation_nav(pagy)
- link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
+ link = pagy_link_proc(pagy)
- html = +(p_prev ? %(
)
+ html << pagy_foundation_next_html(pagy, link)
+ html << %(
)
end
# Javascript pagination for foundation: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_foundation_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
- tags = { 'before' => ( '
) }
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %() + %(
)
+ html << pagy_materialize_next_html(pagy, link)
+ html << %(
)
end
# Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_materialize_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
- tags = { 'before' => ( '
) }
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_materialize_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %(
)
+ end
+ end
+
end
end
diff --git a/lib/pagy/extras/metadata.rb b/lib/pagy/extras/metadata.rb
index e6fce687d..fa189d86a 100644
--- a/lib/pagy/extras/metadata.rb
+++ b/lib/pagy/extras/metadata.rb
@@ -1,36 +1,41 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/metadata
-# encoding: utf-8
# frozen_string_literal: true
class Pagy
# Add a specialized backend method for pagination metadata
- module Backend ; private
+ module Backend
+ private
- METADATA = [ :scaffold_url, :first_url, :prev_url, :page_url, :next_url, :last_url,
- :count, :page, :items, :vars, :pages, :last, :from, :to, :prev, :next, :series ]
- METADATA << :sequels if VARS.key?(:steps) # :steps gets defined along with the #sequels method
+ METADATA = %i[ scaffold_url first_url prev_url page_url next_url last_url
+ count page items vars pages last from to prev next series
+ ].tap do |metadata|
+ metadata << :sequels if VARS.key?(:steps) # :steps gets defined along with the #sequels method
+ end.freeze
VARS[:metadata] = METADATA.dup
include Helpers
- def pagy_metadata(pagy, url=false)
- names = pagy.vars[:metadata]
- (unknown = names - METADATA).empty? or raise(VariableError.new(pagy), "unknown metadata #{unknown.inspect}")
+ def pagy_metadata(pagy, url=nil)
+ names = pagy.vars[:metadata]
+ unknown = names - METADATA
+ raise VariableError.new(pagy), "unknown metadata #{unknown.inspect}" \
+ unless unknown.empty?
+
scaffold_url = pagy_url_for(PAGE_PLACEHOLDER, pagy, url)
- metadata = {}
- names.each do |key|
- metadata[key] = case key
- when :scaffold_url ; scaffold_url
- when :first_url ; scaffold_url.sub(PAGE_PLACEHOLDER, 1.to_s)
- when :prev_url ; scaffold_url.sub(PAGE_PLACEHOLDER, pagy.prev.to_s)
- when :page_url ; scaffold_url.sub(PAGE_PLACEHOLDER, pagy.page.to_s)
- when :next_url ; scaffold_url.sub(PAGE_PLACEHOLDER, pagy.next.to_s)
- when :last_url ; scaffold_url.sub(PAGE_PLACEHOLDER, pagy.last.to_s)
- else pagy.send(key)
- end
+ {}.tap do |metadata|
+ names.each do |key|
+ metadata[key] = case key
+ when :scaffold_url then scaffold_url
+ when :first_url then scaffold_url.sub(PAGE_PLACEHOLDER, 1.to_s)
+ when :prev_url then scaffold_url.sub(PAGE_PLACEHOLDER, pagy.prev.to_s)
+ when :page_url then scaffold_url.sub(PAGE_PLACEHOLDER, pagy.page.to_s)
+ when :next_url then scaffold_url.sub(PAGE_PLACEHOLDER, pagy.next.to_s)
+ when :last_url then scaffold_url.sub(PAGE_PLACEHOLDER, pagy.last.to_s)
+ else pagy.send(key)
+ end
+ end
end
- metadata
end
end
diff --git a/lib/pagy/extras/navs.rb b/lib/pagy/extras/navs.rb
index 35c8612c7..35114ec66 100644
--- a/lib/pagy/extras/navs.rb
+++ b/lib/pagy/extras/navs.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/navs
-# encoding: utf-8
# frozen_string_literal: true
require 'pagy/extras/shared'
@@ -9,30 +8,52 @@ module Frontend
# Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
- tags = { 'before' => p_prev ? %(#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'} )
- : %(#{pagy_t('pagy.nav.prev')} ),
+ link = pagy_link_proc(pagy)
+ tags = { 'before' => pagy_nav_prev_html(pagy, link),
'link' => %(#{link.call(PAGE_PLACEHOLDER)} ),
'active' => %(#{pagy.page} ),
'gap' => %(#{pagy_t('pagy.nav.gap')} ),
- 'after' => p_next ? %(#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'})
- : %(#{pagy_t('pagy.nav.next')}) }
- %(#{pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)})
+ 'after' => pagy_nav_next_html(pagy, link) }
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %()
- html << (p_prev ? %(#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'} )
- : %(#{pagy_t('pagy.nav.prev')} ))
- input = %()
- html << %(#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)} )
- html << (p_next ? %(#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'})
- : %(#{pagy_t('pagy.nav.next')}))
- html << %(#{pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))})
+ link = pagy_link_proc(pagy)
+ p_page = pagy.page
+ p_pages = pagy.pages
+ input = %()
+
+ %(#{
+ pagy_nav_prev_html(pagy, link)
+ }#{
+ pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
+ } #{
+ pagy_nav_next_html(pagy, link)
+ }#{
+ pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
+ })
end
+ private
+
+ def pagy_nav_prev_html(pagy, link)
+ if (p_prev = pagy.prev)
+ %(#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'} )
+ else
+ %(#{pagy_t('pagy.nav.prev')} )
+ end
+ end
+
+ def pagy_nav_next_html(pagy, link)
+ if (p_next = pagy.next)
+ %(#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'})
+ else
+ %(#{pagy_t('pagy.nav.next')})
+ end
+ end
+
end
end
diff --git a/lib/pagy/extras/overflow.rb b/lib/pagy/extras/overflow.rb
index 5fd7e147c..1ef571601 100644
--- a/lib/pagy/extras/overflow.rb
+++ b/lib/pagy/extras/overflow.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/overflow
-# encoding: utf-8
# frozen_string_literal: true
class Pagy
@@ -34,8 +33,8 @@ 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
+ 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
@@ -54,13 +53,13 @@ def finalize(items)
@overflow = false
super
rescue OverflowError
- @overflow = true # add the overflow flag
+ @overflow = true # add the overflow flag
case @vars[:overflow]
when :exception
- raise # same as without the extra
+ raise # same as without the extra
when :empty_page
- @offset = @items = @from = @to = 0 # vars relative to the actual page
- @vars[:size] = [] # no page in the series
+ @offset = @items = @from = @to = 0 # vars relative to the actual page
+ @vars[:size] = [] # no page in the series
self
else
raise VariableError.new(self), "expected :overflow variable in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
diff --git a/lib/pagy/extras/searchkick.rb b/lib/pagy/extras/searchkick.rb
index 77db7f6f2..a7558fadc 100644
--- a/lib/pagy/extras/searchkick.rb
+++ b/lib/pagy/extras/searchkick.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/searchkick
-# encoding: utf-8
# frozen_string_literal: true
class Pagy
@@ -10,7 +9,7 @@ module Searchkick
# returns an array used to delay the call of #search
# after the pagination variables are merged to the options
# it also pushes to the same array an eventually called method
- def pagy_searchkick(term = "*", **options, &block)
+ def pagy_searchkick(term = '*', **options, &block)
[self, term, options, block].tap do |args|
args.define_singleton_method(:method_missing){|*a| args += a}
end
@@ -27,7 +26,8 @@ def self.new_from_searchkick(results, vars={})
end
# Add specialized backend methods to paginate Searchkick::Results
- module Backend ; private
+ module Backend
+ private
# Return Pagy object and results
def pagy_searchkick(pagy_search_args, vars={})
@@ -37,12 +37,13 @@ def pagy_searchkick(pagy_search_args, vars={})
options[:page] = vars[:page]
results = model.search(term, **options, &block)
vars[:count] = results.total_count
+
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
- if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
- return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page))
- end
- return pagy, called.empty? ? results : results.send(*called)
+ return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page)) \
+ if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
+
+ [ pagy, called.empty? ? results : results.send(*called) ]
end
# Sub-method called only by #pagy_searchkick: here for easy customization of variables by overriding
diff --git a/lib/pagy/extras/semantic.rb b/lib/pagy/extras/semantic.rb
index 55685be51..9b20be3f2 100644
--- a/lib/pagy/extras/semantic.rb
+++ b/lib/pagy/extras/semantic.rb
@@ -1,5 +1,4 @@
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/semantic
-# encoding: utf-8
# frozen_string_literal: true
require 'pagy/extras/shared'
@@ -9,47 +8,69 @@ module Frontend
# Pagination for semantic: it returns the html with the series of links to the pages
def pagy_semantic_nav(pagy)
- link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
+ link = pagy_link_proc(pagy, 'class="item"')
- html = (p_prev ? %(#{link.call p_prev, '', 'aria-label="previous"'})
- : +%(
))
+ html = +%(
)
+ html << pagy_semantic_prev_html(pagy, link)
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
- html << if item.is_a?(Integer); %(#{link.call item}) # page link
- elsif item.is_a?(String) ; %(#{item}) # current page
- elsif item == :gap ; %(
...
) # page gap
+ html << case item
+ when Integer then link.call item # page link
+ when String then %(#{item}) # current page
+ when :gap then %(
...
) # page gap
end
end
- html << (p_next ? %(#{link.call p_next, '', 'aria-label="next"'})
- : %(
))
- %(
#{html}
)
+ html << pagy_semantic_next_html(pagy, link)
+ html << %(
)
end
# Javascript pagination for semantic: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_semantic_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
- tags = { 'before' => (p_prev ? %(#{link.call(p_prev, '', 'aria-label="previous"')})
- : %(
)) }
- %(#{pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)})
+ 'after' => pagy_semantic_next_html(pagy, link) }
+
+ html = %()
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next, pagy.page, pagy.pages
-
- html = %(
)
+ html << pagy_uikit_next_html(pagy, link)
+ html << %(
)
end
# Javascript pagination for uikit: it returns a nav and a JSON tag used by the Pagy.nav javascript
def pagy_uikit_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
- previous_span = "#{pagy_t('pagy.nav.prev')}"
- next_span = "#{pagy_t('pagy.nav.next')}"
- tags = { 'before' => p_prev ? %(
)
+ html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
end
# Javascript combo pagination for uikit: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
def pagy_uikit_combo_nav_js(pagy, id=pagy_id)
- link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
+ link = pagy_link_proc(pagy)
+ p_page = pagy.page
+ p_pages = pagy.pages
+ input = %()
+
+ %(
#{
+ if (p_prev = pagy.prev)
+ link.call p_prev, pagy_t('pagy.nav.prev'), 'class="uk-button uk-button-default"'
+ else
+ %()
+ end
+ }