pagy 8.0.0 → 9.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/apps/calendar.ru +745 -0
- data/{lib/apps → apps}/demo.ru +35 -52
- data/apps/keyset_ar.ru +236 -0
- data/apps/keyset_s.ru +238 -0
- data/{lib/apps → apps}/rails.ru +40 -33
- data/{lib/apps → apps}/repro.ru +33 -24
- 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 +1 -0
- data/apps/tmp/pagy-keyset-ar.sqlite3 +0 -0
- data/apps/tmp/pagy-keyset-ar.sqlite3-shm +0 -0
- data/apps/tmp/pagy-keyset-ar.sqlite3-wal +0 -0
- data/apps/tmp/pagy-keyset-s.sqlite3 +0 -0
- data/{lib/bin → bin}/pagy +36 -17
- data/{lib/config → config}/pagy.rb +37 -68
- data/javascripts/pagy-module.js +100 -0
- data/javascripts/pagy.js +4 -0
- data/javascripts/pagy.min.js +4 -0
- data/javascripts/pagy.min.js.map +10 -0
- data/javascripts/pagy.mjs +100 -0
- data/lib/optimist.rb +1 -1
- data/lib/pagy/b64.rb +33 -0
- data/lib/pagy/backend.rb +24 -15
- data/lib/pagy/calendar/day.rb +5 -4
- data/lib/pagy/calendar/month.rb +5 -4
- data/lib/pagy/calendar/quarter.rb +5 -4
- data/lib/pagy/calendar/unit.rb +103 -0
- data/lib/pagy/calendar/week.rb +4 -4
- data/lib/pagy/calendar/year.rb +5 -4
- data/lib/pagy/calendar.rb +55 -99
- data/lib/pagy/console.rb +2 -2
- data/lib/pagy/countless.rb +17 -16
- data/lib/pagy/extras/arel.rb +8 -10
- data/lib/pagy/extras/array.rb +4 -6
- data/lib/pagy/extras/bootstrap.rb +7 -7
- data/lib/pagy/extras/bulma.rb +13 -9
- data/lib/pagy/extras/calendar.rb +35 -6
- data/lib/pagy/extras/countless.rb +7 -14
- data/lib/pagy/extras/elasticsearch_rails.rb +15 -15
- data/lib/pagy/extras/gearbox.rb +36 -35
- data/lib/pagy/extras/headers.rb +26 -25
- data/lib/pagy/extras/i18n.rb +1 -1
- data/lib/pagy/extras/js_tools.rb +12 -9
- data/lib/pagy/extras/jsonapi.rb +27 -17
- data/lib/pagy/extras/keyset.rb +26 -0
- data/lib/pagy/extras/limit.rb +63 -0
- data/lib/pagy/extras/meilisearch.rb +11 -11
- data/lib/pagy/extras/metadata.rb +7 -3
- data/lib/pagy/extras/overflow.rb +9 -8
- data/lib/pagy/extras/pagy.rb +18 -18
- data/lib/pagy/extras/searchkick.rb +11 -11
- data/lib/pagy/extras/size.rb +40 -0
- data/lib/pagy/extras/standalone.rb +8 -8
- data/lib/pagy/extras/trim.rb +3 -3
- data/lib/pagy/frontend.rb +39 -37
- data/lib/pagy/i18n.rb +1 -1
- data/lib/pagy/keyset/active_record.rb +38 -0
- data/lib/pagy/keyset/sequel.rb +51 -0
- data/lib/pagy/keyset.rb +99 -0
- data/lib/pagy/url_helpers.rb +11 -11
- data/lib/pagy.rb +96 -120
- data/{lib/locales → locales}/ar.yml +9 -10
- data/{lib/locales → locales}/be.yml +2 -2
- data/{lib/locales → locales}/bg.yml +2 -2
- data/{lib/locales → locales}/bs.yml +2 -2
- data/{lib/locales → locales}/ca.yml +5 -7
- data/{lib/locales → locales}/ckb.yml +2 -2
- data/{lib/locales → locales}/cs.yml +2 -2
- data/{lib/locales → locales}/da.yml +5 -7
- data/{lib/locales → locales}/de.yml +2 -2
- data/{lib/locales → locales}/en.yml +2 -2
- data/{lib/locales → locales}/es.yml +2 -2
- data/{lib/locales → locales}/fr.yml +2 -2
- data/{lib/locales → locales}/hr.yml +2 -2
- data/{lib/locales → locales}/id.yml +2 -2
- data/{lib/locales → locales}/it.yml +2 -2
- data/{lib/locales → locales}/ja.yml +2 -2
- data/{lib/locales → locales}/km.yml +2 -2
- data/{lib/locales → locales}/ko.yml +3 -5
- data/{lib/locales → locales}/nb.yml +2 -2
- data/{lib/locales → locales}/nl.yml +2 -2
- data/{lib/locales → locales}/nn.yml +2 -2
- data/{lib/locales → locales}/pl.yml +2 -2
- data/{lib/locales → locales}/pt-BR.yml +2 -2
- data/{lib/locales → locales}/pt.yml +2 -2
- data/{lib/locales → locales}/ru.yml +7 -9
- data/{lib/locales → locales}/sr.yml +2 -2
- data/{lib/locales → locales}/sv-SE.yml +2 -2
- data/{lib/locales → locales}/sv.yml +2 -2
- data/{lib/locales → locales}/sw.yml +2 -2
- data/{lib/locales → locales}/ta.yml +2 -2
- data/{lib/locales → locales}/tr.yml +2 -2
- data/{lib/locales → locales}/uk.yml +2 -2
- data/{lib/locales → locales}/vi.yml +2 -2
- data/{lib/locales → locales}/zh-CN.yml +2 -2
- data/{lib/locales → locales}/zh-HK.yml +2 -2
- data/{lib/locales → locales}/zh-TW.yml +2 -2
- data/pkg/pagy-9.0.0.gem +0 -0
- metadata +75 -70
- data/lib/apps/calendar.ru +0 -2196
- data/lib/javascripts/pagy-dev.js +0 -112
- data/lib/javascripts/pagy-module.js +0 -111
- data/lib/javascripts/pagy.js +0 -1
- data/lib/pagy/calendar/helper.rb +0 -65
- data/lib/pagy/extras/foundation.rb +0 -93
- data/lib/pagy/extras/items.rb +0 -64
- data/lib/pagy/extras/materialize.rb +0 -97
- data/lib/pagy/extras/semantic.rb +0 -91
- data/lib/pagy/extras/uikit.rb +0 -96
- /data/{lib/javascripts/pagy-module.d.ts → javascripts/pagy.d.ts} +0 -0
- /data/{lib/stylesheets → stylesheets}/pagy.css +0 -0
- /data/{lib/stylesheets → stylesheets}/pagy.scss +0 -0
- /data/{lib/stylesheets → stylesheets}/pagy.tailwind.css +0 -0
data/lib/pagy/calendar.rb
CHANGED
@@ -1,123 +1,79 @@
|
|
1
1
|
# See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/docs/api/calendar
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
require 'active_support/core_ext/date_and_time/calculations'
|
7
|
-
require 'active_support/core_ext/numeric/time'
|
8
|
-
require 'active_support/core_ext/integer/time'
|
9
|
-
|
10
|
-
require 'pagy'
|
4
|
+
require_relative '../pagy'
|
5
|
+
require_relative 'calendar/unit'
|
11
6
|
|
12
7
|
class Pagy # :nodoc:
|
13
|
-
#
|
14
|
-
class Calendar <
|
8
|
+
# Calendar class
|
9
|
+
class Calendar < Hash
|
15
10
|
# Specific out of range error
|
16
11
|
class OutOfRangeError < VariableError; end
|
17
12
|
|
18
13
|
# List of units in desc order of duration. It can be used for custom units.
|
19
14
|
UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant
|
20
15
|
|
21
|
-
|
22
|
-
|
23
|
-
# Merge and validate the options, do some simple arithmetic and set a few instance variables
|
24
|
-
def initialize(vars) # rubocop:disable Lint/MissingSuper
|
25
|
-
raise InternalError, 'Pagy::Calendar is a base class; use one of its subclasses' if instance_of?(Pagy::Calendar)
|
26
|
-
|
27
|
-
vars = self.class::DEFAULT.merge(vars) # subclass specific default
|
28
|
-
normalize_vars(vars) # general default
|
29
|
-
setup_vars(page: 1)
|
30
|
-
setup_unit_vars
|
31
|
-
setup_params_var
|
32
|
-
raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
|
33
|
-
|
34
|
-
@prev = (@page - 1 unless @page == 1)
|
35
|
-
@next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
|
36
|
-
end
|
37
|
-
|
38
|
-
# The label for the current page (it can pass along the I18n gem opts when it's used with the i18n extra)
|
39
|
-
def label(opts = {})
|
40
|
-
label_for(@page, opts)
|
41
|
-
end
|
42
|
-
|
43
|
-
# The label for any page (it can pass along the I18n gem opts when it's used with the i18n extra)
|
44
|
-
def label_for(page, opts = {})
|
45
|
-
opts[:format] ||= @vars[:format]
|
46
|
-
localize(starting_time_for(page.to_i), opts) # page could be a string
|
47
|
-
end
|
48
|
-
|
49
|
-
protected
|
16
|
+
class << self
|
17
|
+
private
|
50
18
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def page_at(time, **opts)
|
55
|
-
fit_time = time
|
56
|
-
fit_final = @final - 1
|
57
|
-
unless time.between?(@initial, fit_final)
|
58
|
-
raise OutOfRangeError.new(self, :time, "between #{@initial} and #{fit_final}", time) unless opts[:fit_time]
|
19
|
+
# Create a unit subclass instance by using the unit name (internal use)
|
20
|
+
def create(unit, **vars)
|
21
|
+
raise InternalError, "unit must be in #{UNITS.inspect}; got #{unit}" unless UNITS.include?(unit)
|
59
22
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
fit_time = fit_final
|
65
|
-
ordinal = 'last'
|
66
|
-
end
|
67
|
-
Warning.warn "Pagy::Calendar#page_at: Rescued #{time} out of range by returning the #{ordinal} page."
|
23
|
+
name = unit.to_s
|
24
|
+
name[0] = name[0].capitalize
|
25
|
+
Object.const_get("Pagy::Calendar::#{name}").new(**vars)
|
68
26
|
end
|
69
|
-
offset = page_offset_at(fit_time) # offset starts from 0
|
70
|
-
@order == :asc ? offset + 1 : @pages - offset
|
71
|
-
end
|
72
27
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
unless %i[asc desc].include?(@order = @vars[:order])
|
78
|
-
|
79
|
-
@starting, @ending = @vars[:period]
|
80
|
-
raise VariableError.new(self, :period, 'to be a an Array of min and max TimeWithZone instances', @vars[:period]) \
|
81
|
-
unless @starting.is_a?(ActiveSupport::TimeWithZone) \
|
82
|
-
&& @ending.is_a?(ActiveSupport::TimeWithZone) && @starting <= @ending
|
83
|
-
end
|
84
|
-
|
85
|
-
# Apply the strftime format to the time (overridden by the i18n extra when localization is required)
|
86
|
-
def localize(time, opts)
|
87
|
-
time.strftime(opts[:format])
|
88
|
-
end
|
89
|
-
|
90
|
-
# Number of time units to offset from the @initial time, in order to get the ordered starting time for the page.
|
91
|
-
# Used in starting_time_for(page) where page starts from 1 (e.g. page to starting_time means subtracting 1)
|
92
|
-
def time_offset_for(page)
|
93
|
-
@order == :asc ? page - 1 : @pages - page
|
94
|
-
end
|
95
|
-
|
96
|
-
# Period of the active page (used internally for nested units)
|
97
|
-
def active_period
|
98
|
-
[[@starting, @from].max, [@to - 1, @ending].min] # -1 sec: include only last unit day
|
28
|
+
# Return calendar, from, to
|
29
|
+
def init(conf, period, params)
|
30
|
+
new.send(:init, conf, period, params)
|
31
|
+
end
|
99
32
|
end
|
100
33
|
|
101
|
-
#
|
102
|
-
|
103
|
-
|
104
|
-
raise NoMethodError, 'the starting_time_for method must be implemented by the unit subclass'
|
34
|
+
# Return the current time of the smallest time unit shown
|
35
|
+
def showtime
|
36
|
+
self[@units.last].from
|
105
37
|
end
|
106
38
|
|
107
|
-
|
108
|
-
|
109
|
-
|
39
|
+
private
|
40
|
+
|
41
|
+
# Create the calendar
|
42
|
+
def init(conf, period, params)
|
43
|
+
@conf = Marshal.load(Marshal.dump(conf)) # store a copy
|
44
|
+
@units = Calendar::UNITS & @conf.keys # get the units in time length desc order
|
45
|
+
raise ArgumentError, 'no calendar unit found in pagy_calendar @configuration' if @units.empty?
|
46
|
+
|
47
|
+
@period = period
|
48
|
+
@params = params
|
49
|
+
@page_param = conf[:pagy][:page_param] || DEFAULT[:page_param]
|
50
|
+
@units.each do |unit| # set all the :page_param vars for later deletion
|
51
|
+
unit_page_param = :"#{unit}_#{@page_param}"
|
52
|
+
conf[unit][:page_param] = unit_page_param
|
53
|
+
conf[unit][:page] = @params[unit_page_param]
|
54
|
+
end
|
55
|
+
calendar = {}
|
56
|
+
object = nil
|
57
|
+
@units.each_with_index do |unit, index|
|
58
|
+
params_to_delete = @units[(index + 1), @units.size].map { |sub| conf[sub][:page_param] } + [@page_param]
|
59
|
+
conf[unit][:params] = lambda { |up| up.except(*params_to_delete.map(&:to_s)) } # rubocop:disable Style/Lambda
|
60
|
+
conf[unit][:period] = object&.send(:active_period) || @period
|
61
|
+
calendar[unit] = object = Calendar.send(:create, unit, **conf[unit])
|
62
|
+
end
|
63
|
+
[replace(calendar), object.from, object.to]
|
110
64
|
end
|
111
|
-
# :nocov:
|
112
65
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
66
|
+
# Return the calendar object at time
|
67
|
+
def calendar_at(time, **opts)
|
68
|
+
conf = Marshal.load(Marshal.dump(@conf))
|
69
|
+
page_params = {}
|
70
|
+
@units.inject(nil) do |object, unit|
|
71
|
+
conf[unit][:period] = object&.send(:active_period) || @period
|
72
|
+
conf[unit][:page] = page_params[:"#{unit}_#{@page_param}"] \
|
73
|
+
= Calendar.send(:create, unit, **conf[unit]).send(:page_at, time, **opts)
|
74
|
+
conf[unit][:params] ||= {}
|
75
|
+
conf[unit][:params].merge!(page_params)
|
76
|
+
Calendar.send(:create, unit, **conf[unit])
|
121
77
|
end
|
122
78
|
end
|
123
79
|
end
|
data/lib/pagy/console.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# See Pagy::Console API documentation: https://ddnexus.github.io/pagy/docs/api/console
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
require_relative '../pagy' # so you can require just the extra in the console
|
5
|
+
require_relative 'extras/standalone'
|
6
6
|
|
7
7
|
class Pagy
|
8
8
|
# Provide a ready to use pagy environment when included in irb/rails console
|
data/lib/pagy/countless.rb
CHANGED
@@ -1,37 +1,38 @@
|
|
1
1
|
# See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/docs/api/countless
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
class Pagy
|
4
|
+
class Pagy # :nodoc:
|
7
5
|
# No need to know the count to paginate
|
8
6
|
class Countless < Pagy
|
9
7
|
# Merge and validate the options, do some simple arithmetic and set a few instance variables
|
10
|
-
def initialize(vars
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
setup_params_var
|
8
|
+
def initialize(**vars) # rubocop:disable Lint/MissingSuper
|
9
|
+
assign_vars(DEFAULT, vars)
|
10
|
+
assign_and_check(page: 1, outset: 0)
|
11
|
+
assign_limit
|
12
|
+
assign_offset
|
16
13
|
end
|
17
14
|
|
18
15
|
# Finalize the instance variables based on the fetched size
|
19
16
|
def finalize(fetched_size)
|
20
17
|
raise OverflowError.new(self, :page, "to be < #{@page}", @page) if fetched_size.zero? && @page > 1
|
21
18
|
|
22
|
-
@
|
23
|
-
@
|
24
|
-
|
25
|
-
@
|
26
|
-
@
|
27
|
-
@
|
19
|
+
@last = fetched_size > @limit ? @page + 1 : @page
|
20
|
+
@last = @vars[:max_pages] if @vars[:max_pages] && @last > @vars[:max_pages]
|
21
|
+
check_overflow
|
22
|
+
@in = [fetched_size, @limit].min
|
23
|
+
@from = @in.zero? ? 0 : @offset - @outset + 1
|
24
|
+
@to = @offset - @outset + @in
|
25
|
+
assign_prev_and_next
|
28
26
|
self
|
29
27
|
end
|
28
|
+
end
|
30
29
|
|
30
|
+
module SeriesOverride # :nodoc:
|
31
31
|
# Override the original series.
|
32
32
|
# Return nil if :countless_minimal is enabled
|
33
|
-
def series(
|
33
|
+
def series(**)
|
34
34
|
super unless @vars[:countless_minimal]
|
35
35
|
end
|
36
36
|
end
|
37
|
+
prepend SeriesOverride
|
37
38
|
end
|
data/lib/pagy/extras/arel.rb
CHANGED
@@ -7,19 +7,11 @@ class Pagy # :nodoc:
|
|
7
7
|
private
|
8
8
|
|
9
9
|
# Return Pagy object and paginated collection/results
|
10
|
-
def pagy_arel(collection, vars
|
11
|
-
pagy = Pagy.new(pagy_arel_get_vars(collection, vars))
|
10
|
+
def pagy_arel(collection, **vars)
|
11
|
+
pagy = Pagy.new(**pagy_arel_get_vars(collection, vars))
|
12
12
|
[pagy, pagy_get_items(collection, pagy)]
|
13
13
|
end
|
14
14
|
|
15
|
-
# Sub-method called only by #pagy_arel: here for easy customization of variables by overriding
|
16
|
-
def pagy_arel_get_vars(collection, vars)
|
17
|
-
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
18
|
-
vars[:count] ||= pagy_arel_count(collection)
|
19
|
-
vars[:page] ||= params[vars[:page_param] || DEFAULT[:page_param]]
|
20
|
-
vars
|
21
|
-
end
|
22
|
-
|
23
15
|
# Count using Arel when grouping
|
24
16
|
def pagy_arel_count(collection)
|
25
17
|
if collection.group_values.empty?
|
@@ -31,6 +23,12 @@ class Pagy # :nodoc:
|
|
31
23
|
collection.unscope(:order).limit(1).pluck(sql).first.to_i
|
32
24
|
end
|
33
25
|
end
|
26
|
+
|
27
|
+
# Sub-method called only by #pagy_arel: here for easy customization of variables by overriding
|
28
|
+
def pagy_arel_get_vars(collection, vars)
|
29
|
+
vars[:count] ||= pagy_arel_count(collection)
|
30
|
+
pagy_get_vars(collection, vars)
|
31
|
+
end
|
34
32
|
end
|
35
33
|
Backend.prepend ArelExtra
|
36
34
|
end
|
data/lib/pagy/extras/array.rb
CHANGED
@@ -7,17 +7,15 @@ class Pagy # :nodoc:
|
|
7
7
|
private
|
8
8
|
|
9
9
|
# Return Pagy object and paginated items
|
10
|
-
def pagy_array(array, vars
|
11
|
-
pagy = Pagy.new(pagy_array_get_vars(array, vars))
|
12
|
-
[pagy, array[pagy.offset, pagy.
|
10
|
+
def pagy_array(array, **vars)
|
11
|
+
pagy = Pagy.new(**pagy_array_get_vars(array, vars))
|
12
|
+
[pagy, array[pagy.offset, pagy.limit]]
|
13
13
|
end
|
14
14
|
|
15
15
|
# Sub-method called only by #pagy_array: here for easy customization of variables by overriding
|
16
16
|
def pagy_array_get_vars(array, vars)
|
17
|
-
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
18
17
|
vars[:count] ||= array.size
|
19
|
-
|
20
|
-
vars
|
18
|
+
pagy_get_vars(array, vars)
|
21
19
|
end
|
22
20
|
end
|
23
21
|
Backend.prepend ArrayExtra
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bootstrap
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
require_relative 'js_tools'
|
5
5
|
|
6
6
|
class Pagy # :nodoc:
|
7
7
|
# Frontend modules are specially optimized for performance.
|
@@ -10,7 +10,7 @@ class Pagy # :nodoc:
|
|
10
10
|
# Pagination for bootstrap: it returns the html with the series of links to the pages
|
11
11
|
def pagy_bootstrap_nav(pagy, id: nil, classes: 'pagination', aria_label: nil, **vars)
|
12
12
|
id = %( id="#{id}") if id
|
13
|
-
a = pagy_anchor(pagy)
|
13
|
+
a = pagy_anchor(pagy, **vars)
|
14
14
|
|
15
15
|
html = %(<nav#{id} class="pagy-bootstrap nav" #{nav_aria_label(pagy, aria_label:)}><ul class="#{classes}">#{
|
16
16
|
bootstrap_prev_html(pagy, a)})
|
@@ -34,7 +34,7 @@ class Pagy # :nodoc:
|
|
34
34
|
def pagy_bootstrap_nav_js(pagy, id: nil, classes: 'pagination', aria_label: nil, **vars)
|
35
35
|
sequels = pagy.sequels(**vars)
|
36
36
|
id = %( id="#{id}") if id
|
37
|
-
a = pagy_anchor(pagy)
|
37
|
+
a = pagy_anchor(pagy, **vars)
|
38
38
|
tokens = { 'before' => %(<ul class="#{classes}">#{bootstrap_prev_html(pagy, a)}),
|
39
39
|
'a' => %(<li class="page-item">#{a.(PAGE_TOKEN, LABEL_TOKEN, classes: 'page-link')}</li>),
|
40
40
|
'current' => %(<li class="page-item active"><a role="link" class="page-link" ) +
|
@@ -50,18 +50,18 @@ class Pagy # :nodoc:
|
|
50
50
|
end
|
51
51
|
|
52
52
|
# Javascript combo pagination for bootstrap: it returns a nav with a data-pagy attribute used by the pagy.js file
|
53
|
-
def pagy_bootstrap_combo_nav_js(pagy, id: nil, classes: 'pagination', aria_label: nil)
|
53
|
+
def pagy_bootstrap_combo_nav_js(pagy, id: nil, classes: 'pagination', aria_label: nil, **vars)
|
54
54
|
id = %( id="#{id}") if id
|
55
|
-
a = pagy_anchor(pagy)
|
55
|
+
a = pagy_anchor(pagy, **vars)
|
56
56
|
pages = pagy.pages
|
57
57
|
|
58
58
|
page_input = %(<input name="page" type="number" min="1" max="#{pages}" value="#{pagy.page}" aria-current="page" ) <<
|
59
59
|
%(style="text-align: center; width: #{pages.to_s.length + 1}rem; padding: 0; ) <<
|
60
|
-
%(border: none; display: inline-block;" class="page-link active"
|
60
|
+
%(border: none; display: inline-block;" class="page-link active">#{JSTools::A_TAG})
|
61
61
|
|
62
62
|
%(<nav#{id} class="pagy-bootstrap combo-nav-js" #{
|
63
63
|
nav_aria_label(pagy, aria_label:)} #{
|
64
|
-
pagy_data(pagy, :combo, pagy_url_for(pagy, PAGE_TOKEN))
|
64
|
+
pagy_data(pagy, :combo, pagy_url_for(pagy, PAGE_TOKEN, **vars))
|
65
65
|
}><ul class="#{classes}">#{
|
66
66
|
bootstrap_prev_html(pagy, a)
|
67
67
|
}<li class="page-item pagy-bootstrap"><label class="page-link">#{
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bulma
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
require_relative 'js_tools'
|
5
5
|
|
6
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 BulmaExtra
|
10
10
|
# Pagination for bulma: it returns the html with the series of links to the pages
|
11
|
-
def pagy_bulma_nav(pagy, id: nil, classes: 'pagy-bulma nav pagination is-centered',
|
11
|
+
def pagy_bulma_nav(pagy, id: nil, classes: 'pagy-bulma nav pagination is-centered',
|
12
|
+
aria_label: nil, **vars)
|
12
13
|
id = %( id="#{id}") if id
|
13
|
-
a = pagy_anchor(pagy)
|
14
|
+
a = pagy_anchor(pagy, **vars)
|
14
15
|
|
15
16
|
html = %(<nav#{id} class="#{classes}" #{nav_aria_label(pagy, aria_label:)}>)
|
16
17
|
html << bulma_prev_next_html(pagy, a)
|
@@ -31,10 +32,11 @@ class Pagy # :nodoc:
|
|
31
32
|
end
|
32
33
|
|
33
34
|
# Javascript pagination for bulma: it returns a nav with a data-pagy attribute used by the Pagy.nav javascript
|
34
|
-
def pagy_bulma_nav_js(pagy, id: nil, classes: 'pagy-bulma nav-js pagination is-centered',
|
35
|
+
def pagy_bulma_nav_js(pagy, id: nil, classes: 'pagy-bulma nav-js pagination is-centered',
|
36
|
+
aria_label: nil, **vars)
|
35
37
|
sequels = pagy.sequels(**vars)
|
36
38
|
id = %( id="#{id}") if id
|
37
|
-
a = pagy_anchor(pagy)
|
39
|
+
a = pagy_anchor(pagy, **vars)
|
38
40
|
tokens = { 'before' => %(#{bulma_prev_next_html(pagy, a)}<ul class="pagination-list">),
|
39
41
|
'a' => %(<li>#{a.(PAGE_TOKEN, LABEL_TOKEN, classes: 'pagination-link')}</li>),
|
40
42
|
'current' => %(<li><a role="link" class="pagination-link is-current" aria-current="page" aria-disabled="true">#{
|
@@ -49,18 +51,20 @@ class Pagy # :nodoc:
|
|
49
51
|
end
|
50
52
|
|
51
53
|
# Javascript combo pagination for bulma: it returns a nav with a data-pagy attribute used by the pagy.js file
|
52
|
-
def pagy_bulma_combo_nav_js(pagy, id: nil, classes: 'pagy-bulma combo-nav-js pagination is-centered',
|
54
|
+
def pagy_bulma_combo_nav_js(pagy, id: nil, classes: 'pagy-bulma combo-nav-js pagination is-centered',
|
55
|
+
aria_label: nil, **vars)
|
53
56
|
id = %( id="#{id}") if id
|
54
|
-
a = pagy_anchor(pagy)
|
57
|
+
a = pagy_anchor(pagy, **vars)
|
55
58
|
pages = pagy.pages
|
56
59
|
|
57
60
|
page_input = %(<input name="page" type="number" min="1" max="#{pages}" value="#{pagy.page}" aria-current="page") <<
|
58
61
|
%(style="text-align: center; width: #{pages.to_s.length + 1}rem; height: 1.7rem; margin:0 0.3rem; ) <<
|
59
|
-
%(border: none; border-radius: 4px; padding: 0; font-size: 1.1rem; color: white;
|
62
|
+
%(border: none; border-radius: 4px; padding: 0; font-size: 1.1rem; color: white; ) <<
|
63
|
+
%(background-color: #485fc7;">#{JSTools::A_TAG})
|
60
64
|
|
61
65
|
%(<nav#{id} class="#{classes}" #{
|
62
66
|
nav_aria_label(pagy, aria_label:)} #{
|
63
|
-
pagy_data(pagy, :combo, pagy_url_for(pagy, PAGE_TOKEN))
|
67
|
+
pagy_data(pagy, :combo, pagy_url_for(pagy, PAGE_TOKEN, **vars))
|
64
68
|
}>#{
|
65
69
|
bulma_prev_next_html(pagy, a)
|
66
70
|
}<ul class="pagination-list"><li class="pagination-link"><label>#{
|
data/lib/pagy/extras/calendar.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/calendar
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
require 'pagy/calendar/helper'
|
4
|
+
require_relative '../calendar'
|
6
5
|
|
7
6
|
class Pagy # :nodoc:
|
8
7
|
# Add pagination filtering by calendar unit (:year, :quarter, :month, :week, :day) to the regular pagination
|
@@ -20,10 +19,15 @@ class Pagy # :nodoc:
|
|
20
19
|
|
21
20
|
conf[:pagy] ||= {}
|
22
21
|
unless conf.key?(:active) && !conf[:active]
|
23
|
-
calendar, from, to = Calendar
|
24
|
-
|
22
|
+
calendar, from, to = Calendar.send(:init, conf, pagy_calendar_period(collection), params)
|
23
|
+
if respond_to?(:pagy_calendar_counts)
|
24
|
+
calendar.each_key do |unit|
|
25
|
+
calendar[unit].vars[:counts] = pagy_calendar_counts(collection, unit, *calendar[unit].vars[:period])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
collection = pagy_calendar_filter(collection, from, to)
|
25
29
|
end
|
26
|
-
pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted
|
30
|
+
pagy, results = send(conf[:pagy][:backend] || :pagy, collection, **conf[:pagy]) # use backend: :pagy when omitted
|
27
31
|
[calendar, pagy, results]
|
28
32
|
end
|
29
33
|
|
@@ -40,6 +44,31 @@ class Pagy # :nodoc:
|
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
47
|
+
# Override the pagy_anchor
|
48
|
+
module FrontendOverride
|
49
|
+
# Consider the vars[:count]
|
50
|
+
def pagy_anchor(pagy, anchor_string: nil)
|
51
|
+
return super unless (counts = pagy.vars[:counts])
|
52
|
+
|
53
|
+
anchor_string &&= %( #{anchor_string})
|
54
|
+
left, right = %(<a#{anchor_string} href="#{pagy_url_for(pagy, PAGE_TOKEN)}").split(PAGE_TOKEN, 2)
|
55
|
+
# lambda used by all the helpers
|
56
|
+
lambda do |page, text = pagy.label_for(page), classes: nil, aria_label: nil|
|
57
|
+
count = counts[page - 1]
|
58
|
+
item_name = pagy_t('pagy.item_name', count:)
|
59
|
+
if count.zero?
|
60
|
+
classes = "#{classes && (classes + ' ')}empty-page"
|
61
|
+
title = %( title="#{pagy_t('pagy.info.no_items', item_name:, count:)}")
|
62
|
+
else
|
63
|
+
title = %( title="#{pagy_t('pagy.info.single_page', item_name:, count:)}")
|
64
|
+
end
|
65
|
+
classes = %( class="#{classes}") if classes
|
66
|
+
aria_label = %( aria-label="#{aria_label}") if aria_label
|
67
|
+
%(#{left}#{page}#{right}#{title}#{classes}#{aria_label}>#{text}</a>)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
43
72
|
# Additions for the Frontend module
|
44
73
|
module UrlHelperAddOn
|
45
74
|
# Return the url for the calendar page at time
|
@@ -49,5 +78,5 @@ class Pagy # :nodoc:
|
|
49
78
|
end
|
50
79
|
end
|
51
80
|
Backend.prepend CalendarExtra::BackendAddOn, CalendarExtra::UrlHelperAddOn
|
52
|
-
Frontend.prepend CalendarExtra::UrlHelperAddOn
|
81
|
+
Frontend.prepend CalendarExtra::UrlHelperAddOn, CalendarExtra::FrontendOverride
|
53
82
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/countless
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
require_relative '../countless'
|
5
5
|
|
6
6
|
class Pagy # :nodoc:
|
7
7
|
DEFAULT[:countless_minimal] = false
|
@@ -10,27 +10,20 @@ class Pagy # :nodoc:
|
|
10
10
|
module CountlessExtra
|
11
11
|
private
|
12
12
|
|
13
|
-
# Return Pagy object and
|
14
|
-
def pagy_countless(collection, vars
|
15
|
-
pagy = Countless.new(
|
13
|
+
# Return Pagy object and records
|
14
|
+
def pagy_countless(collection, **vars)
|
15
|
+
pagy = Countless.new(**pagy_get_vars(collection, vars))
|
16
16
|
[pagy, pagy_countless_get_items(collection, pagy)]
|
17
17
|
end
|
18
18
|
|
19
|
-
# Sub-method called only by #pagy_countless: here for easy customization of variables by overriding
|
20
|
-
def pagy_countless_get_vars(_collection, vars)
|
21
|
-
pagy_set_items_from_params(vars) if defined?(ItemsExtra)
|
22
|
-
vars[:page] ||= params[vars[:page_param] || DEFAULT[:page_param]]
|
23
|
-
vars
|
24
|
-
end
|
25
|
-
|
26
19
|
# Sub-method called only by #pagy_countless: here for easy customization of record-extraction by overriding
|
27
20
|
# You may need to override this method for collections without offset|limit
|
28
21
|
def pagy_countless_get_items(collection, pagy)
|
29
|
-
return collection.offset(pagy.offset).limit(pagy.
|
22
|
+
return collection.offset(pagy.offset).limit(pagy.limit) if pagy.vars[:countless_minimal]
|
30
23
|
|
31
|
-
fetched = collection.offset(pagy.offset).limit(pagy.
|
24
|
+
fetched = collection.offset(pagy.offset).limit(pagy.limit + 1).to_a # eager load limit + 1
|
32
25
|
pagy.finalize(fetched.size) # finalize the pagy object
|
33
|
-
fetched[0, pagy.
|
26
|
+
fetched[0, pagy.limit] # ignore eventual extra item
|
34
27
|
end
|
35
28
|
end
|
36
29
|
Backend.prepend CountlessExtra
|
@@ -28,18 +28,18 @@ class Pagy # :nodoc:
|
|
28
28
|
args.define_singleton_method(:method_missing) { |*a| args += a }
|
29
29
|
end
|
30
30
|
end
|
31
|
-
alias_method
|
31
|
+
alias_method DEFAULT[:elasticsearch_rails_pagy_search], :pagy_elasticsearch_rails
|
32
32
|
end
|
33
33
|
Pagy::ElasticsearchRails = ModelExtension
|
34
34
|
|
35
35
|
# Additions for the Pagy class
|
36
36
|
module PagyAddOn
|
37
37
|
# Create a Pagy object from an Elasticsearch::Model::Response::Response object
|
38
|
-
def new_from_elasticsearch_rails(response, vars
|
39
|
-
vars[:
|
40
|
-
vars[:page] = ((response.search.options[:from] || 0) / vars[:
|
38
|
+
def new_from_elasticsearch_rails(response, **vars)
|
39
|
+
vars[:limit] = response.search.options[:size] || 10
|
40
|
+
vars[:page] = ((response.search.options[:from] || 0) / vars[:limit]) + 1
|
41
41
|
vars[:count] = ElasticsearchRailsExtra.total_count(response)
|
42
|
-
new(vars)
|
42
|
+
Pagy.new(**vars)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
Pagy.extend PagyAddOn
|
@@ -48,19 +48,19 @@ class Pagy # :nodoc:
|
|
48
48
|
module BackendAddOn
|
49
49
|
private
|
50
50
|
|
51
|
-
# Return Pagy object and
|
52
|
-
def pagy_elasticsearch_rails(pagy_search_args, vars
|
51
|
+
# Return Pagy object and records
|
52
|
+
def pagy_elasticsearch_rails(pagy_search_args, **vars)
|
53
53
|
model, query_or_payload,
|
54
54
|
options, *called = pagy_search_args
|
55
55
|
vars = pagy_elasticsearch_rails_get_vars(nil, vars)
|
56
|
-
options[:size] = vars[:
|
57
|
-
options[:from] = vars[:
|
56
|
+
options[:size] = vars[:limit]
|
57
|
+
options[:from] = vars[:limit] * ((vars[:page] || 1) - 1)
|
58
58
|
response = model.send(DEFAULT[:elasticsearch_rails_search], query_or_payload, **options)
|
59
59
|
vars[:count] = ElasticsearchRailsExtra.total_count(response)
|
60
60
|
|
61
|
-
pagy = ::Pagy.new(vars)
|
61
|
+
pagy = ::Pagy.new(**vars)
|
62
62
|
# with :last_page overflow we need to re-run the method in order to get the hits
|
63
|
-
return pagy_elasticsearch_rails(pagy_search_args, vars
|
63
|
+
return pagy_elasticsearch_rails(pagy_search_args, **vars, page: pagy.page) \
|
64
64
|
if defined?(::Pagy::OverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
|
65
65
|
|
66
66
|
[pagy, called.empty? ? response : response.send(*called)]
|
@@ -69,10 +69,10 @@ class Pagy # :nodoc:
|
|
69
69
|
# Sub-method called only by #pagy_elasticsearch_rails: here for easy customization of variables by overriding
|
70
70
|
# the _collection argument is not available when the method is called
|
71
71
|
def pagy_elasticsearch_rails_get_vars(_collection, vars)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
vars.tap do |v|
|
73
|
+
v[:page] ||= pagy_get_page(v)
|
74
|
+
v[:limit] ||= pagy_get_limit(v) || DEFAULT[:limit]
|
75
|
+
end
|
76
76
|
end
|
77
77
|
end
|
78
78
|
Backend.prepend BackendAddOn
|