lib/active_admin/filters/resource_extension.rb
module ActiveAdmin module Filters module ResourceExtension def initialize(*) super add_filters_sidebar_section end # Returns the filters for this resource. If filters are not enabled, # it will always return an empty array. # # @return [Array] Filters that apply for this resource def filters return [] unless filters_enabled? if @filters.present? if preserve_default_filters? @filters + default_filters else @filters end else default_filters end end # Setter to enable / disable filters on this resource. # # Set to `nil` to inherit the setting from the namespace def filters=(bool) @filters_enabled = bool end # @return [Boolean] If filters are enabled for this resource def filters_enabled? @filters_enabled.nil? ? namespace.filters : @filters_enabled end def preserve_default_filters! @preserve_default_filters = true end def preserve_default_filters? @preserve_default_filters == true end # Remove a filter for this resource. If filters are not enabled, this method # will raise a RuntimeError # # @param [Symbol] attribute The attribute to not filter on def remove_filter(attribute) unless filters_enabled? raise RuntimeError, "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'" end @filters ||= default_filters @filters.delete_if { |f| f.fetch(:attribute) == attribute } end # Add a filter for this resource. If filters are not enabled, this method # will raise a RuntimeError # # @param [Symbol] attribute The attribute to filter on # @param [Hash] options The set of options that are passed through to # metasearch for the field definition. def add_filter(attribute, options = {}) unless filters_enabled? raise RuntimeError, "Can't add a filter when filters are disabled. Enable filters with 'config.filters = true'" end @filters ||= [] @filters << options.merge({ :attribute => attribute }) end # Reset the filters to use defaults def reset_filters! @filters = nil end private # @return [Array] The array of default for filters for this resource def default_filters default_association_filters + default_content_filters end # Returns a default set of filters for the associations def default_association_filters if resource_class.respond_to?(:reflections) resource_class.reflections.collect{|name, r| { :attribute => name }} else [] end end # Returns a default set of filters for the content columns def default_content_filters if resource_class.respond_to?(:content_columns) resource_class.content_columns.collect{|c| { :attribute => c.name.to_sym } } else [] end end def add_filters_sidebar_section self.sidebar_sections << filters_sidebar_section end def filters_sidebar_section ActiveAdmin::SidebarSection.new(:filters, :only => :index, :if => proc{ active_admin_config.filters.any? } ) do active_admin_filters_form_for assigns[:search], active_admin_config.filters end end end end end