pagy 0.9.2 → 0.10.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 +4 -4
- data/lib/pagy.rb +1 -1
- data/lib/pagy/extras/compact.rb +2 -11
- data/lib/pagy/extras/items.rb +1 -3
- data/lib/pagy/extras/javascripts/pagy.js +85 -0
- data/lib/pagy/extras/responsive.rb +20 -20
- metadata +3 -5
- data/lib/pagy/extras/javascripts/pagy-compact.js +0 -23
- data/lib/pagy/extras/javascripts/pagy-items.js +0 -26
- data/lib/pagy/extras/javascripts/pagy-responsive.js +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f42ebff94cf9faa8dadd414d3fd056bcf57da0a2e4930f1a9850d64eca08adf4
|
4
|
+
data.tar.gz: 60133804f52c4c687647d2c8b48f2b7344a558fa163063857f24bc0387d41834
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6dbcbc1041dceb8ff23832f687083e701d3eb187fabddd1051bf3672c1e93efbe4b680c534dd531d506c173f7766cba96473ac8bc5464da8db25206a9c9ee9b
|
7
|
+
data.tar.gz: 256e4e8eb88d53c71fe035804e6ad99af606f93fc673d7173150e4ac13e396c084eda16686d52c144ea3d5af7cca29797ddca5d0be21aac87406cc7654757171
|
data/lib/pagy.rb
CHANGED
data/lib/pagy/extras/compact.rb
CHANGED
@@ -11,18 +11,14 @@ class Pagy
|
|
11
11
|
tags, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
12
12
|
|
13
13
|
tags << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact pagination" role="navigation" aria-label="pager">)
|
14
|
-
|
15
14
|
tags << link.call(MARKER, '', %(style="display: none;" ))
|
16
15
|
tags << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
17
16
|
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
18
|
-
|
19
17
|
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;">)
|
20
18
|
tags << %(<span class="pagy-compact-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</span> )
|
21
|
-
|
22
19
|
tags << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
23
20
|
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
24
|
-
|
25
|
-
tags << %(</nav><script>PagyCompact('#{id}', '#{MARKER}', '#{p_page}');</script>)
|
21
|
+
tags << %(</nav><script type="application/json" class="pagy-compact">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
|
26
22
|
end
|
27
23
|
|
28
24
|
# Compact pagination for bootstrap: it returns the html with the series of links to the pages
|
@@ -31,20 +27,15 @@ class Pagy
|
|
31
27
|
tags, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
32
28
|
|
33
29
|
tags << %(<nav id="pagy-nav-#{id}" class="pagy-nav-bootstrap-compact pagination" role="navigation" aria-label="pager">)
|
34
|
-
|
35
30
|
tags << link.call(MARKER, '', %(style="display: none;" ))
|
36
|
-
|
37
31
|
tags << %(<div class="btn-group" role="group">)
|
38
32
|
tags << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
|
39
33
|
: %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
40
|
-
|
41
34
|
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;">)
|
42
35
|
tags << %(<div class="pagy-compact-input btn btn-primary disabled">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</div>)
|
43
|
-
|
44
36
|
tags << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
|
45
37
|
: %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
46
|
-
|
47
|
-
tags << %(</div></nav><script>PagyCompact('#{id}', '#{MARKER}', '#{p_page}');</script>)
|
38
|
+
tags << %(</div></nav><script type="application/json" class="pagy-compact">["#{id}", "#{MARKER}", "#{p_page}"]</script>)
|
48
39
|
end
|
49
40
|
|
50
41
|
end
|
data/lib/pagy/extras/items.rb
CHANGED
@@ -33,12 +33,10 @@ class Pagy
|
|
33
33
|
pagy = pagy.clone; p_vars = pagy.vars; p_items = p_vars[:items]; p_vars[:items] = "#{MARKER}-items-"
|
34
34
|
|
35
35
|
tags = +%(<span id="pagy-items-#{id}">)
|
36
|
-
|
37
36
|
tags << %(<a href="#{pagy_url_for("#{MARKER}-page-", pagy)}"></a>)
|
38
37
|
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;">)
|
39
38
|
tags << %(#{pagy_t('pagy.items.show')} #{input} #{pagy_t('pagy.items.items')})
|
40
|
-
|
41
|
-
tags << %(</span><script>PagyItems('#{id}', '#{MARKER}', #{pagy.from});</script>)
|
39
|
+
tags << %(</span><script type="application/json" class="pagy-items">["#{id}", "#{MARKER}", #{pagy.from}]</script>)
|
42
40
|
end
|
43
41
|
|
44
42
|
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras
|
2
|
+
|
3
|
+
function Pagy(){}
|
4
|
+
|
5
|
+
Pagy.compact = function(id, marker, page){
|
6
|
+
var pagyNav = document.getElementById('pagy-nav-'+id),
|
7
|
+
input = pagyNav.getElementsByTagName('input')[0],
|
8
|
+
link = pagyNav.getElementsByTagName('a')[0];
|
9
|
+
|
10
|
+
var go = function(){
|
11
|
+
if (page !== input.value) {
|
12
|
+
var href = link.getAttribute('href').replace(marker, input.value);
|
13
|
+
link.setAttribute('href', href);
|
14
|
+
link.click();
|
15
|
+
}
|
16
|
+
};
|
17
|
+
|
18
|
+
// select the content on click: easier for typing a number
|
19
|
+
input.addEventListener('click', function(){ this.select() });
|
20
|
+
// go when the input looses focus
|
21
|
+
input.addEventListener('focusout', go);
|
22
|
+
// … and when pressing enter inside the input
|
23
|
+
input.addEventListener('keyup', function(e){ if (e.which === 13) go() }.bind(this));
|
24
|
+
|
25
|
+
};
|
26
|
+
|
27
|
+
|
28
|
+
Pagy.items = function(id, marker, from){
|
29
|
+
var pagyNav = document.getElementById('pagy-items-'+id),
|
30
|
+
input = pagyNav.getElementsByTagName('input')[0],
|
31
|
+
current = input.value,
|
32
|
+
link = pagyNav.getElementsByTagName('a')[0];
|
33
|
+
|
34
|
+
var go = function(){
|
35
|
+
var items = input.value;
|
36
|
+
if (current !== items) {
|
37
|
+
var page = Math.max(Math.ceil(from / items),1);
|
38
|
+
var href = link.getAttribute('href').replace(marker+'-page-', page).replace(marker+'-items-', items);
|
39
|
+
link.setAttribute('href', href);
|
40
|
+
link.click();
|
41
|
+
}
|
42
|
+
};
|
43
|
+
|
44
|
+
// select the content on click: easier for typing a number
|
45
|
+
input.addEventListener('click', function(){ this.select() });
|
46
|
+
// go when the input looses focus
|
47
|
+
input.addEventListener('focusout', go);
|
48
|
+
// … and when pressing enter inside the input
|
49
|
+
input.addEventListener('keyup', function(e){ if (e.which === 13) go() }.bind(this));
|
50
|
+
|
51
|
+
};
|
52
|
+
|
53
|
+
Pagy.responsive = function(id, items, widths, series){
|
54
|
+
var pagyNav = document.getElementById('pagy-nav-'+id),
|
55
|
+
pagyBox = pagyNav.firstChild || pagyNav,
|
56
|
+
pagyParent = pagyNav.parentElement,
|
57
|
+
lastWidth = undefined;
|
58
|
+
|
59
|
+
var render = function(){
|
60
|
+
var parentWidth = parseInt(pagyParent.clientWidth),
|
61
|
+
width = widths.find(function(w){return parentWidth > w});
|
62
|
+
if (width !== lastWidth) {
|
63
|
+
while (pagyBox.firstChild) { pagyBox.removeChild(pagyBox.firstChild) }
|
64
|
+
var tags = items['prev'];
|
65
|
+
series[width].forEach(function(item){tags += items[item]});
|
66
|
+
tags += items['next'];
|
67
|
+
pagyBox.insertAdjacentHTML('beforeend', tags);
|
68
|
+
lastWidth = width;
|
69
|
+
}
|
70
|
+
};
|
71
|
+
|
72
|
+
if (window.attachEvent) { window.attachEvent('onresize', render) }
|
73
|
+
else if (window.addEventListener) { window.addEventListener('resize', render, true) }
|
74
|
+
|
75
|
+
render();
|
76
|
+
};
|
77
|
+
|
78
|
+
|
79
|
+
Pagy.init = function(){
|
80
|
+
['compact', 'items', 'responsive'].forEach(function(name){
|
81
|
+
Array.from(document.getElementsByClassName("pagy-"+name)).forEach(function(json) {
|
82
|
+
Pagy[name].apply(null, JSON.parse(json.innerHTML))
|
83
|
+
})
|
84
|
+
})
|
85
|
+
};
|
@@ -34,38 +34,38 @@ class Pagy
|
|
34
34
|
# Generic responsive pagination: it returns the html with the series of links to the pages
|
35
35
|
# we build the tags as a json object string and render them with the PagyResponsive javascript
|
36
36
|
def pagy_nav_responsive(pagy, id=caller(1,1)[0].hash)
|
37
|
-
tags, link, p_prev, p_next, responsive =
|
37
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
38
38
|
|
39
|
-
tags
|
40
|
-
|
39
|
+
tags[:prev] = (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
40
|
+
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
41
41
|
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
42
|
-
tags
|
43
|
-
|
44
|
-
|
45
|
-
|
42
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<span class="page">#{link.call item}</span> ) # page link
|
43
|
+
elsif item.is_a?(String) ; %(<span class="page active">#{item}</span> ) # current page
|
44
|
+
elsif item == :gap ; %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ) # page gap
|
45
|
+
end
|
46
46
|
end
|
47
|
-
tags
|
48
|
-
|
49
|
-
script = %(<script>
|
47
|
+
tags[:next] = (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
48
|
+
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
49
|
+
script = %(<script type="application/json" class="pagy-responsive">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
50
50
|
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive pagination" role="navigation" aria-label="pager"></nav>#{script})
|
51
51
|
end
|
52
52
|
|
53
53
|
# Responsive pagination for bootstrap: it returns the html with the series of links to the pages
|
54
54
|
# we build the tags as a json object string and render them with the PagyResponsive javascript
|
55
55
|
def pagy_nav_bootstrap_responsive(pagy, id=caller(1,1)[0].hash)
|
56
|
-
tags, link, p_prev, p_next, responsive =
|
56
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next, pagy.responsive
|
57
57
|
|
58
|
-
tags
|
59
|
-
|
58
|
+
tags['prev'] = (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
59
|
+
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
|
60
60
|
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
61
|
-
tags
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>) # page link
|
62
|
+
elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
|
63
|
+
elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
64
|
+
end
|
65
65
|
end
|
66
|
-
tags
|
67
|
-
|
68
|
-
script = %(<script>
|
66
|
+
tags['next'] = (p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
67
|
+
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
68
|
+
script = %(<script type="application/json" class="pagy-responsive">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
69
69
|
%(<nav id="pagy-nav-#{id}" class="pagy-nav-bootstrap-responsive pagination" role="navigation" aria-label="pager"><ul class="pagination"></ul></nav>#{script})
|
70
70
|
end
|
71
71
|
|
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.
|
4
|
+
version: 0.10.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-06-
|
11
|
+
date: 2018-06-21 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,
|
@@ -30,9 +30,7 @@ files:
|
|
30
30
|
- lib/pagy/extras/i18n.rb
|
31
31
|
- lib/pagy/extras/initializer_example.rb
|
32
32
|
- lib/pagy/extras/items.rb
|
33
|
-
- lib/pagy/extras/javascripts/pagy
|
34
|
-
- lib/pagy/extras/javascripts/pagy-items.js
|
35
|
-
- lib/pagy/extras/javascripts/pagy-responsive.js
|
33
|
+
- lib/pagy/extras/javascripts/pagy.js
|
36
34
|
- lib/pagy/extras/responsive.rb
|
37
35
|
- lib/pagy/extras/templates/nav.html.erb
|
38
36
|
- lib/pagy/extras/templates/nav.html.haml
|
@@ -1,23 +0,0 @@
|
|
1
|
-
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras/compact
|
2
|
-
|
3
|
-
function PagyCompact(id, marker, page){
|
4
|
-
var pagyNav = document.getElementById('pagy-nav-'+id),
|
5
|
-
input = pagyNav.getElementsByTagName('input')[0],
|
6
|
-
link = pagyNav.getElementsByTagName('a')[0];
|
7
|
-
|
8
|
-
this.go = function(){
|
9
|
-
if (page !== input.value) {
|
10
|
-
var href = link.getAttribute('href').replace(marker, input.value);
|
11
|
-
link.setAttribute('href', href);
|
12
|
-
link.click();
|
13
|
-
}
|
14
|
-
};
|
15
|
-
|
16
|
-
// select the content on click: easier for typing a number
|
17
|
-
input.addEventListener('click', function(){ this.select() });
|
18
|
-
// jump to page number from input when the input looses focus
|
19
|
-
input.addEventListener('focusout', this.go);
|
20
|
-
// … and when pressing enter inside the input
|
21
|
-
input.addEventListener('keyup', function(e){ if (e.which === 13) this.go() }.bind(this));
|
22
|
-
|
23
|
-
}
|
@@ -1,26 +0,0 @@
|
|
1
|
-
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras/items
|
2
|
-
|
3
|
-
function PagyItems(id, marker, from){
|
4
|
-
var pagyNav = document.getElementById('pagy-items-'+id),
|
5
|
-
input = pagyNav.getElementsByTagName('input')[0],
|
6
|
-
current = input.value,
|
7
|
-
link = pagyNav.getElementsByTagName('a')[0];
|
8
|
-
|
9
|
-
this.go = function(){
|
10
|
-
var items = input.value;
|
11
|
-
if (current !== items) {
|
12
|
-
var page = Math.max(Math.ceil(from / items),1);
|
13
|
-
var href = link.getAttribute('href').replace(marker+'-page-', page).replace(marker+'-items-', items);
|
14
|
-
link.setAttribute('href', href);
|
15
|
-
link.click();
|
16
|
-
}
|
17
|
-
};
|
18
|
-
|
19
|
-
// select the content on click: easier for typing a number
|
20
|
-
input.addEventListener('click', function(){ this.select() });
|
21
|
-
// jump to page number from input when the input looses focus
|
22
|
-
input.addEventListener('focusout', this.go);
|
23
|
-
// … and when pressing enter inside the input
|
24
|
-
input.addEventListener('keyup', function(e){ if (e.which === 13) this.go() }.bind(this));
|
25
|
-
|
26
|
-
}
|
@@ -1,26 +0,0 @@
|
|
1
|
-
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras/resposive
|
2
|
-
|
3
|
-
function PagyResponsive(id, items, widths, series){
|
4
|
-
var pagyNav = document.getElementById('pagy-nav-'+id),
|
5
|
-
pagyBox = pagyNav.firstChild || pagyNav,
|
6
|
-
pagyParent = pagyNav.parentElement,
|
7
|
-
lastWidth = undefined;
|
8
|
-
|
9
|
-
this.render = function(){
|
10
|
-
var parentWidth = parseInt(pagyParent.clientWidth),
|
11
|
-
width = widths.find(function(w){return parentWidth > w});
|
12
|
-
if (width !== lastWidth) {
|
13
|
-
while (pagyBox.firstChild) { pagyBox.removeChild(pagyBox.firstChild) }
|
14
|
-
var tags = items['prev'];
|
15
|
-
series[width].forEach(function(item){tags += items[item]});
|
16
|
-
tags += items['next'];
|
17
|
-
pagyBox.insertAdjacentHTML('beforeend', tags);
|
18
|
-
lastWidth = width;
|
19
|
-
}
|
20
|
-
};
|
21
|
-
|
22
|
-
if (window.attachEvent) { window.attachEvent('onresize', this.render) }
|
23
|
-
else if (window.addEventListener) { window.addEventListener('resize', this.render, true) }
|
24
|
-
|
25
|
-
this.render();
|
26
|
-
};
|