pagy 4.3.0 → 4.4.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 +29 -24
- data/lib/javascripts/pagy.js +60 -56
- data/lib/pagy.rb +5 -3
- data/lib/pagy/backend.rb +1 -0
- data/lib/pagy/deprecation.rb +27 -0
- data/lib/pagy/extras/arel.rb +1 -0
- data/lib/pagy/extras/array.rb +1 -0
- data/lib/pagy/extras/bootstrap.rb +16 -11
- data/lib/pagy/extras/bulma.rb +16 -11
- data/lib/pagy/extras/countless.rb +2 -1
- data/lib/pagy/extras/elasticsearch_rails.rb +1 -0
- data/lib/pagy/extras/foundation.rb +16 -11
- data/lib/pagy/extras/headers.rb +3 -3
- data/lib/pagy/extras/items.rb +18 -34
- data/lib/pagy/extras/materialize.rb +17 -11
- data/lib/pagy/extras/metadata.rb +3 -2
- data/lib/pagy/extras/navs.rb +12 -8
- data/lib/pagy/extras/searchkick.rb +1 -0
- data/lib/pagy/extras/semantic.rb +17 -12
- data/lib/pagy/extras/shared.rb +4 -9
- data/lib/pagy/extras/standalone.rb +71 -0
- data/lib/pagy/extras/support.rb +12 -8
- data/lib/pagy/extras/trim.rb +5 -4
- data/lib/pagy/extras/uikit.rb +16 -11
- data/lib/pagy/frontend.rb +29 -18
- metadata +5 -3
@@ -16,7 +16,8 @@ class Pagy
|
|
16
16
|
|
17
17
|
# Sub-method called only by #pagy_countless: here for easy customization of variables by overriding
|
18
18
|
def pagy_countless_get_vars(_collection, vars)
|
19
|
-
vars
|
19
|
+
pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
|
20
|
+
vars[:page] ||= params[ vars[:page_param] || VARS[:page_param] ]
|
20
21
|
vars
|
21
22
|
end
|
22
23
|
|
@@ -51,6 +51,7 @@ class Pagy
|
|
51
51
|
# Sub-method called only by #pagy_elasticsearch_rails: here for easy customization of variables by overriding
|
52
52
|
# the _collection argument is not available when the method is called
|
53
53
|
def pagy_elasticsearch_rails_get_vars(_collection, vars)
|
54
|
+
pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
|
54
55
|
vars[:items] ||= VARS[:items]
|
55
56
|
vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
|
56
57
|
vars
|
@@ -7,10 +7,11 @@ class Pagy
|
|
7
7
|
module Frontend
|
8
8
|
|
9
9
|
# Pagination for Foundation: it returns the html with the series of links to the pages
|
10
|
-
def pagy_foundation_nav(pagy)
|
11
|
-
|
10
|
+
def pagy_foundation_nav(pagy, pagy_id: nil, link_extra: '')
|
11
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
12
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
12
13
|
|
13
|
-
html = +%(<nav class="pagy-foundation-nav" role="navigation" aria-label="Pagination"><ul class="pagination">)
|
14
|
+
html = +%(<nav#{p_id} class="pagy-foundation-nav" role="navigation" aria-label="Pagination"><ul class="pagination">)
|
14
15
|
html << pagy_foundation_prev_html(pagy, link)
|
15
16
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
16
17
|
html << case item
|
@@ -24,26 +25,30 @@ class Pagy
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# Javascript pagination for foundation: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
27
|
-
def pagy_foundation_nav_js(pagy,
|
28
|
-
|
28
|
+
def pagy_foundation_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
|
29
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
30
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
31
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
29
32
|
tags = { 'before' => %(<ul class="pagination">#{pagy_foundation_prev_html pagy, link}),
|
30
33
|
'link' => %(<li>#{link.call PAGE_PLACEHOLDER}</li>),
|
31
34
|
'active' => %(<li class="current">#{pagy.page}</li>),
|
32
35
|
'gap' => %(<li class="ellipsis gap" aria-hidden="true"></li>),
|
33
36
|
'after' => %(#{pagy_foundation_next_html pagy, link}</ul>) }
|
34
37
|
|
35
|
-
html = %(<nav
|
36
|
-
html << pagy_json_tag(pagy, :nav,
|
38
|
+
html = %(<nav#{p_id} class="pagy-njs pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>)
|
39
|
+
html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
|
37
40
|
end
|
38
41
|
|
39
42
|
# Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
40
|
-
def pagy_foundation_combo_nav_js(pagy,
|
41
|
-
|
43
|
+
def pagy_foundation_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
|
44
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
45
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
46
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
42
47
|
p_page = pagy.page
|
43
48
|
p_pages = pagy.pages
|
44
49
|
input = %(<input class="input-group-field cell shrink" type="number" min="1" max="#{p_pages}" value="#{p_page}" style="width: #{p_pages.to_s.length+1}rem; padding: 0 0.3rem; margin: 0 0.3rem;">)
|
45
50
|
|
46
|
-
%(<nav
|
51
|
+
%(<nav#{p_id} class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination"><div class="input-group">#{
|
47
52
|
if (p_prev = pagy.prev)
|
48
53
|
link.call p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"'
|
49
54
|
else
|
@@ -56,7 +61,7 @@ class Pagy
|
|
56
61
|
%(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t 'pagy.nav.next'}</a>)
|
57
62
|
end
|
58
63
|
}</div></nav>#{
|
59
|
-
pagy_json_tag pagy, :combo_nav,
|
64
|
+
pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
|
60
65
|
})
|
61
66
|
end
|
62
67
|
|
data/lib/pagy/extras/headers.rb
CHANGED
@@ -24,11 +24,11 @@ class Pagy
|
|
24
24
|
countless = defined?(Pagy::Countless) && pagy.is_a?(Pagy::Countless)
|
25
25
|
rels = { 'first' => 1, 'prev' => pagy.prev, 'next' => pagy.next }
|
26
26
|
rels['last'] = pagy.last unless countless
|
27
|
-
url_str = pagy_url_for(
|
28
|
-
hash = { 'Link' => rels.
|
27
|
+
url_str = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: true)
|
28
|
+
hash = { 'Link' => rels.filter_map do |rel, num|
|
29
29
|
next unless num
|
30
30
|
[ rel, url_str.sub(PAGE_PLACEHOLDER, num.to_s) ]
|
31
|
-
end.
|
31
|
+
end.to_h }
|
32
32
|
headers = pagy.vars[:headers]
|
33
33
|
hash[headers[:page]] = pagy.page.to_s if headers[:page]
|
34
34
|
hash[headers[:items]] = pagy.vars[:items].to_s if headers[:items]
|
data/lib/pagy/extras/items.rb
CHANGED
@@ -9,59 +9,43 @@ class Pagy
|
|
9
9
|
VARS[:items_param] = :items
|
10
10
|
VARS[:max_items] = 100
|
11
11
|
|
12
|
+
VARS[:enable_items_extra] = true
|
13
|
+
|
12
14
|
ITEMS_PLACEHOLDER = '__pagy_items__'
|
13
15
|
|
14
|
-
module UseItemsExtra
|
15
|
-
private
|
16
|
+
module UseItemsExtra; end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
pagy_elasticsearch_rails_get_vars
|
20
|
-
pagy_searchkick_get_vars
|
21
|
-
].each do |meth|
|
22
|
-
next unless Backend.private_method_defined?(meth, true)
|
18
|
+
module Backend
|
19
|
+
private
|
23
20
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
def pagy_set_items_from_params(vars)
|
22
|
+
return if vars[:items]
|
23
|
+
return unless vars.key?(:enable_item_extra) ? vars[:enable_item_extra] : VARS[:enable_items_extra]
|
24
|
+
return unless (items = params[vars[:items_param] || VARS[:items_param]]) # :items from :items_param
|
25
|
+
vars[:items] = [items.to_i, vars.key?(:max_items) ? vars[:max_items] : VARS[:max_items]].compact.min # :items capped to :max_items
|
29
26
|
end
|
30
|
-
end
|
31
27
|
|
32
28
|
end
|
33
|
-
Backend.prepend UseItemsExtra
|
34
|
-
|
35
29
|
|
36
30
|
module Frontend
|
37
31
|
|
38
|
-
module UseItemsExtra
|
39
|
-
|
40
|
-
def pagy_url_for(page, pagy, url=nil)
|
41
|
-
p_vars = pagy.vars
|
42
|
-
params = request.GET.merge(p_vars[:params])
|
43
|
-
params[p_vars[:page_param].to_s] = page
|
44
|
-
params[p_vars[:items_param].to_s] = p_vars[:items]
|
45
|
-
"#{request.base_url if url}#{request.path}?#{Rack::Utils.build_nested_query(pagy_get_params(params))}#{p_vars[:anchor]}"
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
prepend UseItemsExtra
|
50
|
-
|
51
32
|
# Return the items selector HTML. For example "Show [20] items per page"
|
52
|
-
def pagy_items_selector_js(pagy,
|
33
|
+
def pagy_items_selector_js(pagy, deprecated_id=nil, pagy_id: nil, item_name: nil, i18n_key: nil, link_extra: '')
|
34
|
+
return '' unless pagy.vars[:enable_items_extra]
|
35
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
36
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
53
37
|
p_vars = pagy.vars
|
54
38
|
p_items = p_vars[:items]
|
55
39
|
p_vars[:items] = ITEMS_PLACEHOLDER
|
56
|
-
link = pagy_marked_link(pagy_link_proc(pagy))
|
40
|
+
link = pagy_marked_link(pagy_link_proc(pagy, link_extra: link_extra))
|
57
41
|
p_vars[:items] = p_items # restore the items
|
58
42
|
|
59
|
-
html = %(<span
|
43
|
+
html = %(<span#{p_id} class="pagy-items-selector-js">)
|
60
44
|
input = %(<input type="number" min="1" max="#{p_vars[:max_items]}" value="#{p_items}" style="padding: 0; text-align: center; width: #{p_items.to_s.length+1}rem;">)
|
61
|
-
html << pagy_t('pagy.items_selector_js', item_name: pagy_t(p_vars[:i18n_key], count: p_items),
|
45
|
+
html << pagy_t('pagy.items_selector_js', item_name: item_name || pagy_t(i18n_key || p_vars[:i18n_key], count: p_items),
|
62
46
|
items_input: input,
|
63
47
|
count: p_items)
|
64
|
-
html << %(</span>#{pagy_json_tag
|
48
|
+
html << %(</span>#{pagy_json_tag pagy, :items_selector, pagy.from, link})
|
65
49
|
end
|
66
50
|
|
67
51
|
end
|
@@ -7,10 +7,11 @@ class Pagy
|
|
7
7
|
module Frontend
|
8
8
|
|
9
9
|
# Pagination for materialize: it returns the html with the series of links to the pages
|
10
|
-
def pagy_materialize_nav(pagy)
|
11
|
-
|
10
|
+
def pagy_materialize_nav(pagy, pagy_id: nil, link_extra: '')
|
11
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
12
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
12
13
|
|
13
|
-
html = +%(<div class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">)
|
14
|
+
html = +%(<div#{p_id} class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">)
|
14
15
|
html << pagy_materialize_prev_html(pagy, link)
|
15
16
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
16
17
|
html << case item
|
@@ -24,34 +25,39 @@ class Pagy
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
27
|
-
def pagy_materialize_nav_js(pagy,
|
28
|
-
|
28
|
+
def pagy_materialize_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
|
29
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
30
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
31
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
32
|
+
|
29
33
|
tags = { 'before' => %(<ul class="pagination">#{pagy_materialize_prev_html pagy, link}),
|
30
34
|
'link' => %(<li class="waves-effect">#{mark = link.call(PAGE_PLACEHOLDER)}</li>),
|
31
35
|
'active' => %(<li class="active">#{mark}</li>),
|
32
36
|
'gap' => %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>),
|
33
37
|
'after' => %(#{pagy_materialize_next_html pagy, link}</ul>) }
|
34
38
|
|
35
|
-
html = %(<div
|
36
|
-
html << pagy_json_tag(pagy, :nav,
|
39
|
+
html = %(<div#{p_id} class="pagy-njs pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>)
|
40
|
+
html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
|
37
41
|
end
|
38
42
|
|
39
43
|
# Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
40
|
-
def pagy_materialize_combo_nav_js(pagy,
|
41
|
-
|
44
|
+
def pagy_materialize_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
|
45
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
46
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
47
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
42
48
|
p_page = pagy.page
|
43
49
|
p_pages = pagy.pages
|
44
50
|
style = ' style="vertical-align: middle;"'
|
45
51
|
input = %(<input type="number" class="browser-default" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 2px; border: none; border-radius: 2px; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
|
46
52
|
|
47
|
-
%(<div
|
53
|
+
%(<div#{p_id} class="pagy-materialize-combo-nav-js pagination" role="navigation" aria-label="pager"><div class="pagy-compact-chip role="group" style="height: 35px; border-radius: 18px; background: #e4e4e4; display: inline-block;"><ul class="pagination" style="margin: 0px;">#{
|
48
54
|
pagy_materialize_prev_html pagy, link, style
|
49
55
|
}<div class="pagy-combo-input btn-flat" style="cursor: default; padding: 0px">#{
|
50
56
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
51
57
|
}</div>#{
|
52
58
|
pagy_materialize_next_html pagy, link, style
|
53
59
|
}</ul></div>#{
|
54
|
-
pagy_json_tag pagy, :combo_nav,
|
60
|
+
pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
|
55
61
|
})
|
56
62
|
end
|
57
63
|
|
data/lib/pagy/extras/metadata.rb
CHANGED
@@ -16,13 +16,14 @@ class Pagy
|
|
16
16
|
|
17
17
|
include Helpers
|
18
18
|
|
19
|
-
def pagy_metadata(pagy,
|
19
|
+
def pagy_metadata(pagy, deprecated_url=nil, absolute: nil)
|
20
|
+
absolute = Pagy.deprecated_arg(:url, deprecated_url, :absolute, absolute) if deprecated_url
|
20
21
|
names = pagy.vars[:metadata]
|
21
22
|
unknown = names - METADATA
|
22
23
|
raise VariableError.new(pagy), "unknown metadata #{unknown.inspect}" \
|
23
24
|
unless unknown.empty?
|
24
25
|
|
25
|
-
scaffold_url = pagy_url_for(
|
26
|
+
scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
|
26
27
|
{}.tap do |metadata|
|
27
28
|
names.each do |key|
|
28
29
|
metadata[key] = case key
|
data/lib/pagy/extras/navs.rb
CHANGED
@@ -7,33 +7,37 @@ class Pagy
|
|
7
7
|
module Frontend
|
8
8
|
|
9
9
|
# Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
10
|
-
def pagy_nav_js(pagy,
|
11
|
-
|
10
|
+
def pagy_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
|
11
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
12
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
13
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
12
14
|
tags = { 'before' => pagy_nav_prev_html(pagy, link),
|
13
15
|
'link' => %(<span class="page">#{link.call(PAGE_PLACEHOLDER)}</span> ),
|
14
16
|
'active' => %(<span class="page active">#{pagy.page}</span> ),
|
15
17
|
'gap' => %(<span class="page gap">#{pagy_t 'pagy.nav.gap'}</span> ),
|
16
18
|
'after' => pagy_nav_next_html(pagy, link) }
|
17
19
|
|
18
|
-
html = %(<nav
|
19
|
-
html << pagy_json_tag(pagy, :nav,
|
20
|
+
html = %(<nav#{p_id} class="pagy-njs pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>)
|
21
|
+
html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
|
20
22
|
end
|
21
23
|
|
22
24
|
# Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
23
|
-
def pagy_combo_nav_js(pagy,
|
24
|
-
|
25
|
+
def pagy_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
|
26
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
27
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
28
|
+
link = pagy_link_proc(pagy, link_extra: link_extra)
|
25
29
|
p_page = pagy.page
|
26
30
|
p_pages = pagy.pages
|
27
31
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
|
28
32
|
|
29
|
-
%(<nav
|
33
|
+
%(<nav#{p_id} class="pagy-combo-nav-js pagination" role="navigation" aria-label="pager">#{
|
30
34
|
pagy_nav_prev_html pagy, link
|
31
35
|
}<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{
|
32
36
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
33
37
|
}</span> #{
|
34
38
|
pagy_nav_next_html pagy, link
|
35
39
|
}</nav>#{
|
36
|
-
pagy_json_tag pagy, :combo_nav,
|
40
|
+
pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
|
37
41
|
})
|
38
42
|
end
|
39
43
|
|
@@ -49,6 +49,7 @@ class Pagy
|
|
49
49
|
# Sub-method called only by #pagy_searchkick: here for easy customization of variables by overriding
|
50
50
|
# the _collection argument is not available when the method is called
|
51
51
|
def pagy_searchkick_get_vars(_collection, vars)
|
52
|
+
pagy_set_items_from_params(vars) if defined?(UseItemsExtra)
|
52
53
|
vars[:items] ||= VARS[:items]
|
53
54
|
vars[:page] ||= (params[ vars[:page_param] || VARS[:page_param] ] || 1).to_i
|
54
55
|
vars
|
data/lib/pagy/extras/semantic.rb
CHANGED
@@ -7,16 +7,17 @@ class Pagy
|
|
7
7
|
module Frontend
|
8
8
|
|
9
9
|
# Pagination for semantic: it returns the html with the series of links to the pages
|
10
|
-
def pagy_semantic_nav(pagy)
|
11
|
-
|
10
|
+
def pagy_semantic_nav(pagy, pagy_id: nil, link_extra: '')
|
11
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
12
|
+
link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}"))
|
12
13
|
|
13
|
-
html = +%(<div class="pagy-semantic-nav ui pagination menu" aria-label="pager">)
|
14
|
+
html = +%(<div#{p_id} class="pagy-semantic-nav ui pagination menu" aria-label="pager">)
|
14
15
|
html << pagy_semantic_prev_html(pagy, link)
|
15
16
|
pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
|
16
17
|
html << case item
|
17
18
|
when Integer then link.call item # page link
|
18
19
|
when String then %(<a class="item active">#{item}</a>) # current page
|
19
|
-
when :gap then %(<div class="disabled item"
|
20
|
+
when :gap then %(<div class="disabled item">#{pagy_t 'pagy.nav.gap'}</div>) # page gap
|
20
21
|
end
|
21
22
|
end
|
22
23
|
html << pagy_semantic_next_html(pagy, link)
|
@@ -24,33 +25,37 @@ class Pagy
|
|
24
25
|
end
|
25
26
|
|
26
27
|
# Javascript pagination for semantic: it returns a nav and a JSON tag used by the Pagy.nav javascript
|
27
|
-
def pagy_semantic_nav_js(pagy,
|
28
|
-
|
28
|
+
def pagy_semantic_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '', steps: nil)
|
29
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
30
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
31
|
+
link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}))
|
29
32
|
tags = { 'before' => pagy_semantic_prev_html(pagy, link),
|
30
33
|
'link' => link.call(PAGE_PLACEHOLDER),
|
31
34
|
'active' => %(<a class="item active">#{pagy.page}</a>),
|
32
35
|
'gap' => %(<div class="disabled item">#{pagy_t('pagy.nav.gap')}</div>),
|
33
36
|
'after' => pagy_semantic_next_html(pagy, link) }
|
34
37
|
|
35
|
-
html = %(<div
|
36
|
-
html << pagy_json_tag(pagy, :nav,
|
38
|
+
html = %(<div#{p_id} class="pagy-njs pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>)
|
39
|
+
html << pagy_json_tag(pagy, :nav, tags, pagy.sequels(steps))
|
37
40
|
end
|
38
41
|
|
39
42
|
# Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript
|
40
|
-
def pagy_semantic_combo_nav_js(pagy,
|
41
|
-
|
43
|
+
def pagy_semantic_combo_nav_js(pagy, deprecated_id=nil, pagy_id: nil, link_extra: '')
|
44
|
+
pagy_id = Pagy.deprecated_arg(:id, deprecated_id, :pagy_id, pagy_id) if deprecated_id
|
45
|
+
p_id = %( id="#{pagy_id}") if pagy_id
|
46
|
+
link = pagy_link_proc(pagy, link_extra: %(class="item" #{link_extra}))
|
42
47
|
p_page = pagy.page
|
43
48
|
p_pages = pagy.pages
|
44
49
|
input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem; margin: 0 0.3rem">)
|
45
50
|
|
46
|
-
%(<div
|
51
|
+
%(<div#{p_id} class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">#{
|
47
52
|
pagy_semantic_prev_html pagy, link
|
48
53
|
}<div class="pagy-combo-input item">#{
|
49
54
|
pagy_t 'pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages
|
50
55
|
}</div> #{
|
51
56
|
pagy_semantic_next_html pagy, link
|
52
57
|
}</div>#{
|
53
|
-
pagy_json_tag pagy, :combo_nav,
|
58
|
+
pagy_json_tag pagy, :combo_nav, p_page, pagy_marked_link(link)
|
54
59
|
})
|
55
60
|
end
|
56
61
|
|
data/lib/pagy/extras/shared.rb
CHANGED
@@ -16,8 +16,8 @@ class Pagy
|
|
16
16
|
# "350" => [1, 2, :gap, 17, 18, 19, "20", 21, 22, 23, :gap, 49, 50],
|
17
17
|
# "550" => [1, 2, 3, :gap, 16, 17, 18, 19, "20", 21, 22, 23, 24, :gap, 48, 49, 50] }
|
18
18
|
# Notice: if :steps is false it will use the single {0 => @vars[:size]} size
|
19
|
-
def sequels
|
20
|
-
steps
|
19
|
+
def sequels(steps=nil)
|
20
|
+
steps ||= @vars[:steps] || {0 => @vars[:size]}
|
21
21
|
raise VariableError.new(self), "expected :steps to define the 0 width; got #{steps.inspect}" \
|
22
22
|
unless steps.key?(0)
|
23
23
|
{}.tap do |sequels|
|
@@ -30,23 +30,18 @@ class Pagy
|
|
30
30
|
if defined?(Oj)
|
31
31
|
# it returns a script tag with the JSON-serialized args generated with the faster oj gem
|
32
32
|
def pagy_json_tag(pagy, *args)
|
33
|
-
args << pagy.vars[:page_param] if pagy.vars[:
|
33
|
+
args << pagy.vars[:page_param] if pagy.vars[:enable_trim_extra]
|
34
34
|
%(<script type="application/json" class="pagy-json">#{Oj.dump(args, mode: :strict)}</script>)
|
35
35
|
end
|
36
36
|
else
|
37
37
|
require 'json'
|
38
38
|
# it returns a script tag with the JSON-serialized args generated with the slower to_json
|
39
39
|
def pagy_json_tag(pagy, *args)
|
40
|
-
args << pagy.vars[:page_param] if pagy.vars[:
|
40
|
+
args << pagy.vars[:page_param] if pagy.vars[:enable_trim_extra]
|
41
41
|
%(<script type="application/json" class="pagy-json">#{args.to_json}</script>)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
# it returns the SHA1 (fastest on modern ruby) string used as default `id` attribute by all the `*_js` tags
|
46
|
-
def pagy_id
|
47
|
-
"pagy-#{Digest::SHA1.hexdigest(caller(2..2)[0].split(':in')[0])}"
|
48
|
-
end
|
49
|
-
|
50
45
|
# it returns the marked link to used by pagy.js
|
51
46
|
def pagy_marked_link(link)
|
52
47
|
link.call PAGE_PLACEHOLDER, '', 'style="display: none;"'
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# See the Pagy documentation: https://ddnexus.github.io/pagy/extras/standalone
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
class Pagy
|
6
|
+
|
7
|
+
# extracted from Rack::Utils and reformatted for rubocop
|
8
|
+
module QueryUtils
|
9
|
+
module_function
|
10
|
+
def escape(str)
|
11
|
+
URI.encode_www_form_component(str)
|
12
|
+
end
|
13
|
+
def build_nested_query(value, prefix = nil)
|
14
|
+
case value
|
15
|
+
when Array
|
16
|
+
value.map { |v| build_nested_query(v, "#{prefix}[]") }.join('&')
|
17
|
+
when Hash
|
18
|
+
value.map { |k, v| build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k)) }.delete_if(&:empty?).join('&')
|
19
|
+
when nil
|
20
|
+
prefix
|
21
|
+
else
|
22
|
+
raise ArgumentError, 'value must be a Hash' if prefix.nil?
|
23
|
+
"#{prefix}=#{escape(value)}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module UseStandaloneExtra
|
29
|
+
# without any :url var it works exactly as the regular #pagy_url_for;
|
30
|
+
# with a defined :url variable it does not use rack/request
|
31
|
+
def pagy_url_for(pagy, page, deprecated_url=nil, absolute: nil)
|
32
|
+
absolute = Pagy.deprecated_arg(:url, deprecated_url, :absolute, absolute) if deprecated_url
|
33
|
+
pagy, page = Pagy.deprecated_order(pagy, page) if page.is_a?(Pagy)
|
34
|
+
p_vars = pagy.vars
|
35
|
+
if p_vars[:url]
|
36
|
+
url_string = p_vars[:url]
|
37
|
+
params = {}
|
38
|
+
else
|
39
|
+
url_string = "#{request.base_url if absolute}#{request.path}"
|
40
|
+
params = request.GET
|
41
|
+
end
|
42
|
+
params = params.merge(p_vars[:params])
|
43
|
+
params[p_vars[:page_param].to_s] = page
|
44
|
+
params[p_vars[:items_param].to_s] = p_vars[:items] if defined?(UseItemsExtra)
|
45
|
+
query_string = "?#{QueryUtils.build_nested_query(pagy_get_params(params))}" unless params.empty?
|
46
|
+
"#{url_string}#{query_string}#{p_vars[:fragment]}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
Helpers.prepend UseStandaloneExtra
|
50
|
+
|
51
|
+
# defines a dummy #params method if not already defined in the including module
|
52
|
+
module Backend
|
53
|
+
def self.included(controller)
|
54
|
+
controller.define_method(:params){{}} unless controller.method_defined?(:params)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# include Pagy::Console in irb/rails console for a ready to use pagy environment
|
59
|
+
module Console
|
60
|
+
def self.included(main)
|
61
|
+
main.include(Backend)
|
62
|
+
main.include(Frontend)
|
63
|
+
VARS[:url] = 'http://www.example.com/subdir'
|
64
|
+
end
|
65
|
+
|
66
|
+
def pagy_extras(*extras)
|
67
|
+
extras.each {|extra| require "pagy/extras/#{extra}"}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|