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/pagy/extras/shared.rb
CHANGED
@@ -1,42 +1,45 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require 'json'
|
5
4
|
require 'digest'
|
6
5
|
|
7
6
|
class Pagy
|
8
7
|
|
9
|
-
#
|
10
|
-
VARS[:
|
11
|
-
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
@responsive ||= {items: [], series: {}, widths:[]}.tap do |r|
|
26
|
-
@vars[:breakpoints].key?(0) || raise(ArgumentError, "expected :breakpoints to contain the 0 size; got #{@vars[:breakpoints].inspect}")
|
27
|
-
@vars[:breakpoints].each {|width, size| r[:items] |= r[:series][width] = series(size)}
|
28
|
-
r[:widths] = r[:series].keys.sort!{|a,b| b <=> a}
|
29
|
-
end
|
8
|
+
# default :steps: false will use {0 => @vars[:size]}
|
9
|
+
VARS[:steps] = false
|
10
|
+
|
11
|
+
# `Pagy` instance method used by the `pagy*_nav_js` helpers.
|
12
|
+
# It returns the sequels of width/series generated from the :steps hash
|
13
|
+
# Example:
|
14
|
+
# >> pagy = Pagy.new(count:1000, page: 20, steps: {0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3]})
|
15
|
+
# >> pagy.sequels
|
16
|
+
# #=> { "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
|
+
# Notice: if :steps is false it will use the single {0 => @vars[:size]} size
|
20
|
+
def sequels
|
21
|
+
steps = @vars[:steps] || {0 => @vars[:size]}
|
22
|
+
steps.key?(0) or raise(ArgumentError, "expected :steps to define the 0 width; got #{steps.inspect}")
|
23
|
+
sequels = {}; steps.each {|width, size| sequels[width.to_s] = series(size)}; sequels
|
30
24
|
end
|
31
25
|
|
32
26
|
module Frontend
|
33
27
|
|
34
|
-
|
35
|
-
|
28
|
+
if defined?(Oj)
|
29
|
+
# returns a script tag with the JSON-serialized args generated with the faster oj gem
|
30
|
+
def pagy_json_tag(*args)
|
31
|
+
%(<script type="application/json" class="pagy-json">#{Oj.dump(args, mode: :strict)}</script>)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
require 'json'
|
35
|
+
# returns a script tag with the JSON-serialized args generated with the slower to_json
|
36
|
+
def pagy_json_tag(*args)
|
37
|
+
%(<script type="application/json" class="pagy-json">#{args.to_json}</script>)
|
38
|
+
end
|
36
39
|
end
|
37
40
|
|
41
|
+
# returns the SHA1 (fastest on modern ruby) string used as default `id` attribute by all the `*_js` tags
|
38
42
|
def pagy_id
|
39
|
-
# SHA1 is the fastest on modern ruby
|
40
43
|
"pagy-#{Digest::SHA1.hexdigest(caller(2..2)[0].split(':in')[0])}"
|
41
44
|
end
|
42
45
|
|
data/lib/pagy/extras/support.rb
CHANGED
@@ -2,25 +2,8 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
|
-
require 'pagy/extras/shared'
|
6
|
-
|
7
5
|
class Pagy
|
8
6
|
|
9
|
-
def to_h
|
10
|
-
{ count: defined?(@count) && @count,
|
11
|
-
page: @page,
|
12
|
-
items: @items,
|
13
|
-
pages: @pages,
|
14
|
-
last: @last,
|
15
|
-
offset: @offset,
|
16
|
-
from: @from,
|
17
|
-
to: @to,
|
18
|
-
prev: @prev,
|
19
|
-
next: @next,
|
20
|
-
vars: @vars,
|
21
|
-
series: series }
|
22
|
-
end
|
23
|
-
|
24
7
|
module Frontend
|
25
8
|
|
26
9
|
def pagy_prev_url(pagy)
|
@@ -41,15 +24,6 @@ class Pagy
|
|
41
24
|
: %(<span class="page next disabled">#{text}</span>)
|
42
25
|
end
|
43
26
|
|
44
|
-
def pagy_serialized(pagy)
|
45
|
-
pagy.to_h.merge(prev_url: pagy_prev_url(pagy), next_url: pagy_next_url(pagy))
|
46
|
-
end
|
47
|
-
|
48
|
-
# Multi purpose JSON tag for custom javascript initialization
|
49
|
-
def pagy_apply_init_tag(pagy, function, payload=pagy_serialized(pagy))
|
50
|
-
pagy_json_tag(:applyInit, function, payload)
|
51
|
-
end
|
52
|
-
|
53
27
|
end
|
54
28
|
|
55
29
|
end
|
data/lib/pagy/frontend.rb
CHANGED
@@ -47,11 +47,12 @@ class Pagy
|
|
47
47
|
%(<nav class="pagy-nav pagination" role="navigation" aria-label="pager">#{html}</nav>)
|
48
48
|
end
|
49
49
|
|
50
|
-
# Return examples: "Displaying items 41-60 of 324 in total"
|
50
|
+
# Return examples: "Displaying items 41-60 of 324 in total" of "Displaying Products 41-60 of 324 in total"
|
51
51
|
def pagy_info(pagy)
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
path = if (count = pagy.count) == 0 ; 'pagy.info.no_items'
|
53
|
+
else pagy.pages == 1 ? 'pagy.info.single_page' : 'pagy.info.multiple_pages'
|
54
|
+
end
|
55
|
+
pagy_t(path, item_name: pagy_t(pagy.vars[:i18n_key], count: count), count: count, from: pagy.from, to: pagy.to)
|
55
56
|
end
|
56
57
|
|
57
58
|
MARKER = "-pagy-#{'pagy'.hash}-"
|
@@ -67,7 +68,7 @@ class Pagy
|
|
67
68
|
end
|
68
69
|
|
69
70
|
# Similar to I18n.t: just ~18x faster using ~10x less memory
|
70
|
-
def pagy_t(path, vars={}) Pagy::I18n.t(@pagy_locale, path, vars) end
|
71
|
+
def pagy_t(path, vars={}) Pagy::I18n.t(@pagy_locale||=nil, path, vars) end
|
71
72
|
|
72
73
|
end
|
73
74
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pagy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.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: 2019-
|
11
|
+
date: 2019-04-28 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,
|
@@ -26,10 +26,12 @@ files:
|
|
26
26
|
- lib/locales/de.yml
|
27
27
|
- lib/locales/en.yml
|
28
28
|
- lib/locales/es.yml
|
29
|
+
- lib/locales/fr.yml
|
29
30
|
- lib/locales/id.yml
|
30
31
|
- lib/locales/ja.yml
|
31
32
|
- lib/locales/nb.yml
|
32
33
|
- lib/locales/nl.yml
|
34
|
+
- lib/locales/pl.yml
|
33
35
|
- lib/locales/pt-br.yml
|
34
36
|
- lib/locales/ru.yml
|
35
37
|
- lib/locales/se.yml
|
@@ -53,9 +55,9 @@ files:
|
|
53
55
|
- lib/pagy/extras/i18n.rb
|
54
56
|
- lib/pagy/extras/items.rb
|
55
57
|
- lib/pagy/extras/materialize.rb
|
58
|
+
- lib/pagy/extras/navs.rb
|
56
59
|
- lib/pagy/extras/overflow.rb
|
57
60
|
- lib/pagy/extras/pagy_search.rb
|
58
|
-
- lib/pagy/extras/plain.rb
|
59
61
|
- lib/pagy/extras/searchkick.rb
|
60
62
|
- lib/pagy/extras/semantic.rb
|
61
63
|
- lib/pagy/extras/shared.rb
|
@@ -94,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
96
|
- !ruby/object:Gem::Version
|
95
97
|
version: '0'
|
96
98
|
requirements: []
|
97
|
-
rubygems_version: 3.0.
|
99
|
+
rubygems_version: 3.0.3
|
98
100
|
signing_key:
|
99
101
|
specification_version: 4
|
100
102
|
summary: The Ultimate Pagination Ruby Gem
|
data/lib/pagy/extras/plain.rb
DELETED
@@ -1,50 +0,0 @@
|
|
1
|
-
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/plain
|
2
|
-
# encoding: utf-8
|
3
|
-
# frozen_string_literal: true
|
4
|
-
|
5
|
-
require 'pagy/extras/shared'
|
6
|
-
|
7
|
-
class Pagy
|
8
|
-
module Frontend
|
9
|
-
|
10
|
-
# added alias for symmetry
|
11
|
-
alias :pagy_plain_nav :pagy_nav
|
12
|
-
|
13
|
-
# Plain compact pagination: it returns the html with the series of links to the pages
|
14
|
-
# we use a numeric input tag to set the page and the Pagy.compact javascript to navigate
|
15
|
-
def pagy_plain_compact_nav(pagy, id=pagy_id)
|
16
|
-
link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages
|
17
|
-
|
18
|
-
html = EMPTY + %(<nav id="#{id}" class="pagy-plain-compact-nav pagination" role="navigation" aria-label="pager">)
|
19
|
-
html << link.call(MARKER, '', %(style="display: none;" ))
|
20
|
-
(html << link.call(1, '', %(style="display: none;" ))) if defined?(TRIM)
|
21
|
-
html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
22
|
-
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
23
|
-
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;">)
|
24
|
-
html << %(<span class="pagy-compact-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.compact', page_input: input, count: p_page, pages: p_pages)}</span> )
|
25
|
-
html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
26
|
-
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
27
|
-
html << %(</nav>#{pagy_json_tag(:compact, id, MARKER, p_page, !!defined?(TRIM))})
|
28
|
-
end
|
29
|
-
|
30
|
-
# Plain responsive pagination: it returns the html with the series of links to the pages
|
31
|
-
# rendered by the Pagy.responsive javascript
|
32
|
-
def pagy_plain_responsive_nav(pagy, id=pagy_id)
|
33
|
-
tags, link, p_prev, p_next, responsive = {}, pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.responsive
|
34
|
-
|
35
|
-
tags['before'] = (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
|
36
|
-
: %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
|
37
|
-
responsive[:items].each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
38
|
-
tags[item.to_s] = if item.is_a?(Integer); %(<span class="page">#{link.call item}</span> ) # page link
|
39
|
-
elsif item.is_a?(String) ; %(<span class="page active">#{item}</span> ) # current page
|
40
|
-
elsif item == :gap ; %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ) # page gap
|
41
|
-
end
|
42
|
-
end
|
43
|
-
tags['after'] = (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
|
44
|
-
: %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
|
45
|
-
script = pagy_json_tag(:responsive, id, tags, responsive[:widths], responsive[:series])
|
46
|
-
%(<nav id="#{id}" class="pagy-plain-responsive-nav pagination" role="navigation" aria-label="pager"></nav>#{script})
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
end
|