pagy 4.2.0 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config/pagy.rb +30 -23
  3. data/lib/javascripts/pagy.js +104 -93
  4. data/lib/locales/bg.yml +2 -2
  5. data/lib/locales/bs.yml +2 -2
  6. data/lib/locales/ca.yml +2 -2
  7. data/lib/locales/cs.yml +2 -2
  8. data/lib/locales/da.yml +2 -2
  9. data/lib/locales/de.yml +2 -2
  10. data/lib/locales/en.yml +2 -2
  11. data/lib/locales/es.yml +2 -2
  12. data/lib/locales/fr.yml +2 -2
  13. data/lib/locales/hr.yml +2 -2
  14. data/lib/locales/id.yml +2 -2
  15. data/lib/locales/it.yml +2 -2
  16. data/lib/locales/ja.yml +2 -2
  17. data/lib/locales/km.yml +2 -2
  18. data/lib/locales/ko.yml +2 -2
  19. data/lib/locales/nb.yml +2 -2
  20. data/lib/locales/nl.yml +2 -2
  21. data/lib/locales/pl.yml +2 -2
  22. data/lib/locales/pt-BR.yml +2 -2
  23. data/lib/locales/pt.yml +2 -2
  24. data/lib/locales/ru.yml +2 -2
  25. data/lib/locales/sr.yml +2 -2
  26. data/lib/locales/sv-SE.yml +2 -2
  27. data/lib/locales/sv.yml +2 -2
  28. data/lib/locales/sw.yml +2 -2
  29. data/lib/locales/tr.yml +2 -2
  30. data/lib/locales/zh-CN.yml +2 -2
  31. data/lib/locales/zh-HK.yml +2 -2
  32. data/lib/locales/zh-TW.yml +3 -3
  33. data/lib/pagy.rb +27 -21
  34. data/lib/pagy/backend.rb +1 -0
  35. data/lib/pagy/console.rb +21 -0
  36. data/lib/pagy/deprecation.rb +27 -0
  37. data/lib/pagy/extras/arel.rb +1 -0
  38. data/lib/pagy/extras/array.rb +1 -0
  39. data/lib/pagy/extras/bootstrap.rb +16 -11
  40. data/lib/pagy/extras/bulma.rb +18 -13
  41. data/lib/pagy/extras/countless.rb +2 -1
  42. data/lib/pagy/extras/elasticsearch_rails.rb +1 -0
  43. data/lib/pagy/extras/foundation.rb +24 -17
  44. data/lib/pagy/extras/headers.rb +3 -3
  45. data/lib/pagy/extras/items.rb +18 -32
  46. data/lib/pagy/extras/materialize.rb +25 -19
  47. data/lib/pagy/extras/metadata.rb +3 -2
  48. data/lib/pagy/extras/navs.rb +18 -14
  49. data/lib/pagy/extras/overflow.rb +2 -2
  50. data/lib/pagy/extras/searchkick.rb +1 -0
  51. data/lib/pagy/extras/semantic.rb +24 -19
  52. data/lib/pagy/extras/shared.rb +4 -9
  53. data/lib/pagy/extras/standalone.rb +58 -0
  54. data/lib/pagy/extras/support.rb +12 -8
  55. data/lib/pagy/extras/trim.rb +8 -7
  56. data/lib/pagy/extras/uikit.rb +24 -19
  57. data/lib/pagy/frontend.rb +34 -25
  58. metadata +6 -5
  59. data/lib/locales/README.md +0 -35
  60. data/pagy.gemspec +0 -16
@@ -16,7 +16,8 @@ class Pagy
16
16
 
17
17
  # Sub-method called only by #pagy_countless: here for easy customization of variables by overriding
18
18
  def pagy_countless_get_vars(_collection, vars)
19
- vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
19
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
20
+ vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
20
21
  vars
21
22
  end
22
23
 
@@ -51,6 +51,7 @@ class Pagy
51
51
  # Sub-method called only by #pagy_elasticsearch_rails: here for easy customization of variables by overriding
52
52
  # the _collection argument is not available when the method is called
53
53
  def pagy_elasticsearch_rails_get_vars(_collection, vars)
54
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
54
55
  vars[:items] ||= VARS[:items]
55
56
  vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
56
57
  vars
@@ -7,10 +7,11 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Pagination for Foundation: it returns the html with the series of links to the pages
10
- def pagy_foundation_nav(pagy)
11
- link = pagy_link_proc(pagy)
10
+ def pagy_foundation_nav(pagy, pagy_id: nil, link_extra: '')
11
+ p_id = %( id="#{pagy_id}") if pagy_id
12
+ link = pagy_link_proc(pagy, link_extra: link_extra)
12
13
 
13
- html = +%(<nav class="pagy-foundation-nav" role="navigation" aria-label="Pagination"><ul class="pagination">)
14
+ html = +%(<nav#{p_id} class="pagy-foundation-nav" aria-label="Pagination"><ul class="pagination">)
14
15
  html << pagy_foundation_prev_html(pagy, link)
15
16
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
16
17
  html << case item
@@ -24,38 +25,44 @@ class Pagy
24
25
  end
25
26
 
26
27
  # Javascript pagination for foundation: it returns a nav and a JSON tag used by the Pagy.nav javascript
27
- def pagy_foundation_nav_js(pagy, id=pagy_id)
28
- link = pagy_link_proc(pagy)
29
- tags = { 'before' => %(<ul class="pagination">#{pagy_foundation_prev_html(pagy, link)}),
28
+ def pagy_foundation_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
30
+ p_id = %( id="#{pagy_id}") if pagy_id
31
+ link = pagy_link_proc(pagy, link_extra: link_extra)
32
+ tags = { 'before' => %(<ul class="pagination">#{pagy_foundation_prev_html pagy, link}),
30
33
  'link' => %(<li>#{link.call PAGE_PLACEHOLDER}</li>),
31
34
  'active' => %(<li class="current">#{pagy.page}</li>),
32
35
  'gap' => %(<li class="ellipsis gap" aria-hidden="true"></li>),
33
- 'after' => %(#{pagy_foundation_next_html(pagy, link)}</ul>) }
36
+ 'after' => %(#{pagy_foundation_next_html pagy, link}</ul>) }
34
37
 
35
- html = %(<nav id="#{id}" class="pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>)
36
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
38
+ html = %(<nav#{p_id} class="pagy-njs pagy-foundation-nav-js" aria-label="Pagination"></nav>)
39
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
37
40
  end
38
41
 
39
42
  # Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
40
- def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
41
- link = pagy_link_proc(pagy)
43
+ def pagy_foundation_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
45
+ p_id = %( id="#{pagy_id}") if pagy_id
46
+ link = pagy_link_proc(pagy, link_extra: link_extra)
42
47
  p_page = pagy.page
43
48
  p_pages = pagy.pages
44
49
  input = %(<input class="input-group-field cell shrink" type="number" min="1" max="#{p_pages}" value="#{p_page}" style="width: #{p_pages.to_s.length+1}rem; padding: 0 0.3rem; margin: 0 0.3rem;">)
45
50
 
46
- %(<nav id="#{id}" class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination"><div class="input-group">#{
51
+ %(<nav#{p_id} class="pagy-foundation-combo-nav-js" aria-label="Pagination"><div class="input-group">#{
47
52
  if (p_prev = pagy.prev)
48
- link.call p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"'
53
+ link.call p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0" aria-label="previous" class="prev button primary"'
49
54
  else
50
- %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>)
55
+ %(<a style="margin-bottom: 0" class="prev button primary disabled" href="#">#{pagy_t 'pagy.nav.prev'}</a>)
51
56
  end
52
57
  }<span class="input-group-label">#{pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</span>#{
53
58
  if (p_next = pagy.next)
54
- link.call p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"'
59
+ link.call p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0" aria-label="next" class="next button primary"'
55
60
  else
56
- %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t 'pagy.nav.next'}</a>)
61
+ %(<a style="margin-bottom: 0" class="next button primary disabled" href="#">#{pagy_t 'pagy.nav.next'}</a>)
57
62
  end
58
- }</div></nav>#{pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))})
63
+ }</div></nav>#{
64
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
65
+ })
59
66
  end
60
67
 
61
68
  private
@@ -24,11 +24,11 @@ class Pagy
24
24
  countless = defined?(Pagy::Countless) && pagy.is_a?(Pagy::Countless)
25
25
  rels = { 'first' => 1, 'prev' => pagy.prev, 'next' => pagy.next }
26
26
  rels['last'] = pagy.last unless countless
27
- url_str = pagy_url_for(PAGE_PLACEHOLDER, pagy, :url)
28
- hash = { 'Link' => rels.map do |rel, num|
27
+ url_str = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: true)
28
+ hash = { 'Link' => rels.filter_map do |rel, num|
29
29
  next unless num
30
30
  [ rel, url_str.sub(PAGE_PLACEHOLDER, num.to_s) ]
31
- end.compact.to_h }
31
+ end.to_h }
32
32
  headers = pagy.vars[:headers]
33
33
  hash[headers[:page]] = pagy.page.to_s if headers[:page]
34
34
  hash[headers[:items]] = pagy.vars[:items].to_s if headers[:items]
@@ -9,57 +9,43 @@ class Pagy
9
9
  VARS[:items_param] = :items
10
10
  VARS[:max_items] = 100
11
11
 
12
+ VARS[:enable_items_extra] = true
13
+
12
14
  ITEMS_PLACEHOLDER = '__pagy_items__'
13
15
 
14
- module UseItemsExtra
15
- private
16
+ module UseItemsExtra; end
16
17
 
17
- %i[ pagy_get_vars
18
- pagy_countless_get_vars
19
- pagy_elasticsearch_rails_get_vars
20
- pagy_searchkick_get_vars
21
- ].each do |meth|
22
- next unless Backend.private_method_defined?(meth, true)
18
+ module Backend
19
+ private
23
20
 
24
- define_method(meth) do |collection, vars|
25
- vars[:items] ||= if (items = params[vars[:items_param] || VARS[:items_param]]) # :items from :items_param
26
- [items.to_i, vars.key?(:max_items) ? vars[:max_items] : VARS[:max_items]].compact.min # :items capped to :max_items
27
- end
28
- super collection, vars
21
+ def pagy_set_items_from_params(vars)
22
+ return if vars[:items]
23
+ return unless vars.key?(:enable_item_extra) ? vars[:enable_item_extra] : VARS[:enable_items_extra]
24
+ return unless (items = params[vars[:items_param] || VARS[:items_param]]) # :items from :items_param
25
+ vars[:items] = [items.to_i, vars.key?(:max_items) ? vars[:max_items] : VARS[:max_items]].compact.min # :items capped to :max_items
29
26
  end
30
- end
31
27
 
32
28
  end
33
- Backend.prepend UseItemsExtra
34
-
35
29
 
36
30
  module Frontend
37
31
 
38
- module UseItemsExtra
39
- def pagy_url_for(page, pagy, url=nil)
40
- p_vars = pagy.vars
41
- params = request.GET.merge(p_vars[:params])
42
- params[p_vars[:page_param].to_s] = page
43
- params[p_vars[:items_param].to_s] = p_vars[:items]
44
- "#{request.base_url if url}#{request.path}?#{Rack::Utils.build_nested_query(pagy_get_params(params))}#{p_vars[:anchor]}"
45
- end
46
- end
47
- prepend UseItemsExtra
48
-
49
32
  # Return the items selector HTML. For example "Show [20] items per page"
50
- def pagy_items_selector_js(pagy, id=pagy_id)
33
+ def pagy_items_selector_js(pagy, deprecated_id=nil, pagy_id: nil, item_name: nil, i18n_key: nil, link_extra: '')
34
+ return '' unless pagy.vars[:enable_items_extra]
35
+ pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
36
+ p_id = %( id="#{pagy_id}") if pagy_id
51
37
  p_vars = pagy.vars
52
38
  p_items = p_vars[:items]
53
39
  p_vars[:items] = ITEMS_PLACEHOLDER
54
- link = pagy_marked_link(pagy_link_proc(pagy))
40
+ link = pagy_marked_link(pagy_link_proc(pagy, link_extra: link_extra))
55
41
  p_vars[:items] = p_items # restore the items
56
42
 
57
- html = %(<span id="#{id}">)
43
+ html = %(<span#{p_id} class="pagy-items-selector-js">)
58
44
  input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length+1}rem;">)
59
- html << pagy_t('pagy.items_selector_js', item_name: pagy_t(p_vars[:i18n_key], count: p_items),
45
+ html << pagy_t('pagy.items_selector_js', item_name: item_name || pagy_t(i18n_key || p_vars[:i18n_key], count: p_items),
60
46
  items_input: input,
61
47
  count: p_items)
62
- html << %(</span>#{pagy_json_tag(pagy, :items_selector, id, pagy.from, link)})
48
+ html << %(</span>#{pagy_json_tag pagy, :items_selector, pagy.from, link})
63
49
  end
64
50
 
65
51
  end
@@ -7,16 +7,17 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Pagination for materialize: it returns the html with the series of links to the pages
10
- def pagy_materialize_nav(pagy)
11
- link = pagy_link_proc(pagy)
10
+ def pagy_materialize_nav(pagy, pagy_id: nil, link_extra: '')
11
+ p_id = %( id="#{pagy_id}") if pagy_id
12
+ link = pagy_link_proc(pagy, link_extra: link_extra)
12
13
 
13
- html = +%(<div class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">)
14
+ html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">)
14
15
  html << pagy_materialize_prev_html(pagy, link)
15
16
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
16
17
  html << case item
17
18
  when Integer then %(<li class="waves-effect">#{link.call item}</li>) # page link
18
19
  when String then %(<li class="active">#{link.call item}</li>) # active page
19
- when :gap then %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
20
+ when :gap then %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>) # page gap
20
21
  end
21
22
  end
22
23
  html << pagy_materialize_next_html(pagy, link)
@@ -24,34 +25,39 @@ class Pagy
24
25
  end
25
26
 
26
27
  # Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript
27
- def pagy_materialize_nav_js(pagy, id=pagy_id)
28
- link = pagy_link_proc(pagy)
29
- tags = { 'before' => %(<ul class="pagination">#{pagy_materialize_prev_html(pagy, link)}),
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
30
+ p_id = %( id="#{pagy_id}") if pagy_id
31
+ link = pagy_link_proc(pagy, link_extra: link_extra)
32
+
33
+ tags = { 'before' => %(<ul class="pagination">#{pagy_materialize_prev_html pagy, link}),
30
34
  'link' => %(<li class="waves-effect">#{mark = link.call(PAGE_PLACEHOLDER)}</li>),
31
35
  'active' => %(<li class="active">#{mark}</li>),
32
- 'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>),
33
- 'after' => %(#{pagy_materialize_next_html(pagy, link)}</ul>) }
36
+ 'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>),
37
+ 'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
34
38
 
35
- html = %(<div id="#{id}" class="pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>)
36
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
39
+ html = %(<div#{p_id} class="pagy-njs pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>)
40
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
37
41
  end
38
42
 
39
43
  # Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
40
- def pagy_materialize_combo_nav_js(pagy, id=pagy_id)
41
- link = pagy_link_proc(pagy)
44
+ def pagy_materialize_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
45
+ pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
46
+ p_id = %( id="#{pagy_id}") if pagy_id
47
+ link = pagy_link_proc(pagy, link_extra: link_extra)
42
48
  p_page = pagy.page
43
49
  p_pages = pagy.pages
44
50
  style = ' style="vertical-align: middle;"'
45
51
  input = %(<input type="number" class="browser-default" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 2px; border: none; border-radius: 2px; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
46
52
 
47
- %(<div id="#{id}" class="pagy-materialize-combo-nav-js pagination" role="navigation" aria-label="pager"><div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;"><ul class="pagination" style="margin: 0px;">#{
48
- pagy_materialize_prev_html(pagy, link, style)
53
+ %(<div#{p_id} class="pagy-materialize-combo-nav-js pagination" role="navigation" aria-label="pager"><div class="pagy-compact-chip" role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;"><ul class="pagination" style="margin: 0">#{
54
+ pagy_materialize_prev_html pagy, link, style
49
55
  }<div class="pagy-combo-input btn-flat" style="cursor: default; padding: 0px">#{
50
- pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
56
+ pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
51
57
  }</div>#{
52
- pagy_materialize_next_html(pagy, link, style)
58
+ pagy_materialize_next_html pagy, link, style
53
59
  }</ul></div>#{
54
- pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
60
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
55
61
  })
56
62
  end
57
63
 
@@ -61,7 +67,7 @@ class Pagy
61
67
  if (p_prev = pagy.prev)
62
68
  %(<li class="waves-effect prev"#{style}>#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
63
69
  else
64
- +%(<li class="prev disabled"#{style}><a href="#"><i class="material-icons">chevron_left</i></a></li>)
70
+ %(<li class="prev disabled"#{style}><a href="#"><i class="material-icons">chevron_left</i></a></li>)
65
71
  end
66
72
  end
67
73
 
@@ -16,13 +16,14 @@ class Pagy
16
16
 
17
17
  include Helpers
18
18
 
19
- def pagy_metadata(pagy, url=nil)
19
+ def pagy_metadata(pagy, deprecated_url=nil, absolute: nil)
20
+ absolute = Pagy.deprecated_arg(:url, deprecated_url, :absolute, absolute) if deprecated_url
20
21
  names = pagy.vars[:metadata]
21
22
  unknown = names - METADATA
22
23
  raise VariableError.new(pagy), "unknown metadata #{unknown.inspect}" \
23
24
  unless unknown.empty?
24
25
 
25
- scaffold_url = pagy_url_for(PAGE_PLACEHOLDER, pagy, url)
26
+ scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
26
27
  {}.tap do |metadata|
27
28
  names.each do |key|
28
29
  metadata[key] = case key
@@ -7,33 +7,37 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript
10
- def pagy_nav_js(pagy, id=pagy_id)
11
- link = pagy_link_proc(pagy)
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
12
+ p_id = %( id="#{pagy_id}") if pagy_id
13
+ link = pagy_link_proc(pagy, link_extra: link_extra)
12
14
  tags = { 'before' => pagy_nav_prev_html(pagy, link),
13
15
  'link' => %(<span class="page">#{link.call(PAGE_PLACEHOLDER)}</span> ),
14
16
  'active' => %(<span class="page active">#{pagy.page}</span> ),
15
- 'gap' => %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ),
17
+ 'gap' => %(<span class="page gap">#{pagy_t 'pagy.nav.gap'}</span> ),
16
18
  'after' => pagy_nav_next_html(pagy, link) }
17
19
 
18
- html = %(<nav id="#{id}" class="pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>)
19
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
20
+ html = %(<nav#{p_id} class="pagy-njs pagy-nav-js pagination" aria-label="pager"></nav>)
21
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
20
22
  end
21
23
 
22
24
  # Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
23
- def pagy_combo_nav_js(pagy, id=pagy_id)
24
- link = pagy_link_proc(pagy)
25
+ def pagy_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
26
+ pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
27
+ p_id = %( id="#{pagy_id}") if pagy_id
28
+ link = pagy_link_proc(pagy, link_extra: link_extra)
25
29
  p_page = pagy.page
26
30
  p_pages = pagy.pages
27
31
  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
32
 
29
- %(<nav id="#{id}" class="pagy-combo-nav-js pagination" role="navigation" aria-label="pager">#{
30
- pagy_nav_prev_html(pagy, link)
33
+ %(<nav#{p_id} class="pagy-combo-nav-js pagination" aria-label="pager">#{
34
+ pagy_nav_prev_html pagy, link
31
35
  }<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
32
- pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
36
+ pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
33
37
  }</span> #{
34
- pagy_nav_next_html(pagy, link)
38
+ pagy_nav_next_html pagy, link
35
39
  }</nav>#{
36
- pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
40
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
37
41
  })
38
42
  end
39
43
 
@@ -43,7 +47,7 @@ class Pagy
43
47
  if (p_prev = pagy.prev)
44
48
  %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
45
49
  else
46
- %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> )
50
+ %(<span class="page prev disabled">#{pagy_t 'pagy.nav.prev'}</span> )
47
51
  end
48
52
  end
49
53
 
@@ -51,7 +55,7 @@ class Pagy
51
55
  if (p_next = pagy.next)
52
56
  %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
53
57
  else
54
- %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>)
58
+ %(<span class="page next disabled">#{pagy_t 'pagy.nav.next'}</span>)
55
59
  end
56
60
  end
57
61
 
@@ -18,12 +18,12 @@ class Pagy
18
18
  raise # same as without the extra
19
19
  when :last_page
20
20
  initial_page = @vars[:page] # save the very initial page (even after re-run)
21
- initialize(vars.merge!(page: @last)) # re-run with the last page
21
+ initialize vars.merge!(page: @last) # re-run with the last page
22
22
  @vars[:page] = initial_page # restore the inital page
23
23
  when :empty_page
24
24
  @offset = @items = @from = @to = 0 # vars relative to the actual page
25
25
  @prev = @last # prev relative to the actual page
26
- extend(Series) # special series for :empty_page
26
+ extend Series # special series for :empty_page
27
27
  else
28
28
  raise VariableError.new(self), "expected :overflow variable in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
29
29
  end
@@ -49,6 +49,7 @@ class Pagy
49
49
  # Sub-method called only by #pagy_searchkick: here for easy customization of variables by overriding
50
50
  # the _collection argument is not available when the method is called
51
51
  def pagy_searchkick_get_vars(_collection, vars)
52
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
52
53
  vars[:items] ||= VARS[:items]
53
54
  vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
54
55
  vars
@@ -7,16 +7,17 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Pagination for semantic: it returns the html with the series of links to the pages
10
- def pagy_semantic_nav(pagy)
11
- link = pagy_link_proc(pagy, 'class="item"')
10
+ def pagy_semantic_nav(pagy, pagy_id: nil, link_extra: '')
11
+ p_id = %( id="#{pagy_id}") if pagy_id
12
+ link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}))
12
13
 
13
- html = +%(<div class="pagy-semantic-nav ui pagination menu" aria-label="pager">)
14
+ html = +%(<div#{p_id} class="pagy-semantic-nav ui pagination menu">)
14
15
  html << pagy_semantic_prev_html(pagy, link)
15
16
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
16
17
  html << case item
17
- when Integer then link.call item # page link
18
- when String then %(<a class="item active">#{item}</a>) # current page
19
- when :gap then %(<div class="disabled item">...</div>) # page gap
18
+ when Integer then link.call item # page link
19
+ when String then %(<a class="item active">#{item}</a>) # current page
20
+ when :gap then %(<div class="disabled item">#{pagy_t 'pagy.nav.gap'}</div>) # page gap
20
21
  end
21
22
  end
22
23
  html << pagy_semantic_next_html(pagy, link)
@@ -24,33 +25,37 @@ class Pagy
24
25
  end
25
26
 
26
27
  # Javascript pagination for semantic: it returns a nav and a JSON tag used by the Pagy.nav javascript
27
- def pagy_semantic_nav_js(pagy, id=pagy_id)
28
- link = pagy_link_proc(pagy, 'class="item"')
28
+ def pagy_semantic_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
30
+ p_id = %( id="#{pagy_id}") if pagy_id
31
+ link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}))
29
32
  tags = { 'before' => pagy_semantic_prev_html(pagy, link),
30
33
  'link' => link.call(PAGE_PLACEHOLDER),
31
34
  'active' => %(<a class="item active">#{pagy.page}</a>),
32
35
  'gap' => %(<div class="disabled item">#{pagy_t('pagy.nav.gap')}</div>),
33
36
  'after' => pagy_semantic_next_html(pagy, link) }
34
37
 
35
- html = %(<div id="#{id}" class="pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>)
36
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
38
+ html = %(<div#{p_id} class="pagy-njs pagy-semantic-nav-js ui pagination menu" role="navigation"></div>)
39
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
37
40
  end
38
41
 
39
42
  # Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
40
- def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
41
- link = pagy_link_proc(pagy, 'class="item"')
43
+ def pagy_semantic_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
45
+ p_id = %( id="#{pagy_id}") if pagy_id
46
+ link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}))
42
47
  p_page = pagy.page
43
48
  p_pages = pagy.pages
44
49
  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; margin: 0 0.3rem">)
45
50
 
46
- %(<div id="#{id}" class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">#{
47
- pagy_semantic_prev_html(pagy, link)
51
+ %(<div#{p_id} class="pagy-semantic-combo-nav-js ui compact menu" role="navigation">#{
52
+ pagy_semantic_prev_html pagy, link
48
53
  }<div class="pagy-combo-input item">#{
49
- pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
54
+ pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
50
55
  }</div> #{
51
- pagy_semantic_next_html(pagy, link)
56
+ pagy_semantic_next_html pagy, link
52
57
  }</div>#{
53
- pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
58
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
54
59
  })
55
60
  end
56
61
 
@@ -60,7 +65,7 @@ class Pagy
60
65
  if (p_prev = pagy.prev)
61
66
  link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'
62
67
  else
63
- %(<div class="item disabled"><i class="left small chevron icon"></i></div>)
68
+ +%(<div class="item disabled"><i class="left small chevron icon"></i></div>)
64
69
  end
65
70
  end
66
71
 
@@ -68,7 +73,7 @@ class Pagy
68
73
  if (p_next = pagy.next)
69
74
  link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'
70
75
  else
71
- %(<div class="item disabled"><i class="right small chevron icon"></i></div>)
76
+ +%(<div class="item disabled"><i class="right small chevron icon"></i></div>)
72
77
  end
73
78
  end
74
79