pagy 8.6.0 → 9.0.2

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 (103) hide show
  1. checksums.yaml +4 -4
  2. data/apps/calendar.ru +5 -5
  3. data/apps/demo.ru +8 -9
  4. data/apps/keyset_ar.ru +236 -0
  5. data/apps/keyset_s.ru +238 -0
  6. data/apps/rails.ru +7 -9
  7. data/apps/repro.ru +5 -6
  8. data/apps/tmp/calendar.sqlite3 +0 -0
  9. data/apps/tmp/calendar.sqlite3-shm +0 -0
  10. data/apps/tmp/calendar.sqlite3-wal +0 -0
  11. data/apps/tmp/local_secret.txt +1 -1
  12. data/apps/tmp/pagy-keyset-ar.sqlite3 +0 -0
  13. data/apps/tmp/{pagy-rails.sqlite3 → pagy-keyset-ar.sqlite3-shm} +0 -0
  14. data/apps/tmp/pagy-keyset-ar.sqlite3-wal +0 -0
  15. data/apps/tmp/pagy-keyset-s.sqlite3 +0 -0
  16. data/bin/pagy +4 -2
  17. data/config/pagy.rb +34 -31
  18. data/javascripts/pagy-module.js +1 -1
  19. data/javascripts/pagy.js +2 -2
  20. data/javascripts/pagy.min.js +2 -2
  21. data/javascripts/pagy.min.js.map +3 -3
  22. data/javascripts/pagy.mjs +2 -2
  23. data/lib/pagy/b64.rb +33 -0
  24. data/lib/pagy/backend.rb +21 -17
  25. data/lib/pagy/calendar/day.rb +1 -1
  26. data/lib/pagy/calendar/month.rb +1 -1
  27. data/lib/pagy/calendar/quarter.rb +1 -1
  28. data/lib/pagy/calendar/unit.rb +7 -10
  29. data/lib/pagy/calendar/week.rb +1 -1
  30. data/lib/pagy/calendar/year.rb +1 -1
  31. data/lib/pagy/calendar.rb +5 -5
  32. data/lib/pagy/countless.rb +11 -15
  33. data/lib/pagy/extras/arel.rb +8 -10
  34. data/lib/pagy/extras/array.rb +4 -6
  35. data/lib/pagy/extras/bootstrap.rb +5 -5
  36. data/lib/pagy/extras/bulma.rb +10 -7
  37. data/lib/pagy/extras/calendar.rb +4 -5
  38. data/lib/pagy/extras/countless.rb +15 -13
  39. data/lib/pagy/extras/elasticsearch_rails.rb +15 -15
  40. data/lib/pagy/extras/gearbox.rb +26 -26
  41. data/lib/pagy/extras/headers.rb +25 -24
  42. data/lib/pagy/extras/js_tools.rb +8 -8
  43. data/lib/pagy/extras/jsonapi.rb +26 -16
  44. data/lib/pagy/extras/keyset.rb +36 -0
  45. data/lib/pagy/extras/limit.rb +63 -0
  46. data/lib/pagy/extras/meilisearch.rb +11 -11
  47. data/lib/pagy/extras/metadata.rb +2 -2
  48. data/lib/pagy/extras/overflow.rb +6 -6
  49. data/lib/pagy/extras/pagy.rb +16 -16
  50. data/lib/pagy/extras/searchkick.rb +11 -11
  51. data/lib/pagy/extras/size.rb +2 -2
  52. data/lib/pagy/extras/standalone.rb +6 -6
  53. data/lib/pagy/extras/trim.rb +2 -2
  54. data/lib/pagy/frontend.rb +32 -33
  55. data/lib/pagy/i18n.rb +1 -1
  56. data/lib/pagy/keyset/active_record.rb +38 -0
  57. data/lib/pagy/keyset/sequel.rb +51 -0
  58. data/lib/pagy/keyset.rb +98 -0
  59. data/lib/pagy/shared_methods.rb +27 -0
  60. data/lib/pagy/url_helpers.rb +4 -4
  61. data/lib/pagy.rb +54 -68
  62. data/locales/ar.yml +2 -1
  63. data/locales/be.yml +1 -1
  64. data/locales/bg.yml +1 -1
  65. data/locales/bs.yml +1 -1
  66. data/locales/ca.yml +1 -1
  67. data/locales/ckb.yml +1 -1
  68. data/locales/cs.yml +1 -1
  69. data/locales/da.yml +1 -1
  70. data/locales/de.yml +1 -1
  71. data/locales/en.yml +1 -1
  72. data/locales/es.yml +1 -1
  73. data/locales/fr.yml +1 -1
  74. data/locales/hr.yml +1 -1
  75. data/locales/id.yml +1 -1
  76. data/locales/it.yml +1 -1
  77. data/locales/ja.yml +1 -1
  78. data/locales/km.yml +1 -1
  79. data/locales/ko.yml +1 -1
  80. data/locales/nb.yml +1 -1
  81. data/locales/nl.yml +1 -1
  82. data/locales/nn.yml +1 -1
  83. data/locales/pl.yml +1 -1
  84. data/locales/pt-BR.yml +1 -1
  85. data/locales/pt.yml +1 -1
  86. data/locales/ru.yml +1 -1
  87. data/locales/sr.yml +1 -1
  88. data/locales/sv-SE.yml +1 -1
  89. data/locales/sv.yml +1 -1
  90. data/locales/sw.yml +1 -1
  91. data/locales/ta.yml +1 -1
  92. data/locales/tr.yml +1 -1
  93. data/locales/uk.yml +1 -1
  94. data/locales/vi.yml +1 -1
  95. data/locales/zh-CN.yml +1 -1
  96. data/locales/zh-HK.yml +1 -1
  97. data/locales/zh-TW.yml +1 -1
  98. metadata +16 -16
  99. data/lib/pagy/extras/foundation.rb +0 -95
  100. data/lib/pagy/extras/items.rb +0 -64
  101. data/lib/pagy/extras/materialize.rb +0 -100
  102. data/lib/pagy/extras/semantic.rb +0 -94
  103. data/lib/pagy/extras/uikit.rb +0 -98
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 013eaae07b22187a35f7f0d3a4af1fab4116898753a980608cb92206f97ab7f1
4
- data.tar.gz: 112ecb19602649ba6f3afcdb6970033de2da04d99323862c23bd848cbde91229
3
+ metadata.gz: 84fb84478a3d43cc133f13476dd6d010e3d84156ff7704796b38beb566539fa8
4
+ data.tar.gz: 1d694c518d6f5d22fc93336286abda94a881672ef8f4d90079f26a452738dfcf
5
5
  SHA512:
6
- metadata.gz: a6628de44f14b335a77033c22137ff5010899a4f9582323bd10579fda3bc4a4021bdac3bb95ac5d092f988ab49219c02a7cf8f9c8e0c1adca7c34f32288503ac
7
- data.tar.gz: 9bb3d14d068e87b4863781ed0469f34702d21a71d999c9069c67eade9017ec2f33b21868b6ebe79cd2cc8ff3bf1017b2978ea0088f165fa48bb283f992d3ef93
6
+ metadata.gz: 4ecd31ce348069d557454bf751b719fbd05f0f82c08bde7f10ee0ac8aea2c5c2c63c0bbc3e2b03dc9a606102bf4ed319cc1b8b60f6d77635be3d498e275f504b
7
+ data.tar.gz: 258bcd1fb0b66948aefb1798c9a04b998ce18fffc4ded3bea78c6517a6de33b0bc2f75d429d95025916f6d5621d38420670222ec31683cc66ebbbf68182277d2
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.0'
18
+ VERSION = '9.0.2'
19
19
 
20
20
  # Gemfile
21
21
  require 'bundler/inline'
@@ -70,6 +70,7 @@ Groupdate.time_zone = false
70
70
  Groupdate.week_start = :monday
71
71
 
72
72
  # Activerecord initializer
73
+ ActiveRecord::Base.logger = Logger.new(OUTPUT)
73
74
  ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "#{dir}/tmp/calendar.sqlite3")
74
75
  ActiveRecord::Schema.define do
75
76
  create_table :events, force: true do |t|
@@ -735,11 +736,10 @@ TIMES = <<~TIMES
735
736
  TIMES
736
737
 
737
738
  # DB seed
739
+ events = []
738
740
  TIMES.each_line(chomp: true).with_index do |time, i|
739
- Event.create(title: "Event ##{i + 1}", time:)
741
+ events << { title: "Event ##{i + 1}", time: }
740
742
  end
741
-
742
- # Down here to avoid logging the DB seed above at each restart
743
- ActiveRecord::Base.logger = Logger.new(OUTPUT)
743
+ Event.insert_all(events)
744
744
 
745
745
  run Calendar
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.0'
21
+ VERSION = '9.0.2'
22
22
 
23
23
  require 'bundler/inline'
24
24
  require 'bundler'
@@ -41,10 +41,9 @@ 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
- Pagy::DEFAULT[:size] = [1, 4, 4, 1] # old size default
48
47
 
49
48
  # sinatra setup
50
49
  require 'sinatra/base'
@@ -381,18 +380,18 @@ for details</p>
381
380
  <%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'simple-nav', aria_label: 'Pages simple-nav', size: 5) %>
382
381
  <%= highlight(html) %>
383
382
 
384
- <h2>pagy<%= prefix %>_nav <span class="notes">Classic nav <code>size: [1,4,4,1]</code></span></h2>
383
+ <h2>pagy<%= prefix %>_nav <span class="notes">Fast nav <code>size: 7</code></span></h2>
385
384
  <%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'nav', aria_label: 'Pages nav') %>
386
385
  <%= highlight(html) %>
387
386
 
388
- <h2>pagy<%= prefix %>_nav_js <span class="notes">Classic nav <code>size: [1,4,4,1]</code></span></h2>
387
+ <h2>pagy<%= prefix %>_nav_js <span class="notes">Fast nav <code>size: 7</code></span></h2>
389
388
  <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
390
389
  <%= highlight(html) %>
391
390
 
392
- <h2>pagy<%= prefix %>_nav_js <span class="notes">Responsive <code>steps: {...}</code> (Resize the window to see)</span></h2>
391
+ <h2>pagy<%= prefix %>_nav_js <span class="notes">Responsive nav <code>steps: {...}</code> (Resize the window to see)</span></h2>
393
392
  <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js-responsive',
394
393
  aria_label: 'Pages nav_js_responsive',
395
- steps: { 0 => [1,1,1,1], 500 => [1,3,3,1], 750 => [1,5,5,1], 1000 => [2,6,6,2] }) %>
394
+ steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
396
395
  <%= highlight(html) %>
397
396
 
398
397
  <h2>pagy<%= prefix %>_combo_nav_js</h2>
@@ -404,8 +403,8 @@ for details</p>
404
403
  <%= highlight(html) %>
405
404
 
406
405
  <% if style.match(/pagy|tailwind/) %>
407
- <h2>pagy_items_selector_js</h2>
408
- <%= 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') %>
409
408
  <%= highlight(html) %>
410
409
 
411
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.0'
18
+ VERSION = '9.0.2'
19
19
 
20
20
  # Gemfile
21
21
  require 'bundler/inline'
@@ -61,13 +61,14 @@ 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[:size] = [1, 4, 4, 1]
67
- Pagy::DEFAULT[:items] = 10
66
+ Pagy::DEFAULT[:limit] = 10
68
67
  Pagy::DEFAULT[:overflow] = :empty_page
69
68
  Pagy::DEFAULT.freeze
70
69
 
70
+ # Activerecord initializer
71
+ ActiveRecord::Base.logger = Logger.new(OUTPUT)
71
72
  ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "#{dir}/tmp/pagy-rails.sqlite3")
72
73
  ActiveRecord::Schema.define do
73
74
  create_table :posts, force: true do |t|
@@ -97,9 +98,6 @@ Post.all.each_with_index do |post, pi|
97
98
  2.times { |ci| Comment.create(post:, body: "Comment #{ci + 1} to Post #{pi + 1}") }
98
99
  end
99
100
 
100
- # Down here to avoid logging the DB seed above at each restart
101
- ActiveRecord::Base.logger = Logger.new(OUTPUT)
102
-
103
101
  # Helpers
104
102
  module CommentsHelper
105
103
  include Pagy::Frontend
@@ -202,8 +200,8 @@ TEMPLATE = <<~ERB
202
200
  <h4>pagy_combo_nav_js</h4>
203
201
  <%== pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
204
202
 
205
- <h4>pagy_items_selector_js</h4>
206
- <%== 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') %>
207
205
 
208
206
  <h4>pagy_info</h4>
209
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.0'
18
+ VERSION = '9.0.2'
19
19
 
20
20
  require 'bundler/inline'
21
21
  require 'bundler'
@@ -31,10 +31,9 @@ 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
- Pagy::DEFAULT[:size] = [1, 4, 4, 1]
38
37
  Pagy::DEFAULT.freeze
39
38
 
40
39
  require 'sinatra/base'
@@ -165,13 +164,13 @@ __END__
165
164
 
166
165
  <h4>pagy_nav_js</h4>
167
166
  <%= pagy_nav_js(@pagy, id: 'nav-js-responsive', aria_label: 'Pages nav_js_responsove',
168
- steps: { 0 => [1,1,1,1], 500 => [1,3,3,1], 750 => [1,5,5,1], 1000 => [2,6,6,2] }) %>
167
+ steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
169
168
 
170
169
  <h4>pagy_combo_nav_js</h4>
171
170
  <%= pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
172
171
 
173
- <h4>pagy_items_selector_js</h4>
174
- <%= 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') %>
175
174
 
176
175
  <h4>pagy_info</h4>
177
176
  <%= pagy_info(@pagy, id: 'pagy-info') %>
Binary file
Binary file
Binary file
@@ -1 +1 @@
1
- 4c768dd9af0cc4594a919e6d97ad57eae7eb49ff053ff829c361a3d8aa7364023f94aa9f9613d122a3c42803217a44c4ddf9846d6a300e7a78fcaa344decd317
1
+ 0db96a70cc96bc7061757f38eec002ce6b14c6d987c4373d79a9f48bdcb0a26f4e00c88eec7a18c496d2779eb277f8b4a85f41dcac4c85482c7d5dd7cf05ba87
Binary file
File without changes
Binary file