pagy 8.4.1 → 8.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/apps/calendar.ru +1 -1
- data/apps/demo.ru +10 -5
- data/apps/rails.ru +11 -7
- data/apps/repro.ru +13 -9
- data/bin/pagy +8 -5
- data/config/pagy.rb +1 -1
- data/javascripts/pagy-module.js +95 -107
- data/javascripts/pagy.js +4 -1
- data/javascripts/pagy.min.js +4 -0
- data/javascripts/pagy.min.js.map +10 -0
- data/javascripts/pagy.mjs +101 -0
- data/lib/pagy.rb +1 -1
- data/pkg/pagy-8.4.3.gem +0 -0
- metadata +9 -4
- data/javascripts/pagy-dev.js +0 -114
- /data/javascripts/{pagy-module.d.ts → pagy.d.ts} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac089590648eb671973328ca5e0b733974081bfcb77a6f62d12509e9974d61f0
|
4
|
+
data.tar.gz: edc05f99258a3a673532ab2f3fcca6108403574f101c3f3764369e79254ccf2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2d7cfeb79468d57d830ccbc9d304c2df29d087990d28a58f7722a5f4712ea611a87799b95963d01936508102f1201b24e2d3549b1d8d10b471d69a300165f36
|
7
|
+
data.tar.gz: c1c862168613092702d8f93d76a01d835b772cf5de8a3b642f3f332a1b39456128ef20354e4fa09812d34e290c8706dfbbce74718ae41770033a87281a28c90c
|
data/apps/calendar.ru
CHANGED
data/apps/demo.ru
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
# DOC
|
19
19
|
# https://ddnexus.github.io/pagy/playground/#3-demo-app
|
20
20
|
|
21
|
-
VERSION = '8.4.
|
21
|
+
VERSION = '8.4.3'
|
22
22
|
|
23
23
|
require 'bundler/inline'
|
24
24
|
require 'bundler'
|
@@ -69,7 +69,12 @@ class PagyDemo < Sinatra::Base
|
|
69
69
|
end
|
70
70
|
|
71
71
|
get('/javascripts/:file') do
|
72
|
-
|
72
|
+
format = params[:file].split('.').last
|
73
|
+
if format == 'js'
|
74
|
+
content_type 'application/javascript'
|
75
|
+
elsif format == 'map'
|
76
|
+
content_type 'application/json'
|
77
|
+
end
|
73
78
|
send_file Pagy.root.join('javascripts', params[:file])
|
74
79
|
end
|
75
80
|
|
@@ -233,7 +238,7 @@ __END__
|
|
233
238
|
<html lang="en">
|
234
239
|
<head>
|
235
240
|
<title>Pagy Demo App</title>
|
236
|
-
<script src="
|
241
|
+
<script src="/javascripts/pagy.min.js"></script>
|
237
242
|
<script>
|
238
243
|
window.addEventListener("load", Pagy.init);
|
239
244
|
</script>
|
@@ -242,7 +247,7 @@ __END__
|
|
242
247
|
<style type="text/css">
|
243
248
|
@media screen { html, body {
|
244
249
|
font-size: 1rem;
|
245
|
-
line-
|
250
|
+
line-height: 1.2s;
|
246
251
|
padding: 0;
|
247
252
|
margin: 0;
|
248
253
|
} }
|
@@ -293,7 +298,7 @@ __END__
|
|
293
298
|
margin-top: .3rem;
|
294
299
|
margin-bottom: 1rem;
|
295
300
|
font-size: .8rem !important;
|
296
|
-
line-
|
301
|
+
line-height: 1rem !important;
|
297
302
|
color: white;
|
298
303
|
background-color: rgb(30 30 30);
|
299
304
|
padding: 1rem;
|
data/apps/rails.ru
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# DOC
|
16
16
|
# https://ddnexus.github.io/pagy/playground/#2-rails-app
|
17
17
|
|
18
|
-
VERSION = '8.4.
|
18
|
+
VERSION = '8.4.3'
|
19
19
|
|
20
20
|
# Gemfile
|
21
21
|
require 'bundler/inline'
|
@@ -46,7 +46,7 @@ class PagyRails < Rails::Application # :nodoc:
|
|
46
46
|
|
47
47
|
routes.draw do
|
48
48
|
root to: 'comments#index'
|
49
|
-
get '/
|
49
|
+
get '/javascripts/:file', to: 'pagy#javascripts', file: /.*/
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -116,9 +116,13 @@ end
|
|
116
116
|
|
117
117
|
# You don't need this in real rails apps (see https://ddnexus.github.io/pagy/docs/api/javascript/setup/#2-configure)
|
118
118
|
class PagyController < ActionController::Base
|
119
|
-
def
|
120
|
-
|
121
|
-
|
119
|
+
def javascripts
|
120
|
+
format = params[:file].split('.').last
|
121
|
+
if format == 'js'
|
122
|
+
render js: Pagy.root.join('javascripts', params[:file]).read
|
123
|
+
elsif format == 'map'
|
124
|
+
render json: Pagy.root.join('javascripts', params[:file]).read
|
125
|
+
end
|
122
126
|
end
|
123
127
|
end
|
124
128
|
|
@@ -130,7 +134,7 @@ TEMPLATE = <<~ERB
|
|
130
134
|
<html>
|
131
135
|
<head>
|
132
136
|
<title>Pagy Rails App</title>
|
133
|
-
<script src="/
|
137
|
+
<script src="/javascripts/pagy.min.js"></script>
|
134
138
|
<script>
|
135
139
|
window.addEventListener("load", Pagy.init);
|
136
140
|
</script>
|
@@ -138,7 +142,7 @@ TEMPLATE = <<~ERB
|
|
138
142
|
<style type="text/css">
|
139
143
|
@media screen { html, body {
|
140
144
|
font-size: 1rem;
|
141
|
-
line-
|
145
|
+
line-height: 1.2s;
|
142
146
|
padding: 0;
|
143
147
|
margin: 0;
|
144
148
|
} }
|
data/apps/repro.ru
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
# DOC
|
16
16
|
# https://ddnexus.github.io/pagy/playground/#1-repro-app
|
17
17
|
|
18
|
-
VERSION = '8.4.
|
18
|
+
VERSION = '8.4.3'
|
19
19
|
|
20
20
|
require 'bundler/inline'
|
21
21
|
require 'bundler'
|
@@ -40,17 +40,21 @@ Pagy::DEFAULT.freeze
|
|
40
40
|
require 'sinatra/base'
|
41
41
|
# Sinatra application
|
42
42
|
class PagyRepro < Sinatra::Base
|
43
|
-
PAGY_JS = "pagy#{'-dev' if ENV['DEBUG']}.js".freeze
|
44
|
-
|
45
43
|
configure do
|
46
44
|
enable :inline_templates
|
47
45
|
end
|
48
46
|
include Pagy::Backend
|
49
|
-
|
50
|
-
get(
|
51
|
-
|
52
|
-
|
47
|
+
|
48
|
+
get('/javascripts/:file') do
|
49
|
+
format = params[:file].split('.').last
|
50
|
+
if format == 'js'
|
51
|
+
content_type 'application/javascript'
|
52
|
+
elsif format == 'map'
|
53
|
+
content_type 'application/json'
|
54
|
+
end
|
55
|
+
send_file Pagy.root.join('javascripts', params[:file])
|
53
56
|
end
|
57
|
+
|
54
58
|
# Edit this action as needed
|
55
59
|
get '/' do
|
56
60
|
collection = MockCollection.new
|
@@ -96,7 +100,7 @@ __END__
|
|
96
100
|
<html>
|
97
101
|
<head>
|
98
102
|
<title>Pagy Repro App</title>
|
99
|
-
<script src="
|
103
|
+
<script src="javascripts/pagy.min.js"></script>
|
100
104
|
<script>
|
101
105
|
window.addEventListener("load", Pagy.init);
|
102
106
|
</script>
|
@@ -104,7 +108,7 @@ __END__
|
|
104
108
|
<style type="text/css">
|
105
109
|
@media screen { html, body {
|
106
110
|
font-size: 1rem;
|
107
|
-
line-
|
111
|
+
line-height: 1.2s;
|
108
112
|
padding: 0;
|
109
113
|
margin: 0;
|
110
114
|
} }
|
data/bin/pagy
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
VERSION = '8.4.
|
4
|
+
VERSION = '8.4.3'
|
5
5
|
APPS = %w[repro rails demo calendar].freeze
|
6
|
+
LINUX = RbConfig::CONFIG['host_os'].include?('linux')
|
6
7
|
|
7
8
|
require_relative '../lib/optimist'
|
8
9
|
opts = Optimist.options do
|
@@ -28,9 +29,11 @@ opts = Optimist.options do
|
|
28
29
|
opt :host, 'Host', default: '0.0.0.0', short: :o
|
29
30
|
opt :port, 'Port', default: 8000
|
30
31
|
opt :install, 'Install bundle for users', default: true
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
if LINUX
|
33
|
+
text 'Rerun options'
|
34
|
+
opt :rerun, 'Enable rerun for development', default: true
|
35
|
+
opt :clear, 'Clear screen before each rerun'
|
36
|
+
end
|
34
37
|
text 'Other options'
|
35
38
|
opt :quiet, 'Quiet mode for development'
|
36
39
|
version VERSION
|
@@ -48,7 +51,7 @@ Bundler.configure
|
|
48
51
|
gemfile(opts[:install]) do
|
49
52
|
source 'https://rubygems.org'
|
50
53
|
gem 'rackup'
|
51
|
-
gem 'rerun'
|
54
|
+
gem 'rerun' if LINUX
|
52
55
|
end
|
53
56
|
|
54
57
|
path = ->(app) { File.expand_path("../apps/#{app}.ru", __dir__) }
|
data/config/pagy.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Pagy initializer file (8.4.
|
3
|
+
# Pagy initializer file (8.4.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
|
|
data/javascripts/pagy-module.js
CHANGED
@@ -1,113 +1,101 @@
|
|
1
1
|
const Pagy = (() => {
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
const
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
filled = tokens.gap;
|
27
|
-
}
|
28
|
-
else { // active page
|
29
|
-
filled = fillIn(tokens.current, item, label);
|
30
|
-
}
|
31
|
-
html += (typeof trimParam === "string" && item == 1) ? trim(filled, trimParam) : filled;
|
32
|
-
}
|
33
|
-
html += tokens.after; // eslint-disable-line align-assignments/align-assignments
|
34
|
-
el.innerHTML = "";
|
35
|
-
el.insertAdjacentHTML("afterbegin", html);
|
36
|
-
lastWidth = width;
|
37
|
-
})();
|
38
|
-
if (el.classList.contains("pagy-rjs")) {
|
39
|
-
rjsObserver.observe(container);
|
2
|
+
const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.pagyRender())));
|
3
|
+
const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
|
4
|
+
const container = el.parentElement ?? el;
|
5
|
+
const widths = Object.keys(sequels).map((w) => parseInt(w)).sort((a, b) => b - a);
|
6
|
+
let lastWidth = -1;
|
7
|
+
const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
|
8
|
+
(el.pagyRender = function() {
|
9
|
+
const width = widths.find((w) => w < container.clientWidth) || 0;
|
10
|
+
if (width === lastWidth) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
let html = tokens.before;
|
14
|
+
const series = sequels[width.toString()];
|
15
|
+
const labels = labelSequels?.[width.toString()] ?? series.map((l) => l.toString());
|
16
|
+
for (const i in series) {
|
17
|
+
const item = series[i];
|
18
|
+
const label = labels[i];
|
19
|
+
let filled;
|
20
|
+
if (typeof item === "number") {
|
21
|
+
filled = fillIn(tokens.a, item.toString(), label);
|
22
|
+
} else if (item === "gap") {
|
23
|
+
filled = tokens.gap;
|
24
|
+
} else {
|
25
|
+
filled = fillIn(tokens.current, item, label);
|
40
26
|
}
|
27
|
+
html += typeof trimParam === "string" && item == 1 ? trim(filled, trimParam) : filled;
|
28
|
+
}
|
29
|
+
html += tokens.after;
|
30
|
+
el.innerHTML = "";
|
31
|
+
el.insertAdjacentHTML("afterbegin", html);
|
32
|
+
lastWidth = width;
|
33
|
+
})();
|
34
|
+
if (el.classList.contains("pagy-rjs")) {
|
35
|
+
rjsObserver.observe(container);
|
36
|
+
}
|
37
|
+
};
|
38
|
+
const initCombo = (el, [url_token, trimParam]) => initInput(el, (inputValue) => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
|
39
|
+
const initSelector = (el, [from, url_token, trimParam]) => {
|
40
|
+
initInput(el, (inputValue) => {
|
41
|
+
const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
|
42
|
+
const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
|
43
|
+
return [page, url];
|
44
|
+
}, trimParam);
|
45
|
+
};
|
46
|
+
const initInput = (el, getVars, trimParam) => {
|
47
|
+
const input = el.querySelector("input");
|
48
|
+
const link = el.querySelector("a");
|
49
|
+
const initial = input.value;
|
50
|
+
const action = function() {
|
51
|
+
if (input.value === initial) {
|
52
|
+
return;
|
53
|
+
}
|
54
|
+
const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
|
55
|
+
if (val < min || val > max) {
|
56
|
+
input.value = initial;
|
57
|
+
input.select();
|
58
|
+
return;
|
59
|
+
}
|
60
|
+
let [page, url] = getVars(input.value);
|
61
|
+
if (typeof trimParam === "string" && page === "1") {
|
62
|
+
url = trim(url, trimParam);
|
63
|
+
}
|
64
|
+
link.href = url;
|
65
|
+
link.click();
|
41
66
|
};
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
link.href = url;
|
72
|
-
link.click();
|
73
|
-
};
|
74
|
-
["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
|
75
|
-
input.addEventListener("focusout", action); // trigger action
|
76
|
-
input.addEventListener("keypress", e => { if (e.key === "Enter") {
|
77
|
-
action();
|
78
|
-
} }); // trigger action
|
79
|
-
};
|
80
|
-
// Trim the ${page-param}=1 params in links
|
81
|
-
const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
82
|
-
// Public interface
|
83
|
-
return {
|
84
|
-
version: "8.4.1",
|
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
|
-
}
|
67
|
+
["change", "focus"].forEach((e) => input.addEventListener(e, input.select));
|
68
|
+
input.addEventListener("focusout", action);
|
69
|
+
input.addEventListener("keypress", (e) => {
|
70
|
+
if (e.key === "Enter") {
|
71
|
+
action();
|
72
|
+
}
|
73
|
+
});
|
74
|
+
};
|
75
|
+
const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
76
|
+
return {
|
77
|
+
version: "8.4.3",
|
78
|
+
init(arg) {
|
79
|
+
const target = arg instanceof Element ? arg : document;
|
80
|
+
const elements = target.querySelectorAll("[data-pagy]");
|
81
|
+
for (const el of elements) {
|
82
|
+
try {
|
83
|
+
const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), (c) => c.charCodeAt(0));
|
84
|
+
const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array));
|
85
|
+
if (keyword === "nav") {
|
86
|
+
initNav(el, args);
|
87
|
+
} else if (keyword === "combo") {
|
88
|
+
initCombo(el, args);
|
89
|
+
} else if (keyword === "selector") {
|
90
|
+
initSelector(el, args);
|
91
|
+
} else {
|
92
|
+
console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
|
93
|
+
}
|
94
|
+
} catch (err) {
|
95
|
+
console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
|
110
96
|
}
|
111
|
-
|
97
|
+
}
|
98
|
+
}
|
99
|
+
};
|
112
100
|
})();
|
113
101
|
export default Pagy;
|
data/javascripts/pagy.js
CHANGED
@@ -1 +1,4 @@
|
|
1
|
-
|
1
|
+
window.Pagy=(()=>{const j=new ResizeObserver((z)=>z.forEach((B)=>B.target.querySelectorAll(".pagy-rjs").forEach((D)=>D.pagyRender()))),A=(z,[B,D,x,F])=>{const E=z.parentElement??z,H=Object.keys(D).map((G)=>parseInt(G)).sort((G,L)=>L-G);let K=-1;const R=(G,L,M)=>G.replace(/__pagy_page__/g,L).replace(/__pagy_label__/g,M);if((z.pagyRender=function(){const G=H.find((Q)=>Q<E.clientWidth)||0;if(G===K)return;let L=B.before;const M=D[G.toString()],X=x?.[G.toString()]??M.map((Q)=>Q.toString());for(let Q in M){const T=M[Q],$=X[Q];let U;if(typeof T==="number")U=R(B.a,T.toString(),$);else if(T==="gap")U=B.gap;else U=R(B.current,T,$);L+=typeof F==="string"&&T==1?Z(U,F):U}L+=B.after,z.innerHTML="",z.insertAdjacentHTML("afterbegin",L),K=G})(),z.classList.contains("pagy-rjs"))j.observe(E)},C=(z,[B,D])=>Y(z,(x)=>[x,B.replace(/__pagy_page__/,x)],D),J=(z,[B,D,x])=>{Y(z,(F)=>{const E=Math.max(Math.ceil(B/parseInt(F)),1).toString(),H=D.replace(/__pagy_page__/,E).replace(/__pagy_items__/,F);return[E,H]},x)},Y=(z,B,D)=>{const x=z.querySelector("input"),F=z.querySelector("a"),E=x.value,H=function(){if(x.value===E)return;const[K,R,G]=[x.min,x.value,x.max].map((X)=>parseInt(X)||0);if(R<K||R>G){x.value=E,x.select();return}let[L,M]=B(x.value);if(typeof D==="string"&&L==="1")M=Z(M,D);F.href=M,F.click()};["change","focus"].forEach((K)=>x.addEventListener(K,x.select)),x.addEventListener("focusout",H),x.addEventListener("keypress",(K)=>{if(K.key==="Enter")H()})},Z=(z,B)=>z.replace(new RegExp(`[?&]${B}=1\\b(?!&)|\\b${B}=1&`),"");return{version:"8.4.3",init(z){const D=(z instanceof Element?z:document).querySelectorAll("[data-pagy]");for(let x of D)try{const F=Uint8Array.from(atob(x.getAttribute("data-pagy")),(K)=>K.charCodeAt(0)),[E,...H]=JSON.parse((new TextDecoder()).decode(F));if(E==="nav")A(x,H);else if(E==="combo")C(x,H);else if(E==="selector")J(x,H);else console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",x,E)}catch(F){console.warn("Skipped Pagy.init() for: %o\n%s",x,F)}}}})();
|
2
|
+
|
3
|
+
//# debugId=C131CFD0ECFFDA8364756e2164756e21
|
4
|
+
//# sourceMappingURL=pagy.min.js.map
|
@@ -0,0 +1,4 @@
|
|
1
|
+
window.Pagy=(()=>{const j=new ResizeObserver((z)=>z.forEach((B)=>B.target.querySelectorAll(".pagy-rjs").forEach((D)=>D.pagyRender()))),A=(z,[B,D,x,F])=>{const E=z.parentElement??z,H=Object.keys(D).map((G)=>parseInt(G)).sort((G,L)=>L-G);let K=-1;const R=(G,L,M)=>G.replace(/__pagy_page__/g,L).replace(/__pagy_label__/g,M);if((z.pagyRender=function(){const G=H.find((Q)=>Q<E.clientWidth)||0;if(G===K)return;let L=B.before;const M=D[G.toString()],X=x?.[G.toString()]??M.map((Q)=>Q.toString());for(let Q in M){const T=M[Q],$=X[Q];let U;if(typeof T==="number")U=R(B.a,T.toString(),$);else if(T==="gap")U=B.gap;else U=R(B.current,T,$);L+=typeof F==="string"&&T==1?Z(U,F):U}L+=B.after,z.innerHTML="",z.insertAdjacentHTML("afterbegin",L),K=G})(),z.classList.contains("pagy-rjs"))j.observe(E)},C=(z,[B,D])=>Y(z,(x)=>[x,B.replace(/__pagy_page__/,x)],D),J=(z,[B,D,x])=>{Y(z,(F)=>{const E=Math.max(Math.ceil(B/parseInt(F)),1).toString(),H=D.replace(/__pagy_page__/,E).replace(/__pagy_items__/,F);return[E,H]},x)},Y=(z,B,D)=>{const x=z.querySelector("input"),F=z.querySelector("a"),E=x.value,H=function(){if(x.value===E)return;const[K,R,G]=[x.min,x.value,x.max].map((X)=>parseInt(X)||0);if(R<K||R>G){x.value=E,x.select();return}let[L,M]=B(x.value);if(typeof D==="string"&&L==="1")M=Z(M,D);F.href=M,F.click()};["change","focus"].forEach((K)=>x.addEventListener(K,x.select)),x.addEventListener("focusout",H),x.addEventListener("keypress",(K)=>{if(K.key==="Enter")H()})},Z=(z,B)=>z.replace(new RegExp(`[?&]${B}=1\\b(?!&)|\\b${B}=1&`),"");return{version:"8.4.3",init(z){const D=(z instanceof Element?z:document).querySelectorAll("[data-pagy]");for(let x of D)try{const F=Uint8Array.from(atob(x.getAttribute("data-pagy")),(K)=>K.charCodeAt(0)),[E,...H]=JSON.parse((new TextDecoder()).decode(F));if(E==="nav")A(x,H);else if(E==="combo")C(x,H);else if(E==="selector")J(x,H);else console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'",x,E)}catch(F){console.warn("Skipped Pagy.init() for: %o\n%s",x,F)}}}})();
|
2
|
+
|
3
|
+
//# debugId=C131CFD0ECFFDA8364756e2164756e21
|
4
|
+
//# sourceMappingURL=pagy.min.js.map
|
@@ -0,0 +1,10 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": ["../../src/pagy.ts"],
|
4
|
+
"sourcesContent": [
|
5
|
+
"type NavArgs = readonly [Tokens, Sequels, null | LabelSequels, string?]\ntype ComboArgs = readonly [string, string?]\ntype SelectorArgs = readonly [number, string, string?]\n\ninterface Tokens {\n readonly before:string\n readonly a:string\n readonly current:string\n readonly gap:string\n readonly after:string\n}\n\ninterface Sequels {readonly [width:string]:(string | number)[]}\n\ninterface LabelSequels {readonly [width:string]:string[]}\n\ninterface NavElement extends Element {pagyRender():void}\n\nconst Pagy = (() => {\n // The observer instance for responsive navs\n const rjsObserver = new ResizeObserver(\n entries => entries.forEach(e => e.target.querySelectorAll<NavElement>(\".pagy-rjs\")\n .forEach(el => el.pagyRender())));\n // Init the *_nav_js helpers\n const initNav = (el:NavElement, [tokens, sequels, labelSequels, trimParam]:NavArgs) => {\n const container = el.parentElement ?? el;\n const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);\n let lastWidth = -1;\n const fillIn = (a:string, page:string, label:string):string =>\n a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);\n (el.pagyRender = function () {\n const width = widths.find(w => w < container.clientWidth) || 0;\n if (width === lastWidth) { return } // no change: abort\n let html = tokens.before; // already trimmed in html\n const series = sequels[width.toString()];\n const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());\n for (const i in series) {\n const item = series[i];\n const label = labels[i];\n let filled;\n if (typeof item === \"number\") {\n filled = fillIn(tokens.a, item.toString(), label);\n } else if (item === \"gap\") {\n filled = tokens.gap;\n } else { // active page\n filled = fillIn(tokens.current, item, label);\n }\n html += (typeof trimParam === \"string\" && item == 1) ? trim(filled, trimParam) : filled;\n }\n html += tokens.after; // eslint-disable-line align-assignments/align-assignments\n el.innerHTML = \"\";\n el.insertAdjacentHTML(\"afterbegin\", html);\n lastWidth = width;\n })();\n if (el.classList.contains(\"pagy-rjs\")) { rjsObserver.observe(container) }\n };\n\n // Init the *_combo_nav_js helpers\n const initCombo = (el:Element, [url_token, trimParam]:ComboArgs) =>\n initInput(el, inputValue => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);\n\n // Init the items_selector_js helper\n const initSelector = (el:Element, [from, url_token, trimParam]:SelectorArgs) => {\n initInput(el, inputValue => {\n const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();\n const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);\n return [page, url];\n }, trimParam);\n };\n\n // Init the input element\n const initInput = (el:Element, getVars:(v:string) => [string, string], trimParam?:string) => {\n const input = el.querySelector(\"input\") as HTMLInputElement;\n const link = el.querySelector(\"a\") as HTMLAnchorElement;\n const initial = input.value;\n const action = function () {\n if (input.value === initial) { return } // not changed\n const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);\n if (val < min || val > max) { // reset invalid/out-of-range\n input.value = initial;\n input.select();\n return;\n }\n let [page, url] = getVars(input.value); // eslint-disable-line prefer-const\n if (typeof trimParam === \"string\" && page === \"1\") { url = trim(url, trimParam) }\n link.href = url;\n link.click();\n };\n [\"change\", \"focus\"].forEach(e => input.addEventListener(e, input.select)); // auto-select\n input.addEventListener(\"focusout\", action); // trigger action\n input.addEventListener(\"keypress\", e => { if (e.key === \"Enter\") { action() } }); // trigger action\n };\n\n // Trim the ${page-param}=1 params in links\n const trim = (a:string, param:string) =>\n a.replace(new RegExp(`[?&]${param}=1\\\\b(?!&)|\\\\b${param}=1&`), \"\");\n\n // Public interface\n return {\n version: \"8.4.3\",\n\n // Scan for elements with a \"data-pagy\" attribute and call their init functions with the decoded args\n init(arg?:Element | never) {\n const target = arg instanceof Element ? arg : document;\n const elements = target.querySelectorAll(\"[data-pagy]\");\n for (const el of elements) {\n try {\n const uint8array = Uint8Array.from(atob(el.getAttribute(\"data-pagy\") as string), c => c.charCodeAt(0));\n const [keyword, ...args] = JSON.parse((new TextDecoder()).decode(uint8array)); // base64-utf8 -> JSON -> Array\n if (keyword === \"nav\") {\n initNav(el as NavElement, args as NavArgs);\n } else if (keyword === \"combo\") {\n initCombo(el, args as ComboArgs);\n } else if (keyword === \"selector\") {\n initSelector(el, args as SelectorArgs);\n } else {\n console.warn(\"Skipped Pagy.init() for: %o\\nUnknown keyword '%s'\", el, keyword);\n }\n } catch (err) { console.warn(\"Skipped Pagy.init() for: %o\\n%s\", el, err) }\n }\n }\n };\n})();\n\nexport default Pagy;\n"
|
6
|
+
],
|
7
|
+
"mappings": "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",
|
8
|
+
"debugId": "C131CFD0ECFFDA8364756e2164756e21",
|
9
|
+
"names": []
|
10
|
+
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
const Pagy = (() => {
|
2
|
+
const rjsObserver = new ResizeObserver((entries) => entries.forEach((e) => e.target.querySelectorAll(".pagy-rjs").forEach((el) => el.pagyRender())));
|
3
|
+
const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
|
4
|
+
const container = el.parentElement ?? el;
|
5
|
+
const widths = Object.keys(sequels).map((w) => parseInt(w)).sort((a, b) => b - a);
|
6
|
+
let lastWidth = -1;
|
7
|
+
const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
|
8
|
+
(el.pagyRender = function() {
|
9
|
+
const width = widths.find((w) => w < container.clientWidth) || 0;
|
10
|
+
if (width === lastWidth) {
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
let html = tokens.before;
|
14
|
+
const series = sequels[width.toString()];
|
15
|
+
const labels = labelSequels?.[width.toString()] ?? series.map((l) => l.toString());
|
16
|
+
for (const i in series) {
|
17
|
+
const item = series[i];
|
18
|
+
const label = labels[i];
|
19
|
+
let filled;
|
20
|
+
if (typeof item === "number") {
|
21
|
+
filled = fillIn(tokens.a, item.toString(), label);
|
22
|
+
} else if (item === "gap") {
|
23
|
+
filled = tokens.gap;
|
24
|
+
} else {
|
25
|
+
filled = fillIn(tokens.current, item, label);
|
26
|
+
}
|
27
|
+
html += typeof trimParam === "string" && item == 1 ? trim(filled, trimParam) : filled;
|
28
|
+
}
|
29
|
+
html += tokens.after;
|
30
|
+
el.innerHTML = "";
|
31
|
+
el.insertAdjacentHTML("afterbegin", html);
|
32
|
+
lastWidth = width;
|
33
|
+
})();
|
34
|
+
if (el.classList.contains("pagy-rjs")) {
|
35
|
+
rjsObserver.observe(container);
|
36
|
+
}
|
37
|
+
};
|
38
|
+
const initCombo = (el, [url_token, trimParam]) => initInput(el, (inputValue) => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
|
39
|
+
const initSelector = (el, [from, url_token, trimParam]) => {
|
40
|
+
initInput(el, (inputValue) => {
|
41
|
+
const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
|
42
|
+
const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
|
43
|
+
return [page, url];
|
44
|
+
}, trimParam);
|
45
|
+
};
|
46
|
+
const initInput = (el, getVars, trimParam) => {
|
47
|
+
const input = el.querySelector("input");
|
48
|
+
const link = el.querySelector("a");
|
49
|
+
const initial = input.value;
|
50
|
+
const action = function() {
|
51
|
+
if (input.value === initial) {
|
52
|
+
return;
|
53
|
+
}
|
54
|
+
const [min, val, max] = [input.min, input.value, input.max].map((n) => parseInt(n) || 0);
|
55
|
+
if (val < min || val > max) {
|
56
|
+
input.value = initial;
|
57
|
+
input.select();
|
58
|
+
return;
|
59
|
+
}
|
60
|
+
let [page, url] = getVars(input.value);
|
61
|
+
if (typeof trimParam === "string" && page === "1") {
|
62
|
+
url = trim(url, trimParam);
|
63
|
+
}
|
64
|
+
link.href = url;
|
65
|
+
link.click();
|
66
|
+
};
|
67
|
+
["change", "focus"].forEach((e) => input.addEventListener(e, input.select));
|
68
|
+
input.addEventListener("focusout", action);
|
69
|
+
input.addEventListener("keypress", (e) => {
|
70
|
+
if (e.key === "Enter") {
|
71
|
+
action();
|
72
|
+
}
|
73
|
+
});
|
74
|
+
};
|
75
|
+
const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
76
|
+
return {
|
77
|
+
version: "8.4.3",
|
78
|
+
init(arg) {
|
79
|
+
const target = arg instanceof Element ? arg : document;
|
80
|
+
const elements = target.querySelectorAll("[data-pagy]");
|
81
|
+
for (const el of elements) {
|
82
|
+
try {
|
83
|
+
const uint8array = Uint8Array.from(atob(el.getAttribute("data-pagy")), (c) => c.charCodeAt(0));
|
84
|
+
const [keyword, ...args] = JSON.parse(new TextDecoder().decode(uint8array));
|
85
|
+
if (keyword === "nav") {
|
86
|
+
initNav(el, args);
|
87
|
+
} else if (keyword === "combo") {
|
88
|
+
initCombo(el, args);
|
89
|
+
} else if (keyword === "selector") {
|
90
|
+
initSelector(el, args);
|
91
|
+
} else {
|
92
|
+
console.warn("Skipped Pagy.init() for: %o\nUnknown keyword '%s'", el, keyword);
|
93
|
+
}
|
94
|
+
} catch (err) {
|
95
|
+
console.warn("Skipped Pagy.init() for: %o\n%s", el, err);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
};
|
100
|
+
})();
|
101
|
+
export default Pagy;
|
data/lib/pagy.rb
CHANGED
data/pkg/pagy-8.4.3.gem
ADDED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pagy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.4.
|
4
|
+
version: 8.4.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: 2024-06-
|
11
|
+
date: 2024-06-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Agnostic pagination in plain ruby. It does it all. Better.
|
14
14
|
email:
|
@@ -25,10 +25,12 @@ files:
|
|
25
25
|
- apps/repro.ru
|
26
26
|
- bin/pagy
|
27
27
|
- config/pagy.rb
|
28
|
-
- javascripts/pagy-dev.js
|
29
|
-
- javascripts/pagy-module.d.ts
|
30
28
|
- javascripts/pagy-module.js
|
29
|
+
- javascripts/pagy.d.ts
|
31
30
|
- javascripts/pagy.js
|
31
|
+
- javascripts/pagy.min.js
|
32
|
+
- javascripts/pagy.min.js.map
|
33
|
+
- javascripts/pagy.mjs
|
32
34
|
- lib/optimist.rb
|
33
35
|
- lib/pagy.rb
|
34
36
|
- lib/pagy/backend.rb
|
@@ -105,6 +107,7 @@ files:
|
|
105
107
|
- locales/zh-CN.yml
|
106
108
|
- locales/zh-HK.yml
|
107
109
|
- locales/zh-TW.yml
|
110
|
+
- pkg/pagy-8.4.3.gem
|
108
111
|
- stylesheets/pagy.css
|
109
112
|
- stylesheets/pagy.scss
|
110
113
|
- stylesheets/pagy.tailwind.css
|
@@ -123,6 +126,8 @@ post_install_message: |
|
|
123
126
|
The foundation, materialize, semantic and uikit CSS extras
|
124
127
|
have been discontinued and will be removed in v9
|
125
128
|
https://github.com/ddnexus/pagy/discussions/672
|
129
|
+
The javascript files have been deprecated/renamed
|
130
|
+
https://ddnexus.github.io/pagy/changelog/#deprecations
|
126
131
|
*************************************************************
|
127
132
|
rdoc_options: []
|
128
133
|
require_paths:
|
data/javascripts/pagy-dev.js
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
"use strict";
|
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())));
|
5
|
-
// Init the *_nav_js helpers
|
6
|
-
const initNav = (el, [tokens, sequels, labelSequels, trimParam]) => {
|
7
|
-
const container = el.parentElement ?? el;
|
8
|
-
const widths = Object.keys(sequels).map(w => parseInt(w)).sort((a, b) => b - a);
|
9
|
-
let lastWidth = -1;
|
10
|
-
const fillIn = (a, page, label) => a.replace(/__pagy_page__/g, page).replace(/__pagy_label__/g, label);
|
11
|
-
(el.pagyRender = function () {
|
12
|
-
const width = widths.find(w => w < container.clientWidth) || 0;
|
13
|
-
if (width === lastWidth) {
|
14
|
-
return;
|
15
|
-
} // no change: abort
|
16
|
-
let html = tokens.before; // already trimmed in html
|
17
|
-
const series = sequels[width.toString()];
|
18
|
-
const labels = labelSequels?.[width.toString()] ?? series.map(l => l.toString());
|
19
|
-
for (const i in series) {
|
20
|
-
const item = series[i];
|
21
|
-
const label = labels[i];
|
22
|
-
let filled;
|
23
|
-
if (typeof item === "number") {
|
24
|
-
filled = fillIn(tokens.a, item.toString(), label);
|
25
|
-
}
|
26
|
-
else if (item === "gap") {
|
27
|
-
filled = tokens.gap;
|
28
|
-
}
|
29
|
-
else { // active page
|
30
|
-
filled = fillIn(tokens.current, item, label);
|
31
|
-
}
|
32
|
-
html += (typeof trimParam === "string" && item == 1) ? trim(filled, trimParam) : filled;
|
33
|
-
}
|
34
|
-
html += tokens.after; // eslint-disable-line align-assignments/align-assignments
|
35
|
-
el.innerHTML = "";
|
36
|
-
el.insertAdjacentHTML("afterbegin", html);
|
37
|
-
lastWidth = width;
|
38
|
-
})();
|
39
|
-
if (el.classList.contains("pagy-rjs")) {
|
40
|
-
rjsObserver.observe(container);
|
41
|
-
}
|
42
|
-
};
|
43
|
-
// Init the *_combo_nav_js helpers
|
44
|
-
const initCombo = (el, [url_token, trimParam]) => initInput(el, inputValue => [inputValue, url_token.replace(/__pagy_page__/, inputValue)], trimParam);
|
45
|
-
// Init the items_selector_js helper
|
46
|
-
const initSelector = (el, [from, url_token, trimParam]) => {
|
47
|
-
initInput(el, inputValue => {
|
48
|
-
const page = Math.max(Math.ceil(from / parseInt(inputValue)), 1).toString();
|
49
|
-
const url = url_token.replace(/__pagy_page__/, page).replace(/__pagy_items__/, inputValue);
|
50
|
-
return [page, url];
|
51
|
-
}, trimParam);
|
52
|
-
};
|
53
|
-
// Init the input element
|
54
|
-
const initInput = (el, getVars, trimParam) => {
|
55
|
-
const input = el.querySelector("input");
|
56
|
-
const link = el.querySelector("a");
|
57
|
-
const initial = input.value;
|
58
|
-
const action = function () {
|
59
|
-
if (input.value === initial) {
|
60
|
-
return;
|
61
|
-
} // not changed
|
62
|
-
const [min, val, max] = [input.min, input.value, input.max].map(n => parseInt(n) || 0);
|
63
|
-
if (val < min || val > max) { // reset invalid/out-of-range
|
64
|
-
input.value = initial;
|
65
|
-
input.select();
|
66
|
-
return;
|
67
|
-
}
|
68
|
-
let [page, url] = getVars(input.value); // eslint-disable-line prefer-const
|
69
|
-
if (typeof trimParam === "string" && page === "1") {
|
70
|
-
url = trim(url, trimParam);
|
71
|
-
}
|
72
|
-
link.href = url;
|
73
|
-
link.click();
|
74
|
-
};
|
75
|
-
["change", "focus"].forEach(e => input.addEventListener(e, input.select)); // auto-select
|
76
|
-
input.addEventListener("focusout", action); // trigger action
|
77
|
-
input.addEventListener("keypress", e => { if (e.key === "Enter") {
|
78
|
-
action();
|
79
|
-
} }); // trigger action
|
80
|
-
};
|
81
|
-
// Trim the ${page-param}=1 params in links
|
82
|
-
const trim = (a, param) => a.replace(new RegExp(`[?&]${param}=1\\b(?!&)|\\b${param}=1&`), "");
|
83
|
-
// Public interface
|
84
|
-
return {
|
85
|
-
version: "8.4.1",
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInBhZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQWtCQSxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRTtJQUNmLDRDQUE0QztJQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNOLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFhLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FDM0UsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsNEJBQTRCO0lBQzVCLE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFTLEVBQUUsRUFBRTtRQUNsRixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBTSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNuRixJQUFJLFNBQVMsR0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FBTSxDQUFDLENBQVEsRUFBRSxJQUFXLEVBQUUsS0FBWSxFQUFTLEVBQUUsQ0FDN0QsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxFQUFFLENB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TyxHQUFHLEVBQUUsQ0FBQztvQkFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFBQyxDQUFDO1lBQzlFLENBQUM7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIE5hdkFyZ3MgPSByZWFkb25seSBbVG9rZW5zLCBTZXF1ZWxzLCBudWxsIHwgTGFiZWxTZXF1ZWxzLCBzdHJpbmc/XVxudHlwZSBDb21ib0FyZ3MgPSByZWFkb25seSBbc3RyaW5nLCBzdHJpbmc/XVxudHlwZSBTZWxlY3RvckFyZ3MgPSByZWFkb25seSBbbnVtYmVyLCBzdHJpbmcsIHN0cmluZz9dXG5cbmludGVyZmFjZSBUb2tlbnMge1xuICAgIHJlYWRvbmx5IGJlZm9yZTpzdHJpbmdcbiAgICByZWFkb25seSBhOnN0cmluZ1xuICAgIHJlYWRvbmx5IGN1cnJlbnQ6c3RyaW5nXG4gICAgcmVhZG9ubHkgZ2FwOnN0cmluZ1xuICAgIHJlYWRvbmx5IGFmdGVyOnN0cmluZ1xufVxuXG5pbnRlcmZhY2UgU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106KHN0cmluZyB8IG51bWJlcilbXX1cblxuaW50ZXJmYWNlIExhYmVsU2VxdWVscyB7cmVhZG9ubHkgW3dpZHRoOnN0cmluZ106c3RyaW5nW119XG5cbmludGVyZmFjZSBOYXZFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7cGFneVJlbmRlcigpOnZvaWR9XG5cbmNvbnN0IFBhZ3kgPSAoKCkgPT4ge1xuICAgIC8vIFRoZSBvYnNlcnZlciBpbnN0YW5jZSBmb3IgcmVzcG9uc2l2ZSBuYXZzXG4gICAgY29uc3QgcmpzT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZW50cmllcyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmZvckVhY2goZSA9PiBlLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsPE5hdkVsZW1lbnQ+KFwiLnBhZ3ktcmpzXCIpLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCA9PiBlbC5wYWd5UmVuZGVyKCkpKSk7XG5cbiAgICAvLyBJbml0IHRoZSAqX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdE5hdiA9IChlbDpOYXZFbGVtZW50LCBbdG9rZW5zLCBzZXF1ZWxzLCBsYWJlbFNlcXVlbHMsIHRyaW1QYXJhbV06TmF2QXJncykgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBlbC5wYXJlbnRFbGVtZW50ID8/IGVsO1xuICAgICAgICBjb25zdCB3aWR0aHMgICAgPSBPYmplY3Qua2V5cyhzZXF1ZWxzKS5tYXAodyA9PiBwYXJzZUludCh3KSkuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuICAgICAgICBsZXQgbGFzdFdpZHRoICAgPSAtMTtcbiAgICAgICAgY29uc3QgZmlsbEluICAgID0gKGE6c3RyaW5nLCBwYWdlOnN0cmluZywgbGFiZWw6c3RyaW5nKTpzdHJpbmcgPT5cbiAgICAgICAgICAgIGEucmVwbGFjZSgvX19wYWd5X3BhZ2VfXy9nLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfbGFiZWxfXy9nLCBsYWJlbCk7XG4gICAgICAgIChlbC5wYWd5UmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB3aWR0aHMuZmluZCh3ID0+IHcgPCBjb250YWluZXIuY2xpZW50V2lkdGgpIHx8IDA7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IGxhc3RXaWR0aCkgeyByZXR1cm4gfSAvLyBubyBjaGFuZ2U6IGFib3J0XG4gICAgICAgICAgICBsZXQgaHRtbCAgICAgPSB0b2tlbnMuYmVmb3JlOyAgLy8gYWxyZWFkeSB0cmltbWVkIGluIGh0bWxcbiAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IHNlcXVlbHNbd2lkdGgudG9TdHJpbmcoKV07XG4gICAgICAgICAgICBjb25zdCBsYWJlbHMgPSBsYWJlbFNlcXVlbHM/Llt3aWR0aC50b1N0cmluZygpXSA/PyBzZXJpZXMubWFwKGwgPT4gbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBzZXJpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtICA9IHNlcmllc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IGxhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlsbGVkO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSBmaWxsSW4odG9rZW5zLmEsIGl0ZW0udG9TdHJpbmcoKSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PT0gXCJnYXBcIikge1xuICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSB0b2tlbnMuZ2FwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFjdGl2ZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgIGZpbGxlZCA9IGZpbGxJbih0b2tlbnMuY3VycmVudCwgaXRlbSwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBodG1sICs9ICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIGl0ZW0gPT0gMSkgPyB0cmltKGZpbGxlZCwgdHJpbVBhcmFtKSA6IGZpbGxlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGh0bWwgKz0gdG9rZW5zLmFmdGVyOyAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYWxpZ24tYXNzaWdubWVudHMvYWxpZ24tYXNzaWdubWVudHNcbiAgICAgICAgICAgIGVsLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBlbC5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsIGh0bWwpO1xuICAgICAgICAgICAgbGFzdFdpZHRoID0gd2lkdGg7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoXCJwYWd5LXJqc1wiKSkgeyByanNPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lcikgfVxuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSAqX2NvbWJvX25hdl9qcyBoZWxwZXJzXG4gICAgY29uc3QgaW5pdENvbWJvID0gKGVsOkVsZW1lbnQsIFt1cmxfdG9rZW4sIHRyaW1QYXJhbV06Q29tYm9BcmdzKSA9PlxuICAgICAgICBpbml0SW5wdXQoZWwsIGlucHV0VmFsdWUgPT4gW2lucHV0VmFsdWUsIHVybF90b2tlbi5yZXBsYWNlKC9fX3BhZ3lfcGFnZV9fLywgaW5wdXRWYWx1ZSldLCB0cmltUGFyYW0pO1xuXG4gICAgLy8gSW5pdCB0aGUgaXRlbXNfc2VsZWN0b3JfanMgaGVscGVyXG4gICAgY29uc3QgaW5pdFNlbGVjdG9yID0gKGVsOkVsZW1lbnQsIFtmcm9tLCB1cmxfdG9rZW4sIHRyaW1QYXJhbV06U2VsZWN0b3JBcmdzKSA9PiB7XG4gICAgICAgIGluaXRJbnB1dChlbCwgaW5wdXRWYWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoTWF0aC5jZWlsKGZyb20gLyBwYXJzZUludChpbnB1dFZhbHVlKSksIDEpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB1cmwgID0gdXJsX3Rva2VuLnJlcGxhY2UoL19fcGFneV9wYWdlX18vLCBwYWdlKS5yZXBsYWNlKC9fX3BhZ3lfaXRlbXNfXy8sIGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIFtwYWdlLCB1cmxdO1xuICAgICAgICB9LCB0cmltUGFyYW0pO1xuICAgIH07XG5cbiAgICAvLyBJbml0IHRoZSBpbnB1dCBlbGVtZW50XG4gICAgY29uc3QgaW5pdElucHV0ID0gKGVsOkVsZW1lbnQsIGdldFZhcnM6KHY6c3RyaW5nKSA9PiBbc3RyaW5nLCBzdHJpbmddLCB0cmltUGFyYW0/OnN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dCAgID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGxpbmsgICAgPSBlbC5xdWVyeVNlbGVjdG9yKFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgICAgY29uc3QgaW5pdGlhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBhY3Rpb24gID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LnZhbHVlID09PSBpbml0aWFsKSB7IHJldHVybiB9ICAvLyBub3QgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgW21pbiwgdmFsLCBtYXhdID0gW2lucHV0Lm1pbiwgaW5wdXQudmFsdWUsIGlucHV0Lm1heF0ubWFwKG4gPT4gcGFyc2VJbnQobikgfHwgMCk7XG4gICAgICAgICAgICBpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkgeyAgLy8gcmVzZXQgaW52YWxpZC9vdXQtb2YtcmFuZ2VcbiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaW5wdXQuc2VsZWN0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IFtwYWdlLCB1cmxdID0gZ2V0VmFycyhpbnB1dC52YWx1ZSk7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItY29uc3RcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpbVBhcmFtID09PSBcInN0cmluZ1wiICYmIHBhZ2UgPT09IFwiMVwiKSB7IHVybCA9IHRyaW0odXJsLCB0cmltUGFyYW0pIH1cbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IHVybDtcbiAgICAgICAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgICAgfTtcbiAgICAgICAgW1wiY2hhbmdlXCIsIFwiZm9jdXNcIl0uZm9yRWFjaChlID0+IGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoZSwgaW5wdXQuc2VsZWN0KSk7ICAgICAgICAvLyBhdXRvLXNlbGVjdFxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgYWN0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGFjdGlvblxuICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5cHJlc3NcIiwgZSA9PiB7IGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7IGFjdGlvbigpIH0gfSk7IC8vIHRyaWdnZXIgYWN0aW9uXG4gICAgfTtcblxuICAgIC8vIFRyaW0gdGhlICR7cGFnZS1wYXJhbX09MSBwYXJhbXMgaW4gbGlua3NcbiAgICBjb25zdCB0cmltID0gKGE6c3RyaW5nLCBwYXJhbTpzdHJpbmcpID0+XG4gICAgICAgIGEucmVwbGFjZShuZXcgUmVnRXhwKGBbPyZdJHtwYXJhbX09MVxcXFxiKD8hJil8XFxcXGIke3BhcmFtfT0xJmApLCBcIlwiKTtcblxuICAgIC8vIFB1YmxpYyBpbnRlcmZhY2VcbiAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uOiBcIjguNC4xXCIsXG5cbiAgICAgICAgLy8gU2NhbiBmb3IgZWxlbWVudHMgd2l0aCBhIFwiZGF0YS1wYWd5XCIgYXR0cmlidXRlIGFuZCBjYWxsIHRoZWlyIGluaXQgZnVuY3Rpb25zIHdpdGggdGhlIGRlY29kZWQgYXJnc1xuICAgICAgICBpbml0KGFyZz86RWxlbWVudCB8IG5ldmVyKSB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgICA9IGFyZyBpbnN0YW5jZW9mIEVsZW1lbnQgPyBhcmcgOiBkb2N1bWVudDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1wYWd5XVwiKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OGFycmF5ICAgICAgICAgPSBVaW50OEFycmF5LmZyb20oYXRvYihlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBhZ3lcIikgYXMgc3RyaW5nKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5d29yZCwgLi4uYXJnc10gPSBKU09OLnBhcnNlKChuZXcgVGV4dERlY29kZXIoKSkuZGVjb2RlKHVpbnQ4YXJyYXkpKTsgLy8gYmFzZTY0LXV0ZjggLT4gSlNPTiAtPiBBcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZCA9PT0gXCJuYXZcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE5hdihlbCBhcyBOYXZFbGVtZW50LCBhcmdzIGFzIE5hdkFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmQgPT09IFwiY29tYm9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbWJvKGVsLCBhcmdzIGFzIENvbWJvQXJncyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZCA9PT0gXCJzZWxlY3RvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VsZWN0b3IoZWwsIGFyZ3MgYXMgU2VsZWN0b3JBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlNraXBwZWQgUGFneS5pbml0KCkgZm9yOiAlb1xcblVua25vd24ga2V5d29yZCAnJXMnXCIsIGVsLCBrZXl3b3JkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgeyBjb25zb2xlLndhcm4oXCJTa2lwcGVkIFBhZ3kuaW5pdCgpIGZvcjogJW9cXG4lc1wiLCBlbCwgZXJyKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiJdfQ==
|
File without changes
|