pagy 5.7.5 → 5.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/config/pagy.rb +1 -2
- data/lib/javascripts/pagy-dev.js +48 -52
- data/lib/javascripts/pagy-module.d.ts +0 -25
- data/lib/javascripts/pagy-module.js +47 -51
- data/lib/javascripts/pagy.js +1 -1
- data/lib/pagy/calendar/day.rb +5 -5
- data/lib/pagy/calendar/month.rb +25 -5
- data/lib/pagy/calendar/quarter.rb +25 -5
- data/lib/pagy/calendar/week.rb +12 -17
- data/lib/pagy/calendar/year.rb +4 -4
- data/lib/pagy/calendar.rb +9 -9
- data/lib/pagy/countless.rb +1 -1
- data/lib/pagy/extras/bootstrap.rb +2 -2
- data/lib/pagy/extras/bulma.rb +2 -2
- data/lib/pagy/extras/foundation.rb +2 -2
- data/lib/pagy/extras/frontend_helpers.rb +9 -7
- data/lib/pagy/extras/gearbox.rb +13 -1
- data/lib/pagy/extras/items.rb +1 -1
- data/lib/pagy/extras/materialize.rb +2 -2
- data/lib/pagy/extras/navs.rb +2 -2
- data/lib/pagy/extras/semantic.rb +2 -2
- data/lib/pagy/extras/uikit.rb +2 -2
- data/lib/pagy.rb +10 -5
- metadata +17 -4
- data/lib/pagy/calendar/month_mixin.rb +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ce99a8aef217f835c9063fb4c31bf673671acabd7ae4abc95e32d83d58285702
|
4
|
+
data.tar.gz: dc949a684d9624041a46bdc66bf71ff99b4f437d1ff95cb1f4b2b816e7a6ae40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9798dae0a11c47078a1c8dbb972a8c1cdc5859616f7d321de17c3150d06e54515b8a3e81d1df112a54cbcdae6fcec572897a46dec6d33a8199d03e561f1395c7
|
7
|
+
data.tar.gz: e09224376c5150f8a0f27d1fb7cdd956ef7e81f1cf73d5e923192c106cf43b28d4da64802cbae93b364890018d1e12f45428565cdf152e481a5b48d378772a74
|
data/lib/config/pagy.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Pagy initializer file (5.
|
3
|
+
# Pagy initializer file (5.9.0)
|
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
|
data/lib/javascripts/pagy-dev.js
CHANGED
@@ -1,37 +1,11 @@
|
|
1
1
|
"use strict";
|
2
|
-
const Pagy = {
|
3
|
-
|
4
|
-
|
5
|
-
init(arg) {
|
6
|
-
const target = arg instanceof Element ? arg : document;
|
7
|
-
const elements = target.querySelectorAll("[data-pagy-json]");
|
8
|
-
const warn = (el, err) => console.warn("Pagy.init() skipped element: %o\n%s", el, err);
|
9
|
-
for (const element of elements) {
|
10
|
-
const json = element.getAttribute("data-pagy-json");
|
11
|
-
try {
|
12
|
-
const [keyword, ...args] = JSON.parse(json);
|
13
|
-
if (keyword === "nav") {
|
14
|
-
Pagy.initNav(element, args);
|
15
|
-
}
|
16
|
-
else if (keyword === "combo") {
|
17
|
-
Pagy.initCombo(element, args);
|
18
|
-
}
|
19
|
-
else if (keyword === "selector") {
|
20
|
-
Pagy.initSelector(element, args);
|
21
|
-
}
|
22
|
-
else {
|
23
|
-
warn(element, `Illegal PagyJSON keyword: expected "nav"|"combo"|"selector", got "${keyword}"`);
|
24
|
-
}
|
25
|
-
}
|
26
|
-
catch (err) {
|
27
|
-
warn(element, err);
|
28
|
-
}
|
29
|
-
}
|
30
|
-
},
|
2
|
+
const 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())));
|
31
5
|
// Init the *_nav_js helpers
|
32
|
-
initNav(el, [tags, sequels, labelSequels, trimParam]) {
|
6
|
+
const initNav = (el, [tags, sequels, labelSequels, trimParam]) => {
|
33
7
|
const container = el.parentElement ?? el;
|
34
|
-
const widths = Object.
|
8
|
+
const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
|
35
9
|
let lastWidth = -1;
|
36
10
|
const fillIn = (link, page, label) => link.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
|
37
11
|
(el.pagyRender = function () {
|
@@ -46,7 +20,7 @@ const Pagy = {
|
|
46
20
|
const item = series[i];
|
47
21
|
const label = labels[i];
|
48
22
|
if (typeof trimParam === "string" && item === 1) {
|
49
|
-
html +=
|
23
|
+
html += trim(fillIn(tags.link, item.toString(), label), trimParam);
|
50
24
|
}
|
51
25
|
else if (typeof item === "number") {
|
52
26
|
html += fillIn(tags.link, item.toString(), label);
|
@@ -64,29 +38,21 @@ const Pagy = {
|
|
64
38
|
lastWidth = width;
|
65
39
|
})();
|
66
40
|
if (el.classList.contains("pagy-rjs")) {
|
67
|
-
|
41
|
+
rjsObserver.observe(container);
|
68
42
|
}
|
69
|
-
}
|
70
|
-
// The observer instance for responsive navs
|
71
|
-
rjsObserver: new ResizeObserver(entries => {
|
72
|
-
entries.filter(e => e.contentBoxSize)
|
73
|
-
.forEach(e => e.target.querySelectorAll(".pagy-rjs")
|
74
|
-
.forEach(rjs => rjs.pagyRender()));
|
75
|
-
}),
|
43
|
+
};
|
76
44
|
// Init the *_combo_nav_js helpers
|
77
|
-
initCombo(el, [link, trimParam])
|
78
|
-
Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
|
79
|
-
},
|
45
|
+
const initCombo = (el, [link, trimParam]) => initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
|
80
46
|
// Init the items_selector_js helper
|
81
|
-
initSelector(el, [from, link, trimParam]) {
|
82
|
-
|
47
|
+
const initSelector = (el, [from, link, trimParam]) => {
|
48
|
+
initInput(el, inputValue => {
|
83
49
|
const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
|
84
50
|
const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
|
85
51
|
return [page, html];
|
86
52
|
}, trimParam);
|
87
|
-
}
|
53
|
+
};
|
88
54
|
// Init the input element
|
89
|
-
initInput(el, getVars, trimParam) {
|
55
|
+
const initInput = (el, getVars, trimParam) => {
|
90
56
|
const input = el.querySelector("input");
|
91
57
|
const initial = input.value;
|
92
58
|
const action = function () {
|
@@ -101,7 +67,7 @@ const Pagy = {
|
|
101
67
|
}
|
102
68
|
let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
|
103
69
|
if (typeof trimParam === "string" && page === "1") {
|
104
|
-
html =
|
70
|
+
html = trim(html, trimParam);
|
105
71
|
}
|
106
72
|
el.insertAdjacentHTML("afterbegin", html);
|
107
73
|
el.querySelector("a").click();
|
@@ -111,8 +77,38 @@ const Pagy = {
|
|
111
77
|
input.addEventListener("keypress", e => { if (e.key === "Enter") {
|
112
78
|
action();
|
113
79
|
} }); // trigger action
|
114
|
-
}
|
80
|
+
};
|
115
81
|
// Trim the ${page-param}=1 params in links
|
116
|
-
trim
|
117
|
-
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWVBLE1BQU0sSUFBSSxHQUFHO0lBQ1QsT0FBTyxFQUFFLE9BQU87SUFFaEIsNkZBQTZGO0lBQzdGLElBQUksQ0FBQyxHQUFrQjtRQUNuQixNQUFNLE1BQU0sR0FBSyxHQUFHLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBTyxDQUFDLEVBQVUsRUFBRSxHQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNHLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQVcsQ0FBQztZQUM5RCxJQUFJO2dCQUNBLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBYSxDQUFDO2dCQUN4RCxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBcUIsRUFBRSxJQUFlLENBQUMsQ0FBQztpQkFDeEQ7cUJBQU0sSUFBSSxPQUFPLEtBQUssT0FBTyxFQUFFO29CQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFpQixDQUFDLENBQUM7aUJBQzlDO3FCQUFNLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBb0IsQ0FBQyxDQUFDO2lCQUNwRDtxQkFBTTtvQkFDSCxJQUFJLENB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Q0FBRyxtQ0FBbUM7WUFDOUUsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRTtnQkFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7YUFBRTtZQUN4RixFQUFFLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLEVBQUUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUF1QixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pELENBQUMsQ0FBQztRQUNGLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBUSxjQUFjO1FBQ2hHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBdUMsaUJBQWlCO1FBQ25HLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssT0FBTyxFQUFFO1lBQUUsTUFBTSxFQUFFLENBQUE7U0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO0lBQ3ZHLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsSUFBSSxFQUFFLENBQUMsSUFBVyxFQUFFLEtBQVksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssaUJBQWlCLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO0NBQzdHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFBhZ3lKU09OICAgICA9IHJlYWRvbmx5IFtcIm5hdlwiLCAuLi5OYXZBcmdzXSB8IFtcImNvbWJvXCIsIC4uLkNvbWJvQXJnc10gfCBbXCJzZWxlY3RvclwiLCAuLi5TZWxlY3RvckFyZ3NdXG50eXBlIE5hdkFyZ3MgICAgICA9IHJlYWRvbmx5IFtUYWdzLCBTZXF1ZWxzLCBudWxsfExhYmVsU2VxdWVscywgc3RyaW5nP11cbnR5cGUgQ29tYm9BcmdzICAgID0gcmVhZG9ubHkgW3N0cmluZywgc3RyaW5nP11cbnR5cGUgU2VsZWN0b3JBcmdzID0gcmVhZG9ubHkgW251bWJlciwgc3RyaW5nLCBzdHJpbmc/XVxuaW50ZXJmYWNlIFRhZ3Mge1xuICAgIHJlYWRvbmx5IGJlZm9yZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgbGluazogICBzdHJpbmdcbiAgICByZWFkb25seSBhY3RpdmU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGdhcDogICAgc3RyaW5nXG4gICAgcmVhZG9ubHkgYWZ0ZXI6ICBzdHJpbmdcbn1cbmludGVyZmFjZSBTZXF1ZWxzICAgICAgeyByZWFkb25seSBbd2lkdGg6c3RyaW5nXTogKHN0cmluZ3xudW1iZXJ8XCJnYXBcIilbXSB9XG5pbnRlcmZhY2UgTGFiZWxTZXF1ZWxzIHsgcmVhZG9ubHkgW3dpZHRoOnN0cmluZ106IHN0cmluZ1tdIH1cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7IHBhZ3lSZW5kZXIoKTogdm9pZCB9XG5cbmNvbnN0IFBhZ3kgPSB7XG4gICAgdmVyc2lvbjogXCI1LjcuNVwiLFxuXG4gICAgLy8gU2NhbiBmb3IgXCJkYXRhLXBhZ3ktanNvblwiIGVsZW1lbnRzLCBwYXJzZSB0aGVpciBKU09OIGNvbnRlbnQgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnNcbiAgICBpbml0KGFyZz86RWxlbWVudHxuZXZlcikge1xuICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0YXJnZXQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLXBhZ3ktanNvbl1cIik7XG4gICAgICAgIGNvbnN0IHdhcm4gICAgID0gKGVsOkVsZW1lbnQsIGVycjp1bmtub3duKSA9PiBjb25zb2xlLndhcm4oXCJQYWd5LmluaXQoKSBza2lwcGVkIGVsZW1lbnQ6ICVvXFxuJXNcIiwgZWwsIGVycik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgICAgY29uc3QganNvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1wYWd5LWpzb25cIikgYXMgc3RyaW5nO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKGpzb24pIGFzIFBhZ3lKU09OO1xuICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkID09PSBcIm5hdlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdE5hdihlbGVtZW50IGFzIE5hdkVsZW1lbnQsIGFyZ3MgYXMgTmF2QXJncyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkID09PSBcImNvbWJvXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgUGFneS5pbml0Q29tYm8oZWxlbWVudCwgYXJncyBhcyBDb21ib0FyZ3MpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIFBhZ3kuaW5pdFNlbGVjdG9yKGVsZW1lbnQsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YXJuKGVsZW1lbnQsIGBJbGxlZ2FsIFBhZ3lKU09OIGtleXdvcmQ6IGV4cGVjdGVkIFwibmF2XCJ8XCJjb21ib1wifFwic2VsZWN0b3JcIiwgZ290IFwiJHtrZXl3b3JkfVwiYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7IHdhcm4oZWxlbWVudCwgZXJyKSB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgKl9uYXZfanMgaGVscGVyc1xuICAgIGluaXROYXYoZWw6TmF2RWxlbWVudCwgW3RhZ3MsIHNlcXVlbHMsIGxhYmVsU2VxdWVscywgdHJpbVBhcmFtXTpOYXZBcmdzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsLnBhcmVudEVsZW1lbnQgPz8gZWw7XG4gICAgICAgIGNvbnN0IHdpZHRocyAgICA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNlcXVlbHMpLm1hcCh3ID0+IHBhcnNlSW50KHcpKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gICAgICAgIGxldCBsYXN0V2lkdGggICA9IC0xO1xuICAgICAgICBjb25zdCBmaWxsSW4gICAgPSAobGluazpzdHJpbmcsIHBhZ2U6c3RyaW5nLCBsYWJlbDpzdHJpbmcpOnN0cmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fL2csIHBhZ2UpLnJlcGxhY2UoL19fcGFneV9sYWJlbF9fL2csIGxhYmVsKTtcbiAgICAgICAgKGVsLnBhZ3lSZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gd2lkdGhzLmZpbmQodyA9PiB3IDwgY29udGFpbmVyLmNsaWVudFdpZHRoKSB8fCAwO1xuICAgICAgICAgICAgaWYgKHdpZHRoID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuICAgICAgICAgICAgbGV0IGh0bWwgICAgID0gdGFncy5iZWZvcmU7XG4gICAgICAgICAgICBjb25zdCBzZXJpZXMgPSBzZXF1ZWxzW3dpZHRoLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxzID0gbGFiZWxTZXF1ZWxzPy5bd2lkdGgudG9TdHJpbmcoKV0gPz8gc2VyaWVzLm1hcChsID0+IGwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSAgPSBzZXJpZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmltUGFyYW0gPT09IFwic3RyaW5nXCIgJiYgaXRlbSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9IFBhZ3kudHJpbShmaWxsSW4odGFncy5saW5rLCBpdGVtLnRvU3RyaW5nKCksIGxhYmVsKSwgdHJpbVBhcmFtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gZmlsbEluKHRhZ3MubGluaywgaXRlbS50b1N0cmluZygpLCBsYWJlbCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtID09PSBcImdhcFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gdGFncy5nYXA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWN0aXZlIHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSBmaWxsSW4odGFncy5hY3RpdmUsIGl0ZW0sIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBodG1sICs9IHRhZ3MuYWZ0ZXI7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBhbGlnbi1hc3NpZ25tZW50cy9hbGlnbi1hc3NpZ25tZW50c1xuICAgICAgICAgICAgZWwuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgIGVsLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIiwgaHRtbCk7XG4gICAgICAgICAgICBsYXN0V2lkdGggPSB3aWR0aDtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucyhcInBhZ3ktcmpzXCIpKSB7IFBhZ3kucmpzT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpIH1cbiAgICB9LFxuXG4gICAgLy8gVGhlIG9ic2VydmVyIGluc3RhbmNlIGZvciByZXNwb25zaXZlIG5hdnNcbiAgICByanNPYnNlcnZlcjogbmV3IFJlc2l6ZU9ic2VydmVyKGVudHJpZXMgPT4ge1xuICAgICAgICBlbnRyaWVzLmZpbHRlcihlID0+IGUuY29udGVudEJveFNpemUpXG4gICAgICAgICAgICAgICAuZm9yRWFjaChlID0+IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGw8TmF2RWxlbWVudD4oXCIucGFneS1yanNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChyanMgPT4gcmpzLnBhZ3lSZW5kZXIoKSkpO1xuICAgIH0pLFxuXG4gICAgLy8gSW5pdCB0aGUgKl9jb21ib19uYXZfanMgaGVscGVyc1xuICAgIGluaXRDb21ibyhlbDpFbGVtZW50LCBbbGluaywgdHJpbVBhcmFtXTpDb21ib0FyZ3MpIHtcbiAgICAgICAgUGFneS5pbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4gW2lucHV0VmFsdWUsIGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy8sIGlucHV0VmFsdWUpXSwgdHJpbVBhcmFtKTtcbiAgICB9LFxuXG4gICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgaW5pdFNlbGVjdG9yKGVsOkVsZW1lbnQsIFtmcm9tLCBsaW5rLCB0cmltUGFyYW1dOlNlbGVjdG9yQXJncykge1xuICAgICAgICBQYWd5LmluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgcGFnZSkucmVwbGFjZSgvX19wYWd5X2l0ZW1zX18vLCBpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiBbcGFnZSwgaHRtbF07XG4gICAgICAgIH0sIHRyaW1QYXJhbSk7XG4gICAgfSxcblxuICAgIC8vIEluaXQgdGhlIGlucHV0IGVsZW1lbnRcbiAgICBpbml0SW5wdXQoZWw6RWxlbWVudCwgZ2V0VmFyczoodjpzdHJpbmcpPT5bc3RyaW5nLCBzdHJpbmddLCB0cmltUGFyYW0/OnN0cmluZykge1xuICAgICAgICBjb25zdCBpbnB1dCAgID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGluaXRpYWwgPSBpbnB1dC52YWx1ZTtcbiAgICAgICAgY29uc3QgYWN0aW9uICA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgW21pbiwgdmFsLCBtYXhdID0gW2lucHV0Lm1pbiwgaW5wdXQudmFsdWUsIGlucHV0Lm1heF0ubWFwKG4gPT4gcGFyc2VJbnQobikgfHwgMCk7XG4gICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IFtwYWdlLCBodG1sXSA9IGdldFZhcnMoaW5wdXQudmFsdWUpOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRyaW1QYXJhbSA9PT0gXCJzdHJpbmdcIiAmJiBwYWdlID09PSBcIjFcIikgeyBodG1sID0gUGFneS50cmltKGh0bWwsIHRyaW1QYXJhbSkgfVxuICAgICAgICAgICAgZWwuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYWZ0ZXJiZWdpblwiLCBodG1sKTtcbiAgICAgICAgICAgIChlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudCkuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfSxcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICB0cmltOiAobGluazpzdHJpbmcsIHBhcmFtOnN0cmluZykgPT4gbGluay5yZXBsYWNlKG5ldyBSZWdFeHAoYFs/Jl0ke3BhcmFtfT0xXFxcXGIoPyEmKXxcXFxcYiR7cGFyYW19PTEmYCksIFwiXCIpXG59O1xuIl19
|
82
|
+
const trim = (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
83
|
+
// Public interface
|
84
|
+
return {
|
85
|
+
version: "5.9.0",
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWNBLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxFQUFFO0lBQ2YsNENBQTRDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3Ryw0QkFBNEI7SUFDNUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQVMsRUFBRSxFQUFFO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksU0FBUyxHQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sTUFBTSxHQUFNLENBQUMsSUFBVyxFQUFFLElBQVcsRUFBRSxLQUFZLEVBQVMsRUFBRSxDQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RixDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUc7WUFDYixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUFFLE9BQU07YUFBRSxDQUFDLG1CQUFtQjtZQUN2RCxJQUFJLElBQUksR0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDakYsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ3BCLE1BQU0sSUFBSSxHQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUM3QyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDdEU7cUJBQU0sSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7b0JBQ2pDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3JEO3FCQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtvQkFDdkIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7aUJBQ3BCO3FCQUFNLEVBQUUsY0FBYztvQkFDbkIsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDNUM7YUFDSjtZQUNELElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUcsMERBQTBEO1lBQ2hGLEVBQUUsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ0wsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7U0FBRTtJQUM3RSxDQUFDLENBQUM7SUFFRixrQ0FBa0M7SUFDbEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFXLEVBQUUsRUFBRSxDQUMxRCxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVoRyxvQ0FBb0M7SUFDeEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxFQUFVLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBYyxFQUFFLEVBQUU7UUFDdEUsU0FBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN2RixPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUM7SUFFRix5QkFBeUI7SUFDekIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFVLEVBQUUsT0FBb0MsRUFBRSxTQUFpQixFQUFFLEVBQUU7UUFDdEYsTUFBTSxLQUFLLEdBQUssRUFBRSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQXFCLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUM1QixNQUFNLE1BQU0sR0FBSTtZQUNaLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7Z0JBQUUsT0FBTTthQUFFLENBQUUsY0FBYztZQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUcsNkJBQTZCO2dCQUN4RCxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNmLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFHLG1DQUFtQztZQUM5RSxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO2dCQUFFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQUU7WUFDbkYsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6RCxDQUFDLENBQUM7UUFDRixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVEsY0FBYztRQUNoRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQXVDLGlCQUFpQjtRQUNuRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRTtZQUFFLE1BQU0sRUFBRSxDQUFBO1NBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtJQUN2RyxDQUFDLENBQUM7SUFFRiwyQ0FBMkM7SUFDM0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFXLEVBQUUsS0FBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsSCxtQkFBbUI7SUFDbkIsT0FBTztRQUNILE9BQU8sRUFBRSxPQUFPO1FBRWhCLHFHQUFxRztRQUNyRyxJQUFJLENBQUMsR0FBa0I7WUFDbkIsTUFBTSxNQUFNLEdBQUssR0FBRyxZQUFZLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDekQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hELEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFO2dCQUN2QixJQUFJO29CQUNBLE1BQU0sVUFBVSxHQUFXLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDL0csTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7b0JBQzlHLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTt3QkFDbkIsT0FBTyxDQUFDLEVBQWdCLEVBQUUsSUFBZSxDQUFDLENBQUM7cUJBQzlDO3lCQUFNLElBQUksT0FBTyxLQUFLLE9BQU8sRUFBRTt3QkFDNUIsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFpQixDQUFDLENBQUM7cUJBQ3BDO3lCQUFNLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRTt3QkFDL0IsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFvQixDQUFDLENBQUM7cUJBQzFDO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNsRjtpQkFDSjtnQkFBQyxPQUFPLEdBQUcsRUFBRTtvQkFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtpQkFBRTthQUM3RTtRQUNMLENBQUM7S0FDSixDQUFDO0FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbInR5cGUgTmF2QXJncyAgICAgID0gcmVhZG9ubHkgW1RhZ3MsIFNlcXVlbHMsIG51bGx8TGFiZWxTZXF1ZWxzLCBzdHJpbmc/XVxudHlwZSBDb21ib0FyZ3MgICAgPSByZWFkb25seSBbc3RyaW5nLCBzdHJpbmc/XVxudHlwZSBTZWxlY3RvckFyZ3MgPSByZWFkb25seSBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZz9dXG5pbnRlcmZhY2UgVGFncyB7XG4gICAgcmVhZG9ubHkgYmVmb3JlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5rOiAgIHN0cmluZ1xuICAgIHJlYWRvbmx5IGFjdGl2ZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgZ2FwOiAgICBzdHJpbmdcbiAgICByZWFkb25seSBhZnRlcjogIHN0cmluZ1xufVxuaW50ZXJmYWNlIFNlcXVlbHMgICAgICB7IHJlYWRvbmx5IFt3aWR0aDpzdHJpbmddOiAoc3RyaW5nfG51bWJlcilbXSB9XG5pbnRlcmZhY2UgTGFiZWxTZXF1ZWxzIHsgcmVhZG9ubHkgW3dpZHRoOnN0cmluZ106IHN0cmluZ1tdIH1cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7IHBhZ3lSZW5kZXIoKTogdm9pZCB9XG5cbmNvbnN0IFBhZ3kgPSAoKCkgPT4ge1xuICAgIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gICAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PlxuICAgICAgICBlbnRyaWVzLmZvckVhY2goZSA9PiBlLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsPE5hdkVsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goZWwgPT4gZWwucGFneVJlbmRlcigpKSkpO1xuXG4gICAgLy8gSW5pdCB0aGUgKl9uYXZfanMgaGVscGVyc1xuICAgIGNvbnN0IGluaXROYXYgPSAoZWw6TmF2RWxlbWVudCwgW3RhZ3MsIHNlcXVlbHMsIGxhYmVsU2VxdWVscywgdHJpbVBhcmFtXTpOYXZBcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGVsLnBhcmVudEVsZW1lbnQgPz8gZWw7XG4gICAgICAgIGNvbnN0IHdpZHRocyAgICA9IE9iamVjdC5rZXlzKHNlcXVlbHMpLm1hcCh3ID0+IHBhcnNlSW50KHcpKS5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG4gICAgICAgIGxldCBsYXN0V2lkdGggICA9IC0xO1xuICAgICAgICBjb25zdCBmaWxsSW4gICAgPSAobGluazpzdHJpbmcsIHBhZ2U6c3RyaW5nLCBsYWJlbDpzdHJpbmcpOnN0cmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fL2csIHBhZ2UpLnJlcGxhY2UoL19fcGFneV9sYWJlbF9fL2csIGxhYmVsKTtcbiAgICAgICAgKGVsLnBhZ3lSZW5kZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gd2lkdGhzLmZpbmQodyA9PiB3IDwgY29udGFpbmVyLmNsaWVudFdpZHRoKSB8fCAwO1xuICAgICAgICAgICAgaWYgKHdpZHRoID09PSBsYXN0V2lkdGgpIHsgcmV0dXJuIH0gLy8gbm8gY2hhbmdlOiBhYm9ydFxuICAgICAgICAgICAgbGV0IGh0bWwgICAgID0gdGFncy5iZWZvcmU7XG4gICAgICAgICAgICBjb25zdCBzZXJpZXMgPSBzZXF1ZWxzW3dpZHRoLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxzID0gbGFiZWxTZXF1ZWxzPy5bd2lkdGgudG9TdHJpbmcoKV0gPz8gc2VyaWVzLm1hcChsID0+IGwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gc2VyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSAgPSBzZXJpZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmltUGFyYW0gPT09IFwic3RyaW5nXCIgJiYgaXRlbSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9IHRyaW0oZmlsbEluKHRhZ3MubGluaywgaXRlbS50b1N0cmluZygpLCBsYWJlbCksIHRyaW1QYXJhbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9IGZpbGxJbih0YWdzLmxpbmssIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PT0gXCJnYXBcIikge1xuICAgICAgICAgICAgICAgICAgICBodG1sICs9IHRhZ3MuZ2FwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFjdGl2ZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gZmlsbEluKHRhZ3MuYWN0aXZlLCBpdGVtLCBsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaHRtbCArPSB0YWdzLmFmdGVyOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgICAgICAgbGFzdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwYWd5LXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcikgfVxuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSAqX2NvbWJvX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdENvbWJvID0gKGVsOkVsZW1lbnQsIFtsaW5rLCB0cmltUGFyYW1dOkNvbWJvQXJncykgPT5cbiAgICAgICAgaW5pdElucHV0KGVsLCBpbnB1dFZhbHVlID0+IFtpbnB1dFZhbHVlLCBsaW5rLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBpbnB1dFZhbHVlKV0sIHRyaW1QYXJhbSk7XG5cbiAgICAgICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgY29uc3QgaW5pdFNlbGVjdG9yID0gKGVsOkVsZW1lbnQsIFtmcm9tLCBsaW5rLCB0cmltUGFyYW1dOlNlbGVjdG9yQXJncykgPT4ge1xuICAgICAgICBpbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGgubWF4KE1hdGguY2VpbChmcm9tIC8gcGFyc2VJbnQoaW5wdXRWYWx1ZSkpLCAxKS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGxpbmsucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy8sIHBhZ2UpLnJlcGxhY2UoL19fcGFneV9pdGVtc19fLywgaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gW3BhZ2UsIGh0bWxdO1xuICAgICAgICB9LCB0cmltUGFyYW0pO1xuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gICAgY29uc3QgaW5pdElucHV0ID0gKGVsOkVsZW1lbnQsIGdldFZhcnM6KHY6c3RyaW5nKT0+W3N0cmluZywgc3RyaW5nXSwgdHJpbVBhcmFtPzpzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaW5wdXQgICA9IGVsLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBpbml0aWFsID0gaW5wdXQudmFsdWU7XG4gICAgICAgIGNvbnN0IGFjdGlvbiAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSA9PT0gaW5pdGlhbCkgeyByZXR1cm4gfSAgLy8gbm90IGNoYW5nZWRcbiAgICAgICAgICAgIGNvbnN0IFttaW4sIHZhbCwgbWF4XSA9IFtpbnB1dC5taW4sIGlucHV0LnZhbHVlLCBpbnB1dC5tYXhdLm1hcChuID0+IHBhcnNlSW50KG4pIHx8IDApO1xuICAgICAgICAgICAgaWYgKHZhbCA8IG1pbiB8fCB2YWwgPiBtYXgpIHsgIC8vIHJlc2V0IGludmFsaWQvb3V0LW9mLXJhbmdlXG4gICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgIGlucHV0LnNlbGVjdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBbcGFnZSwgaHRtbF0gPSBnZXRWYXJzKGlucHV0LnZhbHVlKTsgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHByZWZlci1jb25zdFxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmltUGFyYW0gPT09IFwic3RyaW5nXCIgJiYgcGFnZSA9PT0gXCIxXCIpIHsgaHRtbCA9IHRyaW0oaHRtbCwgdHJpbVBhcmFtKSB9XG4gICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgICAgICAgKGVsLnF1ZXJ5U2VsZWN0b3IoXCJhXCIpIGFzIEhUTUxBbmNob3JFbGVtZW50KS5jbGljaygpO1xuICAgICAgICB9O1xuICAgICAgICBbXCJjaGFuZ2VcIiwgXCJmb2N1c1wiXS5mb3JFYWNoKGUgPT4gaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihlLCBpbnB1dC5zZWxlY3QpKTsgICAgICAgIC8vIGF1dG8tc2VsZWN0XG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCBhY3Rpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlwcmVzc1wiLCBlID0+IHsgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHsgYWN0aW9uKCkgfSB9KTsgLy8gdHJpZ2dlciBhY3Rpb25cbiAgICB9O1xuXG4gICAgLy8gVHJpbSB0aGUgJHtwYWdlLXBhcmFtfT0xIHBhcmFtcyBpbiBsaW5rc1xuICAgIGNvbnN0IHRyaW0gPSAobGluazpzdHJpbmcsIHBhcmFtOnN0cmluZykgPT4gbGluay5yZXBsYWNlKG5ldyBSZWdFeHAoYFs/Jl0ke3BhcmFtfT0xXFxcXGIoPyEmKXxcXFxcYiR7cGFyYW19PTEmYCksIFwiXCIpO1xuXG4gICAgLy8gUHVibGljIGludGVyZmFjZVxuICAgIHJldHVybiB7XG4gICAgICAgIHZlcnNpb246IFwiNS45LjBcIixcblxuICAgICAgICAvLyBTY2FuIGZvciBlbGVtZW50cyB3aXRoIGEgXCJkYXRhLXBhZ3lcIiBhdHRyaWJ1dGUgYW5kIGNhbGwgdGhlaXIgaW5pdCBmdW5jdGlvbnMgd2l0aCB0aGUgZGVjb2RlZCBhcmdzXG4gICAgICAgIGluaXQoYXJnPzpFbGVtZW50fG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiJdfQ==
|
@@ -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,36 +1,10 @@
|
|
1
|
-
const Pagy = {
|
2
|
-
|
3
|
-
|
4
|
-
init(arg) {
|
5
|
-
const target = arg instanceof Element ? arg : document;
|
6
|
-
const elements = target.querySelectorAll("[data-pagy-json]");
|
7
|
-
const warn = (el, err) => console.warn("Pagy.init() skipped element: %o\n%s", el, err);
|
8
|
-
for (const element of elements) {
|
9
|
-
const json = element.getAttribute("data-pagy-json");
|
10
|
-
try {
|
11
|
-
const [keyword, ...args] = JSON.parse(json);
|
12
|
-
if (keyword === "nav") {
|
13
|
-
Pagy.initNav(element, args);
|
14
|
-
}
|
15
|
-
else if (keyword === "combo") {
|
16
|
-
Pagy.initCombo(element, args);
|
17
|
-
}
|
18
|
-
else if (keyword === "selector") {
|
19
|
-
Pagy.initSelector(element, args);
|
20
|
-
}
|
21
|
-
else {
|
22
|
-
warn(element, `Illegal PagyJSON keyword: expected "nav"|"combo"|"selector", got "${keyword}"`);
|
23
|
-
}
|
24
|
-
}
|
25
|
-
catch (err) {
|
26
|
-
warn(element, err);
|
27
|
-
}
|
28
|
-
}
|
29
|
-
},
|
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())));
|
30
4
|
// Init the *_nav_js helpers
|
31
|
-
initNav(el, [tags, sequels, labelSequels, trimParam]) {
|
5
|
+
const initNav = (el, [tags, sequels, labelSequels, trimParam]) => {
|
32
6
|
const container = el.parentElement ?? el;
|
33
|
-
const widths = Object.
|
7
|
+
const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
|
34
8
|
let lastWidth = -1;
|
35
9
|
const fillIn = (link, page, label) => link.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
|
36
10
|
(el.pagyRender = function () {
|
@@ -45,7 +19,7 @@ const Pagy = {
|
|
45
19
|
const item = series[i];
|
46
20
|
const label = labels[i];
|
47
21
|
if (typeof trimParam === "string" && item === 1) {
|
48
|
-
html +=
|
22
|
+
html += trim(fillIn(tags.link, item.toString(), label), trimParam);
|
49
23
|
}
|
50
24
|
else if (typeof item === "number") {
|
51
25
|
html += fillIn(tags.link, item.toString(), label);
|
@@ -63,29 +37,21 @@ const Pagy = {
|
|
63
37
|
lastWidth = width;
|
64
38
|
})();
|
65
39
|
if (el.classList.contains("pagy-rjs")) {
|
66
|
-
|
40
|
+
rjsObserver.observe(container);
|
67
41
|
}
|
68
|
-
}
|
69
|
-
// The observer instance for responsive navs
|
70
|
-
rjsObserver: new ResizeObserver(entries => {
|
71
|
-
entries.filter(e => e.contentBoxSize)
|
72
|
-
.forEach(e => e.target.querySelectorAll(".pagy-rjs")
|
73
|
-
.forEach(rjs => rjs.pagyRender()));
|
74
|
-
}),
|
42
|
+
};
|
75
43
|
// Init the *_combo_nav_js helpers
|
76
|
-
initCombo(el, [link, trimParam])
|
77
|
-
Pagy.initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
|
78
|
-
},
|
44
|
+
const initCombo = (el, [link, trimParam]) => initInput(el, inputValue => [inputValue, link.replace(/__pagy_page__/, inputValue)], trimParam);
|
79
45
|
// Init the items_selector_js helper
|
80
|
-
initSelector(el, [from, link, trimParam]) {
|
81
|
-
|
46
|
+
const initSelector = (el, [from, link, trimParam]) => {
|
47
|
+
initInput(el, inputValue => {
|
82
48
|
const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
|
83
49
|
const html = link.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
|
84
50
|
return [page, html];
|
85
51
|
}, trimParam);
|
86
|
-
}
|
52
|
+
};
|
87
53
|
// Init the input element
|
88
|
-
initInput(el, getVars, trimParam) {
|
54
|
+
const initInput = (el, getVars, trimParam) => {
|
89
55
|
const input = el.querySelector("input");
|
90
56
|
const initial = input.value;
|
91
57
|
const action = function () {
|
@@ -100,7 +66,7 @@ const Pagy = {
|
|
100
66
|
}
|
101
67
|
let [page, html] = getVars(input.value); // eslint-disable-line prefer-const
|
102
68
|
if (typeof trimParam === "string" && page === "1") {
|
103
|
-
html =
|
69
|
+
html = trim(html, trimParam);
|
104
70
|
}
|
105
71
|
el.insertAdjacentHTML("afterbegin", html);
|
106
72
|
el.querySelector("a").click();
|
@@ -110,8 +76,38 @@ const Pagy = {
|
|
110
76
|
input.addEventListener("keypress", e => { if (e.key === "Enter") {
|
111
77
|
action();
|
112
78
|
} }); // trigger action
|
113
|
-
}
|
79
|
+
};
|
114
80
|
// Trim the ${page-param}=1 params in links
|
115
|
-
trim
|
116
|
-
|
81
|
+
const trim = (link, param) => link.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
82
|
+
// Public interface
|
83
|
+
return {
|
84
|
+
version: "5.9.0",
|
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
|
+
})();
|
117
113
|
export default Pagy;
|
data/lib/javascripts/pagy.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
!function(){function
|
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("[?&]".concat(e,"=1\\b(?!&)|\\b").concat(e,"=1&")),"")},{version:"5.9.0",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],b=d.slice(1);"nav"===_?o(g,b):"combo"===_?i(g,b):"selector"===_?c(g,b):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}();
|
data/lib/pagy/calendar/day.rb
CHANGED
@@ -13,16 +13,16 @@ class Pagy # :nodoc:
|
|
13
13
|
# Setup the calendar variables
|
14
14
|
def setup_unit_vars
|
15
15
|
super
|
16
|
-
@initial =
|
17
|
-
@final =
|
18
|
-
@pages = @last = (@final - @initial).to_i /
|
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
|
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 +
|
25
|
+
@initial + offset_units_for(page).days
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
data/lib/pagy/calendar/month.rb
CHANGED
@@ -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:
|
8
|
+
DEFAULT = { order: :asc, # rubocop:disable Style/MutableConstant
|
11
9
|
format: '%Y-%m' }
|
12
|
-
|
13
|
-
|
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 /
|
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
|
data/lib/pagy/calendar/week.rb
CHANGED
@@ -5,34 +5,29 @@ class Pagy # :nodoc:
|
|
5
5
|
class Calendar # :nodoc:
|
6
6
|
# Calendar week subclass
|
7
7
|
class Week < Calendar
|
8
|
-
DEFAULT
|
9
|
-
|
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
|
-
@
|
19
|
-
|
20
|
-
|
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
|
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 +
|
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
|
data/lib/pagy/calendar/year.rb
CHANGED
@@ -13,16 +13,16 @@ class Pagy # :nodoc:
|
|
13
13
|
# Setup the calendar variables
|
14
14
|
def setup_unit_vars
|
15
15
|
super
|
16
|
-
@initial =
|
17
|
-
@final =
|
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 =
|
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
|
-
|
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
|
-
|
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 reu]place 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
|
data/lib/pagy/countless.rb
CHANGED
@@ -41,7 +41,7 @@ class Pagy # :nodoc:
|
|
41
41
|
'after' => %(#{pagy_bootstrap_next_html pagy, link}</ul>) }
|
42
42
|
|
43
43
|
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bootstrap-nav-js" aria-label="pager" #{
|
44
|
-
|
44
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
45
45
|
end
|
46
46
|
|
47
47
|
# Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -55,7 +55,7 @@ class Pagy # :nodoc:
|
|
55
55
|
p_pages.to_s.length + 1}rem;">)
|
56
56
|
|
57
57
|
%(<nav#{p_id} class="pagy-bootstrap-combo-nav-js pagination" aria-label="pager"><div class="btn-group" role="group" #{
|
58
|
-
|
58
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
59
59
|
if (p_prev = pagy.prev)
|
60
60
|
link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"'
|
61
61
|
else
|
data/lib/pagy/extras/bulma.rb
CHANGED
@@ -45,7 +45,7 @@ class Pagy # :nodoc:
|
|
45
45
|
'after' => '</ul>' }
|
46
46
|
|
47
47
|
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-bulma-nav-js pagination is-centered" aria-label="pagination" #{
|
48
|
-
|
48
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
49
49
|
end
|
50
50
|
|
51
51
|
# Javascript combo pagination for bulma: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -59,7 +59,7 @@ class Pagy # :nodoc:
|
|
59
59
|
|
60
60
|
html = %(<nav#{p_id} class="pagy-bulma-combo-nav-js" aria-label="pagination">)
|
61
61
|
%(#{html}<div class="field is-grouped is-grouped-centered" role="group" #{
|
62
|
-
|
62
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
63
63
|
if (p_prev = pagy.prev)
|
64
64
|
%(<p class="control">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"'}</p>)
|
65
65
|
else
|
@@ -38,7 +38,7 @@ class Pagy # :nodoc:
|
|
38
38
|
'after' => %(#{pagy_foundation_next_html pagy, link}</ul>) }
|
39
39
|
|
40
40
|
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-foundation-nav-js" aria-label="Pagination" #{
|
41
|
-
|
41
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
42
42
|
end
|
43
43
|
|
44
44
|
# Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -52,7 +52,7 @@ class Pagy # :nodoc:
|
|
52
52
|
p_pages.to_s.length + 1}rem; padding: 0 0.3rem; margin: 0 0.3rem;">)
|
53
53
|
|
54
54
|
%(<nav#{p_id} class="pagy-foundation-combo-nav-js" aria-label="Pagination"><div class="input-group" #{
|
55
|
-
|
55
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
56
56
|
if (p_prev = pagy.prev)
|
57
57
|
link.call p_prev, pagy_t('pagy.nav.prev'),
|
58
58
|
'style="margin-bottom: 0" aria-label="previous" class="prev button primary"'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'base64'
|
4
4
|
|
5
5
|
class Pagy # :nodoc:
|
6
6
|
DEFAULT[:steps] = false # default false will use {0 => @vars[:size]}
|
@@ -44,17 +44,19 @@ class Pagy # :nodoc:
|
|
44
44
|
# Additions for the Frontend
|
45
45
|
module Frontend
|
46
46
|
if defined?(Oj)
|
47
|
-
# Return a
|
48
|
-
|
47
|
+
# Return a data tag with the base64 encoded JSON-serialized args generated with the faster oj gem
|
48
|
+
# Base64 encoded JSON is smaller than HTML escaped JSON
|
49
|
+
def pagy_data(pagy, *args)
|
49
50
|
args << pagy.vars[:page_param] if pagy.vars[:trim_extra]
|
50
|
-
%(data-pagy
|
51
|
+
%(data-pagy="#{Base64.strict_encode64(Oj.dump(args, mode: :strict))}")
|
51
52
|
end
|
52
53
|
else
|
53
54
|
require 'json'
|
54
|
-
# Return a
|
55
|
-
|
55
|
+
# Return a data tag with the base64 encoded JSON-serialized args generated with the slower to_json
|
56
|
+
# Base64 encoded JSON is smaller than HTML escaped JSON
|
57
|
+
def pagy_data(pagy, *args)
|
56
58
|
args << pagy.vars[:page_param] if pagy.vars[:trim_extra]
|
57
|
-
%(data-pagy
|
59
|
+
%(data-pagy="#{Base64.strict_encode64(args.to_json)}")
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
data/lib/pagy/extras/gearbox.rb
CHANGED
@@ -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
|
data/lib/pagy/extras/items.rb
CHANGED
@@ -39,7 +39,7 @@ class Pagy # :nodoc:
|
|
39
39
|
link = pagy_marked_link(pagy_link_proc(pagy, link_extra: link_extra))
|
40
40
|
p_vars[:items] = p_items # restore the items
|
41
41
|
|
42
|
-
html = +%(<span#{p_id} class="pagy-items-selector-js" #{
|
42
|
+
html = +%(<span#{p_id} class="pagy-items-selector-js" #{pagy_data(pagy, :selector, pagy.from, link)}>)
|
43
43
|
input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{
|
44
44
|
p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length + 1}rem;">)
|
45
45
|
html << pagy_t('pagy.items_selector_js', item_name: item_name || pagy_t(i18n_key || p_vars[:i18n_key], count: p_items),
|
@@ -39,7 +39,7 @@ class Pagy # :nodoc:
|
|
39
39
|
'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
|
40
40
|
|
41
41
|
%(<div#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-materialize-nav-js" role="navigation" aria-label="pager" #{
|
42
|
-
|
42
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></div>)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -54,7 +54,7 @@ class Pagy # :nodoc:
|
|
54
54
|
|
55
55
|
html = %(<ul#{p_id} class="pagy-materialize-combo-nav-js pagination chip" role="navigation")
|
56
56
|
%(#{html} aria-label="pager" style="padding-right: 0" #{
|
57
|
-
|
57
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
58
58
|
pagy_materialize_prev_html pagy, link, style}<li class="pagy-combo-input">#{
|
59
59
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages}</li>#{
|
60
60
|
pagy_materialize_next_html pagy, link, style}</ul>)
|
data/lib/pagy/extras/navs.rb
CHANGED
@@ -19,7 +19,7 @@ class Pagy # :nodoc:
|
|
19
19
|
'after' => pagy_nav_next_html(pagy, link) }
|
20
20
|
|
21
21
|
%(<nav#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-nav-js pagination" aria-label="pager" #{
|
22
|
-
|
22
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></nav>)
|
23
23
|
end
|
24
24
|
|
25
25
|
# Javascript combo pagination: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -32,7 +32,7 @@ class Pagy # :nodoc:
|
|
32
32
|
p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
|
33
33
|
|
34
34
|
%(<nav#{p_id} class="pagy-combo-nav-js pagination" aria-label="pager" #{
|
35
|
-
|
35
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
36
36
|
pagy_nav_prev_html pagy, link
|
37
37
|
}<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
|
38
38
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
data/lib/pagy/extras/semantic.rb
CHANGED
@@ -38,7 +38,7 @@ class Pagy # :nodoc:
|
|
38
38
|
'after' => pagy_semantic_next_html(pagy, link) }
|
39
39
|
|
40
40
|
%(<div#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-semantic-nav-js ui pagination menu" role="navigation" #{
|
41
|
-
|
41
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></div>)
|
42
42
|
end
|
43
43
|
|
44
44
|
# Combo pagination for semantic: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -51,7 +51,7 @@ class Pagy # :nodoc:
|
|
51
51
|
p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length + 1}rem; margin: 0 0.3rem">)
|
52
52
|
|
53
53
|
%(<div#{p_id} class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" #{
|
54
|
-
|
54
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))}>#{
|
55
55
|
pagy_semantic_prev_html pagy, link
|
56
56
|
}<div class="pagy-combo-input item">#{
|
57
57
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
data/lib/pagy/extras/uikit.rb
CHANGED
@@ -37,7 +37,7 @@ class Pagy # :nodoc:
|
|
37
37
|
'after' => pagy_uikit_next_html(pagy, link) }
|
38
38
|
|
39
39
|
%(<ul#{p_id} class="#{'pagy-rjs ' if sequels.size > 1}pagy-uikit-nav-js uk-pagination uk-flex-center" #{
|
40
|
-
|
40
|
+
pagy_data(pagy, :nav, tags, sequels, pagy.label_sequels(sequels))}></ul>)
|
41
41
|
end
|
42
42
|
|
43
43
|
# Javascript combo pagination for uikit: it returns a nav and a JSON tag used by the pagy.js file
|
@@ -50,7 +50,7 @@ class Pagy # :nodoc:
|
|
50
50
|
p_page}" style="text-align: center; width: #{p_pages.to_s.length + 1}rem;">)
|
51
51
|
|
52
52
|
%(<ul#{p_id} class="pagy-uikit-combo-nav-js uk-button-group uk-pagination uk-flex-center" #{
|
53
|
-
|
53
|
+
pagy_data(pagy, :combo, pagy_marked_link(link))
|
54
54
|
}>#{
|
55
55
|
pagy_uikit_prev_html pagy, link
|
56
56
|
}<li>#{
|
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
|
+
VERSION = '5.9.0'
|
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
|
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
|
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
|
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.
|
4
|
+
version: 5.9.0
|
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-
|
12
|
-
dependencies:
|
11
|
+
date: 2022-01-20 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
|