pagy 4.3.0 → 4.4.0
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/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
|