pagy 6.0.0 → 7.0.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/LICENSE.txt +1 -1
- data/lib/config/pagy.rb +56 -44
- data/lib/javascripts/pagy-dev.js +3 -3
- data/lib/javascripts/pagy-module.js +2 -2
- data/lib/javascripts/pagy.js +1 -1
- data/lib/locales/ar.yml +15 -11
- data/lib/locales/be.yml +25 -0
- data/lib/locales/bg.yml +10 -11
- data/lib/locales/bs.yml +12 -11
- data/lib/locales/ca.yml +12 -11
- data/lib/locales/cs.yml +13 -10
- data/lib/locales/da.yml +14 -13
- data/lib/locales/de.yml +10 -11
- data/lib/locales/en.yml +10 -11
- data/lib/locales/es.yml +10 -11
- data/lib/locales/fr.yml +10 -11
- data/lib/locales/hr.yml +12 -11
- data/lib/locales/id.yml +10 -11
- data/lib/locales/it.yml +10 -11
- data/lib/locales/ja.yml +10 -11
- data/lib/locales/km.yml +10 -10
- data/lib/locales/ko.yml +10 -11
- data/lib/locales/nb.yml +10 -11
- data/lib/locales/nl.yml +10 -11
- data/lib/locales/nn.yml +10 -11
- data/lib/locales/pl.yml +12 -11
- data/lib/locales/pt-BR.yml +10 -11
- data/lib/locales/pt.yml +10 -11
- data/lib/locales/ru.yml +14 -11
- data/lib/locales/sr.yml +12 -10
- data/lib/locales/sv-SE.yml +10 -12
- data/lib/locales/sv.yml +10 -12
- data/lib/locales/sw.yml +12 -11
- data/lib/locales/ta.yml +12 -11
- data/lib/locales/tr.yml +10 -11
- data/lib/locales/uk.yml +12 -11
- data/lib/locales/vi.yml +17 -0
- data/lib/locales/zh-CN.yml +10 -11
- data/lib/locales/zh-HK.yml +10 -11
- data/lib/locales/zh-TW.yml +10 -11
- data/lib/pagy/backend.rb +10 -4
- data/lib/pagy/calendar/day.rb +4 -3
- data/lib/pagy/calendar/helper.rb +15 -11
- data/lib/pagy/calendar/month.rb +4 -3
- data/lib/pagy/calendar/quarter.rb +4 -3
- data/lib/pagy/calendar/week.rb +1 -1
- data/lib/pagy/calendar/year.rb +3 -2
- data/lib/pagy/calendar.rb +33 -7
- data/lib/pagy/console.rb +1 -1
- data/lib/pagy/countless.rb +1 -1
- data/lib/pagy/exceptions.rb +1 -1
- data/lib/pagy/extras/arel.rb +1 -1
- data/lib/pagy/extras/array.rb +1 -1
- data/lib/pagy/extras/bootstrap.rb +45 -32
- data/lib/pagy/extras/bulma.rb +41 -32
- data/lib/pagy/extras/calendar.rb +17 -13
- data/lib/pagy/extras/countless.rb +1 -1
- data/lib/pagy/extras/elasticsearch_rails.rb +8 -8
- data/lib/pagy/extras/foundation.rb +48 -33
- data/lib/pagy/extras/frontend_helpers.rb +11 -11
- data/lib/pagy/extras/gearbox.rb +1 -1
- data/lib/pagy/extras/headers.rb +8 -8
- data/lib/pagy/extras/i18n.rb +5 -5
- data/lib/pagy/extras/items.rb +19 -12
- data/lib/pagy/extras/jsonapi.rb +79 -0
- data/lib/pagy/extras/materialize.rb +42 -30
- data/lib/pagy/extras/meilisearch.rb +12 -11
- data/lib/pagy/extras/metadata.rb +2 -2
- data/lib/pagy/extras/navs.rb +22 -34
- data/lib/pagy/extras/overflow.rb +9 -7
- data/lib/pagy/extras/searchkick.rb +8 -8
- data/lib/pagy/extras/semantic.rb +41 -28
- data/lib/pagy/extras/standalone.rb +10 -16
- data/lib/pagy/extras/support.rb +19 -33
- data/lib/pagy/extras/trim.rb +4 -4
- data/lib/pagy/extras/uikit.rb +44 -31
- data/lib/pagy/frontend.rb +57 -26
- data/lib/pagy/i18n.rb +3 -3
- data/lib/pagy/url_helpers.rb +15 -12
- data/lib/pagy.rb +57 -41
- metadata +7 -19
- data/lib/templates/bootstrap_nav.html.erb +0 -24
- data/lib/templates/bootstrap_nav.html.haml +0 -34
- data/lib/templates/bootstrap_nav.html.slim +0 -34
- data/lib/templates/bulma_nav.html.erb +0 -24
- data/lib/templates/bulma_nav.html.haml +0 -32
- data/lib/templates/bulma_nav.html.slim +0 -32
- data/lib/templates/foundation_nav.html.erb +0 -24
- data/lib/templates/foundation_nav.html.haml +0 -34
- data/lib/templates/foundation_nav.html.slim +0 -34
- data/lib/templates/nav.html.erb +0 -22
- data/lib/templates/nav.html.haml +0 -30
- data/lib/templates/nav.html.slim +0 -29
- data/lib/templates/uikit_nav.html.erb +0 -15
- data/lib/templates/uikit_nav.html.haml +0 -28
- data/lib/templates/uikit_nav.html.slim +0 -28
@@ -1,4 +1,4 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bootstrap
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bootstrap
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'pagy/extras/frontend_helpers'
|
@@ -8,84 +8,97 @@ class Pagy # :nodoc:
|
|
8
8
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
9
|
module BootstrapExtra
|
10
10
|
# Pagination for bootstrap: it returns the html with the series of links to the pages
|
11
|
-
def pagy_bootstrap_nav(pagy, pagy_id: nil, link_extra: '',
|
11
|
+
def pagy_bootstrap_nav(pagy, pagy_id: nil, link_extra: '',
|
12
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
12
13
|
p_id = %( id="#{pagy_id}") if pagy_id
|
13
14
|
link = pagy_link_proc(pagy, link_extra: %(class="page-link" #{link_extra}))
|
14
15
|
|
15
|
-
html = +%(<nav#{p_id} class="pagy-bootstrap-nav"
|
16
|
-
|
16
|
+
html = +%(<nav#{p_id} class="pagy-bootstrap-nav" #{
|
17
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}><ul class="pagination">)
|
18
|
+
html << bootstrap_prev_html(pagy, link)
|
17
19
|
pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
18
20
|
html << case item
|
19
21
|
when Integer
|
20
|
-
%(<li class="page-item">#{link.call
|
22
|
+
%(<li class="page-item">#{link.call(item)}</li>)
|
21
23
|
when String
|
22
|
-
%(<li class="page-item active">#{link.call
|
24
|
+
%(<li class="page-item active">#{link.call(item)}</li>)
|
23
25
|
when :gap
|
24
|
-
%(<li class="page-item gap disabled"><a href="#" class="page-link">#{
|
26
|
+
%(<li class="page-item gap disabled"><a href="#" class="page-link" aria-disabled="true">#{
|
27
|
+
pagy_t 'pagy.gap'}</a></li>)
|
25
28
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
26
29
|
end
|
27
30
|
end
|
28
|
-
html <<
|
31
|
+
html << bootstrap_next_html(pagy, link)
|
29
32
|
html << %(</ul></nav>)
|
30
33
|
end
|
31
34
|
|
32
35
|
# Javascript pagination for bootstrap: it returns a nav and a JSON tag used by the pagy.js file
|
33
|
-
def pagy_bootstrap_nav_js(pagy, pagy_id: nil, link_extra: '',
|
36
|
+
def pagy_bootstrap_nav_js(pagy, pagy_id: nil, link_extra: '',
|
37
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
34
38
|
sequels = pagy.sequels(**vars)
|
35
39
|
p_id = %( id="#{pagy_id}") if pagy_id
|
36
40
|
link = pagy_link_proc(pagy, link_extra: %(class="page-link" #{link_extra}))
|
37
|
-
tags = { 'before' => %(<ul class="pagination">#{
|
38
|
-
'link' => %(<li class="page-item">#{
|
39
|
-
'active' => %(<li class="page-item active">#{
|
40
|
-
'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{
|
41
|
-
|
41
|
+
tags = { 'before' => %(<ul class="pagination">#{bootstrap_prev_html pagy, link}),
|
42
|
+
'link' => %(<li class="page-item">#{html = link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER)}</li>),
|
43
|
+
'active' => %(<li class="page-item active">#{html}</li>),
|
44
|
+
'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link" aria-disabled="true">#{
|
45
|
+
pagy_t 'pagy.gap'}</a></li>),
|
46
|
+
'after' => %(#{bootstrap_next_html pagy, link}</ul>) }
|
42
47
|
|
43
48
|
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bootstrap-nav-js" #{
|
44
|
-
|
49
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)} #{
|
50
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))
|
51
|
+
}></nav>)
|
45
52
|
end
|
46
53
|
|
47
54
|
# Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the pagy.js file
|
48
|
-
def pagy_bootstrap_combo_nav_js(pagy, pagy_id: nil, link_extra: ''
|
55
|
+
def pagy_bootstrap_combo_nav_js(pagy, pagy_id: nil, link_extra: '',
|
56
|
+
nav_aria_label: nil, nav_i18n_key: nil)
|
49
57
|
p_id = %( id="#{pagy_id}") if pagy_id
|
50
|
-
link = pagy_link_proc(pagy, link_extra:
|
58
|
+
link = pagy_link_proc(pagy, link_extra:)
|
51
59
|
p_page = pagy.page
|
52
60
|
p_pages = pagy.pages
|
53
61
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{
|
54
|
-
p_page}"
|
55
|
-
p_pages.to_s.length + 1}rem;">)
|
62
|
+
p_page}" style="padding: 0; border: none; text-align: center; width: #{
|
63
|
+
p_pages.to_s.length + 1}rem;" aria-current="page">)
|
56
64
|
|
57
|
-
%(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination"
|
65
|
+
%(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination" #{
|
66
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}><div class="btn-group" role="group" #{
|
58
67
|
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
59
68
|
if (p_prev = pagy.prev)
|
60
|
-
link.call
|
69
|
+
link.call(p_prev, pagy_t('pagy.prev'), %(class="prev btn btn-primary" #{prev_aria_label_attr}))
|
61
70
|
else
|
62
|
-
%(<a class="prev btn btn-primary disabled" href="#"
|
71
|
+
%(<a class="prev btn btn-primary disabled" href="#" aria-disabled="true" #{
|
72
|
+
prev_aria_label_attr}>#{pagy_t('pagy.prev')}</a>)
|
63
73
|
end
|
64
|
-
}<div class="pagy-combo-input btn btn-
|
74
|
+
}<div class="pagy-combo-input btn btn-secondary" style="white-space: nowrap;">#{
|
65
75
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</div>#{
|
66
|
-
if (p_next
|
67
|
-
link.call
|
76
|
+
if (p_next = pagy.next)
|
77
|
+
link.call(p_next, pagy_t('pagy.next'), %(class="next btn btn-primary" #{next_aria_label_attr}))
|
68
78
|
else
|
69
|
-
%(<a class="next btn btn-primary disabled" href="#"
|
79
|
+
%(<a class="next btn btn-primary disabled" href="#" aria-disabled="true" #{
|
80
|
+
next_aria_label_attr}>#{pagy_t 'pagy.next'}</a>)
|
70
81
|
end
|
71
82
|
}</div></nav>)
|
72
83
|
end
|
73
84
|
|
74
85
|
private
|
75
86
|
|
76
|
-
def
|
87
|
+
def bootstrap_prev_html(pagy, link)
|
77
88
|
if (p_prev = pagy.prev)
|
78
|
-
%(<li class="page-item prev">#{link.call
|
89
|
+
%(<li class="page-item prev">#{link.call(p_prev, pagy_t('pagy.prev'), prev_aria_label_attr)}</li>)
|
79
90
|
else
|
80
|
-
%(<li class="page-item prev disabled"><a href="#" class="page-link"
|
91
|
+
%(<li class="page-item prev disabled"><a href="#" class="page-link" aria-disabled="true" #{
|
92
|
+
prev_aria_label_attr}>#{pagy_t('pagy.prev')}</a></li>)
|
81
93
|
end
|
82
94
|
end
|
83
95
|
|
84
|
-
def
|
96
|
+
def bootstrap_next_html(pagy, link)
|
85
97
|
if (p_next = pagy.next)
|
86
|
-
%(<li class="page-item next">#{link.call p_next, pagy_t('pagy.
|
98
|
+
%(<li class="page-item next">#{link.call p_next, pagy_t('pagy.next'), next_aria_label_attr}</li>)
|
87
99
|
else
|
88
|
-
%(<li class="page-item next disabled"><a href="#" class="page-link"
|
100
|
+
%(<li class="page-item next disabled"><a href="#" class="page-link" aria-disabled="true" #{
|
101
|
+
next_aria_label_attr}>#{pagy_t('pagy.next')}</a></li>)
|
89
102
|
end
|
90
103
|
end
|
91
104
|
end
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -1,29 +1,32 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bulma
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bulma
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'pagy/extras/frontend_helpers'
|
5
5
|
|
6
6
|
class Pagy # :nodoc:
|
7
|
+
DEFAULT[:bulma_nav_classes] = 'is-centered'
|
8
|
+
|
7
9
|
# Frontend modules are specially optimized for performance.
|
8
10
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
11
|
module BulmaExtra
|
10
12
|
# Pagination for bulma: it returns the html with the series of links to the pages
|
11
|
-
def pagy_bulma_nav(pagy, pagy_id: nil, link_extra: '',
|
13
|
+
def pagy_bulma_nav(pagy, pagy_id: nil, link_extra: '',
|
14
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
12
15
|
p_id = %( id="#{pagy_id}") if pagy_id
|
13
|
-
link = pagy_link_proc(pagy, link_extra:
|
16
|
+
link = pagy_link_proc(pagy, link_extra:)
|
14
17
|
|
15
|
-
html = +%(<nav#{p_id} class="pagy-bulma-nav pagination
|
16
|
-
|
18
|
+
html = +%(<nav#{p_id} class="pagy-bulma-nav pagination #{DEFAULT[:bulma_nav_classes]}" #{
|
19
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}>)
|
20
|
+
html << bulma_prev_next_html(pagy, link)
|
17
21
|
html << %(<ul class="pagination-list">)
|
18
22
|
pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
19
23
|
html << case item
|
20
24
|
when Integer
|
21
|
-
%(<li>#{link.call
|
25
|
+
%(<li>#{link.call(item, pagy.label_for(item), %(class="pagination-link"))}</li>)
|
22
26
|
when String
|
23
|
-
%(<li>#{link.call
|
24
|
-
%(class="pagination-link is-current" aria-label="page #{item}" aria-current="page")}</li>)
|
27
|
+
%(<li>#{link.call(item, pagy.label_for(item), %(class="pagination-link is-current"))}</li>)
|
25
28
|
when :gap
|
26
|
-
%(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.
|
29
|
+
%(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.gap'}</span></li>)
|
27
30
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
28
31
|
end
|
29
32
|
end
|
@@ -31,62 +34,68 @@ class Pagy # :nodoc:
|
|
31
34
|
end
|
32
35
|
|
33
36
|
# Javascript pagination for bulma: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
34
|
-
def pagy_bulma_nav_js(pagy, pagy_id: nil, link_extra: '',
|
37
|
+
def pagy_bulma_nav_js(pagy, pagy_id: nil, link_extra: '',
|
38
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
35
39
|
sequels = pagy.sequels(**vars)
|
36
40
|
p_id = %( id="#{pagy_id}") if pagy_id
|
37
|
-
link = pagy_link_proc(pagy, link_extra:
|
38
|
-
tags = { 'before' => %(#{
|
39
|
-
'link' => %(<li>#{link.call
|
40
|
-
|
41
|
-
'
|
42
|
-
%(class="pagination-link is-current" aria-current="page" aria-label="page #{
|
43
|
-
PAGE_PLACEHOLDER}")}</li>),
|
44
|
-
'gap' => %(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.nav.gap'}</span></li>),
|
41
|
+
link = pagy_link_proc(pagy, link_extra:)
|
42
|
+
tags = { 'before' => %(#{bulma_prev_next_html(pagy, link)}<ul class="pagination-list">),
|
43
|
+
'link' => %(<li>#{link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER, %(class="pagination-link"))}</li>),
|
44
|
+
'active' => %(<li>#{link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER, %(class="pagination-link is-current"))}</li>),
|
45
|
+
'gap' => %(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.gap'}</span></li>),
|
45
46
|
'after' => '</ul>' }
|
46
47
|
|
47
|
-
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bulma-nav-js pagination
|
48
|
+
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bulma-nav-js pagination #{DEFAULT[:bulma_nav_classes]}" #{
|
49
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}#{
|
48
50
|
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
49
51
|
end
|
50
52
|
|
51
53
|
# Javascript combo pagination for bulma: it returns a nav and a JSON tag used by the pagy.js file
|
52
|
-
def pagy_bulma_combo_nav_js(pagy, pagy_id: nil, link_extra: ''
|
54
|
+
def pagy_bulma_combo_nav_js(pagy, pagy_id: nil, link_extra: '',
|
55
|
+
nav_aria_label: nil, nav_i18n_key: nil)
|
53
56
|
p_id = %( id="#{pagy_id}") if pagy_id
|
54
|
-
link = pagy_link_proc(pagy, link_extra:
|
57
|
+
link = pagy_link_proc(pagy, link_extra:)
|
55
58
|
p_page = pagy.page
|
56
59
|
p_pages = pagy.pages
|
57
60
|
input = %(<input class="input" type="number" min="1" max="#{p_pages}" value="#{
|
58
|
-
p_page}" style="padding: 0; text-align: center; width: #{
|
61
|
+
p_page}" style="padding: 0; text-align: center; width: #{
|
62
|
+
p_pages.to_s.length + 1}rem; margin:0 0.3rem;" aria-current="page">)
|
59
63
|
|
60
|
-
html = %(<nav#{p_id} class="pagy-bulma-combo-nav-js"
|
64
|
+
html = %(<nav#{p_id} class="pagy-bulma-combo-nav-js #{DEFAULT[:bulma_nav_classes]}" #{
|
65
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}>)
|
61
66
|
%(#{html}<div class="field is-grouped is-grouped-centered" role="group" #{
|
62
67
|
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
63
68
|
if (p_prev = pagy.prev)
|
64
|
-
%(<p class="control">#{link.call
|
69
|
+
%(<p class="control">#{link.call(p_prev, pagy_t('pagy.prev'), %(class="button" #{prev_aria_label_attr}))}</p>)
|
65
70
|
else
|
66
|
-
%(<p class="control"><a class="button" disabled
|
71
|
+
%(<p class="control"><a class="button" disabled aria-disabled="true" #{
|
72
|
+
prev_aria_label_attr}>#{pagy_t 'pagy.prev'}</a></p>)
|
67
73
|
end
|
68
74
|
}<div class="pagy-combo-input control level is-mobile">#{
|
69
75
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</div>#{
|
70
76
|
if (p_next = pagy.next)
|
71
|
-
%(<p class="control">#{link.call
|
77
|
+
%(<p class="control">#{link.call(p_next, pagy_t('pagy.next'), %(class="button" #{next_aria_label_attr}))}</p>)
|
72
78
|
else
|
73
|
-
%(<p class="control"><a class="button" disabled
|
79
|
+
%(<p class="control"><a class="button" disabled aria-disabled="true"#{
|
80
|
+
next_aria_label_attr}>#{pagy_t 'pagy.next'}</a></p>)
|
74
81
|
end
|
75
82
|
}</div></nav>)
|
76
83
|
end
|
77
84
|
|
78
85
|
private
|
79
86
|
|
80
|
-
def
|
87
|
+
def bulma_prev_next_html(pagy, link)
|
81
88
|
html = +if (p_prev = pagy.prev)
|
82
|
-
link.call
|
89
|
+
link.call(p_prev, pagy_t('pagy.prev'), %(#{prev_aria_label_attr} class="pagination-previous"))
|
83
90
|
else
|
84
|
-
%(<a class="pagination-previous" disabled
|
91
|
+
%(<a class="pagination-previous" disabled aria-disabled="true" #{
|
92
|
+
prev_aria_label_attr}>#{pagy_t 'pagy.prev'}</a>)
|
85
93
|
end
|
86
94
|
html << if (p_next = pagy.next)
|
87
|
-
link.call
|
95
|
+
link.call(p_next, pagy_t('pagy.next'), %(#{next_aria_label_attr} class="pagination-next"))
|
88
96
|
else
|
89
|
-
%(<a class="pagination-next" disabled
|
97
|
+
%(<a class="pagination-next" disabled aria-disabled="true" #{
|
98
|
+
next_aria_label_attr}>#{pagy_t('pagy.next')}</a>)
|
90
99
|
end
|
91
100
|
end
|
92
101
|
end
|
data/lib/pagy/extras/calendar.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/calendar
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/calendar
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'pagy/calendar'
|
@@ -8,18 +8,17 @@ class Pagy # :nodoc:
|
|
8
8
|
# Add pagination filtering by calendar unit (:year, :quarter, :month, :week, :day) to the regular pagination
|
9
9
|
module CalendarExtra
|
10
10
|
# Additions for the Backend module
|
11
|
-
module
|
11
|
+
module BackendAddOn
|
12
12
|
CONF_KEYS = (Calendar::UNITS + %i[pagy active]).freeze
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
16
|
# Take a collection and a conf Hash with keys in CONF_KEYS and return an array with 3 items: [calendar, pagy, results]
|
17
17
|
def pagy_calendar(collection, conf)
|
18
|
-
|
19
|
-
|
20
|
-
end
|
18
|
+
raise ArgumentError, "keys must be in #{CONF_KEYS.inspect}" \
|
19
|
+
unless conf.is_a?(Hash) && (conf.keys - CONF_KEYS).empty?
|
21
20
|
|
22
|
-
conf[:pagy]
|
21
|
+
conf[:pagy] ||= {}
|
23
22
|
unless conf.key?(:active) && !conf[:active]
|
24
23
|
calendar, from, to = Calendar::Helper.send(:init, conf, pagy_calendar_period(collection), params)
|
25
24
|
collection = pagy_calendar_filter(collection, from, to)
|
@@ -28,22 +27,27 @@ class Pagy # :nodoc:
|
|
28
27
|
[calendar, pagy, results]
|
29
28
|
end
|
30
29
|
|
31
|
-
def pagy_calendar_url_at(calendar, time)
|
32
|
-
pagy_url_for(calendar.send(:last_object_at, time), 1)
|
33
|
-
end
|
34
|
-
|
35
30
|
# This method must be implemented by the application
|
36
31
|
def pagy_calendar_period(*)
|
37
32
|
raise NoMethodError, 'the pagy_calendar_period method must be implemented by the application ' \
|
38
|
-
'(see https://ddnexus.github.io/pagy/extras/calendar
|
33
|
+
'(see https://ddnexus.github.io/pagy/docs/extras/calendar/#pagy-calendar-period-collection)'
|
39
34
|
end
|
40
35
|
|
41
36
|
# This method must be implemented by the application
|
42
37
|
def pagy_calendar_filter(*)
|
43
38
|
raise NoMethodError, 'the pagy_calendar_filter method must be implemented by the application ' \
|
44
|
-
'(see https://ddnexus.github.io/pagy/extras/calendar
|
39
|
+
'(see https://ddnexus.github.io/pagy/docs/extras/calendar/#pagy-calendar-filter-collection-from-to)'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Additions for the Frontend module
|
44
|
+
module UrlHelperAddOn
|
45
|
+
# Return the url for the calendar page at time
|
46
|
+
def pagy_calendar_url_at(calendar, time, **opts)
|
47
|
+
pagy_url_for(calendar.send(:calendar_at, time, **opts), 1, **opts)
|
45
48
|
end
|
46
49
|
end
|
47
50
|
end
|
48
|
-
Backend.prepend CalendarExtra::
|
51
|
+
Backend.prepend CalendarExtra::BackendAddOn, CalendarExtra::UrlHelperAddOn
|
52
|
+
Frontend.prepend CalendarExtra::UrlHelperAddOn
|
49
53
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/elasticsearch_rails
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/elasticsearch_rails
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
class Pagy # :nodoc:
|
@@ -19,7 +19,7 @@ class Pagy # :nodoc:
|
|
19
19
|
total.is_a?(Hash) ? total['value'] : total
|
20
20
|
end
|
21
21
|
|
22
|
-
module
|
22
|
+
module ModelExtension # :nodoc:
|
23
23
|
# Return an array used to delay the call of #search
|
24
24
|
# after the pagination variables are merged to the options.
|
25
25
|
# It also pushes to the same array an optional method call.
|
@@ -30,9 +30,10 @@ class Pagy # :nodoc:
|
|
30
30
|
end
|
31
31
|
alias_method Pagy::DEFAULT[:elasticsearch_rails_pagy_search], :pagy_elasticsearch_rails
|
32
32
|
end
|
33
|
+
Pagy::ElasticsearchRails = ModelExtension
|
33
34
|
|
34
35
|
# Additions for the Pagy class
|
35
|
-
module
|
36
|
+
module PagyAddOn
|
36
37
|
# Create a Pagy object from an Elasticsearch::Model::Response::Response object
|
37
38
|
def new_from_elasticsearch_rails(response, vars = {})
|
38
39
|
vars[:items] = response.search.options[:size] || 10
|
@@ -41,9 +42,10 @@ class Pagy # :nodoc:
|
|
41
42
|
new(vars)
|
42
43
|
end
|
43
44
|
end
|
45
|
+
Pagy.extend PagyAddOn
|
44
46
|
|
45
47
|
# Add specialized backend methods to paginate ElasticsearchRails searches
|
46
|
-
module
|
48
|
+
module BackendAddOn
|
47
49
|
private
|
48
50
|
|
49
51
|
# Return Pagy object and items
|
@@ -69,12 +71,10 @@ class Pagy # :nodoc:
|
|
69
71
|
def pagy_elasticsearch_rails_get_vars(_collection, vars)
|
70
72
|
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
71
73
|
vars[:items] ||= DEFAULT[:items]
|
72
|
-
vars[:page] ||= (
|
74
|
+
vars[:page] ||= pagy_get_page(vars)
|
73
75
|
vars
|
74
76
|
end
|
75
77
|
end
|
78
|
+
Backend.prepend BackendAddOn
|
76
79
|
end
|
77
|
-
ElasticsearchRails = ElasticsearchRailsExtra::ElasticsearchRails
|
78
|
-
extend ElasticsearchRailsExtra::Pagy
|
79
|
-
Backend.prepend ElasticsearchRailsExtra::Backend
|
80
80
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/foundation
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/foundation
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'pagy/extras/frontend_helpers'
|
@@ -8,18 +8,24 @@ class Pagy # :nodoc:
|
|
8
8
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
9
|
module FoundationExtra
|
10
10
|
# Pagination for Foundation: it returns the html with the series of links to the pages
|
11
|
-
def pagy_foundation_nav(pagy, pagy_id: nil, link_extra: '',
|
11
|
+
def pagy_foundation_nav(pagy, pagy_id: nil, link_extra: '',
|
12
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
12
13
|
p_id = %( id="#{pagy_id}") if pagy_id
|
13
|
-
link = pagy_link_proc(pagy, link_extra:
|
14
|
+
link = pagy_link_proc(pagy, link_extra:)
|
14
15
|
|
15
|
-
html = +%(<nav#{p_id} class="pagy-foundation-nav"
|
16
|
-
|
16
|
+
html = +%(<nav#{p_id} class="pagy-foundation-nav" #{
|
17
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}><ul class="pagination">)
|
18
|
+
html << foundation_prev_html(pagy, link)
|
17
19
|
pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
18
20
|
html << case item
|
19
|
-
when Integer
|
20
|
-
|
21
|
-
when
|
22
|
-
|
21
|
+
when Integer
|
22
|
+
%(<li>#{link.call item}</li>)
|
23
|
+
when String
|
24
|
+
%(<li class="current" role="link" aria-current="page" aria-disabled="true">#{pagy.label_for(item)}</li>)
|
25
|
+
when :gap
|
26
|
+
%(<li class="ellipsis gap"></li>)
|
27
|
+
else
|
28
|
+
raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
23
29
|
end
|
24
30
|
end
|
25
31
|
html << pagy_foundation_next_html(pagy, link)
|
@@ -27,62 +33,71 @@ class Pagy # :nodoc:
|
|
27
33
|
end
|
28
34
|
|
29
35
|
# Javascript pagination for foundation: it returns a nav and a JSON tag used by the pagy.js file
|
30
|
-
def pagy_foundation_nav_js(pagy, pagy_id: nil, link_extra: '',
|
36
|
+
def pagy_foundation_nav_js(pagy, pagy_id: nil, link_extra: '',
|
37
|
+
nav_aria_label: nil, nav_i18n_key: nil, **vars)
|
31
38
|
sequels = pagy.sequels(**vars)
|
32
39
|
p_id = %( id="#{pagy_id}") if pagy_id
|
33
|
-
link = pagy_link_proc(pagy, link_extra:
|
34
|
-
tags = { 'before' => %(<ul class="pagination">#{
|
40
|
+
link = pagy_link_proc(pagy, link_extra:)
|
41
|
+
tags = { 'before' => %(<ul class="pagination">#{foundation_prev_html pagy, link}),
|
35
42
|
'link' => %(<li>#{link.call(PAGE_PLACEHOLDER, LABEL_PLACEHOLDER)}</li>),
|
36
|
-
'active' => %(<li class="current">#{LABEL_PLACEHOLDER}</li>),
|
37
|
-
'gap' => %(<li class="ellipsis gap"
|
43
|
+
'active' => %(<li class="current" role="link" aria-current="page" aria-disabled="true">#{LABEL_PLACEHOLDER}</li>),
|
44
|
+
'gap' => %(<li class="ellipsis gap"></li>),
|
38
45
|
'after' => %(#{pagy_foundation_next_html pagy, link}</ul>) }
|
39
46
|
|
40
|
-
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-foundation-nav-js"
|
41
|
-
|
47
|
+
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-foundation-nav-js" #{
|
48
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)} #{
|
49
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
42
50
|
end
|
43
51
|
|
44
52
|
# Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the pagy.js file
|
45
|
-
def pagy_foundation_combo_nav_js(pagy, pagy_id: nil, link_extra: ''
|
53
|
+
def pagy_foundation_combo_nav_js(pagy, pagy_id: nil, link_extra: '',
|
54
|
+
nav_aria_label: nil, nav_i18n_key: nil)
|
46
55
|
p_id = %( id="#{pagy_id}") if pagy_id
|
47
|
-
link = pagy_link_proc(pagy, link_extra:
|
56
|
+
link = pagy_link_proc(pagy, link_extra:)
|
48
57
|
p_page = pagy.page
|
49
58
|
p_pages = pagy.pages
|
50
59
|
input = %(<input class="input-group-field cell shrink" type="number" min="1" max="#{
|
51
60
|
p_pages}" value="#{p_page}" style="width: #{
|
52
|
-
p_pages.to_s.length + 1}rem; padding: 0 0.3rem; margin: 0 0.3rem;">)
|
61
|
+
p_pages.to_s.length + 1}rem; padding: 0 0.3rem; margin: 0 0.3rem;" aria-current="page">)
|
53
62
|
|
54
|
-
%(<nav#{p_id} class="pagy-foundation-combo-nav-js"
|
63
|
+
%(<nav#{p_id} class="pagy-foundation-combo-nav-js" #{
|
64
|
+
nav_aria_label_attr(pagy, nav_aria_label, nav_i18n_key)}><div class="input-group" #{
|
55
65
|
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
56
|
-
if (p_prev
|
57
|
-
link.call
|
58
|
-
|
66
|
+
if (p_prev = pagy.prev)
|
67
|
+
link.call(p_prev, pagy_t('pagy.prev'),
|
68
|
+
%(style="margin-bottom: 0" class="prev button primary" #{prev_aria_label_attr}))
|
59
69
|
else
|
60
|
-
%(<a style="margin-bottom: 0" class="prev button primary disabled"
|
70
|
+
%(<a style="margin-bottom: 0" class="prev button primary disabled" role="link" aria-disabled="true" #{
|
71
|
+
prev_aria_label_attr}>#{pagy_t('pagy.prev')}</a>)
|
61
72
|
end
|
62
|
-
}
|
63
|
-
|
64
|
-
|
73
|
+
}#{
|
74
|
+
pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)
|
75
|
+
.sub!('<label>', '<label class="input-group-label">')}#{ # add the class to the official dictionary string
|
76
|
+
if (p_next = pagy.next)
|
77
|
+
link.call(p_next, pagy_t('pagy.next'),
|
78
|
+
%(style="margin-bottom: 0" class="next button primary" #{next_aria_label_attr}))
|
65
79
|
else
|
66
|
-
%(<a style="margin-bottom: 0" class="next button primary disabled"
|
80
|
+
%(<a style="margin-bottom: 0" class="next button primary disabled" role="link" aria-disabled="true" #{
|
81
|
+
next_aria_label_attr}>#{pagy_t 'pagy.next'}</a>)
|
67
82
|
end
|
68
83
|
}</div></nav>)
|
69
84
|
end
|
70
85
|
|
71
86
|
private
|
72
87
|
|
73
|
-
def
|
88
|
+
def foundation_prev_html(pagy, link)
|
74
89
|
if (p_prev = pagy.prev)
|
75
|
-
%(<li class="prev">#{link.call
|
90
|
+
%(<li class="prev">#{link.call(p_prev, pagy_t('pagy.prev'), prev_aria_label_attr)}</li>)
|
76
91
|
else
|
77
|
-
%(<li class="prev disabled">#{pagy_t
|
92
|
+
%(<li class="prev disabled" role="link" aria-disabled="true" #{prev_aria_label_attr}>#{pagy_t('pagy.prev')}</li>)
|
78
93
|
end
|
79
94
|
end
|
80
95
|
|
81
96
|
def pagy_foundation_next_html(pagy, link)
|
82
97
|
if (p_next = pagy.next)
|
83
|
-
%(<li class="next">#{link.call
|
98
|
+
%(<li class="next">#{link.call(p_next, pagy_t('pagy.next'), next_aria_label_attr)}</li>)
|
84
99
|
else
|
85
|
-
%(<li class="next disabled">#{pagy_t
|
100
|
+
%(<li class="next disabled" role="link" aria-disabled="true" #{next_aria_label_attr}>#{pagy_t('pagy.next')}</li>)
|
86
101
|
end
|
87
102
|
end
|
88
103
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'base64'
|
4
|
-
|
5
3
|
class Pagy # :nodoc:
|
6
4
|
DEFAULT[:steps] = false # default false will use {0 => @vars[:size]}
|
7
5
|
|
8
6
|
# Private module documented in the main classes
|
9
7
|
module FrontendHelpers
|
10
8
|
# Additions for the Pagy class
|
11
|
-
module
|
9
|
+
module PagyAddOn
|
12
10
|
# `Pagy` instance method used by the `pagy*_nav_js` helpers.
|
13
11
|
# It returns the sequels of width/series generated from the :steps hash
|
14
12
|
# Example:
|
@@ -29,9 +27,10 @@ class Pagy # :nodoc:
|
|
29
27
|
# Support for the Calendar API
|
30
28
|
def label_sequels(*); end
|
31
29
|
end
|
30
|
+
Pagy.prepend PagyAddOn
|
32
31
|
|
33
32
|
# Additions for Calendar class
|
34
|
-
module
|
33
|
+
module CalendarOverride
|
35
34
|
def label_sequels(sequels = self.sequels)
|
36
35
|
{}.tap do |label_sequels|
|
37
36
|
sequels.each do |width, series|
|
@@ -40,15 +39,17 @@ class Pagy # :nodoc:
|
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|
42
|
+
Calendar.prepend CalendarOverride if defined?(Calendar)
|
43
43
|
|
44
44
|
# Additions for the Frontend
|
45
|
-
module
|
45
|
+
module FrontendAddOn
|
46
46
|
if defined?(Oj)
|
47
47
|
# Return a data tag with the base64 encoded JSON-serialized args generated with the faster oj gem
|
48
48
|
# Base64 encoded JSON is smaller than HTML escaped JSON
|
49
49
|
def pagy_data(pagy, *args)
|
50
50
|
args << pagy.vars[:page_param] if pagy.vars[:trim_extra]
|
51
|
-
|
51
|
+
strict_base64_encoded = [Oj.dump(args, mode: :strict)].pack('m0')
|
52
|
+
%(data-pagy="#{strict_base64_encoded}")
|
52
53
|
end
|
53
54
|
else
|
54
55
|
require 'json'
|
@@ -56,17 +57,16 @@ class Pagy # :nodoc:
|
|
56
57
|
# Base64 encoded JSON is smaller than HTML escaped JSON
|
57
58
|
def pagy_data(pagy, *args)
|
58
59
|
args << pagy.vars[:page_param] if pagy.vars[:trim_extra]
|
59
|
-
|
60
|
+
strict_base64_encoded = [args.to_json].pack('m0')
|
61
|
+
%(data-pagy="#{strict_base64_encoded}")
|
60
62
|
end
|
61
63
|
end
|
62
64
|
|
63
|
-
# Return the marked link
|
65
|
+
# Return the marked link used by pagy.js
|
64
66
|
def pagy_marked_link(link)
|
65
67
|
link.call PAGE_PLACEHOLDER, '', 'style="display: none;"'
|
66
68
|
end
|
67
69
|
end
|
70
|
+
Frontend.prepend FrontendAddOn
|
68
71
|
end
|
69
|
-
prepend FrontendHelpers::Pagy
|
70
|
-
Calendar.prepend FrontendHelpers::Calendar if defined?(Calendar)
|
71
|
-
Frontend.prepend FrontendHelpers::Frontend
|
72
72
|
end
|
data/lib/pagy/extras/gearbox.rb
CHANGED