pagy 8.0.0 → 9.0.0
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.
- 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/apps → apps}/demo.ru
RENAMED
@@ -18,10 +18,12 @@
|
|
18
18
|
# DOC
|
19
19
|
# https://ddnexus.github.io/pagy/playground/#3-demo-app
|
20
20
|
|
21
|
-
VERSION = '
|
21
|
+
VERSION = '9.0.0'
|
22
22
|
|
23
23
|
require 'bundler/inline'
|
24
|
-
|
24
|
+
require 'bundler'
|
25
|
+
Bundler.configure
|
26
|
+
gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
|
25
27
|
source 'https://rubygems.org'
|
26
28
|
gem 'oj'
|
27
29
|
gem 'puma'
|
@@ -34,19 +36,14 @@ end
|
|
34
36
|
STYLES = { pagy: { extra: 'pagy', prefix: '', css_anchor: 'pagy-scss' },
|
35
37
|
bootstrap: {},
|
36
38
|
bulma: {},
|
37
|
-
|
38
|
-
materialize: {},
|
39
|
-
semantic: {},
|
40
|
-
tailwind: { extra: 'pagy', prefix: '', css_anchor: 'pagy-tailwind-css' },
|
41
|
-
uikit: {} }.freeze
|
39
|
+
tailwind: { extra: 'pagy', prefix: '', css_anchor: 'pagy-tailwind-css' } }.freeze
|
42
40
|
|
43
41
|
STYLES.each_key do |style|
|
44
42
|
require "pagy/extras/#{STYLES[style][:extra] || style}"
|
45
43
|
end
|
46
|
-
require 'pagy/extras/
|
44
|
+
require 'pagy/extras/limit'
|
47
45
|
require 'pagy/extras/trim'
|
48
46
|
Pagy::DEFAULT[:trim_extra] = false # opt-in trim
|
49
|
-
Pagy::DEFAULT[:size] = [1, 4, 4, 1] # old size default
|
50
47
|
|
51
48
|
# sinatra setup
|
52
49
|
require 'sinatra/base'
|
@@ -71,7 +68,12 @@ class PagyDemo < Sinatra::Base
|
|
71
68
|
end
|
72
69
|
|
73
70
|
get('/javascripts/:file') do
|
74
|
-
|
71
|
+
format = params[:file].split('.').last
|
72
|
+
if format == 'js'
|
73
|
+
content_type 'application/javascript'
|
74
|
+
elsif format == 'map'
|
75
|
+
content_type 'application/json'
|
76
|
+
end
|
75
77
|
send_file Pagy.root.join('javascripts', params[:file])
|
76
78
|
end
|
77
79
|
|
@@ -235,7 +237,7 @@ __END__
|
|
235
237
|
<html lang="en">
|
236
238
|
<head>
|
237
239
|
<title>Pagy Demo App</title>
|
238
|
-
<script src="
|
240
|
+
<script src="/javascripts/pagy.min.js"></script>
|
239
241
|
<script>
|
240
242
|
window.addEventListener("load", Pagy.init);
|
241
243
|
</script>
|
@@ -244,7 +246,7 @@ __END__
|
|
244
246
|
<style type="text/css">
|
245
247
|
@media screen { html, body {
|
246
248
|
font-size: 1rem;
|
247
|
-
line-
|
249
|
+
line-height: 1.2s;
|
248
250
|
padding: 0;
|
249
251
|
margin: 0;
|
250
252
|
} }
|
@@ -253,7 +255,7 @@ __END__
|
|
253
255
|
margin: 0 !important;
|
254
256
|
font-family: sans-serif !important;
|
255
257
|
}
|
256
|
-
h1,
|
258
|
+
h1, h2 {
|
257
259
|
font-size: 1.8rem !important;
|
258
260
|
font-weight: 600 !important;
|
259
261
|
margin-top: 1rem !important;
|
@@ -261,7 +263,7 @@ __END__
|
|
261
263
|
line-height: 1.5 !important;
|
262
264
|
color: rgb(90 90 90) !important;
|
263
265
|
}
|
264
|
-
|
266
|
+
h2 {
|
265
267
|
font-family: monospace;
|
266
268
|
font-size: .9rem !important;
|
267
269
|
margin-top: 1.6rem !important;
|
@@ -295,7 +297,7 @@ __END__
|
|
295
297
|
margin-top: .3rem;
|
296
298
|
margin-bottom: 1rem;
|
297
299
|
font-size: .8rem !important;
|
298
|
-
line-
|
300
|
+
line-height: 1rem !important;
|
299
301
|
color: white;
|
300
302
|
background-color: rgb(30 30 30);
|
301
303
|
padding: 1rem;
|
@@ -351,20 +353,6 @@ __END__
|
|
351
353
|
@@ bulma_head
|
352
354
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
353
355
|
|
354
|
-
@@ foundation_head
|
355
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.8.1/dist/css/foundation.min.css" crossorigin="anonymous">
|
356
|
-
|
357
|
-
@@ materialize_head
|
358
|
-
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
359
|
-
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
|
360
|
-
|
361
|
-
@@ semantic_head
|
362
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/semantic-ui@2.5.0/dist/semantic.min.css"><script
|
363
|
-
src="https://code.jquery.com/jquery-3.1.1.min.js"
|
364
|
-
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
|
365
|
-
crossorigin="anonymous"></script>
|
366
|
-
<script src="https://cdn.jsdelivr.net/npm/semantic-ui@2.5.0/dist/semantic.min.js"></script>
|
367
|
-
|
368
356
|
@@ tailwind_head
|
369
357
|
<script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio"></script>
|
370
358
|
<!-- copy and paste the pagy.tailwind style in order to edit it -->
|
@@ -372,11 +360,6 @@ __END__
|
|
372
360
|
<%= Pagy.root.join('stylesheets', 'pagy.tailwind.css').read %>
|
373
361
|
</style>
|
374
362
|
|
375
|
-
@@ uikit_head
|
376
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uikit@3.18.3/dist/css/uikit.min.css" />
|
377
|
-
<script src="https://cdn.jsdelivr.net/npm/uikit@3.18.3/dist/js/uikit.min.js"></script>
|
378
|
-
<script src="https://cdn.jsdelivr.net/npm/uikit@3.18.3/dist/js/uikit-icons.min.js"></script>
|
379
|
-
|
380
363
|
|
381
364
|
@@ helpers
|
382
365
|
<h1><%= style %></h1>
|
@@ -390,45 +373,45 @@ documentation
|
|
390
373
|
<% end %>
|
391
374
|
for details</p>
|
392
375
|
|
393
|
-
<
|
394
|
-
<p>@records: <%= @records.join(',') %></p>
|
376
|
+
<h2>Collection</h2>
|
377
|
+
<p id="records">@records: <%= @records.join(',') %></p>
|
395
378
|
|
396
|
-
<
|
397
|
-
<%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'nav', aria_label: 'Pages nav', size: 5) %>
|
379
|
+
<h2>pagy<%= prefix %>_nav <span class="notes">Simple nav <code>size: 5</code></span></h2>
|
380
|
+
<%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'simple-nav', aria_label: 'Pages simple-nav', size: 5) %>
|
398
381
|
<%= highlight(html) %>
|
399
382
|
|
400
|
-
<
|
383
|
+
<h2>pagy<%= prefix %>_nav <span class="notes">Fast nav <code>size: 7</code></span></h2>
|
401
384
|
<%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'nav', aria_label: 'Pages nav') %>
|
402
385
|
<%= highlight(html) %>
|
403
386
|
|
404
|
-
<
|
387
|
+
<h2>pagy<%= prefix %>_nav_js <span class="notes">Fast nav <code>size: 7</code></span></h2>
|
405
388
|
<%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
|
406
389
|
<%= highlight(html) %>
|
407
390
|
|
408
|
-
<
|
391
|
+
<h2>pagy<%= prefix %>_nav_js <span class="notes">Responsive nav <code>steps: {...}</code> (Resize the window to see)</span></h2>
|
409
392
|
<%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js-responsive',
|
410
393
|
aria_label: 'Pages nav_js_responsive',
|
411
|
-
steps: { 0 => 5, 500 =>
|
394
|
+
steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
|
412
395
|
<%= highlight(html) %>
|
413
396
|
|
414
|
-
<
|
397
|
+
<h2>pagy<%= prefix %>_combo_nav_js</h2>
|
415
398
|
<%= html = send(:"pagy#{prefix}_combo_nav_js", @pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
|
416
399
|
<%= highlight(html) %>
|
417
400
|
|
418
|
-
<
|
401
|
+
<h2>pagy_info</h2>
|
419
402
|
<%= html = pagy_info(@pagy, id: 'pagy-info') %>
|
420
403
|
<%= highlight(html) %>
|
421
404
|
|
422
405
|
<% if style.match(/pagy|tailwind/) %>
|
423
|
-
<
|
424
|
-
<%= html =
|
406
|
+
<h2>pagy_limit_selector_js</h2>
|
407
|
+
<%= html = pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
|
425
408
|
<%= highlight(html) %>
|
426
409
|
|
427
|
-
<
|
428
|
-
<%= html = '<nav class="pagy">' << pagy_prev_a(@pagy) << pagy_next_a(@pagy) << '</nav>' %>
|
410
|
+
<h2>pagy_prev_a / pagy_next_a</h2>
|
411
|
+
<%= html = '<nav class="pagy" id="prev-next" aria-label="Pagy prev-next">' << pagy_prev_a(@pagy) << pagy_next_a(@pagy) << '</nav>' %>
|
429
412
|
<%= highlight(html) %>
|
430
413
|
|
431
|
-
<
|
414
|
+
<h2>pagy_prev_link / pagy_next_link <span class="notes">Link not rendered<span></h2>
|
432
415
|
<% html = '<head>' << (pagy_prev_link(@pagy)||'') << (pagy_next_link(@pagy)||'') << '</head>' %>
|
433
416
|
<%= highlight(html) %>
|
434
417
|
<% end %>
|
@@ -441,10 +424,10 @@ for details</p>
|
|
441
424
|
See the <a href="https://ddnexus.github.io/pagy/docs/how-to/#using-your-pagination-templates">
|
442
425
|
Custom Templates</a> documentation.
|
443
426
|
</p>
|
444
|
-
<
|
445
|
-
<p>@records: <%= @records.join(',') %></p>
|
427
|
+
<h2>Collection</h2>
|
428
|
+
<p id="records">@records: <%= @records.join(',') %></p>
|
446
429
|
|
447
|
-
<
|
430
|
+
<h2>Rendered ERB template</h2>
|
448
431
|
|
449
432
|
<%# We don't inline the template here, so we can highlight it more easily %>
|
450
433
|
<%= html = ERB.new(TEMPLATE).result(binding) %>
|
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: '↗', desc: '↘' }[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 >') %>
|
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: '↗', desc: '↘' }[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 >') %>
|
231
|
+
</nav>
|
232
|
+
</div>
|
233
|
+
|
234
|
+
</body>
|
235
|
+
</html>
|
236
|
+
ERB
|
237
|
+
|
238
|
+
run PagyKeyset
|