pagy 1.3.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/config/pagy.rb +32 -10
- data/lib/javascripts/pagy.js +0 -7
- data/lib/locales/utils/i18n.rb +18 -0
- data/lib/locales/utils/loader.rb +29 -0
- data/lib/locales/{plurals.rb → utils/p11n.rb} +20 -18
- data/lib/pagy.rb +3 -2
- data/lib/pagy/backend.rb +2 -0
- data/lib/pagy/countless.rb +4 -1
- data/lib/pagy/extras/array.rb +2 -0
- data/lib/pagy/extras/bootstrap.rb +12 -14
- data/lib/pagy/extras/bulma.rb +10 -12
- data/lib/pagy/extras/countless.rb +2 -0
- data/lib/pagy/extras/elasticsearch_rails.rb +31 -7
- data/lib/pagy/extras/foundation.rb +11 -13
- data/lib/pagy/extras/i18n.rb +7 -4
- data/lib/pagy/extras/items.rb +16 -17
- data/lib/pagy/extras/materialize.rb +11 -13
- data/lib/pagy/extras/overflow.rb +36 -34
- data/lib/pagy/extras/pagy_search.rb +16 -0
- data/lib/pagy/extras/plain.rb +4 -5
- data/lib/pagy/extras/searchkick.rb +31 -8
- data/lib/pagy/extras/semantic.rb +8 -10
- data/lib/pagy/extras/shared.rb +1 -7
- data/lib/pagy/extras/support.rb +2 -1
- data/lib/pagy/extras/trim.rb +2 -1
- data/lib/pagy/frontend.rb +17 -26
- data/lib/templates/bootstrap_nav.html.erb +1 -1
- data/lib/templates/bootstrap_nav.html.haml +1 -1
- data/lib/templates/bootstrap_nav.html.slim +1 -1
- data/lib/templates/bulma_nav.html.erb +1 -1
- data/lib/templates/bulma_nav.html.haml +1 -1
- data/lib/templates/bulma_nav.html.slim +1 -1
- data/lib/templates/foundation_nav.html.erb +1 -1
- data/lib/templates/foundation_nav.html.haml +1 -1
- data/lib/templates/foundation_nav.html.slim +1 -1
- data/pagy.gemspec +2 -5
- metadata +10 -10
- data/lib/pagy/extras/navs.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 984f87dd6d805faf04c9c980bc8b5e2da6d90963beae920805ece77a627ed6f0
|
4
|
+
data.tar.gz: '095f11ccb37ee8c4a64e714f0d3384f4c7f6cdddbafc4c4f34b9a3d2efd4c2de'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ade0c565e6f30f118ee30884456c1185c3f7dde0723aa6688734ac974dfc41fb0e16979a78d25042ee469178afe02244594a8366bb3e9f2057b031a378a062c
|
7
|
+
data.tar.gz: 7087679d2675ac589627085522871b53f59f27be60298fadb4e64752a12e21f3c23fcc13cd72b22ebe7c25a0bcd5c7a3064c4383aad5995e115b10fed1a4be0d
|
data/lib/config/pagy.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
# Pagy initializer file
|
2
|
-
# Customize only what you really need
|
5
|
+
# Customize only what you really need and notice that Pagy works also without any of the following lines.
|
3
6
|
|
4
7
|
|
5
8
|
# Extras
|
@@ -111,15 +114,34 @@
|
|
111
114
|
|
112
115
|
# I18n
|
113
116
|
|
114
|
-
# I18n faster
|
115
|
-
# Use only for single language apps that don't need dynamic translation between multiple languages
|
117
|
+
# Pagy internal I18n: ~18x faster using ~10x less memory than the i18n gem
|
116
118
|
# See https://ddnexus.github.io/pagy/api/frontend#i18n
|
117
|
-
# Notice:
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
121
|
-
|
122
|
-
#
|
123
|
-
#
|
119
|
+
# Notice: No need to use any of the following lines if you use the i18n extra below
|
120
|
+
#
|
121
|
+
# Examples:
|
122
|
+
# load the "de" built-in locale:
|
123
|
+
# Pagy::I18n.load(locale: 'de')
|
124
|
+
#
|
125
|
+
# load the "de" locale defined in the custom file at :filepath:
|
126
|
+
# Pagy::I18n.load(locale: 'de', filepath: 'path/to/pagy-de.yml')
|
127
|
+
#
|
128
|
+
# load the "de", "en" and "es" built-in locales:
|
129
|
+
# (the first passed :locale will be used also as the default_locale)
|
130
|
+
# Pagy::I18n.load({locale: 'de'},
|
131
|
+
# {locale: 'en'},
|
132
|
+
# {locale: 'es'})
|
133
|
+
#
|
134
|
+
# load the "en" built-in locale, a custom "es" locale,
|
135
|
+
# and a totally custom locale complete with the :pluralize proc:
|
136
|
+
# (the first passed :locale will be used also as the default_locale)
|
137
|
+
# Pagy::I18n.load({locale: 'en'},
|
138
|
+
# {locale: 'es', filepath: 'path/to/pagy-es.yml'},
|
139
|
+
# {locale: 'xyz', # not built-in
|
140
|
+
# filepath: 'path/to/pagy-xyz.yml',
|
141
|
+
# pluralize: lambda{|count| ... } )
|
142
|
+
|
143
|
+
|
144
|
+
# I18n extra: uses the standard i18n gem which is ~18x slower using ~10x more memory
|
145
|
+
# than the default pagy internal i18n (see above)
|
124
146
|
# See https://ddnexus.github.io/pagy/extras/i18n
|
125
147
|
# require 'pagy/extras/i18n'
|
data/lib/javascripts/pagy.js
CHANGED
@@ -84,13 +84,6 @@ Pagy.init = function(arg){
|
|
84
84
|
var args = JSON.parse(jsonTags[i].innerHTML);
|
85
85
|
Pagy[args.shift()].apply(null, args);
|
86
86
|
}
|
87
|
-
// Support for legacy overridden helpers. It will be removed in 2.0
|
88
|
-
['compact', 'items', 'responsive'].forEach(function(name){
|
89
|
-
var json = document.getElementsByClassName("pagy-"+name+"-json");
|
90
|
-
for (var i = 0, len = json.length; i < len; i++) {
|
91
|
-
Pagy[name].apply(null, JSON.parse(json[i].innerHTML))
|
92
|
-
}
|
93
|
-
})
|
94
87
|
};
|
95
88
|
|
96
89
|
// namespace for custom init functions
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# See https://ddnexus.github.io/pagy/api/frontend#i18n
|
2
|
+
# encoding: utf-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
# this file returns the I18n hash used as default alternative to the i18n gem
|
6
|
+
|
7
|
+
Hash.new{|h,_| h.first[1]}.tap do |i18n| # first loaded locale used as default
|
8
|
+
i18n.define_singleton_method(:load) do |*args|
|
9
|
+
# eval: we don't need to keep the loader proc in memory
|
10
|
+
eval(Pagy.root.join('locales', 'utils', 'loader.rb').read).call(i18n, *args) #rubocop:disable Security/Eval
|
11
|
+
end
|
12
|
+
i18n.define_singleton_method(:t) do |locale, path, vars={}|
|
13
|
+
data, pluralize = self[locale]
|
14
|
+
translate = data[path] || vars[:count] && data[path+=".#{pluralize.call(vars[:count])}"] or return %([translation missing: "#{path}"])
|
15
|
+
translate.call(vars)
|
16
|
+
end
|
17
|
+
i18n.load(locale: 'en')
|
18
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# the whole file will be eval'ed/executed and gc-collected after returning/executing the loader proc
|
5
|
+
|
6
|
+
# eval: no need for the whole file in memory
|
7
|
+
p11n = eval(Pagy.root.join('locales', 'utils', 'p11n.rb').read) #rubocop:disable Security/Eval
|
8
|
+
|
9
|
+
# flatten the dictionary file nested keys
|
10
|
+
# convert each value to a simple ruby interpolation proc
|
11
|
+
flatten = lambda do |hash, key=''|
|
12
|
+
hash.each.reduce({}) do |h, (k, v)|
|
13
|
+
v.is_a?(Hash) \
|
14
|
+
? h.merge!(flatten.call(v, "#{key}#{k}."))
|
15
|
+
: h.merge!(eval %({"#{key}#{k}" => lambda{|vars|"#{v.gsub(/%{[^}]+?}/){|m| "\#{vars[:#{m[2..-2]}]||'#{m}'}" }}"}})) #rubocop:disable Security/Eval
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# loader proc
|
20
|
+
lambda do |i18n, *args|
|
21
|
+
i18n.clear
|
22
|
+
args.each do |arg|
|
23
|
+
arg[:filepath] ||= Pagy.root.join('locales', "#{arg[:locale]}.yml")
|
24
|
+
arg[:pluralize] ||= p11n[arg[:locale]]
|
25
|
+
hash = YAML.load(File.read(arg[:filepath], encoding: 'UTF-8')) #rubocop:disable Security/YAMLLoad
|
26
|
+
hash.key?(arg[:locale]) or raise ArgumentError, %(Pagy::I18n.load: :locale "#{arg[:locale]}" not found in :filepath "#{arg[:filepath].inspect}")
|
27
|
+
i18n[arg[:locale]] = [flatten.call(hash[arg[:locale]]), arg[:pluralize]]
|
28
|
+
end
|
29
|
+
end
|
@@ -1,7 +1,10 @@
|
|
1
|
-
#
|
2
|
-
#
|
1
|
+
# See https://ddnexus.github.io/pagy/api/frontend#i18n
|
2
|
+
# encoding: utf-8
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
|
+
# This file adds support for multiple built-in plualization types.
|
6
|
+
# It defines the pluralization procs and gets eval(ed) and gc-collected at Pagy::I18n.load time.
|
7
|
+
|
5
8
|
# utility variables
|
6
9
|
zero_one = ['zero', 'one'].freeze
|
7
10
|
from2to4 = (2..4).freeze
|
@@ -9,13 +12,13 @@ from5to9 = (5..9).freeze
|
|
9
12
|
from11to14 = (11..14).freeze
|
10
13
|
from12to14 = (12..14).freeze
|
11
14
|
|
12
|
-
#
|
13
|
-
# A
|
14
|
-
# Each
|
15
|
-
|
16
|
-
zero_one_other:
|
15
|
+
# Pluralization (p11n)
|
16
|
+
# A pluralization proc returns a plural type string based on the passed count
|
17
|
+
# Each proc may apply to one or more locales below
|
18
|
+
p11n = {
|
19
|
+
zero_one_other: lambda {|count| zero_one[count] || 'other'},
|
17
20
|
|
18
|
-
zero_one_few_many_other:
|
21
|
+
zero_one_few_many_other: lambda do |count|
|
19
22
|
mod10, mod100 = count % 10, count % 100
|
20
23
|
if count == 0 ; 'zero'
|
21
24
|
elsif mod10 == 1 && mod100 != 11 ; 'one'
|
@@ -25,7 +28,7 @@ plurals = {
|
|
25
28
|
end
|
26
29
|
end,
|
27
30
|
|
28
|
-
pl:
|
31
|
+
pl: lambda do |count|
|
29
32
|
mod10, mod100 = count % 10, count % 100
|
30
33
|
if count == 0 ; 'zero'
|
31
34
|
elsif count == 1 ; 'one'
|
@@ -36,14 +39,13 @@ plurals = {
|
|
36
39
|
end
|
37
40
|
}
|
38
41
|
|
39
|
-
#
|
40
|
-
# Contain all the entries for all the
|
41
|
-
# The default
|
42
|
-
# is the :zero_one_other
|
43
|
-
Hash.new(
|
44
|
-
|
45
|
-
|
46
|
-
languages['pl'] = plurals[:pl]
|
42
|
+
# Hash of locale/pluralization pairs
|
43
|
+
# Contain all the entries for all the locales defined as dictionaries.
|
44
|
+
# The default pluralization for locales not explicitly listed here
|
45
|
+
# is the :zero_one_other pluralization proc (used for English)
|
46
|
+
Hash.new(p11n[:zero_one_other]).tap do |hash|
|
47
|
+
hash['ru'] = p11n[:zero_one_few_many_other]
|
48
|
+
hash['pl'] = p11n[:pl]
|
47
49
|
end
|
48
50
|
|
49
|
-
# PR for other
|
51
|
+
# PR for other locales and pluralizations are very welcome. Thanks!
|
data/lib/pagy.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# See Pagy API documentation: https://ddnexus.github.io/pagy/api/pagy
|
2
|
+
# encoding: utf-8
|
2
3
|
# frozen_string_literal: true
|
3
4
|
|
4
5
|
require 'pathname'
|
5
6
|
|
6
|
-
class Pagy ; VERSION = '
|
7
|
+
class Pagy ; VERSION = '2.0.0'
|
7
8
|
|
8
9
|
class OverflowError < StandardError; attr_reader :pagy; def initialize(pagy) @pagy = pagy end; end
|
9
10
|
|
10
11
|
# Root pathname to get the path of Pagy files like templates or dictionaries
|
11
|
-
def self.root; Pathname.new(__FILE__).dirname end
|
12
|
+
def self.root; @root ||= Pathname.new(__FILE__).dirname.freeze end
|
12
13
|
|
13
14
|
# default vars
|
14
15
|
VARS = { page:1, items:20, outset:0, size:[1,4,4,1], page_param: :page, params:{}, anchor:'', link_extra:'', item_path:'pagy.info.item_name', cycle: false }
|
data/lib/pagy/backend.rb
CHANGED
data/lib/pagy/countless.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
1
4
|
require 'pagy'
|
2
5
|
|
3
6
|
class Pagy
|
@@ -6,7 +9,7 @@ class Pagy
|
|
6
9
|
|
7
10
|
# Merge and validate the options, do some simple arithmetic and set a few instance variables
|
8
11
|
def initialize(vars={})
|
9
|
-
@vars
|
12
|
+
@vars = VARS.merge(vars.delete_if{|_,v| v.nil? || v == '' }) # default vars + cleaned vars (can be overridden)
|
10
13
|
{ items:1, outset:0, page:1 }.each do |k,min| # validate instance variables
|
11
14
|
(@vars[k] && instance_variable_set(:"@#{k}", @vars[k].to_i) >= min) \
|
12
15
|
or raise(ArgumentError, "expected :#{k} >= #{min}; got #{@vars[k].inspect}")
|
data/lib/pagy/extras/array.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bootstrap
|
2
|
+
# encoding: utf-8
|
2
3
|
# frozen_string_literal: true
|
3
4
|
|
4
5
|
require 'pagy/extras/shared'
|
@@ -8,10 +9,10 @@ class Pagy
|
|
8
9
|
|
9
10
|
# Pagination for bootstrap: it returns the html with the series of links to the pages
|
10
11
|
def pagy_bootstrap_nav(pagy)
|
11
|
-
|
12
|
+
link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next
|
12
13
|
|
13
|
-
html
|
14
|
-
|
14
|
+
html = EMPTY + (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
15
|
+
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
|
15
16
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
16
17
|
html << if item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>) # page link
|
17
18
|
elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
|
@@ -20,35 +21,33 @@ class Pagy
|
|
20
21
|
end
|
21
22
|
html << (p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
22
23
|
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
23
|
-
%(<nav class="pagy-
|
24
|
+
%(<nav class="pagy-bootstrap-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></nav>)
|
24
25
|
end
|
25
|
-
deprecate :pagy_nav_bootstrap, :pagy_bootstrap_nav
|
26
26
|
|
27
27
|
# Compact pagination for bootstrap: it returns the html with the series of links to the pages
|
28
28
|
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
29
29
|
def pagy_bootstrap_compact_nav(pagy, id=pagy_id)
|
30
|
-
|
30
|
+
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
31
31
|
|
32
|
-
html
|
32
|
+
html = EMPTY + %(<nav id="#{id}" class="pagy-bootstrap-compact-nav pagination" role="navigation" aria-label="pager">)
|
33
33
|
html << link.call(MARKER, '', %(style="display: none;" ))
|
34
34
|
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
35
35
|
html << %(<div class="btn-group" role="group">)
|
36
36
|
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
|
37
37
|
: %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
38
38
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" class="text-primary" style="padding: 0; border: none; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
|
39
|
-
html << %(<div class="pagy-compact-input btn btn-primary disabled">#{pagy_t('pagy.compact', page_input: input, count: p_page, pages: p_pages)}</div>)
|
39
|
+
html << %(<div class="pagy-compact-input btn btn-primary disabled" style="white-space: nowrap;">#{pagy_t('pagy.compact', page_input: input, count: p_page, pages: p_pages)}</div>)
|
40
40
|
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
|
41
41
|
: %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
42
42
|
html << %(</div></nav>#{pagy_json_tag(:compact, id, MARKER, p_page, !!defined?(TRIM))})
|
43
43
|
end
|
44
|
-
deprecate :pagy_nav_compact_bootstrap, :pagy_bootstrap_compact_nav
|
45
44
|
|
46
45
|
# Responsive pagination for bootstrap: it returns the html with the series of links to the pages
|
47
46
|
# rendered by the Pagy.responsive javascript
|
48
47
|
def pagy_bootstrap_responsive_nav(pagy, id=pagy_id)
|
49
48
|
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next, pagy.responsive
|
50
49
|
|
51
|
-
tags['before'] = +'<ul class="pagination">'
|
50
|
+
tags['before'] = EMPTY + '<ul class="pagination">'
|
52
51
|
tags['before'] << (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
53
52
|
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
|
54
53
|
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
@@ -57,13 +56,12 @@ class Pagy
|
|
57
56
|
elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
58
57
|
end
|
59
58
|
end
|
60
|
-
tags['after'] = +(p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
61
|
-
|
59
|
+
tags['after'] = EMPTY + (p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
60
|
+
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
62
61
|
tags['after'] << '</ul>'
|
63
62
|
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
64
|
-
%(<nav id="#{id}" class="pagy-
|
63
|
+
%(<nav id="#{id}" class="pagy-bootstrap-responsive-nav pagination" role="navigation" aria-label="pager"></nav>#{script})
|
65
64
|
end
|
66
|
-
deprecate :pagy_nav_responsive_bootstrap, :pagy_bootstrap_responsive_nav
|
67
65
|
|
68
66
|
end
|
69
67
|
end
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bulma
|
2
|
+
# encoding: utf-8
|
2
3
|
# frozen_string_literal: true
|
3
4
|
|
4
5
|
require 'pagy/extras/shared'
|
@@ -8,10 +9,10 @@ class Pagy
|
|
8
9
|
|
9
10
|
# Pagination for Bulma: it returns the html with the series of links to the pages
|
10
11
|
def pagy_bulma_nav(pagy)
|
11
|
-
|
12
|
+
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
12
13
|
|
13
|
-
html
|
14
|
-
|
14
|
+
html = EMPTY + (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
15
|
+
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>))
|
15
16
|
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
16
17
|
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
17
18
|
html << '<ul class="pagination-list">'
|
@@ -22,16 +23,15 @@ class Pagy
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
html << '</ul>'
|
25
|
-
%(<nav class="pagy-
|
26
|
+
%(<nav class="pagy-bulma-nav pagination is-centered" role="navigation" aria-label="pagination">#{html}</nav>)
|
26
27
|
end
|
27
|
-
deprecate :pagy_nav_bulma, :pagy_bulma_nav
|
28
28
|
|
29
29
|
# Compact pagination for Bulma: it returns the html with the series of links to the pages
|
30
30
|
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
31
31
|
def pagy_bulma_compact_nav(pagy, id=pagy_id)
|
32
|
-
|
32
|
+
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
33
33
|
|
34
|
-
html
|
34
|
+
html = EMPTY + %(<nav id="#{id}" class="pagy-bulma-compact-nav" role="navigation" aria-label="pagination">)
|
35
35
|
html << link.call(MARKER, '', 'style="display: none;"')
|
36
36
|
(html << link.call(1, '', %(style="display: none;"))) if defined?(TRIM)
|
37
37
|
html << %(<div class="field is-grouped is-grouped-centered" role="group">)
|
@@ -43,15 +43,14 @@ class Pagy
|
|
43
43
|
: %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
|
44
44
|
html << %(</div></nav>#{pagy_json_tag(:compact, id, MARKER, p_page, !!defined?(TRIM))})
|
45
45
|
end
|
46
|
-
deprecate :pagy_nav_compact_bulma, :pagy_bulma_compact_nav
|
47
46
|
|
48
47
|
# Responsive pagination for Bulma: it returns the html with the series of links to the pages
|
49
48
|
# rendered by the Pagy.responsive javascript
|
50
49
|
def pagy_bulma_responsive_nav(pagy, id=pagy_id)
|
51
50
|
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
52
51
|
|
53
|
-
tags['before'] = +(p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
54
|
-
|
52
|
+
tags['before'] = EMPTY + (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
53
|
+
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>))
|
55
54
|
tags['before'] << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
56
55
|
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
57
56
|
tags['before'] << '<ul class="pagination-list">'
|
@@ -63,9 +62,8 @@ class Pagy
|
|
63
62
|
end
|
64
63
|
tags['after'] = '</ul>'
|
65
64
|
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
66
|
-
%(<nav id="#{id}" class="pagy-
|
65
|
+
%(<nav id="#{id}" class="pagy-bulma-responsive-nav pagination is-centered" role="navigation" aria-label="pagination"></nav>#{script})
|
67
66
|
end
|
68
|
-
deprecate :pagy_nav_responsive_bulma, :pagy_bulma_responsive_nav
|
69
67
|
|
70
68
|
end
|
71
69
|
end
|
@@ -1,19 +1,43 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/elasticsearch_rails
|
2
|
+
# encoding: utf-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'pagy/extras/pagy_search'
|
2
6
|
|
3
7
|
class Pagy
|
4
|
-
|
8
|
+
|
9
|
+
# used by the items extra
|
10
|
+
ELASTICSEARCH_RAILS = true
|
11
|
+
|
12
|
+
# create a Pagy object from an Elasticsearch::Model::Response::Response object
|
13
|
+
def self.new_from_elasticsearch_rails(response, vars={})
|
14
|
+
vars[:items] = response.search.options[:size] || 10
|
15
|
+
vars[:page] = (response.search.options[:from] || 0) / vars[:items] + 1
|
16
|
+
vars[:count] = response.raw_response['hits']['total']
|
17
|
+
new(vars)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add specialized backend methods to paginate ElasticsearchRails searches
|
5
21
|
module Backend ; private
|
22
|
+
|
6
23
|
# Return Pagy object and items
|
7
|
-
def pagy_elasticsearch_rails(
|
8
|
-
|
9
|
-
|
24
|
+
def pagy_elasticsearch_rails(search_args, vars={})
|
25
|
+
model, query_or_payload, options, _block, *called = search_args
|
26
|
+
vars = pagy_elasticsearch_rails_get_vars(nil, vars)
|
27
|
+
options[:size] = vars[:items]
|
28
|
+
options[:from] = vars[:items] * (vars[:page] - 1)
|
29
|
+
response = model.search(query_or_payload, options)
|
30
|
+
vars[:count] = response.raw_response['hits']['total']
|
31
|
+
return Pagy.new(vars), called.empty? ? response : response.send(*called)
|
10
32
|
end
|
11
33
|
|
12
34
|
# Sub-method called only by #pagy_elasticsearch_rails: here for easy customization of variables by overriding
|
13
|
-
|
14
|
-
|
15
|
-
vars[:
|
35
|
+
# the _collection argument is not available when the method is called
|
36
|
+
def pagy_elasticsearch_rails_get_vars(_collection, vars)
|
37
|
+
vars[:items] ||= VARS[:items]
|
38
|
+
vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
|
16
39
|
vars
|
17
40
|
end
|
41
|
+
|
18
42
|
end
|
19
43
|
end
|