saulolso-activeadmin 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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