saulolso-activeadmin 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. metadata +482 -0
@@ -0,0 +1,21 @@
1
+ require 'active_admin/abstract_view_factory'
2
+
3
+ module ActiveAdmin
4
+ class ViewFactory < AbstractViewFactory
5
+
6
+ # Register Helper Renderers
7
+ register :global_navigation => ActiveAdmin::Views::TabsRenderer,
8
+ :action_items => ActiveAdmin::Views::ActionItems,
9
+ :header => ActiveAdmin::Views::HeaderRenderer,
10
+ :dashboard_section => ActiveAdmin::Views::DashboardSection,
11
+ :index_scopes => ActiveAdmin::Views::Scopes
12
+
13
+ # Register All The Pages
14
+ register :dashboard_page => ActiveAdmin::Views::Pages::Dashboard,
15
+ :index_page => ActiveAdmin::Views::Pages::Index,
16
+ :show_page => ActiveAdmin::Views::Pages::Show,
17
+ :new_page => ActiveAdmin::Views::Pages::New,
18
+ :edit_page => ActiveAdmin::Views::Pages::Edit
19
+
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module ActiveAdminApplicationHelper
4
+
5
+ # Returns the current Active Admin application instance
6
+ def active_admin_application
7
+ ActiveAdmin.application
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -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,42 @@
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
+ # Return a default namespace if none exists
36
+ active_admin_application.find_or_create_namespace(active_admin_application.default_namespace)
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ 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
+ active_admin_application.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,185 @@
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(I18n.t('active_admin.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(I18n.t('active_admin.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
+ options[:label] ||= default_filter_label(method)
45
+ content = with_new_form_buffer do
46
+ send("filter_#{field_type}_input", method, options)
47
+ end
48
+ @form_buffers.last << template.content_tag(:div, content, :class => "filter_form_field filter_#{field_type}")
49
+ end
50
+
51
+ protected
52
+
53
+ def filter_string_input(method, options = {})
54
+ field_name = "#{method}_contains"
55
+
56
+ [ label(field_name, I18n.t('active_admin.search_field', :field => options[:label])),
57
+ text_field(field_name)
58
+ ].join("\n").html_safe
59
+ end
60
+
61
+ def filter_date_range_input(method, options = {})
62
+ gt_field_name = "#{method}_gte"
63
+ lt_field_name = "#{method}_lte"
64
+
65
+ [ label(gt_field_name, options[:label]),
66
+ filter_date_text_field(gt_field_name),
67
+ " - ",
68
+ filter_date_text_field(lt_field_name)
69
+ ].join("\n").html_safe
70
+ end
71
+
72
+ def filter_date_text_field(method)
73
+ current_value = @object.send(method)
74
+ text_field(method, :size => 12, :class => "datepicker", :max => 10, :value => current_value.respond_to?(:strftime) ? current_value.strftime("%Y-%m-%d") : "")
75
+ end
76
+
77
+ def filter_numeric_input(method, options = {})
78
+ filters = numeric_filters_for_method(method, options.delete(:filters) || default_numeric_filters)
79
+ current_filter = current_numeric_scope(filters)
80
+ filter_select = @template.select_tag '', @template.options_for_select(filters, current_filter),
81
+ :onchange => "document.getElementById('#{method}_numeric').name = 'q[' + this.value + ']';"
82
+ filter_input = text_field current_filter, :size => 10, :id => "#{method}_numeric"
83
+
84
+ [ label(method),
85
+ filter_select,
86
+ " ",
87
+ filter_input
88
+ ].join("\n").html_safe
89
+ end
90
+
91
+ def numeric_filters_for_method(method, filters)
92
+ filters.collect{|scope| [scope[0], [method,scope[1]].join("_") ] }
93
+ end
94
+
95
+ # Returns the scope for which we are currently searching. If no search is available
96
+ # it returns the first scope
97
+ def current_numeric_scope(filters)
98
+ filters[1..-1].inject(filters.first){|a,b| object.send(b[1].to_sym) ? b : a }[1]
99
+ end
100
+
101
+ def default_numeric_filters
102
+ [[I18n.t('active_admin.equal_to'), 'eq'], [I18n.t('active_admin.greater_than'), 'gt'], [I18n.t('active_admin.less_than'), 'lt']]
103
+ end
104
+
105
+ def filter_select_input(method, options = {})
106
+ association_name = method.to_s.gsub(/_id$/, '').to_sym
107
+ input_name = (generate_association_input_name(method).to_s + "_eq").to_sym
108
+ collection = find_collection_for_column(association_name, options)
109
+
110
+ [ label(input_name, options[:label]),
111
+ select(input_name, collection, options.merge(:include_blank => I18n.t('active_admin.any')))
112
+ ].join("\n").html_safe
113
+ end
114
+
115
+ def filter_check_boxes_input(method, options = {})
116
+ input_name = (generate_association_input_name(method).to_s + "_in").to_sym
117
+ collection = find_collection_for_column(method, options)
118
+ selected_values = @object.send(input_name) || []
119
+ checkboxes = template.content_tag :div, :class => "check_boxes_wrapper" do
120
+ collection.map do |c|
121
+ label = c.is_a?(Array) ? c.first : c
122
+ value = c.is_a?(Array) ? c.last : c
123
+ "<label><input type=\"checkbox\" name=\"q[#{input_name}][]\" value=\"#{value}\" #{selected_values.include?(value) ? "checked" : ""}/> #{label}</label>"
124
+ end.join("\n").html_safe
125
+ end
126
+
127
+ [ label(input_name, options[:label]),
128
+ checkboxes
129
+ ].join("\n").html_safe
130
+ end
131
+
132
+ # Override the standard finder to accept a proc
133
+ def find_collection_for_column(method, options = {})
134
+ options = options.dup
135
+ case options[:collection]
136
+ when Proc
137
+ options[:collection] = options[:collection].call
138
+ end
139
+ super(method, options)
140
+ end
141
+
142
+ # Returns the default filter type for a given attribute
143
+ def default_filter_type(method)
144
+ if column = column_for(method)
145
+ case column.type
146
+ when :date, :datetime
147
+ return :date_range
148
+ when :string, :text
149
+ return :string
150
+ when :integer
151
+ return :select if reflection_for(method.to_s.gsub('_id','').to_sym)
152
+ return :numeric
153
+ when :float, :decimal
154
+ return :numeric
155
+ end
156
+ end
157
+
158
+ if reflection = reflection_for(method)
159
+ return :select if reflection.macro == :belongs_to && !reflection.options[:polymorphic]
160
+ end
161
+ end
162
+
163
+ # Returns the default label for a given attribute
164
+ # Will use ActiveModel I18n if possible
165
+ def default_filter_label(method)
166
+ if @object.base.respond_to?(:human_attribute_name)
167
+ @object.base.human_attribute_name(method)
168
+ else
169
+ method.to_s.titlecase
170
+ end
171
+ end
172
+
173
+ # Returns the column for an attribute on the object being searched
174
+ # if it exists. Otherwise returns nil
175
+ def column_for(method)
176
+ @object.base.columns_hash[method.to_s] if @object.base.respond_to?(:columns_hash)
177
+ end
178
+
179
+ # Returns the association reflection for the method if it exists
180
+ def reflection_for(method)
181
+ @object.base.reflect_on_association(method) if @object.base.respond_to?(:reflect_on_association)
182
+ end
183
+
184
+ end
185
+ 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,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
+ active_admin_application.view_factory
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+
4
+ # Require all ruby files in the view helpers dir
5
+ Dir[File.expand_path('../view_helpers', __FILE__) + "/*.rb"].each{|f| require f }
6
+
7
+ include AssignsWithIndifferentAccessHelper
8
+ include ActiveAdminApplicationHelper
9
+ include RendererHelper
10
+ include AutoLinkHelper
11
+ include BreadcrumbHelper
12
+ include DisplayHelper
13
+ include IconHelper
14
+ include MethodOrProcHelper
15
+ include SidebarHelper
16
+ include TableHelper
17
+ include FormHelper
18
+ include FilterFormHelper
19
+ include TitleHelper
20
+ include ViewFactoryHelper
21
+
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class ActionItems < ActiveAdmin::Component
5
+
6
+ def build(action_items)
7
+ action_items.each do |action_item|
8
+ span :class => "action_item" do
9
+ instance_eval(&action_item.block)
10
+ end
11
+ end
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,66 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class AttributesTable < ActiveAdmin::Component
5
+ builder_method :attributes_table_for
6
+
7
+ attr_reader :resource
8
+
9
+ def build(record, *attrs)
10
+ @record = record
11
+ super(:for => @record)
12
+ @table = table
13
+ rows(*attrs)
14
+ end
15
+
16
+ def rows(*attrs)
17
+ attrs.each {|attr| row(attr) }
18
+ end
19
+
20
+ def row(attr, &block)
21
+ @table << tr do
22
+ th do
23
+ header_content_for(attr)
24
+ end
25
+ td do
26
+ content_for(block || attr)
27
+ end
28
+ end
29
+ end
30
+
31
+ protected
32
+
33
+ def default_id_for_prefix
34
+ 'attributes_table'
35
+ end
36
+
37
+ def header_content_for(attr)
38
+ @record.class.respond_to?(:human_attribute_name) ? @record.class.human_attribute_name(attr).titleize : attr.to_s.titleize
39
+ end
40
+
41
+ def empty_value
42
+ span I18n.t('active_admin.empty'), :class => "empty"
43
+ end
44
+
45
+ def content_for(attr_or_proc)
46
+ value = case attr_or_proc
47
+ when Proc
48
+ attr_or_proc.call
49
+ else
50
+ content_for_attribute(attr_or_proc)
51
+ end
52
+ value = pretty_format(value)
53
+ value == "" || value == nil ? empty_value : value
54
+ end
55
+
56
+ def content_for_attribute(attr)
57
+ if attr.to_s =~ /^([\w]+)_id$/ && @record.respond_to?($1.to_sym)
58
+ content_for_attribute($1)
59
+ else
60
+ @record.send(attr.to_sym)
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,47 @@
1
+ module ActiveAdmin
2
+ module Views
3
+
4
+ class Columns < ActiveAdmin::Component
5
+ builder_method :columns
6
+
7
+ def column(*args, &block)
8
+ insert_tag Column, *args, &block
9
+ end
10
+
11
+ # Override add child to set widths
12
+ def add_child(*)
13
+ super
14
+ calculate_columns!
15
+ end
16
+
17
+ protected
18
+
19
+ def margin_size
20
+ 2
21
+ end
22
+
23
+ def calculate_columns!
24
+ # Calculate our columns sizes and margins
25
+ count = children.size
26
+ margins_width = margin_size * (count - 1)
27
+ column_width = (100.00 - margins_width) / count
28
+
29
+ # Convert to an integer if its not a float
30
+ column_width = column_width.to_i == column_width ? column_width.to_i : column_width
31
+
32
+ children.each_with_index do |col, i|
33
+ col.set_attribute :style, "width: #{column_width}%;"
34
+ col.attr(:style) << " margin-right: #{margin_size}%;" unless i == (count - 1)
35
+ end
36
+ end
37
+
38
+ def to_html
39
+ super.to_s + "<div style=\"clear:both;\"></div>".html_safe
40
+ end
41
+
42
+ end
43
+
44
+ class Column < ActiveAdmin::Component
45
+ end
46
+ end
47
+ end