format :html do
PAGE_LI_CLASS = { ellipses: "disabled", current: "active" }.freeze
def with_paging path_args={}
with_paging_path_args path_args do
output [yield(@paging_path_args), render_paging]
end
end
view :paging, cache: :never, template: :haml
def paging_links
PagingLinks.new(total_pages, current_page).build do |text, page, status, options|
page_link_li text, page, status, options
end
end
# First page is 0 (not 1)
def page_link_li text, page, status, options={}
wrap_with :li, class: page_link_li_class(status) do
page_link text, page, options
end
end
def page_link_li_class status
["page-item", PAGE_LI_CLASS[status]].compact.join " "
end
def page_link text, page, options
return content_tag(:div, text.html_safe, class: "page-link") unless page
options.merge! class: "card-paging-link slotter page-link",
remote: true,
path: page_link_path_args(page)
link_to raw(text), options
end
def with_paging_path_args args
tmp = @paging_path_args
@paging_path_args = paging_path_args args
yield
ensure
@paging_path_args = tmp
end
def paging_path_args local_args={}
@paging_path_args ||= {}
@paging_path_args.reverse_merge!(limit: limit, offset: offset)
@paging_path_args.merge! extra_paging_path_args
@paging_path_args.merge local_args
end
def page_link_path_args page
paging_path_args.merge offset: page * limit
end
def paging_needed?
return false if limit < 1
return false if fewer_results_than_limit? # avoid extra count search
# count search result instead
limit < count_with_params
end
# clear we don't need paging even before running count query
def fewer_results_than_limit?
return false unless offset.zero?
limit > offset + search_with_params.length
end
end
format :json do
def page_link_path_args page
{
limit: limit,
offset: page * limit,
item: default_item_view, # hack. need standard voo handling
format: :json
}.merge extra_paging_path_args
end
view :paging_urls, cache: :never do
return {} unless total_pages > 1
{ paging: paging_urls_hash }
end
def paging_urls_hash
hash = {}
PagingLinks.new(total_pages, current_page).build do |_text, page, status, _options|
add_paging_url hash, page, status
end
hash
end
def add_paging_url hash, page, status
return unless page && status.in?(%i[next previous])
hash[status] = path page_link_path_args(page)
end
end