activeadmin 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activeadmin might be problematic. Click here for more details.
- data/CHANGELOG.rdoc +15 -1
- data/Gemfile +41 -11
- data/LICENSE +5 -0
- data/README.rdoc +202 -87
- data/Rakefile +51 -15
- data/activeadmin.gemspec +310 -131
- data/cucumber.yml +1 -0
- data/features/comments/commenting.feature +81 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/formats.feature +10 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +128 -0
- data/features/specifying_actions.feature +16 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +7 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/support/env.rb +88 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin.rb +155 -79
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +4 -15
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +8 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +129 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments.rb +73 -0
- data/lib/active_admin/comments/comment.rb +15 -0
- data/lib/active_admin/comments/configuration.rb +16 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/dashboards.rb +0 -2
- data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
- data/lib/active_admin/dashboards/section.rb +5 -14
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +202 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +68 -50
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/namespace.rb +102 -16
- data/lib/active_admin/renderer.rb +18 -3
- data/lib/active_admin/resource.rb +110 -9
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource_controller.rb +45 -260
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +53 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +142 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +38 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +8 -47
- data/lib/active_admin/stylesheets/active_admin.scss +418 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/version.rb +1 -1
- data/lib/active_admin/view_factory.rb +21 -0
- data/lib/active_admin/view_helpers.rb +17 -100
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +174 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/status_tag_helper.rb +13 -0
- data/lib/active_admin/view_helpers/table_helper.rb +12 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/columns.rb +49 -0
- data/lib/active_admin/views/components/paginated_collection.rb +74 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +64 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/table_for.rb +174 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +73 -0
- data/lib/active_admin/views/pages/base.rb +138 -0
- data/lib/active_admin/views/pages/dashboard.rb +61 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +64 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +52 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin_dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
- data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
- data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
- data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
- data/lib/generators/active_admin/install/install_generator.rb +18 -3
- data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
- data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
- data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/integration/index_as_table_spec.rb +0 -119
- data/spec/integration/layout_spec.rb +3 -37
- data/spec/spec_helper.rb +89 -50
- data/spec/support/integration_example_group.rb +37 -0
- data/spec/support/rails_template.rb +21 -9
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +28 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +19 -7
- data/spec/unit/action_items_spec.rb +16 -30
- data/spec/unit/active_admin_spec.rb +10 -22
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +185 -0
- data/spec/unit/auto_link_spec.rb +38 -0
- data/spec/unit/belongs_to_spec.rb +44 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +53 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +10 -17
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +99 -77
- data/spec/unit/form_builder_spec.rb +69 -69
- data/spec/unit/namespace_spec.rb +61 -3
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +40 -1
- data/spec/unit/renderer_spec.rb +8 -0
- data/spec/unit/resource_controller_spec.rb +105 -6
- data/spec/unit/resource_spec.rb +78 -11
- data/spec/unit/routing_spec.rb +82 -6
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +24 -2
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +268 -82
- data/.gitignore +0 -25
- data/active_admin.gemspec +0 -22
- data/lib/active_admin/action_builder.rb +0 -60
- data/lib/active_admin/breadcrumbs.rb +0 -26
- data/lib/active_admin/dashboards/renderer.rb +0 -45
- data/lib/active_admin/dashboards/section_renderer.rb +0 -28
- data/lib/active_admin/filters.rb +0 -189
- data/lib/active_admin/pages.rb +0 -11
- data/lib/active_admin/pages/base.rb +0 -92
- data/lib/active_admin/pages/edit.rb +0 -21
- data/lib/active_admin/pages/index.rb +0 -58
- data/lib/active_admin/pages/index/blog.rb +0 -65
- data/lib/active_admin/pages/index/table.rb +0 -48
- data/lib/active_admin/pages/index/thumbnails.rb +0 -40
- data/lib/active_admin/pages/new.rb +0 -21
- data/lib/active_admin/pages/show.rb +0 -54
- data/lib/active_admin/table_builder.rb +0 -162
- data/lib/active_admin/tabs_renderer.rb +0 -39
- data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
- data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
- data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
- data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
- data/spec/integration/index_as_blog_spec.rb +0 -65
- data/spec/integration/index_as_thumbnails_spec.rb +0 -43
- data/spec/integration/new_view_spec.rb +0 -52
- data/spec/integration/show_view_spec.rb +0 -91
- data/spec/unit/sidebar_spec.rb +0 -96
- data/spec/unit/table_builder_spec.rb +0 -162
@@ -0,0 +1,41 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module AutoLinkHelper
|
4
|
+
|
5
|
+
# Automatically links objects to their resource controllers. If
|
6
|
+
# the resource has not been registered, a string representation of
|
7
|
+
# the object is returned.
|
8
|
+
#
|
9
|
+
# The default content in the link is returned from ActiveAdmin::ViewHelpers::DisplayHelper#display_name
|
10
|
+
#
|
11
|
+
# You can pass in the content to display
|
12
|
+
# eg: auto_link(@post, "My Link Content")
|
13
|
+
#
|
14
|
+
def auto_link(resource, link_content = nil)
|
15
|
+
content = link_content || display_name(resource)
|
16
|
+
if registration = active_admin_resource_for(resource.class)
|
17
|
+
begin
|
18
|
+
content = link_to(content, send(registration.route_instance_path, resource))
|
19
|
+
rescue
|
20
|
+
end
|
21
|
+
end
|
22
|
+
content
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns the ActiveAdmin::Resource instance for a class
|
26
|
+
def active_admin_resource_for(klass)
|
27
|
+
active_admin_namespace.resource_for(klass)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the current Active Admin namespace
|
31
|
+
def active_admin_namespace
|
32
|
+
if respond_to?(:active_admin_config) && active_admin_config
|
33
|
+
active_admin_config.namespace
|
34
|
+
else
|
35
|
+
ActiveAdmin::Namespace.new(ActiveAdmin.default_namespace)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module BreadcrumbHelper
|
4
|
+
|
5
|
+
# Returns an array of links to use in a breadcrumb
|
6
|
+
def breadcrumb_links(path = nil)
|
7
|
+
path ||= request.fullpath
|
8
|
+
parts = path.gsub(/^\//, '').split('/')
|
9
|
+
parts.pop unless %w{ create update }.include?(params[:action])
|
10
|
+
crumbs = []
|
11
|
+
parts.each_with_index do |part, index|
|
12
|
+
name = ""
|
13
|
+
if part =~ /^\d/ && parent = parts[index - 1]
|
14
|
+
begin
|
15
|
+
parent_class = parent.singularize.camelcase.constantize
|
16
|
+
obj = parent_class.find(part.to_i)
|
17
|
+
name = obj.display_name if obj.respond_to?(:display_name)
|
18
|
+
rescue
|
19
|
+
end
|
20
|
+
end
|
21
|
+
name = part.titlecase if name == ""
|
22
|
+
crumbs << link_to(name, "/" + parts[0..index].join('/'))
|
23
|
+
end
|
24
|
+
crumbs
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module DisplayHelper
|
4
|
+
|
5
|
+
def display_name_method_for(resource)
|
6
|
+
@@display_name_methods_cache ||= {}
|
7
|
+
@@display_name_methods_cache[resource.class] ||=
|
8
|
+
ActiveAdmin.display_name_methods.find{|method| resource.respond_to? method }
|
9
|
+
end
|
10
|
+
|
11
|
+
# Tries to display an object with as friendly of output
|
12
|
+
# as possible.
|
13
|
+
def display_name(resource)
|
14
|
+
resource.send(display_name_method_for(resource))
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return a pretty string for any object
|
18
|
+
# Date Time are formatted via #localize with :format => :long
|
19
|
+
# ActiveRecord objects are formatted via #auto_link
|
20
|
+
# We attempt to #display_name of any other objects
|
21
|
+
def pretty_format(object)
|
22
|
+
case object
|
23
|
+
when String
|
24
|
+
object
|
25
|
+
when Arbre::HTML::Element
|
26
|
+
object
|
27
|
+
when Date, Time
|
28
|
+
localize(object, :format => :long)
|
29
|
+
when ActiveRecord::Base
|
30
|
+
auto_link(object)
|
31
|
+
else
|
32
|
+
display_name(object)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
|
3
|
+
module ViewHelpers
|
4
|
+
module FilterFormHelper
|
5
|
+
|
6
|
+
# Helper method to render a filter form
|
7
|
+
def active_admin_filters_form_for(search, filters, options = {})
|
8
|
+
options[:builder] ||= ActiveAdmin::FilterFormBuilder
|
9
|
+
options[:url] ||= collection_path
|
10
|
+
options[:html] ||= {}
|
11
|
+
options[:html][:method] = :get
|
12
|
+
options[:as] = :q
|
13
|
+
clear_link = link_to("Clear Filters", "#", :class => "clear_filters_btn")
|
14
|
+
form_for search, options do |f|
|
15
|
+
filters.each do |filter_options|
|
16
|
+
filter_options = filter_options.dup
|
17
|
+
attribute = filter_options.delete(:attribute)
|
18
|
+
f.filter attribute, filter_options
|
19
|
+
end
|
20
|
+
|
21
|
+
buttons = content_tag :div, :class => "buttons" do
|
22
|
+
f.submit("Filter") +
|
23
|
+
clear_link +
|
24
|
+
hidden_field_tag("order", params[:order]) +
|
25
|
+
hidden_field_tag("scope", params[:scope])
|
26
|
+
end
|
27
|
+
|
28
|
+
f.form_buffers.last + buttons
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# This form builder defines methods to build filter forms such
|
36
|
+
# as the one found in the sidebar of the index page of a standard resource.
|
37
|
+
class FilterFormBuilder < FormBuilder
|
38
|
+
|
39
|
+
def filter(method, options = {})
|
40
|
+
return "" if method.nil? || method == ""
|
41
|
+
options[:as] ||= default_filter_type(method)
|
42
|
+
return "" unless options[:as]
|
43
|
+
field_type = options.delete(:as)
|
44
|
+
content = with_new_form_buffer do
|
45
|
+
send("filter_#{field_type}_input", method, options)
|
46
|
+
end
|
47
|
+
@form_buffers.last << template.content_tag(:div, content, :class => "filter_form_field filter_#{field_type}")
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
|
52
|
+
def filter_string_input(method, options = {})
|
53
|
+
field_name = "#{method}_contains"
|
54
|
+
|
55
|
+
[ label(field_name, "Search #{method.to_s.titlecase}"),
|
56
|
+
text_field(field_name)
|
57
|
+
].join("\n").html_safe
|
58
|
+
end
|
59
|
+
|
60
|
+
def filter_date_range_input(method, options = {})
|
61
|
+
gt_field_name = "#{method}_gte"
|
62
|
+
lt_field_name = "#{method}_lte"
|
63
|
+
|
64
|
+
[ label(gt_field_name, method.to_s.titlecase),
|
65
|
+
filter_date_text_field(gt_field_name),
|
66
|
+
" - ",
|
67
|
+
filter_date_text_field(lt_field_name)
|
68
|
+
].join("\n").html_safe
|
69
|
+
end
|
70
|
+
|
71
|
+
def filter_date_text_field(method)
|
72
|
+
current_value = @object.send(method)
|
73
|
+
text_field(method, :size => 12, :class => "datepicker", :max => 10, :value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "")
|
74
|
+
end
|
75
|
+
|
76
|
+
def filter_numeric_input(method, options = {})
|
77
|
+
filters = numeric_filters_for_method(method, options.delete(:filters) || default_numeric_filters)
|
78
|
+
current_filter = current_numeric_scope(filters)
|
79
|
+
filter_select = @template.select_tag '', @template.options_for_select(filters, current_filter),
|
80
|
+
:onchange => "document.getElementById('#{method}_numeric').name = 'q[' + this.value + ']';"
|
81
|
+
filter_input = text_field current_filter, :size => 10, :id => "#{method}_numeric"
|
82
|
+
|
83
|
+
[ label(method),
|
84
|
+
filter_select,
|
85
|
+
" ",
|
86
|
+
filter_input
|
87
|
+
].join("\n").html_safe
|
88
|
+
end
|
89
|
+
|
90
|
+
def numeric_filters_for_method(method, filters)
|
91
|
+
filters.collect{|scope| [scope[0], [method,scope[1]].join("_") ] }
|
92
|
+
end
|
93
|
+
|
94
|
+
# Returns the scope for which we are currently searching. If no search is available
|
95
|
+
# it returns the first scope
|
96
|
+
def current_numeric_scope(filters)
|
97
|
+
filters[1..-1].inject(filters.first){|a,b| object.send(b[1].to_sym) ? b : a }[1]
|
98
|
+
end
|
99
|
+
|
100
|
+
def default_numeric_filters
|
101
|
+
[['Equal To', 'eq'], ['Greater Than', 'gt'], ['Less Than', 'lt']]
|
102
|
+
end
|
103
|
+
|
104
|
+
def filter_select_input(method, options = {})
|
105
|
+
association_name = method.to_s.gsub(/_id$/, '').to_sym
|
106
|
+
input_name = (generate_association_input_name(method).to_s + "_eq").to_sym
|
107
|
+
collection = find_collection_for_column(association_name, options)
|
108
|
+
|
109
|
+
[ label(input_name, method.to_s.titlecase),
|
110
|
+
select(input_name, collection, options.merge(:include_blank => 'Any'))
|
111
|
+
].join("\n").html_safe
|
112
|
+
end
|
113
|
+
|
114
|
+
def filter_check_boxes_input(method, options = {})
|
115
|
+
input_name = (generate_association_input_name(method).to_s + "_in").to_sym
|
116
|
+
collection = find_collection_for_column(method, options)
|
117
|
+
selected_values = @object.send(input_name) || []
|
118
|
+
checkboxes = template.content_tag :div, :class => "check_boxes_wrapper" do
|
119
|
+
collection.map do |c|
|
120
|
+
label = c.is_a?(Array) ? c.first : c
|
121
|
+
value = c.is_a?(Array) ? c.last : c
|
122
|
+
"<label><input type=\"checkbox\" name=\"q[#{input_name}][]\" value=\"#{value}\" #{selected_values.include?(value) ? "checked" : ""}/> #{label}</label>"
|
123
|
+
end.join("\n").html_safe
|
124
|
+
end
|
125
|
+
|
126
|
+
[ label(input_name, method.to_s.titlecase),
|
127
|
+
checkboxes
|
128
|
+
].join("\n").html_safe
|
129
|
+
end
|
130
|
+
|
131
|
+
# Override the standard finder to accept a proc
|
132
|
+
def find_collection_for_column(method, options = {})
|
133
|
+
options = options.dup
|
134
|
+
case options[:collection]
|
135
|
+
when Proc
|
136
|
+
options[:collection] = options[:collection].call
|
137
|
+
end
|
138
|
+
super(method, options)
|
139
|
+
end
|
140
|
+
|
141
|
+
# Returns the default filter type for a given attribute
|
142
|
+
def default_filter_type(method)
|
143
|
+
if column = column_for(method)
|
144
|
+
case column.type
|
145
|
+
when :date, :datetime
|
146
|
+
return :date_range
|
147
|
+
when :string, :text
|
148
|
+
return :string
|
149
|
+
when :integer
|
150
|
+
return :select if reflection_for(method.to_s.gsub('_id','').to_sym)
|
151
|
+
return :numeric
|
152
|
+
when :float, :decimal
|
153
|
+
return :numeric
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
if reflection = reflection_for(method)
|
158
|
+
return :select if reflection.macro == :belongs_to && reflection.collection?
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Returns the column for an attribute on the object being searched
|
163
|
+
# if it exists. Otherwise returns nil
|
164
|
+
def column_for(method)
|
165
|
+
@object.base.columns_hash[method.to_s] if @object.base.respond_to?(:columns_hash)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Returns the association reflection for the method if it exists
|
169
|
+
def reflection_for(method)
|
170
|
+
@object.base.reflect_on_association(method) if @object.base.respond_to?(:reflect_on_association)
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MethodOrProcHelper
|
2
|
+
|
3
|
+
# Many times throughout the views we want to either call a method on an object
|
4
|
+
# or instance_exec a proc passing in the object as the first parameter. This
|
5
|
+
# method takes care of this functionality.
|
6
|
+
#
|
7
|
+
# call_method_or_proc_on(@my_obj, :size) same as @my_obj.size
|
8
|
+
# OR
|
9
|
+
# proc = Proc.new{|s| s.size }
|
10
|
+
# call_method_or_proc_on(@my_obj, proc)
|
11
|
+
#
|
12
|
+
def call_method_or_proc_on(obj, symbol_or_proc, options = {})
|
13
|
+
exec = options[:exec].nil? ? true : options[:exec]
|
14
|
+
case symbol_or_proc
|
15
|
+
when Symbol, String
|
16
|
+
obj.send(symbol_or_proc.to_sym)
|
17
|
+
when Proc
|
18
|
+
if exec
|
19
|
+
instance_exec(obj, &symbol_or_proc)
|
20
|
+
else
|
21
|
+
symbol_or_proc.call(obj)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module RendererHelper
|
4
|
+
|
5
|
+
# Adds the ability to render ActiveAdmin::Renderers using the
|
6
|
+
# standard render method.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
#
|
10
|
+
# render MyRendererClass, "Arg1", "Arg2"
|
11
|
+
#
|
12
|
+
# which is the same as doing
|
13
|
+
#
|
14
|
+
# MyRendererClass.new(self).to_html("Arg1", "Arg2")
|
15
|
+
def render(*args)
|
16
|
+
if args[0].is_a?(Class) && args[0].ancestors.include?(ActiveAdmin::Renderer)
|
17
|
+
renderer = args.shift
|
18
|
+
renderer.new(self).to_html(*args)
|
19
|
+
elsif args[0].is_a?(Class) && args[0].ancestors.include?(Arbre::HTML::Tag)
|
20
|
+
tag_class = args.shift
|
21
|
+
insert_tag tag_class, *args
|
22
|
+
else
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module StatusTagHelper
|
4
|
+
|
5
|
+
def status_tag(status, options = {})
|
6
|
+
options[:class] ||= ""
|
7
|
+
options[:class] << ["status", status.downcase].join(' ')
|
8
|
+
content_tag :span, status, options
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module ViewHelpers
|
3
|
+
module TableHelper
|
4
|
+
|
5
|
+
# Helper to render a table for a collection
|
6
|
+
def table_for(collection, options = {}, &block)
|
7
|
+
ActiveAdmin::TableBuilder.new(&block).to_html(self, collection, options)
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|