pagy 5.8.1 → 5.9.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ee42bed221d693df78831673e1e0a33c8c0b76ceb826dc1fa022d12a44abfbc
4
- data.tar.gz: 5e463d023be1d4fe1613f76b62c3ff3c8cd64da78ac4cc29e51f753c3af0158c
3
+ metadata.gz: 775a7e4b83ac4efbb428fb2790ed87c9b47461d1e5043bd75fd97dd691690c30
4
+ data.tar.gz: d35fa0e7bd99a2d000a0b7751e26038a01c543783011c4adb7ed6521b6fb3c6f
5
5
  SHA512:
6
- metadata.gz: aff49444a6679426a05027e0199913df1da99a636df662a65315852bf2e459d054312635af733a1700fb7408b4e80b9418ff6cf5b33b9308d6bcd86a228c099e
7
- data.tar.gz: db463d5e40da9fbe04b79bc26414f0542b20e824018d17dfdcaac767d41f1d6f748b08035abfaf0336d8468073d2e49f8cc4982c0d5b3f184087eb6fb072f568
6
+ metadata.gz: ef7c6b895f57dfe1051b54198369b5c09ad812471a1af103cfc36bbdf3d506058ca3512372c3ffeb1612485f62cf71586cb5844de14a9acae1451638eca87d52
7
+ data.tar.gz: d353a2d901de3d4accc8dadbe8c35c7d6728ebbf063ba9f2914ea710439b63f04578efd67614989b892294df0e71d67a50f776962a51bd9dfed62240af4ced06
data/lib/config/pagy.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pagy initializer file (5.8.1)
3
+ # Pagy initializer file (5.9.3)
4
4
  # Customize only what you really need and notice that the core Pagy works also without any of the following lines.
5
5
  # Should you just cherry pick part of this file, please maintain the require-order of the extras
6
6
 
@@ -55,7 +55,6 @@
55
55
  #
56
56
  # Pagy::Calendar::Week::DEFAULT[:order] = :asc # Time direction of pagination
57
57
  # Pagy::Calendar::Week::DEFAULT[:format] = '%Y-%W' # strftime format
58
- # Pagy::Calendar::Week::DEFAULT[:offset] = 0 # Day offset from Sunday (0: Sunday; 1: Monday;... 6: Saturday)
59
58
  #
60
59
  # Pagy::Calendar::Day::DEFAULT[:order] = :asc # Time direction of pagination
61
60
  # Pagy::Calendar::Day::DEFAULT[:format] = '%Y-%m-%d' # strftime format
@@ -189,12 +188,13 @@
189
188
 
190
189
 
191
190
  # Rails
192
-
193
- # Rails: extras assets path required by the helpers that use javascript
191
+ # Enable the .js file required by the helpers that use javascript
194
192
  # (pagy*_nav_js, pagy*_combo_nav_js, and pagy_items_selector_js)
195
193
  # See https://ddnexus.github.io/pagy/extras#javascript
196
- # Rails.application.config.assets.paths << Pagy.root.join('javascripts')
197
194
 
195
+ # With the asset pipeline
196
+ # Sprockets need to look into the pagy javascripts dir, so add it to the assets paths
197
+ # Rails.application.config.assets.paths << Pagy.root.join('javascripts')
198
198
 
199
199
  # I18n
200
200
 
@@ -1,34 +1,9 @@
1
1
  "use strict";
2
- const Pagy = {
3
- version: "5.8.1",
4
- // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
5
- init(arg) {
6
- const target = arg instanceof Element ? arg : document;
7
- const elements = target.querySelectorAll("[data-pagy]");
8
- for (const el of elements) {
9
- try {
10
- const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
11
- const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array)); // base64-utf8 JSON -> Array
12
- if (keyword === "nav") {
13
- Pagy.initNav(el, args);
14
- }
15
- else if (keyword === "combo") {
16
- Pagy.initCombo(el, args);
17
- }
18
- else if (keyword === "selector") {
19
- Pagy.initSelector(el, args);
20
- }
21
- else {
22
- console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
23
- }
24
- }
25
- catch (err) {
26
- console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
27
- }
28
- }
29
- },
2
+ window.Pagy = (() => {
3
+ // The observer instance for responsive navs
4
+ const rjsObserver = new ResizeObserver(entries => entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender())));
30
5
  // Init the *_nav_js helpers
31
- initNav(el, [tags, sequels, labelSequels, trimParam]) {
6
+ const initNav = (el, [tags, sequels, labelSequels, trimParam]) => {
32
7
  const container = el.parentElement ?? el;
33
8
  const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
34
9
  let lastWidth = -1;
@@ -45,7 +20,7 @@ const Pagy = {
45
20
  const item = series[i];
46
21
  const label = labels[i];
47
22
  if (typeof trimParam === "string" && item === 1) {
48
- html += Pagy.trim(fillIn(tags.link, item.toString(), label), trimParam);
23
+ html += trim(fillIn(tags.link, item.toString(), label), trimParam);
49
24
  }
50
25
  else if (typeof item === "number") {
51
26
  html += fillIn(tags.link, item.toString(), label);
@@ -63,27 +38,21 @@ const Pagy = {
63
38
  lastWidth = width;
64
39
  })();
65
40
  if (el.classList.contains("pagy-rjs")) {
66
- Pagy.rjsObserver.observe(container);
41
+ rjsObserver.observe(container);
67
42
  }
68
- },
69
- // The observer instance for responsive navs
70
- rjsObserver: new ResizeObserver(entries => {
71
- entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender()));
72
- }),
43
+ };
73
44
  // Init the *_combo_nav_js helpers
74
- initCombo(el, [link, trimParam]) {
75
- Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
76
- },
45
+ const initCombo = (el, [link, trimParam]) => initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
77
46
  // Init the items_selector_js helper
78
- initSelector(el, [from, link, trimParam]) {
79
- Pagy.initInput(el, inputValue => {
47
+ const initSelector = (el, [from, link, trimParam]) => {
48
+ initInput(el, inputValue => {
80
49
  const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
81
50
  const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
82
51
  return [page, html];
83
52
  }, trimParam);
84
- },
53
+ };
85
54
  // Init the input element
86
- initInput(el, getVars, trimParam) {
55
+ const initInput = (el, getVars, trimParam) => {
87
56
  const input = el.querySelector("input");
88
57
  const initial = input.value;
89
58
  const action = function () {
@@ -98,7 +67,7 @@ const Pagy = {
98
67
  }
99
68
  let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
100
69
  if (typeof trimParam === "string" && page === "1") {
101
- html = Pagy.trim(html, trimParam);
70
+ html = trim(html, trimParam);
102
71
  }
103
72
  el.insertAdjacentHTML("afterbegin", html);
104
73
  el.querySelector("a").click();
@@ -108,8 +77,38 @@ const Pagy = {
108
77
  input.addEventListener("keypress", e => { if (e.key === "Enter") {
109
78
  action();
110
79
  } }); // trigger action
111
- },
80
+ };
112
81
  // Trim the ${page-param}=1 params in links
113
- trim: (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "")
114
- };
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWNBLE1BQU0sSUFBSSxHQUFHO0lBQ1QsT0FBTyxFQUFFLE9BQU87SUFFaEIscUdBQXFHO0lBQ3JHLElBQUksQ0FBQyxHQUFrQjtRQUNuQixNQUFNLE1BQU0sR0FBSyxHQUFHLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEQsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUU7WUFDdkIsSUFBSTtnQkFDQSxNQUFNLFVBQVUsR0FBVyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9HLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7Z0JBQ3pHLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtvQkFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFnQixFQUFFLElBQWUsQ0FBQyxDQUFDO2lCQUNuRDtxQkFBTSxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQWlCLENBQUMsQ0FBQztpQkFDekM7cUJBQU0sSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFO29CQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFvQixDQUFDLENBQUM7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QUFHLG1DQUFtQztZQUM5RSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQTthQUFFO1lBQ3hGLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQXVCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0YsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFRLGNBQWM7UUFDaEcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUF1QyxpQkFBaUI7UUFDbkcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7WUFBRSxNQUFNLEVBQUUsQ0FBQTtTQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUI7SUFDdkcsQ0FBQztJQUVELDJDQUEyQztJQUMzQyxJQUFJLEVBQUUsQ0FBQyxJQUFXLEVBQUUsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7Q0FDN0csQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgTmF2QXJncyAgICAgID0gcmVhZG9ubHkgW1RhZ3MsIFNlcXVlbHMsIG51bGx8TGFiZWxTZXF1ZWxzLCBzdHJpbmc/XVxudHlwZSBDb21ib0FyZ3MgICAgPSByZWFkb25seSBbc3RyaW5nLCBzdHJpbmc/XVxudHlwZSBTZWxlY3RvckFyZ3MgPSByZWFkb25seSBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZz9dXG5pbnRlcmZhY2UgVGFncyB7XG4gICAgcmVhZG9ubHkgYmVmb3JlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5rOiAgIHN0cmluZ1xuICAgIHJlYWRvbmx5IGFjdGl2ZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgZ2FwOiAgICBzdHJpbmdcbiAgICByZWFkb25seSBhZnRlcjogIHN0cmluZ1xufVxuaW50ZXJmYWNlIFNlcXVlbHMgICAgICB7IHJlYWRvbmx5IFt3aWR0aDpzdHJpbmddOiAoc3RyaW5nfG51bWJlcnxcImdhcFwiKVtdIH1cbmludGVyZmFjZSBMYWJlbFNlcXVlbHMgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogc3RyaW5nW10gfVxuaW50ZXJmYWNlIE5hdkVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHsgcGFneVJlbmRlcigpOiB2b2lkIH1cblxuY29uc3QgUGFneSA9IHtcbiAgICB2ZXJzaW9uOiBcIjUuOC4xXCIsXG5cbiAgICAvLyBTY2FuIGZvciBlbGVtZW50cyB3aXRoIGEgXCJkYXRhLXBhZ3lcIiBhdHRyaWJ1dGUgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnMgd2l0aCB0aGUgZGVjb2RlZCBhcmdzXG4gICAgaW5pdChhcmc/OkVsZW1lbnR8bmV2ZXIpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ICAgPSBhcmcgaW5zdGFuY2VvZiBFbGVtZW50ID8gYXJnIDogZG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtrZXl3b3JkLCAuLi5hcmdzXSA9IEpTT04ucGFyc2UobmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkID09PSBcIm5hdlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJjb21ib1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkID09PSBcInNlbGVjdG9yXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgUGFneS5pbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG5Vbmtub3duIGtleXdvcmQgJyVzJ1wiLCBlbCwga2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcbiVzXCIsIGVsLCBlcnIpIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBJbml0IHRoZSAqX25hdl9qcyBoZWxwZXJzXG4gICAgaW5pdE5hdihlbDpOYXZFbGVtZW50LCBbdGFncywgc2VxdWVscywgbGFiZWxTZXF1ZWxzLCB0cmltUGFyYW1dOk5hdkFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZWwucGFyZW50RWxlbWVudCA/PyBlbDtcbiAgICAgICAgY29uc3Qgd2lkdGhzICAgID0gT2JqZWN0LmtleXMoc2VxdWVscykubWFwKHcgPT4gcGFyc2VJbnQodykpLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgbGV0IGxhc3RXaWR0aCAgID0gLTE7XG4gICAgICAgIGNvbnN0IGZpbGxJbiAgICA9IChsaW5rOnN0cmluZywgcGFnZTpzdHJpbmcsIGxhYmVsOnN0cmluZyk6c3RyaW5nID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vZywgcGFnZSkucmVwbGFjZSgvX19wYWd5X2xhYmVsX18vZywgbGFiZWwpO1xuICAgICAgICAoZWwucGFneVJlbmRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB3aWR0aHMuZmluZCh3ID0+IHcgPCBjb250YWluZXIuY2xpZW50V2lkdGgpIHx8IDA7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG4gICAgICAgICAgICBsZXQgaHRtbCAgICAgPSB0YWdzLmJlZm9yZTtcbiAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IHNlcXVlbHNbd2lkdGgudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBsYWJlbFNlcXVlbHM/Llt3aWR0aC50b1N0cmluZygpXSA/PyBzZXJpZXMubWFwKGwgPT4gbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtICA9IHNlcmllc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyaW1QYXJhbSA9PT0gXCJzdHJpbmdcIiAmJiBpdGVtID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gUGFneS50cmltKGZpbGxJbih0YWdzLmxpbmssIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpLCB0cmltUGFyYW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IFwiZ2FwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0YWdzLmdhcDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhY3RpdmUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGZpbGxJbih0YWdzLmFjdGl2ZSwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdGFncy5hZnRlcjsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGFsaWduLWFzc2lnbm1lbnRzL2FsaWduLWFzc2lnbm1lbnRzXG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIGxhc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGFneS1yanNcIikpIHsgUGFneS5yanNPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcikgfVxuICAgIH0sXG5cbiAgICAvLyBUaGUgb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIHJlc3BvbnNpdmUgbmF2c1xuICAgIHJqc09ic2VydmVyOiBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PiB7XG4gICAgICAgIGVudHJpZXMuZm9yRWFjaChlID0+IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2RWxlbWVudD4oXCIucGFneS1yanNcIikuZm9yRWFjaChlbCA9PiBlbC5wYWd5UmVuZGVyKCkpKTtcbiAgICB9KSxcblxuICAgIC8vIEluaXQgdGhlICpfY29tYm9fbmF2X2pzIGhlbHBlcnNcbiAgICBpbml0Q29tYm8oZWw6RWxlbWVudCwgW2xpbmssIHRyaW1QYXJhbV06Q29tYm9BcmdzKSB7XG4gICAgICAgIFBhZ3kuaW5pdElucHV0KGVsLCBpbnB1dFZhbHVlID0+IFtpbnB1dFZhbHVlLCBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBpbnB1dFZhbHVlKV0sIHRyaW1QYXJhbSk7XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGl0ZW1zX3NlbGVjdG9yX2pzIGhlbHBlclxuICAgIGluaXRTZWxlY3RvcihlbDpFbGVtZW50LCBbZnJvbSwgbGluaywgdHJpbVBhcmFtXTpTZWxlY3RvckFyZ3MpIHtcbiAgICAgICAgUGFneS5pbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy8sIHBhZ2UpLnJlcGxhY2UoL19fcGFneV9pdGVtc19fLywgaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gW3BhZ2UsIGh0bWxdO1xuICAgICAgICB9LCB0cmltUGFyYW0pO1xuICAgIH0sXG5cbiAgICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gICAgaW5pdElucHV0KGVsOkVsZW1lbnQsIGdldFZhcnM6KHY6c3RyaW5nKT0+W3N0cmluZywgc3RyaW5nXSwgdHJpbVBhcmFtPzpzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgaW5wdXQgICA9IGVsLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBpbml0aWFsID0gaW5wdXQudmFsdWU7XG4gICAgICAgIGNvbnN0IGFjdGlvbiAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgIGNvbnN0IFttaW4sIHZhbCwgbWF4XSA9IFtpbnB1dC5taW4sIGlucHV0LnZhbHVlLCBpbnB1dC5tYXhdLm1hcChuID0+IHBhcnNlSW50KG4pIHx8IDApO1xuICAgICAgICAgICAgaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpIHsgIC8vIHJlc2V0IGludmFsaWQvb3V0LW9mLXJhbmdlXG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBbcGFnZSwgaHRtbF0gPSBnZXRWYXJzKGlucHV0LnZhbHVlKTsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmltUGFyYW0gPT09IFwic3RyaW5nXCIgJiYgcGFnZSA9PT0gXCIxXCIpIHsgaHRtbCA9IFBhZ3kudHJpbShodG1sLCB0cmltUGFyYW0pIH1cbiAgICAgICAgICAgIGVsLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICAgICAgICAoZWwucXVlcnlTZWxlY3RvcihcImFcIikgYXMgSFRNTEFuY2hvckVsZW1lbnQpLmNsaWNrKCk7XG4gICAgICAgIH07XG4gICAgICAgIFtcImNoYW5nZVwiLCBcImZvY3VzXCJdLmZvckVhY2goZSA9PiBpbnB1dC5hZGRFdmVudExpc3RlbmVyKGUsIGlucHV0LnNlbGVjdCkpOyAgICAgICAgLy8gYXV0by1zZWxlY3RcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3Vzb3V0XCIsIGFjdGlvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBhY3Rpb25cbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXByZXNzXCIsIGUgPT4geyBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikgeyBhY3Rpb24oKSB9IH0pOyAvLyB0cmlnZ2VyIGFjdGlvblxuICAgIH0sXG5cbiAgICAvLyBUcmltIHRoZSAke3BhZ2UtcGFyYW19PTEgcGFyYW1zIGluIGxpbmtzXG4gICAgdHJpbTogKGxpbms6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+IGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKGBbPyZdJHtwYXJhbX09MVxcXFxiKD8hJil8XFxcXGIke3BhcmFtfT0xJmApLCBcIlwiKVxufTtcbiJdfQ==
82
+ const trim = (link, param) => link.replace(new RegExp(`(\\?|&amp;)${param}=1\\b(?!&amp;)|\\b${param}=1&amp;`), "");
83
+ // Public interface
84
+ return {
85
+ version: "5.9.3",
86
+ // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
87
+ init(arg) {
88
+ const target = arg instanceof Element ? arg : document;
89
+ const elements = target.querySelectorAll("[data-pagy]");
90
+ for (const el of elements) {
91
+ try {
92
+ const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
93
+ const [keyword, ...args] = JSON.parse((new TextDecoder()).decode(uint8array)); // base64-utf8 -> JSON -> Array
94
+ if (keyword === "nav") {
95
+ initNav(el, args);
96
+ }
97
+ else if (keyword === "combo") {
98
+ initCombo(el, args);
99
+ }
100
+ else if (keyword === "selector") {
101
+ initSelector(el, args);
102
+ }
103
+ else {
104
+ console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
105
+ }
106
+ }
107
+ catch (err) {
108
+ console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
109
+ }
110
+ }
111
+ }
112
+ };
113
+ })();
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWNBLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQ2YsNENBQTRDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3Ryw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQVMsRUFBRSxFQUFFO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksU0FBUyxHQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFNLENBQUMsSUFBVyxFQUFFLElBQVcsRUFBRSxLQUFZLEVBQVMsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RixDQUFDLEVBQUUsQ0FB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ICAgICA9IHJlYWRvbmx5IFtUYWdzLCBTZXF1ZWxzLCBudWxsfExhYmVsU2VxdWVscywgc3RyaW5nP11cbnR5cGUgQ29tYm9BcmdzICAgID0gcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nP11cbnR5cGUgU2VsZWN0b3JBcmdzID0gcmVhZG9ubHkgW251bWJlciwgc3RyaW5nLCBzdHJpbmc/XVxuaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHJlYWRvbmx5IGJlZm9yZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgbGluazogICBzdHJpbmdcbiAgICByZWFkb25seSBhY3RpdmU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdhcDogICAgc3RyaW5nXG4gICAgcmVhZG9ubHkgYWZ0ZXI6ICBzdHJpbmdcbn1cbmludGVyZmFjZSBTZXF1ZWxzICAgICAgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogKHN0cmluZ3xudW1iZXIpW10gfVxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7IHJlYWRvbmx5IFt3aWR0aDpzdHJpbmddOiBzdHJpbmdbXSB9XG5pbnRlcmZhY2UgTmF2RWxlbWVudCBleHRlbmRzIEVsZW1lbnQgeyBwYWd5UmVuZGVyKCk6IHZvaWQgfVxuXG5jb25zdCBQYWd5ID0gKCgpID0+IHtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIHJlc3BvbnNpdmUgbmF2c1xuICAgIGNvbnN0IHJqc09ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT5cbiAgICAgICAgZW50cmllcy5mb3JFYWNoKGUgPT4gZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbDxOYXZFbGVtZW50PihcIi5wYWd5LXJqc1wiKS5mb3JFYWNoKGVsID0+IGVsLnBhZ3lSZW5kZXIoKSkpKTtcblxuICAgIC8vIEluaXQgdGhlICpfbmF2X2pzIGhlbHBlcnNcbiAgICBjb25zdCBpbml0TmF2ID0gKGVsOk5hdkVsZW1lbnQsIFt0YWdzLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGxpbms6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHdpZHRocy5maW5kKHcgPT4gdyA8IGNvbnRhaW5lci5jbGllbnRXaWR0aCkgfHwgMDtcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gbGFzdFdpZHRoKSB7IHJldHVybiB9IC8vIG5vIGNoYW5nZTogYWJvcnRcbiAgICAgICAgICAgIGxldCBodG1sICAgICA9IHRhZ3MuYmVmb3JlO1xuICAgICAgICAgICAgY29uc3Qgc2VyaWVzID0gc2VxdWVsc1t3aWR0aC50b1N0cmluZygpXTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVscyA9IGxhYmVsU2VxdWVscz8uW3dpZHRoLnRvU3RyaW5nKCldID8/IHNlcmllcy5tYXAobCA9PiBsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHNlcmllcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gID0gc2VyaWVzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbGFiZWxzW2ldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0cmltKGZpbGxJbih0YWdzLmxpbmssIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpLCB0cmltUGFyYW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gPT09IFwiZ2FwXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSB0YWdzLmdhcDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhY3RpdmUgcGFnZVxuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGZpbGxJbih0YWdzLmFjdGl2ZSwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdGFncy5hZnRlcjsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGFsaWduLWFzc2lnbm1lbnRzL2FsaWduLWFzc2lnbm1lbnRzXG4gICAgICAgICAgICBlbC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIGxhc3RXaWR0aCA9IHdpZHRoO1xuICAgICAgICB9KSgpO1xuICAgICAgICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicGFneS1yanNcIikpIHsgcmpzT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgKl9jb21ib19uYXZfanMgaGVscGVyc1xuICAgIGNvbnN0IGluaXRDb21ibyA9IChlbDpFbGVtZW50LCBbbGluaywgdHJpbVBhcmFtXTpDb21ib0FyZ3MpID0+XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiBbaW5wdXRWYWx1ZSwgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgICAgIC8vIEluaXQgdGhlIGl0ZW1zX3NlbGVjdG9yX2pzIGhlbHBlclxuICAgIGNvbnN0IGluaXRTZWxlY3RvciA9IChlbDpFbGVtZW50LCBbZnJvbSwgbGluaywgdHJpbVBhcmFtXTpTZWxlY3RvckFyZ3MpID0+IHtcbiAgICAgICAgaW5pdElucHV0KGVsLCBpbnB1dFZhbHVlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSBNYXRoLm1heChNYXRoLmNlaWwoZnJvbSAvIHBhcnNlSW50KGlucHV0VmFsdWUpKSwgMSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCBodG1sXTtcbiAgICAgICAgfSwgdHJpbVBhcmFtKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdCB0aGUgaW5wdXQgZWxlbWVudFxuICAgIGNvbnN0IGluaXRJbnB1dCA9IChlbDpFbGVtZW50LCBnZXRWYXJzOih2OnN0cmluZyk9PltzdHJpbmcsIHN0cmluZ10sIHRyaW1QYXJhbT86c3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGlucHV0ICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09IGluaXRpYWwpIHsgcmV0dXJuIH0gIC8vIG5vdCBjaGFuZ2VkXG4gICAgICAgICAgICBjb25zdCBbbWluLCB2YWwsIG1heF0gPSBbaW5wdXQubWluLCBpbnB1dC52YWx1ZSwgaW5wdXQubWF4XS5tYXAobiA9PiBwYXJzZUludChuKSB8fCAwKTtcbiAgICAgICAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSB7ICAvLyByZXNldCBpbnZhbGlkL291dC1vZi1yYW5nZVxuICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gaW5pdGlhbDtcbiAgICAgICAgICAgICAgICBpbnB1dC5zZWxlY3QoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgW3BhZ2UsIGh0bWxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IGh0bWwgPSB0cmltKGh0bWwsIHRyaW1QYXJhbSkgfVxuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIChlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGxpbms6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGxpbmsucmVwbGFjZShuZXcgUmVnRXhwKGAoXFxcXD98JmFtcDspJHtwYXJhbX09MVxcXFxiKD8hJmFtcDspfFxcXFxiJHtwYXJhbX09MSZhbXA7YCksIFwiXCIpO1xuXG4gICAgLy8gUHVibGljIGludGVyZmFjZVxuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IFwiNS45LjNcIixcblxuICAgICAgICAvLyBTY2FuIGZvciBlbGVtZW50cyB3aXRoIGEgXCJkYXRhLXBhZ3lcIiBhdHRyaWJ1dGUgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnMgd2l0aCB0aGUgZGVjb2RlZCBhcmdzXG4gICAgICAgIGluaXQoYXJnPzpFbGVtZW50fG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiJdfQ==
@@ -1,30 +1,5 @@
1
- declare type NavArgs = readonly [Tags, Sequels, null | LabelSequels, string?];
2
- declare type ComboArgs = readonly [string, string?];
3
- declare type SelectorArgs = readonly [number, string, string?];
4
- interface Tags {
5
- readonly before: string;
6
- readonly link: string;
7
- readonly active: string;
8
- readonly gap: string;
9
- readonly after: string;
10
- }
11
- interface Sequels {
12
- readonly [width: string]: (string | number | "gap")[];
13
- }
14
- interface LabelSequels {
15
- readonly [width: string]: string[];
16
- }
17
- interface NavElement extends Element {
18
- pagyRender(): void;
19
- }
20
1
  declare const Pagy: {
21
2
  version: string;
22
3
  init(arg?: Element | never): void;
23
- initNav(el: NavElement, [tags, sequels, labelSequels, trimParam]: NavArgs): void;
24
- rjsObserver: ResizeObserver;
25
- initCombo(el: Element, [link, trimParam]: ComboArgs): void;
26
- initSelector(el: Element, [from, link, trimParam]: SelectorArgs): void;
27
- initInput(el: Element, getVars: (v: string) => [string, string], trimParam?: string): void;
28
- trim: (link: string, param: string) => string;
29
4
  };
30
5
  export default Pagy;
@@ -1,33 +1,8 @@
1
- const Pagy = {
2
- version: "5.8.1",
3
- // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
4
- init(arg) {
5
- const target = arg instanceof Element ? arg : document;
6
- const elements = target.querySelectorAll("[data-pagy]");
7
- for (const el of elements) {
8
- try {
9
- const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
10
- const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array)); // base64-utf8 JSON -> Array
11
- if (keyword === "nav") {
12
- Pagy.initNav(el, args);
13
- }
14
- else if (keyword === "combo") {
15
- Pagy.initCombo(el, args);
16
- }
17
- else if (keyword === "selector") {
18
- Pagy.initSelector(el, args);
19
- }
20
- else {
21
- console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
22
- }
23
- }
24
- catch (err) {
25
- console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
26
- }
27
- }
28
- },
1
+ const Pagy = (() => {
2
+ // The observer instance for responsive navs
3
+ const rjsObserver = new ResizeObserver(entries => entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender())));
29
4
  // Init the *_nav_js helpers
30
- initNav(el, [tags, sequels, labelSequels, trimParam]) {
5
+ const initNav = (el, [tags, sequels, labelSequels, trimParam]) => {
31
6
  const container = el.parentElement ?? el;
32
7
  const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
33
8
  let lastWidth = -1;
@@ -44,7 +19,7 @@ const Pagy = {
44
19
  const item = series[i];
45
20
  const label = labels[i];
46
21
  if (typeof trimParam === "string" && item === 1) {
47
- html += Pagy.trim(fillIn(tags.link, item.toString(), label), trimParam);
22
+ html += trim(fillIn(tags.link, item.toString(), label), trimParam);
48
23
  }
49
24
  else if (typeof item === "number") {
50
25
  html += fillIn(tags.link, item.toString(), label);
@@ -62,27 +37,21 @@ const Pagy = {
62
37
  lastWidth = width;
63
38
  })();
64
39
  if (el.classList.contains("pagy-rjs")) {
65
- Pagy.rjsObserver.observe(container);
40
+ rjsObserver.observe(container);
66
41
  }
67
- },
68
- // The observer instance for responsive navs
69
- rjsObserver: new ResizeObserver(entries => {
70
- entries.forEach(e => e.target.querySelectorAll(".pagy-rjs").forEach(el => el.pagyRender()));
71
- }),
42
+ };
72
43
  // Init the *_combo_nav_js helpers
73
- initCombo(el, [link, trimParam]) {
74
- Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
75
- },
44
+ const initCombo = (el, [link, trimParam]) => initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
76
45
  // Init the items_selector_js helper
77
- initSelector(el, [from, link, trimParam]) {
78
- Pagy.initInput(el, inputValue => {
46
+ const initSelector = (el, [from, link, trimParam]) => {
47
+ initInput(el, inputValue => {
79
48
  const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
80
49
  const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
81
50
  return [page, html];
82
51
  }, trimParam);
83
- },
52
+ };
84
53
  // Init the input element
85
- initInput(el, getVars, trimParam) {
54
+ const initInput = (el, getVars, trimParam) => {
86
55
  const input = el.querySelector("input");
87
56
  const initial = input.value;
88
57
  const action = function () {
@@ -97,7 +66,7 @@ const Pagy = {
97
66
  }
98
67
  let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
99
68
  if (typeof trimParam === "string" && page === "1") {
100
- html = Pagy.trim(html, trimParam);
69
+ html = trim(html, trimParam);
101
70
  }
102
71
  el.insertAdjacentHTML("afterbegin", html);
103
72
  el.querySelector("a").click();
@@ -107,8 +76,38 @@ const Pagy = {
107
76
  input.addEventListener("keypress", e => { if (e.key === "Enter") {
108
77
  action();
109
78
  } }); // trigger action
110
- },
79
+ };
111
80
  // Trim the ${page-param}=1 params in links
112
- trim: (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "")
113
- };
81
+ const trim = (link, param) => link.replace(new RegExp(`(\\?|&amp;)${param}=1\\b(?!&amp;)|\\b${param}=1&amp;`), "");
82
+ // Public interface
83
+ return {
84
+ version: "5.9.3",
85
+ // Scan for elements with a "data-pagy" attribute and call their init functions with the decoded args
86
+ init(arg) {
87
+ const target = arg instanceof Element ? arg : document;
88
+ const elements = target.querySelectorAll("[data-pagy]");
89
+ for (const el of elements) {
90
+ try {
91
+ const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), c => c.charCodeAt(0));
92
+ const [keyword, ...args] = JSON.parse((new TextDecoder()).decode(uint8array)); // base64-utf8 -> JSON -> Array
93
+ if (keyword === "nav") {
94
+ initNav(el, args);
95
+ }
96
+ else if (keyword === "combo") {
97
+ initCombo(el, args);
98
+ }
99
+ else if (keyword === "selector") {
100
+ initSelector(el, args);
101
+ }
102
+ else {
103
+ console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
104
+ }
105
+ }
106
+ catch (err) {
107
+ console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
108
+ }
109
+ }
110
+ }
111
+ };
112
+ })();
114
113
  export default Pagy;
@@ -1 +1 @@
1
- !function(){function n(n){if(Array.isArray(n))return n}function t(n){if(Symbol.iterator in Object(n)||"[object Arguments]"===Object.prototype.toString.call(n))return Array.from(n)}function e(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function r(r,i){return n(r)||t(r)||e()}var i={version:"5.8.1",init:function(r){var a,o=(r instanceof Element?r:document).querySelectorAll("[data-pagy]"),c=!0,u=!1,l=void 0;try{for(var f,p=o[Symbol.iterator]();!(c=(f=p.next()).done);c=!0){var s=f.value;try{var v=Uint8Array.from(atob(s.getAttribute("data-pagy")),(function(n){return n.charCodeAt(0)})),y=n(a=JSON.parse((new TextDecoder).decode(v)))||t(a)||e(),g=y[0],d=y.slice(1);"nav"===g?i.initNav(s,d):"combo"===g?i.initCombo(s,d):"selector"===g?i.initSelector(s,d):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",s,g)}catch(n){console.warn("Skipped Pagy.init() for: %o\n%s",s,n)}}}catch(n){u=!0,l=n}finally{try{c||null==p.return||p.return()}finally{if(u)throw l}}},initNav:function(n,t){var e,a=r(t),o=a[0],c=a[1],u=a[2],l=a[3],f=null!==(e=n.parentElement)&&void 0!==e?e:n,p=Object.keys(c).map((function(n){return parseInt(n)})).sort((function(n,t){return t-n})),s=-1,v=function(n,t,e){return n.replace(/__pagy_page__/g,t).replace(/__pagy_label__/g,e)};(n.pagyRender=function(){var t=p.find((function(n){return n<f.clientWidth}))||0;if(t!==s){var e,r=o.before,a=c[t.toString()],y=null!==(e=null==u?void 0:u[t.toString()])&&void 0!==e?e:a.map((function(n){return n.toString()}));for(var g in a){var d=a[g],_=y[g];r+="string"==typeof l&&1===d?i.trim(v(o.link,d.toString(),_),l):"number"==typeof d?v(o.link,d.toString(),_):"gap"===d?o.gap:v(o.active,d,_)}r+=o.after,n.innerHTML="",n.insertAdjacentHTML("afterbegin",r),s=t}})(),n.classList.contains("pagy-rjs")&&i.rjsObserver.observe(f)},rjsObserver:new ResizeObserver((function(n){n.forEach((function(n){return n.target.querySelectorAll(".pagy-rjs").forEach((function(n){return n.pagyRender()}))}))})),initCombo:function(n,t){var e=r(t),a=e[0],o=e[1];i.initInput(n,(function(n){return[n,a.replace(/__pagy_page__/,n)]}),o)},initSelector:function(n,t){var e=r(t),a=e[0],o=e[1],c=e[2];i.initInput(n,(function(n){var t=Math.max(Math.ceil(a/parseInt(n)),1).toString();return[t,o.replace(/__pagy_page__/,t).replace(/__pagy_items__/,n)]}),c)},initInput:function(n,t,e){var a=n.querySelector("input"),o=a.value,c=function(){if(a.value!==o){var c=r([a.min,a.value,a.max].map((function(n){return parseInt(n)||0}))),u=c[0],l=c[1],f=c[2];if(l<u||l>f)return a.value=o,void a.select();var p=r(t(a.value)),s=p[0],v=p[1];"string"==typeof e&&"1"===s&&(v=i.trim(v,e)),n.insertAdjacentHTML("afterbegin",v),n.querySelector("a").click()}};["change","focus"].forEach((function(n){return a.addEventListener(n,a.select)})),a.addEventListener("focusout",c),a.addEventListener("keypress",(function(n){"Enter"===n.key&&c()}))},trim:function(n,t){return n.replace(new RegExp("[?&]".concat(t,"=1\\b(?!&)|\\b").concat(t,"=1&")),"")}},a=i;window.Pagy=a}();
1
+ !function(){function n(n){if(Array.isArray(n))return n}function e(n){if(Symbol.iterator in Object(n)||"[object Arguments]"===Object.prototype.toString.call(n))return Array.from(n)}function t(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function r(r,a){return n(r)||e(r)||t()}var a,o,i,c,u,f,l=(a=new ResizeObserver((function(n){return n.forEach((function(n){return n.target.querySelectorAll(".pagy-rjs").forEach((function(n){return n.pagyRender()}))}))})),o=function(n,e){var t,o=r(e),i=o[0],c=o[1],u=o[2],l=o[3],p=null!==(t=n.parentElement)&&void 0!==t?t:n,s=Object.keys(c).map((function(n){return parseInt(n)})).sort((function(n,e){return e-n})),y=-1,g=function(n,e,t){return n.replace(/__pagy_page__/g,e).replace(/__pagy_label__/g,t)};(n.pagyRender=function(){var e=s.find((function(n){return n<p.clientWidth}))||0;if(e!==y){var t,r=i.before,a=c[e.toString()],o=null!==(t=null==u?void 0:u[e.toString()])&&void 0!==t?t:a.map((function(n){return n.toString()}));for(var v in a){var d=a[v],_=o[v];r+="string"==typeof l&&1===d?f(g(i.link,d.toString(),_),l):"number"==typeof d?g(i.link,d.toString(),_):"gap"===d?i.gap:g(i.active,d,_)}r+=i.after,n.innerHTML="",n.insertAdjacentHTML("afterbegin",r),y=e}})(),n.classList.contains("pagy-rjs")&&a.observe(p)},i=function(n,e){var t=r(e),a=t[0],o=t[1];return u(n,(function(n){return[n,a.replace(/__pagy_page__/,n)]}),o)},c=function(n,e){var t=r(e),a=t[0],o=t[1],i=t[2];u(n,(function(n){var e=Math.max(Math.ceil(a/parseInt(n)),1).toString();return[e,o.replace(/__pagy_page__/,e).replace(/__pagy_items__/,n)]}),i)},u=function(n,e,t){var a=n.querySelector("input"),o=a.value,i=function(){if(a.value!==o){var i=r([a.min,a.value,a.max].map((function(n){return parseInt(n)||0}))),c=i[0],u=i[1],l=i[2];if(u<c||u>l)return a.value=o,void a.select();var p=r(e(a.value)),s=p[0],y=p[1];"string"==typeof t&&"1"===s&&(y=f(y,t)),n.insertAdjacentHTML("afterbegin",y),n.querySelector("a").click()}};["change","focus"].forEach((function(n){return a.addEventListener(n,a.select)})),a.addEventListener("focusout",i),a.addEventListener("keypress",(function(n){"Enter"===n.key&&i()}))},f=function(n,e){return n.replace(new RegExp("(\\?|&amp;)".concat(e,"=1\\b(?!&amp;)|\\b").concat(e,"=1&amp;")),"")},{version:"5.9.3",init:function(r){var a,u=(r instanceof Element?r:document).querySelectorAll("[data-pagy]"),f=!0,l=!1,p=void 0;try{for(var s,y=u[Symbol.iterator]();!(f=(s=y.next()).done);f=!0){var g=s.value;try{var v=Uint8Array.from(atob(g.getAttribute("data-pagy")),(function(n){return n.charCodeAt(0)})),d=n(a=JSON.parse((new TextDecoder).decode(v)))||e(a)||t(),_=d[0],m=d.slice(1);"nav"===_?o(g,m):"combo"===_?i(g,m):"selector"===_?c(g,m):console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",g,_)}catch(n){console.warn("Skipped Pagy.init() for: %o\n%s",g,n)}}}catch(n){l=!0,p=n}finally{try{f||null==y.return||y.return()}finally{if(l)throw p}}}});window.Pagy=l}();
@@ -13,16 +13,16 @@ class Pagy # :nodoc:
13
13
  # Setup the calendar variables
14
14
  def setup_unit_vars
15
15
  super
16
- @initial = new_time(@starting.year, @starting.month, @starting.day)
17
- @final = new_time(@ending.year, @ending.month, @ending.day) + DAY
18
- @pages = @last = (@final - @initial).to_i / DAY
16
+ @initial = @starting.beginning_of_day
17
+ @final = @ending.tomorrow.beginning_of_day
18
+ @pages = @last = (@with_zone ? (@final.time - @initial.time) : (@final - @initial)).to_i / 1.day
19
19
  @from = starting_time_for(@page)
20
- @to = @from + DAY
20
+ @to = @from.tomorrow
21
21
  end
22
22
 
23
23
  # Starting time for the page
24
24
  def starting_time_for(page)
25
- @initial + (offset_units_for(page) * DAY)
25
+ @initial + offset_units_for(page).days
26
26
  end
27
27
  end
28
28
  end
@@ -1,16 +1,36 @@
1
1
  # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/calendar
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative 'month_mixin'
5
-
6
4
  class Pagy # :nodoc:
7
5
  class Calendar # :nodoc:
8
6
  # Calendar month subclass
9
7
  class Month < Calendar
10
- DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
8
+ DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
11
9
  format: '%Y-%m' }
12
- MONTHS = 1 # number of months in the unit
13
- include MonthMixin
10
+
11
+ protected
12
+
13
+ # Setup the calendar variables
14
+ def setup_unit_vars
15
+ super
16
+ @initial = @starting.beginning_of_month
17
+ @final = @ending.next_month.beginning_of_month
18
+ @pages = @last = (months_in(@final) - months_in(@initial))
19
+ @from = starting_time_for(@page)
20
+ @to = @from.next_month
21
+ end
22
+
23
+ # Starting time for the page
24
+ def starting_time_for(page)
25
+ @initial + offset_units_for(page).months
26
+ end
27
+
28
+ private
29
+
30
+ # Number of months in time
31
+ def months_in(time)
32
+ (time.year * 12) + time.month
33
+ end
14
34
  end
15
35
  end
16
36
  end
@@ -1,23 +1,43 @@
1
1
  # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/calendar
2
2
  # frozen_string_literal: true
3
3
 
4
- require_relative 'month_mixin'
5
-
6
4
  class Pagy # :nodoc:
7
5
  class Calendar # :nodoc:
8
6
  # Calendar quarter subclass
9
7
  class Quarter < Calendar
10
8
  DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
11
9
  format: '%Y-Q%q' } # '%q' token
12
- MONTHS = 3 # number of months of the unit
13
- include MonthMixin
14
10
 
15
11
  # The label for any page, with the substitution of the '%q' token
16
12
  def label_for(page, opts = {})
17
13
  starting_time = starting_time_for(page.to_i) # page could be a string
18
- opts[:format] = (opts[:format] || @vars[:format]).gsub('%q') { (starting_time.month / 4) + 1 }
14
+ opts[:format] = (opts[:format] || @vars[:format]).gsub('%q') { (starting_time.month / 3.0).ceil }
19
15
  localize(starting_time, opts)
20
16
  end
17
+
18
+ protected
19
+
20
+ # Setup the calendar variables
21
+ def setup_unit_vars
22
+ super
23
+ @initial = @starting.beginning_of_quarter
24
+ @final = @ending.next_quarter.beginning_of_quarter
25
+ @pages = @last = (months_in(@final) - months_in(@initial)) / 3
26
+ @from = starting_time_for(@page)
27
+ @to = @from.next_quarter
28
+ end
29
+
30
+ # Starting time for the page
31
+ def starting_time_for(page)
32
+ @initial + (offset_units_for(page) * 3).months
33
+ end
34
+
35
+ private
36
+
37
+ # Number of months in time
38
+ def months_in(time)
39
+ (time.year * 12) + time.month
40
+ end
21
41
  end
22
42
  end
23
43
  end
@@ -5,34 +5,29 @@ class Pagy # :nodoc:
5
5
  class Calendar # :nodoc:
6
6
  # Calendar week subclass
7
7
  class Week < Calendar
8
- DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
9
- format: '%Y-%W',
10
- offset: 0 }
8
+ DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
9
+ format: '%Y-%W' }
11
10
 
12
11
  protected
13
12
 
14
13
  # Setup the calendar variables
15
14
  def setup_unit_vars
16
- setup_vars(offset: 0)
17
15
  super
18
- @initial = unit_starting_time_for(@starting)
19
- @final = unit_starting_time_for(@ending) + WEEK
20
- @pages = @last = (@final - @initial).to_i / WEEK
16
+ if @vars[:offset] # remove in pagy 6
17
+ Warning.warn '[PAGY WARNING] The week :offset variable has been deprecated and will be ignored from pagy 6. ' \
18
+ "Set the Date.beginning_of_week variable to be one of #{::Date::DAYS_INTO_WEEK.keys.inspect} instead."
19
+ Date.beginning_of_week = ::Date::DAYS_INTO_WEEK.keys[@vars[:offset]]
20
+ end
21
+ @initial = @starting.beginning_of_week
22
+ @final = @ending.next_week.beginning_of_week
23
+ @pages = @last = (@with_zone ? (@final.time - @initial.time) : (@final - @initial)).to_i / 1.week
21
24
  @from = starting_time_for(@page)
22
- @to = @from + WEEK
25
+ @to = @from.next_week
23
26
  end
24
27
 
25
28
  # Starting time for the page
26
29
  def starting_time_for(page)
27
- @initial + (offset_units_for(page) * WEEK)
28
- end
29
-
30
- private
31
-
32
- # Unit starting time for time
33
- def unit_starting_time_for(time)
34
- starting_time = time - (((time.wday - @offset) * DAY) % WEEK)
35
- new_time(starting_time.year, starting_time.month, starting_time.day)
30
+ @initial + offset_units_for(page).weeks
36
31
  end
37
32
  end
38
33
  end
@@ -13,16 +13,16 @@ class Pagy # :nodoc:
13
13
  # Setup the calendar variables
14
14
  def setup_unit_vars
15
15
  super
16
- @initial = new_time(@starting.year)
17
- @final = new_time(@ending.year + 1)
16
+ @initial = @starting.beginning_of_year
17
+ @final = @ending.next_year.beginning_of_year
18
18
  @pages = @last = @final.year - @initial.year
19
19
  @from = starting_time_for(@page)
20
- @to = new_time(@from.year + 1)
20
+ @to = @from.next_year
21
21
  end
22
22
 
23
23
  # Starting time for the page
24
24
  def starting_time_for(page)
25
- new_time(@initial.year + offset_units_for(page))
25
+ @initial.years_since(offset_units_for(page))
26
26
  end
27
27
  end
28
28
  end
data/lib/pagy/calendar.rb CHANGED
@@ -1,6 +1,12 @@
1
1
  # See Pagy::Countless API documentation: https://ddnexus.github.io/pagy/api/calendar
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'active_support'
5
+ require 'active_support/core_ext/time'
6
+ require 'active_support/core_ext/date_and_time/calculations'
7
+ require 'active_support/core_ext/numeric/time'
8
+ require 'active_support/core_ext/integer/time'
9
+
4
10
  require 'pagy'
5
11
 
6
12
  class Pagy # :nodoc:
@@ -8,8 +14,6 @@ class Pagy # :nodoc:
8
14
  class Calendar < Pagy
9
15
  # List of units in desc order of duration. It can be used for custom units.
10
16
  UNITS = %i[year quarter month week day] # rubocop:disable Style/MutableConstant
11
- DAY = 60 * 60 * 24 # One day in seconds
12
- WEEK = DAY * 7 # One week in seconds
13
17
 
14
18
  attr_reader :order
15
19
 
@@ -49,8 +53,9 @@ class Pagy # :nodoc:
49
53
 
50
54
  @starting, @ending = @vars[:period]
51
55
  raise VariableError.new(self, :period, 'to be a an Array of min and max local Time instances', @vars[:period]) \
52
- unless @starting.is_a?(Time) && @ending.is_a?(Time) && !@starting.utc? && !@ending.utc? && @starting <= @ending \
53
- && (@utc_offset = @starting.utc_offset) == @ending.utc_offset
56
+ unless @starting.is_a?(Time) && @ending.is_a?(Time) && !@starting.utc? && !@ending.utc? && @starting <= @ending
57
+
58
+ @with_zone = @starting.is_a?(ActiveSupport::TimeWithZone) # remove in 6.0 and replace Time in the line above
54
59
  end
55
60
 
56
61
  # Apply the strftime format to the time (overridden by the i18n extra when localization is required)
@@ -64,11 +69,6 @@ class Pagy # :nodoc:
64
69
  @order == :asc ? page - 1 : @pages - page
65
70
  end
66
71
 
67
- # Create a new local time at the beginning of the day
68
- def new_time(year, month = 1, day = 1)
69
- Time.new(year, month, day, 0, 0, 0, @utc_offset)
70
- end
71
-
72
72
  # Period of the active page (used internally for nested units)
73
73
  def active_period
74
74
  [[@starting, @from].max, [@to - 1, @ending].min] # -1 sec: include only last unit day
@@ -11,8 +11,8 @@ class Pagy
11
11
  normalize_vars(vars)
12
12
  setup_vars(page: 1, outset: 0)
13
13
  setup_items_var
14
+ setup_offset_var
14
15
  setup_params_var
15
- @offset = (@items * (@page - 1)) + @outset
16
16
  end
17
17
 
18
18
  # Finalize the instance variables based on the fetched size
@@ -19,7 +19,7 @@ class Pagy # :nodoc:
19
19
  @items = gearbox_items[@page - 1] || gearbox_items.last
20
20
  end
21
21
 
22
- # Setup @pages and @last based on the :gearbox_items variable
22
+ # Setup @pages and @last based on the :gearbox_items variable (not used by Pagy::Countless)
23
23
  def setup_pages_var
24
24
  return super if !@vars[:gearbox_extra] || @vars[:items_extra]
25
25
 
@@ -37,6 +37,18 @@ class Pagy # :nodoc:
37
37
  [pages, 1].max
38
38
  end)
39
39
  end
40
+
41
+ # Setup @offset based on the :gearbox_items variable
42
+ def setup_offset_var
43
+ return super if !@vars[:gearbox_extra] || @vars[:items_extra]
44
+
45
+ gearbox_items = @vars[:gearbox_items]
46
+ @offset = if @page <= gearbox_items.count
47
+ gearbox_items[0, @page - 1].sum
48
+ else
49
+ gearbox_items.sum + (gearbox_items.last * (@page - gearbox_items.count - 1))
50
+ end + @outset
51
+ end
40
52
  end
41
53
  prepend GearboxExtra
42
54
  end
@@ -36,7 +36,7 @@ class Pagy # :nodoc:
36
36
  # Return the URL for the page. If there is no pagy.vars[:url]
37
37
  # it works exactly as the regular #pagy_url_for, relying on the params method and Rack.
38
38
  # If there is a defined pagy.vars[:url] variable it does not need the params method nor Rack.
39
- def pagy_url_for(pagy, page, absolute: nil)
39
+ def pagy_url_for(pagy, page, absolute: false, html_escaped: false)
40
40
  return super unless pagy.vars[:url]
41
41
 
42
42
  vars = pagy.vars
@@ -48,6 +48,7 @@ class Pagy # :nodoc:
48
48
  query_string = "?#{QueryUtils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0
49
49
  # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0
50
50
  # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0
51
+ query_string = query_string.gsub('&', '&amp;') if html_escaped # the only unescaped entity
51
52
  "#{vars[:url]}#{query_string}#{vars[:fragment]}"
52
53
  end
53
54
  end
@@ -18,7 +18,7 @@ class Pagy # :nodoc:
18
18
  def pagy_prev_link(pagy, text: pagy_t('pagy.nav.prev'), link_extra: '')
19
19
  if pagy.prev
20
20
  %(<span class="page prev"><a href="#{
21
- pagy_url_for(pagy, pagy.prev)
21
+ pagy_url_for(pagy, pagy.prev, html_escaped: true)
22
22
  }" rel="prev" aria-label="previous" #{
23
23
  pagy.vars[:link_extra]
24
24
  } #{link_extra}>#{text}</a></span>)
@@ -31,7 +31,7 @@ class Pagy # :nodoc:
31
31
  def pagy_next_link(pagy, text: pagy_t('pagy.nav.next'), link_extra: '')
32
32
  if pagy.next
33
33
  %(<span class="page next"><a href="#{
34
- pagy_url_for(pagy, pagy.next)
34
+ pagy_url_for(pagy, pagy.next, html_escaped: true)
35
35
  }" rel="next" aria-label="next" #{
36
36
  pagy.vars[:link_extra]
37
37
  } #{link_extra}>#{text}</a></span>)
@@ -42,12 +42,12 @@ class Pagy # :nodoc:
42
42
 
43
43
  # Return the HTML link tag for the previous page or nil
44
44
  def pagy_prev_link_tag(pagy)
45
- %(<link href="#{pagy_url_for(pagy, pagy.prev)}" rel="prev"/>) if pagy.prev
45
+ %(<link href="#{pagy_url_for(pagy, pagy.prev, html_escaped: true)}" rel="prev"/>) if pagy.prev
46
46
  end
47
47
 
48
48
  # Return the HTML link tag for the next page or nil
49
49
  def pagy_next_link_tag(pagy)
50
- %(<link href="#{pagy_url_for(pagy, pagy.next)}" rel="next"/>) if pagy.next
50
+ %(<link href="#{pagy_url_for(pagy, pagy.next, html_escaped: true)}" rel="next"/>) if pagy.next
51
51
  end
52
52
  end
53
53
  Frontend.prepend SupportExtra
@@ -22,7 +22,7 @@ class Pagy # :nodoc:
22
22
 
23
23
  # Remove the the :page_param param from the first page link
24
24
  def pagy_trim(pagy, link)
25
- link.sub!(/[?&]#{pagy.vars[:page_param]}=1\b(?!&)|\b#{pagy.vars[:page_param]}=1&/, '')
25
+ link.sub!(/(\?|&amp;)#{pagy.vars[:page_param]}=1\b(?!&amp;)|\b#{pagy.vars[:page_param]}=1&amp;/, '')
26
26
  end
27
27
  end
28
28
  Frontend.prepend TrimExtra
data/lib/pagy/frontend.rb CHANGED
@@ -63,7 +63,7 @@ class Pagy
63
63
  def pagy_link_proc(pagy, link_extra: '')
64
64
  p_prev = pagy.prev
65
65
  p_next = pagy.next
66
- left, right = %(<a href="#{pagy_url_for pagy, PAGE_PLACEHOLDER}" #{
66
+ left, right = %(<a href="#{pagy_url_for(pagy, PAGE_PLACEHOLDER, html_escaped: true)}" #{
67
67
  pagy.vars[:link_extra]} #{link_extra}).split(PAGE_PLACEHOLDER, 2)
68
68
  lambda do |page, text = pagy.label_for(page), extra_attrs = ''|
69
69
  %(#{left}#{page}#{right}#{ case page
@@ -6,7 +6,7 @@ class Pagy
6
6
  # Return the URL for the page, relying on the params method and Rack by default.
7
7
  # It supports all Rack-based frameworks (Sinatra, Padrino, Rails, ...).
8
8
  # For non-rack environments you can use the standalone extra
9
- def pagy_url_for(pagy, page, absolute: nil)
9
+ def pagy_url_for(pagy, page, absolute: false, html_escaped: false)
10
10
  vars = pagy.vars
11
11
  page_param = vars[:page_param].to_s
12
12
  items_param = vars[:items_param].to_s
@@ -17,6 +17,7 @@ class Pagy
17
17
  query_string = "?#{Rack::Utils.build_nested_query(pagy_deprecated_params(pagy, params))}" # remove in 6.0
18
18
  # params = pagy.params.call(params) if pagy.params.is_a?(Proc) # add in 6.0
19
19
  # query_string = "?#{Rack::Utils.build_nested_query(params)}" # add in 6.0
20
+ query_string = query_string.gsub('&', '&amp;') if html_escaped # the only unescaped entity
20
21
  "#{request.base_url if absolute}#{request.path}#{query_string}#{vars[:fragment]}"
21
22
  end
22
23
 
data/lib/pagy.rb CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  # Core class
7
7
  class Pagy
8
- VERSION = '5.8.1'
8
+ VERSION = '5.9.3'
9
9
 
10
10
  # Root pathname to get the path of Pagy files like templates or dictionaries
11
11
  def self.root
@@ -32,10 +32,10 @@ class Pagy
32
32
  setup_vars(count: 0, page: 1, outset: 0)
33
33
  setup_items_var
34
34
  setup_pages_var
35
+ setup_offset_var
35
36
  setup_params_var
36
37
  raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
37
38
 
38
- @offset = (@items * (@page - 1)) + @outset
39
39
  @from = [@offset - @outset + 1, @count].min
40
40
  @to = [@offset - @outset + @items, @count].min
41
41
  @in = [@to - @from + 1, @count].min
@@ -96,17 +96,22 @@ class Pagy
96
96
  end
97
97
  end
98
98
 
99
- # Setup and validate the items (overridden by the gearbox extra)
99
+ # Setup @items (overridden by the gearbox extra)
100
100
  def setup_items_var
101
101
  setup_vars(items: 1)
102
102
  end
103
103
 
104
- # Setup and validates the pages (overridden by the gearbox extra)
104
+ # Setup @pages and @last (overridden by the gearbox extra)
105
105
  def setup_pages_var
106
106
  @pages = @last = [(@count.to_f / @items).ceil, 1].max
107
107
  end
108
108
 
109
- # Setup and validates the params
109
+ # Setup @offset based on the :gearbox_items variable
110
+ def setup_offset_var
111
+ @offset = (@items * (@page - 1)) + @outset # may be already set from gear_box
112
+ end
113
+
114
+ # Setup and validate @params
110
115
  def setup_params_var
111
116
  raise VariableError.new(self, :params, 'must be a Hash or a Proc', @params) \
112
117
  unless (@params = @vars[:params]).is_a?(Hash) || @params.is_a?(Proc)
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.8.1
4
+ version: 5.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-17 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2022-01-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  description: Agnostic pagination in plain ruby. It does it all. Better.
14
28
  email:
15
29
  - dd.nexus@gmail.com
@@ -60,7 +74,6 @@ files:
60
74
  - lib/pagy/calendar.rb
61
75
  - lib/pagy/calendar/day.rb
62
76
  - lib/pagy/calendar/month.rb
63
- - lib/pagy/calendar/month_mixin.rb
64
77
  - lib/pagy/calendar/quarter.rb
65
78
  - lib/pagy/calendar/week.rb
66
79
  - lib/pagy/calendar/year.rb
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Pagy
4
- class Calendar
5
- # Mixin for month based unit periods
6
- # It is used for month and quarter, but you could use it to implement less common unit of 6, 4, 2 months
7
- # (see the https://ddnexus.github.io/pagy/api/calendar#custom-units sections for details).
8
- # The including class must set the MONTHS duration for the unit and the usual DEFAULT.
9
- module MonthMixin
10
- protected
11
-
12
- # Setup the calendar variables
13
- def setup_unit_vars
14
- super
15
- @months = self.class::MONTHS # number of months in the unit
16
- @initial = unit_starting_time_for(@starting)
17
- @final = add_months_to(unit_starting_time_for(@ending), @months)
18
- @pages = @last = (months_in(@final) - months_in(@initial)) / @months
19
- @from = starting_time_for(@page)
20
- @to = add_months_to(@from, @months)
21
- end
22
-
23
- # Starting time for the page
24
- def starting_time_for(page)
25
- add_months_to(@initial, offset_units_for(page) * @months)
26
- end
27
-
28
- private
29
-
30
- # Unit starting time for time
31
- def unit_starting_time_for(time)
32
- # remove 1 month for 0-11 calculations and add it back for 1-12 conversion
33
- starting_month = (@months * ((time.month - 1) / @months)) + 1
34
- new_time(time.year, starting_month)
35
- end
36
-
37
- # Number of months in time
38
- def months_in(time)
39
- (time.year * 12) + time.month
40
- end
41
-
42
- # Add months to time
43
- def add_months_to(time, months)
44
- months += months_in(time) - 1 # remove 1 month for 0-11 calculations
45
- new_time(months / 12, (months % 12) + 1) # add 1 month back for 1-12 conversion
46
- end
47
- end
48
- end
49
- end