pagy 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 447cda63901d2154f660b143ad95fdc1033bdf8a2f4df8daa1cc3458af6a3b3c
4
- data.tar.gz: 325d74734f50dc0b486ec94870b91c73890ea6d63f2ccf12d8b940ceacc864b0
3
+ metadata.gz: c829d223b7c780665135815222ed37bfe250d61e4e9c8f8083b829940d7bedd7
4
+ data.tar.gz: c3764805ed4bdbdd692ed71727703e4b007cdeefb9477dccb465c7d8cb327f1b
5
5
  SHA512:
6
- metadata.gz: 37a5279f51672130fe868a903564584f270ceb952f25cd9d7b2290a4a2c3d9801ad759a7312f9edf97ad5bbe74440326025d7f774017b46ce46bfb99c3b9aaa8
7
- data.tar.gz: 61045baceee37a1d1d21e0f2d51303386bc3055afff72f745c6e42d2a6a1b2a34ef373c5058078824dac3a2c841fb952eebba2363e19c6e785ce5edbe1a3ddc2
6
+ metadata.gz: 9af20f32dae70bc7baa773124283af036a516e419b8e35631798a1bcc29fe99468724032cbddbe84495a92b486016e99e8478d8e8936b31732897ce9d34397cf
7
+ data.tar.gz: 9f3c149eeb720c9afd7d4dbe923197c4764a9e05f70c227aef72282c61146389d75709f74c075ae79aa0c6c59bf7fa88a152aaf8a48f41bf4f004fee1c2a16f8
data/lib/config/pagy.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
  # frozen_string_literal: true
3
3
 
4
- # Pagy initializer file (3.0.0)
4
+ # Pagy initializer file (3.1.0)
5
5
  # Customize only what you really need and notice that Pagy works also without any of the following lines.
6
6
  # Should you just cherry pick part of this file, please maintain the require-order of the extras
7
7
 
@@ -11,12 +11,12 @@ Pagy.init = function(arg){
11
11
  }
12
12
  };
13
13
 
14
- Pagy.nav = function(id, marker, tags, sequels){
14
+ Pagy.nav = function(id, tags, sequels){
15
15
  var pagyEl = document.getElementById(id),
16
16
  container = pagyEl.parentElement,
17
17
  lastWidth = undefined,
18
18
  timeoutId = 0,
19
- marker_re = new RegExp(marker, 'g'),
19
+ markRE = new RegExp('--pagy.page--', 'g'),
20
20
  widths = [];
21
21
  for (var width in sequels) { widths.push(parseInt(width)) } // fine with sequels structure
22
22
  widths.sort(function(a, b){return b-a});
@@ -33,9 +33,9 @@ Pagy.nav = function(id, marker, tags, sequels){
33
33
  series = sequels[width];
34
34
  for (i = 0, len = series.length; i < len; i++) {
35
35
  var item = series[i];
36
- if (typeof(item) === 'number') { html += tags.link.replace(marker_re, item) }
36
+ if (typeof(item) === 'number') { html += tags.link.replace(markRE, item) }
37
37
  else if (item === 'gap') { html += tags.gap }
38
- else if (typeof(item) === 'string') { html += tags.active.replace(marker_re, item) }
38
+ else if (typeof(item) === 'string') { html += tags.active.replace(markRE, item) }
39
39
  }
40
40
  html += tags.after;
41
41
  pagyEl.insertAdjacentHTML('beforeend', html);
@@ -54,36 +54,36 @@ Pagy.nav = function(id, marker, tags, sequels){
54
54
  render();
55
55
  };
56
56
 
57
- Pagy.combo_nav = function(id, marker, page, trim){
57
+ Pagy.combo_nav = function(id, page, links){
58
58
  var pagyEl = document.getElementById(id),
59
59
  input = pagyEl.getElementsByTagName('input')[0],
60
- link = pagyEl.getElementsByTagName('a')[0],
61
- linkP1 = pagyEl.getElementsByTagName('a')[1],
62
60
  go = function(){
63
61
  if (page !== input.value) {
64
- if (trim === true && input.value === '1') { linkP1.click() }
65
- else {
66
- var href = link.getAttribute('href').replace(marker, input.value);
67
- link.setAttribute('href', href);
68
- link.click();
62
+ if (links.hasOwnProperty('trimmed') && input.value === '1') {
63
+ pagyEl.insertAdjacentHTML('afterbegin', links.trimmed);
64
+ } else {
65
+ pagyEl.insertAdjacentHTML('afterbegin', links.standard.replace('--pagy.page--', input.value));
69
66
  }
67
+ pagyEl.getElementsByTagName('a')[0].click();
70
68
  }
71
69
  };
72
70
  Pagy.addInputEventListeners(input, go);
73
71
  };
74
72
 
75
- Pagy.items_selector = function(id, marker, from){
73
+ Pagy.items_selector = function(id, from, links){
76
74
  var pagyEl = document.getElementById(id),
77
75
  input = pagyEl.getElementsByTagName('input')[0],
78
76
  current = input.value,
79
- link = pagyEl.getElementsByTagName('a')[0],
80
77
  go = function(){
81
78
  var items = input.value;
82
79
  if (current !== items) {
83
80
  var page = Math.max(Math.ceil(from / items),1);
84
- var href = link.getAttribute('href').replace(marker+'-page-', page).replace(marker+'-items-', items);
85
- link.setAttribute('href', href);
86
- link.click();
81
+ if (links.hasOwnProperty('trimmed') && page === 1) {
82
+ pagyEl.insertAdjacentHTML('afterbegin', links.trimmed.replace('--pagy.items--', items));
83
+ } else {
84
+ pagyEl.insertAdjacentHTML('afterbegin', links.standard.replace('--pagy.page--', page).replace('--pagy.items--', items));
85
+ }
86
+ pagyEl.getElementsByTagName('a')[0].click();
87
87
  }
88
88
  };
89
89
  Pagy.addInputEventListeners(input, go);
@@ -99,4 +99,3 @@ Pagy.addInputEventListeners = function(input, handler){
99
99
  // … and when pressing enter inside the input
100
100
  input.addEventListener('keyup', function(e){ if (e.which === 13) handler() }.bind(this));
101
101
  };
102
-
@@ -29,29 +29,26 @@ class Pagy
29
29
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next
30
30
  tags = { 'before' => p_prev ? %(<ul class="pagination"><li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
31
31
  : %(<ul class="pagination"><li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>),
32
- 'link' => %(<li class="page-item">#{marker = link.call(MARKER)}</li>),
33
- 'active' => %(<li class="page-item active">#{marker}</li>),
32
+ 'link' => %(<li class="page-item">#{mark = link.call(MARK)}</li>),
33
+ 'active' => %(<li class="page-item active">#{mark}</li>),
34
34
  'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>),
35
35
  'after' => p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li></ul>)
36
36
  : %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li></ul>) }
37
- %(<nav id="#{id}" class="pagy-bootstrap-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
37
+ %(<nav id="#{id}" class="pagy-bootstrap-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
38
38
  end
39
39
 
40
40
  # Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
41
41
  def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
42
42
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
43
43
 
44
- html = %(<nav id="#{id}" class="pagy-bootstrap-combo-nav-js pagination" role="navigation" aria-label="pager">) \
45
- + link.call(MARKER, '', %(style="display: none;" ))
46
- (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
47
- html << %(<div class="btn-group" role="group">)
48
- html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
49
- : %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
50
- 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;">)
51
- html << %(<div class="pagy-combo-input btn btn-primary disabled" style="white-space: nowrap;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
52
- html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
53
- : %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
54
- html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
44
+ html = %(<nav id="#{id}" class="pagy-bootstrap-combo-nav-js pagination" role="navigation" aria-label="pager">) + %(<div class="btn-group" role="group">)
45
+ html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
46
+ : %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
47
+ 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;">)
48
+ html << %(<div class="pagy-combo-input btn btn-primary disabled" style="white-space: nowrap;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
49
+ html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
50
+ : %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
51
+ html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
55
52
  end
56
53
 
57
54
  end
@@ -34,11 +34,11 @@ class Pagy
34
34
  + (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
35
35
  : %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>)) \
36
36
  + '<ul class="pagination-list">' ),
37
- 'link' => %(<li>#{link.call(MARKER, MARKER, %(class="pagination-link" aria-label="goto page #{MARKER}"))}</li>),
38
- 'active' => %(<li>#{link.call(MARKER, MARKER, %(class="pagination-link is-current" aria-current="page" aria-label="page #{MARKER}"))}</li>),
37
+ 'link' => %(<li>#{link.call(MARK, MARK, %(class="pagination-link" aria-label="goto page #{MARK}"))}</li>),
38
+ 'active' => %(<li>#{link.call(MARK, MARK, %(class="pagination-link is-current" aria-current="page" aria-label="page #{MARK}"))}</li>),
39
39
  'gap' => %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>),
40
40
  'after' => '</ul>' }
41
- %(<nav id="#{id}" class="pagy-bulma-nav-js pagination is-centered" role="navigation" aria-label="pagination"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
41
+ %(<nav id="#{id}" class="pagy-bulma-nav-js pagination is-centered" role="navigation" aria-label="pagination"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
42
42
  end
43
43
 
44
44
  # Javascript combo pagination for Bulma: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
@@ -46,16 +46,14 @@ class Pagy
46
46
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
47
47
 
48
48
  html = %(<nav id="#{id}" class="pagy-bulma-combo-nav-js" role="navigation" aria-label="pagination">) \
49
- + link.call(MARKER, '', 'style="display: none;"')
50
- (html << link.call(1, '', %(style="display: none;"))) if defined?(TRIM)
51
- html << %(<div class="field is-grouped is-grouped-centered" role="group">)
52
- html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
53
- : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
54
- 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;">)
55
- html << %(<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
- html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
57
- : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
58
- html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
49
+ + %(<div class="field is-grouped is-grouped-centered" role="group">)
50
+ html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
51
+ : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
52
+ 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;">)
53
+ html << %(<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>)
54
+ html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
55
+ : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
56
+ html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
59
57
  end
60
58
 
61
59
  end
@@ -30,30 +30,27 @@ class Pagy
30
30
  tags = { 'before' => ( '<ul class="pagination">' \
31
31
  + (p_prev ? %(<li class="prev">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')}</li>)
32
32
  : %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>)) ),
33
- 'link' => %(<li>#{link.call(MARKER)}</li>),
33
+ 'link' => %(<li>#{link.call(MARK)}</li>),
34
34
  'active' => %(<li class="current">#{pagy.page}</li>),
35
35
  'gap' => %(<li class="ellipsis gap" aria-hidden="true"></li>),
36
36
  'after' => ( (p_next ? %(<li class="next">#{link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next"')}</li>)
37
37
  : %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>)) \
38
38
  + '</ul>' ) }
39
- %(<nav id="#{id}" class="pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
39
+ %(<nav id="#{id}" class="pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
40
40
  end
41
41
 
42
42
  # Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
43
43
  def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
44
44
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
45
45
 
46
- html = %(<nav id="#{id}" class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination">) \
47
- + link.call(MARKER, '', %(style="display: none;" ))
48
- (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
49
- html << %(<div class="input-group">)
50
- html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
51
- : %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
52
- 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;">)
53
- html << %(<span class="input-group-label">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span>)
54
- html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
55
- : %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
56
- html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
46
+ html = %(<nav id="#{id}" class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination">) + %(<div class="input-group">)
47
+ html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
48
+ : %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
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;">)
50
+ html << %(<span class="input-group-label">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span>)
51
+ html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
52
+ : %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
53
+ html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
57
54
  end
58
55
 
59
56
  end
@@ -23,8 +23,8 @@ class Pagy
23
23
  def pagy_headers_hash(pagy)
24
24
  countless = defined?(Pagy::Countless) && pagy.is_a?(Pagy::Countless)
25
25
  rels = { 'first' => 1, 'prev' => pagy.prev, 'next' => pagy.next }; rels['last'] = pagy.last unless countless
26
- url_str = pagy_url_for(Frontend::MARKER, pagy, :url)
27
- hash = { 'Link' => Hash[rels.map{|rel, n|[rel, url_str.sub(Frontend::MARKER, n.to_s)] if n}.compact] }
26
+ url_str = pagy_url_for(Frontend::MARK, pagy, :url)
27
+ hash = { 'Link' => Hash[rels.map{|rel, n|[rel, url_str.sub(Frontend::MARK, n.to_s)] if n}.compact] }
28
28
  headers = pagy.vars[:headers]
29
29
  hash[headers[:page]] = pagy.page if headers[:page]
30
30
  hash[headers[:items]] = pagy.vars[:items] if headers[:items]
@@ -47,13 +47,16 @@ class Pagy
47
47
 
48
48
  # Return the items selector HTML. For example "Show [20] items per page"
49
49
  def pagy_items_selector_js(pagy, id=pagy_id)
50
- p_vars = pagy.vars; p_items = p_vars[:items]; p_vars[:items] = "#{MARKER}-items-"
51
-
52
- html = %(<span id="#{id}">) + %(<a href="#{pagy_url_for("#{MARKER}-page-", pagy)}"></a>)
50
+ p_vars = pagy.vars
51
+ p_items = p_vars[:items]
52
+ p_vars[:items] = '--pagy.items--'
53
+ links = pagy_links(pagy_link_proc(pagy))
53
54
  p_vars[:items] = p_items # restore the items
55
+
56
+ html = EMPTY + %(<span id="#{id}">)
54
57
  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;">)
55
- html << %(#{pagy_t('pagy.items_selector_js', item_name: pagy_t(pagy.vars[:i18n_key], count: p_items), items_input: input, count: p_items)})
56
- html << %(</span>#{pagy_json_tag(:items_selector, id, MARKER, pagy.from)})
58
+ html << %(#{pagy_t('pagy.items_selector_js', item_name: pagy_t(p_vars[:i18n_key], count: p_items), items_input: input, count: p_items)})
59
+ html << %(</span>#{pagy_json_tag(:items_selector, id, pagy.from, links)})
57
60
  end
58
61
 
59
62
  end
@@ -29,13 +29,13 @@ class Pagy
29
29
  tags = { 'before' => ( '<ul class="pagination">' \
30
30
  + (p_prev ? %(<li class="waves-effect prev">#{link.call(p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"')}</li>)
31
31
  : %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>)) ),
32
- 'link' => %(<li class="waves-effect">#{marker = link.call(MARKER)}</li>),
33
- 'active' => %(<li class="active">#{marker}</li>),
32
+ 'link' => %(<li class="waves-effect">#{mark = link.call(MARK)}</li>),
33
+ 'active' => %(<li class="active">#{mark}</li>),
34
34
  'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>),
35
35
  'after' => ( (p_next ? %(<li class="waves-effect next">#{link.call(p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"')}</li>)
36
36
  : %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>)) \
37
37
  + '</ul>' ) }
38
- %(<div id="#{id}" class="pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
38
+ %(<div id="#{id}" class="pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
39
39
  end
40
40
 
41
41
  # Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
@@ -43,18 +43,16 @@ class Pagy
43
43
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
44
44
 
45
45
  html = %(<div id="#{id}" class="pagy-materialize-combo-nav-js pagination" role="navigation" aria-label="pager">) \
46
- + link.call(MARKER, '', %(style="display: none;" ))
47
- (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
48
- html << %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
46
+ + %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
49
47
  html << '<ul class="pagination" style="margin: 0px;">'
50
48
  li_style = 'style="vertical-align: middle;"'
51
49
  html << (p_prev ? %(<li class="waves-effect prev" #{li_style}>#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
52
- : %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
50
+ : %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
53
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;">)
54
52
  html << %(<div class="pagy-combo-input btn-flat" style="cursor: default; padding: 0px">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
55
53
  html << (p_next ? %(<li class="waves-effect next" #{li_style}>#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
56
- : %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
57
- html << %(</ul></div>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
54
+ : %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
55
+ html << %(</ul></div>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
58
56
  end
59
57
 
60
58
  end
@@ -12,28 +12,26 @@ class Pagy
12
12
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
13
13
  tags = { 'before' => p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
14
14
  : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ),
15
- 'link' => %(<span class="page">#{link.call(MARKER)}</span> ),
15
+ 'link' => %(<span class="page">#{link.call(MARK)}</span> ),
16
16
  'active' => %(<span class="page active">#{pagy.page}</span> ),
17
17
  'gap' => %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ),
18
18
  'after' => p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
19
19
  : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>) }
20
- %(<nav id="#{id}" class="pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
20
+ %(<nav id="#{id}" class="pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
21
21
  end
22
22
 
23
23
  # Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
24
24
  def pagy_combo_nav_js(pagy, id=pagy_id)
25
25
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
26
26
 
27
- html = %(<nav id="#{id}" class="pagy-combo-nav-js-js pagination" role="navigation" aria-label="pager">) \
28
- + link.call(MARKER, '', %(style="display: none;" ))
29
- (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
30
- html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
31
- : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
32
- 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;">)
33
- html << %(<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span> )
34
- html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
35
- : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
36
- html << %(</nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
27
+ html = EMPTY + %(<nav id="#{id}" class="pagy-combo-nav-js-js pagination" role="navigation" aria-label="pager">)
28
+ html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
29
+ : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
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;">)
31
+ html << %(<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span> )
32
+ html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
33
+ : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
34
+ html << %(</nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
37
35
  end
38
36
 
39
37
  end
@@ -29,28 +29,26 @@ class Pagy
29
29
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
30
30
  tags = { 'before' => (p_prev ? %(#{link.call(p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"')})
31
31
  : %(<div class="item disabled"><i class="left small chevron icon"></i></div>)),
32
- 'link' => %(#{link.call(MARKER)}),
32
+ 'link' => %(#{link.call(MARK)}),
33
33
  'active' => %(<a class="item active">#{pagy.page}</a>),
34
34
  'gap' => %(<div class="disabled item">#{pagy_t('pagy.nav.gap')}</div>),
35
35
  'after' => (p_next ? %(#{link.call(p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"')})
36
36
  : %(<div class="item disabled"><i class="right small chevron icon"></i></div>)) }
37
- %(<div id="#{id}" class="pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
37
+ %(<div id="#{id}" class="pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, tags, pagy.sequels)})
38
38
  end
39
39
 
40
40
  # Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
41
41
  def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
42
42
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next, pagy.page, pagy.pages
43
43
 
44
- html = %(<div id="#{id}" class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">) \
45
- + link.call(MARKER, '', %(style="display: none;" ))
46
- (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
47
- html << (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
48
- : %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
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">)
50
- html << %(<div class="pagy-combo-input item">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div> )
51
- html << (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
52
- : %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
53
- html << %(</div>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
44
+ html = EMPTY + %(<div id="#{id}" class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">)
45
+ html << (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
46
+ : %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
47
+ 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">)
48
+ html << %(<div class="pagy-combo-input item">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div> )
49
+ html << (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
50
+ : %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
51
+ html << %(</div>#{pagy_json_tag(:combo_nav, id, p_page, pagy_links(link))})
54
52
  end
55
53
 
56
54
  end
@@ -26,23 +26,30 @@ class Pagy
26
26
  module Frontend
27
27
 
28
28
  if defined?(Oj)
29
- # returns a script tag with the JSON-serialized args generated with the faster oj gem
29
+ # it returns a script tag with the JSON-serialized args generated with the faster oj gem
30
30
  def pagy_json_tag(*args)
31
31
  %(<script type="application/json" class="pagy-json">#{Oj.dump(args, mode: :strict)}</script>)
32
32
  end
33
33
  else
34
34
  require 'json'
35
- # returns a script tag with the JSON-serialized args generated with the slower to_json
35
+ # it returns a script tag with the JSON-serialized args generated with the slower to_json
36
36
  def pagy_json_tag(*args)
37
37
  %(<script type="application/json" class="pagy-json">#{args.to_json}</script>)
38
38
  end
39
39
  end
40
40
 
41
- # returns the SHA1 (fastest on modern ruby) string used as default `id` attribute by all the `*_js` tags
41
+ # it returns the SHA1 (fastest on modern ruby) string used as default `id` attribute by all the `*_js` tags
42
42
  def pagy_id
43
43
  "pagy-#{Digest::SHA1.hexdigest(caller(2..2)[0].split(':in')[0])}"
44
44
  end
45
45
 
46
+ # it return the links hash to used by pagy.js
47
+ def pagy_links(link)
48
+ links = { 'standard' => link.call(MARK, '', 'style="display: none;"') }
49
+ links['trimmed'] = link.call(1, '', 'style="display: none;"') if defined?(TRIM)
50
+ links
51
+ end
52
+
46
53
  end
47
54
 
48
55
  end
@@ -12,14 +12,14 @@ class Pagy
12
12
  alias_method :pagy_link_proc_without_trim, :pagy_link_proc
13
13
  def pagy_link_proc_with_trim(pagy, link_extra='')
14
14
  p_prev, p_next, p_vars = pagy.prev, pagy.next, pagy.vars
15
- marker_url = pagy_url_for(MARKER, pagy)
16
- page1_url = pagy_trim_url(marker_url, "#{p_vars[:page_param]}=#{MARKER}")
15
+ marked_url = pagy_url_for(MARK, pagy)
16
+ page1_url = pagy_trim_url(marked_url, "#{p_vars[:page_param]}=#{MARK}")
17
17
  page1_link = %(<a href="#{page1_url}" #{p_vars[:link_extra]} #{link_extra})
18
- a, b = %(<a href="#{marker_url}" #{p_vars[:link_extra]} #{link_extra}).split(MARKER, 2)
18
+ a, b = %(<a href="#{marked_url}" #{p_vars[:link_extra]} #{link_extra}).split(MARK, 2)
19
19
  lambda{|n, text=n, extra=''| start = n.to_i == 1 ? page1_link : "#{a}#{n}#{b}"
20
20
  "#{start}#{ if n == p_prev ; ' rel="prev"'
21
21
  elsif n == p_next ; ' rel="next"'
22
- else '' end } #{extra}>#{text}</a>" }
22
+ else '' end } #{extra}>#{text}</a>"}
23
23
  end
24
24
  alias_method :pagy_link_proc, :pagy_link_proc_with_trim
25
25
 
data/lib/pagy/frontend.rb CHANGED
@@ -27,8 +27,8 @@ class Pagy
27
27
 
28
28
  include Helpers
29
29
 
30
- # EMPTY + 'string' is almost as fast as +'string' but is also 1.9 compatible
31
- EMPTY = ''
30
+ EMPTY = '' # EMPTY + 'string' is almost as fast as +'string' but is also 1.9 compatible
31
+ MARK = '--pagy.page--' # string used for search and replace, hardcoded also in the pagy.js file
32
32
 
33
33
  # Generic pagination: it returns the html with the series of links to the pages
34
34
  def pagy_nav(pagy)
@@ -55,16 +55,14 @@ class Pagy
55
55
  pagy_t(path, item_name: pagy_t(pagy.vars[:i18n_key], count: count), count: count, from: pagy.from, to: pagy.to)
56
56
  end
57
57
 
58
- MARKER = "-pagy-#{'pagy'.hash}-"
59
-
60
58
  # Returns a performance optimized proc to generate the HTML links
61
59
  # Benchmarked on a 20 link nav: it is ~22x faster and uses ~18x less memory than rails' link_to
62
60
  def pagy_link_proc(pagy, link_extra='')
63
61
  p_prev, p_next = pagy.prev, pagy.next
64
- a, b = %(<a href="#{pagy_url_for(MARKER, pagy)}" #{pagy.vars[:link_extra]} #{link_extra}).split(MARKER, 2)
62
+ a, b = %(<a href="#{pagy_url_for(MARK, pagy)}" #{pagy.vars[:link_extra]} #{link_extra}).split(MARK, 2)
65
63
  lambda {|n, text=n, extra=''| "#{a}#{n}#{b}#{ if n == p_prev ; ' rel="prev"'
66
64
  elsif n == p_next ; ' rel="next"'
67
- else '' end } #{extra}>#{text}</a>" }
65
+ else '' end } #{extra}>#{text}</a>"}
68
66
  end
69
67
 
70
68
  # Similar to I18n.t: just ~18x faster using ~10x less memory
data/lib/pagy.rb CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  require 'pathname'
6
6
 
7
- class Pagy ; VERSION = '3.0.0'
7
+ class Pagy ; VERSION = '3.1.0'
8
8
 
9
9
  class OverflowError < StandardError; attr_reader :pagy; def initialize(pagy) @pagy = pagy end; end
10
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-28 00:00:00.000000000 Z
11
+ date: 2019-05-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 'Agnostic pagination in plain ruby: it works with any framework, ORM
14
14
  and DB type, with all kinds of collections, even pre-paginated, scopes, Arrays,