pagy 8.6.3 → 9.3.4
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/apps/calendar.ru +119 -127
- data/apps/demo.ru +274 -260
- data/apps/index.rb +7 -0
- data/apps/keyset_ar.ru +227 -0
- data/apps/keyset_s.ru +219 -0
- data/apps/rails.ru +25 -20
- data/apps/repro.ru +108 -103
- data/bin/pagy +18 -20
- data/config/pagy.rb +19 -15
- data/javascripts/pagy.min.js +2 -2
- data/javascripts/pagy.min.js.map +3 -3
- data/javascripts/pagy.mjs +2 -2
- data/lib/pagy/b64.rb +33 -0
- data/lib/pagy/backend.rb +20 -20
- data/lib/pagy/calendar/day.rb +2 -2
- data/lib/pagy/calendar/month.rb +2 -2
- data/lib/pagy/calendar/quarter.rb +2 -2
- data/lib/pagy/calendar/unit.rb +7 -10
- data/lib/pagy/calendar/week.rb +2 -2
- data/lib/pagy/calendar/year.rb +2 -2
- data/lib/pagy/calendar.rb +15 -13
- data/lib/pagy/countless.rb +10 -14
- data/lib/pagy/extras/arel.rb +3 -11
- data/lib/pagy/extras/array.rb +5 -10
- data/lib/pagy/extras/bootstrap.rb +5 -5
- data/lib/pagy/extras/bulma.rb +10 -7
- data/lib/pagy/extras/calendar.rb +13 -17
- data/lib/pagy/extras/countless.rb +8 -13
- data/lib/pagy/extras/elasticsearch_rails.rb +16 -25
- data/lib/pagy/extras/gearbox.rb +18 -18
- data/lib/pagy/extras/headers.rb +25 -24
- data/lib/pagy/extras/i18n.rb +1 -1
- data/lib/pagy/extras/js_tools.rb +6 -6
- data/lib/pagy/extras/jsonapi.rb +30 -21
- data/lib/pagy/extras/keyset.rb +30 -0
- data/lib/pagy/extras/limit.rb +63 -0
- data/lib/pagy/extras/meilisearch.rb +9 -17
- data/lib/pagy/extras/metadata.rb +3 -3
- data/lib/pagy/extras/overflow.rb +9 -9
- data/lib/pagy/extras/pagy.rb +16 -16
- data/lib/pagy/extras/searchkick.rb +9 -17
- data/lib/pagy/extras/size.rb +1 -1
- data/lib/pagy/extras/standalone.rb +6 -6
- data/lib/pagy/extras/trim.rb +3 -3
- data/lib/pagy/frontend.rb +32 -33
- data/lib/pagy/i18n.rb +3 -2
- data/lib/pagy/keyset/active_record.rb +38 -0
- data/lib/pagy/keyset/sequel.rb +51 -0
- data/lib/pagy/keyset.rb +118 -0
- data/lib/pagy/shared_methods.rb +26 -0
- data/lib/pagy/url_helpers.rb +5 -5
- data/lib/pagy.rb +53 -67
- data/locales/ar.yml +1 -1
- data/locales/be.yml +1 -1
- data/locales/bg.yml +1 -1
- data/locales/bs.yml +1 -1
- data/locales/ca.yml +1 -1
- data/locales/ckb.yml +1 -1
- data/locales/cs.yml +1 -1
- data/locales/da.yml +1 -1
- data/locales/de.yml +1 -1
- data/locales/dz.yml +17 -0
- data/locales/en.yml +1 -1
- data/locales/es.yml +1 -1
- data/locales/fr.yml +1 -1
- data/locales/hr.yml +1 -1
- data/locales/id.yml +1 -1
- data/locales/it.yml +1 -1
- data/locales/ja.yml +1 -1
- data/locales/km.yml +1 -1
- data/locales/ko.yml +1 -1
- data/locales/nb.yml +1 -1
- data/locales/nl.yml +1 -1
- data/locales/nn.yml +1 -1
- data/locales/pl.yml +1 -1
- data/locales/pt-BR.yml +1 -1
- data/locales/pt.yml +1 -1
- data/locales/ru.yml +1 -1
- data/locales/sr.yml +1 -1
- data/locales/sv-SE.yml +1 -1
- data/locales/sv.yml +1 -1
- data/locales/sw.yml +3 -1
- data/locales/ta.yml +3 -1
- data/locales/tr.yml +1 -1
- data/locales/uk.yml +1 -1
- data/locales/vi.yml +1 -1
- data/locales/zh-CN.yml +7 -9
- data/locales/zh-HK.yml +7 -9
- data/locales/zh-TW.yml +7 -9
- metadata +14 -27
- data/apps/tmp/calendar.sqlite3 +0 -0
- data/apps/tmp/calendar.sqlite3-shm +0 -0
- data/apps/tmp/calendar.sqlite3-wal +0 -0
- data/apps/tmp/local_secret.txt +0 -1
- data/apps/tmp/pagy-keyset.sqlite3 +0 -0
- data/apps/tmp/pagy-keyset.sqlite3-shm +0 -0
- data/apps/tmp/pagy-keyset.sqlite3-wal +0 -0
- data/javascripts/pagy-module.js +0 -100
- data/javascripts/pagy.js +0 -4
- data/lib/pagy/extras/foundation.rb +0 -95
- data/lib/pagy/extras/items.rb +0 -64
- data/lib/pagy/extras/materialize.rb +0 -100
- data/lib/pagy/extras/semantic.rb +0 -94
- data/lib/pagy/extras/uikit.rb +0 -98
@@ -0,0 +1,38 @@
|
|
1
|
+
# See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
class Pagy
|
5
|
+
class Keyset
|
6
|
+
# Keyset adapter for ActiveRecord
|
7
|
+
class ActiveRecord < Keyset
|
8
|
+
protected
|
9
|
+
|
10
|
+
# Get the keyset attributes from the record
|
11
|
+
def keyset_attributes_from(record) = record.slice(*@keyset.keys)
|
12
|
+
|
13
|
+
# Extract the keyset from the set
|
14
|
+
def extract_keyset
|
15
|
+
@set.order_values.each_with_object({}) do |node, keyset|
|
16
|
+
keyset[node.value.name.to_sym] = node.direction
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Filter the newest records
|
21
|
+
def filter_newest = @set.where(filter_newest_query, **@latest)
|
22
|
+
|
23
|
+
# Append the missing keyset keys if the set is restricted by select
|
24
|
+
def apply_select
|
25
|
+
@set.select(*@keyset.keys)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Set with selected columns?
|
29
|
+
def select? = !@set.select_values.empty?
|
30
|
+
|
31
|
+
# Typecast the latest attributes
|
32
|
+
def typecast_latest(latest)
|
33
|
+
@set.model.new(latest).slice(latest.keys)
|
34
|
+
.to_hash.transform_keys(&:to_sym)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
class Pagy
|
5
|
+
class Keyset
|
6
|
+
# Keyset adapter for sequel
|
7
|
+
class Sequel < Keyset
|
8
|
+
protected
|
9
|
+
|
10
|
+
# Get the keyset attributes from the record
|
11
|
+
def keyset_attributes_from(record) = record.to_hash.slice(*@keyset.keys)
|
12
|
+
|
13
|
+
# Extract the keyset from the set
|
14
|
+
def extract_keyset
|
15
|
+
return {} unless @set.opts[:order]
|
16
|
+
|
17
|
+
@set.opts[:order].each_with_object({}) do |item, keyset|
|
18
|
+
case item
|
19
|
+
when Symbol
|
20
|
+
keyset[item] = :asc
|
21
|
+
when ::Sequel::SQL::OrderedExpression
|
22
|
+
keyset[item.expression] = item.descending ? :desc : :asc
|
23
|
+
else
|
24
|
+
raise TypeError, "#{item.class.inspect} is not a supported Sequel::SQL::OrderedExpression"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Filter the newest records
|
30
|
+
def filter_newest = @set.where(::Sequel.lit(filter_newest_query, **@latest))
|
31
|
+
|
32
|
+
# Append the missing keyset keys if the set is restricted by select
|
33
|
+
def apply_select
|
34
|
+
selected = @set.opts[:select]
|
35
|
+
@set.select_append(*@keyset.keys.reject { |c| selected.include?(c) })
|
36
|
+
end
|
37
|
+
|
38
|
+
# Set with selected columns?
|
39
|
+
def select? = !@set.opts[:select].nil?
|
40
|
+
|
41
|
+
# Typecast the latest attributes
|
42
|
+
def typecast_latest(latest)
|
43
|
+
model = @set.opts[:model]
|
44
|
+
model.unrestrict_primary_key if (restricted_pk = model.restrict_primary_key?)
|
45
|
+
latest = model.new(latest).to_hash.slice(*latest.keys.map(&:to_sym))
|
46
|
+
model.restrict_primary_key if restricted_pk
|
47
|
+
latest
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/pagy/keyset.rb
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require_relative 'b64'
|
6
|
+
require_relative 'shared_methods'
|
7
|
+
|
8
|
+
class Pagy
|
9
|
+
# Implement wicked-fast keyset pagination for big data
|
10
|
+
class Keyset
|
11
|
+
class TypeError < ::TypeError; end
|
12
|
+
|
13
|
+
include SharedMethods
|
14
|
+
|
15
|
+
# Pick the right adapter for the set
|
16
|
+
def self.new(set, **vars)
|
17
|
+
if self == Pagy::Keyset
|
18
|
+
if defined?(::ActiveRecord) && set.is_a?(::ActiveRecord::Relation)
|
19
|
+
ActiveRecord
|
20
|
+
elsif defined?(::Sequel) && set.is_a?(::Sequel::Dataset)
|
21
|
+
Sequel
|
22
|
+
else
|
23
|
+
raise TypeError, "expected set to be an instance of ActiveRecord::Relation or Sequel::Dataset; got #{set.class}"
|
24
|
+
end.new(set, **vars)
|
25
|
+
else
|
26
|
+
allocate.tap { |instance| instance.send(:initialize, set, **vars) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :latest # Other readers from SharedMethods
|
31
|
+
|
32
|
+
def initialize(set, **vars)
|
33
|
+
default = DEFAULT.slice(:limit, :page_param, # from pagy
|
34
|
+
:headers, # from headers extra
|
35
|
+
:jsonapi, # from jsonapi extra
|
36
|
+
:limit_param, :limit_max, :limit_extra) # from limit_extra
|
37
|
+
assign_vars({ **default, page: nil }, vars)
|
38
|
+
assign_limit
|
39
|
+
@set = set
|
40
|
+
@page = @vars[:page]
|
41
|
+
@keyset = extract_keyset
|
42
|
+
raise InternalError, 'the set must be ordered' if @keyset.empty?
|
43
|
+
return unless @page
|
44
|
+
|
45
|
+
latest = JSON.parse(B64.urlsafe_decode(@page)).transform_keys(&:to_sym)
|
46
|
+
@latest = typecast_latest(latest)
|
47
|
+
raise InternalError, 'page and keyset are not consistent' \
|
48
|
+
unless @latest.keys == @keyset.keys
|
49
|
+
end
|
50
|
+
|
51
|
+
# Return the next page
|
52
|
+
def next
|
53
|
+
records
|
54
|
+
return unless @more
|
55
|
+
|
56
|
+
@next ||= begin
|
57
|
+
hash = keyset_attributes_from(@records.last)
|
58
|
+
json = @vars[:jsonify_keyset_attributes]&.(hash) || hash.to_json
|
59
|
+
B64.urlsafe_encode(json)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Fetch the array of records for the current page
|
64
|
+
def records
|
65
|
+
@records ||= begin
|
66
|
+
@set = apply_select if select?
|
67
|
+
if @latest
|
68
|
+
# :nocov:
|
69
|
+
@set = @vars[:after_latest]&.(@set, @latest) || # deprecated
|
70
|
+
# :nocov:
|
71
|
+
@vars[:filter_newest]&.(@set, @latest, @keyset) ||
|
72
|
+
filter_newest
|
73
|
+
end
|
74
|
+
records = @set.limit(@limit + 1).to_a
|
75
|
+
@more = records.size > @limit && !records.pop.nil?
|
76
|
+
records
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
protected
|
81
|
+
|
82
|
+
# Prepare the literal query string (complete with the placeholders for value interpolation)
|
83
|
+
# used to filter the newest records.
|
84
|
+
# For example:
|
85
|
+
# With a set like Pet.order(animal: :asc, name: :desc, id: :asc) it returns the following string:
|
86
|
+
# ( "pets"."animal" = :animal AND "pets"."name" = :name AND "pets"."id" > :id ) OR
|
87
|
+
# ( "pets"."animal" = :animal AND "pets"."name" < :name ) OR
|
88
|
+
# ( "pets"."animal" > :animal )
|
89
|
+
# When :tuple_comparison is enabled, and if the order is all :asc or all :desc,
|
90
|
+
# with a set like Pet.order(:animal, :name, :id) it returns the following string:
|
91
|
+
# ( "pets"."animal", "pets"."name", "pets"."id" ) > ( :animal, :name, :id )
|
92
|
+
def filter_newest_query
|
93
|
+
operator = { asc: '>', desc: '<' }
|
94
|
+
directions = @keyset.values
|
95
|
+
table = @set.model.table_name
|
96
|
+
name = @keyset.to_h { |column| [column, %("#{table}"."#{column}")] }
|
97
|
+
if @vars[:tuple_comparison] && (directions.all?(:asc) || directions.all?(:desc))
|
98
|
+
placeholders = @keyset.keys.map { |column| ":#{column}" }.join(', ')
|
99
|
+
"( #{name.values.join(', ')} ) #{operator[directions.first]} ( #{placeholders} )"
|
100
|
+
else
|
101
|
+
keyset = @keyset.to_a
|
102
|
+
where = []
|
103
|
+
until keyset.empty?
|
104
|
+
last_column, last_direction = keyset.pop
|
105
|
+
query = +'( '
|
106
|
+
query << (keyset.map { |column, _d| "#{name[column]} = :#{column}" } \
|
107
|
+
<< "#{name[last_column]} #{operator[last_direction]} :#{last_column}").join(' AND ')
|
108
|
+
query << ' )'
|
109
|
+
where << query
|
110
|
+
end
|
111
|
+
where.join(' OR ')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
require_relative 'keyset/active_record'
|
118
|
+
require_relative 'keyset/sequel'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Pagy
|
4
|
+
# Shared with Keyset
|
5
|
+
module SharedMethods
|
6
|
+
attr_reader :page, :limit, :vars
|
7
|
+
|
8
|
+
# Validates and assign the passed vars: var must be present and value.to_i must be >= to min
|
9
|
+
def assign_and_check(name_min)
|
10
|
+
name_min.each do |name, min|
|
11
|
+
raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
|
12
|
+
unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Assign @limit (overridden by the gearbox extra)
|
17
|
+
def assign_limit
|
18
|
+
assign_and_check(limit: 1)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Assign @vars
|
22
|
+
def assign_vars(default, vars)
|
23
|
+
@vars = { **default, **vars.delete_if { |k, v| default.key?(k) && (v.nil? || v == '') } }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/pagy/url_helpers.rb
CHANGED
@@ -6,21 +6,21 @@ class Pagy
|
|
6
6
|
# Return the URL for the page, relying on the params method and Rack by default.
|
7
7
|
# It supports all Rack-based frameworks (Sinatra, Padrino, Rails, ...).
|
8
8
|
# For non-rack environments you can use the standalone extra
|
9
|
-
def pagy_url_for(pagy, page, absolute: false, **_)
|
9
|
+
def pagy_url_for(pagy, page, absolute: false, fragment: nil, **_)
|
10
10
|
vars = pagy.vars
|
11
|
-
query_params = request.GET.clone
|
11
|
+
query_params = request.GET.clone(freeze: false)
|
12
12
|
query_params.merge!(vars[:params].transform_keys(&:to_s)) if vars[:params].is_a?(Hash)
|
13
13
|
pagy_set_query_params(page, vars, query_params)
|
14
14
|
query_params = vars[:params].(query_params) if vars[:params].is_a?(Proc)
|
15
15
|
query_string = "?#{Rack::Utils.build_nested_query(query_params)}"
|
16
|
-
"#{request.base_url if absolute}#{vars[:request_path] || request.path}#{query_string}#{
|
16
|
+
"#{request.base_url if absolute}#{vars[:request_path] || request.path}#{query_string}#{fragment}"
|
17
17
|
end
|
18
18
|
|
19
|
-
# Add the page and
|
19
|
+
# Add the page and limit params
|
20
20
|
# Overridable by the jsonapi extra
|
21
21
|
def pagy_set_query_params(page, vars, query_params)
|
22
22
|
query_params[vars[:page_param].to_s] = page
|
23
|
-
query_params[vars[:
|
23
|
+
query_params[vars[:limit_param].to_s] = vars[:limit] if vars[:limit_extra]
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/pagy.rb
CHANGED
@@ -2,48 +2,77 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'pathname'
|
5
|
+
require_relative 'pagy/shared_methods'
|
5
6
|
|
6
|
-
#
|
7
|
+
# Top superclass: it should define only what's common to all the subclasses
|
7
8
|
class Pagy
|
8
|
-
VERSION = '
|
9
|
+
VERSION = '9.3.4'
|
10
|
+
|
11
|
+
# Core default: constant for easy access, but mutable for customizable defaults
|
12
|
+
DEFAULT = { count_args: [:all], # rubocop:disable Style/MutableConstant
|
13
|
+
ends: true,
|
14
|
+
limit: 20,
|
15
|
+
outset: 0,
|
16
|
+
page: 1,
|
17
|
+
page_param: :page,
|
18
|
+
size: 7 } # AR friendly
|
9
19
|
|
10
20
|
# Gem root pathname to get the path of Pagy files stylesheets, javascripts, apps, locales, etc.
|
11
21
|
def self.root
|
12
22
|
@root ||= Pathname.new(__dir__).parent.freeze
|
13
23
|
end
|
14
24
|
|
15
|
-
|
16
|
-
DEFAULT = { page: 1, # rubocop:disable Style/MutableConstant
|
17
|
-
items: 20,
|
18
|
-
outset: 0,
|
19
|
-
size: 7,
|
20
|
-
ends: true,
|
21
|
-
count_args: [:all], # AR friendly
|
22
|
-
page_param: :page }
|
25
|
+
include SharedMethods
|
23
26
|
|
24
|
-
attr_reader :count, :
|
27
|
+
attr_reader :count, :from, :in, :last, :next, :offset, :prev, :to
|
25
28
|
alias pages last
|
26
29
|
|
27
30
|
# Merge and validate the options, do some simple arithmetic and set the instance variables
|
28
|
-
def initialize(vars)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def initialize(**vars)
|
32
|
+
assign_vars(DEFAULT, vars)
|
33
|
+
assign_and_check(count: 0, page: 1, outset: 0)
|
34
|
+
assign_limit
|
35
|
+
assign_offset
|
36
|
+
assign_last
|
37
|
+
check_overflow
|
36
38
|
@from = [@offset - @outset + 1, @count].min
|
37
|
-
@to = [@offset - @outset + @
|
39
|
+
@to = [@offset - @outset + @limit, @count].min
|
38
40
|
@in = [@to - @from + 1, @count].min
|
41
|
+
assign_prev_and_next
|
42
|
+
end
|
43
|
+
|
44
|
+
# Setup @last (overridden by the gearbox extra)
|
45
|
+
def assign_last
|
46
|
+
@last = [(@count.to_f / @limit).ceil, 1].max
|
47
|
+
@last = @vars[:max_pages] if @vars[:max_pages] && @last > vars[:max_pages]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Assign @offset (overridden by the gearbox extra)
|
51
|
+
def assign_offset
|
52
|
+
@offset = (@limit * (@page - 1)) + @outset # may be already set from gear_box
|
53
|
+
end
|
54
|
+
|
55
|
+
# Assign @prev and @next
|
56
|
+
def assign_prev_and_next
|
39
57
|
@prev = (@page - 1 unless @page == 1)
|
40
58
|
@next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
|
41
59
|
end
|
42
60
|
|
43
|
-
#
|
61
|
+
# Checks the @page <= @last
|
62
|
+
def check_overflow
|
63
|
+
raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
|
64
|
+
end
|
65
|
+
|
66
|
+
# Label for the current page. Allow the customization of the output (overridden by the calendar extra)
|
67
|
+
def label = @page.to_s
|
68
|
+
|
69
|
+
# Label for any page. Allow the customization of the output (overridden by the calendar extra)
|
70
|
+
def label_for(page) = page.to_s
|
71
|
+
|
72
|
+
# Return the array of page numbers and :gap e.g. [1, :gap, 8, "9", 10, :gap, 36]
|
44
73
|
def series(size: @vars[:size], **_)
|
45
74
|
raise VariableError.new(self, :size, 'to be an Integer >= 0', size) \
|
46
|
-
|
75
|
+
unless size.is_a?(Integer) && size >= 0
|
47
76
|
return [] if size.zero?
|
48
77
|
|
49
78
|
[].tap do |series|
|
@@ -61,60 +90,17 @@ class Pagy
|
|
61
90
|
series.push(*start...start + size)
|
62
91
|
# Set first and last pages plus gaps when needed, respecting the size
|
63
92
|
if vars[:ends] && size >= 7
|
64
|
-
series[0] = 1
|
93
|
+
series[0] = 1
|
65
94
|
series[1] = :gap unless series[1] == 2
|
66
95
|
series[-2] = :gap unless series[-2] == @last - 1
|
67
|
-
series[-1] = @last
|
96
|
+
series[-1] = @last
|
68
97
|
end
|
69
98
|
end
|
70
99
|
series[series.index(@page)] = @page.to_s
|
71
100
|
end
|
72
101
|
end
|
73
|
-
|
74
|
-
# Label for any page. Allow the customization of the output (overridden by the calendar extra)
|
75
|
-
def label_for(page)
|
76
|
-
page.to_s
|
77
|
-
end
|
78
|
-
|
79
|
-
# Label for the current page. Allow the customization of the output (overridden by the calendar extra)
|
80
|
-
def label
|
81
|
-
@page.to_s
|
82
|
-
end
|
83
|
-
|
84
|
-
protected
|
85
|
-
|
86
|
-
# Apply defaults, cleanup blanks and set @vars
|
87
|
-
def normalize_vars(vars)
|
88
|
-
@vars = DEFAULT.merge(vars.delete_if { |k, v| DEFAULT.key?(k) && (v.nil? || v == '') })
|
89
|
-
end
|
90
|
-
|
91
|
-
# Setup and validates the passed vars: var must be present and value.to_i must be >= to min
|
92
|
-
def setup_vars(name_min)
|
93
|
-
name_min.each do |name, min|
|
94
|
-
raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
|
95
|
-
unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
# Setup @items (overridden by the gearbox extra)
|
100
|
-
def setup_items_var
|
101
|
-
setup_vars(items: 1)
|
102
|
-
end
|
103
|
-
|
104
|
-
# Setup @offset (overridden by the gearbox extra)
|
105
|
-
def setup_offset_var
|
106
|
-
@offset = (@items * (@page - 1)) + @outset # may be already set from gear_box
|
107
|
-
end
|
108
|
-
|
109
|
-
# Setup @last (overridden by the gearbox extra)
|
110
|
-
def setup_last_var
|
111
|
-
@last = [(@count.to_f / @items).ceil, 1].max
|
112
|
-
@last = vars[:max_pages] if vars[:max_pages] && @last > vars[:max_pages]
|
113
|
-
end
|
114
|
-
alias setup_pages_var setup_last_var
|
115
102
|
end
|
116
103
|
|
117
|
-
require_relative 'pagy/extras/size' # will be opt in in v9.0
|
118
104
|
require_relative 'pagy/backend'
|
119
105
|
require_relative 'pagy/frontend'
|
120
106
|
require_relative 'pagy/exceptions'
|
data/locales/ar.yml
CHANGED
@@ -26,4 +26,4 @@ ar:
|
|
26
26
|
single_page: "عرض %{count} %{item_name}"
|
27
27
|
multiple_pages: "عرض %{item_name} %{from}-%{to} من اجمالي %{count}"
|
28
28
|
combo_nav_js: "الصفحة %{page_input} من %{pages}"
|
29
|
-
|
29
|
+
limit_selector_js: "عرض %{limit_input} %{item_name} لكل صفحة"
|
data/locales/be.yml
CHANGED
@@ -22,4 +22,4 @@ be:
|
|
22
22
|
single_page: "%{count} %{item_name}"
|
23
23
|
multiple_pages: "Усяго %{count} %{item_name}, паказаны з %{from} па %{to}"
|
24
24
|
combo_nav_js: "Старонка %{page_input} з %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Паказаць %{limit_input} %{item_name} на старонцы"
|
data/locales/bg.yml
CHANGED
@@ -18,4 +18,4 @@ bg:
|
|
18
18
|
single_page: "Показани са %{count} %{item_name}"
|
19
19
|
multiple_pages: "Показани са %{item_name} %{from}-%{to} от %{count} общо"
|
20
20
|
combo_nav_js: "Страница %{page_input} от %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Покажи %{limit_input} %{item_name} на страница"
|
data/locales/bs.yml
CHANGED
@@ -22,4 +22,4 @@ bs:
|
|
22
22
|
single_page: "Prikazuje se %{count} %{item_name}"
|
23
23
|
multiple_pages: "Prikaz %{item_name} %{from}-%{to} od %{count} ukupno"
|
24
24
|
combo_nav_js: "Stranica %{page_input} od %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Prikaži %{limit_input} %{item_name} po stranici"
|
data/locales/ca.yml
CHANGED
@@ -18,4 +18,4 @@ ca:
|
|
18
18
|
single_page: "Mostrant %{count} %{item_name}"
|
19
19
|
multiple_pages: "Mostrant %{item_name} %{from}-%{to} de %{count} en total"
|
20
20
|
combo_nav_js: "Pàgina %{page_input} de %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Mostra %{limit_input} %{item_name} per pàgina"
|
data/locales/ckb.yml
CHANGED
@@ -15,4 +15,4 @@ ckb:
|
|
15
15
|
single_page: "پیشاندانی %{count} %{item_name}"
|
16
16
|
multiple_pages: "پشاندانی %{item_name}ی %{from}-%{to} لە کۆی %{count} بە گشتی"
|
17
17
|
combo_nav_js: "پەڕی %{page_input} لە %{pages}"
|
18
|
-
|
18
|
+
limit_selector_js: "نیشاندانی %{limit_input} %{item_name} لە هەر پەڕێک"
|
data/locales/cs.yml
CHANGED
@@ -20,4 +20,4 @@ cs:
|
|
20
20
|
single_page: "Zobrazeno %{count} %{item_name}"
|
21
21
|
multiple_pages: "Zobrazeny položky %{from}-%{to} z %{count} celkem"
|
22
22
|
combo_nav_js: "Strana %{page_input} z %{pages}"
|
23
|
-
|
23
|
+
limit_selector_js: "Zobrazit %{limit_input} %{item_name} na stránce"
|
data/locales/da.yml
CHANGED
@@ -18,4 +18,4 @@ da:
|
|
18
18
|
single_page: "Viser %{count} %{item_name}"
|
19
19
|
multiple_pages: "Viser %{item_name} %{from}-%{to} af %{count} totalt"
|
20
20
|
combo_nav_js: "Side %{page_input} af %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Antal %{limit_input} %{item_name} per side"
|
data/locales/de.yml
CHANGED
@@ -18,4 +18,4 @@ de:
|
|
18
18
|
single_page: "Zeige %{count} %{item_name}"
|
19
19
|
multiple_pages: "Zeige %{item_name} %{from}-%{to} von %{count} gesamt"
|
20
20
|
combo_nav_js: "Seite %{page_input} von %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Zeige %{limit_input} %{item_name} pro Seite"
|
data/locales/dz.yml
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# :other pluralization (see https://github.com/ddnexus/pagy/blob/master/gem/lib/pagy/i18n.rb)
|
2
|
+
dz:
|
3
|
+
pagy:
|
4
|
+
aria_label:
|
5
|
+
nav: "ཤོག་ལེབ་"
|
6
|
+
prev: "སྔོན་མ་"
|
7
|
+
next: "ཤུལ༌མ་"
|
8
|
+
prev: "<"
|
9
|
+
next: ">"
|
10
|
+
gap: "…"
|
11
|
+
item_name: "རྣམ་གྲངས་"
|
12
|
+
info:
|
13
|
+
no_items: "%{item_name}གཅིག་ཡང་འཚོལ་མ་འཐོབ།"
|
14
|
+
single_page: "%{item_name} %{count} བཀྲམ་སྟོན་འབད་དོ།"
|
15
|
+
multiple_pages: "བསྡོམས་ཀྱིས་ %{count} ལས་%{item_name} %{from}-%{to} བཀྲམ་སྟོན་འབད་དོ།"
|
16
|
+
combo_nav_js: "ཤོག་ལེབ་ %{pages} ལས་ %{page_input}།"
|
17
|
+
limit_selector_js: "ཤོག་ལེབ་རེ་ལུ་%{item_name} %{limit_input} སྟོན།"
|
data/locales/en.yml
CHANGED
@@ -18,4 +18,4 @@ en:
|
|
18
18
|
single_page: "Displaying %{count} %{item_name}"
|
19
19
|
multiple_pages: "Displaying %{item_name} %{from}-%{to} of %{count} in total"
|
20
20
|
combo_nav_js: "Page %{page_input} of %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Show %{limit_input} %{item_name} per page"
|
data/locales/es.yml
CHANGED
@@ -18,4 +18,4 @@ es:
|
|
18
18
|
single_page: "Mostrando %{count} %{item_name}"
|
19
19
|
multiple_pages: "Mostrando %{item_name} %{from}-%{to} de %{count} en total"
|
20
20
|
combo_nav_js: "Página %{page_input} de %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
|
data/locales/fr.yml
CHANGED
@@ -18,4 +18,4 @@ fr:
|
|
18
18
|
single_page: "Affichage de %{count} %{item_name}"
|
19
19
|
multiple_pages: "Affichage des %{item_name} %{from} à %{to} sur %{count} au total"
|
20
20
|
combo_nav_js: "Page %{page_input} sur %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Afficher %{limit_input} %{item_name} par page"
|
data/locales/hr.yml
CHANGED
@@ -22,4 +22,4 @@ hr:
|
|
22
22
|
single_page: "Prikazuje se %{count} %{item_name}"
|
23
23
|
multiple_pages: "Prikaz %{item_name} %{from}-%{to} od %{count} ukupno"
|
24
24
|
combo_nav_js: "Stranica %{page_input} od %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Prikaži %{limit_input} %{item_name} po stranici"
|
data/locales/id.yml
CHANGED
@@ -16,4 +16,4 @@ id:
|
|
16
16
|
single_page: "Menampilkan %{count} %{item_name}"
|
17
17
|
multiple_pages: "Menampilkan %{item_name} %{from}-%{to} dari total %{count}"
|
18
18
|
combo_nav_js: "Halaman %{page_input} dari %{pages}"
|
19
|
-
|
19
|
+
limit_selector_js: "Tampilkan %{limit_input} %{item_name} per halaman"
|
data/locales/it.yml
CHANGED
@@ -18,4 +18,4 @@ it:
|
|
18
18
|
single_page: "Visualizzazione di %{count} %{item_name}"
|
19
19
|
multiple_pages: "Visualizzazione %{item_name} %{from}-%{to} di %{count} in totale"
|
20
20
|
combo_nav_js: "Pagina %{page_input} di %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Mostra %{limit_input} %{item_name} per pagina"
|
data/locales/ja.yml
CHANGED
data/locales/km.yml
CHANGED
@@ -16,4 +16,4 @@ km:
|
|
16
16
|
single_page: "បង្ហាញ %{count} %{item_name}"
|
17
17
|
multiple_pages: "បង្ហាញ %{item_name} %{from}-%{to} នៃ %{count} ជាចំនួនសរុប"
|
18
18
|
combo_nav_js: "ទំព័រ %{page_input} នៃ %{pages}"
|
19
|
-
|
19
|
+
limit_selector_js: "បង្ហាញ %{limit_input} %{item_name} ក្នុង ១ ទំព័រ"
|
data/locales/ko.yml
CHANGED
data/locales/nb.yml
CHANGED
@@ -18,4 +18,4 @@ nb:
|
|
18
18
|
single_page: "Viser %{count} %{item_name}"
|
19
19
|
multiple_pages: "Viser %{item_name} %{from}-%{to} av totalt %{count}"
|
20
20
|
combo_nav_js: "Side %{page_input} av %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Vis %{limit_input} %{item_name} per side"
|
data/locales/nl.yml
CHANGED
@@ -18,4 +18,4 @@ nl:
|
|
18
18
|
single_page: "Toont %{count} %{item_name}"
|
19
19
|
multiple_pages: "Toont %{from}-%{to} %{item_name} van %{count} in totaal"
|
20
20
|
combo_nav_js: "Pagina %{page_input} van %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Toont %{limit_input} %{item_name} per pagina"
|
data/locales/nn.yml
CHANGED
@@ -18,4 +18,4 @@ nn:
|
|
18
18
|
single_page: "Viser %{count} %{item_name}"
|
19
19
|
multiple_pages: "Viser %{item_name} %{from}-%{to} av totalt %{count}"
|
20
20
|
combo_nav_js: "Side %{page_input} av %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Vis %{limit_input} %{item_name} per side"
|
data/locales/pl.yml
CHANGED
@@ -22,4 +22,4 @@ pl:
|
|
22
22
|
single_page: "Wyświetlono %{count} %{item_name}"
|
23
23
|
multiple_pages: "Wyświetlono %{item_name} %{from}-%{to} z wszystkich %{count}"
|
24
24
|
combo_nav_js: "Strona %{page_input} z %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Pokaż %{limit_input} %{item_name} na stronie"
|
data/locales/pt-BR.yml
CHANGED
@@ -18,4 +18,4 @@ pt-BR:
|
|
18
18
|
single_page: "Mostrando %{count} %{item_name}"
|
19
19
|
multiple_pages: "Mostrando %{item_name} %{from}-%{to} do total de %{count}"
|
20
20
|
combo_nav_js: "Página %{page_input} de %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
|
data/locales/pt.yml
CHANGED
@@ -18,4 +18,4 @@ pt:
|
|
18
18
|
single_page: "Mostrando %{count} %{item_name}"
|
19
19
|
multiple_pages: "Mostrando %{item_name} %{from}-%{to} de um total de %{count}"
|
20
20
|
combo_nav_js: "Página %{page_input} de %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
|
data/locales/ru.yml
CHANGED
@@ -22,4 +22,4 @@ ru:
|
|
22
22
|
single_page: "%{count} %{item_name}"
|
23
23
|
multiple_pages: "Всего %{count} %{item_name}, показаны с %{from} по %{to}"
|
24
24
|
combo_nav_js: "Страница %{page_input} из %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Показать %{limit_input} %{item_name} на странице"
|
data/locales/sr.yml
CHANGED
@@ -22,4 +22,4 @@ sr:
|
|
22
22
|
single_page: "Приказује се %{count} %{item_name}"
|
23
23
|
multiple_pages: "Приказ %{item_name} %{from}-%{to} од %{count} укупно"
|
24
24
|
combo_nav_js: "Страниca %{page_input} од %{pages}"
|
25
|
-
|
25
|
+
limit_selector_js: "Прикажи %{limit_input} %{item_name} по страниcи"
|
data/locales/sv-SE.yml
CHANGED
@@ -18,4 +18,4 @@ sv-SE:
|
|
18
18
|
single_page: "Visar %{count} %{item_name}"
|
19
19
|
multiple_pages: "Visar %{item_name} %{from}-%{to} av %{count} totalt"
|
20
20
|
combo_nav_js: "Sida %{page_input} av %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Visa %{limit_input} %{item_name} per sida"
|
data/locales/sv.yml
CHANGED
@@ -18,4 +18,4 @@ sv:
|
|
18
18
|
single_page: "Visar %{count} %{item_name}"
|
19
19
|
multiple_pages: "Visar %{item_name} %{from}-%{to} av %{count} totalt"
|
20
20
|
combo_nav_js: "Sida %{page_input} av %{pages}"
|
21
|
-
|
21
|
+
limit_selector_js: "Visa %{limit_input} %{item_name} per sida"
|