pagy 9.2.0 → 9.3.1

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.
data/apps/demo.ru CHANGED
@@ -1,25 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Interactive showcase for all the pagy helpers and CSS styles
4
-
3
+ # DESCRIPTION
4
+ # Showcase all the helpers and styles
5
+ #
6
+ # DOC
7
+ # https://ddnexus.github.io/pagy/playground/#3-demo-app
8
+ #
9
+ # BIN HELP
10
+ # bundle exec pagy -h
11
+ #
5
12
  # DEMO USAGE
6
- # pagy demo
7
-
13
+ # bundle exec pagy demo
14
+ #
8
15
  # DEV USAGE
9
- # pagy clone demo
10
- # pagy ./demo.ru
11
-
16
+ # bundle exec pagy clone demo
17
+ # bundle exec pagy ./demo.ru
18
+ #
12
19
  # URL
13
20
  # http://0.0.0.0:8000
14
21
 
15
- # HELP
16
- # pagy -h
17
-
18
- # DOC
19
- # https://ddnexus.github.io/pagy/playground/#3-demo-app
20
-
21
- VERSION = '9.2.0'
22
+ VERSION = '9.3.1'
22
23
 
24
+ # Bundle
23
25
  require 'bundler/inline'
24
26
  require 'bundler'
25
27
  Bundler.configure
@@ -29,7 +31,6 @@ gemfile(ENV['PAGY_INSTALL_BUNDLE'] == 'true') do
29
31
  gem 'puma'
30
32
  gem 'rouge'
31
33
  gem 'sinatra'
32
- gem 'sinatra-contrib'
33
34
  end
34
35
 
35
36
  # pagy initializer
@@ -45,15 +46,11 @@ require 'pagy/extras/limit'
45
46
  require 'pagy/extras/trim'
46
47
  Pagy::DEFAULT[:trim_extra] = false # opt-in trim
47
48
 
48
- # sinatra setup
49
+ # Sinatra setup
49
50
  require 'sinatra/base'
50
51
 
51
- # sinatra application
52
+ # Sinatra application
52
53
  class PagyDemo < Sinatra::Base
53
- configure do
54
- enable :inline_templates
55
- end
56
-
57
54
  include Pagy::Backend
58
55
 
59
56
  get '/' do
@@ -82,7 +79,7 @@ class PagyDemo < Sinatra::Base
82
79
  send_file Pagy.root.join('stylesheets', params[:file])
83
80
  end
84
81
 
85
- # one route/action per style
82
+ # One route/action per style
86
83
  STYLES.each_key do |style|
87
84
  prefix = STYLES[style][:prefix] || "_#{style}"
88
85
 
@@ -117,6 +114,260 @@ class PagyDemo < Sinatra::Base
117
114
  }</pre></details>)
118
115
  end
119
116
  end
117
+
118
+ # Views
119
+ template :layout do
120
+ <<~'ERB'
121
+ <!DOCTYPE html>
122
+ <html lang="en">
123
+ <head>
124
+ <title>Pagy Demo App</title>
125
+ <script src="/javascripts/pagy.min.js"></script>
126
+ <script>
127
+ window.addEventListener("load", Pagy.init);
128
+ </script>
129
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
130
+ <%= erb :"#{style}_head" if defined?(style) %>
131
+ <style type="text/css">
132
+ @media screen { html, body {
133
+ font-size: 1rem;
134
+ line-height: 1.2s;
135
+ padding: 0;
136
+ margin: 0;
137
+ } }
138
+ body {
139
+ background: white !important;
140
+ margin: 0 !important;
141
+ font-family: sans-serif !important;
142
+ }
143
+ h1, h2 {
144
+ font-size: 1.8rem !important;
145
+ font-weight: 600 !important;
146
+ margin-top: 1rem !important;
147
+ margin-bottom: 0.7rem !important;
148
+ line-height: 1.5 !important;
149
+ color: rgb(90 90 90) !important;
150
+ }
151
+ h2 {
152
+ font-family: monospace;
153
+ font-size: .9rem !important;
154
+ margin-top: 1.6rem !important;
155
+ }
156
+ summary, .notes {
157
+ font-size: .8rem;
158
+ color: gray;
159
+ margin-top: .6rem;
160
+ font-style: italic;
161
+ cursor: pointer;
162
+ }
163
+ .notes {
164
+ font-family: sans-serif;
165
+ font-weight: normal;
166
+ }
167
+ .notes code{
168
+ background-color: #E8E8E8;
169
+ padding: 0 0.3rem;
170
+ font-style: normal;
171
+ border-radius: 3px;
172
+ }
173
+ .description {
174
+ margin: 1rem 0;
175
+ }
176
+ .description a {
177
+ color: blue;
178
+ text-decoration: underline;
179
+ }
180
+ pre, pre code {
181
+ display: block;
182
+ margin-top: .3rem;
183
+ margin-bottom: 1rem;
184
+ font-size: .8rem !important;
185
+ line-height: 1rem !important;
186
+ color: white;
187
+ background-color: rgb(30 30 30);
188
+ padding: 1rem;
189
+ overflow: auto;
190
+ }
191
+ .content {
192
+ padding: 0 1.5rem 2rem !important;
193
+ }
194
+
195
+ #style-menu {
196
+ flex;
197
+ font-family: sans-serif;
198
+ font-size: 1.1rem;
199
+ line-height: 1.5rem;
200
+ white-space: nowrap;
201
+ color: white;
202
+ background-color: gray;
203
+ padding: .2rem 1.5rem;
204
+ }
205
+ #style-menu > :not([hidden]) ~ :not([hidden]) {
206
+ --space-reverse: 0;
207
+ margin-right: calc(0.5rem * var(--space-reverse));
208
+ margin-left: calc(0.5rem * calc(1 - var(--space-reverse)));
209
+ }
210
+ #style-menu a {
211
+ color: inherit;
212
+ text-decoration: none;
213
+ }
214
+ /* Quick demo for overriding the element style attribute of certain pagy helpers
215
+ .pagy input[style] {
216
+ width: 5rem !important;
217
+ }
218
+ */
219
+ </style>
220
+ </head>
221
+ <body>
222
+ <!-- each different class used by each style -->
223
+ <%= style_menu %>
224
+ <div class="content">
225
+ <%= yield %>
226
+ </div>
227
+ </body>
228
+ </html>
229
+ ERB
230
+ end
231
+
232
+ template :pagy_head do
233
+ <<~ERB
234
+ <!-- copy and paste the pagy style in order to edit it -->
235
+ <link rel="stylesheet" href="/stylesheets/pagy.css">
236
+ ERB
237
+ end
238
+
239
+ template :bootstrap_head do
240
+ <<~ERB
241
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
242
+ ERB
243
+ end
244
+
245
+ template :bulma_head do
246
+ <<~ERB
247
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
248
+ ERB
249
+ end
250
+
251
+ template :tailwind_head do
252
+ <<~ERB
253
+ <script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio"></script>
254
+ <!-- copy and paste the pagy.tailwind style in order to edit it -->
255
+ <style type="text/tailwindcss">
256
+ <%= Pagy.root.join('stylesheets', 'pagy.tailwind.css').read %>
257
+ </style>
258
+ ERB
259
+ end
260
+
261
+ template :helpers do
262
+ <<~'ERB'
263
+ <h1><%= style %></h1>
264
+ <% extra = STYLES[style][:extra] || "#{style}" %>
265
+ <% css_anchor = STYLES[style][:css_anchor] %>
266
+
267
+ <p class="description">See the <a href="http://ddnexus.github.io/pagy/docs/extras/<%= extra %>" target="blank"><%= extra %> extra</a>
268
+ documentation
269
+ <% if css_anchor %>
270
+ and the <a href="http://ddnexus.github.io/pagy/docs/api/stylesheets/#<%= css_anchor %>" target="blank"><%= css_anchor.gsub('-', '.') %></a>
271
+ <% end %>
272
+ for details</p>
273
+
274
+ <h2>Collection</h2>
275
+ <p id="records">@records: <%= @records.join(',') %></p>
276
+
277
+ <h2>pagy<%= prefix %>_nav <span class="notes">Simple nav <code>size: 5</code></span></h2>
278
+ <%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'simple-nav', aria_label: 'Pages simple-nav', size: 5) %>
279
+ <%= highlight(html) %>
280
+
281
+ <h2>pagy<%= prefix %>_nav <span class="notes">Fast nav <code>size: 7</code></span></h2>
282
+ <%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'nav', aria_label: 'Pages nav') %>
283
+ <%= highlight(html) %>
284
+
285
+ <h2>pagy<%= prefix %>_nav_js <span class="notes">Fast nav <code>size: 7</code></span></h2>
286
+ <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
287
+ <%= highlight(html) %>
288
+
289
+ <h2>pagy<%= prefix %>_nav_js <span class="notes">Responsive nav <code>steps: {...}</code> (Resize the window to see)</span></h2>
290
+ <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js-responsive',
291
+ aria_label: 'Pages nav_js_responsive',
292
+ steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
293
+ <%= highlight(html) %>
294
+
295
+ <h2>pagy<%= prefix %>_combo_nav_js</h2>
296
+ <%= html = send(:"pagy#{prefix}_combo_nav_js", @pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
297
+ <%= highlight(html) %>
298
+
299
+ <h2>pagy_info</h2>
300
+ <%= html = pagy_info(@pagy, id: 'pagy-info') %>
301
+ <%= highlight(html) %>
302
+
303
+ <% if style.match(/pagy|tailwind/) %>
304
+ <h2>pagy_limit_selector_js</h2>
305
+ <%= html = pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
306
+ <%= highlight(html) %>
307
+
308
+ <h2>pagy_prev_a / pagy_next_a</h2>
309
+ <%= html = '<nav class="pagy" id="prev-next" aria-label="Pagy prev-next">' << pagy_prev_a(@pagy) << pagy_next_a(@pagy) << '</nav>' %>
310
+ <%= highlight(html) %>
311
+
312
+ <h2>pagy_prev_link / pagy_next_link <span class="notes">Link not rendered<span></h2>
313
+ <% html = '<head>' << (pagy_prev_link(@pagy)||'') << (pagy_next_link(@pagy)||'') << '</head>' %>
314
+ <%= highlight(html) %>
315
+ <% end %>
316
+ ERB
317
+ end
318
+
319
+ template :template do
320
+ <<~ERB
321
+ <h1>Pagy Template Demo</h1>
322
+
323
+ <p class="description">
324
+ See the <a href="https://ddnexus.github.io/pagy/docs/how-to/#using-your-pagination-templates">
325
+ Custom Templates</a> documentation.
326
+ </p>
327
+ <h2>Collection</h2>
328
+ <p id="records">@records: <%= @records.join(',') %></p>
329
+
330
+ <h2>Rendered ERB template</h2>
331
+
332
+ <%# We don't inline the template here, so we can highlight it more easily %>
333
+ <%= html = ERB.new(TEMPLATE).result(binding) %>
334
+ <%= highlight(TEMPLATE, format: :erb) %>
335
+ <%= highlight(html) %>
336
+ ERB
337
+ end
338
+
339
+ # Easier code highlighting
340
+ TEMPLATE = <<~ERB
341
+ <%# IMPORTANT: replace '<%=' with '<%==' if you run this in rails %>
342
+
343
+ <%# The a variable below is set to a lambda that generates the a tag %>
344
+ <%# Usage: a_tag = a.(page_number, text, classes: nil, aria_label: nil) %>
345
+ <% a = pagy_anchor(pagy) %>
346
+ <nav class="pagy nav" aria-label="Pages">
347
+ <%# Previous page link %>
348
+ <% if pagy.prev %>
349
+ <%= a.(pagy.prev, '&lt;', aria_label: 'Previous') %>
350
+ <% else %>
351
+ <a role="link" aria-disabled="true" aria-label="Previous">&lt;</a>
352
+ <% end %>
353
+ <%# Page links (series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]) %>
354
+ <% pagy.series.each do |item| %>
355
+ <% if item.is_a?(Integer) %>
356
+ <%= a.(item) %>
357
+ <% elsif item.is_a?(String) %>
358
+ <a role="link" aria-disabled="true" aria-current="page" class="current"><%= item %></a>
359
+ <% elsif item == :gap %>
360
+ <a role="link" aria-disabled="true" class="gap">&hellip;</a>
361
+ <% end %>
362
+ <% end %>
363
+ <%# Next page link %>
364
+ <% if pagy.next %>
365
+ <%= a.(pagy.next, '&gt;', aria_label: 'Next') %>
366
+ <% else %>
367
+ <a role="link" aria-disabled="true" aria-label="Next">&lt;</a>
368
+ <% end %>
369
+ </nav>
370
+ ERB
120
371
  end
121
372
 
122
373
  # Cheap pagy formatter for helpers output
@@ -196,240 +447,3 @@ class MockCollection < Array
196
447
  end
197
448
 
198
449
  run PagyDemo
199
-
200
- # We store the template in a constant instead of writing it inline, so we can highlight it more easily
201
- TEMPLATE = <<~ERB
202
- <%# IMPORTANT: use '<%== ... ' instead of '<%= ... ' if you run this in rails %>
203
-
204
- <%# The a variable below is set to a lambda that generates the a tag %>
205
- <%# Usage: a_tag = a.(page_number, text, classes: nil, aria_label: nil) %>
206
- <% a = pagy_anchor(pagy) %>
207
- <nav class="pagy nav" aria-label="Pages">
208
- <%# Previous page link %>
209
- <% if pagy.prev %>
210
- <%= a.(pagy.prev, '&lt;', aria_label: 'Previous') %>
211
- <% else %>
212
- <a role="link" aria-disabled="true" aria-label="Previous">&lt;</a>
213
- <% end %>
214
- <%# Page links (series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]) %>
215
- <% pagy.series.each do |item| %>
216
- <% if item.is_a?(Integer) %>
217
- <%= a.(item) %>
218
- <% elsif item.is_a?(String) %>
219
- <a role="link" aria-disabled="true" aria-current="page" class="current"><%= item %></a>
220
- <% elsif item == :gap %>
221
- <a role="link" aria-disabled="true" class="gap">&hellip;</a>
222
- <% end %>
223
- <% end %>
224
- <%# Next page link %>
225
- <% if pagy.next %>
226
- <%= a.(pagy.next, '&gt;', aria_label: 'Next') %>
227
- <% else %>
228
- <a role="link" aria-disabled="true" aria-label="Next">&lt;</a>
229
- <% end %>
230
- </nav>
231
- ERB
232
-
233
- __END__
234
-
235
- @@ layout
236
- <!DOCTYPE html>
237
- <html lang="en">
238
- <head>
239
- <title>Pagy Demo App</title>
240
- <script src="/javascripts/pagy.min.js"></script>
241
- <script>
242
- window.addEventListener("load", Pagy.init);
243
- </script>
244
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
245
- <%= erb :"#{style}_head" if defined?(style) %>
246
- <style type="text/css">
247
- @media screen { html, body {
248
- font-size: 1rem;
249
- line-height: 1.2s;
250
- padding: 0;
251
- margin: 0;
252
- } }
253
- body {
254
- background: white !important;
255
- margin: 0 !important;
256
- font-family: sans-serif !important;
257
- }
258
- h1, h2 {
259
- font-size: 1.8rem !important;
260
- font-weight: 600 !important;
261
- margin-top: 1rem !important;
262
- margin-bottom: 0.7rem !important;
263
- line-height: 1.5 !important;
264
- color: rgb(90 90 90) !important;
265
- }
266
- h2 {
267
- font-family: monospace;
268
- font-size: .9rem !important;
269
- margin-top: 1.6rem !important;
270
- }
271
- summary, .notes {
272
- font-size: .8rem;
273
- color: gray;
274
- margin-top: .6rem;
275
- font-style: italic;
276
- cursor: pointer;
277
- }
278
- .notes {
279
- font-family: sans-serif;
280
- font-weight: normal;
281
- }
282
- .notes code{
283
- background-color: #E8E8E8;
284
- padding: 0 0.3rem;
285
- font-style: normal;
286
- border-radius: 3px;
287
- }
288
- .description {
289
- margin: 1rem 0;
290
- }
291
- .description a {
292
- color: blue;
293
- text-decoration: underline;
294
- }
295
- pre, pre code {
296
- display: block;
297
- margin-top: .3rem;
298
- margin-bottom: 1rem;
299
- font-size: .8rem !important;
300
- line-height: 1rem !important;
301
- color: white;
302
- background-color: rgb(30 30 30);
303
- padding: 1rem;
304
- overflow: auto;
305
- }
306
- .content {
307
- padding: 0 1.5rem 2rem !important;
308
- }
309
-
310
- #style-menu {
311
- flex;
312
- font-family: sans-serif;
313
- font-size: 1.1rem;
314
- line-height: 1.5rem;
315
- white-space: nowrap;
316
- color: white;
317
- background-color: gray;
318
- padding: .2rem 1.5rem;
319
- }
320
- #style-menu > :not([hidden]) ~ :not([hidden]) {
321
- --space-reverse: 0;
322
- margin-right: calc(0.5rem * var(--space-reverse));
323
- margin-left: calc(0.5rem * calc(1 - var(--space-reverse)));
324
- }
325
- #style-menu a {
326
- color: inherit;
327
- text-decoration: none;
328
- }
329
- /* Quick demo for overriding the element style attribute of certain pagy helpers
330
- .pagy input[style] {
331
- width: 5rem !important;
332
- }
333
- */
334
- </style>
335
- </head>
336
- <body>
337
- <!-- each different class used by each style -->
338
- <%= style_menu %>
339
- <div class="content">
340
- <%= yield %>
341
- </div>
342
- </body>
343
- </html>
344
-
345
-
346
- @@ pagy_head
347
- <!-- copy and paste the pagy style in order to edit it -->
348
- <link rel="stylesheet" href="/stylesheets/pagy.css">
349
-
350
- @@ bootstrap_head
351
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
352
-
353
- @@ bulma_head
354
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
355
-
356
- @@ tailwind_head
357
- <script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio"></script>
358
- <!-- copy and paste the pagy.tailwind style in order to edit it -->
359
- <style type="text/tailwindcss">
360
- <%= Pagy.root.join('stylesheets', 'pagy.tailwind.css').read %>
361
- </style>
362
-
363
-
364
- @@ helpers
365
- <h1><%= style %></h1>
366
- <% extra = STYLES[style][:extra] || "#{style}" %>
367
- <% css_anchor = STYLES[style][:css_anchor] %>
368
-
369
- <p class="description">See the <a href="http://ddnexus.github.io/pagy/docs/extras/<%= extra %>" target="blank"><%= extra %> extra</a>
370
- documentation
371
- <% if css_anchor %>
372
- and the <a href="http://ddnexus.github.io/pagy/docs/api/stylesheets/#<%= css_anchor %>" target="blank"><%= css_anchor.gsub('-', '.') %></a>
373
- <% end %>
374
- for details</p>
375
-
376
- <h2>Collection</h2>
377
- <p id="records">@records: <%= @records.join(',') %></p>
378
-
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) %>
381
- <%= highlight(html) %>
382
-
383
- <h2>pagy<%= prefix %>_nav <span class="notes">Fast nav <code>size: 7</code></span></h2>
384
- <%= html = send(:"pagy#{prefix}_nav", @pagy, id: 'nav', aria_label: 'Pages nav') %>
385
- <%= highlight(html) %>
386
-
387
- <h2>pagy<%= prefix %>_nav_js <span class="notes">Fast nav <code>size: 7</code></span></h2>
388
- <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js', aria_label: 'Pages nav_js') %>
389
- <%= highlight(html) %>
390
-
391
- <h2>pagy<%= prefix %>_nav_js <span class="notes">Responsive nav <code>steps: {...}</code> (Resize the window to see)</span></h2>
392
- <%= html = send(:"pagy#{prefix}_nav_js", @pagy, id: 'nav-js-responsive',
393
- aria_label: 'Pages nav_js_responsive',
394
- steps: { 0 => 5, 500 => 7, 750 => 9, 1000 => 11 }) %>
395
- <%= highlight(html) %>
396
-
397
- <h2>pagy<%= prefix %>_combo_nav_js</h2>
398
- <%= html = send(:"pagy#{prefix}_combo_nav_js", @pagy, id: 'combo-nav-js', aria_label: 'Pages combo_nav_js') %>
399
- <%= highlight(html) %>
400
-
401
- <h2>pagy_info</h2>
402
- <%= html = pagy_info(@pagy, id: 'pagy-info') %>
403
- <%= highlight(html) %>
404
-
405
- <% if style.match(/pagy|tailwind/) %>
406
- <h2>pagy_limit_selector_js</h2>
407
- <%= html = pagy_limit_selector_js(@pagy, id: 'limit-selector-js') %>
408
- <%= highlight(html) %>
409
-
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>' %>
412
- <%= highlight(html) %>
413
-
414
- <h2>pagy_prev_link / pagy_next_link <span class="notes">Link not rendered<span></h2>
415
- <% html = '<head>' << (pagy_prev_link(@pagy)||'') << (pagy_next_link(@pagy)||'') << '</head>' %>
416
- <%= highlight(html) %>
417
- <% end %>
418
-
419
-
420
- @@ template
421
- <h1>Pagy Template Demo</h1>
422
-
423
- <p class="description">
424
- See the <a href="https://ddnexus.github.io/pagy/docs/how-to/#using-your-pagination-templates">
425
- Custom Templates</a> documentation.
426
- </p>
427
- <h2>Collection</h2>
428
- <p id="records">@records: <%= @records.join(',') %></p>
429
-
430
- <h2>Rendered ERB template</h2>
431
-
432
- <%# We don't inline the template here, so we can highlight it more easily %>
433
- <%= html = ERB.new(TEMPLATE).result(binding) %>
434
- <%= highlight(TEMPLATE, format: :erb) %>
435
- <%= highlight(html) %>
data/apps/index.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # PagyApp module
4
+ module PagyApps
5
+ # Return the hash of app name/path
6
+ INDEX = Dir[File.expand_path('./*.ru', __dir__)].to_h { |f| [File.basename(f, '.ru'), f] }.freeze
7
+ end