pagy 7.0.11 → 43.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/apps/calendar.ru +741 -0
- data/apps/demo.ru +513 -0
- data/apps/enable_rails_page_segment.rb +54 -0
- data/apps/index.rb +9 -0
- data/apps/keynav+root_key.ru +316 -0
- data/apps/keynav.ru +255 -0
- data/apps/keyset.ru +219 -0
- data/apps/keyset_sequel.ru +212 -0
- data/apps/rails.ru +216 -0
- data/apps/repro.ru +185 -0
- data/bin/pagy +5 -0
- data/config/pagy.rb +46 -0
- data/javascripts/ai_widget.js +90 -0
- data/javascripts/pagy.js +168 -0
- data/javascripts/pagy.min.js +2 -0
- data/javascripts/pagy.mjs +161 -0
- data/javascripts/wand.js +1172 -0
- data/lib/pagy/classes/calendar/calendar.rb +101 -0
- data/lib/pagy/{calendar → classes/calendar}/day.rb +9 -12
- data/lib/pagy/{calendar → classes/calendar}/month.rb +7 -11
- data/lib/pagy/{calendar → classes/calendar}/quarter.rb +12 -16
- data/lib/pagy/classes/calendar/unit.rb +93 -0
- data/lib/pagy/{calendar → classes/calendar}/week.rb +7 -11
- data/lib/pagy/{calendar → classes/calendar}/year.rb +9 -9
- data/lib/pagy/classes/exceptions.rb +26 -0
- data/lib/pagy/classes/keyset/adapters/active_record.rb +50 -0
- data/lib/pagy/classes/keyset/adapters/sequel.rb +62 -0
- data/lib/pagy/classes/keyset/keynav.rb +85 -0
- data/lib/pagy/classes/keyset/keyset.rb +150 -0
- data/lib/pagy/classes/offset/countish.rb +17 -0
- data/lib/pagy/classes/offset/countless.rb +63 -0
- data/lib/pagy/classes/offset/offset.rb +63 -0
- data/lib/pagy/classes/offset/search.rb +34 -0
- data/lib/pagy/classes/request.rb +48 -0
- data/lib/pagy/cli.rb +122 -0
- data/lib/pagy/console.rb +5 -20
- data/lib/pagy/deprecated.rb +84 -0
- data/lib/pagy/modules/abilities/configurable.rb +37 -0
- data/lib/pagy/modules/abilities/countable.rb +23 -0
- data/lib/pagy/modules/abilities/linkable.rb +72 -0
- data/lib/pagy/modules/abilities/rangeable.rb +14 -0
- data/lib/pagy/modules/abilities/shiftable.rb +12 -0
- data/lib/pagy/modules/b64.rb +35 -0
- data/lib/pagy/modules/console.rb +33 -0
- data/lib/pagy/modules/i18n/i18n.rb +72 -0
- data/lib/pagy/modules/i18n/p11n/arabic.rb +30 -0
- data/lib/pagy/modules/i18n/p11n/east_slavic.rb +27 -0
- data/lib/pagy/modules/i18n/p11n/one_other.rb +15 -0
- data/lib/pagy/modules/i18n/p11n/one_upto_two_other.rb +15 -0
- data/lib/pagy/modules/i18n/p11n/other.rb +13 -0
- data/lib/pagy/modules/i18n/p11n/polish.rb +27 -0
- data/lib/pagy/modules/i18n/p11n/west_slavic.rb +22 -0
- data/lib/pagy/modules/i18n/p11n.rb +16 -0
- data/lib/pagy/modules/searcher.rb +20 -0
- data/lib/pagy/next.rb +25 -0
- data/lib/pagy/tasks/sync.rb +20 -0
- data/lib/pagy/toolbox/helpers/anchor_tags.rb +21 -0
- data/lib/pagy/toolbox/helpers/bootstrap/input_nav_js.rb +28 -0
- data/lib/pagy/toolbox/helpers/bootstrap/previous_next_html.rb +19 -0
- data/lib/pagy/toolbox/helpers/bootstrap/series_nav.rb +32 -0
- data/lib/pagy/toolbox/helpers/bootstrap/series_nav_js.rb +24 -0
- data/lib/pagy/toolbox/helpers/bulma/input_nav_js.rb +25 -0
- data/lib/pagy/toolbox/helpers/bulma/previous_next_html.rb +20 -0
- data/lib/pagy/toolbox/helpers/bulma/series_nav.rb +31 -0
- data/lib/pagy/toolbox/helpers/bulma/series_nav_js.rb +23 -0
- data/lib/pagy/toolbox/helpers/data_hash.rb +29 -0
- data/lib/pagy/toolbox/helpers/headers_hash.rb +30 -0
- data/lib/pagy/toolbox/helpers/info_tag.rb +30 -0
- data/lib/pagy/toolbox/helpers/input_nav_js.rb +22 -0
- data/lib/pagy/toolbox/helpers/limit_tag_js.rb +25 -0
- data/lib/pagy/toolbox/helpers/loaders.rb +55 -0
- data/lib/pagy/toolbox/helpers/page_url.rb +16 -0
- data/lib/pagy/toolbox/helpers/series_nav.rb +30 -0
- data/lib/pagy/toolbox/helpers/series_nav_js.rb +20 -0
- data/lib/pagy/toolbox/helpers/support/a_lambda.rb +36 -0
- data/lib/pagy/toolbox/helpers/support/data_pagy_attribute.rb +19 -0
- data/lib/pagy/toolbox/helpers/support/nav_aria_label_attribute.rb +10 -0
- data/lib/pagy/toolbox/helpers/support/series.rb +37 -0
- data/lib/pagy/toolbox/helpers/support/wrap_input_nav_js.rb +19 -0
- data/lib/pagy/toolbox/helpers/support/wrap_series_nav.rb +17 -0
- data/lib/pagy/toolbox/helpers/support/wrap_series_nav_js.rb +42 -0
- data/lib/pagy/toolbox/helpers/urls_hash.rb +12 -0
- data/lib/pagy/toolbox/paginators/calendar.rb +34 -0
- data/lib/pagy/toolbox/paginators/countish.rb +38 -0
- data/lib/pagy/toolbox/paginators/countless.rb +22 -0
- data/lib/pagy/toolbox/paginators/elasticsearch_rails.rb +56 -0
- data/lib/pagy/toolbox/paginators/keynav_js.rb +26 -0
- data/lib/pagy/toolbox/paginators/keyset.rb +15 -0
- data/lib/pagy/toolbox/paginators/meilisearch.rb +34 -0
- data/lib/pagy/toolbox/paginators/method.rb +38 -0
- data/lib/pagy/toolbox/paginators/offset.rb +24 -0
- data/lib/pagy/toolbox/paginators/searchkick.rb +34 -0
- data/lib/pagy/toolbox/paginators/typesense_rails.rb +34 -0
- data/lib/pagy.rb +67 -131
- data/locales/ar.yml +32 -0
- data/locales/be.yml +28 -0
- data/locales/bg.yml +24 -0
- data/locales/bs.yml +28 -0
- data/locales/ca.yml +24 -0
- data/locales/ckb.yml +20 -0
- data/locales/cs.yml +26 -0
- data/locales/da.yml +24 -0
- data/locales/de.yml +24 -0
- data/locales/dz.yml +20 -0
- data/locales/en.yml +24 -0
- data/{lib/locales → locales}/es.yml +9 -6
- data/locales/fr.yml +24 -0
- data/locales/hr.yml +28 -0
- data/locales/id.yml +20 -0
- data/locales/it.yml +24 -0
- data/locales/ja.yml +20 -0
- data/locales/km.yml +20 -0
- data/locales/ko.yml +20 -0
- data/locales/nb.yml +24 -0
- data/locales/nl.yml +24 -0
- data/locales/nn.yml +24 -0
- data/locales/pl.yml +28 -0
- data/{lib/locales → locales}/pt-BR.yml +10 -7
- data/{lib/locales → locales}/pt.yml +10 -7
- data/locales/ru.yml +28 -0
- data/locales/sk.yml +26 -0
- data/locales/sr.yml +28 -0
- data/locales/sv-SE.yml +24 -0
- data/locales/sv.yml +24 -0
- data/locales/sw.yml +28 -0
- data/locales/ta.yml +24 -0
- data/locales/tr.yml +24 -0
- data/locales/uk.yml +28 -0
- data/locales/vi.yml +20 -0
- data/locales/zh-CN.yml +20 -0
- data/locales/zh-HK.yml +20 -0
- data/locales/zh-TW.yml +20 -0
- data/stylesheets/pagy-tailwind.css +68 -0
- data/stylesheets/pagy.css +83 -0
- metadata +185 -94
- data/lib/config/pagy.rb +0 -258
- data/lib/javascripts/pagy-dev.js +0 -112
- data/lib/javascripts/pagy-module.js +0 -111
- data/lib/javascripts/pagy.js +0 -1
- data/lib/locales/ar.yml +0 -30
- data/lib/locales/be.yml +0 -25
- data/lib/locales/bg.yml +0 -21
- data/lib/locales/bs.yml +0 -25
- data/lib/locales/ca.yml +0 -23
- data/lib/locales/ckb.yml +0 -18
- data/lib/locales/cs.yml +0 -23
- data/lib/locales/da.yml +0 -23
- data/lib/locales/de.yml +0 -21
- data/lib/locales/en.yml +0 -21
- data/lib/locales/fr.yml +0 -21
- data/lib/locales/hr.yml +0 -25
- data/lib/locales/id.yml +0 -19
- data/lib/locales/it.yml +0 -21
- data/lib/locales/ja.yml +0 -19
- data/lib/locales/km.yml +0 -19
- data/lib/locales/ko.yml +0 -19
- data/lib/locales/nb.yml +0 -21
- data/lib/locales/nl.yml +0 -21
- data/lib/locales/nn.yml +0 -21
- data/lib/locales/pl.yml +0 -25
- data/lib/locales/ru.yml +0 -27
- data/lib/locales/sr.yml +0 -25
- data/lib/locales/sv-SE.yml +0 -21
- data/lib/locales/sv.yml +0 -21
- data/lib/locales/sw.yml +0 -23
- data/lib/locales/ta.yml +0 -23
- data/lib/locales/tr.yml +0 -19
- data/lib/locales/uk.yml +0 -25
- data/lib/locales/vi.yml +0 -17
- data/lib/locales/zh-CN.yml +0 -19
- data/lib/locales/zh-HK.yml +0 -19
- data/lib/locales/zh-TW.yml +0 -19
- data/lib/pagy/backend.rb +0 -39
- data/lib/pagy/calendar/helper.rb +0 -65
- data/lib/pagy/calendar.rb +0 -126
- data/lib/pagy/countless.rb +0 -37
- data/lib/pagy/exceptions.rb +0 -25
- data/lib/pagy/extras/arel.rb +0 -36
- data/lib/pagy/extras/array.rb +0 -24
- data/lib/pagy/extras/bootstrap.rb +0 -108
- data/lib/pagy/extras/bulma.rb +0 -105
- data/lib/pagy/extras/calendar.rb +0 -53
- data/lib/pagy/extras/countless.rb +0 -37
- data/lib/pagy/extras/elasticsearch_rails.rb +0 -80
- data/lib/pagy/extras/foundation.rb +0 -105
- data/lib/pagy/extras/frontend_helpers.rb +0 -67
- data/lib/pagy/extras/gearbox.rb +0 -54
- data/lib/pagy/extras/headers.rb +0 -53
- data/lib/pagy/extras/i18n.rb +0 -26
- data/lib/pagy/extras/items.rb +0 -61
- data/lib/pagy/extras/jsonapi.rb +0 -79
- data/lib/pagy/extras/materialize.rb +0 -96
- data/lib/pagy/extras/meilisearch.rb +0 -65
- data/lib/pagy/extras/metadata.rb +0 -38
- data/lib/pagy/extras/navs.rb +0 -51
- data/lib/pagy/extras/overflow.rb +0 -80
- data/lib/pagy/extras/searchkick.rb +0 -67
- data/lib/pagy/extras/semantic.rb +0 -95
- data/lib/pagy/extras/standalone.rb +0 -60
- data/lib/pagy/extras/support.rb +0 -40
- data/lib/pagy/extras/trim.rb +0 -29
- data/lib/pagy/extras/uikit.rb +0 -97
- data/lib/pagy/frontend.rb +0 -114
- data/lib/pagy/i18n.rb +0 -165
- data/lib/pagy/url_helpers.rb +0 -27
- data/lib/stylesheets/pagy.css +0 -61
- data/lib/stylesheets/pagy.scss +0 -50
- data/lib/stylesheets/pagy.tailwind.scss +0 -24
- /data/{lib/javascripts/pagy-module.d.ts → javascripts/pagy.d.ts} +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
export default (() => {
|
|
2
|
+
const storageSupport = "sessionStorage" in window && "BroadcastChannel" in window;
|
|
3
|
+
let pagy = "pagy", storage, sync, tabId;
|
|
4
|
+
if (storageSupport) {
|
|
5
|
+
storage = sessionStorage;
|
|
6
|
+
sync = new BroadcastChannel(pagy);
|
|
7
|
+
tabId = Date.now();
|
|
8
|
+
sync.addEventListener("message", (e) => {
|
|
9
|
+
if (e.data.from) {
|
|
10
|
+
const cutoffs = storage.getItem(e.data.key);
|
|
11
|
+
if (cutoffs) {
|
|
12
|
+
sync.postMessage({ to: e.data.from, key: e.data.key, str: cutoffs });
|
|
13
|
+
}
|
|
14
|
+
} else if (e.data.to) {
|
|
15
|
+
if (e.data.to == tabId) {
|
|
16
|
+
storage.setItem(e.data.key, e.data.str);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
const rjsObserver = new ResizeObserver((entries) => {
|
|
22
|
+
entries.forEach((e) => {
|
|
23
|
+
e.target.querySelectorAll(".pagy-rjs").forEach((el) => {
|
|
24
|
+
el.render();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
const B64SafeEncode = (unicode) => btoa(String.fromCharCode(...new TextEncoder().encode(unicode))).replace(/[+/=]/g, (m) => m == "+" ? "-" : m == "/" ? "_" : ""), B64Decode = (base64) => new TextDecoder().decode(Uint8Array.from(atob(base64), (c) => c.charCodeAt(0)));
|
|
29
|
+
const randKey = () => Math.floor(Math.random() * 36 ** 3).toString(36);
|
|
30
|
+
const augmentKeynav = async (nav, [storageKey, rootKey, pageKey, last, spliceArgs]) => {
|
|
31
|
+
let augmentPage;
|
|
32
|
+
const browserKey = document.cookie.split(/;\s+/).find((row) => row.startsWith(pagy + "="))?.split("=")[1] ?? randKey();
|
|
33
|
+
document.cookie = `${pagy}=${browserKey}`;
|
|
34
|
+
if (storageKey && !(storageKey in storage)) {
|
|
35
|
+
sync.postMessage({ from: tabId, key: storageKey });
|
|
36
|
+
await new Promise((resolve) => setTimeout(() => {
|
|
37
|
+
resolve("");
|
|
38
|
+
}, 100));
|
|
39
|
+
if (!(storageKey in storage)) {
|
|
40
|
+
augmentPage = (page) => `${page}+${String(last)}`;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!augmentPage) {
|
|
44
|
+
if (!storageKey) {
|
|
45
|
+
do {
|
|
46
|
+
storageKey = randKey();
|
|
47
|
+
} while (storageKey in storage);
|
|
48
|
+
}
|
|
49
|
+
const data = storage.getItem(storageKey), cutoffs = data ? JSON.parse(data) : [undefined];
|
|
50
|
+
if (spliceArgs) {
|
|
51
|
+
cutoffs.splice(...spliceArgs);
|
|
52
|
+
storage.setItem(storageKey, JSON.stringify(cutoffs));
|
|
53
|
+
}
|
|
54
|
+
augmentPage = (page) => {
|
|
55
|
+
const pageNum = parseInt(page);
|
|
56
|
+
return B64SafeEncode(JSON.stringify([
|
|
57
|
+
browserKey,
|
|
58
|
+
storageKey,
|
|
59
|
+
pageNum,
|
|
60
|
+
cutoffs.length,
|
|
61
|
+
cutoffs[pageNum - 1],
|
|
62
|
+
cutoffs[pageNum]
|
|
63
|
+
]));
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const search = rootKey ? `${rootKey}%5B${pageKey}%5D` : pageKey;
|
|
67
|
+
const re = new RegExp(`(?<=\\?.*)(\\b${search}=)(\\d+)`);
|
|
68
|
+
for (const a of nav.querySelectorAll("a[href]")) {
|
|
69
|
+
a.href = a.href.replace(re, (_match, prefix, digit) => `${String(prefix)}${augmentPage(digit)}`);
|
|
70
|
+
}
|
|
71
|
+
return augmentPage;
|
|
72
|
+
};
|
|
73
|
+
const buildNavJs = (nav, [
|
|
74
|
+
[before, anchor, current, gap, after],
|
|
75
|
+
pageToken,
|
|
76
|
+
[widths, series, labels],
|
|
77
|
+
keynavArgs
|
|
78
|
+
]) => {
|
|
79
|
+
const parent = nav.parentElement;
|
|
80
|
+
let lastWidth = -1;
|
|
81
|
+
(nav.render = () => {
|
|
82
|
+
const index = widths.findIndex((w) => w < parent.clientWidth);
|
|
83
|
+
if (widths[index] === lastWidth) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
let html = before;
|
|
87
|
+
series[index].forEach((item, i) => {
|
|
88
|
+
html += item == "gap" ? gap : (typeof item == "number" ? anchor.replace(pageToken, item) : current).replace("L<", labels?.[index][i] ?? `${String(item)}<`);
|
|
89
|
+
});
|
|
90
|
+
html += after;
|
|
91
|
+
nav.innerHTML = "";
|
|
92
|
+
nav.insertAdjacentHTML("afterbegin", html);
|
|
93
|
+
lastWidth = widths[index];
|
|
94
|
+
if (keynavArgs && storageSupport) {
|
|
95
|
+
augmentKeynav(nav, keynavArgs);
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
if (nav.classList.contains(pagy + "-rjs")) {
|
|
99
|
+
rjsObserver.observe(parent);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const initInputNavJs = async (nav, [url_token, pageToken, keynavArgs]) => {
|
|
103
|
+
const augment = keynavArgs && storageSupport ? await augmentKeynav(nav, keynavArgs) : (page) => page;
|
|
104
|
+
initInput(nav, (inputValue) => url_token.replace(pageToken, augment(inputValue)));
|
|
105
|
+
};
|
|
106
|
+
const initLimitTagJs = (span, [from, url_token, page_token, limitToken]) => {
|
|
107
|
+
initInput(span, (inputValue) => {
|
|
108
|
+
return url_token.replace(page_token, Math.max(Math.ceil(from / parseInt(inputValue)), 1)).replace(limitToken, inputValue);
|
|
109
|
+
});
|
|
110
|
+
};
|
|
111
|
+
const initInput = (element, getUrl) => {
|
|
112
|
+
const input = element.querySelector("input"), link = element.querySelector("a");
|
|
113
|
+
let initial = input.value;
|
|
114
|
+
const action = () => {
|
|
115
|
+
if (input.value === initial) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
|
|
119
|
+
if (val < min || val > max) {
|
|
120
|
+
input.value = initial;
|
|
121
|
+
input.select();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
initial = input.value;
|
|
125
|
+
link.href = getUrl(input.value);
|
|
126
|
+
link.click();
|
|
127
|
+
};
|
|
128
|
+
input.addEventListener("focus", () => {
|
|
129
|
+
input.select();
|
|
130
|
+
});
|
|
131
|
+
input.addEventListener("focusout", action);
|
|
132
|
+
input.addEventListener("keypress", (e) => {
|
|
133
|
+
if (e.key == "Enter") {
|
|
134
|
+
action();
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
return {
|
|
139
|
+
version: "43.5.1",
|
|
140
|
+
init(arg) {
|
|
141
|
+
const target = arg instanceof HTMLElement ? arg : document, elements = target.querySelectorAll("[data-pagy]");
|
|
142
|
+
for (const element of elements) {
|
|
143
|
+
try {
|
|
144
|
+
const [helperId, ...args] = JSON.parse(B64Decode(element.getAttribute("data-pagy")));
|
|
145
|
+
if (helperId == "k") {
|
|
146
|
+
augmentKeynav(element, ...args);
|
|
147
|
+
} else if (helperId == "snj") {
|
|
148
|
+
buildNavJs(element, args);
|
|
149
|
+
} else if (helperId == "inj") {
|
|
150
|
+
initInputNavJs(element, args);
|
|
151
|
+
} else if (helperId == "ltj") {
|
|
152
|
+
initLimitTagJs(element, args);
|
|
153
|
+
}
|
|
154
|
+
} catch (err) {
|
|
155
|
+
console.warn(`Pagy.init: %o
|
|
156
|
+
%s`, element, err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
})();
|