module Pagy::Frontend
def pagy_bootstrap_combo_nav_js(pagy, id=pagy_id)
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
def pagy_bootstrap_nav(pagy)
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" role="navigation" aria-label="pager"><ul class="pagination">#{html}</ul></nav>) end
def pagy_bootstrap_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER)}</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" role="navigation" aria-label="pager"></nav>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])}) end
def pagy_bulma_combo_nav_js(pagy, id=pagy_id)
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
def pagy_bulma_nav(pagy)
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
def pagy_bulma_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER, PAGE_PLACEHOLDER, %(class="pagination-link" aria-label="goto page #{PAGE_PLACEHOLDER}"))}</li>), 'active' => %(<li>#{link.call(PAGE_PLACEHOLDER, PAGE_PLACEHOLDER, %(class="pagination-link is-current" aria-current="page" aria-label="page #{PAGE_PLACEHOLDER}"))}</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
def pagy_combo_nav_js(pagy, id=pagy_id)
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 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
def pagy_foundation_combo_nav_js(pagy, id=pagy_id)
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
def pagy_foundation_nav(pagy)
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
def pagy_foundation_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER)}</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
def pagy_id
def pagy_id "pagy-#{Digest::SHA1.hexdigest(caller(2..2)[0].split(':in')[0])}" end
def pagy_info(pagy, item_name=nil)
def pagy_info(pagy, item_name=nil) 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: item_name || pagy_t(pagy.vars[:i18n_key], count: count), count: count, from: pagy.from, to: pagy.to) end
def pagy_items_selector_js(pagy, id=pagy_id)
def pagy_items_selector_js(pagy, id=pagy_id) p_vars = pagy.vars p_items = p_vars[:items] p_vars[:items] = ITEMS_PLACEHOLDER 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
def pagy_json_tag(*args)
def pagy_json_tag(*args) %(<script type="application/json" class="pagy-json">#{Oj.dump(args, mode: :strict)}</script>) end
def pagy_json_tag(*args)
def pagy_json_tag(*args) %(<script type="application/json" class="pagy-json">#{args.to_json}</script>) end
def pagy_link_proc(pagy, link_extra='')
Returns a performance optimized proc to generate the HTML links
def pagy_link_proc(pagy, link_extra='') p_prev, p_next = pagy.prev, pagy.next a, b = %(<a href="#{pagy_url_for(PAGE_PLACEHOLDER, pagy)}" #{pagy.vars[:link_extra]} #{link_extra}).split(PAGE_PLACEHOLDER, 2) lambda {|n, text=n, extra=''| "#{a}#{n}#{b}#{ if n == p_prev ; ' rel="prev"' elsif n == p_next ; ' rel="next"' else '' end } #{extra}>#{text}</a>"} end
def pagy_link_proc_with_trim(pagy, link_extra='')
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
def pagy_marked_link(link)
def pagy_marked_link(link) link.call(PAGE_PLACEHOLDER, '', 'style="display: none;"') end
def pagy_materialize_combo_nav_js(pagy, id=pagy_id)
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
def pagy_materialize_nav(pagy)
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
def pagy_materialize_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER)}</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
def pagy_nav(pagy)
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
def pagy_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER)}</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
def pagy_next_link(pagy, text = pagy_t('pagy.nav.next'), link_extra = '')
def pagy_next_link(pagy, text = pagy_t('pagy.nav.next'), link_extra = '') pagy.next ? %(<span class="page next"><a href="#{pagy_url_for(pagy.next, pagy)}" rel="next" aria-label="next" #{pagy.vars[:link_extra]} #{link_extra}>#{text}</a></span>) : %(<span class="page next disabled">#{text}</span>) end
def pagy_next_link_tag(pagy)
def pagy_next_link_tag(pagy) %(<link href="#{pagy_url_for(pagy.next, pagy)}" rel="next"/>) if pagy.next end
def pagy_next_url(pagy)
def pagy_next_url(pagy) pagy_url_for(pagy.next, pagy) if pagy.next end
def pagy_prev_link(pagy, text = pagy_t('pagy.nav.prev'), link_extra = '')
def pagy_prev_link(pagy, text = pagy_t('pagy.nav.prev'), link_extra = '') pagy.prev ? %(<span class="page prev"><a href="#{pagy_url_for(pagy.prev, pagy)}" rel="prev" aria-label="previous" #{pagy.vars[:link_extra]} #{link_extra}>#{text}</a></span>) : %(<span class="page prev disabled">#{text}</span>) end
def pagy_prev_link_tag(pagy)
def pagy_prev_link_tag(pagy) %(<link href="#{pagy_url_for(pagy.prev, pagy)}" rel="prev"/>) if pagy.prev end
def pagy_prev_url(pagy)
def pagy_prev_url(pagy) pagy_url_for(pagy.prev, pagy) if pagy.prev end
def pagy_semantic_combo_nav_js(pagy, id=pagy_id)
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
def pagy_semantic_nav(pagy)
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
def pagy_semantic_nav_js(pagy, id=pagy_id)
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(PAGE_PLACEHOLDER)}), '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
def pagy_t(path, vars={}) Pagy::I18n.t(@pagy_locale||=nil, path, vars) end
Similar to I18n.t: just ~18x faster using ~10x less memory
def pagy_t(path, vars={}) Pagy::I18n.t(@pagy_locale||=nil, path, vars) end
def pagy_t_with_i18n(*args) ::I18n.t(*args) end
def pagy_t_with_i18n(*args) ::I18n.t(*args) end
def pagy_uikit_combo_nav_js(pagy, id=pagy_id)
def pagy_uikit_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-uikit-combo-nav-js uk-button-group">) html = html + (p_prev ? link.call(p_prev, pagy_t('pagy.nav.prev'), 'class="uk-button uk-button-default"') : %(<button class="uk-button uk-button-default" disabled>#{pagy_t('pagy.nav.prev')}</button>)) html << %(<div class="uk-text-middle uk-margin-left uk-margin-right">) input = %(<input type="number" min="1" max="#{p_pages}" value="#{p_page}" class="uk-input" style="padding: 0; text-align: center; width: #{p_pages.to_s.length+1}rem;">) html << 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'), 'class="uk-button uk-button-default"') : %(<button class="uk-button uk-button-default" disabled>#{pagy_t('pagy.nav.next')}</button>)) html << %(</div>#{pagy_json_tag(:combo_nav, id, p_page, pagy_marked_link(link), defined?(TRIM) && pagy.vars[:page_param])}) end
def pagy_uikit_nav(pagy)
def pagy_uikit_nav(pagy) link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next previous_span = "<span uk-pagination-previous>#{pagy_t('pagy.nav.prev')}</span>" html = EMPTY + (p_prev ? %(<li>#{link.call p_prev, previous_span}</li>) : %(<li class="uk-disabled"><a href="#">#{previous_span}</a></li>)) pagy.series.each do |item| html << if item.is_a?(Integer); %(<li>#{link.call item}</li>) elsif item.is_a?(String) ; %(<li class="uk-active"><span>#{item}</span></li>) elsif item == :gap ; %(<li class="uk-disabled"><span>#{pagy_t('pagy.nav.gap')}</span></li>) end end next_span = "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>" html << (p_next ? %(<li>#{link.call p_next, next_span}</li>) : %(<li class="uk-disabled"><a href="#">#{next_span}</a></li>)) %(<ul class="pagy-uikit-nav uk-pagination uk-flex-center">#{html}</ul>) end
def pagy_uikit_nav_js(pagy, id=pagy_id)
def pagy_uikit_nav_js(pagy, id=pagy_id) link, p_prev, p_next = pagy_link_proc(pagy), pagy.prev, pagy.next previous_span = "<span uk-pagination-previous>#{pagy_t('pagy.nav.prev')}</span>" next_span = "<span uk-pagination-next>#{pagy_t('pagy.nav.next')}</span>" tags = { 'before' => p_prev ? %(<li>#{link.call p_prev, previous_span}</li>) : %(<li class="uk-disabled"><a href="#">#{previous_span}</a></li>), 'link' => %(<li>#{link.call(PAGE_PLACEHOLDER)}</li>), 'active' => %(<li class="uk-active"><span>#{PAGE_PLACEHOLDER}</span></li>), 'gap' => %(<li class="uk-disabled"><span>#{pagy_t('pagy.nav.gap')}</span></li>), 'after' => p_next ? %(<li>#{link.call p_next, next_span}</li>) : %(<li class="uk-disabled"><a href="#">#{next_span}</a></li>) } %(<ul id="#{id}" class="pagy-uikit-nav-js uk-pagination uk-flex-center"></ul>#{pagy_json_tag(:nav, id, tags, pagy.sequels, defined?(TRIM) && pagy.vars[:page_param])}) end
def pagy_url_for_with_items(page, pagy, url=false)
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