pagy 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/locales/pagy.yml +5 -2
- data/lib/pagy.rb +7 -7
- data/lib/pagy/backend.rb +9 -10
- data/lib/pagy/extras/array.rb +3 -3
- data/lib/pagy/extras/bootstrap.rb +1 -1
- data/lib/pagy/extras/compact.rb +1 -1
- data/lib/pagy/extras/i18n.rb +2 -2
- data/lib/pagy/extras/initializer_example.rb +14 -11
- data/lib/pagy/extras/items.rb +44 -0
- data/lib/pagy/extras/javascripts/pagy-compact.js +9 -1
- data/lib/pagy/extras/javascripts/pagy-items.js +26 -0
- data/lib/pagy/extras/javascripts/pagy-responsive.js +2 -0
- data/lib/pagy/extras/responsive.rb +2 -2
- data/lib/pagy/frontend.rb +5 -4
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8867ae39673157a4e3256e40bb71a435d4bc45418ece6c510ac4913fc8d2c917
|
4
|
+
data.tar.gz: f5cd6d9d8becbdd00c9878f4c10472302e2813b3163fe33bc21bd71c240544e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27619900377812a56104aa89542ebe6b6ab2201231b725ca1e708b3b02e0f540265d525e2bbe9647fa993338e6fe0003a0380818daaabc7405671910215fa064
|
7
|
+
data.tar.gz: 726345048bbd3056b6612d4acbe11bdf76e6abb515b3948cf165668da05dc99071d2086ec235466281be1543b344f81de4f6422941db883d537534b9369499ac
|
data/lib/locales/pagy.yml
CHANGED
data/lib/pagy.rb
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
require 'pathname'
|
4
4
|
|
5
|
-
class Pagy ; VERSION = '0.
|
5
|
+
class Pagy ; VERSION = '0.9.0'
|
6
6
|
|
7
7
|
class OutOfRangeError < StandardError; end
|
8
8
|
|
9
|
-
#
|
9
|
+
# Root pathname to get the path of Pagy files like templates or dictionaries
|
10
10
|
def self.root; Pathname.new(__FILE__).dirname end
|
11
11
|
|
12
12
|
# default vars
|
@@ -14,11 +14,11 @@ class Pagy ; VERSION = '0.8.6'
|
|
14
14
|
|
15
15
|
attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :from, :to, :prev, :next
|
16
16
|
|
17
|
-
#
|
17
|
+
# Merge and validate the options, do some simple aritmetic and set the instance variables
|
18
18
|
def initialize(vars)
|
19
|
-
@vars = VARS.merge(vars.delete_if{|_,v| v.nil? || v == ''.freeze }) # default vars + cleaned
|
20
|
-
{ count:0, items:1, outset:0, page:1 }.each do |k,min| # validate
|
21
|
-
(@vars[k] && instance_variable_set(:"@#{k}", @vars
|
19
|
+
@vars = VARS.merge(vars.delete_if{|_,v| v.nil? || v == ''.freeze }) # default vars + cleaned vars
|
20
|
+
{ count:0, items:1, outset:0, page:1 }.each do |k,min| # validate instance variables
|
21
|
+
(@vars[k] && instance_variable_set(:"@#{k}", @vars[k].to_i) >= min) \
|
22
22
|
or raise(ArgumentError, "expected :#{k} >= #{min}; got #{instance_variable_get(:"@#{k}").inspect}")
|
23
23
|
end
|
24
24
|
@pages = @last = [(@count.to_f / @items).ceil, 1].max # cardinal and ordinal meanings
|
@@ -31,7 +31,7 @@ class Pagy ; VERSION = '0.8.6'
|
|
31
31
|
@next = (@page+1 unless @page == @last) # nil if no next page
|
32
32
|
end
|
33
33
|
|
34
|
-
#
|
34
|
+
# Return the array of page numbers and :gap items e.g. [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
35
35
|
def series(size=@vars[:size])
|
36
36
|
4.times{|i| (size[i]>=0 rescue nil) or raise(ArgumentError, "expected 4 items >= 0 in :size; got #{size.inspect}")}
|
37
37
|
series = []
|
data/lib/pagy/backend.rb
CHANGED
@@ -1,30 +1,29 @@
|
|
1
1
|
# See Pagy::Backend API documentation: https://ddnexus.github.io/pagy/api/backend
|
2
2
|
|
3
3
|
class Pagy
|
4
|
-
# Defines a few generic methods to paginate
|
5
|
-
# or any collection by overriding pagy_get_items in your controller
|
4
|
+
# Defines a few generic methods to paginate an ORM collection out of the box,
|
5
|
+
# or any collection by overriding pagy_get_items and/or pagy_get_vars in your controller
|
6
6
|
|
7
|
-
# See also the extras if you need specialized methods to paginate
|
8
|
-
# Arrays, ORM, and other TBD collections
|
7
|
+
# See also the extras if you need specialized methods to paginate Arrays or other collections
|
9
8
|
|
10
9
|
module Backend ; private # the whole module is private so no problem with including it in a controller
|
11
10
|
|
12
|
-
#
|
11
|
+
# Return Pagy object and items
|
13
12
|
def pagy(collection, vars={})
|
14
13
|
pagy = Pagy.new(pagy_get_vars(collection, vars))
|
15
14
|
return pagy, pagy_get_items(collection, pagy)
|
16
15
|
end
|
17
16
|
|
18
|
-
#
|
17
|
+
# Sub-method called only by #pagy: here for easy customization of variables by overriding
|
19
18
|
def pagy_get_vars(collection, vars)
|
20
|
-
#
|
21
|
-
{ count: collection.count(:all),
|
19
|
+
# Return the merged variables to initialize the Pagy object
|
20
|
+
{ count: collection.count(:all), # works with AR, but may not work with other ORMs
|
22
21
|
page: params[vars[:page_param]||VARS[:page_param]] }.merge!(vars)
|
23
22
|
end
|
24
23
|
|
25
|
-
#
|
24
|
+
# Sub-method called only by #pagy: here for easy customization of record-extraction by overriding
|
26
25
|
def pagy_get_items(collection, pagy)
|
27
|
-
#
|
26
|
+
# This should work with ActiveRecord, Sequel, Mongoid...
|
28
27
|
collection.offset(pagy.offset).limit(pagy.items)
|
29
28
|
end
|
30
29
|
|
data/lib/pagy/extras/array.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
# See the Pagy
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/array
|
2
2
|
|
3
3
|
class Pagy
|
4
4
|
# Add specialized backend methods to paginate array collections
|
5
5
|
module Backend ; private
|
6
6
|
|
7
|
-
#
|
7
|
+
# Return Pagy object and items
|
8
8
|
def pagy_array(array, vars={})
|
9
9
|
pagy = Pagy.new(pagy_array_get_vars(array, vars))
|
10
10
|
return pagy, array[pagy.offset, pagy.items]
|
11
11
|
end
|
12
12
|
|
13
13
|
def pagy_array_get_vars(array, vars)
|
14
|
-
#
|
14
|
+
# Return the merged variables to initialize the Pagy object
|
15
15
|
{ count: array.count,
|
16
16
|
page: params[vars[:page_param]||VARS[:page_param]] }.merge!(vars)
|
17
17
|
end
|
data/lib/pagy/extras/compact.rb
CHANGED
data/lib/pagy/extras/i18n.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# See the Pagy
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/i18n
|
2
2
|
|
3
3
|
class Pagy
|
4
4
|
# Use ::I18n gem
|
@@ -6,7 +6,7 @@ class Pagy
|
|
6
6
|
|
7
7
|
::I18n.load_path << Pagy.root.join('locales', 'pagy.yml')
|
8
8
|
|
9
|
-
#
|
9
|
+
# Override the built-in pagy_t
|
10
10
|
def pagy_t(*args)
|
11
11
|
I18n.t(*args)
|
12
12
|
end
|
@@ -17,23 +17,31 @@
|
|
17
17
|
# See https://ddnexus.github.io/pagy/extras/compact
|
18
18
|
# require 'pagy/extras/compact'
|
19
19
|
|
20
|
-
# I18n:
|
20
|
+
# I18n: Use the `I18n` gem instead of the pagy implementation
|
21
21
|
# See https://ddnexus.github.io/pagy/extras/i18n
|
22
22
|
# require 'pagy/extras/i18n'
|
23
23
|
|
24
|
+
# Items: Handle the page :items passed with the params
|
25
|
+
# See https://ddnexus.github.io/pagy/extras/items
|
26
|
+
# require 'pagy/extras/items'
|
27
|
+
# Pagy::VARS[:items_param] = :items # default
|
28
|
+
# Pagy::VARS[:max_items] = 100 # default
|
29
|
+
|
24
30
|
# Responsive: On resize, the number of page links will adapt in real-time to the available window or container width
|
25
31
|
# See https://ddnexus.github.io/pagy/extras/responsive
|
26
32
|
# require 'pagy/extras/responsive'
|
33
|
+
# See https://ddnexus.github.io/pagy/extras/responsive#breakpoints
|
34
|
+
# Pagy::VARS[:breakpoints] = { 0 => [1,2,2,1], 350 => [2,3,3,2], 550 => [3,4,4,3] } # example of width/size pairs
|
27
35
|
|
28
36
|
|
29
37
|
# Pagy Variables
|
30
|
-
# All the Pagy::VARS here are set for all the
|
31
|
-
# overridden by just passing them to Pagy.new or the pagy controller method
|
38
|
+
# All the Pagy::VARS here are set for all the Pagy instances but can be
|
39
|
+
# overridden by just passing them to Pagy.new or the #pagy controller method
|
32
40
|
|
33
|
-
#
|
41
|
+
# Instance variables (See https://ddnexus.github.io/pagy/api/pagy#instance-variables)
|
34
42
|
# Pagy::VARS[:items] = 20 # default
|
35
43
|
|
36
|
-
#
|
44
|
+
# Other Variables (See https://ddnexus.github.io/pagy/api/pagy#other-variables)
|
37
45
|
# Pagy::VARS[:size] = [1,4,4,1] # default
|
38
46
|
# Pagy::VARS[:page_param] = :page # default
|
39
47
|
# Pagy::VARS[:params] = {} # default
|
@@ -41,17 +49,12 @@
|
|
41
49
|
# Pagy::VARS[:link_extra] = 'data-remote="true"' # example
|
42
50
|
# Pagy::VARS[:item_path] = 'activerecord.models.product' # example
|
43
51
|
|
44
|
-
# Extras Non Core Variables
|
45
|
-
# See https://ddnexus.github.io/pagy/extras/responsive#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
|
-
|
49
52
|
# Pagy::Frontend::I18N Constant
|
50
53
|
# See https://ddnexus.github.io/pagy/api/frontend#i18n
|
51
54
|
# Pagy::Frontend::I18N[:plurals] = -> (c) {([:zero, :one][c] || :other).to_s # default
|
52
55
|
# Pagy::Frontend::I18N.load_file('path/to/dictionary.yml') # load a custom file
|
53
56
|
|
54
57
|
|
55
|
-
# Rails: extras assets path required by compact
|
58
|
+
# Rails: extras assets path required by compact, items qnd responsive extras
|
56
59
|
# See https://ddnexus.github.io/pagy/extras/compact and https://ddnexus.github.io/pagy/extras/responsive
|
57
60
|
# Rails.application.config.assets.paths << Pagy.root.join('pagy', 'extras', 'javascripts')
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/items
|
2
|
+
|
3
|
+
class Pagy
|
4
|
+
|
5
|
+
# Default variables for this extra
|
6
|
+
VARS[:items_param] = :items
|
7
|
+
VARS[:max_items] = 100
|
8
|
+
|
9
|
+
# Handle a custom number of :items from params
|
10
|
+
module Backend ; private
|
11
|
+
|
12
|
+
alias_method :built_in_pagy_get_vars, :pagy_get_vars
|
13
|
+
|
14
|
+
def pagy_get_vars(collection, vars)
|
15
|
+
vars[:items] ||= (items = params[vars[:items_param] || VARS[:items_param]]) && # :items from :items_param
|
16
|
+
[items&.to_i, vars.key?(:max_items) ? vars[:max_items] : VARS[:max_items]].compact.min # :items capped to :max_items
|
17
|
+
built_in_pagy_get_vars(collection, vars)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
module Frontend
|
23
|
+
|
24
|
+
# this works with all Rack-based frameworks (Sinatra, Padrino, Rails, ...)
|
25
|
+
def pagy_url_for(page, pagy)
|
26
|
+
p_vars = pagy.vars; params = request.GET.merge(p_vars[:page_param] => page, p_vars[:items_param] => p_vars[:items], **p_vars[:params])
|
27
|
+
"#{request.path}?#{Rack::Utils.build_nested_query(pagy_get_params(params))}#{p_vars[:anchor]}"
|
28
|
+
end
|
29
|
+
|
30
|
+
# return the items selector HTML. For example "Show [20] items per page"
|
31
|
+
def pagy_items_selector(pagy, id=caller(1,1)[0].hash)
|
32
|
+
pagy = pagy.clone; p_vars = pagy.vars; p_items = p_vars[:items]; p_vars[:items] = "#{MARKER}-items-"
|
33
|
+
|
34
|
+
tags = %(<span id="pagy-items-#{id}">)
|
35
|
+
|
36
|
+
tags << %(<a href="#{pagy_url_for("#{MARKER}-page-", pagy)}"></a>)
|
37
|
+
input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length+1}rem;">)
|
38
|
+
tags << %(#{pagy_t('pagy.items.show'.freeze)} #{input} #{pagy_t('pagy.items.items'.freeze)})
|
39
|
+
|
40
|
+
tags << %(</span><script>PagyItems('#{id}', '#{MARKER}', #{pagy.from});</script>)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras/compact
|
2
|
+
|
1
3
|
function PagyCompact(id, marker, page){
|
2
4
|
var pagyNav = document.getElementById('pagy-nav-'+id),
|
3
5
|
input = pagyNav.getElementsByTagName('input')[0],
|
@@ -11,5 +13,11 @@ function PagyCompact(id, marker, page){
|
|
11
13
|
}
|
12
14
|
};
|
13
15
|
|
14
|
-
|
16
|
+
// select the content on click: easier for typing a number
|
17
|
+
input.addEventListener('click', function(){ this.select() });
|
18
|
+
// jump to page number from input when the input looses focus
|
19
|
+
input.addEventListener('focusout', this.go);
|
20
|
+
// … and when pressing enter inside the input
|
21
|
+
input.addEventListener('keyup', function(e){ if (e.which === 13) this.go() }.bind(this));
|
22
|
+
|
15
23
|
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// See the Pagy documentation: https://ddnexus.github.io/pagy/extras/items
|
2
|
+
|
3
|
+
function PagyItems(id, marker, from){
|
4
|
+
var pagyNav = document.getElementById('pagy-items-'+id),
|
5
|
+
input = pagyNav.getElementsByTagName('input')[0],
|
6
|
+
current = input.value,
|
7
|
+
link = pagyNav.getElementsByTagName('a')[0];
|
8
|
+
|
9
|
+
this.go = function(){
|
10
|
+
var items = input.value;
|
11
|
+
if (current !== items) {
|
12
|
+
var page = Math.max(Math.ceil(from / items),1);
|
13
|
+
var href = link.getAttribute('href').replace(marker+'-page-', page).replace(marker+'-items-', items);
|
14
|
+
link.setAttribute('href', href);
|
15
|
+
link.click();
|
16
|
+
}
|
17
|
+
};
|
18
|
+
|
19
|
+
// select the content on click: easier for typing a number
|
20
|
+
input.addEventListener('click', function(){ this.select() });
|
21
|
+
// jump to page number from input when the input looses focus
|
22
|
+
input.addEventListener('focusout', this.go);
|
23
|
+
// … and when pressing enter inside the input
|
24
|
+
input.addEventListener('keyup', function(e){ if (e.which === 13) this.go() }.bind(this));
|
25
|
+
|
26
|
+
}
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# See the Pagy
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/responsive
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
class Pagy
|
6
6
|
|
7
|
-
#
|
7
|
+
# Default :breakpoints
|
8
8
|
VARS[:breakpoints] = { 0 => [1,4,4,1] }
|
9
9
|
|
10
10
|
# Helper for building the page_nav with javascript. For example:
|
data/lib/pagy/frontend.rb
CHANGED
@@ -26,7 +26,7 @@ class Pagy
|
|
26
26
|
end
|
27
27
|
|
28
28
|
|
29
|
-
#
|
29
|
+
# Return examples: "Displaying items 41-60 of 324 in total" or "Displaying Products 41-60 of 324 in total"
|
30
30
|
def pagy_info(pagy)
|
31
31
|
name = pagy_t(pagy.vars[:item_path], count: pagy.count)
|
32
32
|
path = pagy.pages == 1 ? 'pagy.info.single_page'.freeze : 'pagy.info.multiple_pages'.freeze
|
@@ -41,13 +41,14 @@ class Pagy
|
|
41
41
|
end
|
42
42
|
|
43
43
|
|
44
|
-
#
|
44
|
+
# Sub-method called only by #pagy_url_for: here for easy customization of params by overriding
|
45
45
|
def pagy_get_params(params) params end
|
46
46
|
|
47
47
|
|
48
48
|
MARKER = "-pagy-#{'pagy'.hash}-".freeze
|
49
49
|
|
50
|
-
#
|
50
|
+
# Returns a performance optimized proc to generate the HTML links
|
51
|
+
# Benchmarked on a 20 link nav: it is ~27x faster and uses ~13x less memory than rails' link_to
|
51
52
|
def pagy_link_proc(pagy, link_extra=''.freeze)
|
52
53
|
p_prev, p_next = pagy.prev, pagy.next
|
53
54
|
a, b = %(<a href="#{pagy_url_for(MARKER, pagy)}" #{pagy.vars[:link_extra]} #{link_extra}).split(MARKER, 2)
|
@@ -62,7 +63,7 @@ class Pagy
|
|
62
63
|
def I18N.load_file(file) I18N_DATA.replace(YAML.load_file(file).first[1]) end
|
63
64
|
|
64
65
|
# Similar to I18n.t for interpolation and pluralization but without translation
|
65
|
-
# Use only for single-language apps: it is specialized for
|
66
|
+
# Use only for single-language apps: it is specialized for Pagy and 5x faster than I18n.t
|
66
67
|
# See also https://ddnexus.github.io/pagy/extras/i18n to use the standard I18n gem instead
|
67
68
|
def pagy_t(path, vars={})
|
68
69
|
value = I18N_DATA.dig(*path.to_s.split('.'.freeze)) or return %(translation missing: "#{path}")
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Domizio Demichelis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-17 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,
|
@@ -29,7 +29,9 @@ files:
|
|
29
29
|
- lib/pagy/extras/compact.rb
|
30
30
|
- lib/pagy/extras/i18n.rb
|
31
31
|
- lib/pagy/extras/initializer_example.rb
|
32
|
+
- lib/pagy/extras/items.rb
|
32
33
|
- lib/pagy/extras/javascripts/pagy-compact.js
|
34
|
+
- lib/pagy/extras/javascripts/pagy-items.js
|
33
35
|
- lib/pagy/extras/javascripts/pagy-responsive.js
|
34
36
|
- lib/pagy/extras/responsive.rb
|
35
37
|
- lib/pagy/extras/templates/nav.html.erb
|