pagy 3.8.2 → 9.4.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/LICENSE.txt +1 -1
- data/apps/calendar.ru +737 -0
- data/apps/demo.ru +449 -0
- data/apps/index.rb +7 -0
- data/apps/keyset_ar.ru +228 -0
- data/apps/keyset_s.ru +220 -0
- data/apps/rails.ru +217 -0
- data/apps/repro.ru +182 -0
- data/bin/pagy +98 -0
- data/config/pagy.rb +220 -0
- data/javascripts/pagy.d.ts +5 -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 +1022 -0
- data/lib/pagy/b64.rb +33 -0
- data/lib/pagy/backend.rb +30 -19
- data/lib/pagy/calendar/day.rb +41 -0
- data/lib/pagy/calendar/month.rb +42 -0
- data/lib/pagy/calendar/quarter.rb +49 -0
- data/lib/pagy/calendar/unit.rb +103 -0
- data/lib/pagy/calendar/week.rb +39 -0
- data/lib/pagy/calendar/year.rb +35 -0
- data/lib/pagy/calendar.rb +84 -0
- data/lib/pagy/console.rb +23 -0
- data/lib/pagy/countless.rb +27 -22
- data/lib/pagy/exceptions.rb +16 -13
- data/lib/pagy/extras/arel.rb +11 -14
- data/lib/pagy/extras/array.rb +12 -16
- data/lib/pagy/extras/bootstrap.rb +83 -41
- data/lib/pagy/extras/bulma.rb +79 -46
- data/lib/pagy/extras/calendar.rb +79 -0
- data/lib/pagy/extras/countless.rb +20 -25
- data/lib/pagy/extras/elasticsearch_rails.rb +59 -38
- data/lib/pagy/extras/gearbox.rb +55 -0
- data/lib/pagy/extras/headers.rb +38 -23
- data/lib/pagy/extras/i18n.rb +19 -18
- data/lib/pagy/extras/js_tools.rb +70 -0
- data/lib/pagy/extras/jsonapi.rb +88 -0
- data/lib/pagy/extras/keyset.rb +30 -0
- data/lib/pagy/extras/limit.rb +63 -0
- data/lib/pagy/extras/meilisearch.rb +57 -0
- data/lib/pagy/extras/metadata.rb +32 -27
- data/lib/pagy/extras/overflow.rb +61 -53
- data/lib/pagy/extras/pagy.rb +82 -0
- data/lib/pagy/extras/searchkick.rb +52 -41
- data/lib/pagy/extras/size.rb +40 -0
- data/lib/pagy/extras/standalone.rb +60 -0
- data/lib/pagy/extras/trim.rb +19 -13
- data/lib/pagy/frontend.rb +76 -51
- data/lib/pagy/i18n.rb +167 -0
- data/lib/pagy/keyset/active_record.rb +44 -0
- data/lib/pagy/keyset/sequel.rb +57 -0
- data/lib/pagy/keyset.rb +118 -0
- data/lib/pagy/shared_methods.rb +26 -0
- data/lib/pagy/url_helpers.rb +26 -0
- data/lib/pagy.rb +91 -37
- data/locales/ar.yml +29 -0
- data/locales/be.yml +25 -0
- data/locales/bg.yml +21 -0
- data/locales/bs.yml +25 -0
- data/locales/ca.yml +21 -0
- data/locales/ckb.yml +18 -0
- data/locales/cs.yml +23 -0
- data/locales/da.yml +21 -0
- data/locales/de.yml +21 -0
- data/locales/dz.yml +17 -0
- data/locales/en.yml +21 -0
- data/{lib/locales → locales}/es.yml +11 -12
- data/locales/fr.yml +21 -0
- data/locales/hr.yml +25 -0
- data/locales/id.yml +19 -0
- data/locales/it.yml +21 -0
- data/locales/ja.yml +19 -0
- data/locales/km.yml +19 -0
- data/locales/ko.yml +17 -0
- data/locales/nb.yml +21 -0
- data/locales/nl.yml +21 -0
- data/locales/nn.yml +21 -0
- data/locales/pl.yml +25 -0
- data/{lib/locales → locales}/pt-BR.yml +11 -12
- data/locales/pt.yml +21 -0
- data/locales/ru.yml +25 -0
- data/locales/sk.yml +23 -0
- data/locales/sr.yml +25 -0
- data/locales/sv-SE.yml +21 -0
- data/locales/sv.yml +21 -0
- data/locales/sw.yml +25 -0
- data/locales/ta.yml +21 -0
- data/locales/tr.yml +19 -0
- data/locales/uk.yml +25 -0
- data/locales/vi.yml +17 -0
- data/locales/zh-CN.yml +17 -0
- data/locales/zh-HK.yml +17 -0
- data/locales/zh-TW.yml +17 -0
- data/stylesheets/pagy.css +46 -0
- data/stylesheets/pagy.scss +48 -0
- data/stylesheets/pagy.tailwind.css +21 -0
- metadata +95 -67
- data/lib/config/pagy.rb +0 -170
- data/lib/javascripts/pagy.js +0 -106
- data/lib/locales/README.md +0 -35
- data/lib/locales/bg.yml +0 -22
- data/lib/locales/ca.yml +0 -22
- data/lib/locales/da.yml +0 -22
- data/lib/locales/de.yml +0 -22
- data/lib/locales/en.yml +0 -22
- data/lib/locales/fr.yml +0 -22
- data/lib/locales/id.yml +0 -20
- data/lib/locales/it.yml +0 -22
- data/lib/locales/ja.yml +0 -20
- data/lib/locales/km.yml +0 -19
- data/lib/locales/ko.yml +0 -20
- data/lib/locales/nb.yml +0 -22
- data/lib/locales/nl.yml +0 -22
- data/lib/locales/pl.yml +0 -24
- data/lib/locales/ru.yml +0 -24
- data/lib/locales/sv-SE.yml +0 -23
- data/lib/locales/sv.yml +0 -23
- data/lib/locales/tr.yml +0 -20
- data/lib/locales/utils/i18n.rb +0 -25
- data/lib/locales/utils/loader.rb +0 -34
- data/lib/locales/utils/p11n.rb +0 -80
- data/lib/locales/zh-CN.yml +0 -20
- data/lib/locales/zh-HK.yml +0 -20
- data/lib/locales/zh-TW.yml +0 -20
- data/lib/pagy/extras/foundation.rb +0 -57
- data/lib/pagy/extras/items.rb +0 -65
- data/lib/pagy/extras/materialize.rb +0 -59
- data/lib/pagy/extras/navs.rb +0 -38
- data/lib/pagy/extras/pagy_search.rb +0 -18
- data/lib/pagy/extras/semantic.rb +0 -55
- data/lib/pagy/extras/shared.rb +0 -53
- data/lib/pagy/extras/support.rb +0 -29
- data/lib/pagy/extras/uikit.rb +0 -62
- data/lib/templates/bootstrap_nav.html.erb +0 -24
- data/lib/templates/bootstrap_nav.html.haml +0 -34
- data/lib/templates/bootstrap_nav.html.slim +0 -34
- data/lib/templates/bulma_nav.html.erb +0 -24
- data/lib/templates/bulma_nav.html.haml +0 -32
- data/lib/templates/bulma_nav.html.slim +0 -32
- data/lib/templates/foundation_nav.html.erb +0 -24
- data/lib/templates/foundation_nav.html.haml +0 -34
- data/lib/templates/foundation_nav.html.slim +0 -34
- data/lib/templates/nav.html.erb +0 -22
- data/lib/templates/nav.html.haml +0 -30
- data/lib/templates/nav.html.slim +0 -29
- data/lib/templates/uikit_nav.html.erb +0 -15
- data/lib/templates/uikit_nav.html.haml +0 -28
- data/lib/templates/uikit_nav.html.slim +0 -28
- data/pagy.gemspec +0 -16
data/apps/keyset_s.ru
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# DESCRIPTION
|
4
|
+
# Showcase the keyset ActiveRecord pagination
|
5
|
+
#
|
6
|
+
# DOC
|
7
|
+
# https://ddnexus.github.io/pagy/playground/#5-keyset-apps
|
8
|
+
#
|
9
|
+
# BIN HELP
|
10
|
+
# bundle exec pagy -h
|
11
|
+
#
|
12
|
+
# DEV USAGE
|
13
|
+
# bundle exec pagy clone keyset_ar
|
14
|
+
# bundle exec pagy ./keyset_ar.ru
|
15
|
+
#
|
16
|
+
# URL
|
17
|
+
# http://0.0.0.0:8000
|
18
|
+
|
19
|
+
VERSION = '9.4.0'
|
20
|
+
|
21
|
+
# Bundle
|
22
|
+
require 'bundler/inline'
|
23
|
+
require 'bundler'
|
24
|
+
Bundler.configure
|
25
|
+
gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
|
26
|
+
source 'https://rubygems.org'
|
27
|
+
gem 'puma'
|
28
|
+
gem 'sequel'
|
29
|
+
gem 'sinatra'
|
30
|
+
gem 'sqlite3'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Pagy initializer
|
34
|
+
require 'pagy/extras/limit'
|
35
|
+
require 'pagy/extras/keyset'
|
36
|
+
require 'pagy/extras/pagy'
|
37
|
+
Pagy::DEFAULT[:limit] = 10
|
38
|
+
Pagy::DEFAULT.freeze
|
39
|
+
|
40
|
+
# Sinatra setup
|
41
|
+
require 'sinatra/base'
|
42
|
+
require 'logger'
|
43
|
+
# Sinatra application
|
44
|
+
class PagyKeyset < Sinatra::Base
|
45
|
+
include Pagy::Backend
|
46
|
+
|
47
|
+
# Root route/action
|
48
|
+
get '/' do
|
49
|
+
@order = { animal: :asc, name: :asc, birthdate: :desc, id: :asc }
|
50
|
+
@pagy, @pets = pagy_keyset(Pet.order(:animal, :name, Sequel.desc(:birthdate), :id))
|
51
|
+
erb :main
|
52
|
+
end
|
53
|
+
|
54
|
+
helpers do
|
55
|
+
include Pagy::Frontend
|
56
|
+
|
57
|
+
def order_symbol(dir)
|
58
|
+
{ asc: '↗', desc: '↘' }[dir]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Views
|
63
|
+
template :layout do
|
64
|
+
<<~ERB
|
65
|
+
<!DOCTYPE html>
|
66
|
+
<html lang="en">
|
67
|
+
<html>
|
68
|
+
<head>
|
69
|
+
<title>Pagy Keyset App</title>
|
70
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
71
|
+
<style type="text/css">
|
72
|
+
@media screen { html, body {
|
73
|
+
font-size: 1rem;
|
74
|
+
line-height: 1.2s;
|
75
|
+
padding: 0;
|
76
|
+
margin: 0;
|
77
|
+
} }
|
78
|
+
body {
|
79
|
+
background: white !important;
|
80
|
+
margin: 0 !important;
|
81
|
+
font-family: sans-serif !important;
|
82
|
+
}
|
83
|
+
.content {
|
84
|
+
padding: 1rem 1.5rem 2rem !important;
|
85
|
+
}
|
86
|
+
|
87
|
+
<%= Pagy.root.join('stylesheets', 'pagy.css').read %>
|
88
|
+
</style>
|
89
|
+
</head>
|
90
|
+
<body>
|
91
|
+
<%= yield %>
|
92
|
+
</body>
|
93
|
+
</html>
|
94
|
+
ERB
|
95
|
+
end
|
96
|
+
|
97
|
+
template :main do
|
98
|
+
<<~ERB
|
99
|
+
<div class="content">
|
100
|
+
<h1>Pagy Keyset App</h1>
|
101
|
+
<p>Self-contained, standalone app usable to easily reproduce any keyset related pagy issue with ActiveRecord sets.</p>
|
102
|
+
<p>Please, report the following versions in any new issue.</p>
|
103
|
+
<h2>Versions</h2>
|
104
|
+
<ul>
|
105
|
+
<li>Ruby: <%= RUBY_VERSION %></li>
|
106
|
+
<li>Rack: <%= Rack::RELEASE %></li>
|
107
|
+
<li>Sinatra: <%= Sinatra::VERSION %></li>
|
108
|
+
<li>Pagy: <%= Pagy::VERSION %></li>
|
109
|
+
</ul>
|
110
|
+
|
111
|
+
<h3>Collection</h3>
|
112
|
+
<div id="records" class="collection">
|
113
|
+
<table border="1" cellspacing="0" cellpadding="3">
|
114
|
+
<tr>
|
115
|
+
<th>animal <%= order_symbol(@order[:animal]) %></th>
|
116
|
+
<th>name <%= order_symbol(@order[:name]) %></th>
|
117
|
+
<th>birthdate <%= order_symbol(@order[:birthdate]) %></th>
|
118
|
+
<th>id <%= order_symbol(@order[:id]) %></th>
|
119
|
+
</tr>
|
120
|
+
<% @pets.each do |pet| %>
|
121
|
+
<tr>
|
122
|
+
<td><%= pet.animal %></td>
|
123
|
+
<td><%= pet.name %></td>
|
124
|
+
<td><%= pet.birthdate %></td>
|
125
|
+
<td><%= pet.id %></td>
|
126
|
+
</tr>
|
127
|
+
<% end %>
|
128
|
+
</table>
|
129
|
+
</div>
|
130
|
+
<p>
|
131
|
+
<nav class="pagy" id="next" aria-label="Pagy next">
|
132
|
+
<%= pagy_next_a(@pagy, text: 'Next page >') %>
|
133
|
+
</nav>
|
134
|
+
</div>
|
135
|
+
ERB
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Sequel setup
|
140
|
+
require 'sequel'
|
141
|
+
Sequel.default_timezone = :utc
|
142
|
+
# SQLite DB files
|
143
|
+
dir = ENV['APP_ENV'].equal?('development') ? '.' : Dir.pwd # app dir in dev or pwd otherwise
|
144
|
+
abort "ERROR: Cannot create DB files: the directory #{dir.inspect} is not writable." \
|
145
|
+
unless File.writable?(dir)
|
146
|
+
# Connection
|
147
|
+
output = ENV['APP_ENV'].equal?('showcase') ? IO::NULL : $stdout
|
148
|
+
DB = Sequel.connect(adapter: 'sqlite', user: 'root', password: 'password', host: 'localhost', port: '3306',
|
149
|
+
database: "#{dir}/tmp/pagy-keyset-s.sqlite3", max_connections: 10, loggers: [Logger.new(output)])
|
150
|
+
# Schema
|
151
|
+
DB.create_table! :pets do
|
152
|
+
primary_key :id
|
153
|
+
String :animal, unique: false, null: false
|
154
|
+
String :name, unique: false, null: false
|
155
|
+
Date :birthdate, unique: false, null: false
|
156
|
+
end
|
157
|
+
|
158
|
+
# Models
|
159
|
+
class Pet < Sequel::Model; end
|
160
|
+
|
161
|
+
data = <<~DATA
|
162
|
+
Luna | dog | 2018-03-10
|
163
|
+
Coco | cat | 2019-05-15
|
164
|
+
Dodo | dog | 2020-06-25
|
165
|
+
Wiki | bird | 2018-03-12
|
166
|
+
Baby | rabbit | 2020-01-13
|
167
|
+
Neki | horse | 2021-07-20
|
168
|
+
Tino | donkey | 2019-06-18
|
169
|
+
Plot | cat | 2022-09-21
|
170
|
+
Riki | cat | 2018-09-14
|
171
|
+
Susi | horse | 2018-10-26
|
172
|
+
Coco | pig | 2020-08-29
|
173
|
+
Momo | bird | 2023-08-25
|
174
|
+
Lili | cat | 2021-07-22
|
175
|
+
Beli | pig | 2020-07-26
|
176
|
+
Rocky | bird | 2022-08-19
|
177
|
+
Vyvy | dog | 2018-05-16
|
178
|
+
Susi | horse | 2024-01-25
|
179
|
+
Ella | cat | 2020-02-20
|
180
|
+
Rocky | dog | 2019-09-19
|
181
|
+
Juni | rabbit | 2020-08-24
|
182
|
+
Coco | bird | 2021-03-17
|
183
|
+
Susi | dog | 2021-07-28
|
184
|
+
Luna | horse | 2023-05-14
|
185
|
+
Gigi | pig | 2022-05-19
|
186
|
+
Coco | cat | 2020-02-20
|
187
|
+
Nino | donkey | 2019-06-17
|
188
|
+
Luna | cat | 2022-02-09
|
189
|
+
Popi | dog | 2020-09-26
|
190
|
+
Lili | pig | 2022-06-18
|
191
|
+
Mina | horse | 2021-04-21
|
192
|
+
Susi | rabbit | 2023-05-18
|
193
|
+
Toni | donkey | 2018-06-22
|
194
|
+
Rocky | horse | 2019-09-28
|
195
|
+
Lili | cat | 2019-03-18
|
196
|
+
Roby | cat | 2022-06-19
|
197
|
+
Anto | horse | 2022-08-18
|
198
|
+
Susi | pig | 2021-04-21
|
199
|
+
Boly | bird | 2020-03-29
|
200
|
+
Sky | cat | 2023-07-19
|
201
|
+
Lili | dog | 2020-01-28
|
202
|
+
Fami | snake | 2023-04-27
|
203
|
+
Lopi | pig | 2019-06-19
|
204
|
+
Rocky | snake | 2022-03-13
|
205
|
+
Denis | dog | 2022-06-19
|
206
|
+
Maca | cat | 2022-06-19
|
207
|
+
Luna | dog | 2022-08-15
|
208
|
+
Jeme | horse | 2019-08-08
|
209
|
+
Sary | bird | 2023-04-29
|
210
|
+
Rocky | bird | 2023-05-14
|
211
|
+
Coco | dog | 2023-05-27
|
212
|
+
DATA
|
213
|
+
|
214
|
+
dataset = DB[:pets]
|
215
|
+
data.each_line(chomp: true) do |pet|
|
216
|
+
name, animal, birthdate = pet.split('|').map(&:strip)
|
217
|
+
dataset.insert(name:, animal:, birthdate:)
|
218
|
+
end
|
219
|
+
|
220
|
+
run PagyKeyset
|
data/apps/rails.ru
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# DESCRIPTION
|
4
|
+
# Reproduce rails related issues
|
5
|
+
#
|
6
|
+
# DOC
|
7
|
+
# https://ddnexus.github.io/pagy/playground/#2-rails-app
|
8
|
+
#
|
9
|
+
# BIN HELP
|
10
|
+
# bundle exec pagy -h
|
11
|
+
#
|
12
|
+
# DEV USAGE
|
13
|
+
# bundle exec pagy clone rails
|
14
|
+
# bundle exec pagy ./rails.ru
|
15
|
+
#
|
16
|
+
# URL
|
17
|
+
# http://0.0.0.0:8000
|
18
|
+
|
19
|
+
VERSION = '9.4.0'
|
20
|
+
|
21
|
+
# Gemfile
|
22
|
+
require 'bundler/inline'
|
23
|
+
require 'bundler'
|
24
|
+
Bundler.configure
|
25
|
+
gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
|
26
|
+
source 'https://rubygems.org'
|
27
|
+
gem 'oj'
|
28
|
+
gem 'puma'
|
29
|
+
gem 'rails', '~> 8.0'
|
30
|
+
gem 'sqlite3'
|
31
|
+
end
|
32
|
+
|
33
|
+
# require 'rails/all' # too much stuff
|
34
|
+
require 'action_controller/railtie'
|
35
|
+
require 'active_record'
|
36
|
+
|
37
|
+
OUTPUT = Rails.env.showcase? ? IO::NULL : $stdout
|
38
|
+
|
39
|
+
# Rails config
|
40
|
+
class PagyRails < Rails::Application # :nodoc:
|
41
|
+
config.root = __dir__
|
42
|
+
config.session_store :cookie_store, key: 'cookie_store_key'
|
43
|
+
Rails.application.credentials.secret_key_base = 'absolute_secret'
|
44
|
+
|
45
|
+
config.logger = Logger.new(OUTPUT)
|
46
|
+
Rails.logger = config.logger
|
47
|
+
|
48
|
+
routes.draw do
|
49
|
+
root to: 'comments#index'
|
50
|
+
get '/javascripts/:file', to: 'pagy#javascripts', file: /.*/
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# AR config
|
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/overflow'
|
65
|
+
require 'pagy/extras/headers'
|
66
|
+
Pagy::DEFAULT[:limit] = 10
|
67
|
+
Pagy::DEFAULT[:overflow] = :empty_page
|
68
|
+
Pagy::DEFAULT.freeze
|
69
|
+
|
70
|
+
# Activerecord initializer
|
71
|
+
ActiveRecord::Base.logger = Logger.new(OUTPUT)
|
72
|
+
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: "#{dir}/tmp/pagy-rails.sqlite3")
|
73
|
+
ActiveRecord::Schema.define do
|
74
|
+
create_table :posts, force: true do |t|
|
75
|
+
t.string :title
|
76
|
+
end
|
77
|
+
|
78
|
+
create_table :comments, force: true do |t|
|
79
|
+
t.string :body
|
80
|
+
t.integer :post_id
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Models
|
85
|
+
class Post < ActiveRecord::Base # :nodoc:
|
86
|
+
has_many :comments
|
87
|
+
end # :nodoc:
|
88
|
+
|
89
|
+
class Comment < ActiveRecord::Base # :nodoc:
|
90
|
+
belongs_to :post
|
91
|
+
end # :nodoc:
|
92
|
+
|
93
|
+
# Unused model, useful to test overriding conflicts
|
94
|
+
module Calendar
|
95
|
+
end
|
96
|
+
|
97
|
+
# DB seed
|
98
|
+
1.upto(11) do |pi|
|
99
|
+
Post.create(title: "Post #{pi + 1}")
|
100
|
+
end
|
101
|
+
Post.all.each_with_index do |post, pi|
|
102
|
+
2.times { |ci| Comment.create(post:, body: "Comment #{ci + 1} to Post #{pi + 1}") }
|
103
|
+
end
|
104
|
+
|
105
|
+
# Helpers
|
106
|
+
module CommentsHelper
|
107
|
+
include Pagy::Frontend
|
108
|
+
end
|
109
|
+
|
110
|
+
# Controllers
|
111
|
+
class CommentsController < ActionController::Base # :nodoc:
|
112
|
+
include Rails.application.routes.url_helpers
|
113
|
+
include Pagy::Backend
|
114
|
+
|
115
|
+
def index
|
116
|
+
@pagy, @comments = pagy(Comment.all)
|
117
|
+
pagy_headers_merge(@pagy)
|
118
|
+
render inline: TEMPLATE
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# You don't need this in real rails apps (see https://ddnexus.github.io/pagy/docs/api/javascript/setup/#2-configure)
|
123
|
+
class PagyController < ActionController::Base
|
124
|
+
def javascripts
|
125
|
+
format = params[:file].split('.').last
|
126
|
+
if format == 'js'
|
127
|
+
render js: Pagy.root.join('javascripts', params[:file]).read
|
128
|
+
elsif format == 'map'
|
129
|
+
render json: Pagy.root.join('javascripts', params[:file]).read
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
run PagyRails
|
135
|
+
|
136
|
+
TEMPLATE = <<~ERB
|
137
|
+
<!DOCTYPE html>
|
138
|
+
<html lang="en">
|
139
|
+
<html>
|
140
|
+
<head>
|
141
|
+
<title>Pagy Rails App</title>
|
142
|
+
<script src="/javascripts/pagy.min.js"></script>
|
143
|
+
<script>
|
144
|
+
window.addEventListener("load", Pagy.init);
|
145
|
+
</script>
|
146
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
147
|
+
<style type="text/css">
|
148
|
+
@media screen { html, body {
|
149
|
+
font-size: 1rem;
|
150
|
+
line-height: 1.2s;
|
151
|
+
padding: 0;
|
152
|
+
margin: 0;
|
153
|
+
} }
|
154
|
+
body {
|
155
|
+
background: white !important;
|
156
|
+
margin: 0 !important;
|
157
|
+
font-family: sans-serif !important;
|
158
|
+
}
|
159
|
+
.content {
|
160
|
+
padding: 1rem 1.5rem 2rem !important;
|
161
|
+
}
|
162
|
+
|
163
|
+
/* Quick demo for overriding the element style attribute of certain pagy helpers
|
164
|
+
.pagy input[style] {
|
165
|
+
width: 5rem !important;
|
166
|
+
}
|
167
|
+
*/
|
168
|
+
|
169
|
+
/*
|
170
|
+
If you want to customize the style,
|
171
|
+
please replace the line below with the actual file content
|
172
|
+
*/
|
173
|
+
<%== Pagy.root.join('stylesheets', 'pagy.css').read %>
|
174
|
+
</style>
|
175
|
+
</head>
|
176
|
+
|
177
|
+
<body>
|
178
|
+
|
179
|
+
<div class="content">
|
180
|
+
<h1>Pagy Rails App</h1>
|
181
|
+
<p> Self-contained, standalone Rails app usable to easily reproduce any rails related pagy issue.</p>
|
182
|
+
<p>Please, report the following versions in any new issue.</p>
|
183
|
+
<h2>Versions</h2>
|
184
|
+
<ul>
|
185
|
+
<li>Ruby: <%== RUBY_VERSION %></li>
|
186
|
+
<li>Rack: <%== Rack::RELEASE %></li>
|
187
|
+
<li>Rails: <%== Rails.version %></li>
|
188
|
+
<li>Pagy: <%== Pagy::VERSION %></li>
|
189
|
+
</ul>
|
190
|
+
|
191
|
+
<h3>Collection</h3>
|
192
|
+
<div id="records" class="collection">
|
193
|
+
<% @comments.each do |comment| %>
|
194
|
+
<p style="margin: 0;"><%= comment.body %></p>
|
195
|
+
<% end %>
|
196
|
+
</div>
|
197
|
+
<hr>
|
198
|
+
|
199
|
+
<h4>pagy_nav</h4>
|
200
|
+
<%== pagy_nav(@pagy, id: 'nav', aria_label: 'Pages nav') %>
|
201
|
+
|
202
|
+
<h4>pagy_nav_js</h4>
|
203
|
+
<%== pagy_nav_js(@pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
|
204
|
+
|
205
|
+
<h4>pagy_combo_nav_js</h4>
|
206
|
+
<%== pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
|
207
|
+
|
208
|
+
<h4>pagy_limit_selector_js</h4>
|
209
|
+
<%== pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
|
210
|
+
|
211
|
+
<h4>pagy_info</h4>
|
212
|
+
<%== pagy_info(@pagy, id: 'pagy-info') %>
|
213
|
+
</div>
|
214
|
+
|
215
|
+
</body>
|
216
|
+
</html>
|
217
|
+
ERB
|
data/apps/repro.ru
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# DESCRIPTION
|
4
|
+
# Reproduce generic/simple issues
|
5
|
+
#
|
6
|
+
# DOC
|
7
|
+
# https://ddnexus.github.io/pagy/playground/#1-repro-app
|
8
|
+
#
|
9
|
+
# BIN HELP
|
10
|
+
# bundle exec pagy -h
|
11
|
+
#
|
12
|
+
# DEV USAGE
|
13
|
+
# bundle exec pagy clone repro
|
14
|
+
# bundle exec pagy ./repro.ru
|
15
|
+
#
|
16
|
+
# URL
|
17
|
+
# http://0.0.0.0:8000
|
18
|
+
|
19
|
+
VERSION = '9.4.0'
|
20
|
+
|
21
|
+
# Bundle
|
22
|
+
require 'bundler/inline'
|
23
|
+
require 'bundler'
|
24
|
+
Bundler.configure
|
25
|
+
gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
|
26
|
+
source 'https://rubygems.org'
|
27
|
+
gem 'oj'
|
28
|
+
gem 'puma'
|
29
|
+
gem 'sinatra'
|
30
|
+
end
|
31
|
+
|
32
|
+
# Edit this section adding/removing the extras and Pagy::DEFAULT as needed
|
33
|
+
# pagy initializer
|
34
|
+
require 'pagy/extras/pagy'
|
35
|
+
require 'pagy/extras/limit'
|
36
|
+
require 'pagy/extras/overflow'
|
37
|
+
Pagy::DEFAULT[:overflow] = :empty_page
|
38
|
+
Pagy::DEFAULT.freeze
|
39
|
+
|
40
|
+
# Sinatra setup
|
41
|
+
require 'sinatra/base'
|
42
|
+
# Sinatra application
|
43
|
+
class PagyRepro < Sinatra::Base
|
44
|
+
include Pagy::Backend
|
45
|
+
|
46
|
+
get('/javascripts/:file') do
|
47
|
+
format = params[:file].split('.').last
|
48
|
+
if format == 'js'
|
49
|
+
content_type 'application/javascript'
|
50
|
+
elsif format == 'map'
|
51
|
+
content_type 'application/json'
|
52
|
+
end
|
53
|
+
send_file Pagy.root.join('javascripts', params[:file])
|
54
|
+
end
|
55
|
+
|
56
|
+
# Edit this action as needed
|
57
|
+
get '/' do
|
58
|
+
collection = MockCollection.new
|
59
|
+
@pagy, @records = pagy(collection)
|
60
|
+
erb :main
|
61
|
+
end
|
62
|
+
|
63
|
+
# Edit this section adding your own helpers as needed
|
64
|
+
helpers do
|
65
|
+
include Pagy::Frontend
|
66
|
+
end
|
67
|
+
|
68
|
+
# Views
|
69
|
+
template :layout do
|
70
|
+
<<~ERB
|
71
|
+
<!DOCTYPE html>
|
72
|
+
<html lang="en">
|
73
|
+
<html>
|
74
|
+
<head>
|
75
|
+
<title>Pagy Repro App</title>
|
76
|
+
<script src="javascripts/pagy.min.js"></script>
|
77
|
+
<script>
|
78
|
+
window.addEventListener("load", Pagy.init);
|
79
|
+
</script>
|
80
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
81
|
+
<style type="text/css">
|
82
|
+
@media screen { html, body {
|
83
|
+
font-size: 1rem;
|
84
|
+
line-height: 1.2s;
|
85
|
+
padding: 0;
|
86
|
+
margin: 0;
|
87
|
+
} }
|
88
|
+
body {
|
89
|
+
background: white !important;
|
90
|
+
margin: 0 !important;
|
91
|
+
font-family: sans-serif !important;
|
92
|
+
}
|
93
|
+
.content {
|
94
|
+
padding: 1rem 1.5rem 2rem !important;
|
95
|
+
}
|
96
|
+
|
97
|
+
/* Quick demo for overriding the element style attribute of certain pagy helpers
|
98
|
+
.pagy input[style] {
|
99
|
+
width: 5rem !important;
|
100
|
+
}
|
101
|
+
*/
|
102
|
+
|
103
|
+
/*
|
104
|
+
If you want to customize the style,
|
105
|
+
please replace the line below with the actual file content
|
106
|
+
*/
|
107
|
+
<%= Pagy.root.join('stylesheets', 'pagy.css').read %>
|
108
|
+
</style>
|
109
|
+
</head>
|
110
|
+
<body>
|
111
|
+
<%= yield %>
|
112
|
+
</body>
|
113
|
+
</html>
|
114
|
+
ERB
|
115
|
+
end
|
116
|
+
|
117
|
+
template :main do
|
118
|
+
<<~ERB
|
119
|
+
<div class="content">
|
120
|
+
<h1>Pagy Repro App</h1>
|
121
|
+
<p> Self-contained, standalone app usable to easily reproduce any pagy issue.</p>
|
122
|
+
<p>Please, report the following versions in any new issue.</p>
|
123
|
+
<h2>Versions</h4>
|
124
|
+
<ul>
|
125
|
+
<li>Ruby: <%= RUBY_VERSION %></li>
|
126
|
+
<li>Rack: <%= Rack::RELEASE %></li>
|
127
|
+
<li>Sinatra: <%= Sinatra::VERSION %></li>
|
128
|
+
<li>Pagy: <%= Pagy::VERSION %></li>
|
129
|
+
</ul>
|
130
|
+
|
131
|
+
<h3>Collection</h3>
|
132
|
+
<p id="records">@records: <%= @records.join(',') %></p>
|
133
|
+
|
134
|
+
<hr>
|
135
|
+
|
136
|
+
<h4>pagy_nav</h4>
|
137
|
+
<%= pagy_nav(@pagy, id: 'nav', aria_label: 'Pages nav') %>
|
138
|
+
|
139
|
+
<h4>pagy_nav_js</h4>
|
140
|
+
<%= pagy_nav_js(@pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
|
141
|
+
|
142
|
+
<h4>pagy_nav_js</h4>
|
143
|
+
<%= pagy_nav_js(@pagy, id: 'nav-js-responsive', aria_label: 'Pages nav_js_responsove',
|
144
|
+
steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
|
145
|
+
|
146
|
+
<h4>pagy_combo_nav_js</h4>
|
147
|
+
<%= pagy_combo_nav_js(@pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
|
148
|
+
|
149
|
+
<h4>pagy_limit_selector_js</h4>
|
150
|
+
<%= pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
|
151
|
+
|
152
|
+
<h4>pagy_info</h4>
|
153
|
+
<%= pagy_info(@pagy, id: 'pagy-info') %>
|
154
|
+
</div>
|
155
|
+
ERB
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
# Simple array-based collection that acts as a standard DB collection.
|
160
|
+
# Use it as a simple way to get a collection that acts as a AR scope, but without any DB
|
161
|
+
# or create an ActiveRecord class or anything else that you need instead
|
162
|
+
class MockCollection < Array
|
163
|
+
def initialize(arr = Array(1..1000))
|
164
|
+
super
|
165
|
+
@collection = clone
|
166
|
+
end
|
167
|
+
|
168
|
+
def offset(value)
|
169
|
+
@collection = self[value..]
|
170
|
+
self
|
171
|
+
end
|
172
|
+
|
173
|
+
def limit(value)
|
174
|
+
@collection[0, value]
|
175
|
+
end
|
176
|
+
|
177
|
+
def count(*)
|
178
|
+
size
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
run PagyRepro
|