pagy 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ea9f5556f76cbbc137144639af45e161a9caf36bde512201911ed04103c7707
4
- data.tar.gz: c3a0337dd4d124275e33bab79e2ff30d0f7a56a6a715a602dfc06deef88dda86
3
+ metadata.gz: 681052934a39cf55ae637f4760440afea264bdef4edb5b6d3f42cfc1a22f78d5
4
+ data.tar.gz: '0728e6ad1211af132b074c0a41419136b4554406a78d002c07af29db9b6e97eb'
5
5
  SHA512:
6
- metadata.gz: b8be1f7f3369f8ce276d04bf67436e3bd40c3a1f788720f04a9928da63a60a4157fea59344c5bebabb6f7303f8a45d094aa6993c7b87bc1534ac219fa4efa6f0
7
- data.tar.gz: e676ffa46c89159efe7272b4250e3819762355b3c45e73f4a1ad5e6d378697bfe5048ec27c2fef2a19dd597fd288d3bf7b453c19839c00f8fd4cdfd37eeea87a
6
+ metadata.gz: 2577f76f006a80e85001f0d16eb85f87b4f47d1439040754355131e5032e75e997273d9174c18fd2979b21e57fe709dcee5acdbc7c6c8264b0d5a438bbede6e2
7
+ data.tar.gz: 0a0d7c7a41ea3020c60b1e3461ff5a3a68e6ddbc592f74492e17a3741905e5dd0219734ad0361058dba0a7b15432462cc41fa5fcb391742ee1917ee442e3d97e
data/lib/pagy.rb CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  require 'pathname'
5
5
 
6
- class Pagy ; VERSION = '0.14.0'
6
+ class Pagy ; VERSION = '0.15.0'
7
7
 
8
8
  class OutOfRangeError < StandardError; attr_reader :pagy; def initialize(pagy) @pagy = pagy end; end
9
9
 
@@ -12,13 +12,14 @@ class Pagy
12
12
 
13
13
  html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact pagination" role="navigation" aria-label="pager">)
14
14
  html << link.call(MARKER, '', %(style="display: none;" ))
15
- html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
15
+ (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
16
+ html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
16
17
  : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
17
18
  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;">)
18
19
  html << %(<span class="pagy-compact-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</span> )
19
20
  html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
20
21
  : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
21
- html << %(</nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
22
+ html << %(</nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
22
23
  end
23
24
 
24
25
  # Compact pagination for bootstrap: it returns the html with the series of links to the pages
@@ -28,14 +29,15 @@ class Pagy
28
29
 
29
30
  html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bootstrap pagination" role="navigation" aria-label="pager">)
30
31
  html << link.call(MARKER, '', %(style="display: none;" ))
31
- html << %(<div class="btn-group" role="group">)
32
+ (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
33
+ html << %(<div class="btn-group" role="group">)
32
34
  html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
33
35
  : %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
34
36
  input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; border: none; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
35
37
  html << %(<div class="pagy-compact-input btn btn-primary disabled">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</div>)
36
38
  html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
37
39
  : %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
38
- html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
40
+ html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
39
41
  end
40
42
 
41
43
  # Compact pagination for Bulma: it returns the html with the series of links to the pages
@@ -45,6 +47,7 @@ class Pagy
45
47
 
46
48
  html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bulma" role="navigation" aria-label="pagination">)
47
49
  html << link.call(MARKER, '', 'style="display: none;"')
50
+ (html << link.call(1, '', %(style="display: none;"))) if defined?(TRIM)
48
51
  html << %(<div class="field is-grouped is-grouped-centered" role="group">)
49
52
  html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
50
53
  : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
@@ -52,7 +55,7 @@ class Pagy
52
55
  html << %(<div class="pagy-compact-input control level is-mobile">#{pagy_t('pagy.compact.page')}&nbsp;#{input}&nbsp;#{pagy_t('pagy.compact.of')} #{p_pages}</div>)
53
56
  html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
54
57
  : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
55
- html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
58
+ html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
56
59
  end
57
60
 
58
61
  # Compact pagination for materialize: it returns the html with the series of links to the pages
@@ -62,6 +65,7 @@ class Pagy
62
65
 
63
66
  html << %(<div id="pagy-nav-#{id}" class="pagy-nav-compact-materialize pagination" role="navigation" aria-label="pager">)
64
67
  html << link.call(MARKER, '', %(style="display: none;" ))
68
+ (html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
65
69
  html << %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
66
70
  html << '<ul class="pagination" style="margin: 0px;">'
67
71
  li_style = 'style="vertical-align: middle;"'
@@ -71,7 +75,7 @@ class Pagy
71
75
  html << %(<div class="pagy-compact-input btn-flat" style="cursor: default; padding: 0px">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</div>)
72
76
  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>)
73
77
  : %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
74
- html << %(</ul></div><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
78
+ html << %(</ul></div><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
75
79
  end
76
80
 
77
81
  end
@@ -41,6 +41,10 @@
41
41
  # See https://ddnexus.github.io/pagy/extras/responsive#breakpoints
42
42
  # Pagy::VARS[:breakpoints] = { 0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3] } # example of width/size pairs
43
43
 
44
+ # Trim: Remove the page=1 param from links
45
+ # See https://ddnexus.github.io/pagy/extras/trim
46
+ # require 'pagy/extras/trim'
47
+
44
48
 
45
49
  # Pagy Variables
46
50
  # See https://ddnexus.github.io/pagy/api/pagy#variables
@@ -10,23 +10,24 @@ class Pagy
10
10
  # Handle a custom number of :items from params
11
11
  module Backend ; private
12
12
 
13
- alias_method :built_in_pagy_get_vars, :pagy_get_vars
14
-
15
- def pagy_get_vars(collection, vars)
13
+ alias_method :pagy_get_vars_without_items, :pagy_get_vars
14
+ def pagy_get_vars_with_items(collection, vars)
16
15
  vars[:items] ||= (items = params[vars[:items_param] || VARS[:items_param]]) && # :items from :items_param
17
16
  [items&.to_i, vars.key?(:max_items) ? vars[:max_items] : VARS[:max_items]].compact.min # :items capped to :max_items
18
- built_in_pagy_get_vars(collection, vars)
17
+ pagy_get_vars_without_items(collection, vars)
19
18
  end
19
+ alias_method :pagy_get_vars, :pagy_get_vars_with_items
20
20
 
21
21
  end
22
22
 
23
23
  module Frontend
24
24
 
25
- # This works with all Rack-based frameworks (Sinatra, Padrino, Rails, ...)
26
- def pagy_url_for(page, pagy)
25
+ alias_method :pagy_url_for_without_items, :pagy_url_for
26
+ def pagy_url_for_with_items(page, pagy)
27
27
  p_vars = pagy.vars; params = request.GET.merge(p_vars[:page_param] => page, p_vars[:items_param] => p_vars[:items]).merge!(p_vars[:params])
28
28
  "#{request.path}?#{Rack::Utils.build_nested_query(pagy_get_params(params))}#{p_vars[:anchor]}"
29
29
  end
30
+ alias_method :pagy_url_for, :pagy_url_for_with_items
30
31
 
31
32
  # Return the items selector HTML. For example "Show [20] items per page"
32
33
  def pagy_items_selector(pagy, id=caller(1,1)[0].hash)
@@ -13,15 +13,19 @@ Pagy.addInputEventListeners = function(input, handler){
13
13
  input.addEventListener('keyup', function(e){ if (e.which === 13) handler() }.bind(this));
14
14
  };
15
15
 
16
- Pagy.compact = function(id, marker, page){
16
+ Pagy.compact = function(id, marker, page, trim){
17
17
  var pagyNav = document.getElementById('pagy-nav-'+id),
18
18
  input = pagyNav.getElementsByTagName('input')[0],
19
19
  link = pagyNav.getElementsByTagName('a')[0],
20
+ linkP1 = pagyNav.getElementsByTagName('a')[1],
20
21
  go = function(){
21
22
  if (page !== input.value) {
22
- var href = link.getAttribute('href').replace(marker, input.value);
23
- link.setAttribute('href', href);
24
- link.click();
23
+ if (trim === true && input.value === '1') { linkP1.click() }
24
+ else {
25
+ var href = link.getAttribute('href').replace(marker, input.value);
26
+ link.setAttribute('href', href);
27
+ link.click();
28
+ }
25
29
  }
26
30
  };
27
31
  Pagy.addInputEventListeners(input, go);
@@ -0,0 +1,30 @@
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/trim
2
+ # frozen_string_literal: true
3
+
4
+ class Pagy
5
+
6
+ module Frontend
7
+
8
+ # boolean used by the compact extra
9
+ TRIM = true
10
+
11
+ def pagy_trim_url(url, param_string)
12
+ url.sub(/((?:[?&])#{param_string}\z|\b(?<=[?&])#{param_string}&)/, '')
13
+ end
14
+
15
+ alias_method :pagy_link_proc_without_trim, :pagy_link_proc
16
+ def pagy_link_proc_with_trim(pagy, link_extra='')
17
+ p_prev, p_next, p_vars = pagy.prev, pagy.next, pagy.vars
18
+ url = pagy_url_for(MARKER, pagy)
19
+ p1url = pagy_trim_url(url, "#{p_vars[:page_param]}=#{MARKER}")
20
+ p1 = %(<a href="#{p1url}" #{p_vars[:link_extra]} #{link_extra})
21
+ a, b = %(<a href="#{url}" #{p_vars[:link_extra]} #{link_extra}).split(MARKER, 2)
22
+ -> (n, text=n, extra='') { start = n == 1 ? p1 : "#{a}#{n}#{b}"
23
+ "#{start}#{ if n == p_prev ; ' rel="prev"'
24
+ elsif n == p_next ; ' rel="next"'
25
+ else '' end } #{extra}>#{text}</a>" }
26
+ end
27
+ alias_method :pagy_link_proc, :pagy_link_proc_with_trim
28
+
29
+ end
30
+ end
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: 0.14.0
4
+ version: 0.15.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: 2018-07-17 00:00:00.000000000 Z
11
+ date: 2018-07-29 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,
@@ -45,6 +45,7 @@ files:
45
45
  - lib/pagy/extras/templates/nav_bulma.html.erb
46
46
  - lib/pagy/extras/templates/nav_bulma.html.haml
47
47
  - lib/pagy/extras/templates/nav_bulma.html.slim
48
+ - lib/pagy/extras/trim.rb
48
49
  - lib/pagy/frontend.rb
49
50
  - pagy.gemspec
50
51
  homepage: https://github.com/ddnexus/pagy