pagy 2.1.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/config/pagy.rb +18 -15
- data/lib/javascripts/pagy.js +87 -79
- data/lib/locales/README.md +15 -2
- data/lib/locales/de.yml +14 -12
- data/lib/locales/en.yml +14 -12
- data/lib/locales/es.yml +14 -12
- data/lib/locales/fr.yml +22 -0
- data/lib/locales/id.yml +14 -14
- data/lib/locales/ja.yml +12 -12
- data/lib/locales/nb.yml +14 -12
- data/lib/locales/nl.yml +14 -12
- data/lib/locales/pl.yml +24 -0
- data/lib/locales/pt-br.yml +14 -12
- data/lib/locales/ru.yml +16 -17
- data/lib/locales/se.yml +15 -12
- data/lib/locales/tr.yml +13 -13
- data/lib/locales/utils/loader.rb +2 -9
- data/lib/locales/utils/p11n.rb +53 -27
- data/lib/locales/zh-CN.yml +12 -12
- data/lib/locales/zh-HK.yml +13 -13
- data/lib/locales/zh-TW.yml +12 -12
- data/lib/pagy.rb +3 -3
- data/lib/pagy/extras/bootstrap.rb +19 -28
- data/lib/pagy/extras/bulma.rb +25 -32
- data/lib/pagy/extras/foundation.rb +21 -28
- data/lib/pagy/extras/i18n.rb +1 -1
- data/lib/pagy/extras/items.rb +6 -7
- data/lib/pagy/extras/materialize.rb +21 -28
- data/lib/pagy/extras/navs.rb +40 -0
- data/lib/pagy/extras/semantic.rb +20 -27
- data/lib/pagy/extras/shared.rb +28 -25
- data/lib/pagy/extras/support.rb +0 -26
- data/lib/pagy/frontend.rb +6 -5
- metadata +6 -4
- data/lib/pagy/extras/plain.rb +0 -50
data/lib/locales/zh-TW.yml
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
+
# :other pluralization (see https://github.com/ddnexus/pagy/blob/master/lib/locales/utils/p11n.rb)
|
2
|
+
|
1
3
|
zh-TW:
|
2
4
|
pagy:
|
5
|
+
|
6
|
+
item_name: ""
|
7
|
+
|
3
8
|
nav:
|
4
9
|
prev: "‹ 上一頁"
|
5
10
|
next: "下一頁 ›"
|
6
11
|
gap: "…"
|
12
|
+
|
13
|
+
combo_nav_js: "第 %{page_input} / %{pages} 頁"
|
14
|
+
|
7
15
|
info:
|
8
|
-
|
9
|
-
|
10
|
-
one: "顯示 <b>1</b> 項%{item_name}"
|
11
|
-
other: "顯示<b>所有 %{count}</b> 項%{item_name}"
|
16
|
+
no_items: "沒找到項"
|
17
|
+
single_page: "顯示 <b>%{count}</b> 項%{item_name}"
|
12
18
|
multiple_pages: "共 <b>%{count}</b> 項%{item_name},顯示 <b>%{from}-%{to}</b>"
|
13
|
-
|
14
|
-
|
15
|
-
one: ""
|
16
|
-
other: ""
|
17
|
-
compact: "第 %{page_input} / %{pages} 頁"
|
18
|
-
items:
|
19
|
-
one: "每頁顯示 %{items_input} 項"
|
20
|
-
other: "每頁顯示 %{items_input} 項"
|
19
|
+
|
20
|
+
items_selector_js: "每頁顯示 %{items_input} 項%{item_name}"
|
data/lib/pagy.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
require 'pathname'
|
6
6
|
|
7
|
-
class Pagy ; VERSION = '
|
7
|
+
class Pagy ; VERSION = '3.0.0'
|
8
8
|
|
9
9
|
class OverflowError < StandardError; attr_reader :pagy; def initialize(pagy) @pagy = pagy end; end
|
10
10
|
|
@@ -12,7 +12,7 @@ class Pagy ; VERSION = '2.1.5'
|
|
12
12
|
def self.root; @root ||= Pathname.new(__FILE__).dirname.freeze end
|
13
13
|
|
14
14
|
# default vars
|
15
|
-
VARS = { page:1, items:20, outset:0, size:[1,4,4,1], page_param: :page, params:{}, anchor:'', link_extra:'',
|
15
|
+
VARS = { page:1, items:20, outset:0, size:[1,4,4,1], page_param: :page, params:{}, anchor:'', link_extra:'', i18n_key:'pagy.item_name', cycle:false }
|
16
16
|
|
17
17
|
attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :from, :to, :prev, :next
|
18
18
|
|
@@ -41,7 +41,7 @@ class Pagy ; VERSION = '2.1.5'
|
|
41
41
|
if a<0 || a==b || a>@last # skip out of range and duplicates
|
42
42
|
elsif a+1 == b; series.push(a) # no gap -> no additions
|
43
43
|
elsif a+2 == b; series.push(a, a+1) # 1 page gap -> fill with missing page
|
44
|
-
else series.push(a, :gap) # n page gap -> add
|
44
|
+
else series.push(a, :gap) # n page gap -> add gap
|
45
45
|
end # skip the end boundary (last+1)
|
46
46
|
end # shift the start boundary (0) and
|
47
47
|
series.shift; series[series.index(@page)] = @page.to_s; series # convert the current page to String
|
@@ -24,43 +24,34 @@ class Pagy
|
|
24
24
|
%(<nav class="pagy-bootstrap-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></nav>)
|
25
25
|
end
|
26
26
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
27
|
+
# Javascript pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
28
|
+
def pagy_bootstrap_nav_js(pagy, id=pagy_id)
|
29
|
+
link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next
|
30
|
+
tags = { 'before' => p_prev ? %(<ul class="pagination"><li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
31
|
+
: %(<ul class="pagination"><li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>),
|
32
|
+
'link' => %(<li class="page-item">#{marker = link.call(MARKER)}</li>),
|
33
|
+
'active' => %(<li class="page-item active">#{marker}</li>),
|
34
|
+
'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>),
|
35
|
+
'after' => p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li></ul>)
|
36
|
+
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li></ul>) }
|
37
|
+
%(<nav id="#{id}" class="pagy-bootstrap-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
38
|
+
end
|
39
|
+
|
40
|
+
# Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
41
|
+
def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
|
30
42
|
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
31
43
|
|
32
|
-
html =
|
33
|
-
|
44
|
+
html = %(<nav id="#{id}" class="pagy-bootstrap-combo-nav-js pagination" role="navigation" aria-label="pager">) \
|
45
|
+
+ link.call(MARKER, '', %(style="display: none;" ))
|
34
46
|
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
35
47
|
html << %(<div class="btn-group" role="group">)
|
36
48
|
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
|
37
49
|
: %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
38
50
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" class="text-primary" style="padding: 0; border: none; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
|
39
|
-
html << %(<div class="pagy-
|
51
|
+
html << %(<div class="pagy-combo-input btn btn-primary disabled" style="white-space: nowrap;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
|
40
52
|
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
|
41
53
|
: %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
42
|
-
html << %(</div></nav>#{pagy_json_tag(:
|
43
|
-
end
|
44
|
-
|
45
|
-
# Responsive pagination for bootstrap: it returns the html with the series of links to the pages
|
46
|
-
# rendered by the Pagy.responsive javascript
|
47
|
-
def pagy_bootstrap_responsive_nav(pagy, id=pagy_id)
|
48
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next, pagy.responsive
|
49
|
-
|
50
|
-
tags['before'] = EMPTY + '<ul class="pagination">'
|
51
|
-
tags['before'] << (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
52
|
-
: %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</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="page-item">#{link.call item}</li>) # page link
|
55
|
-
elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
|
56
|
-
elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
57
|
-
end
|
58
|
-
end
|
59
|
-
tags['after'] = EMPTY + (p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
60
|
-
: %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
|
61
|
-
tags['after'] << '</ul>'
|
62
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
63
|
-
%(<nav id="#{id}" class="pagy-bootstrap-responsive-nav pagination" role="navigation" aria-label="pager"></nav>#{script})
|
54
|
+
html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
64
55
|
end
|
65
56
|
|
66
57
|
end
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -11,10 +11,10 @@ class Pagy
|
|
11
11
|
def pagy_bulma_nav(pagy)
|
12
12
|
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
13
13
|
|
14
|
-
html =
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
html = (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
15
|
+
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>)) \
|
16
|
+
+ (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
17
|
+
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
18
18
|
html << '<ul class="pagination-list">'
|
19
19
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
20
20
|
html << if item.is_a?(Integer); %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}") }</li>) # page link
|
@@ -26,43 +26,36 @@ class Pagy
|
|
26
26
|
%(<nav class="pagy-bulma-nav pagination is-centered" role="navigation" aria-label="pagination">#{html}</nav>)
|
27
27
|
end
|
28
28
|
|
29
|
-
#
|
30
|
-
|
31
|
-
|
29
|
+
# Javascript pagination for bulma: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
30
|
+
def pagy_bulma_nav_js(pagy, id=pagy_id)
|
31
|
+
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
32
|
+
tags = { 'before' => ( (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
33
|
+
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>)) \
|
34
|
+
+ (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
35
|
+
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>)) \
|
36
|
+
+ '<ul class="pagination-list">' ),
|
37
|
+
'link' => %(<li>#{link.call(MARKER, MARKER, %(class="pagination-link" aria-label="goto page #{MARKER}"))}</li>),
|
38
|
+
'active' => %(<li>#{link.call(MARKER, MARKER, %(class="pagination-link is-current" aria-current="page" aria-label="page #{MARKER}"))}</li>),
|
39
|
+
'gap' => %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>),
|
40
|
+
'after' => '</ul>' }
|
41
|
+
%(<nav id="#{id}" class="pagy-bulma-nav-js pagination is-centered" role="navigation" aria-label="pagination"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
42
|
+
end
|
43
|
+
|
44
|
+
# Javascript combo pagination for Bulma: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
45
|
+
def pagy_bulma_combo_nav_js(pagy, id=pagy_id)
|
32
46
|
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
33
47
|
|
34
|
-
html =
|
35
|
-
|
48
|
+
html = %(<nav id="#{id}" class="pagy-bulma-combo-nav-js" role="navigation" aria-label="pagination">) \
|
49
|
+
+ link.call(MARKER, '', 'style="display: none;"')
|
36
50
|
(html << link.call(1, '', %(style="display: none;"))) if defined?(TRIM)
|
37
51
|
html << %(<div class="field is-grouped is-grouped-centered" role="group">)
|
38
52
|
html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
|
39
53
|
: %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
|
40
54
|
input = %(<input class="input" type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem; margin:0 0.3rem;">)
|
41
|
-
html << %(<div class="pagy-
|
55
|
+
html << %(<div class="pagy-combo-input control level is-mobile">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
|
42
56
|
html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
|
43
57
|
: %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
|
44
|
-
html << %(</div></nav>#{pagy_json_tag(:
|
45
|
-
end
|
46
|
-
|
47
|
-
# Responsive pagination for Bulma: it returns the html with the series of links to the pages
|
48
|
-
# rendered by the Pagy.responsive javascript
|
49
|
-
def pagy_bulma_responsive_nav(pagy, id=pagy_id)
|
50
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
51
|
-
|
52
|
-
tags['before'] = EMPTY + (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
|
53
|
-
: %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>))
|
54
|
-
tags['before'] << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
|
55
|
-
: %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
|
56
|
-
tags['before'] << '<ul class="pagination-list">'
|
57
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
58
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}")}</li>)
|
59
|
-
elsif item.is_a?(String) ; %(<li>#{link.call item, item, %(class="pagination-link is-current" aria-current="page" aria-label="page #{item}")}</li>)
|
60
|
-
elsif item == :gap ; %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
tags['after'] = '</ul>'
|
64
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
65
|
-
%(<nav id="#{id}" class="pagy-bulma-responsive-nav pagination is-centered" role="navigation" aria-label="pagination"></nav>#{script})
|
58
|
+
html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
66
59
|
end
|
67
60
|
|
68
61
|
end
|
@@ -24,43 +24,36 @@ class Pagy
|
|
24
24
|
%(<nav class="pagy-foundation-nav" role="navigation" aria-label="Pagination"><ul class="pagination">#{html}</ul></nav>)
|
25
25
|
end
|
26
26
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
27
|
+
# Javascript pagination for foundation: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
28
|
+
def pagy_foundation_nav_js(pagy, id=pagy_id)
|
29
|
+
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
30
|
+
tags = { 'before' => ( '<ul class="pagination">' \
|
31
|
+
+ (p_prev ? %(<li class="prev">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')}</li>)
|
32
|
+
: %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>)) ),
|
33
|
+
'link' => %(<li>#{link.call(MARKER)}</li>),
|
34
|
+
'active' => %(<li class="current">#{pagy.page}</li>),
|
35
|
+
'gap' => %(<li class="ellipsis gap" aria-hidden="true"></li>),
|
36
|
+
'after' => ( (p_next ? %(<li class="next">#{link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next"')}</li>)
|
37
|
+
: %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>)) \
|
38
|
+
+ '</ul>' ) }
|
39
|
+
%(<nav id="#{id}" class="pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
40
|
+
end
|
41
|
+
|
42
|
+
# Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
43
|
+
def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
|
30
44
|
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
31
45
|
|
32
|
-
html =
|
33
|
-
|
46
|
+
html = %(<nav id="#{id}" class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination">) \
|
47
|
+
+ link.call(MARKER, '', %(style="display: none;" ))
|
34
48
|
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
35
49
|
html << %(<div class="input-group">)
|
36
50
|
html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
|
37
51
|
: %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
|
38
52
|
input = %(<input class="input-group-field cell shrink" type="number" min="1" max="#{p_pages}" value="#{p_page}" style="width: #{p_pages.to_s.length+1}rem; padding: 0 0.3rem; margin: 0 0.3rem;">)
|
39
|
-
html << %(<span class="input-group-label">#{pagy_t('pagy.
|
53
|
+
html << %(<span class="input-group-label">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span>)
|
40
54
|
html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
|
41
55
|
: %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
|
42
|
-
html << %(</div></nav>#{pagy_json_tag(:
|
43
|
-
end
|
44
|
-
|
45
|
-
# Responsive pagination for Foundation: it returns the html with the series of links to the pages
|
46
|
-
# rendered by the Pagy.responsive javascript
|
47
|
-
def pagy_foundation_responsive_nav(pagy, id=pagy_id)
|
48
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
49
|
-
|
50
|
-
tags['before'] = EMPTY + '<ul class="pagination">'
|
51
|
-
tags['before'] << (p_prev ? %(<li class="prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
|
52
|
-
: %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</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>#{link.call item}</li>) # page link
|
55
|
-
elsif item.is_a?(String) ; %(<li class="current">#{item}</li>) # active page
|
56
|
-
elsif item == :gap ; %(<li class="ellipsis gap" aria-hidden="true"></li>) # page gap
|
57
|
-
end
|
58
|
-
end
|
59
|
-
tags['after'] = EMPTY + (p_next ? %(<li class="next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
|
60
|
-
: %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>))
|
61
|
-
tags['after'] << '</ul>'
|
62
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
63
|
-
%(<nav id="#{id}" class="pagy-foundation-responsive-nav" aria-label="Pagination"></nav>#{script})
|
56
|
+
html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
64
57
|
end
|
65
58
|
|
66
59
|
end
|
data/lib/pagy/extras/i18n.rb
CHANGED
@@ -10,7 +10,7 @@ class Pagy
|
|
10
10
|
|
11
11
|
Pagy::I18n.clear.instance_eval { undef :load; undef :t } # unload the pagy default constant for efficiency
|
12
12
|
|
13
|
-
|
13
|
+
alias :pagy_without_i18n :pagy_t
|
14
14
|
def pagy_t_with_i18n(*args) ::I18n.t(*args) end
|
15
15
|
alias :pagy_t :pagy_t_with_i18n
|
16
16
|
|
data/lib/pagy/extras/items.rb
CHANGED
@@ -46,15 +46,14 @@ class Pagy
|
|
46
46
|
alias_method :pagy_url_for, :pagy_url_for_with_items
|
47
47
|
|
48
48
|
# Return the items selector HTML. For example "Show [20] items per page"
|
49
|
-
def
|
49
|
+
def pagy_items_selector_js(pagy, id=pagy_id)
|
50
50
|
p_vars = pagy.vars; p_items = p_vars[:items]; p_vars[:items] = "#{MARKER}-items-"
|
51
51
|
|
52
|
-
html =
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
html << %(</span>#{pagy_json_tag(:items, id, MARKER, pagy.from)})
|
52
|
+
html = %(<span id="#{id}">) + %(<a href="#{pagy_url_for("#{MARKER}-page-", pagy)}"></a>)
|
53
|
+
p_vars[:items] = p_items # restore the items
|
54
|
+
input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length+1}rem;">)
|
55
|
+
html << %(#{pagy_t('pagy.items_selector_js', item_name: pagy_t(pagy.vars[:i18n_key], count: p_items), items_input: input, count: p_items)})
|
56
|
+
html << %(</span>#{pagy_json_tag(:items_selector, id, MARKER, pagy.from)})
|
58
57
|
end
|
59
58
|
|
60
59
|
end
|
@@ -23,13 +23,27 @@ class Pagy
|
|
23
23
|
%(<div class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></div>)
|
24
24
|
end
|
25
25
|
|
26
|
-
#
|
27
|
-
|
28
|
-
|
26
|
+
# Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
27
|
+
def pagy_materialize_nav_js(pagy, id=pagy_id)
|
28
|
+
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
29
|
+
tags = { 'before' => ( '<ul class="pagination">' \
|
30
|
+
+ (p_prev ? %(<li class="waves-effect prev">#{link.call(p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"')}</li>)
|
31
|
+
: %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>)) ),
|
32
|
+
'link' => %(<li class="waves-effect">#{marker = link.call(MARKER)}</li>),
|
33
|
+
'active' => %(<li class="active">#{marker}</li>),
|
34
|
+
'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>),
|
35
|
+
'after' => ( (p_next ? %(<li class="waves-effect next">#{link.call(p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"')}</li>)
|
36
|
+
: %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>)) \
|
37
|
+
+ '</ul>' ) }
|
38
|
+
%(<div id="#{id}" class="pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
39
|
+
end
|
40
|
+
|
41
|
+
# Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
42
|
+
def pagy_materialize_combo_nav_js(pagy, id=pagy_id)
|
29
43
|
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
30
44
|
|
31
|
-
html =
|
32
|
-
|
45
|
+
html = %(<div id="#{id}" class="pagy-materialize-combo-nav-js pagination" role="navigation" aria-label="pager">) \
|
46
|
+
+ link.call(MARKER, '', %(style="display: none;" ))
|
33
47
|
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
34
48
|
html << %(<div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;">)
|
35
49
|
html << '<ul class="pagination" style="margin: 0px;">'
|
@@ -37,31 +51,10 @@ class Pagy
|
|
37
51
|
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>)
|
38
52
|
: %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
39
53
|
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;">)
|
40
|
-
html << %(<div class="pagy-
|
54
|
+
html << %(<div class="pagy-combo-input btn-flat" style="cursor: default; padding: 0px">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
|
41
55
|
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>)
|
42
56
|
: %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
43
|
-
html << %(</ul></div>#{pagy_json_tag(:
|
44
|
-
end
|
45
|
-
|
46
|
-
# Responsive pagination for Materialize: it returns the html with the series of links to the pages
|
47
|
-
# rendered by the Pagy.responsive javascript
|
48
|
-
def pagy_materialize_responsive_nav(pagy, id=pagy_id)
|
49
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
50
|
-
|
51
|
-
tags['before'] = EMPTY + '<ul class="pagination">'
|
52
|
-
tags['before'] << (p_prev ? %(<li class="waves-effect prev">#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
|
53
|
-
: %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>))
|
54
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
55
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<li class="waves-effect">#{link.call item}</li>) # page link
|
56
|
-
elsif item.is_a?(String) ; %(<li class="active">#{link.call item}</li>) # active page
|
57
|
-
elsif item == :gap ; %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
|
58
|
-
end
|
59
|
-
end
|
60
|
-
tags['after'] = EMPTY + (p_next ? %(<li class="waves-effect next">#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
|
61
|
-
: %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>))
|
62
|
-
tags['after'] << '</ul>'
|
63
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
64
|
-
%(<div id="#{id}" class="pagy-materialize-responsive-nav pagination" role="navigation" aria-label="pager"></div>#{script})
|
57
|
+
html << %(</ul></div>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
65
58
|
end
|
66
59
|
|
67
60
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/navs
|
2
|
+
# encoding: utf-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'pagy/extras/shared'
|
6
|
+
|
7
|
+
class Pagy
|
8
|
+
module Frontend
|
9
|
+
|
10
|
+
# Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
11
|
+
def pagy_nav_js(pagy, id=pagy_id)
|
12
|
+
link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
|
13
|
+
tags = { 'before' => p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
14
|
+
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ),
|
15
|
+
'link' => %(<span class="page">#{link.call(MARKER)}</span> ),
|
16
|
+
'active' => %(<span class="page active">#{pagy.page}</span> ),
|
17
|
+
'gap' => %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ),
|
18
|
+
'after' => p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
19
|
+
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>) }
|
20
|
+
%(<nav id="#{id}" class="pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
21
|
+
end
|
22
|
+
|
23
|
+
# Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
24
|
+
def pagy_combo_nav_js(pagy, id=pagy_id)
|
25
|
+
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
26
|
+
|
27
|
+
html = %(<nav id="#{id}" class="pagy-combo-nav-js-js pagination" role="navigation" aria-label="pager">) \
|
28
|
+
+ link.call(MARKER, '', %(style="display: none;" ))
|
29
|
+
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
30
|
+
html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
31
|
+
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
32
|
+
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
|
33
|
+
html << %(<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span> )
|
34
|
+
html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
35
|
+
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
36
|
+
html << %(</nav>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
data/lib/pagy/extras/semantic.rb
CHANGED
@@ -7,7 +7,7 @@ require 'pagy/extras/shared'
|
|
7
7
|
class Pagy
|
8
8
|
module Frontend
|
9
9
|
|
10
|
-
# Pagination for semantic
|
10
|
+
# Pagination for semantic: it returns the html with the series of links to the pages
|
11
11
|
def pagy_semantic_nav(pagy)
|
12
12
|
link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
|
13
13
|
|
@@ -24,40 +24,33 @@ class Pagy
|
|
24
24
|
%(<div class="pagy-semantic-nav ui pagination menu" aria-label="pager">#{html}</div>)
|
25
25
|
end
|
26
26
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
27
|
+
# Javascript pagination for semantic: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
28
|
+
def pagy_semantic_nav_js(pagy, id=pagy_id)
|
29
|
+
link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
|
30
|
+
tags = { 'before' => (p_prev ? %(#{link.call(p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"')})
|
31
|
+
: %(<div class="item disabled"><i class="left small chevron icon"></i></div>)),
|
32
|
+
'link' => %(#{link.call(MARKER)}),
|
33
|
+
'active' => %(<a class="item active">#{pagy.page}</a>),
|
34
|
+
'gap' => %(<div class="disabled item">#{pagy_t('pagy.nav.gap')}</div>),
|
35
|
+
'after' => (p_next ? %(#{link.call(p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"')})
|
36
|
+
: %(<div class="item disabled"><i class="right small chevron icon"></i></div>)) }
|
37
|
+
%(<div id="#{id}" class="pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, MARKER, tags, pagy.sequels)})
|
38
|
+
end
|
39
|
+
|
40
|
+
# Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
41
|
+
def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
|
30
42
|
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next, pagy.page, pagy.pages
|
31
43
|
|
32
|
-
html =
|
33
|
-
|
44
|
+
html = %(<div id="#{id}" class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">) \
|
45
|
+
+ link.call(MARKER, '', %(style="display: none;" ))
|
34
46
|
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
35
47
|
html << (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
|
36
48
|
: %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
|
37
49
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem; margin: 0 0.3rem">)
|
38
|
-
html << %(<div class="pagy-
|
50
|
+
html << %(<div class="pagy-combo-input item">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div> )
|
39
51
|
html << (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
|
40
52
|
: %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
|
41
|
-
html << %(</div>#{pagy_json_tag(:
|
42
|
-
end
|
43
|
-
|
44
|
-
# Responsive pagination for semantic: it returns the html with the series of links to the pages
|
45
|
-
# rendered by the Pagy.responsive javascript
|
46
|
-
def pagy_semantic_responsive_nav(pagy, id=pagy_id)
|
47
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next, pagy.responsive
|
48
|
-
|
49
|
-
tags['before'] = (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
|
50
|
-
: %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
|
51
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
52
|
-
tags[item.to_s] = if item.is_a?(Integer); %(#{link.call item}) # page link
|
53
|
-
elsif item.is_a?(String) ; %(<a class="item active">#{item}</a>) # current page
|
54
|
-
elsif item == :gap ; %(<div class="disabled item">...</div>) # page gap
|
55
|
-
end
|
56
|
-
end
|
57
|
-
tags['after'] = (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
|
58
|
-
: %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
|
59
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
60
|
-
%(<div id="#{id}" class="pagy-semantic-responsive-nav ui pagination menu" role="navigation" aria-label="pager"></div>#{script})
|
53
|
+
html << %(</div>#{pagy_json_tag(:combo_nav, id, MARKER, p_page, !!defined?(TRIM))})
|
61
54
|
end
|
62
55
|
|
63
56
|
end
|