pagy 5.10.1 → 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/lib/config/pagy.rb +32 -31
  4. data/lib/javascripts/pagy-dev.js +2 -2
  5. data/lib/javascripts/pagy-module.js +1 -1
  6. data/lib/javascripts/pagy.js +1 -1
  7. data/lib/locales/de.yml +1 -1
  8. data/lib/locales/ko.yml +1 -1
  9. data/lib/locales/nn.yml +22 -0
  10. data/lib/pagy/backend.rb +1 -1
  11. data/lib/pagy/calendar/day.rb +13 -3
  12. data/lib/pagy/calendar/helper.rb +61 -0
  13. data/lib/pagy/calendar/month.rb +6 -2
  14. data/lib/pagy/calendar/quarter.rb +6 -2
  15. data/lib/pagy/calendar/week.rb +13 -8
  16. data/lib/pagy/calendar/year.rb +6 -2
  17. data/lib/pagy/calendar.rb +18 -8
  18. data/lib/pagy/console.rb +1 -1
  19. data/lib/pagy/countless.rb +2 -2
  20. data/lib/pagy/extras/arel.rb +1 -1
  21. data/lib/pagy/extras/array.rb +1 -1
  22. data/lib/pagy/extras/bootstrap.rb +6 -6
  23. data/lib/pagy/extras/bulma.rb +1 -1
  24. data/lib/pagy/extras/calendar.rb +12 -29
  25. data/lib/pagy/extras/countless.rb +1 -1
  26. data/lib/pagy/extras/elasticsearch_rails.rb +2 -11
  27. data/lib/pagy/extras/foundation.rb +1 -1
  28. data/lib/pagy/extras/gearbox.rb +1 -1
  29. data/lib/pagy/extras/headers.rb +1 -1
  30. data/lib/pagy/extras/i18n.rb +1 -1
  31. data/lib/pagy/extras/items.rb +1 -1
  32. data/lib/pagy/extras/materialize.rb +4 -4
  33. data/lib/pagy/extras/meilisearch.rb +14 -20
  34. data/lib/pagy/extras/metadata.rb +1 -1
  35. data/lib/pagy/extras/navs.rb +3 -3
  36. data/lib/pagy/extras/overflow.rb +2 -2
  37. data/lib/pagy/extras/searchkick.rb +3 -11
  38. data/lib/pagy/extras/semantic.rb +1 -1
  39. data/lib/pagy/extras/standalone.rb +5 -4
  40. data/lib/pagy/extras/support.rb +1 -1
  41. data/lib/pagy/extras/trim.rb +1 -1
  42. data/lib/pagy/extras/uikit.rb +1 -1
  43. data/lib/pagy/frontend.rb +2 -2
  44. data/lib/pagy/i18n.rb +1 -1
  45. data/lib/pagy/url_helpers.rb +4 -19
  46. data/lib/pagy.rb +17 -5
  47. data/lib/templates/bootstrap_nav.html.erb +1 -1
  48. data/lib/templates/bootstrap_nav.html.haml +1 -1
  49. data/lib/templates/bootstrap_nav.html.slim +1 -1
  50. data/lib/templates/nav.html.erb +1 -1
  51. data/lib/templates/nav.html.haml +1 -1
  52. data/lib/templates/nav.html.slim +1 -1
  53. metadata +7 -19
data/lib/pagy/calendar.rb CHANGED
@@ -1,4 +1,4 @@
1
- # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/calendar
1
+ # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/docs/api/calendar
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'active_support'
@@ -12,6 +12,9 @@ require 'pagy'
12
12
  class Pagy # :nodoc:
13
13
  # Base class for time units subclasses (Year, Quarter, Month, Week, Day)
14
14
  class Calendar < Pagy
15
+ # Specific out of range error
16
+ class OutOfRangeError < StandardError; end
17
+
15
18
  # List of units in desc order of duration. It can be used for custom units.
16
19
  UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant
17
20
 
@@ -45,6 +48,14 @@ class Pagy # :nodoc:
45
48
 
46
49
  protected
47
50
 
51
+ # The page that includes time
52
+ def page_at(time)
53
+ raise OutOfRangeError unless time.between?(@initial, @final)
54
+
55
+ offset = page_offset_at(time) # offset starts from 0
56
+ @order == :asc ? offset + 1 : @pages - offset
57
+ end
58
+
48
59
  # Base class method for the setup of the unit variables (subclasses must implement it and call super)
49
60
  def setup_unit_vars
50
61
  raise VariableError.new(self, :format, 'to be a strftime format', @vars[:format]) unless @vars[:format].is_a?(String)
@@ -52,10 +63,9 @@ class Pagy # :nodoc:
52
63
  unless %i[asc desc].include?(@order = @vars[:order])
53
64
 
54
65
  @starting, @ending = @vars[:period]
55
- raise VariableError.new(self, :period, 'to be a an Array of min and max local Time instances', @vars[:period]) \
56
- unless @starting.is_a?(Time) && @ending.is_a?(Time) && !@starting.utc? && !@ending.utc? && @starting <= @ending
57
-
58
- @with_zone = @starting.is_a?(ActiveSupport::TimeWithZone) # remove in 6.0 and replace Time in the line above
66
+ raise VariableError.new(self, :period, 'to be a an Array of min and max TimeWithZone instances', @vars[:period]) \
67
+ unless @starting.is_a?(ActiveSupport::TimeWithZone) \
68
+ && @ending.is_a?(ActiveSupport::TimeWithZone) && @starting <= @ending
59
69
  end
60
70
 
61
71
  # Apply the strftime format to the time (overridden by the i18n extra when localization is required)
@@ -63,9 +73,9 @@ class Pagy # :nodoc:
63
73
  time.strftime(opts[:format])
64
74
  end
65
75
 
66
- # Number of units to offset from the @initial time, in order to get the ordered starting time for the page.
67
- # Used in starting_time_for(page) with a logic equivalent to: @initial + (offset_units_for(page) * unit_time_length)
68
- def offset_units_for(page)
76
+ # Number of time units to offset from the @initial time, in order to get the ordered starting time for the page.
77
+ # Used in starting_time_for(page) where page starts from 1 (e.g. page to starting_time means subtracting 1)
78
+ def time_offset_for(page)
69
79
  @order == :asc ? page - 1 : @pages - page
70
80
  end
71
81
 
data/lib/pagy/console.rb CHANGED
@@ -1,4 +1,4 @@
1
- # See Pagy::Console API documentation: https://ddnexus.github.io/pagy/api/console
1
+ # See Pagy::Console API documentation: https://ddnexus.github.io/pagy/docs/api/console
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy' # so you can require just the extra in the console
@@ -1,4 +1,4 @@
1
- # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/countless
1
+ # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/docs/api/countless
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy'
@@ -30,7 +30,7 @@ class Pagy
30
30
 
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
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/arel
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/arel
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/array
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/array
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bootstrap
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bootstrap
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -12,7 +12,7 @@ class Pagy # :nodoc:
12
12
  p_id = %( id="#{pagy_id}") if pagy_id
13
13
  link = pagy_link_proc(pagy, link_extra: %(class="page-link" #{link_extra}))
14
14
 
15
- html = +%(<nav#{p_id} class="pagy-bootstrap-nav" aria-label="pager"><ul class="pagination">)
15
+ html = +%(<nav#{p_id} class="pagy-bootstrap-nav"><ul class="pagination">)
16
16
  html << pagy_bootstrap_prev_html(pagy, link)
17
17
  pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
18
18
  html << case item
@@ -40,7 +40,7 @@ class Pagy # :nodoc:
40
40
  'gap' => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t 'pagy.nav.gap'}</a></li>),
41
41
  'after' => %(#{pagy_bootstrap_next_html pagy, link}</ul>) }
42
42
 
43
- %(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bootstrap-nav-js" aria-label="pager" #{
43
+ %(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bootstrap-nav-js" #{
44
44
  pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
45
45
  end
46
46
 
@@ -51,17 +51,17 @@ class Pagy # :nodoc:
51
51
  p_page = pagy.page
52
52
  p_pages = pagy.pages
53
53
  input = %(<input type="number" min="1" max="#{p_pages}" value="#{
54
- p_page}" class="text-primary" style="padding: 0; border: none; text-align: center; width: #{
54
+ p_page}" style="padding: 0; border: none; text-align: center; width: #{
55
55
  p_pages.to_s.length + 1}rem;">)
56
56
 
57
- %(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination" aria-label="pager"><div class="btn-group" role="group" #{
57
+ %(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination"><div class="btn-group" role="group" #{
58
58
  pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
59
59
  if (p_prev = pagy.prev)
60
60
  link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"'
61
61
  else
62
62
  %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>)
63
63
  end
64
- }<div class="pagy-combo-input btn btn-primary disabled" style="white-space: nowrap;">#{
64
+ }<div class="pagy-combo-input btn btn-secondary" style="white-space: nowrap;">#{
65
65
  pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</div>#{
66
66
  if (p_next = pagy.next)
67
67
  link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/bulma
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/bulma
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -1,7 +1,8 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/calendar
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/calendar
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/calendar'
5
+ require 'pagy/calendar/helper'
5
6
 
6
7
  class Pagy # :nodoc:
7
8
  # Add pagination filtering by calendar unit (:year, :quarter, :month, :week, :day) to the regular pagination
@@ -18,47 +19,29 @@ class Pagy # :nodoc:
18
19
  raise ArgumentError, "keys must be in #{CONF_KEYS.inspect} and object values must be Hashes; got #{conf.inspect}"
19
20
  end
20
21
 
21
- conf[:pagy] = {} unless conf[:pagy] # use default Pagy object when omitted
22
- calendar, collection = pagy_setup_calendar(collection, conf) unless conf.key?(:active) && !conf[:active]
23
- pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted
22
+ conf[:pagy] = {} unless conf[:pagy] # use default Pagy object when omitted
23
+ unless conf.key?(:active) && !conf[:active]
24
+ calendar, from, to = Calendar::Helper.send(:init, conf, pagy_calendar_period(collection), params)
25
+ collection = pagy_calendar_filter(collection, from, to)
26
+ end
27
+ pagy, results = send(conf[:pagy][:backend] || :pagy, collection, conf[:pagy]) # use backend: :pagy when omitted
24
28
  [calendar, pagy, results]
25
29
  end
26
30
 
27
- # Setup and return the calendar objects and the filtered collection
28
- def pagy_setup_calendar(collection, conf)
29
- units = Calendar::UNITS & conf.keys # get the units in time length desc order
30
- raise ArgumentError, 'no calendar unit found in pagy_calendar configuration' if units.empty?
31
-
32
- page_param = conf[:pagy][:page_param] || DEFAULT[:page_param]
33
- units.each do |unit| # set all the :page_param vars for later deletion
34
- unit_page_param = :"#{unit}_#{page_param}"
35
- conf[unit][:page_param] = unit_page_param
36
- conf[unit][:page] = params[unit_page_param]
37
- end
38
- calendar = {}
39
- last_obj = nil
40
- units.each_with_index do |unit, index|
41
- params_to_delete = units[(index + 1), units.size].map { |sub| conf[sub][:page_param] } + [page_param]
42
- conf[unit][:params] = lambda do |params| # delete page_param from the sub-units
43
- params_to_delete.each { |p| params.delete(p.to_s) } # Hash#except missing from ruby 2.5 baseline
44
- params
45
- end
46
- conf[unit][:period] = last_obj&.send(:active_period) || pagy_calendar_period(collection)
47
- calendar[unit] = last_obj = Calendar.send(:create, unit, conf[unit])
48
- end
49
- [calendar, pagy_calendar_filter(collection, last_obj.from, last_obj.to)]
31
+ def pagy_calendar_url_at(calendar, time)
32
+ pagy_url_for(calendar.send(:last_object_at, time), 1)
50
33
  end
51
34
 
52
35
  # This method must be implemented by the application
53
36
  def pagy_calendar_period(*)
54
37
  raise NoMethodError, 'the pagy_calendar_period method must be implemented by the application ' \
55
- '(see https://ddnexus.github.io/pagy/extras/calendar#pagy_calendar_periodcollection)'
38
+ '(see https://ddnexus.github.io/pagy/docs/extras/calendar/#pagy-calendar-period-collection)'
56
39
  end
57
40
 
58
41
  # This method must be implemented by the application
59
42
  def pagy_calendar_filter(*)
60
43
  raise NoMethodError, 'the pagy_calendar_filter method must be implemented by the application ' \
61
- '(see https://ddnexus.github.io/pagy/extras/calendar#pagy_calendar_filtercollection-from-to)'
44
+ '(see https://ddnexus.github.io/pagy/docs/extras/calendar/#pagy-calendar-filter-collection-from-to)'
62
45
  end
63
46
  end
64
47
  end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/countless
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/countless
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/countless'
@@ -1,18 +1,9 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/elasticsearch_rails
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/elasticsearch_rails
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
5
5
  DEFAULT[:elasticsearch_rails_search] ||= :search
6
- DEFAULT[:elasticsearch_rails_pagy_search] ||= if DEFAULT[:elasticsearch_rails_search_method] # remove in 6.0
7
- # :nocov:
8
- Warning.warn '[PAGY WARNING] The :elasticsearch_rails_search_method variable ' \
9
- 'has been deprecated and will be ignored from pagy 6. ' \
10
- 'Use :elasticsearch_rails_pagy_search instead.'
11
- DEFAULT[:elasticsearch_rails_search_method]
12
- # :nocov:
13
- else
14
- :pagy_search
15
- end
6
+ DEFAULT[:elasticsearch_rails_pagy_search] ||= :pagy_search
16
7
 
17
8
  # Paginate ElasticsearchRails response objects
18
9
  module ElasticsearchRailsExtra
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/foundation
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/foundation
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/gearbox
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/gearbox
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/headers
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/headers
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/url_helpers'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/i18n
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/i18n
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/items
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/items
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/materialize
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/materialize
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -12,7 +12,7 @@ class Pagy # :nodoc:
12
12
  p_id = %( id="#{pagy_id}") if pagy_id
13
13
  link = pagy_link_proc(pagy, link_extra: link_extra)
14
14
 
15
- html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">)
15
+ html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation"><ul class="pagination">)
16
16
  html << pagy_materialize_prev_html(pagy, link)
17
17
  pagy.series(**vars).each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
18
18
  html << case item
@@ -38,7 +38,7 @@ class Pagy # :nodoc:
38
38
  'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>),
39
39
  'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
40
40
 
41
- %(<div#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-materialize-nav-js" role="navigation" aria-label="pager" #{
41
+ %(<div#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-materialize-nav-js" role="navigation" #{
42
42
  pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></div>)
43
43
  end
44
44
 
@@ -53,7 +53,7 @@ class Pagy # :nodoc:
53
53
  p_page}" style="text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
54
54
 
55
55
  html = %(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation")
56
- %(#{html} aria-label="pager" style="padding-right: 0" #{
56
+ %(#{html} style="padding-right: 0" #{
57
57
  pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
58
58
  pagy_materialize_prev_html pagy, link, style}<li class="pagy-combo-input">#{
59
59
  pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</li>#{
@@ -2,16 +2,8 @@
2
2
 
3
3
  class Pagy # :nodoc:
4
4
  DEFAULT[:meilisearch_search] ||= :ms_search
5
- DEFAULT[:meilisearch_pagy_search] ||= if DEFAULT[:meilisearch_search_method] # remove in 6.0
6
- # :nocov:
7
- Warning.warn '[PAGY WARNING] The :meilisearch_search_method variable ' \
8
- 'has been deprecated and will be ignored from pagy 6. ' \
9
- 'Use :meilisearch_pagy_search instead.'
10
- DEFAULT[:meilisearch_search_method]
11
- # :nocov:
12
- else
13
- :pagy_search
14
- end
5
+ DEFAULT[:meilisearch_pagy_search] ||= :pagy_search
6
+
15
7
  # Paginate Meilisearch results
16
8
  module MeilisearchExtra
17
9
  module Meilisearch # :nodoc:
@@ -27,9 +19,10 @@ class Pagy # :nodoc:
27
19
  module Pagy
28
20
  # Create a Pagy object from a Meilisearch results
29
21
  def new_from_meilisearch(results, vars = {})
30
- vars[:items] = results.raw_answer['limit']
31
- vars[:page] = (results.raw_answer['offset'] / vars[:items]) + 1
32
- vars[:count] = results.raw_answer['nbHits']
22
+ vars[:items] = results.raw_answer['hitsPerPage']
23
+ vars[:page] = results.raw_answer['page']
24
+ vars[:count] = results.raw_answer['totalHits']
25
+
33
26
  new(vars)
34
27
  end
35
28
  end
@@ -40,13 +33,14 @@ class Pagy # :nodoc:
40
33
 
41
34
  # Return Pagy object and results
42
35
  def pagy_meilisearch(pagy_search_args, vars = {})
43
- model, term, options = pagy_search_args
44
- vars = pagy_meilisearch_get_vars(nil, vars)
45
- options[:limit] = vars[:items]
46
- options[:offset] = (vars[:page] - 1) * vars[:items]
47
- results = model.send(DEFAULT[:meilisearch_search], term, **options)
48
- vars[:count] = results.raw_answer['nbHits']
49
- pagy = ::Pagy.new(vars)
36
+ model, term, options = pagy_search_args
37
+ vars = pagy_meilisearch_get_vars(nil, vars)
38
+ options[:hits_per_page] = vars[:items]
39
+ options[:page] = vars[:page]
40
+ results = model.send(:ms_search, term, **options)
41
+ vars[:count] = results.raw_answer['totalHits']
42
+
43
+ pagy = ::Pagy.new(vars)
50
44
  # with :last_page overflow we need to re-run the method in order to get the hits
51
45
  return pagy_meilisearch(pagy_search_args, vars.merge(page: pagy.page)) \
52
46
  if defined?(::Pagy::OverflowExtra) && pagy.overflow? && pagy.vars[:overflow] == :last_page
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/metadata
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/metadata
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/url_helpers'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/navs
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/navs
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -18,7 +18,7 @@ class Pagy # :nodoc:
18
18
  'gap' => %(<span class="page gap">#{pagy_t 'pagy.nav.gap'}</span> ),
19
19
  'after' => pagy_nav_next_html(pagy, link) }
20
20
 
21
- %(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-nav-js pagination" aria-label="pager" #{
21
+ %(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-nav-js pagination" #{
22
22
  pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
23
23
  end
24
24
 
@@ -31,7 +31,7 @@ class Pagy # :nodoc:
31
31
  input = %(<input type="number" min="1" max="#{p_pages}" value="#{
32
32
  p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
33
33
 
34
- %(<nav#{p_id} class="pagy-combo-nav-js pagination" aria-label="pager" #{
34
+ %(<nav#{p_id} class="pagy-combo-nav-js pagination" #{
35
35
  pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
36
36
  pagy_nav_prev_html pagy, link
37
37
  }<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/overflow
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/overflow
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -41,7 +41,7 @@ class Pagy # :nodoc:
41
41
 
42
42
  # Special series for empty page
43
43
  module Series
44
- def series(*)
44
+ def series(*, **)
45
45
  @page = @last # series for last page
46
46
  super.tap do |s| # call original series
47
47
  s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page)
@@ -1,18 +1,10 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/searchkick
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/searchkick
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
5
5
  DEFAULT[:searchkick_search] ||= :search
6
- DEFAULT[:searchkick_pagy_search] ||= if DEFAULT[:searchkick_search_method] # remove in 6.0
7
- # :nocov:
8
- Warning.warn '[PAGY WARNING] The :searchkick_search_method variable ' \
9
- 'has been deprecated and will be ignored from pagy 6. ' \
10
- 'Use :searchkick_pagy_search instead.'
11
- DEFAULT[:searchkick_search_method]
12
- # :nocov:
13
- else
14
- :pagy_search
15
- end
6
+ DEFAULT[:searchkick_pagy_search] ||= :pagy_search
7
+
16
8
  # Paginate Searchkick::Results objects
17
9
  module SearchkickExtra
18
10
  module Searchkick # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/semantic
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/semantic
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/standalone
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/standalone
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'uri'
@@ -8,6 +8,7 @@ class Pagy # :nodoc:
8
8
  # even in the irb/rails console without any app or config.
9
9
  module StandaloneExtra
10
10
  # Extracted from Rack::Utils and reformatted for rubocop
11
+ # :nocov:
11
12
  module QueryUtils
12
13
  module_function
13
14
 
@@ -32,6 +33,7 @@ class Pagy # :nodoc:
32
33
  end
33
34
  end
34
35
  end
36
+ # :nocov:
35
37
 
36
38
  # Return the URL for the page. If there is no pagy.vars[:url]
37
39
  # it works exactly as the regular #pagy_url_for, relying on the params method and Rack.
@@ -45,9 +47,8 @@ class Pagy # :nodoc:
45
47
  params = pagy.params.is_a?(Hash) ? pagy.params.clone : {} # safe when it gets reused
46
48
  params[page_param] = page
47
49
  params[items_param] = vars[:items] if vars[:items_extra]
48
- query_string = "?#{QueryUtils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0
49
- # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0
50
- # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0
50
+ params = pagy.params.call(params) if pagy.params.is_a?(Proc)
51
+ query_string = "?#{QueryUtils.build_nested_query(params)}"
51
52
  query_string = query_string.gsub('&', '&amp;') if html_escaped # the only unescaped entity
52
53
  "#{vars[:url]}#{query_string}#{vars[:fragment]}"
53
54
  end
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/support
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/support
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/trim
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/trim
2
2
  # frozen_string_literal: true
3
3
 
4
4
  class Pagy # :nodoc:
@@ -1,4 +1,4 @@
1
- # See the Pagy documentation: https://ddnexus.github.io/pagy/extras/uikit
1
+ # See the Pagy documentation: https://ddnexus.github.io/pagy/docs/extras/uikit
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/extras/frontend_helpers'
data/lib/pagy/frontend.rb CHANGED
@@ -1,4 +1,4 @@
1
- # See Pagy::Frontend API documentation: https://ddnexus.github.io/pagy/api/frontend
1
+ # See Pagy::Frontend API documentation: https://ddnexus.github.io/pagy/docs/api/frontend
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pagy/url_helpers'
@@ -21,7 +21,7 @@ class Pagy
21
21
  p_prev = pagy.prev
22
22
  p_next = pagy.next
23
23
 
24
- html = +%(<nav#{p_id} class="pagy-nav pagination" aria-label="pager">)
24
+ html = +%(<nav#{p_id} class="pagy-nav pagination">)
25
25
  html << if p_prev
26
26
  %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
27
27
  else
data/lib/pagy/i18n.rb CHANGED
@@ -1,4 +1,4 @@
1
- # See Pagy::I18n API documentation https://ddnexus.github.io/pagy/api/i18n
1
+ # See Pagy::I18n API documentation https://ddnexus.github.io/pagy/docs/api/i18n
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'yaml'
@@ -8,32 +8,17 @@ class Pagy
8
8
  # For non-rack environments you can use the standalone extra
9
9
  def pagy_url_for(pagy, page, absolute: false, html_escaped: false)
10
10
  vars = pagy.vars
11
+ request_path = vars[:request_path].to_s.empty? ? request.path : vars[:request_path]
11
12
  page_param = vars[:page_param].to_s
12
13
  items_param = vars[:items_param].to_s
13
14
  params = pagy.params.is_a?(Hash) ? pagy.params.transform_keys(&:to_s) : {}
14
15
  params = request.GET.merge(params)
15
16
  params[page_param] = page
16
17
  params[items_param] = vars[:items] if vars[:items_extra]
17
- query_string = "?#{Rack::Utils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0
18
- # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0
19
- # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0
18
+ params = pagy.params.call(params) if pagy.params.is_a?(Proc)
19
+ query_string = "?#{Rack::Utils.build_nested_query(params)}"
20
20
  query_string = query_string.gsub('&', '&amp;') if html_escaped # the only unescaped entity
21
- "#{request.base_url if absolute}#{request.path}#{query_string}#{vars[:fragment]}"
22
- end
23
-
24
- private
25
-
26
- # Transitional code to handle params deprecations. It will be removed in version 6.0
27
- def pagy_deprecated_params(pagy, params) # remove in 6.0
28
- if pagy.params.is_a?(Proc) # new code
29
- pagy.params.call(params)
30
- elsif respond_to?(:pagy_massage_params) # deprecated code
31
- Warning.warn '[PAGY WARNING] The pagy_massage_params method has been deprecated and it will be ignored from version 6. ' \
32
- 'Set the :params variable to a Proc with the same code as the pagy_massage_params method.'
33
- pagy_massage_params(params)
34
- else
35
- params # no massage params
36
- end
21
+ "#{request.base_url if absolute}#{request_path}#{query_string}#{vars[:fragment]}"
37
22
  end
38
23
  end
39
24
  end
data/lib/pagy.rb CHANGED
@@ -1,11 +1,11 @@
1
- # See Pagy API documentation: https://ddnexus.github.io/pagy/api/pagy
1
+ # See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/pagy
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pathname'
5
5
 
6
6
  # Core class
7
7
  class Pagy
8
- VERSION = '5.10.1'
8
+ VERSION = '6.0.1'
9
9
 
10
10
  # Root pathname to get the path of Pagy files like templates or dictionaries
11
11
  def self.root
@@ -22,9 +22,10 @@ class Pagy
22
22
  fragment: '',
23
23
  link_extra: '',
24
24
  i18n_key: 'pagy.item_name',
25
- cycle: false }
25
+ cycle: false,
26
+ request_path: '' }
26
27
 
27
- attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :in, :from, :to, :prev, :next, :params
28
+ attr_reader :count, :page, :items, :vars, :pages, :last, :offset, :in, :from, :to, :prev, :next, :params, :request_path
28
29
 
29
30
  # Merge and validate the options, do some simple arithmetic and set the instance variables
30
31
  def initialize(vars)
@@ -34,6 +35,7 @@ class Pagy
34
35
  setup_pages_var
35
36
  setup_offset_var
36
37
  setup_params_var
38
+ setup_request_path_var
37
39
  raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
38
40
 
39
41
  @from = [@offset - @outset + 1, @count].min
@@ -92,7 +94,7 @@ class Pagy
92
94
  def setup_vars(name_min)
93
95
  name_min.each do |name, min|
94
96
  raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
95
- unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
97
+ unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
96
98
  end
97
99
  end
98
100
 
@@ -116,6 +118,16 @@ class Pagy
116
118
  raise VariableError.new(self, :params, 'must be a Hash or a Proc', @params) \
117
119
  unless (@params = @vars[:params]).is_a?(Hash) || @params.is_a?(Proc)
118
120
  end
121
+
122
+ def setup_request_path_var
123
+ request_path = @vars[:request_path]
124
+ return if request_path.to_s.empty?
125
+
126
+ raise VariableError.new(self, :request_path, 'must be a bare path like "/foo"', request_path) \
127
+ if !request_path.start_with?('/') || request_path.include?('?')
128
+
129
+ @request_path = request_path
130
+ end
119
131
  end
120
132
 
121
133
  require 'pagy/backend'
@@ -6,7 +6,7 @@
6
6
  Usage: link.call( page_number [, text [, extra_attributes_string ]])
7
7
  -%>
8
8
  <% link = pagy_link_proc(pagy, link_extra: 'class="page-link"') -%>
9
- <%# -%><nav aria-label="pager" class="pagy-bootstrap-nav" role="navigation">
9
+ <%# -%><nav class="pagy-bootstrap-nav" role="navigation">
10
10
  <%# -%> <ul class="pagination">
11
11
  <% if pagy.prev -%> <li class="page-item prev"><%== link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"') %></li>
12
12
  <% else -%> <li class="page-item prev disabled"><a href="#" class="page-link"><%== pagy_t('pagy.nav.prev') %></a></li>