pagy 5.1.3 → 5.2.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 +17 -5
- data/lib/javascripts/pagy.js +1 -1
- data/lib/pagy/calendar.rb +143 -0
- data/lib/pagy/countless.rb +1 -1
- data/lib/pagy/exceptions.rb +2 -4
- data/lib/pagy/extras/arel.rb +2 -1
- data/lib/pagy/extras/array.rb +2 -2
- data/lib/pagy/extras/bootstrap.rb +1 -1
- data/lib/pagy/extras/bulma.rb +1 -1
- data/lib/pagy/extras/calendar.rb +46 -0
- data/lib/pagy/extras/countless.rb +3 -2
- data/lib/pagy/extras/elasticsearch_rails.rb +3 -2
- data/lib/pagy/extras/foundation.rb +2 -2
- data/lib/pagy/extras/gearbox.rb +3 -3
- data/lib/pagy/extras/headers.rb +6 -4
- data/lib/pagy/extras/i18n.rb +1 -1
- data/lib/pagy/extras/items.rb +4 -1
- data/lib/pagy/extras/materialize.rb +1 -1
- data/lib/pagy/extras/meilisearch.rb +3 -2
- data/lib/pagy/extras/metadata.rb +3 -2
- data/lib/pagy/extras/navs.rb +1 -1
- data/lib/pagy/extras/overflow.rb +5 -3
- data/lib/pagy/extras/searchkick.rb +3 -2
- data/lib/pagy/extras/semantic.rb +4 -4
- data/lib/pagy/extras/shared.rb +1 -1
- data/lib/pagy/extras/standalone.rb +2 -1
- data/lib/pagy/extras/support.rb +2 -1
- data/lib/pagy/extras/trim.rb +2 -1
- data/lib/pagy/extras/uikit.rb +2 -2
- data/lib/pagy/frontend.rb +9 -4
- data/lib/pagy.rb +2 -2
- data/lib/templates/foundation_nav.html.erb +1 -1
- data/lib/templates/foundation_nav.html.haml +1 -1
- data/lib/templates/foundation_nav.html.slim +1 -1
- data/lib/templates/uikit_nav.html.erb +1 -1
- data/lib/templates/uikit_nav.html.haml +1 -1
- data/lib/templates/uikit_nav.html.slim +1 -1
- 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: 75bb34a884999d7ec40e067e8218a43c4d12193680014731a3c469c435370709
|
4
|
+
data.tar.gz: fcd39cc96ec420b6f2365b57ab3256559ec34cfbf72e0980cf555d60c5086122
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aab474d8a2780320e4c13f2a79e9c6dbbe82657bbc9bc75135902c7c9ee27e1a742cf415b9588a712e4629914decc7abdfbc4e2dca0fdbf0eaf3436ca6b4376
|
7
|
+
data.tar.gz: ae28683579224c8cfe7442fafef13e7f767e926d34f4e56d420efd234622f93758ec270a036d7b7e900a2e0a3637a3cdcf2f6e1cee6dbf945f1b593fc4291e9e
|
data/lib/config/pagy.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Pagy initializer file (5.
|
3
|
+
# Pagy initializer file (5.2.0)
|
4
4
|
# Customize only what you really need and notice that Pagy works also without any of the following lines.
|
5
5
|
# Should you just cherry pick part of this file, please maintain the require-order of the extras
|
6
6
|
|
7
7
|
|
8
|
-
# Pagy Variables
|
8
|
+
# Pagy DEFAULT Variables
|
9
9
|
# See https://ddnexus.github.io/pagy/api/pagy#variables
|
10
|
-
# All the Pagy::DEFAULT are set for all the Pagy instances but can be overridden
|
11
|
-
#
|
10
|
+
# All the Pagy::DEFAULT are set for all the Pagy instances but can be overridden per instance
|
11
|
+
# by just passing them to Pagy.new|Pagy::Countless.new|Pagy::Calendar.new or the #pagy controller method
|
12
12
|
|
13
13
|
|
14
14
|
# Instance variables
|
@@ -39,6 +39,18 @@
|
|
39
39
|
# See https://ddnexus.github.io/pagy/extras/array
|
40
40
|
# require 'pagy/extras/array'
|
41
41
|
|
42
|
+
# Calendar extra: Paginate a collection by calendar Time unit (year, month, week or day)
|
43
|
+
# See https://ddnexus.github.io/pagy/extras/calendar
|
44
|
+
# require 'pagy/extras/calendar'
|
45
|
+
# Pagy::DEFAULT[:local_minmax] = [] # Min and max local Time period must be set by the user (better not not as default)
|
46
|
+
# Pagy::DEFAULT[:unit] = :month # Time unit allowed %i[year month week day]
|
47
|
+
# Pagy::DEFAULT[:week_offset] = 0 # Day offset from Sunday (0: Sunday; 1: Monday;... 6: Saturday)
|
48
|
+
# Pagy::DEFAULT[:order] = :asc # Time direction of pagination
|
49
|
+
# Pagy::DEFAULT[:year_format] = '%Y' # strftime format for :year unit
|
50
|
+
# Pagy::DEFAULT[:month_format] = '%Y-%m' # strftime format for :month unit
|
51
|
+
# Pagy::DEFAULT[:week_format] = '%Y-%W' # strftime format for :week unit
|
52
|
+
# Pagy::DEFAULT[:day_format] = '%Y-%m-%d' # strftime format for :day unit
|
53
|
+
|
42
54
|
# Countless extra: Paginate without any count, saving one query per rendering
|
43
55
|
# See https://ddnexus.github.io/pagy/extras/countless
|
44
56
|
# require 'pagy/extras/countless'
|
@@ -72,7 +84,7 @@
|
|
72
84
|
# require 'pagy/extras/shared'
|
73
85
|
# require 'pagy/extras/metadata'
|
74
86
|
# For performance reason, you should explicitly set ONLY the metadata you use in the frontend
|
75
|
-
# Pagy::DEFAULT[:metadata] = [
|
87
|
+
# Pagy::DEFAULT[:metadata] = %i[scaffold_url count page prev next last] # example
|
76
88
|
|
77
89
|
# Searchkick extra: Paginate `Searchkick::Results` objects
|
78
90
|
# See https://ddnexus.github.io/pagy/extras/searchkick
|
data/lib/javascripts/pagy.js
CHANGED
@@ -0,0 +1,143 @@
|
|
1
|
+
# See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/calendar
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pagy'
|
5
|
+
require 'date'
|
6
|
+
|
7
|
+
class Pagy # :nodoc:
|
8
|
+
DEFAULT[:local_minmax] = [] # Min and max Time period must be set by the user
|
9
|
+
DEFAULT[:unit] = :month # Time unit allowed %i[year month week day]
|
10
|
+
DEFAULT[:week_offset] = 0 # Day offset from Sunday (0: Sunday; 1: Monday;... 6: Saturday)
|
11
|
+
DEFAULT[:order] = :asc # Time direction of pagination
|
12
|
+
DEFAULT[:year_format] = '%Y' # strftime format for :year unit
|
13
|
+
DEFAULT[:month_format] = '%Y-%m' # strftime format for :month unit
|
14
|
+
DEFAULT[:week_format] = '%Y-%W' # strftime format for :week unit
|
15
|
+
DEFAULT[:day_format] = '%Y-%m-%d' # strftime format for :day unit
|
16
|
+
|
17
|
+
# Paginate a Time period by units (year, month, week or day)
|
18
|
+
class Calendar < Pagy
|
19
|
+
attr_reader :utc_from, :utc_to, :unit, :week_offset, :order
|
20
|
+
attr_writer :count, :in
|
21
|
+
|
22
|
+
# Merge and validate the options, do some simple arithmetic and set a few instance variables
|
23
|
+
def initialize(vars) # rubocop:disable Lint/MissingSuper
|
24
|
+
normalize_vars(vars)
|
25
|
+
setup_vars(page: 1, week_offset: 0)
|
26
|
+
setup_unit_vars
|
27
|
+
raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
|
28
|
+
|
29
|
+
@prev = (@page - 1 unless @page == 1)
|
30
|
+
@next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
|
31
|
+
end
|
32
|
+
|
33
|
+
# Generate a label for each page, with the specific `Time` period it refers to
|
34
|
+
def page_label(num = @page)
|
35
|
+
snap = snap(num.to_i)
|
36
|
+
case @unit
|
37
|
+
when :year then new_time(@initial.year + snap)
|
38
|
+
when :month then bump_month(@initial, snap)
|
39
|
+
when :week then @initial + (snap * WEEK)
|
40
|
+
when :day then @initial + (snap * DAY)
|
41
|
+
else raise InternalError, "expected @unit to be in [:year, :month, :week, :day]; got #{@unit.inspect}"
|
42
|
+
end.strftime(@vars[:"#{@unit}_format"])
|
43
|
+
end
|
44
|
+
|
45
|
+
DAY = 60 * 60 * 24
|
46
|
+
WEEK = DAY * 7
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def setup_unit_vars
|
51
|
+
(units = %i[year month week day]).each do |unit|
|
52
|
+
raise VariableError.new(self, :format, 'to be a strftime format', @vars[:"#{unit}_format"]) \
|
53
|
+
unless @vars[:"#{unit}_format"].is_a?(String)
|
54
|
+
end
|
55
|
+
raise VariableError.new(self, :unit, "to be in #{units.inspect}", @unit) \
|
56
|
+
unless units.include?(@unit = @vars[:unit])
|
57
|
+
raise VariableError.new(self, :order, 'to be in [:asc, :desc]', @order) \
|
58
|
+
unless %i[asc desc].include?(@order = @vars[:order])
|
59
|
+
|
60
|
+
min, max = @vars[:local_minmax]
|
61
|
+
raise VariableError.new(self, :local_minmax, 'to be a an Array of min and max local Time instances', @vars[:local_minmax]) \
|
62
|
+
unless min.is_a?(Time) && max.is_a?(Time) && !min.utc? && !min.utc? && min <= max \
|
63
|
+
&& (@utc_offset = min.utc_offset) == max.utc_offset
|
64
|
+
|
65
|
+
send :"setup_#{@unit}_vars", min, max
|
66
|
+
end
|
67
|
+
|
68
|
+
# IMPORTANT: all the Time objects created and passed as arguments MUST be local!
|
69
|
+
|
70
|
+
# @initial: beginning of the first day of the period that encloses the min local time
|
71
|
+
# @final: beginning of the first day of the NEXT period AFTER the period that encloses the max local time
|
72
|
+
# @utc_from: beginning of the first day of the period of the current page as UTC time
|
73
|
+
# @utc_to: beginning of the first day of the NEXT period AFTER the current page as UTC time
|
74
|
+
|
75
|
+
# Setup the calendar vars when the unit is :year
|
76
|
+
def setup_year_vars(min, max)
|
77
|
+
@initial = new_time(min.year)
|
78
|
+
@final = new_time(max.year + 1)
|
79
|
+
@pages = @last = @final.year - @initial.year
|
80
|
+
@utc_from = new_time(@initial.year + snap).utc
|
81
|
+
@utc_to = new_time(@initial.year + snap + 1).utc
|
82
|
+
end
|
83
|
+
|
84
|
+
# Setup the calendar vars when the unit is :month
|
85
|
+
def setup_month_vars(min, max)
|
86
|
+
@initial = new_time(min.year, min.month)
|
87
|
+
@final = bump_month(max)
|
88
|
+
@pages = @last = months(@final) - months(@initial)
|
89
|
+
@utc_from = bump_month(@initial, snap).utc
|
90
|
+
@utc_to = bump_month(@initial, snap + 1).utc
|
91
|
+
end
|
92
|
+
|
93
|
+
# Setup the calendar vars when the unit is :week
|
94
|
+
def setup_week_vars(min, max)
|
95
|
+
@initial = week_start(min)
|
96
|
+
@final = week_start(max) + WEEK
|
97
|
+
@pages = @last = (@final - @initial).to_i / WEEK
|
98
|
+
@utc_from = (@initial + (snap * WEEK)).utc
|
99
|
+
@utc_to = @utc_from + WEEK
|
100
|
+
end
|
101
|
+
|
102
|
+
# Setup the calendar vars when the unit is :day
|
103
|
+
def setup_day_vars(min, max)
|
104
|
+
@initial = new_time(min.year, min.month, min.day)
|
105
|
+
@final = new_time(max.year, max.month, max.day) + DAY
|
106
|
+
@pages = @last = (@final - @initial).to_i / DAY
|
107
|
+
@utc_from = (@initial + (snap * DAY)).utc
|
108
|
+
@utc_to = @utc_from + DAY
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
# Simple trick to snap the page into its ordered position,
|
114
|
+
# without actually reordering anything in the internal structure
|
115
|
+
def snap(page = @page)
|
116
|
+
@order == :asc ? page - 1 : @pages - page
|
117
|
+
end
|
118
|
+
|
119
|
+
# Create a new local time at the beginning of the day
|
120
|
+
def new_time(year, month = 1, day = 1)
|
121
|
+
Time.new(year, month, day, 0, 0, 0, @utc_offset)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Months in local time
|
125
|
+
def months(time)
|
126
|
+
(time.year * 12) + time.month
|
127
|
+
end
|
128
|
+
|
129
|
+
# Add 1 or more months to local time
|
130
|
+
def bump_month(time, months = 1)
|
131
|
+
months += months(time)
|
132
|
+
year = months / 12
|
133
|
+
month = months % 12
|
134
|
+
month.zero? ? new_time(year - 1, 12) : new_time(year, month)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Return the start of the week for local time
|
138
|
+
def week_start(time)
|
139
|
+
start = time - (((time.wday - @week_offset) * DAY) % WEEK)
|
140
|
+
new_time(start.year, start.month, start.day)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/lib/pagy/countless.rb
CHANGED
@@ -16,7 +16,7 @@ class Pagy
|
|
16
16
|
|
17
17
|
# Finalize the instance variables based on the fetched size
|
18
18
|
def finalize(fetched_size)
|
19
|
-
raise OverflowError.new(self, :page, "to be < #{@page}") if fetched_size.zero? && @page > 1
|
19
|
+
raise OverflowError.new(self, :page, "to be < #{@page}", @page) if fetched_size.zero? && @page > 1
|
20
20
|
|
21
21
|
@pages = @last = (fetched_size > @items ? @page + 1 : @page)
|
22
22
|
@in = [fetched_size, @items].min
|
data/lib/pagy/exceptions.rb
CHANGED
@@ -6,13 +6,11 @@ class Pagy
|
|
6
6
|
attr_reader :pagy, :variable, :value
|
7
7
|
|
8
8
|
# Set the variables and prepare the message
|
9
|
-
def initialize(pagy, variable, description, value
|
9
|
+
def initialize(pagy, variable, description, value)
|
10
10
|
@pagy = pagy
|
11
11
|
@variable = variable
|
12
12
|
@value = value
|
13
|
-
|
14
|
-
message << "; got #{@value.inspect}" if value
|
15
|
-
super message
|
13
|
+
super "expected :#{@variable} #{description}; got #{@value.inspect}"
|
16
14
|
end
|
17
15
|
end
|
18
16
|
|
data/lib/pagy/extras/arel.rb
CHANGED
data/lib/pagy/extras/array.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/array
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
5
|
-
#
|
4
|
+
class Pagy # :nodoc:
|
5
|
+
# Paginate arrays efficiently, avoiding expensive array-wrapping and without overriding
|
6
6
|
module ArrayExtra
|
7
7
|
private
|
8
8
|
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/calendar
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'pagy/calendar'
|
5
|
+
|
6
|
+
class Pagy # :nodoc:
|
7
|
+
# Paginate based on calendar periods (year month week day)
|
8
|
+
module CalendarExtra
|
9
|
+
# Additions for the Backend module
|
10
|
+
module Backend
|
11
|
+
private
|
12
|
+
|
13
|
+
# Return Pagy object and items
|
14
|
+
def pagy_calendar(collection, vars = {})
|
15
|
+
pagy = Calendar.new(pagy_calendar_get_vars(collection, vars))
|
16
|
+
[pagy, pagy_calendar_get_items(collection, pagy)]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sub-method called only by #pagy_calendar: here for easy customization of variables by overriding.
|
20
|
+
# You may want to override it in order to implement the dynamic set of the :minmax variable.
|
21
|
+
def pagy_calendar_get_vars(_collection, vars)
|
22
|
+
# vars[:minmax] ||= your_own_method_to_get_the_period_from(collection)
|
23
|
+
vars[:page] ||= params[vars[:page_param] || DEFAULT[:page_param]]
|
24
|
+
vars
|
25
|
+
end
|
26
|
+
|
27
|
+
# This method should be implemented in the application and should return the records
|
28
|
+
# for the unit by selecting the records with DateTime from pagy.from to pagy.to
|
29
|
+
def pagy_calendar_get_items(_collection, _pagy)
|
30
|
+
# collection.your_own_method_to_get_the_items_with(pagy.from, pagy.to)
|
31
|
+
raise NoMethodError, 'The pagy_calendar_get_items method must be implemented in the application and must return ' \
|
32
|
+
'the items for the unit by selecting the records with Time from pagy.from to pagy.to'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Additions for the Frontend module
|
37
|
+
module Frontend
|
38
|
+
# Change the text shown in the nav bar links to the actual unit of each page.
|
39
|
+
def pagy_labeler(pagy, num)
|
40
|
+
pagy.is_a?(Calendar) ? pagy.page_label(num) : num
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
Backend.prepend CalendarExtra::Backend
|
45
|
+
Frontend.prepend CalendarExtra::Frontend
|
46
|
+
end
|
@@ -3,15 +3,16 @@
|
|
3
3
|
|
4
4
|
require 'pagy/countless'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
DEFAULT[:countless_minimal] = false
|
8
8
|
|
9
|
+
# Paginate without the need of any count, saving one query per rendering
|
9
10
|
module CountlessExtra
|
10
11
|
private
|
11
12
|
|
12
13
|
# Return Pagy object and items
|
13
14
|
def pagy_countless(collection, vars = {})
|
14
|
-
pagy =
|
15
|
+
pagy = Countless.new(pagy_countless_get_vars(collection, vars))
|
15
16
|
[pagy, pagy_countless_get_items(collection, pagy)]
|
16
17
|
end
|
17
18
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/elasticsearch_rails
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
5
|
DEFAULT[:elasticsearch_rails_search_method] ||= :pagy_search
|
6
6
|
|
7
|
+
# Paginate ElasticsearchRails response objects
|
7
8
|
module ElasticsearchRailsExtra
|
8
9
|
module_function
|
9
10
|
|
@@ -17,7 +18,7 @@ class Pagy
|
|
17
18
|
total.is_a?(Hash) ? total['value'] : total
|
18
19
|
end
|
19
20
|
|
20
|
-
module ElasticsearchRails
|
21
|
+
module ElasticsearchRails # :nodoc:
|
21
22
|
# Return an array used to delay the call of #search
|
22
23
|
# after the pagination variables are merged to the options.
|
23
24
|
# It also pushes to the same array an optional method call.
|
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
# Frontend modules are specially optimized for performance.
|
8
8
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
9
|
module FoundationExtra
|
@@ -17,7 +17,7 @@ class Pagy
|
|
17
17
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
18
18
|
html << case item
|
19
19
|
when Integer then %(<li>#{link.call item}</li>) # page link
|
20
|
-
when String then %(<li class="current">#{item}</li>) # active page
|
20
|
+
when String then %(<li class="current">#{pagy_labeler(pagy, item)}</li>) # active page
|
21
21
|
when :gap then %(<li class="ellipsis gap" aria-hidden="true"></li>) # page gap
|
22
22
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
23
23
|
end
|
data/lib/pagy/extras/gearbox.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/gearbox
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
5
|
DEFAULT[:gearbox_extra] = true # extra enabled by default
|
6
6
|
DEFAULT[:gearbox_items] = [15, 30, 60, 100]
|
7
7
|
|
8
8
|
# Automatically change the number of items per page depending on the page number
|
9
9
|
# accepts an array as the :gearbox_items variable, that will determine the items for the first pages
|
10
10
|
module GearboxExtra
|
11
|
-
# Setup @items based on the :
|
11
|
+
# Setup @items based on the :gearbox_items variable
|
12
12
|
def setup_items_var
|
13
13
|
return super if !@vars[:gearbox_extra] || @vars[:items_extra]
|
14
14
|
|
@@ -19,7 +19,7 @@ class Pagy
|
|
19
19
|
@items = gearbox_items[@page - 1] || gearbox_items.last
|
20
20
|
end
|
21
21
|
|
22
|
-
# Setup @pages and @last based on the :
|
22
|
+
# Setup @pages and @last based on the :gearbox_items variable
|
23
23
|
def setup_pages_var
|
24
24
|
return super if !@vars[:gearbox_extra] || @vars[:items_extra]
|
25
25
|
|
data/lib/pagy/extras/headers.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'pagy/url_helpers'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
DEFAULT[:headers] = { page: 'Current-Page',
|
8
8
|
items: 'Page-Items',
|
9
9
|
count: 'Total-Count',
|
@@ -38,11 +38,13 @@ class Pagy
|
|
38
38
|
end.compact.to_h
|
39
39
|
hash = { 'Link' => link }
|
40
40
|
headers = pagy.vars[:headers]
|
41
|
-
hash[headers[:page]] = pagy.page.to_s
|
42
|
-
|
41
|
+
hash[headers[:page]] = pagy.page.to_s if headers[:page]
|
42
|
+
if headers[:items] && !(defined?(Pagy::Calendar) && pagy.is_a?(Pagy::Calendar)) # not for Calendar
|
43
|
+
hash[headers[:items]] = pagy.vars[:items].to_s
|
44
|
+
end
|
43
45
|
unless countless
|
44
46
|
hash[headers[:pages]] = pagy.pages.to_s if headers[:pages]
|
45
|
-
hash[headers[:count]] = pagy.count.to_s if headers[:count]
|
47
|
+
hash[headers[:count]] = pagy.count.to_s if pagy.count && headers[:count] # count may be nil with Calendar
|
46
48
|
end
|
47
49
|
hash
|
48
50
|
end
|
data/lib/pagy/extras/i18n.rb
CHANGED
data/lib/pagy/extras/items.rb
CHANGED
@@ -3,12 +3,14 @@
|
|
3
3
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
DEFAULT[:items_param] = :items
|
8
8
|
DEFAULT[:max_items] = 100
|
9
9
|
DEFAULT[:items_extra] = true # extra enabled by default
|
10
10
|
|
11
|
+
# Allow the client to request a custom number of items per page with an optional selector UI
|
11
12
|
module ItemsExtra
|
13
|
+
# Additions for the Backend module
|
12
14
|
module Backend
|
13
15
|
private
|
14
16
|
|
@@ -22,6 +24,7 @@ class Pagy # Default variables for this extra
|
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
27
|
+
# Additions for the Frontend module
|
25
28
|
module Frontend
|
26
29
|
ITEMS_PLACEHOLDER = '__pagy_items__'
|
27
30
|
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
class Pagy
|
3
|
+
class Pagy # :nodoc:
|
4
4
|
DEFAULT[:meilisearch_search_method] ||= :pagy_search
|
5
5
|
|
6
|
+
# Paginate Meilisearch results
|
6
7
|
module MeilisearchExtra
|
7
|
-
module Meilisearch
|
8
|
+
module Meilisearch # :nodoc:
|
8
9
|
# Return an array used to delay the call of #search
|
9
10
|
# after the pagination variables are merged to the options
|
10
11
|
def pagy_meilisearch(term = nil, **vars)
|
data/lib/pagy/extras/metadata.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'pagy/url_helpers'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
DEFAULT[:metadata] = %i[ scaffold_url first_url prev_url page_url next_url last_url
|
8
8
|
count page items vars pages last in from to prev next series ]
|
9
9
|
|
@@ -17,7 +17,8 @@ class Pagy
|
|
17
17
|
def pagy_metadata(pagy, absolute: nil)
|
18
18
|
scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
|
19
19
|
{}.tap do |metadata|
|
20
|
-
pagy.vars[:metadata]
|
20
|
+
keys = pagy.is_a?(Calendar) ? pagy.vars[:metadata] - %i[count items] : pagy.vars[:metadata]
|
21
|
+
keys.each do |key|
|
21
22
|
metadata[key] = case key
|
22
23
|
when :scaffold_url then scaffold_url
|
23
24
|
when :first_url then scaffold_url.sub(PAGE_PLACEHOLDER, 1.to_s)
|
data/lib/pagy/extras/navs.rb
CHANGED
data/lib/pagy/extras/overflow.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/overflow
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
5
|
DEFAULT[:overflow] = :empty_page
|
6
6
|
|
7
7
|
# Handles OverflowError exceptions with different options
|
@@ -27,7 +27,8 @@ class Pagy
|
|
27
27
|
initialize vars.merge!(page: @last) # re-run with the last page
|
28
28
|
@vars[:page] = initial_page # restore the initial page
|
29
29
|
when :empty_page
|
30
|
-
@offset = @
|
30
|
+
@offset = @in = @from = @to = 0 # vars relative to the actual page
|
31
|
+
@utc_from = @utc_to = @final # calendar variables out of local_minmax
|
31
32
|
@prev = @last # prev relative to the actual page
|
32
33
|
extend Series # special series for :empty_page
|
33
34
|
else
|
@@ -59,7 +60,7 @@ class Pagy
|
|
59
60
|
when :exception
|
60
61
|
raise # same as without the extra
|
61
62
|
when :empty_page
|
62
|
-
@offset = @
|
63
|
+
@offset = @in = @from = @to = 0 # vars relative to the actual page
|
63
64
|
@vars[:size] = [] # no page in the series
|
64
65
|
self
|
65
66
|
else
|
@@ -69,5 +70,6 @@ class Pagy
|
|
69
70
|
end
|
70
71
|
end
|
71
72
|
prepend OverflowExtra::Pagy
|
73
|
+
Calendar.prepend OverflowExtra::Pagy if defined?(Calendar)
|
72
74
|
Countless.prepend OverflowExtra::Countless if defined?(Countless)
|
73
75
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/searchkick
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
5
|
DEFAULT[:searchkick_search_method] ||= :pagy_search
|
6
6
|
|
7
|
+
# Paginate Searchkick::Results objects
|
7
8
|
module SearchkickExtra
|
8
|
-
module Searchkick
|
9
|
+
module Searchkick # :nodoc:
|
9
10
|
# Return an array used to delay the call of #search
|
10
11
|
# after the pagination variables are merged to the options.
|
11
12
|
# It also pushes to the same array an optional method call.
|
data/lib/pagy/extras/semantic.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
# Frontend modules are specially optimized for performance.
|
8
8
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
9
|
module SemanticExtra
|
@@ -16,9 +16,9 @@ class Pagy
|
|
16
16
|
html << pagy_semantic_prev_html(pagy, link)
|
17
17
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
18
18
|
html << case item
|
19
|
-
when Integer then link.call item
|
20
|
-
when String then %(<a class="item active">#{item}</a>)
|
21
|
-
when :gap then %(<div class="disabled item">#{pagy_t 'pagy.nav.gap'}</div>)
|
19
|
+
when Integer then link.call item
|
20
|
+
when String then %(<a class="item active">#{pagy_labeler(pagy, item)}</a>)
|
21
|
+
when :gap then %(<div class="disabled item">#{pagy_t 'pagy.nav.gap'}</div>)
|
22
22
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
23
23
|
end
|
24
24
|
end
|
data/lib/pagy/extras/shared.rb
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'uri'
|
5
|
-
|
5
|
+
|
6
|
+
class Pagy # :nodoc:
|
6
7
|
# Use pagy without any request object, nor Rack environment/gem, nor any defined params method,
|
7
8
|
# even in the irb/rails console without any app or config.
|
8
9
|
module StandaloneExtra
|
data/lib/pagy/extras/support.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/support
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
|
+
# Extra support for features like: incremental, auto-incremental and infinite pagination
|
5
6
|
module SupportExtra
|
6
7
|
# Return the previous page URL string or nil
|
7
8
|
def pagy_prev_url(pagy)
|
data/lib/pagy/extras/trim.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/trim
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
5
5
|
DEFAULT[:trim_extra] = true # extra enabled by default
|
6
6
|
|
7
|
+
# Remove the page=1 param from the first page link
|
7
8
|
module TrimExtra
|
8
9
|
# Override the original pagy_link_proc.
|
9
10
|
# Call the pagy_trim method if the trim_extra is enabled.
|
data/lib/pagy/extras/uikit.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
require 'pagy/extras/shared'
|
5
5
|
|
6
|
-
class Pagy
|
6
|
+
class Pagy # :nodoc:
|
7
7
|
# Frontend modules are specially optimized for performance.
|
8
8
|
# The resulting code may not look very elegant, but produces the best benchmarks
|
9
9
|
module UikitExtra
|
@@ -16,7 +16,7 @@ class Pagy
|
|
16
16
|
pagy.series.each do |item|
|
17
17
|
html << case item
|
18
18
|
when Integer then %(<li>#{link.call item}</li>)
|
19
|
-
when String then %(<li class="uk-active"><span>#{item}</span></li>)
|
19
|
+
when String then %(<li class="uk-active"><span>#{pagy_labeler(pagy, item)}</span></li>)
|
20
20
|
when :gap then %(<li class="uk-disabled"><span>#{pagy_t 'pagy.nav.gap'}</span></li>)
|
21
21
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
22
22
|
end
|
data/lib/pagy/frontend.rb
CHANGED
@@ -28,9 +28,9 @@ class Pagy
|
|
28
28
|
end
|
29
29
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
30
30
|
html << case item
|
31
|
-
when Integer then %(<span class="page">#{link.call item}</span> )
|
32
|
-
when String then %(<span class="page active">#{item}</span> )
|
33
|
-
when :gap then %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> )
|
31
|
+
when Integer then %(<span class="page">#{link.call item}</span> )
|
32
|
+
when String then %(<span class="page active">#{pagy_labeler(pagy, item)}</span> )
|
33
|
+
when :gap then %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> )
|
34
34
|
else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
|
35
35
|
end
|
36
36
|
end
|
@@ -64,7 +64,7 @@ class Pagy
|
|
64
64
|
p_next = pagy.next
|
65
65
|
left, right = %(<a href="#{pagy_url_for pagy, PAGE_PLACEHOLDER}" #{
|
66
66
|
pagy.vars[:link_extra]} #{link_extra}).split(PAGE_PLACEHOLDER, 2)
|
67
|
-
lambda do |num, text = num, extra_attrs = ''|
|
67
|
+
lambda do |num, text = pagy_labeler(pagy, num), extra_attrs = ''|
|
68
68
|
%(#{left}#{num}#{right}#{ case num
|
69
69
|
when p_prev then ' rel="prev"'
|
70
70
|
when p_next then ' rel="next"'
|
@@ -73,6 +73,11 @@ class Pagy
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
# Allow customization of the output by overriding (used by the calendar extra)
|
77
|
+
def pagy_labeler(_pagy, num)
|
78
|
+
num
|
79
|
+
end
|
80
|
+
|
76
81
|
# Similar to I18n.t: just ~18x faster using ~10x less memory
|
77
82
|
# (@pagy_locale explicitly initialized in order to avoid warning)
|
78
83
|
def pagy_t(key, **opts)
|
data/lib/pagy.rb
CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
|
|
5
5
|
|
6
6
|
# Core class
|
7
7
|
class Pagy
|
8
|
-
VERSION = '5.
|
8
|
+
VERSION = '5.2.0'
|
9
9
|
|
10
10
|
# Root pathname to get the path of Pagy files like templates or dictionaries
|
11
11
|
def self.root
|
@@ -46,7 +46,7 @@ class Pagy
|
|
46
46
|
def series(size = @vars[:size])
|
47
47
|
return [] if size.empty?
|
48
48
|
raise VariableError.new(self, :size, 'to contain 4 items >= 0', size) \
|
49
|
-
unless size.size == 4 && size.all? { |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
|
49
|
+
unless size.is_a?(Array) && size.size == 4 && size.all? { |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
|
50
50
|
|
51
51
|
# This algorithm is up to ~5x faster and ~2.3x lighter than the previous one (pagy < 4.3)
|
52
52
|
left_gap_start = 1 + size[0] # rubocop:disable Layout/ExtraSpacing, Layout/SpaceAroundOperators
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<% end -%>
|
14
14
|
<% pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36] -%>
|
15
15
|
<% if item.is_a?(Integer) -%> <li><%== link.call(item) %></li>
|
16
|
-
<% elsif item.is_a?(String) -%> <li class="current"><%= item %></li>
|
16
|
+
<% elsif item.is_a?(String) -%> <li class="current"><%= pagy_labeler(pagy, item) %></li>
|
17
17
|
<% elsif item == :gap -%> <li class="ellipsis gap" aria-hidden="true"></li>
|
18
18
|
<% end -%>
|
19
19
|
<% end -%>
|
@@ -5,7 +5,7 @@
|
|
5
5
|
<% end -%>
|
6
6
|
<% pagy.series.each do |item| -%>
|
7
7
|
<% if item.is_a?(Integer) -%> <li><%== link.call(item) %></li>
|
8
|
-
<% elsif item.is_a?(String) -%> <li class="uk-active"><span><%== item %></span></li>
|
8
|
+
<% elsif item.is_a?(String) -%> <li class="uk-active"><span><%== pagy_labeler(pagy, item) %></span></li>
|
9
9
|
<% elsif item == :gap -%> <li class="uk-disabled"><span><%== pagy_t('pagy.nav.gap') %></span></li>
|
10
10
|
<% end -%>
|
11
11
|
<% 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: 5.
|
4
|
+
version: 5.2.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: 2021-
|
11
|
+
date: 2021-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Agnostic pagination in plain ruby. It does it all. Better.
|
14
14
|
email:
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- lib/locales/zh-TW.yml
|
54
54
|
- lib/pagy.rb
|
55
55
|
- lib/pagy/backend.rb
|
56
|
+
- lib/pagy/calendar.rb
|
56
57
|
- lib/pagy/console.rb
|
57
58
|
- lib/pagy/countless.rb
|
58
59
|
- lib/pagy/exceptions.rb
|
@@ -60,6 +61,7 @@ files:
|
|
60
61
|
- lib/pagy/extras/array.rb
|
61
62
|
- lib/pagy/extras/bootstrap.rb
|
62
63
|
- lib/pagy/extras/bulma.rb
|
64
|
+
- lib/pagy/extras/calendar.rb
|
63
65
|
- lib/pagy/extras/countless.rb
|
64
66
|
- lib/pagy/extras/elasticsearch_rails.rb
|
65
67
|
- lib/pagy/extras/foundation.rb
|