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.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/apps/calendar.ru +737 -0
  4. data/apps/demo.ru +449 -0
  5. data/apps/index.rb +7 -0
  6. data/apps/keyset_ar.ru +228 -0
  7. data/apps/keyset_s.ru +220 -0
  8. data/apps/rails.ru +217 -0
  9. data/apps/repro.ru +182 -0
  10. data/bin/pagy +98 -0
  11. data/config/pagy.rb +220 -0
  12. data/javascripts/pagy.d.ts +5 -0
  13. data/javascripts/pagy.min.js +4 -0
  14. data/javascripts/pagy.min.js.map +10 -0
  15. data/javascripts/pagy.mjs +100 -0
  16. data/lib/optimist.rb +1022 -0
  17. data/lib/pagy/b64.rb +33 -0
  18. data/lib/pagy/backend.rb +30 -19
  19. data/lib/pagy/calendar/day.rb +41 -0
  20. data/lib/pagy/calendar/month.rb +42 -0
  21. data/lib/pagy/calendar/quarter.rb +49 -0
  22. data/lib/pagy/calendar/unit.rb +103 -0
  23. data/lib/pagy/calendar/week.rb +39 -0
  24. data/lib/pagy/calendar/year.rb +35 -0
  25. data/lib/pagy/calendar.rb +84 -0
  26. data/lib/pagy/console.rb +23 -0
  27. data/lib/pagy/countless.rb +27 -22
  28. data/lib/pagy/exceptions.rb +16 -13
  29. data/lib/pagy/extras/arel.rb +11 -14
  30. data/lib/pagy/extras/array.rb +12 -16
  31. data/lib/pagy/extras/bootstrap.rb +83 -41
  32. data/lib/pagy/extras/bulma.rb +79 -46
  33. data/lib/pagy/extras/calendar.rb +79 -0
  34. data/lib/pagy/extras/countless.rb +20 -25
  35. data/lib/pagy/extras/elasticsearch_rails.rb +59 -38
  36. data/lib/pagy/extras/gearbox.rb +55 -0
  37. data/lib/pagy/extras/headers.rb +38 -23
  38. data/lib/pagy/extras/i18n.rb +19 -18
  39. data/lib/pagy/extras/js_tools.rb +70 -0
  40. data/lib/pagy/extras/jsonapi.rb +88 -0
  41. data/lib/pagy/extras/keyset.rb +30 -0
  42. data/lib/pagy/extras/limit.rb +63 -0
  43. data/lib/pagy/extras/meilisearch.rb +57 -0
  44. data/lib/pagy/extras/metadata.rb +32 -27
  45. data/lib/pagy/extras/overflow.rb +61 -53
  46. data/lib/pagy/extras/pagy.rb +82 -0
  47. data/lib/pagy/extras/searchkick.rb +52 -41
  48. data/lib/pagy/extras/size.rb +40 -0
  49. data/lib/pagy/extras/standalone.rb +60 -0
  50. data/lib/pagy/extras/trim.rb +19 -13
  51. data/lib/pagy/frontend.rb +76 -51
  52. data/lib/pagy/i18n.rb +167 -0
  53. data/lib/pagy/keyset/active_record.rb +44 -0
  54. data/lib/pagy/keyset/sequel.rb +57 -0
  55. data/lib/pagy/keyset.rb +118 -0
  56. data/lib/pagy/shared_methods.rb +26 -0
  57. data/lib/pagy/url_helpers.rb +26 -0
  58. data/lib/pagy.rb +91 -37
  59. data/locales/ar.yml +29 -0
  60. data/locales/be.yml +25 -0
  61. data/locales/bg.yml +21 -0
  62. data/locales/bs.yml +25 -0
  63. data/locales/ca.yml +21 -0
  64. data/locales/ckb.yml +18 -0
  65. data/locales/cs.yml +23 -0
  66. data/locales/da.yml +21 -0
  67. data/locales/de.yml +21 -0
  68. data/locales/dz.yml +17 -0
  69. data/locales/en.yml +21 -0
  70. data/{lib/locales → locales}/es.yml +11 -12
  71. data/locales/fr.yml +21 -0
  72. data/locales/hr.yml +25 -0
  73. data/locales/id.yml +19 -0
  74. data/locales/it.yml +21 -0
  75. data/locales/ja.yml +19 -0
  76. data/locales/km.yml +19 -0
  77. data/locales/ko.yml +17 -0
  78. data/locales/nb.yml +21 -0
  79. data/locales/nl.yml +21 -0
  80. data/locales/nn.yml +21 -0
  81. data/locales/pl.yml +25 -0
  82. data/{lib/locales → locales}/pt-BR.yml +11 -12
  83. data/locales/pt.yml +21 -0
  84. data/locales/ru.yml +25 -0
  85. data/locales/sk.yml +23 -0
  86. data/locales/sr.yml +25 -0
  87. data/locales/sv-SE.yml +21 -0
  88. data/locales/sv.yml +21 -0
  89. data/locales/sw.yml +25 -0
  90. data/locales/ta.yml +21 -0
  91. data/locales/tr.yml +19 -0
  92. data/locales/uk.yml +25 -0
  93. data/locales/vi.yml +17 -0
  94. data/locales/zh-CN.yml +17 -0
  95. data/locales/zh-HK.yml +17 -0
  96. data/locales/zh-TW.yml +17 -0
  97. data/stylesheets/pagy.css +46 -0
  98. data/stylesheets/pagy.scss +48 -0
  99. data/stylesheets/pagy.tailwind.css +21 -0
  100. metadata +95 -67
  101. data/lib/config/pagy.rb +0 -170
  102. data/lib/javascripts/pagy.js +0 -106
  103. data/lib/locales/README.md +0 -35
  104. data/lib/locales/bg.yml +0 -22
  105. data/lib/locales/ca.yml +0 -22
  106. data/lib/locales/da.yml +0 -22
  107. data/lib/locales/de.yml +0 -22
  108. data/lib/locales/en.yml +0 -22
  109. data/lib/locales/fr.yml +0 -22
  110. data/lib/locales/id.yml +0 -20
  111. data/lib/locales/it.yml +0 -22
  112. data/lib/locales/ja.yml +0 -20
  113. data/lib/locales/km.yml +0 -19
  114. data/lib/locales/ko.yml +0 -20
  115. data/lib/locales/nb.yml +0 -22
  116. data/lib/locales/nl.yml +0 -22
  117. data/lib/locales/pl.yml +0 -24
  118. data/lib/locales/ru.yml +0 -24
  119. data/lib/locales/sv-SE.yml +0 -23
  120. data/lib/locales/sv.yml +0 -23
  121. data/lib/locales/tr.yml +0 -20
  122. data/lib/locales/utils/i18n.rb +0 -25
  123. data/lib/locales/utils/loader.rb +0 -34
  124. data/lib/locales/utils/p11n.rb +0 -80
  125. data/lib/locales/zh-CN.yml +0 -20
  126. data/lib/locales/zh-HK.yml +0 -20
  127. data/lib/locales/zh-TW.yml +0 -20
  128. data/lib/pagy/extras/foundation.rb +0 -57
  129. data/lib/pagy/extras/items.rb +0 -65
  130. data/lib/pagy/extras/materialize.rb +0 -59
  131. data/lib/pagy/extras/navs.rb +0 -38
  132. data/lib/pagy/extras/pagy_search.rb +0 -18
  133. data/lib/pagy/extras/semantic.rb +0 -55
  134. data/lib/pagy/extras/shared.rb +0 -53
  135. data/lib/pagy/extras/support.rb +0 -29
  136. data/lib/pagy/extras/uikit.rb +0 -62
  137. data/lib/templates/bootstrap_nav.html.erb +0 -24
  138. data/lib/templates/bootstrap_nav.html.haml +0 -34
  139. data/lib/templates/bootstrap_nav.html.slim +0 -34
  140. data/lib/templates/bulma_nav.html.erb +0 -24
  141. data/lib/templates/bulma_nav.html.haml +0 -32
  142. data/lib/templates/bulma_nav.html.slim +0 -32
  143. data/lib/templates/foundation_nav.html.erb +0 -24
  144. data/lib/templates/foundation_nav.html.haml +0 -34
  145. data/lib/templates/foundation_nav.html.slim +0 -34
  146. data/lib/templates/nav.html.erb +0 -22
  147. data/lib/templates/nav.html.haml +0 -30
  148. data/lib/templates/nav.html.slim +0 -29
  149. data/lib/templates/uikit_nav.html.erb +0 -15
  150. data/lib/templates/uikit_nav.html.haml +0 -28
  151. data/lib/templates/uikit_nav.html.slim +0 -28
  152. 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: '&#x2197;', desc: '&#x2198;' }[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 &gt;') %>
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