pagy 8.6.3 → 9.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/apps/calendar.ru +5 -5
  3. data/apps/demo.ru +4 -4
  4. data/apps/keyset_ar.ru +236 -0
  5. data/apps/keyset_s.ru +238 -0
  6. data/apps/rails.ru +5 -5
  7. data/apps/repro.ru +4 -4
  8. data/bin/pagy +4 -2
  9. data/config/pagy.rb +17 -13
  10. data/javascripts/pagy.min.js +2 -2
  11. data/javascripts/pagy.min.js.map +2 -2
  12. data/javascripts/pagy.mjs +2 -2
  13. data/lib/pagy/b64.rb +33 -0
  14. data/lib/pagy/backend.rb +19 -19
  15. data/lib/pagy/calendar/day.rb +1 -1
  16. data/lib/pagy/calendar/month.rb +1 -1
  17. data/lib/pagy/calendar/quarter.rb +1 -1
  18. data/lib/pagy/calendar/unit.rb +7 -10
  19. data/lib/pagy/calendar/week.rb +1 -1
  20. data/lib/pagy/calendar/year.rb +1 -1
  21. data/lib/pagy/calendar.rb +5 -5
  22. data/lib/pagy/countless.rb +10 -14
  23. data/lib/pagy/extras/arel.rb +2 -10
  24. data/lib/pagy/extras/array.rb +5 -10
  25. data/lib/pagy/extras/bootstrap.rb +5 -5
  26. data/lib/pagy/extras/bulma.rb +10 -7
  27. data/lib/pagy/extras/calendar.rb +4 -5
  28. data/lib/pagy/extras/countless.rb +8 -13
  29. data/lib/pagy/extras/elasticsearch_rails.rb +16 -25
  30. data/lib/pagy/extras/gearbox.rb +18 -18
  31. data/lib/pagy/extras/headers.rb +25 -24
  32. data/lib/pagy/extras/js_tools.rb +4 -4
  33. data/lib/pagy/extras/jsonapi.rb +26 -19
  34. data/lib/pagy/extras/keyset.rb +30 -0
  35. data/lib/pagy/extras/limit.rb +63 -0
  36. data/lib/pagy/extras/meilisearch.rb +9 -17
  37. data/lib/pagy/extras/metadata.rb +2 -2
  38. data/lib/pagy/extras/overflow.rb +5 -5
  39. data/lib/pagy/extras/pagy.rb +16 -16
  40. data/lib/pagy/extras/searchkick.rb +9 -17
  41. data/lib/pagy/extras/size.rb +1 -1
  42. data/lib/pagy/extras/standalone.rb +6 -6
  43. data/lib/pagy/extras/trim.rb +2 -2
  44. data/lib/pagy/frontend.rb +32 -33
  45. data/lib/pagy/i18n.rb +2 -2
  46. data/lib/pagy/keyset/active_record.rb +38 -0
  47. data/lib/pagy/keyset/sequel.rb +51 -0
  48. data/lib/pagy/keyset.rb +98 -0
  49. data/lib/pagy/shared_methods.rb +27 -0
  50. data/lib/pagy/url_helpers.rb +4 -4
  51. data/lib/pagy.rb +51 -65
  52. data/locales/ar.yml +1 -1
  53. data/locales/be.yml +1 -1
  54. data/locales/bg.yml +1 -1
  55. data/locales/bs.yml +1 -1
  56. data/locales/ca.yml +1 -1
  57. data/locales/ckb.yml +1 -1
  58. data/locales/cs.yml +1 -1
  59. data/locales/da.yml +1 -1
  60. data/locales/de.yml +1 -1
  61. data/locales/en.yml +1 -1
  62. data/locales/es.yml +1 -1
  63. data/locales/fr.yml +1 -1
  64. data/locales/hr.yml +1 -1
  65. data/locales/id.yml +1 -1
  66. data/locales/it.yml +1 -1
  67. data/locales/ja.yml +1 -1
  68. data/locales/km.yml +1 -1
  69. data/locales/ko.yml +1 -1
  70. data/locales/nb.yml +1 -1
  71. data/locales/nl.yml +1 -1
  72. data/locales/nn.yml +1 -1
  73. data/locales/pl.yml +1 -1
  74. data/locales/pt-BR.yml +1 -1
  75. data/locales/pt.yml +1 -1
  76. data/locales/ru.yml +1 -1
  77. data/locales/sr.yml +1 -1
  78. data/locales/sv-SE.yml +1 -1
  79. data/locales/sv.yml +1 -1
  80. data/locales/sw.yml +1 -1
  81. data/locales/ta.yml +1 -1
  82. data/locales/tr.yml +1 -1
  83. data/locales/uk.yml +1 -1
  84. data/locales/vi.yml +1 -1
  85. data/locales/zh-CN.yml +1 -1
  86. data/locales/zh-HK.yml +1 -1
  87. data/locales/zh-TW.yml +1 -1
  88. metadata +12 -24
  89. data/apps/tmp/calendar.sqlite3 +0 -0
  90. data/apps/tmp/calendar.sqlite3-shm +0 -0
  91. data/apps/tmp/calendar.sqlite3-wal +0 -0
  92. data/apps/tmp/local_secret.txt +0 -1
  93. data/apps/tmp/pagy-keyset.sqlite3 +0 -0
  94. data/apps/tmp/pagy-keyset.sqlite3-shm +0 -0
  95. data/apps/tmp/pagy-keyset.sqlite3-wal +0 -0
  96. data/javascripts/pagy-module.js +0 -100
  97. data/javascripts/pagy.js +0 -4
  98. data/lib/pagy/extras/foundation.rb +0 -95
  99. data/lib/pagy/extras/items.rb +0 -64
  100. data/lib/pagy/extras/materialize.rb +0 -100
  101. data/lib/pagy/extras/semantic.rb +0 -94
  102. data/lib/pagy/extras/uikit.rb +0 -98
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2504119986405246907631188b14c4e366eb2247f7fdecdd6a14f187dbe56674
4
- data.tar.gz: 9a355076182f3446c64279c7e158f9d826963c472e2e9b17e497cb863bdcadcf
3
+ metadata.gz: 795b2037fdfb671d345ec7c4d3fa5c579d5f5723c9bf08edefeea659d5358529
4
+ data.tar.gz: 3d56cc37b697c409520e20e48eb1b60205ab03273197751055718e19acad17ac
5
5
  SHA512:
6
- metadata.gz: 30b2e50c83d38b52d186c8f53615b6fe8491fd22ace660f351cca2993ed98c25ab3a8b61117e57c5f3b465f28daba3ef2efe0cf0332c0e2cc4a09d8986cfc217
7
- data.tar.gz: 01cf06ebc92ce69ccc50252d259057d14b56b0149e9e982dbd52e8e1bd1fb889a7319dcf497df5c3c2d3b388372e5444520054eda76cbefbe908d7debb20f73e
6
+ metadata.gz: 567662eb87b2b042ae4044452546abd1d123e67d29000e1695c9c6402d229192761e7cb5613c8535d9ded2c79ac7374af8c8c599c9d3157a5824ce12052445ce
7
+ data.tar.gz: 9f5be0f4f62ca99d5ed083a3ecaa70544b42d3a15b99bf8990748dc2f703d2869e67425f960f977ed503d286c9b7e8245c9f8f101b4cfb533730a60908007c39
data/apps/calendar.ru CHANGED
@@ -15,7 +15,7 @@
15
15
  # DOC
16
16
  # https://ddnexus.github.io/pagy/playground/#5-calendar-app
17
17
 
18
- VERSION = '8.6.3'
18
+ VERSION = '9.0.5'
19
19
 
20
20
  # Gemfile
21
21
  require 'bundler/inline'
@@ -64,8 +64,6 @@ require 'pagy/extras/bootstrap'
64
64
  Pagy::DEFAULT.freeze
65
65
 
66
66
  # Groupdate initializer (https://github.com/ankane/groupdate)
67
- # Groupdate does not support the time zone with sqlite, so for this demo we can live with UTC
68
- Groupdate.time_zone = false
69
67
  # Groupdate week_start default is :sunday, while rails and pagy default to :monday
70
68
  Groupdate.week_start = :monday
71
69
 
@@ -120,8 +118,10 @@ class EventsController < ActionController::Base
120
118
  end
121
119
 
122
120
  def index
123
- # We need UTC to work with the limitation of groupdate with sqlite
124
- Time.zone = 'UTC'
121
+ # Groupdate does not support time zones with SQLite.
122
+ # 'UTC' does not work on certain machines config (pulling the actual local time zone utc_offset)
123
+ # so for this demo we use a different zone with utc_offset 0
124
+ Time.zone = 'GMT'
125
125
  # Default calendar
126
126
  # The conf Hash defines the pagy objects variables keyed by calendar unit and the final pagy standard object
127
127
  # The :skip is an optional and arbitrarily named param that skips the calendar pagination and uses only the pagy
data/apps/demo.ru CHANGED
@@ -18,7 +18,7 @@
18
18
  # DOC
19
19
  # https://ddnexus.github.io/pagy/playground/#3-demo-app
20
20
 
21
- VERSION = '8.6.3'
21
+ VERSION = '9.0.5'
22
22
 
23
23
  require 'bundler/inline'
24
24
  require 'bundler'
@@ -41,7 +41,7 @@ STYLES = { pagy: { extra: 'pagy', prefix: '', css_anchor: 'pagy-scss' },
41
41
  STYLES.each_key do |style|
42
42
  require "pagy/extras/#{STYLES[style][:extra] || style}"
43
43
  end
44
- require 'pagy/extras/items'
44
+ require 'pagy/extras/limit'
45
45
  require 'pagy/extras/trim'
46
46
  Pagy::DEFAULT[:trim_extra] = false # opt-in trim
47
47
 
@@ -403,8 +403,8 @@ for details</p>
403
403
  <%= highlight(html) %>
404
404
 
405
405
  <% if style.match(/pagy|tailwind/) %>
406
- <h2>pagy_items_selector_js</h2>
407
- <%= html = pagy_items_selector_js(@pagy, id: 'items-selector-js') %>
406
+ <h2>pagy_limit_selector_js</h2>
407
+ <%= html = pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
408
408
  <%= highlight(html) %>
409
409
 
410
410
  <h2>pagy_prev_a / pagy_next_a</h2>
data/apps/keyset_ar.ru ADDED
@@ -0,0 +1,236 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Starting point to reproduce keyset related pagy issues
4
+
5
+ # DEV USAGE
6
+ # pagy clone rails
7
+ # pagy ./keyset.ru
8
+
9
+ # URL
10
+ # http://0.0.0.0:8000
11
+
12
+ # HELP
13
+ # pagy -h
14
+
15
+ # DOC
16
+ # https://ddnexus.github.io/pagy/playground/#5-keyset-app
17
+
18
+ VERSION = '8.6.2'
19
+
20
+ # Gemfile
21
+ require 'bundler/inline'
22
+ require 'bundler'
23
+ Bundler.configure
24
+ gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
25
+ source 'https://rubygems.org'
26
+ gem 'oj'
27
+ gem 'puma'
28
+ gem 'rails'
29
+ # activerecord/sqlite3_adapter.rb probably useless) constraint !!!
30
+ # https://github.com/rails/rails/blame/v7.1.3.4/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L14
31
+ gem 'sqlite3', '~> 1.4.0'
32
+ end
33
+
34
+ # require 'rails/all' # too much stuff
35
+ require 'action_controller/railtie'
36
+ require 'active_record'
37
+
38
+ OUTPUT = Rails.env.showcase? ? IO::NULL : $stdout
39
+
40
+ # Rails config
41
+ class PagyKeyset < Rails::Application # :nodoc:
42
+ config.root = __dir__
43
+ config.session_store :cookie_store, key: 'cookie_store_key'
44
+ Rails.application.credentials.secret_key_base = 'absolute_secret'
45
+
46
+ config.logger = Logger.new(OUTPUT)
47
+ Rails.logger = config.logger
48
+
49
+ routes.draw do
50
+ root to: 'pets#index'
51
+ end
52
+ end
53
+
54
+ dir = Rails.env.development? ? '.' : Dir.pwd # app dir in dev or pwd otherwise
55
+ unless File.writable?(dir)
56
+ warn "ERROR: directory #{dir.inspect} is not writable (the pagy-rails-app needs to create DB files)"
57
+ exit 1
58
+ end
59
+
60
+ # Pagy initializer
61
+ require 'pagy/extras/pagy'
62
+ require 'pagy/extras/limit'
63
+ require 'pagy/extras/keyset'
64
+ Pagy::DEFAULT[:limit] = 10
65
+ Pagy::DEFAULT.freeze
66
+
67
+ PETS = <<~PETS
68
+ Luna | dog | 2018-03-10
69
+ Coco | cat | 2019-05-15
70
+ Dodo | dog | 2020-06-25
71
+ Wiki | bird | 2018-03-12
72
+ Baby | rabbit | 2020-01-13
73
+ Neki | horse | 2021-07-20
74
+ Tino | donkey | 2019-06-18
75
+ Plot | cat | 2022-09-21
76
+ Riki | cat | 2018-09-14
77
+ Susi | horse | 2018-10-26
78
+ Coco | pig | 2020-08-29
79
+ Momo | bird | 2023-08-25
80
+ Lili | cat | 2021-07-22
81
+ Beli | pig | 2020-07-26
82
+ Rocky | bird | 2022-08-19
83
+ Vyvy | dog | 2018-05-16
84
+ Susi | horse | 2024-01-25
85
+ Ella | cat | 2020-02-20
86
+ Rocky | dog | 2019-09-19
87
+ Juni | rabbit | 2020-08-24
88
+ Coco | bird | 2021-03-17
89
+ Susi | dog | 2021-07-28
90
+ Luna | horse | 2023-05-14
91
+ Gigi | pig | 2022-05-19
92
+ Coco | cat | 2020-02-20
93
+ Nino | donkey | 2019-06-17
94
+ Luna | cat | 2022-02-09
95
+ Popi | dog | 2020-09-26
96
+ Lili | pig | 2022-06-18
97
+ Mina | horse | 2021-04-21
98
+ Susi | rabbit | 2023-05-18
99
+ Toni | donkey | 2018-06-22
100
+ Rocky | horse | 2019-09-28
101
+ Lili | cat | 2019-03-18
102
+ Roby | cat | 2022-06-19
103
+ Anto | horse | 2022-08-18
104
+ Susi | pig | 2021-04-21
105
+ Boly | bird | 2020-03-29
106
+ Sky | cat | 2023-07-19
107
+ Lili | dog | 2020-01-28
108
+ Fami | snake | 2023-04-27
109
+ Lopi | pig | 2019-06-19
110
+ Rocky | snake | 2022-03-13
111
+ Denis | dog | 2022-06-19
112
+ Maca | cat | 2022-06-19
113
+ Luna | dog | 2022-08-15
114
+ Jeme | horse | 2019-08-08
115
+ Sary | bird | 2023-04-29
116
+ Rocky | bird | 2023-05-14
117
+ Coco | dog | 2023-05-27
118
+ PETS
119
+
120
+ # Activerecord initializer
121
+ ActiveRecord::Base.logger = Logger.new(OUTPUT)
122
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "#{dir}/tmp/pagy-keyset-ar.sqlite3")
123
+ ActiveRecord::Schema.define do
124
+ create_table :pets, force: true do |t|
125
+ t.string :animal
126
+ t.string :name
127
+ t.date :birthdate
128
+ end
129
+ end
130
+
131
+ # Models
132
+ class Pet < ActiveRecord::Base
133
+ end
134
+
135
+ # DB seed
136
+ pets = []
137
+ PETS.each_line(chomp: true) do |pet|
138
+ name, animal, birthdate = pet.split('|').map(&:strip)
139
+ pets << { name:, animal:, birthdate: }
140
+ end
141
+ Pet.insert_all(pets)
142
+
143
+ # Helpers
144
+ module PetsHelper
145
+ include Pagy::Frontend
146
+
147
+ def order_symbol(dir)
148
+ { asc: '&#x2197;', desc: '&#x2198;' }[dir]
149
+ end
150
+ end
151
+
152
+ # Controllers
153
+ class PetsController < ActionController::Base # :nodoc:
154
+ include Rails.application.routes.url_helpers
155
+ include Pagy::Backend
156
+
157
+ def index
158
+ Time.zone = 'UTC'
159
+
160
+ @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }
161
+ @pagy, @pets = pagy_keyset(Pet.order(@order))
162
+ render inline: TEMPLATE
163
+ end
164
+ end
165
+
166
+ TEMPLATE = <<~ERB
167
+ <!DOCTYPE html>
168
+ <html lang="en">
169
+ <html>
170
+ <head>
171
+ <title>Pagy Keyset App</title>
172
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
173
+ <style type="text/css">
174
+ @media screen { html, body {
175
+ font-size: 1rem;
176
+ line-height: 1.2s;
177
+ padding: 0;
178
+ margin: 0;
179
+ } }
180
+ body {
181
+ background: white !important;
182
+ margin: 0 !important;
183
+ font-family: sans-serif !important;
184
+ }
185
+ .content {
186
+ padding: 1rem 1.5rem 2rem !important;
187
+ }
188
+
189
+ <%== Pagy.root.join('stylesheets', 'pagy.css').read %>
190
+ </style>
191
+ </head>
192
+
193
+ <body>
194
+
195
+ <div class="content">
196
+ <h1>Pagy Keyset App</h1>
197
+ <p>Self-contained, standalone Rails app usable to easily reproduce any keyset related pagy issue with ActiveRecord sets.</p>
198
+ <p>Please, report the following versions in any new issue.</p>
199
+ <h2>Versions</h2>
200
+ <ul>
201
+ <li>Ruby: <%== RUBY_VERSION %></li>
202
+ <li>Rack: <%== Rack::RELEASE %></li>
203
+ <li>Rails: <%== Rails.version %></li>
204
+ <li>Pagy: <%== Pagy::VERSION %></li>
205
+ </ul>
206
+
207
+ <h3>Collection</h3>
208
+ <div id="records" class="collection">
209
+ <table border="1" cellspacing="0" cellpadding="3">
210
+ <tr>
211
+ <th>animal <%== order_symbol(@order[:animal]) %></th>
212
+ <th>name <%== order_symbol(@order[:name]) %></th>
213
+ <th>birthdate <%== order_symbol(@order[:birthdate]) %></th>
214
+ <th>id <%== order_symbol(@order[:id]) %></th>
215
+ </tr>
216
+ <% @pets.each do |pet| %>
217
+ <tr>
218
+ <td><%= pet.animal %></td>
219
+ <td><%= pet.name %></td>
220
+ <td><%= pet.birthdate %></td>
221
+ <td><%= pet.id %></td>
222
+ </tr>
223
+ <% end %>
224
+ </table>
225
+ </div>
226
+ <p>
227
+ <nav class="pagy" id="next" aria-label="Pagy next">
228
+ <%== pagy_next_a(@pagy, text: 'Next page &gt;') %>
229
+ </nav>
230
+ </div>
231
+
232
+ </body>
233
+ </html>
234
+ ERB
235
+
236
+ run PagyKeyset
data/apps/keyset_s.ru ADDED
@@ -0,0 +1,238 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Starting point to reproduce keyset related pagy issues
4
+
5
+ # DEV USAGE
6
+ # pagy clone rails
7
+ # pagy ./keyset.ru
8
+
9
+ # URL
10
+ # http://0.0.0.0:8000
11
+
12
+ # HELP
13
+ # pagy -h
14
+
15
+ # DOC
16
+ # https://ddnexus.github.io/pagy/playground/#5-keyset-app
17
+
18
+ VERSION = '8.6.2'
19
+
20
+ # Gemfile
21
+ require 'bundler/inline'
22
+ require 'bundler'
23
+ Bundler.configure
24
+ gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
25
+ source 'https://rubygems.org'
26
+ gem 'oj'
27
+ gem 'puma'
28
+ gem 'rails'
29
+ # activerecord/sqlite3_adapter.rb probably useless) constraint !!!
30
+ # https://github.com/rails/rails/blame/v7.1.3.4/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L14
31
+ gem 'sqlite3', '~> 1.4.0'
32
+ gem 'sequel'
33
+ end
34
+
35
+ # require 'rails/all' # too much stuff
36
+ require 'action_controller/railtie'
37
+ require 'sequel'
38
+
39
+ OUTPUT = Rails.env.showcase? ? IO::NULL : $stdout
40
+
41
+ # Rails config
42
+ class PagyKeyset < Rails::Application # :nodoc:
43
+ config.root = __dir__
44
+ config.session_store :cookie_store, key: 'cookie_store_key'
45
+ Rails.application.credentials.secret_key_base = 'absolute_secret'
46
+
47
+ config.logger = Logger.new(OUTPUT)
48
+ Rails.logger = config.logger
49
+
50
+ routes.draw do
51
+ root to: 'pets#index'
52
+ end
53
+ end
54
+
55
+ dir = Rails.env.development? ? '.' : Dir.pwd # app dir in dev or pwd otherwise
56
+ unless File.writable?(dir)
57
+ warn "ERROR: directory #{dir.inspect} is not writable (the pagy-rails-app needs to create DB files)"
58
+ exit 1
59
+ end
60
+
61
+ # Pagy initializer
62
+ require 'pagy/extras/pagy'
63
+ require 'pagy/extras/limit'
64
+ require 'pagy/extras/keyset'
65
+ Pagy::DEFAULT[:limit] = 10
66
+ Pagy::DEFAULT.freeze
67
+
68
+ PETS = <<~PETS
69
+ Luna | dog | 2018-03-10
70
+ Coco | cat | 2019-05-15
71
+ Dodo | dog | 2020-06-25
72
+ Wiki | bird | 2018-03-12
73
+ Baby | rabbit | 2020-01-13
74
+ Neki | horse | 2021-07-20
75
+ Tino | donkey | 2019-06-18
76
+ Plot | cat | 2022-09-21
77
+ Riki | cat | 2018-09-14
78
+ Susi | horse | 2018-10-26
79
+ Coco | pig | 2020-08-29
80
+ Momo | bird | 2023-08-25
81
+ Lili | cat | 2021-07-22
82
+ Beli | pig | 2020-07-26
83
+ Rocky | bird | 2022-08-19
84
+ Vyvy | dog | 2018-05-16
85
+ Susi | horse | 2024-01-25
86
+ Ella | cat | 2020-02-20
87
+ Rocky | dog | 2019-09-19
88
+ Juni | rabbit | 2020-08-24
89
+ Coco | bird | 2021-03-17
90
+ Susi | dog | 2021-07-28
91
+ Luna | horse | 2023-05-14
92
+ Gigi | pig | 2022-05-19
93
+ Coco | cat | 2020-02-20
94
+ Nino | donkey | 2019-06-17
95
+ Luna | cat | 2022-02-09
96
+ Popi | dog | 2020-09-26
97
+ Lili | pig | 2022-06-18
98
+ Mina | horse | 2021-04-21
99
+ Susi | rabbit | 2023-05-18
100
+ Toni | donkey | 2018-06-22
101
+ Rocky | horse | 2019-09-28
102
+ Lili | cat | 2019-03-18
103
+ Roby | cat | 2022-06-19
104
+ Anto | horse | 2022-08-18
105
+ Susi | pig | 2021-04-21
106
+ Boly | bird | 2020-03-29
107
+ Sky | cat | 2023-07-19
108
+ Lili | dog | 2020-01-28
109
+ Fami | snake | 2023-04-27
110
+ Lopi | pig | 2019-06-19
111
+ Rocky | snake | 2022-03-13
112
+ Denis | dog | 2022-06-19
113
+ Maca | cat | 2022-06-19
114
+ Luna | dog | 2022-08-15
115
+ Jeme | horse | 2019-08-08
116
+ Sary | bird | 2023-04-29
117
+ Rocky | bird | 2023-05-14
118
+ Coco | dog | 2023-05-27
119
+ PETS
120
+
121
+ Sequel.default_timezone = :utc
122
+
123
+ ## Sequel initializer
124
+ DB = Sequel.connect(adapter: 'sqlite', user: 'root', password: 'password', host: 'localhost', port: '3306',
125
+ database: "#{dir}/tmp/pagy-keyset-s.sqlite3", max_connections: 10, loggers: [Logger.new(OUTPUT)])
126
+
127
+ DB.create_table! :pets do
128
+ primary_key :id
129
+ String :animal, unique: false, null: false
130
+ String :name, unique: false, null: false
131
+ Date :birthdate, unique: false, null: false
132
+ end
133
+
134
+ dataset = DB[:pets]
135
+
136
+ PETS.each_line(chomp: true) do |pet|
137
+ name, animal, birthdate = pet.split('|').map(&:strip)
138
+ dataset.insert(name:, animal:, birthdate:)
139
+ end
140
+
141
+ # Models
142
+ class Pet < Sequel::Model
143
+ end
144
+
145
+ # Helpers
146
+ module PetsHelper
147
+ include Pagy::Frontend
148
+
149
+ def order_symbol(dir)
150
+ { asc: '&#x2197;', desc: '&#x2198;' }[dir]
151
+ end
152
+ end
153
+
154
+ # Controllers
155
+ class PetsController < ActionController::Base # :nodoc:
156
+ include Rails.application.routes.url_helpers
157
+ include Pagy::Backend
158
+
159
+ def index
160
+ Time.zone = 'UTC'
161
+
162
+ @order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }
163
+ @pagy, @pets = pagy_keyset(Pet.order(:animal, :name, Sequel.desc(:birthdate), :id))
164
+ render inline: TEMPLATE
165
+ end
166
+ end
167
+
168
+ TEMPLATE = <<~ERB
169
+ <!DOCTYPE html>
170
+ <html lang="en">
171
+ <html>
172
+ <head>
173
+ <title>Pagy Keyset App</title>
174
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
175
+ <style type="text/css">
176
+ @media screen { html, body {
177
+ font-size: 1rem;
178
+ line-height: 1.2s;
179
+ padding: 0;
180
+ margin: 0;
181
+ } }
182
+ body {
183
+ background: white !important;
184
+ margin: 0 !important;
185
+ font-family: sans-serif !important;
186
+ }
187
+ .content {
188
+ padding: 1rem 1.5rem 2rem !important;
189
+ }
190
+
191
+ <%== Pagy.root.join('stylesheets', 'pagy.css').read %>
192
+ </style>
193
+ </head>
194
+
195
+ <body>
196
+
197
+ <div class="content">
198
+ <h1>Pagy Keyset App</h1>
199
+ <p>Self-contained, standalone Rails app usable to easily reproduce any keyset related pagy issue with Sequel sets.</p>
200
+ <p>Please, report the following versions in any new issue.</p>
201
+ <h2>Versions</h2>
202
+ <ul>
203
+ <li>Ruby: <%== RUBY_VERSION %></li>
204
+ <li>Rack: <%== Rack::RELEASE %></li>
205
+ <li>Rails: <%== Rails.version %></li>
206
+ <li>Pagy: <%== Pagy::VERSION %></li>
207
+ </ul>
208
+
209
+ <h3>Collection</h3>
210
+ <div id="records" class="collection">
211
+ <table border="1" cellspacing="0" cellpadding="3">
212
+ <tr>
213
+ <th>animal <%== order_symbol(@order[:animal]) %></th>
214
+ <th>name <%== order_symbol(@order[:name]) %></th>
215
+ <th>birthdate <%== order_symbol(@order[:birthdate]) %></th>
216
+ <th>id <%== order_symbol(@order[:id]) %></th>
217
+ </tr>
218
+ <% @pets.each do |pet| %>
219
+ <tr>
220
+ <td><%= pet.animal %></td>
221
+ <td><%= pet.name %></td>
222
+ <td><%= pet.birthdate %></td>
223
+ <td><%= pet.id %></td>
224
+ </tr>
225
+ <% end %>
226
+ </table>
227
+ </div>
228
+ <p>
229
+ <nav class="pagy" id="next" aria-label="Pagy next">
230
+ <%== pagy_next_a(@pagy, text: 'Next page &gt;') %>
231
+ </nav>
232
+ </div>
233
+
234
+ </body>
235
+ </html>
236
+ ERB
237
+
238
+ run PagyKeyset
data/apps/rails.ru CHANGED
@@ -15,7 +15,7 @@
15
15
  # DOC
16
16
  # https://ddnexus.github.io/pagy/playground/#2-rails-app
17
17
 
18
- VERSION = '8.6.3'
18
+ VERSION = '9.0.5'
19
19
 
20
20
  # Gemfile
21
21
  require 'bundler/inline'
@@ -61,9 +61,9 @@ end
61
61
 
62
62
  # Pagy initializer
63
63
  require 'pagy/extras/pagy'
64
- require 'pagy/extras/items'
64
+ require 'pagy/extras/limit'
65
65
  require 'pagy/extras/overflow'
66
- Pagy::DEFAULT[:items] = 10
66
+ Pagy::DEFAULT[:limit] = 10
67
67
  Pagy::DEFAULT[:overflow] = :empty_page
68
68
  Pagy::DEFAULT.freeze
69
69
 
@@ -200,8 +200,8 @@ TEMPLATE = <<~ERB
200
200
  <h4>pagy_combo_nav_js</h4>
201
201
  <%== pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
202
202
 
203
- <h4>pagy_items_selector_js</h4>
204
- <%== pagy_items_selector_js(@pagy, id: 'items-selector-js') %>
203
+ <h4>pagy_limit_selector_js</h4>
204
+ <%== pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
205
205
 
206
206
  <h4>pagy_info</h4>
207
207
  <%== pagy_info(@pagy, id: 'pagy-info') %>
data/apps/repro.ru CHANGED
@@ -15,7 +15,7 @@
15
15
  # DOC
16
16
  # https://ddnexus.github.io/pagy/playground/#1-repro-app
17
17
 
18
- VERSION = '8.6.3'
18
+ VERSION = '9.0.5'
19
19
 
20
20
  require 'bundler/inline'
21
21
  require 'bundler'
@@ -31,7 +31,7 @@ end
31
31
  # Edit this section adding/removing the extras and Pagy::DEFAULT as needed
32
32
  # pagy initializer
33
33
  require 'pagy/extras/pagy'
34
- require 'pagy/extras/items'
34
+ require 'pagy/extras/limit'
35
35
  require 'pagy/extras/overflow'
36
36
  Pagy::DEFAULT[:overflow] = :empty_page
37
37
  Pagy::DEFAULT.freeze
@@ -169,8 +169,8 @@ __END__
169
169
  <h4>pagy_combo_nav_js</h4>
170
170
  <%= pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
171
171
 
172
- <h4>pagy_items_selector_js</h4>
173
- <%= pagy_items_selector_js(@pagy, id: 'items-selector-js') %>
172
+ <h4>pagy_limit_selector_js</h4>
173
+ <%= pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
174
174
 
175
175
  <h4>pagy_info</h4>
176
176
  <%= pagy_info(@pagy, id: 'pagy-info') %>
data/bin/pagy CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- VERSION = '8.6.3'
5
- APPS = %w[repro rails demo calendar].freeze
4
+ VERSION = '9.0.5'
5
+ APPS = %w[repro rails demo calendar keyset_ar keyset_s].freeze
6
6
  LINUX = RbConfig::CONFIG['host_os'].include?('linux')
7
7
  HOST = '0.0.0.0'
8
8
  PORT = '8000'
@@ -17,6 +17,8 @@ opts = Optimist.options do
17
17
  rails Reproduce rails related issues
18
18
  demo Showcase all the helpers and styles
19
19
  calendar Showcase the calendar; reproduce related issues
20
+ keyset_ar Showcase the keyset ActiveRecord pagination
21
+ keyset_s Showcase the keyset Sequel pagination
20
22
  USAGE
21
23
  pagy APP [options] Showcase APP from the installed gem
22
24
  pagy clone APP Clone APP to the current dir