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.

Files changed (255) hide show
  1. data/CHANGELOG.rdoc +15 -1
  2. data/Gemfile +41 -11
  3. data/LICENSE +5 -0
  4. data/README.rdoc +202 -87
  5. data/Rakefile +51 -15
  6. data/activeadmin.gemspec +310 -131
  7. data/cucumber.yml +1 -0
  8. data/features/comments/commenting.feature +81 -0
  9. data/features/comments/viewing_index.feature +19 -0
  10. data/features/edit_page.feature +77 -0
  11. data/features/first_boot.feature +16 -0
  12. data/features/global_navigation.feature +30 -0
  13. data/features/index/formats.feature +10 -0
  14. data/features/index/index_as_block.feature +15 -0
  15. data/features/index/index_as_blog.feature +50 -0
  16. data/features/index/index_as_grid.feature +45 -0
  17. data/features/index/index_as_table.feature +79 -0
  18. data/features/index/index_scopes.feature +52 -0
  19. data/features/index/pagination.feature +23 -0
  20. data/features/new_page.feature +75 -0
  21. data/features/registering_assets.feature +35 -0
  22. data/features/registering_resources.feature +33 -0
  23. data/features/show/default_content.feature +43 -0
  24. data/features/show/page_title.feature +33 -0
  25. data/features/sidebar_sections.feature +128 -0
  26. data/features/specifying_actions.feature +16 -0
  27. data/features/step_definitions/action_item_steps.rb +7 -0
  28. data/features/step_definitions/additional_web_steps.rb +67 -0
  29. data/features/step_definitions/asset_steps.rb +7 -0
  30. data/features/step_definitions/attribute_steps.rb +15 -0
  31. data/features/step_definitions/comment_steps.rb +8 -0
  32. data/features/step_definitions/configuration_steps.rb +31 -0
  33. data/features/step_definitions/factory_steps.rb +28 -0
  34. data/features/step_definitions/flash_steps.rb +3 -0
  35. data/features/step_definitions/format_steps.rb +7 -0
  36. data/features/step_definitions/index_scope_steps.rb +20 -0
  37. data/features/step_definitions/pagination_steps.rb +8 -0
  38. data/features/step_definitions/sidebar_steps.rb +11 -0
  39. data/features/step_definitions/tab_steps.rb +3 -0
  40. data/features/step_definitions/user_steps.rb +20 -0
  41. data/features/step_definitions/web_steps.rb +219 -0
  42. data/features/support/env.rb +88 -0
  43. data/features/support/paths.rb +48 -0
  44. data/features/users/logging_in.feature +34 -0
  45. data/features/users/logging_out.feature +13 -0
  46. data/lib/active_admin.rb +155 -79
  47. data/lib/active_admin/abstract_view_factory.rb +95 -0
  48. data/lib/active_admin/action_items.rb +4 -15
  49. data/lib/active_admin/arbre.rb +23 -0
  50. data/lib/active_admin/arbre/attributes.rb +20 -0
  51. data/lib/active_admin/arbre/class_list.rb +28 -0
  52. data/lib/active_admin/arbre/collection.rb +27 -0
  53. data/lib/active_admin/arbre/context.rb +8 -0
  54. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  55. data/lib/active_admin/arbre/document.rb +42 -0
  56. data/lib/active_admin/arbre/element.rb +151 -0
  57. data/lib/active_admin/arbre/html.rb +84 -0
  58. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  59. data/lib/active_admin/arbre/tag.rb +129 -0
  60. data/lib/active_admin/arbre/text_node.rb +35 -0
  61. data/lib/active_admin/callbacks.rb +87 -0
  62. data/lib/active_admin/comments.rb +73 -0
  63. data/lib/active_admin/comments/comment.rb +15 -0
  64. data/lib/active_admin/comments/configuration.rb +16 -0
  65. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  66. data/lib/active_admin/comments/resource_helper.rb +17 -0
  67. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  68. data/lib/active_admin/comments/views.rb +3 -0
  69. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  70. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  71. data/lib/active_admin/component.rb +22 -0
  72. data/lib/active_admin/controller_action.rb +12 -0
  73. data/lib/active_admin/dashboards.rb +0 -2
  74. data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
  75. data/lib/active_admin/dashboards/section.rb +5 -14
  76. data/lib/active_admin/devise.rb +43 -0
  77. data/lib/active_admin/dsl.rb +202 -0
  78. data/lib/active_admin/event.rb +31 -0
  79. data/lib/active_admin/form_builder.rb +68 -50
  80. data/lib/active_admin/iconic.rb +51 -0
  81. data/lib/active_admin/iconic/icons.rb +142 -0
  82. data/lib/active_admin/namespace.rb +102 -16
  83. data/lib/active_admin/renderer.rb +18 -3
  84. data/lib/active_admin/resource.rb +110 -9
  85. data/lib/active_admin/resource/belongs_to.rb +31 -0
  86. data/lib/active_admin/resource_controller.rb +45 -260
  87. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  88. data/lib/active_admin/resource_controller/actions.rb +53 -0
  89. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  90. data/lib/active_admin/resource_controller/collection.rb +142 -0
  91. data/lib/active_admin/resource_controller/filters.rb +58 -0
  92. data/lib/active_admin/resource_controller/form.rb +42 -0
  93. data/lib/active_admin/resource_controller/menu.rb +29 -0
  94. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  95. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  96. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  97. data/lib/active_admin/scope.rb +17 -0
  98. data/lib/active_admin/sidebar.rb +8 -47
  99. data/lib/active_admin/stylesheets/active_admin.scss +418 -0
  100. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  101. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  102. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  103. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  104. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  105. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  106. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  107. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  108. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  109. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  110. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  111. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  112. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  113. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  114. data/lib/active_admin/version.rb +1 -1
  115. data/lib/active_admin/view_factory.rb +21 -0
  116. data/lib/active_admin/view_helpers.rb +17 -100
  117. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  118. data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -0
  119. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  120. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  121. data/lib/active_admin/view_helpers/filter_form_helper.rb +174 -0
  122. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  123. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  124. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  125. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  126. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  127. data/lib/active_admin/view_helpers/status_tag_helper.rb +13 -0
  128. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  129. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  130. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  131. data/lib/active_admin/views.rb +8 -0
  132. data/lib/active_admin/views/action_items.rb +17 -0
  133. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  134. data/lib/active_admin/views/components/columns.rb +49 -0
  135. data/lib/active_admin/views/components/paginated_collection.rb +74 -0
  136. data/lib/active_admin/views/components/panel.rb +26 -0
  137. data/lib/active_admin/views/components/scopes.rb +64 -0
  138. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  139. data/lib/active_admin/views/components/table_for.rb +174 -0
  140. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  141. data/lib/active_admin/views/header_renderer.rb +37 -0
  142. data/lib/active_admin/views/index_as_block.rb +24 -0
  143. data/lib/active_admin/views/index_as_blog.rb +89 -0
  144. data/lib/active_admin/views/index_as_grid.rb +49 -0
  145. data/lib/active_admin/views/index_as_table.rb +73 -0
  146. data/lib/active_admin/views/pages/base.rb +138 -0
  147. data/lib/active_admin/views/pages/dashboard.rb +61 -0
  148. data/lib/active_admin/views/pages/edit.rb +27 -0
  149. data/lib/active_admin/views/pages/index.rb +64 -0
  150. data/lib/active_admin/views/pages/new.rb +27 -0
  151. data/lib/active_admin/views/pages/show.rb +56 -0
  152. data/lib/active_admin/views/tabs_renderer.rb +52 -0
  153. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  154. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  155. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  156. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  157. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  158. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  159. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  160. data/lib/active_admin/views/templates/active_admin_dashboard/index.html.arb +1 -0
  161. data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
  162. data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
  163. data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
  164. data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
  165. data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
  166. data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
  167. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  168. data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
  169. data/lib/generators/active_admin/install/install_generator.rb +18 -3
  170. data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
  171. data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
  172. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
  173. data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
  174. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  175. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  176. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  177. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  178. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  179. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  180. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  181. data/spec/integration/belongs_to_spec.rb +42 -0
  182. data/spec/integration/index_as_table_spec.rb +0 -119
  183. data/spec/integration/layout_spec.rb +3 -37
  184. data/spec/spec_helper.rb +89 -50
  185. data/spec/support/integration_example_group.rb +37 -0
  186. data/spec/support/rails_template.rb +21 -9
  187. data/spec/support/rails_template_with_data.rb +32 -0
  188. data/spec/support/templates/cucumber.rb +28 -0
  189. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  190. data/spec/unit/action_builder_spec.rb +19 -7
  191. data/spec/unit/action_items_spec.rb +16 -30
  192. data/spec/unit/active_admin_spec.rb +10 -22
  193. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  194. data/spec/unit/arbre/html/element_spec.rb +224 -0
  195. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  196. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  197. data/spec/unit/arbre/html_spec.rb +185 -0
  198. data/spec/unit/auto_link_spec.rb +38 -0
  199. data/spec/unit/belongs_to_spec.rb +44 -0
  200. data/spec/unit/breadcrumbs_spec.rb +110 -0
  201. data/spec/unit/comments_spec.rb +53 -0
  202. data/spec/unit/component_spec.rb +18 -0
  203. data/spec/unit/components/attributes_table_spec.rb +100 -0
  204. data/spec/unit/components/columns_spec.rb +75 -0
  205. data/spec/unit/components/panel_spec.rb +31 -0
  206. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  207. data/spec/unit/components/table_for_spec.rb +130 -0
  208. data/spec/unit/dashboard_controller_spec.rb +26 -0
  209. data/spec/unit/dashboard_section_spec.rb +10 -17
  210. data/spec/unit/display_name_spec.rb +29 -0
  211. data/spec/unit/event_spec.rb +41 -0
  212. data/spec/unit/filter_form_builder_spec.rb +99 -77
  213. data/spec/unit/form_builder_spec.rb +69 -69
  214. data/spec/unit/namespace_spec.rb +61 -3
  215. data/spec/unit/pretty_format_spec.rb +35 -0
  216. data/spec/unit/registration_spec.rb +40 -1
  217. data/spec/unit/renderer_spec.rb +8 -0
  218. data/spec/unit/resource_controller_spec.rb +105 -6
  219. data/spec/unit/resource_spec.rb +78 -11
  220. data/spec/unit/routing_spec.rb +82 -6
  221. data/spec/unit/scope_spec.rb +31 -0
  222. data/spec/unit/tabs_renderer_spec.rb +24 -2
  223. data/spec/unit/view_factory_spec.rb +16 -0
  224. metadata +268 -82
  225. data/.gitignore +0 -25
  226. data/active_admin.gemspec +0 -22
  227. data/lib/active_admin/action_builder.rb +0 -60
  228. data/lib/active_admin/breadcrumbs.rb +0 -26
  229. data/lib/active_admin/dashboards/renderer.rb +0 -45
  230. data/lib/active_admin/dashboards/section_renderer.rb +0 -28
  231. data/lib/active_admin/filters.rb +0 -189
  232. data/lib/active_admin/pages.rb +0 -11
  233. data/lib/active_admin/pages/base.rb +0 -92
  234. data/lib/active_admin/pages/edit.rb +0 -21
  235. data/lib/active_admin/pages/index.rb +0 -58
  236. data/lib/active_admin/pages/index/blog.rb +0 -65
  237. data/lib/active_admin/pages/index/table.rb +0 -48
  238. data/lib/active_admin/pages/index/thumbnails.rb +0 -40
  239. data/lib/active_admin/pages/new.rb +0 -21
  240. data/lib/active_admin/pages/show.rb +0 -54
  241. data/lib/active_admin/table_builder.rb +0 -162
  242. data/lib/active_admin/tabs_renderer.rb +0 -39
  243. data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
  244. data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
  245. data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
  246. data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
  247. data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
  248. data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
  249. data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
  250. data/spec/integration/index_as_blog_spec.rb +0 -65
  251. data/spec/integration/index_as_thumbnails_spec.rb +0 -43
  252. data/spec/integration/new_view_spec.rb +0 -52
  253. data/spec/integration/show_view_spec.rb +0 -91
  254. data/spec/unit/sidebar_spec.rb +0 -96
  255. data/spec/unit/table_builder_spec.rb +0 -162
@@ -0,0 +1,7 @@
1
+ module AssignsWithIndifferentAccessHelper
2
+
3
+ def assigns
4
+ @assigns_with_indifferent_access_helper ||= HashWithIndifferentAccess.new(super)
5
+ end
6
+
7
+ end
@@ -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,12 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module FormHelper
4
+
5
+ def active_admin_form_for(resource, options = {}, &block)
6
+ options[:builder] ||= ActiveAdmin::FormBuilder
7
+ semantic_form_for resource, options, &block
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module IconHelper
4
+
5
+ # Render an icon from the Iconic icon set
6
+ def icon(*args)
7
+ ActiveAdmin::Iconic.icon(*args)
8
+ end
9
+
10
+ end
11
+ end
12
+ 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,15 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module SidebarHelper
4
+
5
+ def skip_sidebar!
6
+ @skip_sidebar = true
7
+ end
8
+
9
+ def skip_sidebar?
10
+ @skip_sidebar == true
11
+ end
12
+
13
+ end
14
+ end
15
+ 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
@@ -0,0 +1,11 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module TitleHelper
4
+
5
+ def title(_title)
6
+ @page_title = _title
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module ViewFactoryHelper
4
+
5
+ def view_factory
6
+ ActiveAdmin.view_factory
7
+ end
8
+
9
+ end
10
+ end
11
+ end