Module: Pagy::Frontend

Includes:
Helpers
Defined in:
lib/pagy/frontend.rb,
lib/pagy/extras/i18n.rb,
lib/pagy/extras/navs.rb,
lib/pagy/extras/trim.rb,
lib/pagy/extras/bulma.rb,
lib/pagy/extras/items.rb,
lib/pagy/extras/shared.rb,
lib/pagy/extras/support.rb,
lib/pagy/extras/semantic.rb,
lib/pagy/extras/bootstrap.rb,
lib/pagy/extras/foundation.rb,
lib/pagy/extras/materialize.rb

Overview

Use ::I18n gem

Constant Summary collapse

EMPTY =

EMPTY + ‘string’ is almost as fast as +‘string’ but is also 1.9 compatible

''
MARK =

string used for search and replace, hardcoded also in the pagy.js file

'__pagy_page__'
TRIM =

boolean used by *_js helpers

true

Instance Method Summary collapse

Methods included from Helpers

#pagy_get_params

Instance Method Details

#pagy_bootstrap_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript combo pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/pagy/extras/bootstrap.rb', line 41

def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = %(<nav id="#{id}" class="pagy-bootstrap-combo-nav-js pagination" role="navigation" aria-label="pager">) + %(<div class="btn-group" role="group">)
  html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous" class="prev btn btn-primary"')
                  : %(<a class="prev btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
  input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" class="text-primary" style="padding: 0; border: none; text-align: center; width: #{p_pages.to_s.length+1}rem;">)
  html << %(<div class="pagy-combo-input btn btn-primary disabled" style="white-space: nowrap;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
  html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next" class="next btn btn-primary"')
                  : %(<a class="next btn btn-primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
  html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_bootstrap_nav(pagy) ⇒ Object

Pagination for bootstrap: it returns the html with the series of links to the pages



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/pagy/extras/bootstrap.rb', line 11

def pagy_bootstrap_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next

  html = EMPTY + (p_prev ? %(<li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
                         : %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>))
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>)                                                               # page link
            elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>)                                                        # active page
            elsif item == :gap       ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>) # page gap
            end
  end
  html << (p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
                  : %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li>))
  %(<nav class="pagy-bootstrap-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></nav>)
end

#pagy_bootstrap_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination for bootstrap: it returns a nav and a JSON tag used by the Pagy.nav javascript



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/pagy/extras/bootstrap.rb', line 28

def pagy_bootstrap_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="page-link"'), pagy.prev, pagy.next
  tags = { 'before' => p_prev ? %(<ul class="pagination"><li class="page-item prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
                              : %(<ul class="pagination"><li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev')}</a></li>),
           'link'   => %(<li class="page-item">#{mark = link.call(MARK)}</li>),
           'active' => %(<li class="page-item active">#{mark}</li>),
           'gap'    => %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap')}</a></li>),
           'after'  => p_next ? %(<li class="page-item next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li></ul>)
                              : %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next')}</a></li></ul>) }
  %(<nav id="#{id}" class="pagy-bootstrap-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_bulma_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript combo pagination for Bulma: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/pagy/extras/bulma.rb', line 45

def pagy_bulma_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = %(<nav id="#{id}" class="pagy-bulma-combo-nav-js" role="navigation" aria-label="pagination">) \
       + %(<div class="field is-grouped is-grouped-centered" role="group">)
  html << (p_prev ? %(<p class="control">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="button" aria-label="previous page"')}</p>)
                  : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.prev')}</a></p>))
  input = %(<input class="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;">)
  html << %(<div class="pagy-combo-input control level is-mobile">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
  html << (p_next ? %(<p class="control">#{link.call(p_next, pagy_t('pagy.nav.next'), 'class="button" aria-label="next page"')}</p>)
                  : %(<p class="control"><a class="button" disabled>#{pagy_t('pagy.nav.next')}</a></p>))
  html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_bulma_nav(pagy) ⇒ Object

Pagination for Bulma: it returns the html with the series of links to the pages



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/pagy/extras/bulma.rb', line 11

def pagy_bulma_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next

  html = (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
                 : %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>)) \
       + (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
                 : %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>))
  html << '<ul class="pagination-list">'
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(<li>#{link.call item, item, %(class="pagination-link" aria-label="goto page #{item}") }</li>)                           # page link
            elsif item.is_a?(String) ; %(<li>#{link.call item, item, %(class="pagination-link is-current" aria-label="page #{item}" aria-current="page")}</li>)  # active page
            elsif item == :gap       ; %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>)                                            # page gap
            end
  end
  html << '</ul>'
  %(<nav class="pagy-bulma-nav pagination is-centered" role="navigation" aria-label="pagination">#{html}</nav>)
end

#pagy_bulma_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination for bulma: it returns a nav and a JSON tag used by the Pagy.nav javascript



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/pagy/extras/bulma.rb', line 30

def pagy_bulma_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
  tags = { 'before' => ( (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="pagination-previous" aria-label="previous page"')
                                 : %(<a class="pagination-previous" disabled>#{pagy_t('pagy.nav.prev')}</a>)) \
                       + (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'class="pagination-next" aria-label="next page"')
                                 : %(<a class="pagination-next" disabled>#{pagy_t('pagy.nav.next')}</a>)) \
                       + '<ul class="pagination-list">' ),
           'link'   => %(<li>#{link.call(MARK, MARK, %(class="pagination-link" aria-label="goto page #{MARK}"))}</li>),
           'active' => %(<li>#{link.call(MARK, MARK, %(class="pagination-link is-current" aria-current="page" aria-label="page #{MARK}"))}</li>),
           'gap'    => %(<li><span class="pagination-ellipsis">#{pagy_t('pagy.nav.gap')}</span></li>),
           'after'  => '</ul>' }
  %(<nav id="#{id}" class="pagy-bulma-nav-js pagination is-centered" role="navigation" aria-label="pagination"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript combo pagination: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/pagy/extras/navs.rb', line 24

def pagy_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = EMPTY + %(<nav id="#{id}" class="pagy-combo-nav-js-js pagination" role="navigation" aria-label="pager">)
  html << (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
                  : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
  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;">)
  html << %(<span class="pagy-combo-input" style="margin: 0 0.6rem;">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span> )
  html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
                  : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
  html << %(</nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_foundation_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript combo pagination for Foundation: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/pagy/extras/foundation.rb', line 43

def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = %(<nav id="#{id}" class="pagy-foundation-combo-nav-js" role="navigation" aria-label="Pagination">) + %(<div class="input-group">)
  html << (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'style="margin-bottom: 0px;" aria-label="previous" class="prev button primary"')
                  : %(<a style="margin-bottom: 0px;" class="prev button primary disabled" href="#">#{pagy_t('pagy.nav.prev')}</a>))
  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;">)
  html << %(<span class="input-group-label">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</span>)
  html << (p_next ? link.call(p_next, pagy_t('pagy.nav.next'), 'style="margin-bottom: 0px;" aria-label="next" class="next button primary"')
                  : %(<a style="margin-bottom: 0px;" class="next button primary disabled" href="#">#{pagy_t('pagy.nav.next')}</a>))
  html << %(</div></nav>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_foundation_nav(pagy) ⇒ Object

Pagination for Foundation: it returns the html with the series of links to the pages



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/pagy/extras/foundation.rb', line 11

def pagy_foundation_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next

  html = EMPTY + (p_prev ? %(<li class="prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</li>)
                         : %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>))
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(<li>#{link.call item}</li>)                        # page link
            elsif item.is_a?(String) ; %(<li class="current">#{item}</li>)                  # active page
            elsif item == :gap       ; %(<li class="ellipsis gap" aria-hidden="true"></li>) # page gap
            end
  end
  html << (p_next ? %(<li class="next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</li>)
                  : %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>))
  %(<nav class="pagy-foundation-nav" role="navigation" aria-label="Pagination"><ul class="pagination">#{html}</ul></nav>)
end

#pagy_foundation_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination for foundation: it returns a nav and a JSON tag used by the Pagy.nav javascript



28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/pagy/extras/foundation.rb', line 28

def pagy_foundation_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
  tags = { 'before' => ( '<ul class="pagination">' \
                       + (p_prev ? %(<li class="prev">#{link.call(p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')}</li>)
                                 : %(<li class="prev disabled">#{pagy_t('pagy.nav.prev')}</li>)) ),
           'link'   => %(<li>#{link.call(MARK)}</li>),
           'active' => %(<li class="current">#{pagy.page}</li>),
           'gap'    => %(<li class="ellipsis gap" aria-hidden="true"></li>),
           'after'  => ( (p_next ? %(<li class="next">#{link.call(p_next, pagy_t('pagy.nav.next'), 'aria-label="next"')}</li>)
                                 : %(<li class="next disabled">#{pagy_t('pagy.nav.next')}</li>)) \
                       + '</ul>' ) }
  %(<nav id="#{id}" class="pagy-foundation-nav-js" role="navigation" aria-label="Pagination"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_idObject

it returns the SHA1 (fastest on modern ruby) string used as default ‘id` attribute by all the `*_js` tags



42
43
44
# File 'lib/pagy/extras/shared.rb', line 42

def pagy_id
  "pagy-#{Digest::SHA1.hexdigest(caller(2..2)[0].split(':in')[0])}"
end

#pagy_info(pagy) ⇒ Object

Return examples: “Displaying items 41-60 of 324 in total” of “Displaying Products 41-60 of 324 in total”



51
52
53
54
55
56
# File 'lib/pagy/frontend.rb', line 51

def pagy_info(pagy)
  path = if (count = pagy.count) == 0 ; 'pagy.info.no_items'
         else pagy.pages == 1 ? 'pagy.info.single_page' : 'pagy.info.multiple_pages'
         end
  pagy_t(path, item_name: pagy_t(pagy.vars[:i18n_key], count: count), count: count, from: pagy.from, to: pagy.to)
end

#pagy_items_selector_js(pagy, id = pagy_id) ⇒ Object

Return the items selector HTML. For example “Show [20] items per page”



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/pagy/extras/items.rb', line 49

def pagy_items_selector_js(pagy, id=pagy_id)
  p_vars         = pagy.vars
  p_items        = p_vars[:items]
  p_vars[:items] = '__pagy_items__'
  link           = pagy_marked_link(pagy_link_proc(pagy))
  p_vars[:items] = p_items # restore the items

  html = EMPTY + %(<span id="#{id}">)
  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;">)
  html << %(#{pagy_t('pagy.items_selector_js', item_name: pagy_t(p_vars[:i18n_key], count: p_items), items_input: input, count: p_items)})
  html << %(</span>#{pagy_json_tag(:items_selector, id, pagy.from, link, defined?(TRIM) && p_vars[:page_param])})
end

#pagy_json_tag(*args) ⇒ Object

it returns a script tag with the JSON-serialized args generated with the slower to_json



30
31
32
# File 'lib/pagy/extras/shared.rb', line 30

def pagy_json_tag(*args)
  %(<script type="application/json" class="pagy-json">#{Oj.dump(args, mode: :strict)}</script>)
end


12
13
14
15
16
17
18
19
# File 'lib/pagy/extras/trim.rb', line 12

def pagy_link_proc_with_trim(pagy, link_extra='')
  link_proc = pagy_link_proc_without_trim(pagy, link_extra)
  re = /[?&]#{pagy.vars[:page_param]}=1\b(?!&)|\b#{pagy.vars[:page_param]}=1&/
  lambda do |n, text=n, extra=''|
    link = link_proc.call(n, text, extra)
    n == 1 ? link.sub(re, '') : link
  end
end

it returns the marked link to used by pagy.js



47
48
49
# File 'lib/pagy/extras/shared.rb', line 47

def pagy_marked_link(link)
  link.call(MARK, '', 'style="display: none;"')
end

#pagy_materialize_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript combo pagination for materialize: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/pagy/extras/materialize.rb', line 42

def pagy_materialize_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = %(<div id="#{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;">)
  html << '<ul class="pagination" style="margin: 0px;">'
  li_style = 'style="vertical-align: middle;"'
  html << (p_prev ? %(<li class="waves-effect prev" #{li_style}>#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
                  : %(<li class="prev disabled" #{li_style}><a href="#"><i class="material-icons">chevron_left</i></a></li>))
  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;">)
  html << %(<div class="pagy-combo-input btn-flat" style="cursor: default; padding: 0px">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div>)
  html << (p_next ? %(<li class="waves-effect next" #{li_style}>#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
                  : %(<li class="next disabled" #{li_style}><a href="#"><i class="material-icons">chevron_right</i></a></li>))
  html << %(</ul></div>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_materialize_nav(pagy) ⇒ Object

Pagination for materialize: it returns the html with the series of links to the pages



11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/pagy/extras/materialize.rb', line 11

def pagy_materialize_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
  html = EMPTY + (p_prev ? %(<li class="waves-effect prev">#{link.call p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"'}</li>)
                         : %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>))
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(<li class="waves-effect">#{link.call item}</li>)                                             # page link
            elsif item.is_a?(String) ; %(<li class="active">#{link.call item}</li>)                                                   # active page
            elsif item == :gap       ; %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>)   # page gap
            end
  end
  html << (p_next ? %(<li class="waves-effect next">#{link.call p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"'}</li>)
                  : %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>))
  %(<div class="pagy-materialize-nav pagination" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></div>)
end

#pagy_materialize_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination for materialize: it returns a nav and a JSON tag used by the Pagy.nav javascript



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pagy/extras/materialize.rb', line 27

def pagy_materialize_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
  tags = { 'before' => ( '<ul class="pagination">' \
                       + (p_prev  ? %(<li class="waves-effect prev">#{link.call(p_prev, '<i class="material-icons">chevron_left</i>', 'aria-label="previous"')}</li>)
                                  : %(<li class="prev disabled"><a href="#"><i class="material-icons">chevron_left</i></a></li>)) ),
           'link'   => %(<li class="waves-effect">#{mark = link.call(MARK)}</li>),
           'active' => %(<li class="active">#{mark}</li>),
           'gap'    => %(<li class="gap disabled"><a href="#">#{pagy_t('pagy.nav.gap')}</a></li>),
           'after'  => ( (p_next ? %(<li class="waves-effect next">#{link.call(p_next, '<i class="material-icons">chevron_right</i>', 'aria-label="next"')}</li>)
                                 : %(<li class="next disabled"><a href="#"><i class="material-icons">chevron_right</i></a></li>)) \
                       + '</ul>' ) }
  %(<div id="#{id}" class="pagy-materialize-nav-js" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_nav(pagy) ⇒ Object

Generic pagination: it returns the html with the series of links to the pages



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pagy/frontend.rb', line 34

def pagy_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next

  html = EMPTY + (p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
                         : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ))
  pagy.series.each do |item|  # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(<span class="page">#{link.call item}</span> )               # page link
            elsif item.is_a?(String) ; %(<span class="page active">#{item}</span> )                  # current page
            elsif item == :gap       ; %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> )   # page gap
            end
  end
  html << (p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
                  : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>))
  %(<nav class="pagy-nav pagination" role="navigation" aria-label="pager">#{html}</nav>)
end

#pagy_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination: it returns a nav and a JSON tag used by the Pagy.nav javascript



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/pagy/extras/navs.rb', line 11

def pagy_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next
  tags = { 'before' => p_prev ? %(<span class="page prev">#{link.call p_prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"'}</span> )
                              : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev')}</span> ),
           'link'   => %(<span class="page">#{link.call(MARK)}</span> ),
           'active' => %(<span class="page active">#{pagy.page}</span> ),
           'gap'    => %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ),
           'after'  => p_next ? %(<span class="page next">#{link.call p_next, pagy_t('pagy.nav.next'), 'aria-label="next"'}</span>)
                              : %(<span class="page next disabled">#{pagy_t('pagy.nav.next')}</span>) }
  %(<nav id="#{id}" class="pagy-nav-js pagination" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end


22
23
24
25
# File 'lib/pagy/extras/support.rb', line 22

def pagy_next_link(pagy, text = pagy_t('pagy.nav.next'), link_extra = '')
  pagy.next ? %(<span class="page next"><a href="#{pagy_next_url(pagy)}" rel="next" aria-label="next" #{pagy.vars[:link_extra]} #{link_extra}>#{text}</a></span>)
            : %(<span class="page next disabled">#{text}</span>)
end

#pagy_next_url(pagy) ⇒ Object



13
14
15
# File 'lib/pagy/extras/support.rb', line 13

def pagy_next_url(pagy)
  pagy_url_for(pagy.next, pagy) if pagy.next
end


17
18
19
20
# File 'lib/pagy/extras/support.rb', line 17

def pagy_prev_link(pagy, text = pagy_t('pagy.nav.prev'), link_extra = '')
  pagy.prev ? %(<span class="page prev"><a href="#{pagy_prev_url(pagy)}" rel="next" aria-label="next" #{pagy.vars[:link_extra]} #{link_extra}>#{text}</a></span>)
            : %(<span class="page prev disabled">#{text}</span>)
end

#pagy_prev_url(pagy) ⇒ Object



9
10
11
# File 'lib/pagy/extras/support.rb', line 9

def pagy_prev_url(pagy)
  pagy_url_for(pagy.prev, pagy) if pagy.prev
end

#pagy_semantic_combo_nav_js(pagy, id = pagy_id) ⇒ Object

Combo pagination for semantic: it returns a nav and a JSON tag used by the Pagy.combo_nav javascript



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/pagy/extras/semantic.rb', line 41

def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next, p_page, p_pages = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next, pagy.page, pagy.pages

  html = EMPTY + %(<div id="#{id}" class="pagy-semantic-combo-nav-js ui compact menu" role="navigation" aria-label="pager">)
  html << (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
                  : %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
  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">)
  html << %(<div class="pagy-combo-input item">#{pagy_t('pagy.combo_nav_js', page_input: input, count: p_page, pages: p_pages)}</div> )
  html << (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
                  : %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
  html << %(</div>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_semantic_nav(pagy) ⇒ Object

Pagination for semantic: it returns the html with the series of links to the pages



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/pagy/extras/semantic.rb', line 11

def pagy_semantic_nav(pagy)
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next

  html = EMPTY + (p_prev ? %(#{link.call p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"'})
                         : %(<div class="item disabled"><i class="left small chevron icon"></i></div>))
  pagy.series.each do |item|  # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
    html << if    item.is_a?(Integer); %(#{link.call item})                      # page link
            elsif item.is_a?(String) ; %(<a class="item active">#{item}</a>)     # current page
            elsif item == :gap       ; %(<div class="disabled item">...</div>)   # page gap
            end
  end
  html << (p_next ? %(#{link.call p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"'})
                  : %(<div class="item disabled"><i class="right small chevron icon"></i></div>))
  %(<div class="pagy-semantic-nav ui pagination menu" aria-label="pager">#{html}</div>)
end

#pagy_semantic_nav_js(pagy, id = pagy_id) ⇒ Object

Javascript pagination for semantic: it returns a nav and a JSON tag used by the Pagy.nav javascript



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/pagy/extras/semantic.rb', line 28

def pagy_semantic_nav_js(pagy, id=pagy_id)
  link, p_prev, p_next = pagy_link_proc(pagy, 'class="item"'), pagy.prev, pagy.next
  tags = { 'before' => (p_prev ? %(#{link.call(p_prev, '<i class="left small chevron icon"></i>', 'aria-label="previous"')})
                               : %(<div class="item disabled"><i class="left small chevron icon"></i></div>)),
           'link'   => %(#{link.call(MARK)}),
           'active' => %(<a class="item active">#{pagy.page}</a>),
           'gap'    => %(<div class="disabled item">#{pagy_t('pagy.nav.gap')}</div>),
           'after'  => (p_next ? %(#{link.call(p_next, '<i class="right small chevron icon"></i>', 'aria-label="next"')})
                               : %(<div class="item disabled"><i class="right small chevron icon"></i></div>)) }
  %(<div id="#{id}" class="pagy-semantic-nav-js ui pagination menu" role="navigation" aria-label="pager"></div>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])})
end

#pagy_t_with_i18n(*args) ⇒ Object Also known as: pagy_t



14
# File 'lib/pagy/extras/i18n.rb', line 14

def pagy_t_with_i18n(*args) ::I18n.t(*args) end

#pagy_url_for_with_items(page, pagy, url = false) ⇒ Object Also known as: pagy_url_for



41
42
43
44
45
# File 'lib/pagy/extras/items.rb', line 41

def pagy_url_for_with_items(page, pagy, url=false)
  p_vars = pagy.vars; params = request.GET.merge(p_vars[:params]); params[p_vars[:page_param].to_s] = page
  params[p_vars[:items_param].to_s] = p_vars[:items]
  "#{request.base_url if url}#{request.path}?#{Rack::Utils.build_nested_query(pagy_get_params(params))}#{p_vars[:anchor]}"
end