pagy 4.11.0 → 5.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 +66 -45
- data/lib/javascripts/pagy.js +15 -6
- data/lib/pagy/backend.rb +6 -10
- data/lib/pagy/console.rb +5 -4
- data/lib/pagy/countless.rb +13 -20
- data/lib/pagy/exceptions.rb +2 -4
- data/lib/pagy/extras/arel.rb +6 -6
- data/lib/pagy/extras/array.rb +6 -6
- data/lib/pagy/extras/bootstrap.rb +32 -29
- data/lib/pagy/extras/bulma.rb +40 -32
- data/lib/pagy/extras/countless.rb +8 -9
- data/lib/pagy/extras/elasticsearch_rails.rb +64 -47
- data/lib/pagy/extras/foundation.rb +26 -26
- data/lib/pagy/extras/gearbox.rb +42 -0
- data/lib/pagy/extras/headers.rb +24 -16
- data/lib/pagy/extras/i18n.rb +7 -16
- data/lib/pagy/extras/items.rb +37 -38
- data/lib/pagy/extras/materialize.rb +28 -30
- data/lib/pagy/extras/meilisearch.rb +50 -45
- data/lib/pagy/extras/metadata.rb +29 -13
- data/lib/pagy/extras/navs.rb +24 -26
- data/lib/pagy/extras/overflow.rb +57 -60
- data/lib/pagy/extras/searchkick.rb +51 -45
- data/lib/pagy/extras/semantic.rb +28 -30
- data/lib/pagy/extras/shared.rb +44 -40
- data/lib/pagy/extras/standalone.rb +37 -42
- data/lib/pagy/extras/support.rb +14 -13
- data/lib/pagy/extras/trim.rb +10 -11
- data/lib/pagy/extras/uikit.rb +27 -28
- data/lib/pagy/frontend.rb +22 -47
- data/lib/pagy/i18n.rb +159 -0
- data/lib/pagy/url_helpers.rb +22 -0
- data/lib/pagy.rb +52 -26
- data/lib/templates/uikit_nav.html.erb +1 -1
- data/lib/templates/uikit_nav.html.slim +1 -1
- metadata +7 -10
- data/lib/locales/utils/i18n.rb +0 -17
- data/lib/locales/utils/loader.rb +0 -31
- data/lib/locales/utils/p11n.rb +0 -112
- data/lib/pagy/deprecation.rb +0 -27
@@ -4,8 +4,7 @@
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
6
|
class Pagy
|
7
|
-
module
|
8
|
-
|
7
|
+
module MaterializeExtra
|
9
8
|
# Pagination for materialize: it returns the html with the series of links to the pages
|
10
9
|
def pagy_materialize_nav(pagy, pagy_id: nil, link_extra: '')
|
11
10
|
p_id = %( id="#{pagy_id}") if pagy_id
|
@@ -25,8 +24,7 @@ class Pagy
|
|
25
24
|
end
|
26
25
|
|
27
26
|
# Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
28
|
-
def pagy_materialize_nav_js(pagy,
|
29
|
-
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
27
|
+
def pagy_materialize_nav_js(pagy, pagy_id: nil, link_extra: '', steps: nil)
|
30
28
|
p_id = %( id="#{pagy_id}") if pagy_id
|
31
29
|
link = pagy_link_proc(pagy, link_extra: link_extra)
|
32
30
|
|
@@ -36,47 +34,47 @@ class Pagy
|
|
36
34
|
'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>),
|
37
35
|
'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
|
38
36
|
|
39
|
-
%(<div#{p_id} class="pagy-njs pagy-materialize-nav-js" role="navigation" aria-label="pager" #{
|
37
|
+
%(<div#{p_id} class="pagy-njs pagy-materialize-nav-js" role="navigation" aria-label="pager" #{
|
38
|
+
pagy_json_attr(pagy, :nav, tags, pagy.sequels(steps))}></div>)
|
40
39
|
end
|
41
40
|
|
42
41
|
# Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
43
|
-
def pagy_materialize_combo_nav_js(pagy,
|
44
|
-
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
42
|
+
def pagy_materialize_combo_nav_js(pagy, pagy_id: nil, link_extra: '')
|
45
43
|
p_id = %( id="#{pagy_id}") if pagy_id
|
46
44
|
link = pagy_link_proc(pagy, link_extra: link_extra)
|
47
45
|
p_page = pagy.page
|
48
46
|
p_pages = pagy.pages
|
49
47
|
style = ' style="vertical-align: middle"'
|
50
|
-
input = %(<input type="number" class="browser-default" min="1" max="#{p_pages}" value="#{
|
48
|
+
input = %(<input type="number" class="browser-default" min="1" max="#{p_pages}" value="#{
|
49
|
+
p_page}" style="text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
|
51
50
|
|
52
|
-
%(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation"
|
53
|
-
|
54
|
-
|
55
|
-
pagy_materialize_prev_html pagy, link, style
|
56
|
-
|
57
|
-
|
58
|
-
}</li>#{
|
59
|
-
pagy_materialize_next_html pagy, link, style
|
60
|
-
}</ul>)
|
51
|
+
html = %(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation")
|
52
|
+
%(#{html} aria-label="pager" style="padding-right: 0" #{
|
53
|
+
pagy_json_attr pagy, :combo_nav, p_page, pagy_marked_link(link)}>#{
|
54
|
+
pagy_materialize_prev_html pagy, link, style}<li class="pagy-combo-input">#{
|
55
|
+
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</li>#{
|
56
|
+
pagy_materialize_next_html pagy, link, style}</ul>)
|
61
57
|
end
|
62
58
|
|
63
59
|
private
|
64
60
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
61
|
+
def pagy_materialize_prev_html(pagy, link, style = '')
|
62
|
+
if (p_prev = pagy.prev)
|
63
|
+
%(<li class="waves-effect prev"#{style}>#{
|
64
|
+
link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
|
65
|
+
else
|
66
|
+
%(<li class="prev disabled"#{style}><a href="#"><i class="material-icons">chevron_left</i></a></li>)
|
71
67
|
end
|
68
|
+
end
|
72
69
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
70
|
+
def pagy_materialize_next_html(pagy, link, style = '')
|
71
|
+
if (p_next = pagy.next)
|
72
|
+
%(<li class="waves-effect next"#{style}>#{
|
73
|
+
link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
|
74
|
+
else
|
75
|
+
%(<li class="next disabled"#{style}><a href="#"><i class="material-icons">chevron_right</i></a></li>)
|
79
76
|
end
|
80
|
-
|
77
|
+
end
|
81
78
|
end
|
79
|
+
Frontend.prepend MaterializeExtra
|
82
80
|
end
|
@@ -1,55 +1,60 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Pagy
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
DEFAULT[:meilisearch_search_method] ||= :pagy_search
|
5
|
+
|
6
|
+
module MeilisearchExtra
|
7
|
+
module Meilisearch
|
8
|
+
# Return an array used to delay the call of #search
|
9
|
+
# after the pagination variables are merged to the options
|
10
|
+
def pagy_meilisearch(term = nil, **vars)
|
11
|
+
[self, term, vars]
|
12
|
+
end
|
13
|
+
alias_method DEFAULT[:meilisearch_search_method], :pagy_meilisearch
|
12
14
|
end
|
13
|
-
alias_method VARS[:meilisearch_search_method], :pagy_meilisearch
|
14
|
-
end
|
15
|
-
|
16
|
-
# create a Pagy object from a Meilisearch results
|
17
|
-
def self.new_from_meilisearch(results, vars={})
|
18
|
-
vars[:items] = results.raw_answer['limit']
|
19
|
-
vars[:page] = [results.raw_answer['offset'] / vars[:items], 1].max
|
20
|
-
vars[:count] = results.raw_answer['nbHits']
|
21
|
-
new(vars)
|
22
|
-
end
|
23
15
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
options[:offset] = (vars[:page] - 1) * vars[:items]
|
34
|
-
results = model.search(term, **options)
|
35
|
-
vars[:count] = results.raw_answer['nbHits']
|
36
|
-
|
37
|
-
pagy = Pagy.new(vars)
|
38
|
-
# with :last_page overflow we need to re-run the method in order to get the hits
|
39
|
-
return pagy_meilisearch(pagy_search_args, vars.merge(page: pagy.page)) \
|
40
|
-
if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
|
41
|
-
|
42
|
-
[ pagy, results ]
|
16
|
+
# Additions for the Pagy class
|
17
|
+
module Pagy
|
18
|
+
# Create a Pagy object from a Meilisearch results
|
19
|
+
def new_from_meilisearch(results, vars = {})
|
20
|
+
vars[:items] = results.raw_answer['limit']
|
21
|
+
vars[:page] = [results.raw_answer['offset'] / vars[:items], 1].max
|
22
|
+
vars[:count] = results.raw_answer['nbHits']
|
23
|
+
new(vars)
|
24
|
+
end
|
43
25
|
end
|
44
26
|
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
27
|
+
# Add specialized backend methods to paginate Meilisearch results
|
28
|
+
module Backend
|
29
|
+
private
|
30
|
+
|
31
|
+
# Return Pagy object and results
|
32
|
+
def pagy_meilisearch(pagy_search_args, vars = {})
|
33
|
+
model, term, options = pagy_search_args
|
34
|
+
vars = pagy_meilisearch_get_vars(nil, vars)
|
35
|
+
options[:limit] = vars[:items]
|
36
|
+
options[:offset] = (vars[:page] - 1) * vars[:items]
|
37
|
+
results = model.search(term, **options)
|
38
|
+
vars[:count] = results.raw_answer['nbHits']
|
39
|
+
pagy = ::Pagy.new(vars)
|
40
|
+
# with :last_page overflow we need to re-run the method in order to get the hits
|
41
|
+
return pagy_meilisearch(pagy_search_args, vars.merge(page: pagy.page)) \
|
42
|
+
if defined?(::Pagy::OverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
|
43
|
+
|
44
|
+
[pagy, results]
|
45
|
+
end
|
46
|
+
|
47
|
+
# Sub-method called only by #pagy_meilisearch: here for easy customization of variables by overriding
|
48
|
+
# the _collection argument is not available when the method is called
|
49
|
+
def pagy_meilisearch_get_vars(_collection, vars)
|
50
|
+
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
51
|
+
vars[:items] ||= DEFAULT[:items]
|
52
|
+
vars[:page] ||= (params[vars[:page_param] || DEFAULT[:page_param]] || 1).to_i
|
53
|
+
vars
|
54
|
+
end
|
52
55
|
end
|
53
|
-
|
54
56
|
end
|
57
|
+
Meilisearch = MeilisearchExtra::Meilisearch
|
58
|
+
extend MeilisearchExtra::Pagy
|
59
|
+
Backend.prepend MeilisearchExtra::Backend
|
55
60
|
end
|
data/lib/pagy/extras/metadata.rb
CHANGED
@@ -1,26 +1,42 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/metadata
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'pagy/url_helpers'
|
5
|
+
|
4
6
|
class Pagy
|
5
7
|
# Add a specialized backend method for pagination metadata
|
6
|
-
module
|
7
|
-
|
8
|
+
module MetadataExtra
|
9
|
+
private
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
# Store the array of all the internal variable names usable as METADATA
|
12
|
+
METADATA = %i[ scaffold_url
|
13
|
+
first_url
|
14
|
+
prev_url
|
15
|
+
page_url
|
16
|
+
next_url
|
17
|
+
last_url
|
18
|
+
count page
|
19
|
+
items
|
20
|
+
vars
|
21
|
+
pages
|
22
|
+
last
|
23
|
+
in
|
24
|
+
from
|
25
|
+
to
|
26
|
+
prev
|
27
|
+
next
|
28
|
+
series ].tap { |m| m << :sequels if DEFAULT.key?(:steps) }.freeze
|
14
29
|
|
15
|
-
|
30
|
+
# Set the default metadata variable
|
31
|
+
Pagy::DEFAULT[:metadata] = METADATA.dup
|
16
32
|
|
17
|
-
include
|
33
|
+
include UrlHelpers
|
18
34
|
|
19
|
-
|
20
|
-
|
35
|
+
# Return the metadata hash
|
36
|
+
def pagy_metadata(pagy, absolute: nil)
|
21
37
|
names = pagy.vars[:metadata]
|
22
38
|
unknown = names - METADATA
|
23
|
-
raise VariableError.new(pagy), "
|
39
|
+
raise VariableError.new(pagy), "expected :metadata to be in #{DEFAULT[:metadata].inspect}, got #{unknown.inspect} unknown" \
|
24
40
|
unless unknown.empty?
|
25
41
|
|
26
42
|
scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
|
@@ -38,6 +54,6 @@ class Pagy
|
|
38
54
|
end
|
39
55
|
end
|
40
56
|
end
|
41
|
-
|
42
57
|
end
|
58
|
+
Backend.prepend MetadataExtra
|
43
59
|
end
|
data/lib/pagy/extras/navs.rb
CHANGED
@@ -4,11 +4,9 @@
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
6
|
class Pagy
|
7
|
-
module
|
8
|
-
|
7
|
+
module NavsExtra
|
9
8
|
# Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
10
|
-
def pagy_nav_js(pagy,
|
11
|
-
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
9
|
+
def pagy_nav_js(pagy, pagy_id: nil, link_extra: '', steps: nil)
|
12
10
|
p_id = %( id="#{pagy_id}") if pagy_id
|
13
11
|
link = pagy_link_proc(pagy, link_extra: link_extra)
|
14
12
|
tags = { 'before' => pagy_nav_prev_html(pagy, link),
|
@@ -17,46 +15,46 @@ class Pagy
|
|
17
15
|
'gap' => %(<span class="page gap">#{pagy_t 'pagy.nav.gap'}</span> ),
|
18
16
|
'after' => pagy_nav_next_html(pagy, link) }
|
19
17
|
|
20
|
-
%(<nav#{p_id} class="pagy-njs pagy-nav-js pagination" aria-label="pager" #{
|
18
|
+
%(<nav#{p_id} class="pagy-njs pagy-nav-js pagination" aria-label="pager" #{
|
19
|
+
pagy_json_attr(pagy, :nav, tags, pagy.sequels(steps))}></nav>)
|
21
20
|
end
|
22
21
|
|
23
22
|
# Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
24
|
-
def pagy_combo_nav_js(pagy,
|
25
|
-
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
23
|
+
def pagy_combo_nav_js(pagy, pagy_id: nil, link_extra: '')
|
26
24
|
p_id = %( id="#{pagy_id}") if pagy_id
|
27
25
|
link = pagy_link_proc(pagy, link_extra: link_extra)
|
28
26
|
p_page = pagy.page
|
29
27
|
p_pages = pagy.pages
|
30
|
-
input = %(<input type="number" min="1" max="#{p_pages}" value="#{
|
28
|
+
input = %(<input type="number" min="1" max="#{p_pages}" value="#{
|
29
|
+
p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
|
31
30
|
|
32
31
|
%(<nav#{p_id} class="pagy-combo-nav-js pagination" aria-label="pager" #{
|
33
|
-
pagy_json_attr pagy, :combo_nav, p_page, pagy_marked_link(link)
|
34
|
-
}>#{
|
32
|
+
pagy_json_attr pagy, :combo_nav, p_page, pagy_marked_link(link)}>#{
|
35
33
|
pagy_nav_prev_html pagy, link
|
36
|
-
|
34
|
+
}<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
|
37
35
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
38
|
-
|
36
|
+
}</span> #{
|
39
37
|
pagy_nav_next_html pagy, link
|
40
|
-
|
38
|
+
}</nav>)
|
41
39
|
end
|
42
40
|
|
43
41
|
private
|
44
42
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
43
|
+
def pagy_nav_prev_html(pagy, link)
|
44
|
+
if (p_prev = pagy.prev)
|
45
|
+
%(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
46
|
+
else
|
47
|
+
%(<span class="page prev disabled">#{pagy_t 'pagy.nav.prev'}</span> )
|
51
48
|
end
|
49
|
+
end
|
52
50
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
51
|
+
def pagy_nav_next_html(pagy, link)
|
52
|
+
if (p_next = pagy.next)
|
53
|
+
%(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
54
|
+
else
|
55
|
+
%(<span class="page next disabled">#{pagy_t 'pagy.nav.next'}</span>)
|
59
56
|
end
|
60
|
-
|
57
|
+
end
|
61
58
|
end
|
59
|
+
Frontend.prepend NavsExtra
|
62
60
|
end
|
data/lib/pagy/extras/overflow.rb
CHANGED
@@ -2,76 +2,73 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
class Pagy
|
5
|
+
DEFAULT[:overflow] = :empty_page
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def initialize(vars)
|
14
|
-
@overflow ||= false # don't override if :last_page re-run the method after an overflow
|
15
|
-
super
|
16
|
-
rescue OverflowError
|
17
|
-
@overflow = true # add the overflow flag
|
18
|
-
case @vars[:overflow]
|
19
|
-
when :exception
|
20
|
-
raise # same as without the extra
|
21
|
-
when :last_page
|
22
|
-
initial_page = @vars[:page] # save the very initial page (even after re-run)
|
23
|
-
initialize vars.merge!(page: @last) # re-run with the last page
|
24
|
-
@vars[:page] = initial_page # restore the inital page
|
25
|
-
when :empty_page
|
26
|
-
@offset = @items = @from = @to = 0 # vars relative to the actual page
|
27
|
-
@prev = @last # prev relative to the actual page
|
28
|
-
extend Series # special series for :empty_page
|
29
|
-
else
|
30
|
-
raise VariableError.new(self), "expected :overflow variable in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
|
7
|
+
# Handles OverflowError exceptions with different options
|
8
|
+
module OverflowExtra
|
9
|
+
# Support for Pagy class
|
10
|
+
module Pagy
|
11
|
+
# Is the requested page overflowing?
|
12
|
+
def overflow?
|
13
|
+
@overflow
|
31
14
|
end
|
32
|
-
end
|
33
15
|
|
34
|
-
|
35
|
-
def
|
36
|
-
@
|
37
|
-
super
|
38
|
-
|
39
|
-
|
16
|
+
# Add rescue clause for different behaviors
|
17
|
+
def initialize(vars)
|
18
|
+
@overflow ||= false # don't override if :last_page re-run the method after an overflow
|
19
|
+
super
|
20
|
+
rescue OverflowError
|
21
|
+
@overflow = true # add the overflow flag
|
22
|
+
case @vars[:overflow]
|
23
|
+
when :exception
|
24
|
+
raise # same as without the extra
|
25
|
+
when :last_page
|
26
|
+
initial_page = @vars[:page] # save the very initial page (even after re-run)
|
27
|
+
initialize vars.merge!(page: @last) # re-run with the last page
|
28
|
+
@vars[:page] = initial_page # restore the initial page
|
29
|
+
when :empty_page
|
30
|
+
@offset = @items = @from = @to = 0 # vars relative to the actual page
|
31
|
+
@prev = @last # prev relative to the actual page
|
32
|
+
extend Series # special series for :empty_page
|
33
|
+
else
|
34
|
+
raise VariableError.new(self), \
|
35
|
+
"expected :overflow to be in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
|
40
36
|
end
|
41
37
|
end
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
prepend UseOverflowExtra
|
46
|
-
|
47
38
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def finalize(items)
|
55
|
-
@overflow = false
|
56
|
-
super
|
57
|
-
rescue OverflowError
|
58
|
-
@overflow = true # add the overflow flag
|
59
|
-
case @vars[:overflow]
|
60
|
-
when :exception
|
61
|
-
raise # same as without the extra
|
62
|
-
when :empty_page
|
63
|
-
@offset = @items = @from = @to = 0 # vars relative to the actual page
|
64
|
-
@vars[:size] = [] # no page in the series
|
65
|
-
self
|
66
|
-
else
|
67
|
-
raise VariableError.new(self), "expected :overflow variable in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
|
39
|
+
module Series
|
40
|
+
def series(size = @vars[:size])
|
41
|
+
@page = @last # series for last page
|
42
|
+
super(size).tap do |s| # call original series
|
43
|
+
s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page)
|
44
|
+
@page = @vars[:page] # restore the actual page
|
68
45
|
end
|
69
46
|
end
|
70
|
-
|
71
47
|
end
|
72
|
-
|
48
|
+
end
|
73
49
|
|
50
|
+
# Support for Pagy::Countless class
|
51
|
+
module Countless
|
52
|
+
# Add rescue clause for different behaviors
|
53
|
+
def finalize(items)
|
54
|
+
@overflow = false
|
55
|
+
super
|
56
|
+
rescue OverflowError
|
57
|
+
@overflow = true # add the overflow flag
|
58
|
+
case @vars[:overflow]
|
59
|
+
when :exception
|
60
|
+
raise # same as without the extra
|
61
|
+
when :empty_page
|
62
|
+
@offset = @items = @from = @to = 0 # vars relative to the actual page
|
63
|
+
@vars[:size] = [] # no page in the series
|
64
|
+
self
|
65
|
+
else
|
66
|
+
raise VariableError.new(self), \
|
67
|
+
"expected :overflow to be in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
|
68
|
+
end
|
69
|
+
end
|
74
70
|
end
|
75
71
|
end
|
76
|
-
|
72
|
+
prepend OverflowExtra::Pagy
|
73
|
+
Countless.prepend OverflowExtra::Countless if defined?(Countless)
|
77
74
|
end
|
@@ -2,58 +2,64 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
class Pagy
|
5
|
+
DEFAULT[:searchkick_search_method] ||= :pagy_search
|
5
6
|
|
6
|
-
|
7
|
+
module SearchkickExtra
|
8
|
+
module Searchkick
|
9
|
+
# Return an array used to delay the call of #search
|
10
|
+
# after the pagination variables are merged to the options
|
11
|
+
# it also pushes to the same array an eventually called method
|
12
|
+
def pagy_searchkick(term = '*', **options, &block)
|
13
|
+
[self, term, options, block].tap do |args|
|
14
|
+
args.define_singleton_method(:method_missing) { |*a| args += a }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
alias_method Pagy::DEFAULT[:searchkick_search_method], :pagy_searchkick
|
18
|
+
end
|
7
19
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
20
|
+
# Additions for the Pagy class
|
21
|
+
module Pagy
|
22
|
+
# Create a Pagy object from a Searchkick::Results object
|
23
|
+
def new_from_searchkick(results, vars = {})
|
24
|
+
vars[:items] = results.options[:per_page]
|
25
|
+
vars[:page] = results.options[:page]
|
26
|
+
vars[:count] = results.total_count
|
27
|
+
new(vars)
|
15
28
|
end
|
16
29
|
end
|
17
|
-
alias_method VARS[:searchkick_search_method], :pagy_searchkick
|
18
|
-
end
|
19
30
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
vars[:page] = results.options[:page]
|
24
|
-
vars[:count] = results.total_count
|
25
|
-
new(vars)
|
26
|
-
end
|
31
|
+
# Add specialized backend methods to paginate Searchkick::Results
|
32
|
+
module Backend
|
33
|
+
private
|
27
34
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
options[:per_page] = vars[:items]
|
37
|
-
options[:page] = vars[:page]
|
38
|
-
results = model.search(term, **options, &block)
|
39
|
-
vars[:count] = results.total_count
|
40
|
-
|
41
|
-
pagy = Pagy.new(vars)
|
42
|
-
# with :last_page overflow we need to re-run the method in order to get the hits
|
43
|
-
return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page)) \
|
44
|
-
if defined?(Pagy::UseOverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
|
45
|
-
|
46
|
-
[ pagy, called.empty? ? results : results.send(*called) ]
|
47
|
-
end
|
35
|
+
# Return Pagy object and results
|
36
|
+
def pagy_searchkick(pagy_search_args, vars = {})
|
37
|
+
model, term, options, block, *called = pagy_search_args
|
38
|
+
vars = pagy_searchkick_get_vars(nil, vars)
|
39
|
+
options[:per_page] = vars[:items]
|
40
|
+
options[:page] = vars[:page]
|
41
|
+
results = model.search(term, **options, &block)
|
42
|
+
vars[:count] = results.total_count
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
44
|
+
pagy = ::Pagy.new(vars)
|
45
|
+
# with :last_page overflow we need to re-run the method in order to get the hits
|
46
|
+
return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page)) \
|
47
|
+
if defined?(::Pagy::OverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
|
48
|
+
|
49
|
+
[pagy, called.empty? ? results : results.send(*called)]
|
50
|
+
end
|
57
51
|
|
52
|
+
# Sub-method called only by #pagy_searchkick: here for easy customization of variables by overriding
|
53
|
+
# the _collection argument is not available when the method is called
|
54
|
+
def pagy_searchkick_get_vars(_collection, vars)
|
55
|
+
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
56
|
+
vars[:items] ||= DEFAULT[:items]
|
57
|
+
vars[:page] ||= (params[vars[:page_param] || DEFAULT[:page_param]] || 1).to_i
|
58
|
+
vars
|
59
|
+
end
|
60
|
+
end
|
58
61
|
end
|
62
|
+
Searchkick = SearchkickExtra::Searchkick
|
63
|
+
extend SearchkickExtra::Pagy
|
64
|
+
Backend.prepend SearchkickExtra::Backend
|
59
65
|
end
|