pagy 0.17.0 → 0.18.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/extras/initializer_example.rb → config/pagy.rb} +18 -20
- data/lib/{pagy/extras/javascripts → javascripts}/pagy.js +0 -0
- data/lib/pagy.rb +1 -1
- data/lib/pagy/extras/bootstrap.rb +41 -1
- data/lib/pagy/extras/bulma.rb +41 -1
- data/lib/pagy/extras/foundation.rb +41 -1
- data/lib/pagy/extras/materialize.rb +43 -1
- data/lib/pagy/extras/navs.rb +46 -0
- data/lib/pagy/extras/shared.rb +30 -0
- data/lib/{pagy/extras/templates → templates}/nav.html.erb +0 -0
- data/lib/{pagy/extras/templates → templates}/nav.html.haml +0 -0
- data/lib/{pagy/extras/templates → templates}/nav.html.slim +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bootstrap.html.erb +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bootstrap.html.haml +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bootstrap.html.slim +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bulma.html.erb +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bulma.html.haml +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_bulma.html.slim +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_foundation.html.erb +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_foundation.html.haml +0 -0
- data/lib/{pagy/extras/templates → templates}/nav_foundation.html.slim +0 -0
- metadata +18 -18
- data/lib/pagy/extras/compact.rb +0 -100
- data/lib/pagy/extras/responsive.rb +0 -138
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c1bb5b64fb34727fe1c413e7955d77efe07ab9092635a02a28c3fd9755e0c9d
|
4
|
+
data.tar.gz: 2a30697bb6be24894258df5a67871f5d07adac6b0868a58c205197484909288e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: befb8dc5ef5ec753f4b644c887de0196e6b5ccb026fe86258c73eb6924af6e535bd0837580b8c30e945f638c65cde5b1fafe31b0729cfd92fb0bd6d48f800d00
|
7
|
+
data.tar.gz: dffdcc261a1a2176617774614c453ee12c0dc94761293f202b4d3db43ea281b6dac0c9524eb51806ed52bcf430ebd043717c7dc9bcc809f3721003b3a6b101a8
|
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Pagy initializer file
|
2
2
|
# Customize only what you really need but notice that Pagy works also without any of the following lines.
|
3
3
|
|
4
4
|
|
@@ -6,19 +6,6 @@
|
|
6
6
|
# See https://ddnexus.github.io/pagy/extras
|
7
7
|
|
8
8
|
|
9
|
-
# Component Extras
|
10
|
-
|
11
|
-
# Compact: An alternative UI that combines the pagination with the nav info in one compact element
|
12
|
-
# See https://ddnexus.github.io/pagy/extras/compact
|
13
|
-
# require 'pagy/extras/compact'
|
14
|
-
|
15
|
-
# Responsive: On resize, the number of page links will adapt in real-time to the available window/container width
|
16
|
-
# See https://ddnexus.github.io/pagy/extras/responsive
|
17
|
-
# require 'pagy/extras/responsive'
|
18
|
-
# See https://ddnexus.github.io/pagy/extras/responsive#breakpoints
|
19
|
-
# Pagy::VARS[:breakpoints] = { 0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3] } # example of width/size pairs
|
20
|
-
|
21
|
-
|
22
9
|
# Backend Extras
|
23
10
|
|
24
11
|
# Array: Paginate arrays efficiently, avoiding expensive array-wrapping and without overriding
|
@@ -32,22 +19,33 @@
|
|
32
19
|
|
33
20
|
# Frontend Extras
|
34
21
|
|
35
|
-
#
|
22
|
+
# Navs: Add responsive and compact generic/unstyled nav helpers
|
23
|
+
# Notice: the other frontend extras add their own framework-styled versions,
|
24
|
+
# so require this extra only if you need the plain unstyled version
|
25
|
+
# See https://ddnexus.github.io/pagy/extras/navs
|
26
|
+
# require 'pagy/extras/navs'
|
27
|
+
|
28
|
+
# Bootstrap: Nav, responsive and compact helpers and templates for Bootstrap pagination
|
36
29
|
# See https://ddnexus.github.io/pagy/extras/bootstrap
|
37
30
|
# require 'pagy/extras/bootstrap'
|
38
31
|
|
39
|
-
# Bulma: Nav
|
32
|
+
# Bulma: Nav, responsive and compact helpers and templates for Bulma pagination
|
40
33
|
# See https://ddnexus.github.io/pagy/extras/bulma
|
41
34
|
# require 'pagy/extras/bulma'
|
42
35
|
|
43
|
-
# Foundation: Nav
|
36
|
+
# Foundation: Nav, responsive and compact helpers and templates for Foundation pagination
|
44
37
|
# See https://ddnexus.github.io/pagy/extras/foundation
|
45
38
|
# require 'pagy/extras/foundation'
|
46
39
|
|
47
|
-
# Materialize: Nav
|
40
|
+
# Materialize: Nav, responsive and compact helpers for Materialize pagination
|
48
41
|
# See https://ddnexus.github.io/pagy/extras/materialize
|
49
42
|
# require 'pagy/extras/materialize'
|
50
43
|
|
44
|
+
# Breakoints var used byt the responsive helpers
|
45
|
+
# See https://ddnexus.github.io/pagy/extras/navs#breakpoints
|
46
|
+
# Pagy::VARS[:breakpoints] = { 0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3] } # example of width/size pairs
|
47
|
+
|
48
|
+
|
51
49
|
|
52
50
|
# Feature Extras
|
53
51
|
|
@@ -91,8 +89,8 @@
|
|
91
89
|
# Rails
|
92
90
|
|
93
91
|
# Rails: extras assets path required by compact, items and responsive extras
|
94
|
-
# See https://ddnexus.github.io/pagy/extras
|
95
|
-
# Rails.application.config.assets.paths << Pagy.root.join('
|
92
|
+
# See https://ddnexus.github.io/pagy/extras#javascript
|
93
|
+
# Rails.application.config.assets.paths << Pagy.root.join('javascripts')
|
96
94
|
|
97
95
|
|
98
96
|
# I18n
|
File without changes
|
data/lib/pagy.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bootstrap
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'pagy/extras/shared'
|
5
|
+
|
4
6
|
class Pagy
|
5
|
-
# Add nav helper for bootstrap pagination
|
6
7
|
module Frontend
|
7
8
|
|
8
9
|
# Pagination for bootstrap: it returns the html with the series of links to the pages
|
@@ -22,5 +23,44 @@ class Pagy
|
|
22
23
|
%(<nav class="pagy-nav-bootstrap pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></nav>)
|
23
24
|
end
|
24
25
|
|
26
|
+
# Compact pagination for bootstrap: it returns the html with the series of links to the pages
|
27
|
+
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
28
|
+
def pagy_nav_compact_bootstrap(pagy, id=caller(1,1)[0].hash)
|
29
|
+
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
30
|
+
|
31
|
+
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bootstrap pagination" role="navigation" aria-label="pager">)
|
32
|
+
html << link.call(MARKER, '', %(style="display: none;" ))
|
33
|
+
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
34
|
+
html << %(<div class="btn-group" role="group">)
|
35
|
+
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
|
36
|
+
: %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
37
|
+
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;">)
|
38
|
+
html << %(<div class="pagy-compact-input btn btn-primary disabled">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</div>)
|
39
|
+
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
|
40
|
+
: %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
41
|
+
html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Responsive pagination for bootstrap: it returns the html with the series of links to the pages
|
45
|
+
# rendered by the Pagy.responsive javascript
|
46
|
+
def pagy_nav_responsive_bootstrap(pagy, id=caller(1,1)[0].hash)
|
47
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next, pagy.responsive
|
48
|
+
|
49
|
+
tags['before'] = +'<ul class="pagination">'
|
50
|
+
tags['before'] << (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
51
|
+
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
|
52
|
+
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
53
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>) # page link
|
54
|
+
elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
|
55
|
+
elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
56
|
+
end
|
57
|
+
end
|
58
|
+
tags['after'] = +(p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
59
|
+
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
60
|
+
tags['after'] << '</ul>'
|
61
|
+
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
62
|
+
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive-bootstrap pagination" role="navigation" aria-label="pager"></nav>#{script})
|
63
|
+
end
|
64
|
+
|
25
65
|
end
|
26
66
|
end
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bulma
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'pagy/extras/shared'
|
5
|
+
|
4
6
|
class Pagy
|
5
|
-
# Add nav helper for Bulma pagination
|
6
7
|
module Frontend
|
7
8
|
|
8
9
|
def pagy_nav_bulma(pagy)
|
@@ -23,5 +24,44 @@ class Pagy
|
|
23
24
|
%(<nav class="pagy-nav-bulma pagination is-centered" role="navigation" aria-label="pagination">#{html}</nav>)
|
24
25
|
end
|
25
26
|
|
27
|
+
# Compact pagination for Bulma: it returns the html with the series of links to the pages
|
28
|
+
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
29
|
+
def pagy_nav_compact_bulma(pagy, id=caller(1,1)[0].hash)
|
30
|
+
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
31
|
+
|
32
|
+
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bulma" role="navigation" aria-label="pagination">)
|
33
|
+
html << link.call(MARKER, '', 'style="display: none;"')
|
34
|
+
(html << link.call(1, '', %(style="display: none;"))) if defined?(TRIM)
|
35
|
+
html << %(<div class="field is-grouped is-grouped-centered" role="group">)
|
36
|
+
html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
|
37
|
+
: %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
|
38
|
+
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;">)
|
39
|
+
html << %(<div class="pagy-compact-input control level is-mobile">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{p_pages}</div>)
|
40
|
+
html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
|
41
|
+
: %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
|
42
|
+
html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Responsive pagination for Bulma: it returns the html with the series of links to the pages
|
46
|
+
# rendered by the Pagy.responsive javascript
|
47
|
+
def pagy_nav_responsive_bulma(pagy, id=caller(1,1)[0].hash)
|
48
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
49
|
+
|
50
|
+
tags['before'] = +(p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
51
|
+
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>))
|
52
|
+
tags['before'] << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
53
|
+
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
54
|
+
tags['before'] << '<ul class="pagination-list">'
|
55
|
+
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
56
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}")}</li>)
|
57
|
+
elsif item.is_a?(String) ; %(<li>#{link.call item, item, %(class="pagination-link is-current" aria-current="page" aria-label="page #{item}")}</li>)
|
58
|
+
elsif item == :gap ; %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
tags['after'] = '</ul>'
|
62
|
+
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
63
|
+
%(<nav id="pagy-nav-#{id}" class="pagy-nav-bulma pagination is-centered" role="navigation" aria-label="pagination"></nav>#{script})
|
64
|
+
end
|
65
|
+
|
26
66
|
end
|
27
67
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/foundation
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'pagy/extras/shared'
|
5
|
+
|
4
6
|
class Pagy
|
5
|
-
# Add nav helper for foundation pagination
|
6
7
|
module Frontend
|
7
8
|
|
8
9
|
# Pagination for foundation: it returns the html with the series of links to the pages
|
@@ -22,5 +23,44 @@ class Pagy
|
|
22
23
|
%(<nav class="pagy-nav-foundation" role="navigation" aria-label="Pagination"><ul class="pagination">#{html}</ul></nav>)
|
23
24
|
end
|
24
25
|
|
26
|
+
# Compact pagination for foundation: it returns the html with the series of links to the pages
|
27
|
+
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
28
|
+
def pagy_nav_compact_foundation(pagy, id=caller(1,1)[0].hash)
|
29
|
+
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
30
|
+
|
31
|
+
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-foundation" role="navigation" aria-label="Pagination">)
|
32
|
+
html << link.call(MARKER, '', %(style="display: none;" ))
|
33
|
+
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
34
|
+
html << %(<div class="input-group">)
|
35
|
+
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
|
36
|
+
: %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
37
|
+
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.5}rem;">)
|
38
|
+
html << %(<span class="input-group-label">#{pagy_t('pagy.compact.page')}</span> #{input} <span class="input-group-label">#{pagy_t('pagy.compact.of')} #{p_pages}</span>)
|
39
|
+
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
|
40
|
+
: %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
41
|
+
html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Responsive pagination for Foundation: it returns the html with the series of links to the pages
|
45
|
+
# rendered by the Pagy.responsive javascript
|
46
|
+
def pagy_nav_responsive_foundation(pagy, id=caller(1,1)[0].hash)
|
47
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
48
|
+
|
49
|
+
tags['before'] = +'<ul class="pagination">'
|
50
|
+
tags['before'] << (p_prev ? %(<li class="prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
51
|
+
: %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>))
|
52
|
+
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
53
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<li>#{link.call item}</li>) # page link
|
54
|
+
elsif item.is_a?(String) ; %(<li class="current"><span class="show-for-sr">#{pagy_t('pagy.nav.current')}</span> #{item}</li>) # active page
|
55
|
+
elsif item == :gap ; %(<li class="gap disabled">#{pagy_t('pagy.nav.gap')}</li>) # page gap
|
56
|
+
end
|
57
|
+
end
|
58
|
+
tags['after'] = +(p_next ? %(<li class="next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
59
|
+
: %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>))
|
60
|
+
tags['after'] << '</ul>'
|
61
|
+
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
62
|
+
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive-foundation" aria-label="Pagination"></nav>#{script})
|
63
|
+
end
|
64
|
+
|
25
65
|
end
|
26
66
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/materialize
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'pagy/extras/shared'
|
5
|
+
|
4
6
|
class Pagy
|
5
|
-
# Add nav helper for materialize pagination
|
6
7
|
module Frontend
|
7
8
|
|
8
9
|
# Pagination for materialize: it returns the html with the series of links to the pages
|
@@ -21,5 +22,46 @@ class Pagy
|
|
21
22
|
%(<div class="pagy-nav-materialize pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></div>)
|
22
23
|
end
|
23
24
|
|
25
|
+
# Compact pagination for materialize: it returns the html with the series of links to the pages
|
26
|
+
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
27
|
+
def pagy_nav_compact_materialize(pagy, id=caller(1,1)[0].hash)
|
28
|
+
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
29
|
+
|
30
|
+
html << %(<div id="pagy-nav-#{id}" class="pagy-nav-compact-materialize pagination" role="navigation" aria-label="pager">)
|
31
|
+
html << link.call(MARKER, '', %(style="display: none;" ))
|
32
|
+
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
33
|
+
html << %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
|
34
|
+
html << '<ul class="pagination" style="margin: 0px;">'
|
35
|
+
li_style = 'style="vertical-align: middle;"'
|
36
|
+
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>)
|
37
|
+
: %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
38
|
+
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;">)
|
39
|
+
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>)
|
40
|
+
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>)
|
41
|
+
: %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
42
|
+
html << %(</ul></div><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Responsive pagination for Materialize: it returns the html with the series of links to the pages
|
46
|
+
# rendered by the Pagy.responsive javascript
|
47
|
+
def pagy_nav_responsive_materialize(pagy, id=caller(1,1)[0].hash)
|
48
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
49
|
+
|
50
|
+
tags['before'] = +'<ul class="pagination">'
|
51
|
+
tags['before'] << (p_prev ? %(<li class="waves-effect prev">#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
|
52
|
+
: %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
53
|
+
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
54
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<li class="waves-effect">#{link.call item}</li>) # page link
|
55
|
+
elsif item.is_a?(String) ; %(<li class="active">#{link.call item}</li>) # active page
|
56
|
+
elsif item == :gap ; %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
57
|
+
end
|
58
|
+
end
|
59
|
+
tags['after'] = +(p_next ? %(<li class="waves-effect next">#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
|
60
|
+
: %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
61
|
+
tags['after'] << '</ul>'
|
62
|
+
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
63
|
+
%(<div id="pagy-nav-#{id}" class="pagy-nav-responsive-materialize pagination" role="navigation" aria-label="pager"></div>#{script})
|
64
|
+
end
|
65
|
+
|
24
66
|
end
|
25
67
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/navs
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pagy/extras/shared'
|
5
|
+
|
6
|
+
class Pagy
|
7
|
+
module Frontend
|
8
|
+
|
9
|
+
# Generic compact pagination: it returns the html with the series of links to the pages
|
10
|
+
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
11
|
+
def pagy_nav_compact(pagy, id=caller(1,1)[0].hash)
|
12
|
+
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
13
|
+
|
14
|
+
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact pagination" role="navigation" aria-label="pager">)
|
15
|
+
html << link.call(MARKER, '', %(style="display: none;" ))
|
16
|
+
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
17
|
+
html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
18
|
+
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
19
|
+
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
|
+
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> )
|
21
|
+
html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
22
|
+
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
23
|
+
html << %(</nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Generic responsive pagination: it returns the html with the series of links to the pages
|
27
|
+
# rendered by the Pagy.responsive javascript
|
28
|
+
def pagy_nav_responsive(pagy, id=caller(1,1)[0].hash)
|
29
|
+
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
30
|
+
|
31
|
+
tags['before'] = (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
32
|
+
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
33
|
+
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
34
|
+
tags[item.to_s] = if item.is_a?(Integer); %(<span class="page">#{link.call item}</span> ) # page link
|
35
|
+
elsif item.is_a?(String) ; %(<span class="page active">#{item}</span> ) # current page
|
36
|
+
elsif item == :gap ; %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ) # page gap
|
37
|
+
end
|
38
|
+
end
|
39
|
+
tags['after'] = (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
40
|
+
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
41
|
+
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
42
|
+
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive pagination" role="navigation" aria-label="pager"></nav>#{script})
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class Pagy
|
6
|
+
|
7
|
+
# Default :breakpoints
|
8
|
+
VARS[:breakpoints] = { 0 => [1,4,4,1] }
|
9
|
+
|
10
|
+
# Helper for building the page_nav with javascript. For example:
|
11
|
+
# with an object like:
|
12
|
+
# Pagy.new count:1000, page: 20, breakpoints: {0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3]}
|
13
|
+
# it returns something like:
|
14
|
+
# { :items => [1, :gap, 18, 19, "20", 21, 22, 50, 2, 17, 23, 49, 3, 16, 24, 48],
|
15
|
+
# :series => { 0 =>[1, :gap, 18, 19, "20", 21, 22, :gap, 50],
|
16
|
+
# 350 =>[1, 2, :gap, 17, 18, 19, "20", 21, 22, 23, :gap, 49, 50],
|
17
|
+
# 550 =>[1, 2, 3, :gap, 16, 17, 18, 19, "20", 21, 22, 23, 24, :gap, 48, 49, 50] },
|
18
|
+
# :widths => [550, 350, 0] }
|
19
|
+
# where :items is the unordered array union of all the page numbers for all sizes (passed to the PagyResponsive javascript function)
|
20
|
+
# :series is the hash of the series keyed by width (used by the *_responsive helpers to create the JSON string)
|
21
|
+
# :widths is the desc-ordered array of widths (passed to the PagyResponsive javascript function)
|
22
|
+
def responsive
|
23
|
+
@responsive ||= {items: [], series: {}, widths:[]}.tap do |r|
|
24
|
+
@vars[:breakpoints].key?(0) || raise(ArgumentError, "expected :breakpoints to contain the 0 size; got #{@vars[:breakpoints].inspect}")
|
25
|
+
@vars[:breakpoints].each {|width, size| r[:items] |= r[:series][width] = series(size)}
|
26
|
+
r[:widths] = r[:series].keys.sort!{|a,b| b <=> a}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
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.18.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-08-
|
11
|
+
date: 2018-08-20 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,
|
@@ -21,6 +21,8 @@ extensions: []
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- LICENSE.txt
|
24
|
+
- lib/config/pagy.rb
|
25
|
+
- lib/javascripts/pagy.js
|
24
26
|
- lib/locales/pagy.yml
|
25
27
|
- lib/locales/plurals.rb
|
26
28
|
- lib/pagy.rb
|
@@ -28,30 +30,28 @@ files:
|
|
28
30
|
- lib/pagy/extras/array.rb
|
29
31
|
- lib/pagy/extras/bootstrap.rb
|
30
32
|
- lib/pagy/extras/bulma.rb
|
31
|
-
- lib/pagy/extras/compact.rb
|
32
33
|
- lib/pagy/extras/foundation.rb
|
33
34
|
- lib/pagy/extras/i18n.rb
|
34
|
-
- lib/pagy/extras/initializer_example.rb
|
35
35
|
- lib/pagy/extras/items.rb
|
36
|
-
- lib/pagy/extras/javascripts/pagy.js
|
37
36
|
- lib/pagy/extras/materialize.rb
|
37
|
+
- lib/pagy/extras/navs.rb
|
38
38
|
- lib/pagy/extras/out_of_range.rb
|
39
|
-
- lib/pagy/extras/responsive.rb
|
40
39
|
- lib/pagy/extras/searchkick.rb
|
41
|
-
- lib/pagy/extras/
|
42
|
-
- lib/pagy/extras/templates/nav.html.haml
|
43
|
-
- lib/pagy/extras/templates/nav.html.slim
|
44
|
-
- lib/pagy/extras/templates/nav_bootstrap.html.erb
|
45
|
-
- lib/pagy/extras/templates/nav_bootstrap.html.haml
|
46
|
-
- lib/pagy/extras/templates/nav_bootstrap.html.slim
|
47
|
-
- lib/pagy/extras/templates/nav_bulma.html.erb
|
48
|
-
- lib/pagy/extras/templates/nav_bulma.html.haml
|
49
|
-
- lib/pagy/extras/templates/nav_bulma.html.slim
|
50
|
-
- lib/pagy/extras/templates/nav_foundation.html.erb
|
51
|
-
- lib/pagy/extras/templates/nav_foundation.html.haml
|
52
|
-
- lib/pagy/extras/templates/nav_foundation.html.slim
|
40
|
+
- lib/pagy/extras/shared.rb
|
53
41
|
- lib/pagy/extras/trim.rb
|
54
42
|
- lib/pagy/frontend.rb
|
43
|
+
- lib/templates/nav.html.erb
|
44
|
+
- lib/templates/nav.html.haml
|
45
|
+
- lib/templates/nav.html.slim
|
46
|
+
- lib/templates/nav_bootstrap.html.erb
|
47
|
+
- lib/templates/nav_bootstrap.html.haml
|
48
|
+
- lib/templates/nav_bootstrap.html.slim
|
49
|
+
- lib/templates/nav_bulma.html.erb
|
50
|
+
- lib/templates/nav_bulma.html.haml
|
51
|
+
- lib/templates/nav_bulma.html.slim
|
52
|
+
- lib/templates/nav_foundation.html.erb
|
53
|
+
- lib/templates/nav_foundation.html.haml
|
54
|
+
- lib/templates/nav_foundation.html.slim
|
55
55
|
- pagy.gemspec
|
56
56
|
homepage: https://github.com/ddnexus/pagy
|
57
57
|
licenses:
|
data/lib/pagy/extras/compact.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/compact
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
class Pagy
|
5
|
-
# Add nav helpers for compact pagination
|
6
|
-
module Frontend
|
7
|
-
|
8
|
-
# Generic compact pagination: it returns the html with the series of links to the pages
|
9
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
10
|
-
def pagy_nav_compact(pagy, id=caller(1,1)[0].hash)
|
11
|
-
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
12
|
-
|
13
|
-
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact pagination" role="navigation" aria-label="pager">)
|
14
|
-
html << link.call(MARKER, '', %(style="display: none;" ))
|
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> )
|
17
|
-
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
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;">)
|
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> )
|
20
|
-
html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
21
|
-
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
22
|
-
html << %(</nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
23
|
-
end
|
24
|
-
|
25
|
-
# Compact pagination for bootstrap: it returns the html with the series of links to the pages
|
26
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
27
|
-
def pagy_nav_compact_bootstrap(pagy, id=caller(1,1)[0].hash)
|
28
|
-
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
29
|
-
|
30
|
-
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bootstrap pagination" role="navigation" aria-label="pager">)
|
31
|
-
html << link.call(MARKER, '', %(style="display: none;" ))
|
32
|
-
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
33
|
-
html << %(<div class="btn-group" role="group">)
|
34
|
-
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
|
35
|
-
: %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
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;">)
|
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>)
|
38
|
-
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
|
39
|
-
: %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
40
|
-
html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
41
|
-
end
|
42
|
-
|
43
|
-
# Compact pagination for Bulma: it returns the html with the series of links to the pages
|
44
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
45
|
-
def pagy_nav_compact_bulma(pagy, id=caller(1,1)[0].hash)
|
46
|
-
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
47
|
-
|
48
|
-
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-bulma" role="navigation" aria-label="pagination">)
|
49
|
-
html << 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;">)
|
55
|
-
html << %(<div class="pagy-compact-input control level is-mobile">#{pagy_t('pagy.compact.page')} #{input} #{pagy_t('pagy.compact.of')} #{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><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
59
|
-
end
|
60
|
-
|
61
|
-
# Compact pagination for foundation: it returns the html with the series of links to the pages
|
62
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
63
|
-
def pagy_nav_compact_foundation(pagy, id=caller(1,1)[0].hash)
|
64
|
-
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
65
|
-
|
66
|
-
html << %(<nav id="pagy-nav-#{id}" class="pagy-nav-compact-foundation" role="navigation" aria-label="Pagination">)
|
67
|
-
html << link.call(MARKER, '', %(style="display: none;" ))
|
68
|
-
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
69
|
-
html << %(<div class="input-group">)
|
70
|
-
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
|
71
|
-
: %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
72
|
-
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.5}rem;">)
|
73
|
-
html << %(<span class="input-group-label">#{pagy_t('pagy.compact.page')}</span> #{input} <span class="input-group-label">#{pagy_t('pagy.compact.of')} #{p_pages}</span>)
|
74
|
-
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
|
75
|
-
: %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
76
|
-
html << %(</div></nav><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
77
|
-
end
|
78
|
-
|
79
|
-
# Compact pagination for materialize: it returns the html with the series of links to the pages
|
80
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
81
|
-
def pagy_nav_compact_materialize(pagy, id=caller(1,1)[0].hash)
|
82
|
-
html, link, p_prev, p_next, p_page, p_pages = +'', pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
83
|
-
|
84
|
-
html << %(<div id="pagy-nav-#{id}" class="pagy-nav-compact-materialize pagination" role="navigation" aria-label="pager">)
|
85
|
-
html << link.call(MARKER, '', %(style="display: none;" ))
|
86
|
-
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
87
|
-
html << %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
|
88
|
-
html << '<ul class="pagination" style="margin: 0px;">'
|
89
|
-
li_style = 'style="vertical-align: middle;"'
|
90
|
-
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>)
|
91
|
-
: %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
92
|
-
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;">)
|
93
|
-
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>)
|
94
|
-
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>)
|
95
|
-
: %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
96
|
-
html << %(</ul></div><script type="application/json" class="pagy-compact-json">["#{id}", "#{MARKER}", "#{p_page}", #{!!defined?(TRIM)}]</script>)
|
97
|
-
end
|
98
|
-
|
99
|
-
end
|
100
|
-
end
|
@@ -1,138 +0,0 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/responsive
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
class Pagy
|
7
|
-
|
8
|
-
# Default :breakpoints
|
9
|
-
VARS[:breakpoints] = { 0 => [1,4,4,1] }
|
10
|
-
|
11
|
-
# Helper for building the page_nav with javascript. For example:
|
12
|
-
# with an object like:
|
13
|
-
# Pagy.new count:1000, page: 20, breakpoints: {0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3]}
|
14
|
-
# it returns something like:
|
15
|
-
# { :items => [1, :gap, 18, 19, "20", 21, 22, 50, 2, 17, 23, 49, 3, 16, 24, 48],
|
16
|
-
# :series => { 0 =>[1, :gap, 18, 19, "20", 21, 22, :gap, 50],
|
17
|
-
# 350 =>[1, 2, :gap, 17, 18, 19, "20", 21, 22, 23, :gap, 49, 50],
|
18
|
-
# 550 =>[1, 2, 3, :gap, 16, 17, 18, 19, "20", 21, 22, 23, 24, :gap, 48, 49, 50] },
|
19
|
-
# :widths => [550, 350, 0] }
|
20
|
-
# where :items is the unordered array union of all the page numbers for all sizes (passed to the PagyResponsive javascript function)
|
21
|
-
# :series is the hash of the series keyed by width (used by the *_responsive helpers to create the JSON string)
|
22
|
-
# :widths is the desc-ordered array of widths (passed to the PagyResponsive javascript function)
|
23
|
-
def responsive
|
24
|
-
@responsive ||= {items: [], series: {}, widths:[]}.tap do |r|
|
25
|
-
@vars[:breakpoints].key?(0) || raise(ArgumentError, "expected :breakpoints to contain the 0 size; got #{@vars[:breakpoints].inspect}")
|
26
|
-
@vars[:breakpoints].each {|width, size| r[:items] |= r[:series][width] = series(size)}
|
27
|
-
r[:widths] = r[:series].keys.sort!{|a,b| b <=> a}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Add nav helpers for responsive pagination
|
32
|
-
module Frontend
|
33
|
-
|
34
|
-
# Generic responsive pagination: it returns the html with the series of links to the pages
|
35
|
-
# rendered by the Pagy.responsive javascript
|
36
|
-
def pagy_nav_responsive(pagy, id=caller(1,1)[0].hash)
|
37
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
38
|
-
|
39
|
-
tags['before'] = (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
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
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
|
-
end
|
47
|
-
tags['after'] = (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-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
50
|
-
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive pagination" role="navigation" aria-label="pager"></nav>#{script})
|
51
|
-
end
|
52
|
-
|
53
|
-
# Responsive pagination for bootstrap: it returns the html with the series of links to the pages
|
54
|
-
# rendered by the Pagy.responsive javascript
|
55
|
-
def pagy_nav_responsive_bootstrap(pagy, id=caller(1,1)[0].hash)
|
56
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next, pagy.responsive
|
57
|
-
|
58
|
-
tags['before'] = +'<ul class="pagination">'
|
59
|
-
tags['before'] << (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
60
|
-
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
|
61
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
62
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>) # page link
|
63
|
-
elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
|
64
|
-
elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
65
|
-
end
|
66
|
-
end
|
67
|
-
tags['after'] = +(p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
68
|
-
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
69
|
-
tags['after'] << '</ul>'
|
70
|
-
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
71
|
-
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive-bootstrap pagination" role="navigation" aria-label="pager"></nav>#{script})
|
72
|
-
end
|
73
|
-
|
74
|
-
# Responsive pagination for Bulma: it returns the html with the series of links to the pages
|
75
|
-
# rendered by the Pagy.responsive javascript
|
76
|
-
def pagy_nav_responsive_bulma(pagy, id=caller(1,1)[0].hash)
|
77
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
78
|
-
|
79
|
-
tags['before'] = +(p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
80
|
-
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>))
|
81
|
-
tags['before'] << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
82
|
-
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
83
|
-
tags['before'] << '<ul class="pagination-list">'
|
84
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
85
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}")}</li>)
|
86
|
-
elsif item.is_a?(String) ; %(<li>#{link.call item, item, %(class="pagination-link is-current" aria-current="page" aria-label="page #{item}")}</li>)
|
87
|
-
elsif item == :gap ; %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
tags['after'] = '</ul>'
|
91
|
-
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
92
|
-
%(<nav id="pagy-nav-#{id}" class="pagy-nav-bulma pagination is-centered" role="navigation" aria-label="pagination"></nav>#{script})
|
93
|
-
end
|
94
|
-
|
95
|
-
# Responsive pagination for Foundation: it returns the html with the series of links to the pages
|
96
|
-
# rendered by the Pagy.responsive javascript
|
97
|
-
def pagy_nav_responsive_foundation(pagy, id=caller(1,1)[0].hash)
|
98
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
99
|
-
|
100
|
-
tags['before'] = +'<ul class="pagination">'
|
101
|
-
tags['before'] << (p_prev ? %(<li class="prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
102
|
-
: %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>))
|
103
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
104
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li>#{link.call item}</li>) # page link
|
105
|
-
elsif item.is_a?(String) ; %(<li class="current"><span class="show-for-sr">#{pagy_t('pagy.nav.current')}</span> #{item}</li>) # active page
|
106
|
-
elsif item == :gap ; %(<li class="gap disabled">#{pagy_t('pagy.nav.gap')}</li>) # page gap
|
107
|
-
end
|
108
|
-
end
|
109
|
-
tags['after'] = +(p_next ? %(<li class="next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
110
|
-
: %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>))
|
111
|
-
tags['after'] << '</ul>'
|
112
|
-
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
113
|
-
%(<nav id="pagy-nav-#{id}" class="pagy-nav-responsive-foundation" aria-label="Pagination"></nav>#{script})
|
114
|
-
end
|
115
|
-
|
116
|
-
# Responsive pagination for Materialize: it returns the html with the series of links to the pages
|
117
|
-
# rendered by the Pagy.responsive javascript
|
118
|
-
def pagy_nav_responsive_materialize(pagy, id=caller(1,1)[0].hash)
|
119
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
120
|
-
|
121
|
-
tags['before'] = +'<ul class="pagination">'
|
122
|
-
tags['before'] << (p_prev ? %(<li class="waves-effect prev">#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
|
123
|
-
: %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
124
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
125
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li class="waves-effect">#{link.call item}</li>) # page link
|
126
|
-
elsif item.is_a?(String) ; %(<li class="active">#{link.call item}</li>) # active page
|
127
|
-
elsif item == :gap ; %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
128
|
-
end
|
129
|
-
end
|
130
|
-
tags['after'] = +(p_next ? %(<li class="waves-effect next">#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
|
131
|
-
: %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
132
|
-
tags['after'] << '</ul>'
|
133
|
-
script = %(<script type="application/json" class="pagy-responsive-json">["#{id}", #{tags.to_json}, #{responsive[:widths].to_json}, #{responsive[:series].to_json}]</script>)
|
134
|
-
%(<div id="pagy-nav-#{id}" class="pagy-nav-responsive-materialize pagination" role="navigation" aria-label="pager"></div>#{script})
|
135
|
-
end
|
136
|
-
|
137
|
-
end
|
138
|
-
end
|