pagy 6.0.0 → 7.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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/lib/config/pagy.rb +56 -44
  4. data/lib/javascripts/pagy-dev.js +3 -3
  5. data/lib/javascripts/pagy-module.js +2 -2
  6. data/lib/javascripts/pagy.js +1 -1
  7. data/lib/locales/ar.yml +15 -11
  8. data/lib/locales/be.yml +25 -0
  9. data/lib/locales/bg.yml +10 -11
  10. data/lib/locales/bs.yml +12 -11
  11. data/lib/locales/ca.yml +12 -11
  12. data/lib/locales/cs.yml +13 -10
  13. data/lib/locales/da.yml +14 -13
  14. data/lib/locales/de.yml +10 -11
  15. data/lib/locales/en.yml +10 -11
  16. data/lib/locales/es.yml +10 -11
  17. data/lib/locales/fr.yml +10 -11
  18. data/lib/locales/hr.yml +12 -11
  19. data/lib/locales/id.yml +10 -11
  20. data/lib/locales/it.yml +10 -11
  21. data/lib/locales/ja.yml +10 -11
  22. data/lib/locales/km.yml +10 -10
  23. data/lib/locales/ko.yml +10 -11
  24. data/lib/locales/nb.yml +10 -11
  25. data/lib/locales/nl.yml +10 -11
  26. data/lib/locales/nn.yml +10 -11
  27. data/lib/locales/pl.yml +12 -11
  28. data/lib/locales/pt-BR.yml +10 -11
  29. data/lib/locales/pt.yml +10 -11
  30. data/lib/locales/ru.yml +14 -11
  31. data/lib/locales/sr.yml +12 -10
  32. data/lib/locales/sv-SE.yml +10 -12
  33. data/lib/locales/sv.yml +10 -12
  34. data/lib/locales/sw.yml +12 -11
  35. data/lib/locales/ta.yml +12 -11
  36. data/lib/locales/tr.yml +10 -11
  37. data/lib/locales/uk.yml +12 -11
  38. data/lib/locales/vi.yml +17 -0
  39. data/lib/locales/zh-CN.yml +10 -11
  40. data/lib/locales/zh-HK.yml +10 -11
  41. data/lib/locales/zh-TW.yml +10 -11
  42. data/lib/pagy/backend.rb +10 -4
  43. data/lib/pagy/calendar/day.rb +4 -3
  44. data/lib/pagy/calendar/helper.rb +15 -11
  45. data/lib/pagy/calendar/month.rb +4 -3
  46. data/lib/pagy/calendar/quarter.rb +4 -3
  47. data/lib/pagy/calendar/week.rb +1 -1
  48. data/lib/pagy/calendar/year.rb +3 -2
  49. data/lib/pagy/calendar.rb +33 -7
  50. data/lib/pagy/console.rb +1 -1
  51. data/lib/pagy/countless.rb +1 -1
  52. data/lib/pagy/exceptions.rb +1 -1
  53. data/lib/pagy/extras/arel.rb +1 -1
  54. data/lib/pagy/extras/array.rb +1 -1
  55. data/lib/pagy/extras/bootstrap.rb +45 -32
  56. data/lib/pagy/extras/bulma.rb +41 -32
  57. data/lib/pagy/extras/calendar.rb +17 -13
  58. data/lib/pagy/extras/countless.rb +1 -1
  59. data/lib/pagy/extras/elasticsearch_rails.rb +8 -8
  60. data/lib/pagy/extras/foundation.rb +48 -33
  61. data/lib/pagy/extras/frontend_helpers.rb +11 -11
  62. data/lib/pagy/extras/gearbox.rb +1 -1
  63. data/lib/pagy/extras/headers.rb +8 -8
  64. data/lib/pagy/extras/i18n.rb +5 -5
  65. data/lib/pagy/extras/items.rb +19 -12
  66. data/lib/pagy/extras/jsonapi.rb +79 -0
  67. data/lib/pagy/extras/materialize.rb +42 -30
  68. data/lib/pagy/extras/meilisearch.rb +12 -11
  69. data/lib/pagy/extras/metadata.rb +2 -2
  70. data/lib/pagy/extras/navs.rb +22 -34
  71. data/lib/pagy/extras/overflow.rb +9 -7
  72. data/lib/pagy/extras/searchkick.rb +8 -8
  73. data/lib/pagy/extras/semantic.rb +41 -28
  74. data/lib/pagy/extras/standalone.rb +10 -16
  75. data/lib/pagy/extras/support.rb +19 -33
  76. data/lib/pagy/extras/trim.rb +4 -4
  77. data/lib/pagy/extras/uikit.rb +44 -31
  78. data/lib/pagy/frontend.rb +57 -26
  79. data/lib/pagy/i18n.rb +3 -3
  80. data/lib/pagy/url_helpers.rb +15 -12
  81. data/lib/pagy.rb +57 -41
  82. metadata +7 -19
  83. data/lib/templates/bootstrap_nav.html.erb +0 -24
  84. data/lib/templates/bootstrap_nav.html.haml +0 -34
  85. data/lib/templates/bootstrap_nav.html.slim +0 -34
  86. data/lib/templates/bulma_nav.html.erb +0 -24
  87. data/lib/templates/bulma_nav.html.haml +0 -32
  88. data/lib/templates/bulma_nav.html.slim +0 -32
  89. data/lib/templates/foundation_nav.html.erb +0 -24
  90. data/lib/templates/foundation_nav.html.haml +0 -34
  91. data/lib/templates/foundation_nav.html.slim +0 -34
  92. data/lib/templates/nav.html.erb +0 -22
  93. data/lib/templates/nav.html.haml +0 -30
  94. data/lib/templates/nav.html.slim +0 -29
  95. data/lib/templates/uikit_nav.html.erb +0 -15
  96. data/lib/templates/uikit_nav.html.haml +0 -28
  97. data/lib/templates/uikit_nav.html.slim +0 -28
@@ -1,13 +1,13 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/headers
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/headers
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/url_helpers'
5
5
 
6
6
  class Pagy # :nodoc:
7
- DEFAULT[:headers] = { page: 'Current-Page',
8
- items: 'Page-Items',
9
- count: 'Total-Count',
10
- pages: 'Total-Pages' }
7
+ DEFAULT[:headers] = { page: 'current-page',
8
+ items: 'page-items',
9
+ count: 'total-count',
10
+ pages: 'total-pages' }
11
11
  # Add specialized backend methods to add pagination response headers
12
12
  module HeadersExtra
13
13
  include UrlHelpers
@@ -22,7 +22,7 @@ class Pagy # :nodoc:
22
22
  # Generate a hash of RFC-8288 compliant http headers
23
23
  def pagy_headers(pagy)
24
24
  pagy_headers_hash(pagy).tap do |hash|
25
- hash['Link'] = hash['Link'].map { |rel, link| %(<#{link}>; rel="#{rel}") }.join(', ')
25
+ hash['link'] = hash['link'].map { |rel, link| %(<#{link}>; rel="#{rel}") }.join(', ')
26
26
  end
27
27
  end
28
28
 
@@ -32,11 +32,11 @@ class Pagy # :nodoc:
32
32
  rel = { 'first' => 1, 'prev' => pagy.prev, 'next' => pagy.next }
33
33
  rel['last'] = pagy.last unless countless
34
34
  url_str = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: true)
35
- link = rel.map do |r, num| # filter_map if ruby >=2.7
35
+ link = rel.filter_map do |r, num|
36
36
  next unless num # rubocop:disable Layout/EmptyLineAfterGuardClause
37
37
  [r, url_str.sub(PAGE_PLACEHOLDER, num.to_s)]
38
38
  end.compact.to_h
39
- hash = { 'Link' => link }
39
+ hash = { 'link' => link }
40
40
  headers = pagy.vars[:headers]
41
41
  hash[headers[:page]] = pagy.page.to_s if headers[:page]
42
42
  if headers[:items] && !(defined?(Calendar) && pagy.is_a?(Calendar)) # items is not for Calendar
@@ -1,25 +1,25 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/i18n
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/i18n
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
5
5
  # Use ::I18n gem
6
6
  module I18nExtra
7
7
  # Frontend overriding for translation
8
- module Frontend
8
+ module FrontendOverride
9
9
  def pagy_t(key, **opts)
10
10
  ::I18n.t(key, **opts)
11
11
  end
12
12
  end
13
+ Frontend.prepend I18nExtra::FrontendOverride
13
14
 
14
15
  # Calendar overriding for localization (see also the block in the calendar section of the config/pagy.rb initializer)
15
- module Calendar
16
+ module CalendarOverride
16
17
  def localize(time, opts)
17
18
  ::I18n.l(time, **opts)
18
19
  end
19
20
  end
20
21
  end
21
- Frontend.prepend I18nExtra::Frontend
22
- Calendar.prepend I18nExtra::Calendar if defined?(Calendar)
22
+ Calendar.prepend I18nExtra::CalendarOverride if defined?(Calendar)
23
23
 
24
24
  # Add the pagy locales to the I18n.load_path
25
25
  ::I18n.load_path += Dir[Pagy.root.join('locales', '*.yml')]
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/items
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/items
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -11,44 +11,51 @@ class Pagy # :nodoc:
11
11
  # Allow the client to request a custom number of items per page with an optional selector UI
12
12
  module ItemsExtra
13
13
  # Additions for the Backend module
14
- module Backend
14
+ module BackendAddOn
15
15
  private
16
16
 
17
17
  # Set the items variable considering the params and other pagy variables
18
18
  def pagy_set_items_from_params(vars)
19
19
  return if vars[:items] # :items explicitly set
20
20
  return unless vars.key?(:items_extra) ? vars[:items_extra] : DEFAULT[:items_extra] # :items_extra is false
21
- return unless (items = params[vars[:items_param] || DEFAULT[:items_param]]) # no items from request params
21
+ return unless (items_count = pagy_get_items_size(vars)) # no items from request params
22
22
 
23
- vars[:items] = [items.to_i, vars.key?(:max_items) ? vars[:max_items] : DEFAULT[:max_items]].compact.min
23
+ vars[:items] = [items_count.to_i, vars.key?(:max_items) ? vars[:max_items] : DEFAULT[:max_items]].compact.min
24
+ end
25
+
26
+ # Get the items count from the params
27
+ # Overridable by the jsonapi extra
28
+ def pagy_get_items_size(vars)
29
+ params[vars[:items_param] || DEFAULT[:items_param]]
24
30
  end
25
31
  end
32
+ Backend.prepend ItemsExtra::BackendAddOn
26
33
 
27
34
  # Additions for the Frontend module
28
- module Frontend
35
+ module FrontendAddOn
29
36
  ITEMS_PLACEHOLDER = '__pagy_items__'
30
37
 
31
38
  # Return the items selector HTML. For example "Show [20] items per page"
32
- def pagy_items_selector_js(pagy, pagy_id: nil, item_name: nil, i18n_key: nil, link_extra: '')
39
+ def pagy_items_selector_js(pagy, pagy_id: nil, item_name: nil, item_i18n_key: nil, link_extra: '')
33
40
  return '' unless pagy.vars[:items_extra]
34
41
 
35
42
  p_id = %( id="#{pagy_id}") if pagy_id
36
43
  p_vars = pagy.vars
37
44
  p_items = p_vars[:items]
38
45
  p_vars[:items] = ITEMS_PLACEHOLDER
39
- link = pagy_marked_link(pagy_link_proc(pagy, link_extra: link_extra))
46
+ link = pagy_marked_link(pagy_link_proc(pagy, link_extra:))
40
47
  p_vars[:items] = p_items # restore the items
41
48
 
42
49
  html = +%(<span#{p_id} class="pagy-items-selector-js" #{pagy_data(pagy, :selector, pagy.from, link)}>)
43
50
  input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{
44
51
  p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length + 1}rem;">)
45
- html << pagy_t('pagy.items_selector_js', item_name: item_name || pagy_t(i18n_key || p_vars[:i18n_key], count: p_items),
46
- items_input: input,
47
- count: p_items)
52
+ html << pagy_t('pagy.items_selector_js',
53
+ item_name: item_name || pagy_t(item_i18n_key || p_vars[:item_i18n_key], count: p_items),
54
+ items_input: input,
55
+ count: p_items)
48
56
  html << %(</span>)
49
57
  end
50
58
  end
59
+ Frontend.prepend ItemsExtra::FrontendAddOn
51
60
  end
52
- Backend.prepend ItemsExtra::Backend
53
- Frontend.prepend ItemsExtra::Frontend
54
61
  end
@@ -0,0 +1,79 @@
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/jsonapi
2
+ # frozen_string_literal: true
3
+
4
+ require 'pagy/url_helpers'
5
+
6
+ class Pagy # :nodoc:
7
+ DEFAULT[:jsonapi] = true
8
+
9
+ # Add a specialized backend method compliant with JSON:API
10
+ module JsonApiExtra
11
+ # JsonApi :page param error
12
+ class ReservedParamError < StandardError
13
+ # Inform about the actual value
14
+ def initialize(value)
15
+ super("expected reserved :page param to be nil or Hash-like; got #{value.inspect}")
16
+ end
17
+ end
18
+
19
+ # Module overriding Backend
20
+ module BackendOverride
21
+ private
22
+
23
+ include UrlHelpers
24
+
25
+ # Return the jsonapi links
26
+ def pagy_jsonapi_links(pagy, **opts)
27
+ { first: pagy_url_for(pagy, 1, **opts),
28
+ last: pagy_url_for(pagy, pagy.last, **opts),
29
+ prev: pagy_url_for(pagy, pagy.prev, **opts),
30
+ next: pagy_url_for(pagy, pagy.next, **opts) }
31
+ end
32
+
33
+ # Should skip the jsonapi
34
+ def pagy_skip_jsonapi?(vars)
35
+ return true if vars[:jsonapi] == false || (vars[:jsonapi].nil? && DEFAULT[:jsonapi] == false)
36
+ # check the reserved :page param
37
+ raise ReservedParamError, params[:page] unless params[:page].respond_to?(:fetch) || params[:page].nil?
38
+ end
39
+
40
+ # Override the Backend method
41
+ def pagy_get_page(vars)
42
+ return super if pagy_skip_jsonapi?(vars)
43
+ return 1 if params[:page].nil?
44
+
45
+ params[:page][vars[:page_param] || DEFAULT[:page_param]].to_i
46
+ end
47
+ end
48
+ Backend.prepend BackendOverride
49
+
50
+ # Module overriding ItemsExtra
51
+ module ItemsExtraOverride
52
+ private
53
+
54
+ # Override the ItemsExtra::Backend method
55
+ def pagy_get_items_size(vars)
56
+ return super if pagy_skip_jsonapi?(vars)
57
+ return if params[:page].nil?
58
+
59
+ params[:page][vars[:items_param] || DEFAULT[:items_param]]
60
+ end
61
+ end
62
+ # :nocov:
63
+ ItemsExtra::BackendAddOn.prepend ItemsExtraOverride if defined?(ItemsExtra::BackendAddOn)
64
+ # :nocov:
65
+
66
+ # Module overriding UrlHelper
67
+ module UrlHelperOverride
68
+ # Override UrlHelper method
69
+ def pagy_set_query_params(page, vars, params)
70
+ return super unless vars[:jsonapi]
71
+
72
+ params['page'] ||= {}
73
+ params['page'][vars[:page_param].to_s] = page
74
+ params['page'][vars[:items_param].to_s] = vars[:items] if vars[:items_extra]
75
+ end
76
+ end
77
+ UrlHelpers.prepend UrlHelperOverride
78
+ end
79
+ end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/materialize
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/materialize
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -8,75 +8,87 @@ class Pagy # :nodoc:
8
8
  # The resulting code may not look very elegant, but produces the best benchmarks
9
9
  module MaterializeExtra
10
10
  # Pagination for materialize: it returns the html with the series of links to the pages
11
- def pagy_materialize_nav(pagy, pagy_id: nil, link_extra: '', **vars)
11
+ def pagy_materialize_nav(pagy, pagy_id: nil, link_extra: '',
12
+ nav_aria_label: nil, nav_i18n_key: nil, **vars)
12
13
  p_id = %( id="#{pagy_id}") if pagy_id
13
- link = pagy_link_proc(pagy, link_extra: link_extra)
14
+ link = pagy_link_proc(pagy, link_extra:)
14
15
 
15
- html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation"><ul class="pagination">)
16
- html << pagy_materialize_prev_html(pagy, link)
16
+ html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation" #{
17
+ nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}><ul class="pagination">)
18
+ html << materialize_prev_html(pagy, link)
17
19
  pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
18
20
  html << case item
19
- when Integer then %(<li class="waves-effect">#{link.call item}</li>) # page link
20
- when String then %(<li class="active">#{link.call item}</li>) # active page
21
- when :gap then %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>) # page gap
22
- else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
21
+ when Integer
22
+ %(<li class="waves-effect">#{link.call(item)}</li>)
23
+ when String
24
+ %(<li class="active">#{link.call(item)}</li>)
25
+ when :gap
26
+ %(<li class="gap disabled"><a href="#" aria-disabled="true">#{pagy_t 'pagy.gap'}</a></li>)
27
+ else
28
+ raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
23
29
  end
24
30
  end
25
- html << pagy_materialize_next_html(pagy, link)
31
+ html << materialize_next_html(pagy, link)
26
32
  html << %(</ul></div>)
27
33
  end
28
34
 
29
35
  # Javascript pagination for materialize: it returns a nav and a JSON tag used by the pagy.js file
30
- def pagy_materialize_nav_js(pagy, pagy_id: nil, link_extra: '', **vars)
36
+ def pagy_materialize_nav_js(pagy, pagy_id: nil, link_extra: '',
37
+ nav_aria_label: nil, nav_i18n_key: nil, **vars)
31
38
  sequels = pagy.sequels(**vars)
32
39
  p_id = %( id="#{pagy_id}") if pagy_id
33
- link = pagy_link_proc(pagy, link_extra: link_extra)
40
+ link = pagy_link_proc(pagy, link_extra:)
34
41
 
35
- tags = { 'before' => %(<ul class="pagination">#{pagy_materialize_prev_html pagy, link}),
36
- 'link' => %(<li class="waves-effect">#{mark = link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER)}</li>),
37
- 'active' => %(<li class="active">#{mark}</li>),
38
- 'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>),
39
- 'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
42
+ tags = { 'before' => %(<ul class="pagination">#{materialize_prev_html pagy, link}),
43
+ 'link' => %(<li class="waves-effect">#{html = link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER)}</li>),
44
+ 'active' => %(<li class="active">#{html}</li>),
45
+ 'gap' => %(<li class="gap disabled"><a href="#" aria-disabled="true">#{pagy_t 'pagy.gap'}</a></li>),
46
+ 'after' => %(#{materialize_next_html pagy, link}</ul>) }
40
47
 
41
48
  %(<div#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-materialize-nav-js" role="navigation" #{
42
- pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></div>)
49
+ nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)} #{
50
+ pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></div>)
43
51
  end
44
52
 
45
53
  # Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the pagy.js file
46
- def pagy_materialize_combo_nav_js(pagy, pagy_id: nil, link_extra: '')
54
+ def pagy_materialize_combo_nav_js(pagy, pagy_id: nil, link_extra: '',
55
+ nav_aria_label: nil, nav_i18n_key: nil)
47
56
  p_id = %( id="#{pagy_id}") if pagy_id
48
- link = pagy_link_proc(pagy, link_extra: link_extra)
57
+ link = pagy_link_proc(pagy, link_extra:)
49
58
  p_page = pagy.page
50
59
  p_pages = pagy.pages
51
60
  style = ' style="vertical-align: middle"'
52
61
  input = %(<input type="number" class="browser-default" min="1" max="#{p_pages}" value="#{
53
- p_page}" style="text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
62
+ p_page}" style="text-align: center; width: #{p_pages.to_s.length + 1}rem;" aria-current="page">)
54
63
 
55
- html = %(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation")
64
+ html = %(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation" #{
65
+ nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)})
56
66
  %(#{html} style="padding-right: 0" #{
57
67
  pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
58
- pagy_materialize_prev_html pagy, link, style}<li class="pagy-combo-input">#{
68
+ materialize_prev_html pagy, link, style}<li class="pagy-combo-input">#{
59
69
  pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</li>#{
60
- pagy_materialize_next_html pagy, link, style}</ul>)
70
+ materialize_next_html pagy, link, style}</ul>)
61
71
  end
62
72
 
63
73
  private
64
74
 
65
- def pagy_materialize_prev_html(pagy, link, style = '')
75
+ def materialize_prev_html(pagy, link, style = '')
66
76
  if (p_prev = pagy.prev)
67
77
  %(<li class="waves-effect prev"#{style}>#{
68
- link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
78
+ link.call(p_prev, '<i class="material-icons">chevron_left</i>', prev_aria_label_attr)}</li>)
69
79
  else
70
- %(<li class="prev disabled"#{style}><a href="#"><i class="material-icons">chevron_left</i></a></li>)
80
+ %(<li class="prev disabled"#{style}><a href="#" aria-disabled="true" #{
81
+ prev_aria_label_attr}><i class="material-icons">chevron_left</i></a></li>)
71
82
  end
72
83
  end
73
84
 
74
- def pagy_materialize_next_html(pagy, link, style = '')
85
+ def materialize_next_html(pagy, link, style = '')
75
86
  if (p_next = pagy.next)
76
87
  %(<li class="waves-effect next"#{style}>#{
77
- link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
88
+ link.call(p_next, '<i class="material-icons">chevron_right</i>', next_aria_label_attr)}</li>)
78
89
  else
79
- %(<li class="next disabled"#{style}><a href="#"><i class="material-icons">chevron_right</i></a></li>)
90
+ %(<li class="next disabled"#{style}><a href="#" aria-disabled="true" #{
91
+ next_aria_label_attr}><i class="material-icons">chevron_right</i></a></li>)
80
92
  end
81
93
  end
82
94
  end
@@ -1,3 +1,4 @@
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/meilisearch
1
2
  # frozen_string_literal: true
2
3
 
3
4
  class Pagy # :nodoc:
@@ -6,17 +7,18 @@ class Pagy # :nodoc:
6
7
 
7
8
  # Paginate Meilisearch results
8
9
  module MeilisearchExtra
9
- module Meilisearch # :nodoc:
10
+ module ModelExtension # :nodoc:
10
11
  # Return an array used to delay the call of #search
11
12
  # after the pagination variables are merged to the options
12
- def pagy_meilisearch(term = nil, **vars)
13
- [self, term, vars]
13
+ def pagy_meilisearch(query, params = {})
14
+ [self, query, params]
14
15
  end
15
16
  alias_method DEFAULT[:meilisearch_pagy_search], :pagy_meilisearch
16
17
  end
18
+ Pagy::Meilisearch = ModelExtension
17
19
 
18
- # Additions for the Pagy class
19
- module Pagy
20
+ # Extension for the Pagy class
21
+ module PagyExtension
20
22
  # Create a Pagy object from a Meilisearch results
21
23
  def new_from_meilisearch(results, vars = {})
22
24
  vars[:items] = results.raw_answer['hitsPerPage']
@@ -26,9 +28,10 @@ class Pagy # :nodoc:
26
28
  new(vars)
27
29
  end
28
30
  end
31
+ Pagy.extend PagyExtension
29
32
 
30
33
  # Add specialized backend methods to paginate Meilisearch results
31
- module Backend
34
+ module BackendAddOn
32
35
  private
33
36
 
34
37
  # Return Pagy object and results
@@ -37,7 +40,7 @@ class Pagy # :nodoc:
37
40
  vars = pagy_meilisearch_get_vars(nil, vars)
38
41
  options[:hits_per_page] = vars[:items]
39
42
  options[:page] = vars[:page]
40
- results = model.send(:ms_search, term, **options)
43
+ results = model.send(:ms_search, term, options)
41
44
  vars[:count] = results.raw_answer['totalHits']
42
45
 
43
46
  pagy = ::Pagy.new(vars)
@@ -53,12 +56,10 @@ class Pagy # :nodoc:
53
56
  def pagy_meilisearch_get_vars(_collection, vars)
54
57
  pagy_set_items_from_params(vars) if defined?(ItemsExtra)
55
58
  vars[:items] ||= DEFAULT[:items]
56
- vars[:page] ||= (params[vars[:page_param] || DEFAULT[:page_param]] || 1).to_i
59
+ vars[:page] ||= pagy_get_page(vars)
57
60
  vars
58
61
  end
59
62
  end
63
+ Backend.prepend BackendAddOn
60
64
  end
61
- Meilisearch = MeilisearchExtra::Meilisearch
62
- extend MeilisearchExtra::Pagy
63
- Backend.prepend MeilisearchExtra::Backend
64
65
  end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/metadata
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/metadata
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/url_helpers'
@@ -15,7 +15,7 @@ class Pagy # :nodoc:
15
15
 
16
16
  # Return the metadata hash
17
17
  def pagy_metadata(pagy, absolute: nil)
18
- scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
18
+ scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute:)
19
19
  {}.tap do |metadata|
20
20
  keys = defined?(Calendar) && pagy.is_a?(Calendar) ? pagy.vars[:metadata] - %i[count items] : pagy.vars[:metadata]
21
21
  keys.each do |key|
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/navs
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/navs
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -8,56 +8,44 @@ class Pagy # :nodoc:
8
8
  # The resulting code may not look very elegant, but produces the best benchmarks
9
9
  module NavsExtra
10
10
  # Javascript pagination: it returns a nav and a JSON tag used by the pagy.js file
11
- def pagy_nav_js(pagy, pagy_id: nil, link_extra: '', **vars)
11
+ def pagy_nav_js(pagy, pagy_id: nil, link_extra: '',
12
+ nav_aria_label: nil, nav_i18n_key: nil, **vars)
12
13
  sequels = pagy.sequels(**vars)
13
14
  p_id = %( id="#{pagy_id}") if pagy_id
14
- link = pagy_link_proc(pagy, link_extra: link_extra)
15
- tags = { 'before' => pagy_nav_prev_html(pagy, link),
15
+ link = pagy_link_proc(pagy, link_extra:)
16
+ tags = { 'before' => prev_html(pagy, link),
16
17
  'link' => %(<span class="page">#{link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER)}</span> ),
17
- 'active' => %(<span class="page active">#{LABEL_PLACEHOLDER}</span> ),
18
- 'gap' => %(<span class="page gap">#{pagy_t 'pagy.nav.gap'}</span> ),
19
- 'after' => pagy_nav_next_html(pagy, link) }
18
+ 'active' => %(<span class="page active">) +
19
+ %(<a role="link" aria-current="page" aria-disabled="true">#{LABEL_PLACEHOLDER}</a></span> ),
20
+ 'gap' => %(<span class="page gap">#{pagy_t 'pagy.gap'}</span> ),
21
+ 'after' => next_html(pagy, link) }
20
22
 
21
23
  %(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-nav-js pagination" #{
22
- pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
24
+ nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)} #{
25
+ pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))
26
+ }></nav>)
23
27
  end
24
28
 
25
29
  # Javascript combo pagination: it returns a nav and a JSON tag used by the pagy.js file
26
- def pagy_combo_nav_js(pagy, pagy_id: nil, link_extra: '')
30
+ def pagy_combo_nav_js(pagy, pagy_id: nil, link_extra: '',
31
+ nav_aria_label: nil, nav_i18n_key: nil)
27
32
  p_id = %( id="#{pagy_id}") if pagy_id
28
- link = pagy_link_proc(pagy, link_extra: link_extra)
33
+ link = pagy_link_proc(pagy, link_extra:)
29
34
  p_page = pagy.page
30
35
  p_pages = pagy.pages
31
- input = %(<input type="number" min="1" max="#{p_pages}" value="#{
32
- p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
36
+ input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" ) +
37
+ %(style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem;" aria-current="page">)
33
38
 
34
39
  %(<nav#{p_id} class="pagy-combo-nav-js pagination" #{
40
+ nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)} #{
35
41
  pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
36
- pagy_nav_prev_html pagy, link
37
- }<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
38
- pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
42
+ prev_html(pagy, link)
43
+ }<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
44
+ pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
39
45
  }</span> #{
40
- pagy_nav_next_html pagy, link
46
+ next_html(pagy, link)
41
47
  }</nav>)
42
48
  end
43
-
44
- private
45
-
46
- def pagy_nav_prev_html(pagy, link)
47
- if (p_prev = pagy.prev)
48
- %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
49
- else
50
- %(<span class="page prev disabled">#{pagy_t 'pagy.nav.prev'}</span> )
51
- end
52
- end
53
-
54
- def pagy_nav_next_html(pagy, link)
55
- if (p_next = pagy.next)
56
- %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
57
- else
58
- %(<span class="page next disabled">#{pagy_t 'pagy.nav.next'}</span>)
59
- end
60
- end
61
49
  end
62
50
  Frontend.prepend NavsExtra
63
51
  end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/overflow
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/overflow
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -7,7 +7,7 @@ class Pagy # :nodoc:
7
7
  # Handles OverflowError exceptions for different classes with different options
8
8
  module OverflowExtra
9
9
  # Support for Pagy class
10
- module Pagy
10
+ module PagyOverride
11
11
  # Is the requested page overflowing?
12
12
  def overflow?
13
13
  @overflow
@@ -41,7 +41,7 @@ class Pagy # :nodoc:
41
41
 
42
42
  # Special series for empty page
43
43
  module Series
44
- def series(*)
44
+ def series(*, **)
45
45
  @page = @last # series for last page
46
46
  super.tap do |s| # call original series
47
47
  s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page)
@@ -50,9 +50,11 @@ class Pagy # :nodoc:
50
50
  end
51
51
  end
52
52
  end
53
+ Pagy.prepend PagyOverride
54
+ Pagy::Calendar.prepend PagyOverride if defined?(Calendar)
53
55
 
54
56
  # Support for Pagy::Countless class
55
- module Countless
57
+ module CountlessOverride
56
58
  # Add rescue clause for different behaviors
57
59
  def finalize(items)
58
60
  @overflow = false
@@ -71,8 +73,8 @@ class Pagy # :nodoc:
71
73
  end
72
74
  end
73
75
  end
76
+ # :nocov:
77
+ Pagy::Countless.prepend CountlessOverride if defined?(Countless)
78
+ # :nocov:
74
79
  end
75
- prepend OverflowExtra::Pagy
76
- Calendar.prepend OverflowExtra::Pagy if defined?(Calendar)
77
- Countless.prepend OverflowExtra::Countless if defined?(Countless)
78
80
  end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/searchkick
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/searchkick
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -7,7 +7,7 @@ class Pagy # :nodoc:
7
7
 
8
8
  # Paginate Searchkick::Results objects
9
9
  module SearchkickExtra
10
- module Searchkick # :nodoc:
10
+ module ModelExtension # :nodoc:
11
11
  # Return an array used to delay the call of #search
12
12
  # after the pagination variables are merged to the options.
13
13
  # It also pushes to the same array an optional method call.
@@ -18,9 +18,10 @@ class Pagy # :nodoc:
18
18
  end
19
19
  alias_method Pagy::DEFAULT[:searchkick_pagy_search], :pagy_searchkick
20
20
  end
21
+ Pagy::Searchkick = ModelExtension
21
22
 
22
23
  # Additions for the Pagy class
23
- module Pagy
24
+ module PagyExtension
24
25
  # Create a Pagy object from a Searchkick::Results object
25
26
  def new_from_searchkick(results, vars = {})
26
27
  vars[:items] = results.options[:per_page]
@@ -29,9 +30,10 @@ class Pagy # :nodoc:
29
30
  new(vars)
30
31
  end
31
32
  end
33
+ Pagy.extend PagyExtension
32
34
 
33
35
  # Add specialized backend methods to paginate Searchkick::Results
34
- module Backend
36
+ module BackendAddOn
35
37
  private
36
38
 
37
39
  # Return Pagy object and results
@@ -56,12 +58,10 @@ class Pagy # :nodoc:
56
58
  def pagy_searchkick_get_vars(_collection, vars)
57
59
  pagy_set_items_from_params(vars) if defined?(ItemsExtra)
58
60
  vars[:items] ||= DEFAULT[:items]
59
- vars[:page] ||= (params[vars[:page_param] || DEFAULT[:page_param]] || 1).to_i
61
+ vars[:page] ||= pagy_get_page(vars)
60
62
  vars
61
63
  end
62
64
  end
65
+ Backend.prepend BackendAddOn
63
66
  end
64
- Searchkick = SearchkickExtra::Searchkick
65
- extend SearchkickExtra::Pagy
66
- Backend.prepend SearchkickExtra::Backend
67
67
  end