lib/active_admin/views/components/paginated_collection.rb in activeadmin-0.3.4 vs lib/active_admin/views/components/paginated_collection.rb in activeadmin-0.4.0
- old
+ new
@@ -21,23 +21,33 @@
# It will also generate pagination links.
#
class PaginatedCollection < ActiveAdmin::Component
builder_method :paginated_collection
+ attr_reader :collection
# Builds a new paginated collection component
#
# @param [Array] collection A "paginated" collection from kaminari
# @param [Hash] options These options will be passed on to the page_entries_info
# method.
# Useful keys:
- # :entry_name - The name to display for this resource collection
+ # :entry_name - The name to display for this resource collection
+ # :param_name - Parameter name for page number in the links (:page by default)
+ # :download_links - Set to false to skip download format links
def build(collection, options = {})
@collection = collection
- div(page_entries_info(options).html_safe, :class => "pagination_information")
+ @param_name = options.delete(:param_name)
+ @download_links = options.delete(:download_links)
+
+ unless collection.respond_to?(:num_pages)
+ raise(StandardError, "Collection is not a paginated scope. Set collection.page(params[:page]).per(10) before calling :paginated_collection.")
+ end
+
+
@contents = div(:class => "paginated_collection_contents")
- build_pagination_with_formats
+ build_pagination_with_formats(options)
@built = true
end
# Override add_child to insert all children into the @contents div
def add_child(*args, &block)
@@ -48,43 +58,62 @@
end
end
protected
- def build_pagination_with_formats
+ def build_pagination_with_formats(options)
div :id => "index_footer" do
- build_download_format_links
build_pagination
+ div(page_entries_info(options).html_safe, :class => "pagination_information")
+ build_download_format_links unless @download_links == false
end
end
def build_pagination
- text_node paginate(collection)
+ options = request.query_parameters.except(:commit, :format)
+ options[:param_name] = @param_name if @param_name
+
+ text_node paginate(collection, options.symbolize_keys)
end
# TODO: Refactor to new HTML DSL
def build_download_format_links(formats = [:csv, :xml, :json])
links = formats.collect do |format|
link_to format.to_s.upcase, { :format => format}.merge(request.query_parameters.except(:commit, :format))
end
- text_node [I18n.t('active_admin.download'), links].flatten.join(" ").html_safe
+ div :class => "download_links" do
+ text_node [I18n.t('active_admin.download'), links].flatten.join(" ").html_safe
+ end
end
# modified from will_paginate
def page_entries_info(options = {})
- entry_name = options[:entry_name] ||
- (collection.empty?? 'entry' : collection.first.class.name.underscore.sub('_', ' '))
+ if options[:entry_name]
+ entry_name = options[:entry_name]
+ entries_name = options[:entries_name]
+ elsif collection.empty?
+ entry_name = I18n.translate("active_admin.pagination.entry", :count => 1, :default => 'entry')
+ entries_name = I18n.translate("active_admin.pagination.entry", :count => 2, :default => 'entries')
+ else
+ begin
+ entry_name = I18n.translate!("activerecord.models.#{collection.first.class.model_name.i18n_key}", :count => 1)
+ entries_name = I18n.translate!("activerecord.models.#{collection.first.class.model_name.i18n_key}", :count => collection.size)
+ rescue I18n::MissingTranslationData
+ entry_name = collection.first.class.name.underscore.sub('_', ' ')
+ end
+ end
+ entries_name = entry_name.pluralize unless entries_name
if collection.num_pages < 2
case collection.size
- when 0; I18n.t('active_admin.pagination.empty', :model => entry_name.pluralize)
+ when 0; I18n.t('active_admin.pagination.empty', :model => entries_name)
when 1; I18n.t('active_admin.pagination.one', :model => entry_name)
- else; I18n.t('active_admin.pagination.one_page', :model => entry_name.pluralize, :n => collection.size)
+ else; I18n.t('active_admin.pagination.one_page', :model => entries_name, :n => collection.total_count)
end
else
- offset = collection.current_page * active_admin_application.default_per_page
+ offset = collection.current_page * collection.size
total = collection.total_count
- I18n.t('active_admin.pagination.multiple', :model => entry_name.pluralize, :from => (offset - active_admin_application.default_per_page + 1), :to => offset > total ? total : offset, :total => total)
+ I18n.t('active_admin.pagination.multiple', :model => entries_name, :from => (offset - collection.size + 1), :to => offset > total ? total : offset, :total => total)
end
end
end
end