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
data/lib/locales/ko.yml CHANGED
@@ -15,6 +15,6 @@ ko:
15
15
  single_page: "<b>%{count}</b>개의 %{item_name} 표시됨"
16
16
  multiple_pages: "총 <b>%{count}</b>개의 %{item_name} 중 <b>%{from}-%{to}</b>"
17
17
 
18
- combo_nav_js: " %{pages} 중 %{page_input} 페이지"
18
+ combo_nav_js: "<label>총 %{pages} 중 %{page_input}</label> 페이지"
19
19
 
20
- items_selector_js: "페이지 당 %{items_input}개 표시%"
20
+ items_selector_js: "<label>페이지 당 %{items_input}개 표시%</label>"
data/lib/locales/nb.yml CHANGED
@@ -17,6 +17,6 @@ nb:
17
17
  single_page: "Viser <b>%{count}</b> %{item_name}"
18
18
  multiple_pages: "Viser %{item_name} <b>%{from}-%{to}</b> av totalt <b>%{count}</b>"
19
19
 
20
- combo_nav_js: "Side %{page_input} av %{pages}"
20
+ combo_nav_js: "<label>Side %{page_input}</label> av %{pages}"
21
21
 
22
- items_selector_js: "Vis %{items_input} %{item_name} per side"
22
+ items_selector_js: "<label>Vis %{items_input} %{item_name} per side</label>"
data/lib/locales/nl.yml CHANGED
@@ -17,6 +17,6 @@ nl:
17
17
  single_page: "Toont <b>%{count}</b> %{item_name}"
18
18
  multiple_pages: "Toont <b>%{from}-%{to}</b> %{item_name} van <b>%{count}</b> in totaal"
19
19
 
20
- combo_nav_js: "Pagina %{page_input} van %{pages}"
20
+ combo_nav_js: "<label>Pagina %{page_input}</label> van %{pages}"
21
21
 
22
- items_selector_js: "Toont %{items_input} %{item_name} per pagina"
22
+ items_selector_js: "<label>Toont %{items_input} %{item_name} per pagina</label>"
data/lib/locales/pl.yml CHANGED
@@ -19,6 +19,6 @@ pl:
19
19
  single_page: "Wyświetlono <b>%{count}</b> %{item_name}"
20
20
  multiple_pages: "Wyświetlono %{item_name} <b>%{from}-%{to}</b> z wszystkich <b>%{count}</b>"
21
21
 
22
- combo_nav_js: "Strona %{page_input} z %{pages}"
22
+ combo_nav_js: "<label>Strona %{page_input}</label> z %{pages}"
23
23
 
24
- items_selector_js: "Pokaż %{items_input} %{item_name} na stronie"
24
+ items_selector_js: "<label>Pokaż %{items_input} %{item_name} na stronie</label>"
@@ -17,6 +17,6 @@ pt-BR:
17
17
  single_page: "Mostrando %{count} %{item_name}"
18
18
  multiple_pages: "Mostrando %{item_name} %{from}-%{to} do total de %{count}"
19
19
 
20
- combo_nav_js: "Página %{page_input} de %{pages}"
20
+ combo_nav_js: "<label>Página %{page_input}</label> de %{pages}"
21
21
 
22
- items_selector_js: "Mostrar %{items_input} %{item_name} por página"
22
+ items_selector_js: "<label>Mostrar %{items_input} %{item_name} por página</label>"
data/lib/locales/pt.yml CHANGED
@@ -17,6 +17,6 @@ pt:
17
17
  single_page: "Mostrando %{count} %{item_name}"
18
18
  multiple_pages: "Mostrando %{item_name} %{from}-%{to} de um total de %{count}"
19
19
 
20
- combo_nav_js: "Página %{page_input} de %{pages}"
20
+ combo_nav_js: "<label>Página %{page_input}</label> de %{pages}"
21
21
 
22
- items_selector_js: "Mostrar %{items_input} %{item_name} por página"
22
+ items_selector_js: "<label>Mostrar %{items_input} %{item_name} por página</label>"
data/lib/locales/ru.yml CHANGED
@@ -19,6 +19,6 @@ ru:
19
19
  single_page: "<b>%{count}</b> %{item_name}"
20
20
  multiple_pages: "Всего <b>%{count}</b> %{item_name}, показаны с <b>%{from}</b> по <b>%{to}</b>"
21
21
 
22
- combo_nav_js: "Страница %{page_input} из %{pages}"
22
+ combo_nav_js: "<label>Страница %{page_input}</label> из %{pages}"
23
23
 
24
- items_selector_js: "Показать %{items_input} %{item_name} на странице"
24
+ items_selector_js: "<label>Показать %{items_input} %{item_name} на странице</label>"
data/lib/locales/sr.yml CHANGED
@@ -18,6 +18,6 @@ sr:
18
18
  single_page: "Приказује се <b>%{count}</b> %{item_name}"
19
19
  multiple_pages: "Приказ %{item_name} <b>%{from}-%{to}</b> од <b>%{count}</b> укупно"
20
20
 
21
- combo_nav_js: "Страниca %{page_input} од %{pages}"
21
+ combo_nav_js: "<label>Страниca %{page_input}</label> од %{pages}"
22
22
 
23
- items_selector_js: "Прикажи %{items_input} %{item_name} по страниcи"
23
+ items_selector_js: "<label>Прикажи %{items_input} %{item_name} по страниcи</label>"
@@ -18,6 +18,6 @@ sv-SE:
18
18
  single_page: "Visar <b>%{count}</b> %{item_name}"
19
19
  multiple_pages: "Visar %{item_name} <b>%{from}-%{to}</b> av <b>%{count}</b> totalt"
20
20
 
21
- combo_nav_js: "Sida %{page_input} av %{pages}"
21
+ combo_nav_js: "<label>Sida %{page_input}</label> av %{pages}"
22
22
 
23
- items_selector_js: "Visa %{items_input} %{item_name} per sida"
23
+ items_selector_js: "<label>Visa %{items_input} %{item_name} per sida</label>"
data/lib/locales/sv.yml CHANGED
@@ -18,6 +18,6 @@ sv:
18
18
  single_page: "Visar <b>%{count}</b> %{item_name}"
19
19
  multiple_pages: "Visar %{item_name} <b>%{from}-%{to}</b> av <b>%{count}</b> totalt"
20
20
 
21
- combo_nav_js: "Sida %{page_input} av %{pages}"
21
+ combo_nav_js: "<label>Sida %{page_input}</label> av %{pages}"
22
22
 
23
- items_selector_js: "Visa %{items_input} %{item_name} per sida"
23
+ items_selector_js: "<label>Visa %{items_input} %{item_name} per sida</label>"
data/lib/locales/sw.yml CHANGED
@@ -17,6 +17,6 @@ sw:
17
17
  single_page: "Inaonyesha %{item_name} <b>%{count}</b>"
18
18
  multiple_pages: "Inaonyesha %{item_name} <b>%{from}-%{to}</b> ya <b>%{count}</b> kwa jumla"
19
19
 
20
- combo_nav_js: "Kurasa %{page_input} ya %{pages}"
20
+ combo_nav_js: "<label>Kurasa %{page_input}</label> ya %{pages}"
21
21
 
22
- items_selector_js: "Onyesha %{items_input} %{item_name} kwa kila ukurasa"
22
+ items_selector_js: "<label>Onyesha %{items_input} %{item_name} kwa kila ukurasa</label>"
data/lib/locales/tr.yml CHANGED
@@ -15,6 +15,6 @@ tr:
15
15
  single_page: "Toplam <b>%{count}</b> %{item_name} gösteriliyor"
16
16
  multiple_pages: "<b>%{count}</b> %{item_name} içerisinden <b>%{from}-%{to}</b> kadarı gösteriliyor"
17
17
 
18
- combo_nav_js: "Sayfa %{page_input} / %{pages}"
18
+ combo_nav_js: "<label>Sayfa %{page_input}</label> / %{pages}"
19
19
 
20
- items_selector_js: "Sayfada %{items_input} %{item_name} göster"
20
+ items_selector_js: "<label>Sayfada %{items_input} %{item_name} göster</label>"
@@ -15,6 +15,6 @@ zh-CN:
15
15
  single_page: "显示<b>%{count}</b> 项%{item_name}"
16
16
  multiple_pages: "共 <b>%{count}</b> 项%{item_name},显示 <b>%{from}-%{to}</b>"
17
17
 
18
- combo_nav_js: " %{page_input} / %{pages} 页"
18
+ combo_nav_js: "<label>第 %{page_input}</label> / %{pages} 页"
19
19
 
20
- items_selector_js: "每页显示 %{items_input} 条%"
20
+ items_selector_js: "<label>每页显示 %{items_input} 条%</label>"
@@ -15,6 +15,6 @@ zh-HK:
15
15
  single_page: "顯示 <b>%{count}</b> %{item_name}"
16
16
  multiple_pages: "共 <b>%{count}</b> %{item_name},顯示 <b>%{from}-%{to}</b>"
17
17
 
18
- combo_nav_js: " %{page_input} / %{pages} 頁"
18
+ combo_nav_js: "<label>第 %{page_input}</label> / %{pages} 頁"
19
19
 
20
- items_selector_js: "每頁顯示 %{items_input} 記錄"
20
+ items_selector_js: "<label>每頁顯示 %{items_input} 記錄</label>"
@@ -10,11 +10,11 @@ zh-TW:
10
10
  next: "下一頁&nbsp;&rsaquo;"
11
11
  gap: "&hellip;"
12
12
 
13
- combo_nav_js: "第 %{page_input} / %{pages} 頁"
14
-
15
13
  info:
16
14
  no_items: "沒找到項"
17
15
  single_page: "顯示 <b>%{count}</b> 項%{item_name}"
18
16
  multiple_pages: "共 <b>%{count}</b> 項%{item_name},顯示 <b>%{from}-%{to}</b>"
19
17
 
20
- items_selector_js: "每頁顯示 %{items_input} 項%{item_name}"
18
+ combo_nav_js: "<label>第 %{page_input}</label> / %{pages}"
19
+
20
+ items_selector_js: "<label>每頁顯示 %{items_input} 項%{item_name}"
data/lib/pagy.rb CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  # main class
7
7
  class Pagy
8
- VERSION = '4.2.0'
8
+ VERSION = '4.6.0'
9
9
 
10
10
  # Root pathname to get the path of Pagy files like templates or dictionaries
11
11
  def self.root
@@ -14,7 +14,7 @@ class Pagy
14
14
 
15
15
  # default vars
16
16
  VARS = { page: 1, items: 20, outset: 0, size: [1, 4, 4, 1], page_param: :page, # rubocop:disable Style/MutableConstant
17
- params: {}, anchor: '', link_extra: '', i18n_key: 'pagy.item_name', cycle: false }
17
+ params: {}, fragment: '', link_extra: '', i18n_key: 'pagy.item_name', cycle: false }
18
18
 
19
19
  attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :from, :to, :prev, :next
20
20
 
@@ -22,20 +22,22 @@ class Pagy
22
22
 
23
23
  # Merge and validate the options, do some simple arithmetic and set the instance variables
24
24
  def initialize(vars)
25
- @vars = VARS.merge( vars.delete_if{|_,v| v.nil? || v == '' } )
25
+ @vars = VARS.merge( vars.delete_if{|k,v| VARS.key?(k) && (v.nil? || v == '') } )
26
+ @vars[:fragment] = deprecated_var(:anchor, @vars[:anchor], :fragment, @vars[:fragment]) if @vars[:anchor]
26
27
 
27
28
  INSTANCE_VARS_MIN.each do |name,min|
28
29
  raise VariableError.new(self), "expected :#{name} >= #{min}; got #{@vars[name].inspect}" \
29
30
  unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
30
31
  end
31
32
  @pages = @last = [(@count.to_f / @items).ceil, 1].max
32
- raise OverflowError.new(self), "expected :page in 1..#{@last}; got #{@page.inspect}" if @page > @last
33
+ raise OverflowError.new(self), "expected :page in 1..#{@last}; got #{@page.inspect}" \
34
+ if @page > @last
33
35
 
34
36
  @offset = @items * (@page - 1) + @outset
35
- @items = @count - ((@pages-1) * @items) if @page == @last && @count.positive?
37
+ @items = @count - ((@pages - 1) * @items) if @page == @last && @count.positive?
36
38
  @from = @count.zero? ? 0 : @offset + 1 - @outset
37
39
  @to = @count.zero? ? 0 : @offset + @items - @outset
38
- @prev = (@page-1 unless @page == 1)
40
+ @prev = (@page - 1 unless @page == 1)
39
41
  @next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
40
42
  end
41
43
 
@@ -43,28 +45,32 @@ class Pagy
43
45
  def series(size=@vars[:size])
44
46
  return [] if size.empty?
45
47
  raise VariableError.new(self), "expected 4 items >= 0 in :size; got #{size.inspect}" \
46
- unless size.size == 4 && size.all?{ |num| num >= 0 rescue false } # rubocop:disable Style/RescueModifier
47
-
48
+ unless size.size == 4 && size.all?{ |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
49
+ # This algorithm is up to ~5x faster and ~2.3x lighter than the previous one (pagy < 4.3)
50
+ left_gap_start = 1 + size[0]
51
+ left_gap_end = @page - size[1] - 1
52
+ right_gap_start = @page + size[2] + 1
53
+ right_gap_end = @last - size[3]
54
+ left_gap_end = right_gap_end if left_gap_end > right_gap_end
55
+ right_gap_start = left_gap_start if left_gap_start > right_gap_start
48
56
  series = []
49
- [ *0..size[0], # initial pages from 0
50
- *@page-size[1]..@page+size[2], # around current page
51
- *@last-size[3]+1..@last+1 # final pages till @last+1
52
- ].sort!.each_cons(2) do |left, right| # sort and loop by 2
53
- next if left.negative? || left == right # skip out of range and duplicates
54
- break if left > @last # break if out of @last boundary
55
- case right
56
- when left+1 then series.push(left) # no gap -> no additions
57
- when left+2 then series.push(left, left+1) # 1 page gap -> fill with missing page
58
- else series.push(left, :gap) # n page gap -> add gap
59
- end
57
+ start = 1
58
+ if (left_gap_end - left_gap_start).positive?
59
+ series.push(*start..(left_gap_start - 1), :gap)
60
+ start = left_gap_end + 1
61
+ end
62
+ if (right_gap_end - right_gap_start).positive?
63
+ series.push(*start..(right_gap_start - 1), :gap)
64
+ start = right_gap_end + 1
60
65
  end
61
- series.shift # shift the start boundary (0)
62
- series[series.index(@page)] = @page.to_s # convert the current page to String
66
+ series.push(*start..@last)
67
+ series[series.index(@page)] = @page.to_s
63
68
  series
64
69
  end
65
70
 
66
71
  end
67
72
 
73
+ require 'pagy/deprecation'
68
74
  require 'pagy/backend'
69
75
  require 'pagy/frontend'
70
76
  require 'pagy/exceptions'
data/lib/pagy/backend.rb CHANGED
@@ -19,6 +19,7 @@ class Pagy
19
19
 
20
20
  # Sub-method called only by #pagy: here for easy customization of variables by overriding
21
21
  def pagy_get_vars(collection, vars)
22
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
22
23
  vars[:count] ||= (c = collection.count(:all)).is_a?(Hash) ? c.size : c
23
24
  vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
24
25
  vars
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pagy' # so you can require just the extra in the console
4
+ require 'pagy/extras/standalone'
5
+
6
+ class Pagy
7
+ # include Pagy::Console in irb/rails console for a ready to use pagy environment
8
+ module Console
9
+ def self.included(main)
10
+ main.include(Backend)
11
+ main.include(Frontend)
12
+ VARS[:url] = 'http://www.example.com/subdir'
13
+ end
14
+
15
+ def pagy_extras(*extras)
16
+ extras.each {|extra| require "pagy/extras/#{extra}"}
17
+ puts "Required extras: #{extras.map(&:inspect).join(', ')}"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ class Pagy
3
+ class << self
4
+
5
+ # deprecated variables
6
+ def deprecated_var(var, val, new_var, new_val)
7
+ value = new_val || val
8
+ Warning.warn %([PAGY WARNING] deprecated use of `#{var}` var will not be supported in 5.0! Use `#{new_var}: #{value.inspect}` instead.)
9
+ value
10
+ end
11
+
12
+ # deprecated pagy_url_for argument order
13
+ def deprecated_order(pagy, page)
14
+ Warning.warn '[PAGY WARNING] inverted use of pagy/page in pagy_url_for will not be supported in 5.0! Use pagy_url_for(pagy, page) instead.'
15
+ [page, pagy]
16
+ end
17
+
18
+
19
+ # deprecated posiitioal arguments
20
+ def deprecated_arg(arg, val, new_key, new_val)
21
+ value = new_val || val # we use the new_val if present
22
+ Warning.warn %([PAGY WARNING] deprecated use of positional `#{arg}` arg will not be supported in 5.0! Use only the keyword arg `#{new_key}: #{value.inspect}` instead.)
23
+ value
24
+ end
25
+
26
+ end
27
+ end
@@ -11,6 +11,7 @@ class Pagy
11
11
  end
12
12
 
13
13
  def pagy_arel_get_vars(collection, vars)
14
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
14
15
  vars[:count] ||= pagy_arel_count(collection)
15
16
  vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
16
17
  vars
@@ -14,6 +14,7 @@ class Pagy
14
14
 
15
15
  # Sub-method called only by #pagy_array: here for easy customization of variables by overriding
16
16
  def pagy_array_get_vars(array, vars)
17
+ pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
17
18
  vars[:count] ||= array.size
18
19
  vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
19
20
  vars
@@ -7,10 +7,11 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Pagination for bootstrap: it returns the html with the series of links to the pages
10
- def pagy_bootstrap_nav(pagy)
11
- link = pagy_link_proc(pagy, 'class="page-link"')
10
+ def pagy_bootstrap_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="page-link" #{link_extra}))
12
13
 
13
- html = +%(<nav class="pagy-bootstrap-nav" role="navigation" aria-label="pager"><ul class="pagination">)
14
+ html = +%(<nav#{p_id} class="pagy-bootstrap-nav" aria-label="pager"><ul class="pagination">)
14
15
  html << pagy_bootstrap_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,26 +25,30 @@ class Pagy
24
25
  end
25
26
 
26
27
  # Javascript pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.nav javascript
27
- def pagy_bootstrap_nav_js(pagy, id=pagy_id)
28
- link = pagy_link_proc(pagy, 'class="page-link"')
28
+ def pagy_bootstrap_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="page-link" #{link_extra}))
29
32
  tags = { 'before' => %(<ul class="pagination">#{pagy_bootstrap_prev_html pagy, link}),
30
33
  'link' => %(<li class="page-item">#{mark = link.call(PAGE_PLACEHOLDER)}</li>),
31
34
  'active' => %(<li class="page-item active">#{mark}</li>),
32
35
  'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t 'pagy.nav.gap'}</a></li>),
33
36
  'after' => %(#{pagy_bootstrap_next_html pagy, link}</ul>) }
34
37
 
35
- html = %(<nav id="#{id}" class="pagy-bootstrap-nav-js" role="navigation" aria-label="pager"></nav>)
36
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
38
+ html = %(<nav#{p_id} class="pagy-njs pagy-bootstrap-nav-js" aria-label="pager"></nav>)
39
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
37
40
  end
38
41
 
39
42
  # Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
40
- def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
41
- link = pagy_link_proc(pagy)
43
+ def pagy_bootstrap_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 type="number" min="1" max="#{p_pages}" value="#{p_page}" class="text-primary" style="padding: 0; border: none; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
45
50
 
46
- %(<nav id="#{id}" class="pagy-bootstrap-combo-nav-js pagination" role="navigation" aria-label="pager"><div class="btn-group" role="group">#{
51
+ %(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination" aria-label="pager"><div class="btn-group" role="group">#{
47
52
  if (p_prev = pagy.prev)
48
53
  link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"'
49
54
  else
@@ -56,7 +61,7 @@ class Pagy
56
61
  %(<a class="next btn btn-primary disabled" href="#">#{pagy_t 'pagy.nav.next' }</a>)
57
62
  end
58
63
  }</div></nav>#{
59
- pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
64
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
60
65
  })
61
66
  end
62
67
 
@@ -7,55 +7,60 @@ class Pagy
7
7
  module Frontend
8
8
 
9
9
  # Pagination for Bulma: it returns the html with the series of links to the pages
10
- def pagy_bulma_nav(pagy)
11
- link = pagy_link_proc(pagy)
10
+ def pagy_bulma_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-bulma-nav pagination is-centered" role="navigation" aria-label="pagination">)
14
+ html = +%(<nav#{p_id} class="pagy-bulma-nav pagination is-centered" aria-label="pagination">)
14
15
  html << pagy_bulma_prev_next_html(pagy, link)
15
16
  html << %(<ul class="pagination-list">)
16
17
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
17
18
  html << case item
18
19
  when Integer then %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}") }</li>) # page link
19
20
  when String then %(<li>#{link.call item, item, %(class="pagination-link is-current" aria-label="page #{item}" aria-current="page")}</li>) # active page
20
- when :gap then %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>) # page gap
21
+ when :gap then %(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.nav.gap'}</span></li>) # page gap
21
22
  end
22
23
  end
23
24
  html << %(</ul></nav>)
24
25
  end
25
26
 
26
- def pagy_bulma_nav_js(pagy, id=pagy_id)
27
- link = pagy_link_proc(pagy)
27
+ def pagy_bulma_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
28
+ pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
29
+ p_id = %( id="#{pagy_id}") if pagy_id
30
+ link = pagy_link_proc(pagy, link_extra: link_extra)
28
31
  tags = { 'before' => %(#{pagy_bulma_prev_next_html(pagy, link)}<ul class="pagination-list">),
29
32
  'link' => %(<li>#{link.call PAGE_PLACEHOLDER, PAGE_PLACEHOLDER, %(class="pagination-link" aria-label="goto page #{PAGE_PLACEHOLDER}")}</li>),
30
33
  'active' => %(<li>#{link.call PAGE_PLACEHOLDER, PAGE_PLACEHOLDER, %(class="pagination-link is-current" aria-current="page" aria-label="page #{PAGE_PLACEHOLDER}")}</li>),
31
34
  'gap' => %(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.nav.gap' }</span></li>),
32
35
  'after' => '</ul>' }
33
36
 
34
- html = %(<nav id="#{id}" class="pagy-bulma-nav-js pagination is-centered" role="navigation" aria-label="pagination"></nav>)
35
- html << pagy_json_tag(pagy, :nav, id, tags, pagy.sequels)
37
+ html = %(<nav#{p_id} class="pagy-njs pagy-bulma-nav-js pagination is-centered" aria-label="pagination"></nav>)
38
+ html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
36
39
  end
37
40
 
38
41
  # Javascript combo pagination for Bulma: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
39
- def pagy_bulma_combo_nav_js(pagy, id=pagy_id)
40
- link = pagy_link_proc(pagy)
42
+ def pagy_bulma_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
43
+ pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
44
+ p_id = %( id="#{pagy_id}") if pagy_id
45
+ link = pagy_link_proc(pagy, link_extra: link_extra)
41
46
  p_page = pagy.page
42
47
  p_pages = pagy.pages
43
48
  input = %(<input class="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;">)
44
49
 
45
- %(<nav id="#{id}" class="pagy-bulma-combo-nav-js" role="navigation" aria-label="pagination"><div class="field is-grouped is-grouped-centered" role="group">#{
50
+ %(<nav#{p_id} class="pagy-bulma-combo-nav-js" aria-label="pagination"><div class="field is-grouped is-grouped-centered" role="group">#{
46
51
  if (p_prev = pagy.prev)
47
52
  %(<p class="control">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"'}</p>)
48
53
  else
49
54
  %(<p class="control"><a class="button" disabled>#{pagy_t 'pagy.nav.prev'}</a></p>)
50
55
  end
51
- }<div class="pagy-combo-input control level is-mobile">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>#{
56
+ }<div class="pagy-combo-input control level is-mobile">#{pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</div>#{
52
57
  if (p_next = pagy.next)
53
58
  %(<p class="control">#{link.call p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"'}</p>)
54
59
  else
55
60
  %(<p class="control"><a class="button" disabled>#{pagy_t 'pagy.nav.next'}</a></p>)
56
61
  end
57
62
  }</div></nav>#{
58
- pagy_json_tag(pagy, :combo_nav, id, p_page, pagy_marked_link(link))
63
+ pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
59
64
  })
60
65
  end
61
66