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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config/pagy.rb +66 -45
  3. data/lib/javascripts/pagy.js +15 -6
  4. data/lib/pagy/backend.rb +6 -10
  5. data/lib/pagy/console.rb +5 -4
  6. data/lib/pagy/countless.rb +13 -20
  7. data/lib/pagy/exceptions.rb +2 -4
  8. data/lib/pagy/extras/arel.rb +6 -6
  9. data/lib/pagy/extras/array.rb +6 -6
  10. data/lib/pagy/extras/bootstrap.rb +32 -29
  11. data/lib/pagy/extras/bulma.rb +40 -32
  12. data/lib/pagy/extras/countless.rb +8 -9
  13. data/lib/pagy/extras/elasticsearch_rails.rb +64 -47
  14. data/lib/pagy/extras/foundation.rb +26 -26
  15. data/lib/pagy/extras/gearbox.rb +42 -0
  16. data/lib/pagy/extras/headers.rb +24 -16
  17. data/lib/pagy/extras/i18n.rb +7 -16
  18. data/lib/pagy/extras/items.rb +37 -38
  19. data/lib/pagy/extras/materialize.rb +28 -30
  20. data/lib/pagy/extras/meilisearch.rb +50 -45
  21. data/lib/pagy/extras/metadata.rb +29 -13
  22. data/lib/pagy/extras/navs.rb +24 -26
  23. data/lib/pagy/extras/overflow.rb +57 -60
  24. data/lib/pagy/extras/searchkick.rb +51 -45
  25. data/lib/pagy/extras/semantic.rb +28 -30
  26. data/lib/pagy/extras/shared.rb +44 -40
  27. data/lib/pagy/extras/standalone.rb +37 -42
  28. data/lib/pagy/extras/support.rb +14 -13
  29. data/lib/pagy/extras/trim.rb +10 -11
  30. data/lib/pagy/extras/uikit.rb +27 -28
  31. data/lib/pagy/frontend.rb +22 -47
  32. data/lib/pagy/i18n.rb +159 -0
  33. data/lib/pagy/url_helpers.rb +22 -0
  34. data/lib/pagy.rb +52 -26
  35. data/lib/templates/uikit_nav.html.erb +1 -1
  36. data/lib/templates/uikit_nav.html.slim +1 -1
  37. metadata +7 -10
  38. data/lib/locales/utils/i18n.rb +0 -17
  39. data/lib/locales/utils/loader.rb +0 -31
  40. data/lib/locales/utils/p11n.rb +0 -112
  41. 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 Frontend
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, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
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" #{pagy_json_attr(pagy, :nav, tags, pagy.sequels(steps))}></div>)
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, deprecated_id=nil, pagy_id: nil, link_extra: '')
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="#{p_page}" style="text-align: center; width: #{p_pages.to_s.length+1}rem;">)
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" aria-label="pager" style="padding-right: 0" #{
53
- pagy_json_attr pagy, :combo_nav, p_page, pagy_marked_link(link)
54
- }>#{
55
- pagy_materialize_prev_html pagy, link, style
56
- }<li class="pagy-combo-input">#{
57
- pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
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
- def pagy_materialize_prev_html(pagy, link, style='')
66
- if (p_prev = pagy.prev)
67
- %(<li class="waves-effect prev"#{style}>#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
68
- else
69
- %(<li class="prev disabled"#{style}><a href="#"><i class="material-icons">chevron_left</i></a></li>)
70
- end
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
- def pagy_materialize_next_html(pagy, link, style='')
74
- if (p_next = pagy.next)
75
- %(<li class="waves-effect next"#{style}>#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
76
- else
77
- %(<li class="next disabled"#{style}><a href="#"><i class="material-icons">chevron_right</i></a></li>)
78
- end
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
- VARS[:meilisearch_search_method] ||= :pagy_search
6
-
7
- module Meilisearch
8
- # returns 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]
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
- # Add specialized backend methods to paginate Meilisearch results
25
- module Backend
26
- private
27
-
28
- # Return Pagy object and results
29
- def pagy_meilisearch(pagy_search_args, vars = {})
30
- model, term, options = pagy_search_args
31
- vars = pagy_meilisearch_get_vars(nil, vars)
32
- options[:limit] = vars[:items]
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
- # Sub-method called only by #pagy_meilisearch: here for easy customization of variables by overriding
46
- # the _collection argument is not available when the method is called
47
- def pagy_meilisearch_get_vars(_collection, vars)
48
- pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
49
- vars[:items] ||= VARS[:items]
50
- vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
51
- vars
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
@@ -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 Backend
7
- private
8
+ module MetadataExtra
9
+ private
8
10
 
9
- METADATA = %i[ scaffold_url first_url prev_url page_url next_url last_url
10
- count page items vars pages last from to prev next series
11
- ].tap do |metadata|
12
- metadata << :sequels if VARS.key?(:steps) # :steps gets defined along with the #sequels method
13
- end.freeze
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
- VARS[:metadata] = METADATA.dup
30
+ # Set the default metadata variable
31
+ Pagy::DEFAULT[:metadata] = METADATA.dup
16
32
 
17
- include Helpers
33
+ include UrlHelpers
18
34
 
19
- def pagy_metadata(pagy, deprecated_url=nil, absolute: nil)
20
- absolute = Pagy.deprecated_arg(:url, deprecated_url, :absolute, absolute) if deprecated_url
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), "unknown metadata #{unknown.inspect}" \
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
@@ -4,11 +4,9 @@
4
4
  require 'pagy/extras/shared'
5
5
 
6
6
  class Pagy
7
- module Frontend
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, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
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" #{pagy_json_attr(pagy, :nav, tags, pagy.sequels(steps))}></nav>)
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, deprecated_id=nil, pagy_id: nil, link_extra: '')
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="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
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
- }<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
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
- }</span> #{
36
+ }</span> #{
39
37
  pagy_nav_next_html pagy, link
40
- }</nav>)
38
+ }</nav>)
41
39
  end
42
40
 
43
41
  private
44
42
 
45
- def pagy_nav_prev_html(pagy, link)
46
- if (p_prev = pagy.prev)
47
- %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
48
- else
49
- %(<span class="page prev disabled">#{pagy_t 'pagy.nav.prev'}</span> )
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
- def pagy_nav_next_html(pagy, link)
54
- if (p_next = pagy.next)
55
- %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
56
- else
57
- %(<span class="page next disabled">#{pagy_t 'pagy.nav.next'}</span>)
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
@@ -2,76 +2,73 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy
5
+ DEFAULT[:overflow] = :empty_page
5
6
 
6
- module UseOverflowExtra
7
- VARS[:overflow] = :empty_page
8
-
9
- def overflow?
10
- @overflow
11
- end
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
- module Series
35
- def series(size=@vars[:size])
36
- @page = @last # series for last page
37
- super(size).tap do |s| # call original series
38
- s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page)
39
- @page = @vars[:page] # restore the actual page
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
- # support for Pagy::Countless
49
- if defined?(Pagy::Countless)
50
- class Countless
51
-
52
- module UseOverflowExtra
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
- prepend UseOverflowExtra
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
- VARS[:searchkick_search_method] ||= :pagy_search
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
- module Searchkick
9
- # returns 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}
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
- # create a Pagy object from a Searchkick::Results object
21
- def self.new_from_searchkick(results, vars={})
22
- vars[:items] = results.options[:per_page]
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
- # Add specialized backend methods to paginate Searchkick::Results
29
- module Backend
30
- private
31
-
32
- # Return Pagy object and results
33
- def pagy_searchkick(pagy_search_args, vars={})
34
- model, term, options, block, *called = pagy_search_args
35
- vars = pagy_searchkick_get_vars(nil, vars)
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
- # Sub-method called only by #pagy_searchkick: here for easy customization of variables by overriding
50
- # the _collection argument is not available when the method is called
51
- def pagy_searchkick_get_vars(_collection, vars)
52
- pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
53
- vars[:items] ||= VARS[:items]
54
- vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
55
- vars
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