CMDBrew/adminterface

View on GitHub
lib/adminterface/extensions/filters/forms.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
module Adminterface
  module Extensions
    module Filters
      module ViewHelper
        def active_admin_filters_form_for(search, filters, options = {})
          options = defaults.deep_merge(options).deep_merge(required)

          form_for search, options do |f|
            filters.each do |attribute, opts|
              next if opts.key?(:if) && !call_method_or_proc_on(self, opts[:if])
              next if opts.key?(:unless) && call_method_or_proc_on(self, opts[:unless])

              opts[:input_html] = instance_exec(&opts[:input_html]) if opts[:input_html].is_a?(Proc)
              f.filter attribute, opts.except(:if, :unless)
            end

            f.template.concat buttons(f)
          end
        end

        private

        def defaults
          {
            builder: ActiveAdmin::Filters::FormBuilder,
            url: collection_path,
            html: {class: "filter_form formtastic"}
          }
        end

        def required
          {
            html: {method: :get},
            as: :q
          }
        end

        def buttons(form)
          content_tag :fieldset, class: "actions" do
            content_tag :ol do
              wrap_button { submit_button(form) } +
                wrap_button { cancel_button } +
                hidden_field_tags_for(params, except: except_hidden_fields)
            end
          end
        end

        def wrap_button(&block)
          content_tag :li, &block
        end

        def submit_button(form)
          form.submit(I18n.t("active_admin.filters.buttons.filter"), class: submit_class)
        end

        def cancel_button
          link_to(I18n.t("active_admin.filters.buttons.clear"), "#",
            class: "#{cancel_class} clear_filters_btn")
        end

        def submit_class
          @submit_class ||= find_configs(:css_classes, :filters, :actions, :submit)
        end

        def cancel_class
          @cancel_class ||= find_configs(:css_classes, :filters, :actions, :cancel)
        end
      end
    end
  end
end

# Overwirte lib/active_admin/filters/forms.rb
ActiveAdmin::Filters::ViewHelper.module_eval do
  prepend Adminterface::Extensions::Filters::ViewHelper
end