activeadmin 0.4.4 → 0.5.0.pre

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 (310) hide show
  1. data/.gitignore +3 -0
  2. data/.travis.yml +5 -0
  3. data/CHANGELOG.md +50 -0
  4. data/CONTRIBUTING.md +2 -4
  5. data/Gemfile +10 -4
  6. data/Guardfile +0 -1
  7. data/LICENSE +1 -1
  8. data/README.rdoc +19 -8
  9. data/Rakefile +10 -1
  10. data/activeadmin.gemspec +2 -1
  11. data/app/assets/javascripts/active_admin/application.js +3 -9
  12. data/app/assets/javascripts/active_admin/base.js +1 -0
  13. data/app/assets/javascripts/active_admin/components/jquery.aa.checkbox-toggler.js.coffee +64 -0
  14. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +107 -0
  15. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +100 -0
  16. data/app/assets/javascripts/active_admin/components/jquery.aa.table-checkbox-toggler.js.coffee +27 -0
  17. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +3 -0
  18. data/app/assets/javascripts/active_admin/pages/application.js.coffee +13 -0
  19. data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +26 -0
  20. data/app/assets/stylesheets/active_admin/_base.css.scss +32 -26
  21. data/app/assets/stylesheets/active_admin/_forms.css.scss +12 -5
  22. data/app/assets/stylesheets/active_admin/_header.css.scss +1 -2
  23. data/app/assets/stylesheets/active_admin/_typography.css.scss +1 -1
  24. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  25. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -2
  26. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  27. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +3 -3
  28. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  29. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +20 -27
  31. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +1 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +38 -36
  33. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +5 -5
  34. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +7 -3
  35. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +19 -17
  36. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +2 -2
  37. data/app/assets/stylesheets/active_admin/print.css.scss +290 -0
  38. data/app/views/active_admin/dashboard/index.html.arb +1 -1
  39. data/app/views/active_admin/devise/passwords/edit.html.erb +17 -14
  40. data/app/views/active_admin/devise/passwords/new.html.erb +4 -4
  41. data/app/views/active_admin/devise/sessions/new.html.erb +6 -6
  42. data/app/views/active_admin/devise/shared/_links.erb +6 -6
  43. data/app/views/active_admin/page/index.html.arb +1 -1
  44. data/app/views/active_admin/resource/edit.html.arb +1 -1
  45. data/app/views/active_admin/resource/index.csv.erb +1 -1
  46. data/app/views/active_admin/resource/index.html.arb +1 -1
  47. data/app/views/active_admin/resource/new.html.arb +1 -1
  48. data/app/views/active_admin/resource/show.html.arb +1 -1
  49. data/app/views/layouts/active_admin.html.arb +1 -1
  50. data/app/views/layouts/active_admin_logged_out.html.erb +2 -2
  51. data/cucumber.yml +1 -1
  52. data/docs/0-installation.md +10 -1
  53. data/docs/{9-custom-pages.md → 10-custom-pages.md} +0 -0
  54. data/docs/2-resource-customization.md +19 -1
  55. data/docs/3-index-pages.md +31 -0
  56. data/docs/4-csv-format.md +9 -0
  57. data/docs/6-show-screens.md +1 -1
  58. data/docs/9-batch-actions.md +161 -0
  59. data/features/dashboard.feature +31 -8
  60. data/features/development_reloading.feature +1 -1
  61. data/features/edit_page.feature +3 -3
  62. data/features/i18n.feature +35 -0
  63. data/features/index/batch_actions.feature +98 -0
  64. data/features/index/filters.feature +26 -0
  65. data/features/index/format_as_csv.feature +35 -0
  66. data/features/index/index_as_table.feature +30 -2
  67. data/features/index/index_blank_slate.feature +8 -3
  68. data/features/index/index_scopes.feature +130 -24
  69. data/features/index/page_title.feature +12 -0
  70. data/features/new_page.feature +3 -3
  71. data/features/registering_pages.feature +61 -0
  72. data/features/root_to.feature +17 -0
  73. data/features/show/default_content.feature +1 -1
  74. data/features/show/page_title.feature +14 -0
  75. data/features/sidebar_sections.feature +26 -0
  76. data/features/site_title.feature +1 -1
  77. data/features/specifying_actions.feature +7 -6
  78. data/features/step_definitions/action_link_steps.rb +1 -1
  79. data/features/step_definitions/additional_web_steps.rb +7 -1
  80. data/features/step_definitions/batch_action_steps.rb +94 -0
  81. data/features/step_definitions/configuration_steps.rb +30 -8
  82. data/features/step_definitions/factory_steps.rb +12 -0
  83. data/features/step_definitions/format_steps.rb +6 -2
  84. data/features/step_definitions/i18n_steps.rb +3 -0
  85. data/features/step_definitions/table_steps.rb +114 -0
  86. data/features/step_definitions/user_steps.rb +30 -4
  87. data/features/support/env.rb +54 -15
  88. data/features/support/paths.rb +2 -0
  89. data/features/users/logging_in.feature +1 -1
  90. data/features/users/logging_out.feature +2 -1
  91. data/features/users/resetting_password.feature +34 -0
  92. data/lib/active_admin.rb +46 -7
  93. data/lib/active_admin/application.rb +30 -15
  94. data/lib/active_admin/base_controller/menu.rb +3 -3
  95. data/lib/active_admin/batch_actions.rb +17 -0
  96. data/lib/active_admin/batch_actions/controller.rb +25 -0
  97. data/lib/active_admin/batch_actions/resource_extension.rb +126 -0
  98. data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -0
  99. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
  100. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +63 -0
  101. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  102. data/lib/active_admin/comments.rb +5 -2
  103. data/lib/active_admin/comments/comment.rb +4 -3
  104. data/lib/active_admin/comments/views/active_admin_comments.rb +5 -5
  105. data/lib/active_admin/component.rb +1 -18
  106. data/lib/active_admin/csv_builder.rb +8 -3
  107. data/lib/active_admin/dashboards.rb +21 -4
  108. data/lib/active_admin/dashboards/dashboard_controller.rb +1 -5
  109. data/lib/active_admin/dependency_checker.rb +1 -1
  110. data/lib/active_admin/dsl.rb +61 -4
  111. data/lib/active_admin/engine.rb +1 -1
  112. data/lib/active_admin/filters.rb +8 -0
  113. data/lib/active_admin/filters/dsl.rb +12 -0
  114. data/lib/active_admin/filters/forms.rb +93 -0
  115. data/lib/active_admin/filters/resource_extension.rb +92 -0
  116. data/lib/active_admin/form_builder.rb +88 -33
  117. data/lib/active_admin/helpers/collection.rb +23 -0
  118. data/lib/active_admin/helpers/optional_display.rb +1 -1
  119. data/lib/active_admin/inputs/filter_select_input.rb +1 -1
  120. data/lib/active_admin/locales/bg.yml +37 -1
  121. data/lib/active_admin/locales/ca.yml +36 -0
  122. data/lib/active_admin/locales/cs.yml +36 -0
  123. data/lib/active_admin/locales/da.yml +36 -0
  124. data/lib/active_admin/locales/de.yml +42 -0
  125. data/lib/active_admin/locales/en.yml +27 -2
  126. data/lib/active_admin/locales/es.yml +45 -4
  127. data/lib/active_admin/locales/fr.yml +22 -0
  128. data/lib/active_admin/locales/{he_il.yml → he.yml} +37 -2
  129. data/lib/active_admin/locales/hr.yml +49 -5
  130. data/lib/active_admin/locales/hu.yml +21 -0
  131. data/lib/active_admin/locales/it.yml +36 -1
  132. data/lib/active_admin/locales/ja.yml +36 -0
  133. data/lib/active_admin/locales/ko.yml +36 -1
  134. data/lib/active_admin/locales/lv.yml +28 -2
  135. data/lib/active_admin/locales/nl.yml +42 -1
  136. data/lib/active_admin/locales/no-NB.yml +15 -0
  137. data/lib/active_admin/locales/pl.yml +45 -1
  138. data/lib/active_admin/locales/pt-BR.yml +36 -1
  139. data/lib/active_admin/locales/ro.yml +67 -0
  140. data/lib/active_admin/locales/ru.yml +43 -3
  141. data/lib/active_admin/locales/sv-SE.yml +41 -1
  142. data/lib/active_admin/locales/tr.yml +80 -0
  143. data/lib/active_admin/locales/vi.yml +80 -0
  144. data/lib/active_admin/locales/{zh_cn.yml → zh-CN.yml} +42 -2
  145. data/lib/active_admin/locales/zh-TW.yml +36 -1
  146. data/lib/active_admin/menu.rb +55 -30
  147. data/lib/active_admin/menu_builder.rb +65 -0
  148. data/lib/active_admin/menu_item.rb +55 -14
  149. data/lib/active_admin/namespace.rb +25 -55
  150. data/lib/active_admin/page.rb +15 -10
  151. data/lib/active_admin/resource.rb +9 -0
  152. data/lib/active_admin/resource/action_items.rb +4 -4
  153. data/lib/active_admin/resource/controllers.rb +1 -1
  154. data/lib/active_admin/resource/menu.rb +19 -21
  155. data/lib/active_admin/resource/naming.rb +55 -45
  156. data/lib/active_admin/resource/sidebars.rb +0 -13
  157. data/lib/active_admin/resource_collection.rb +10 -10
  158. data/lib/active_admin/resource_controller.rb +5 -5
  159. data/lib/active_admin/resource_controller/actions.rb +2 -0
  160. data/lib/active_admin/resource_controller/collection.rb +13 -4
  161. data/lib/active_admin/resource_dsl.rb +12 -6
  162. data/lib/active_admin/router.rb +27 -8
  163. data/lib/active_admin/scope.rb +1 -0
  164. data/lib/active_admin/sidebar_section.rb +2 -6
  165. data/lib/active_admin/version.rb +1 -1
  166. data/lib/active_admin/view_factory.rb +18 -13
  167. data/lib/active_admin/view_helpers.rb +0 -2
  168. data/lib/active_admin/view_helpers/auto_link_helper.rb +2 -1
  169. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +24 -25
  170. data/lib/active_admin/view_helpers/display_helper.rb +1 -1
  171. data/lib/active_admin/view_helpers/fields_for.rb +44 -0
  172. data/lib/active_admin/view_helpers/form_helper.rb +6 -0
  173. data/lib/active_admin/view_helpers/view_factory_helper.rb +1 -1
  174. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  175. data/lib/active_admin/views/components/attributes_table.rb +6 -2
  176. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  177. data/lib/active_admin/views/components/paginated_collection.rb +13 -14
  178. data/lib/active_admin/views/components/popover.rb +27 -0
  179. data/lib/active_admin/views/components/scopes.rb +8 -13
  180. data/lib/active_admin/views/components/sidebar_section.rb +1 -1
  181. data/lib/active_admin/views/components/site_title.rb +55 -0
  182. data/lib/active_admin/views/components/status_tag.rb +4 -4
  183. data/lib/active_admin/views/components/table_for.rb +18 -18
  184. data/lib/active_admin/views/dashboard_section_renderer.rb +1 -1
  185. data/lib/active_admin/views/footer.rb +18 -0
  186. data/lib/active_admin/views/header.rb +31 -0
  187. data/lib/active_admin/views/index_as_block.rb +3 -0
  188. data/lib/active_admin/views/index_as_blog.rb +4 -0
  189. data/lib/active_admin/views/index_as_grid.rb +2 -0
  190. data/lib/active_admin/views/index_as_table.rb +19 -6
  191. data/lib/active_admin/views/pages/base.rb +14 -48
  192. data/lib/active_admin/views/pages/form.rb +3 -3
  193. data/lib/active_admin/views/pages/index.rb +56 -24
  194. data/lib/active_admin/views/pages/layout.rb +2 -2
  195. data/lib/active_admin/views/pages/page.rb +10 -4
  196. data/lib/active_admin/views/pages/show.rb +11 -8
  197. data/lib/active_admin/views/tabbed_navigation.rb +3 -3
  198. data/lib/active_admin/views/title_bar.rb +50 -0
  199. data/lib/active_admin/views/utility_nav.rb +41 -0
  200. data/lib/generators/active_admin/assets/assets_generator.rb +1 -1
  201. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +1 -0
  202. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +26 -3
  203. data/lib/generators/active_admin/devise/devise_generator.rb +2 -2
  204. data/lib/generators/active_admin/install/install_generator.rb +10 -10
  205. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +21 -1
  206. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +20 -0
  207. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  208. data/lib/generators/active_admin/resource/templates/admin.rb +1 -1
  209. data/spec/integration/memory_spec.rb +1 -11
  210. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  211. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  212. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  213. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  214. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  215. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  216. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  217. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  218. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  219. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  220. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  221. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  222. data/spec/javascripts/support/jasmine.yml +74 -0
  223. data/spec/javascripts/support/jasmine_config.rb +23 -0
  224. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  225. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  226. data/spec/javascripts/support/jquery.min.js +4 -0
  227. data/spec/spec_helper.rb +13 -13
  228. data/spec/spec_helper_without_rails.rb +2 -3
  229. data/spec/support/detect_rails_version.rb +16 -10
  230. data/spec/support/rails_template.rb +13 -1
  231. data/spec/support/templates/admin/stores.rb +1 -0
  232. data/spec/support/templates/en.yml +6 -0
  233. data/spec/unit/action_builder_spec.rb +38 -0
  234. data/spec/unit/application_spec.rb +12 -16
  235. data/spec/unit/base_controller_shared_examples.rb +3 -6
  236. data/spec/unit/batch_actions/resource_spec.rb +91 -0
  237. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  238. data/spec/unit/breadcrumbs_spec.rb +33 -0
  239. data/spec/unit/comments_spec.rb +6 -0
  240. data/spec/unit/config_shared_examples.rb +17 -64
  241. data/spec/unit/csv_builder_spec.rb +12 -2
  242. data/spec/unit/dashboard_controller_spec.rb +11 -5
  243. data/spec/unit/dsl_include_spec.rb +20 -0
  244. data/spec/unit/{filter_form_builder_spec.rb → filters/filter_form_builder_spec.rb} +10 -7
  245. data/spec/unit/filters/resource_spec.rb +60 -0
  246. data/spec/unit/form_builder_spec.rb +180 -28
  247. data/spec/unit/helpers/collection_spec.rb +65 -0
  248. data/spec/unit/menu_item_spec.rb +48 -53
  249. data/spec/unit/menu_spec.rb +46 -32
  250. data/spec/unit/namespace/register_page_spec.rb +0 -6
  251. data/spec/unit/namespace/register_resource_spec.rb +1 -8
  252. data/spec/unit/namespace_spec.rb +8 -2
  253. data/spec/unit/page_spec.rb +20 -8
  254. data/spec/unit/resource/naming_spec.rb +27 -26
  255. data/spec/unit/resource/sidebars_spec.rb +0 -7
  256. data/spec/unit/resource_collection_spec.rb +11 -11
  257. data/spec/unit/resource_controller/collection_spec.rb +23 -1
  258. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  259. data/spec/unit/resource_controller_spec.rb +43 -0
  260. data/spec/unit/resource_registration_spec.rb +2 -13
  261. data/spec/unit/resource_spec.rb +0 -42
  262. data/spec/unit/routing_spec.rb +60 -14
  263. data/spec/unit/scope_spec.rb +7 -0
  264. data/spec/unit/view_factory_spec.rb +9 -6
  265. data/spec/unit/view_helpers/fields_for_spec.rb +41 -0
  266. data/spec/unit/view_helpers/form_helper_spec.rb +18 -0
  267. data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
  268. data/spec/unit/views/components/attributes_table_spec.rb +32 -20
  269. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  270. data/spec/unit/views/components/blank_slate_spec.rb +5 -3
  271. data/spec/unit/views/components/columns_spec.rb +32 -22
  272. data/spec/unit/views/components/paginated_collection_spec.rb +54 -12
  273. data/spec/unit/views/components/panel_spec.rb +11 -6
  274. data/spec/unit/views/components/popover_spec.rb +33 -0
  275. data/spec/unit/views/components/sidebar_section_spec.rb +6 -6
  276. data/spec/unit/views/components/site_title_spec.rb +78 -0
  277. data/spec/unit/views/components/status_tag_spec.rb +17 -10
  278. data/spec/unit/views/components/table_for_spec.rb +37 -17
  279. data/spec/unit/views/pages/layout_spec.rb +51 -10
  280. data/spec/unit/views/tabbed_navigation_spec.rb +44 -23
  281. data/tasks/js.rake +32 -0
  282. data/tasks/test.rake +1 -1
  283. metadata +233 -200
  284. data/lib/active_admin/arbre.rb +0 -22
  285. data/lib/active_admin/arbre/builder.rb +0 -125
  286. data/lib/active_admin/arbre/context.rb +0 -45
  287. data/lib/active_admin/arbre/html/attributes.rb +0 -20
  288. data/lib/active_admin/arbre/html/class_list.rb +0 -24
  289. data/lib/active_admin/arbre/html/collection.rb +0 -27
  290. data/lib/active_admin/arbre/html/document.rb +0 -42
  291. data/lib/active_admin/arbre/html/element.rb +0 -161
  292. data/lib/active_admin/arbre/html/html5_elements.rb +0 -47
  293. data/lib/active_admin/arbre/html/tag.rb +0 -145
  294. data/lib/active_admin/arbre/html/text_node.rb +0 -35
  295. data/lib/active_admin/filter_form_builder.rb +0 -53
  296. data/lib/active_admin/renderer.rb +0 -87
  297. data/lib/active_admin/resource_controller/filters.rb +0 -58
  298. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  299. data/lib/active_admin/view_helpers/filter_form_helper.rb +0 -36
  300. data/lib/active_admin/view_helpers/renderer_helper.rb +0 -29
  301. data/lib/active_admin/views/header_renderer.rb +0 -82
  302. data/lib/generators/active_admin/assets/templates/dashboards.rb +0 -36
  303. data/lib/generators/active_admin/install/templates/dashboards.rb +0 -44
  304. data/spec/unit/arbre/context_spec.rb +0 -35
  305. data/spec/unit/arbre/html/element_finder_methods_spec.rb +0 -110
  306. data/spec/unit/arbre/html/element_spec.rb +0 -236
  307. data/spec/unit/arbre/html/tag_attributes_spec.rb +0 -61
  308. data/spec/unit/arbre/html/tag_spec.rb +0 -63
  309. data/spec/unit/arbre/html_spec.rb +0 -228
  310. data/spec/unit/renderer_spec.rb +0 -126
@@ -57,6 +57,18 @@ module ActiveAdmin
57
57
  # The method to use when generating the link for user logout
58
58
  inheritable_setting :logout_link_method, :get
59
59
 
60
+ # Whether the batch actions are enabled or not
61
+ inheritable_setting :batch_actions, false
62
+
63
+ # Whether filters are enabled
64
+ inheritable_setting :filters, true
65
+
66
+ # The namespace root.
67
+ inheritable_setting :root_to, 'dashboard#index'
68
+
69
+ # Default CSV separator
70
+ inheritable_setting :csv_column_separator, ','
71
+
60
72
  # Active Admin makes educated guesses when displaying objects, this is
61
73
  # the list of methods it tries calling in order
62
74
  setting :display_name_methods, [ :display_name,
@@ -80,7 +92,8 @@ module ActiveAdmin
80
92
  include AssetRegistration
81
93
 
82
94
  # Event that gets triggered on load of Active Admin
83
- LoadEvent = 'active_admin.application.load'.freeze
95
+ BeforeLoadEvent = 'active_admin.application.before_load'.freeze
96
+ AfterLoadEvent = 'active_admin.application.after_load'.freeze
84
97
 
85
98
  def setup!
86
99
  register_default_assets
@@ -106,11 +119,17 @@ module ActiveAdmin
106
119
  # @returns [Namespace] the new or existing namespace
107
120
  def find_or_create_namespace(name)
108
121
  name ||= :root
109
- return namespaces[name] if namespaces[name]
110
- namespace = Namespace.new(self, name)
111
- namespaces[name] = namespace
112
- ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
122
+
123
+ if namespaces[name]
124
+ namespace = namespaces[name]
125
+ else
126
+ namespace = Namespace.new(self, name)
127
+ namespaces[name] = namespace
128
+ ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
129
+ end
130
+
113
131
  yield(namespace) if block_given?
132
+
114
133
  namespace
115
134
  end
116
135
 
@@ -157,17 +176,16 @@ module ActiveAdmin
157
176
  # No work to do if we've already loaded
158
177
  return false if loaded?
159
178
 
179
+ ActiveAdmin::Event.dispatch BeforeLoadEvent, self
180
+
160
181
  # Load files
161
182
  files_in_load_path.each{|file| load file }
162
183
 
163
184
  # If no configurations, let's make sure you can still login
164
185
  load_default_namespace if namespaces.values.empty?
165
186
 
166
- # Load Menus
167
- namespaces.values.each{|namespace| namespace.load_menu! }
168
-
169
187
  # Dispatch an ActiveAdmin::Application::LoadEvent with the Application
170
- ActiveAdmin::Event.dispatch LoadEvent, self
188
+ ActiveAdmin::Event.dispatch AfterLoadEvent, self
171
189
 
172
190
  @@loaded = true
173
191
  end
@@ -224,9 +242,10 @@ module ActiveAdmin
224
242
  private
225
243
 
226
244
  def register_default_assets
227
- register_stylesheet 'active_admin.css', :media => 'all'
245
+ register_stylesheet 'active_admin.css', :media => 'screen'
246
+ register_stylesheet 'active_admin/print.css', :media => 'print'
228
247
 
229
- if !ActiveAdmin.use_asset_pipeline?
248
+ unless ActiveAdmin.use_asset_pipeline?
230
249
  register_javascript 'jquery.min.js'
231
250
  register_javascript 'jquery-ui.min.js'
232
251
  register_javascript 'jquery_ujs.js'
@@ -255,10 +274,6 @@ module ActiveAdmin
255
274
  end
256
275
 
257
276
  def generate_stylesheets
258
- # This must be required after initialization
259
- require 'sass/plugin'
260
- require 'active_admin/sass/helpers'
261
-
262
277
  # Create our own asset pipeline in Rails 3.0
263
278
  if ActiveAdmin.use_asset_pipeline?
264
279
  # Add our mixins to the load path for SASS
@@ -18,11 +18,11 @@ module ActiveAdmin
18
18
  # Get's called through a before filter
19
19
  def set_current_tab
20
20
  @current_tab = if active_admin_config.belongs_to? && parent?
21
- active_admin_config.belongs_to_config.target.menu_item_name
21
+ active_admin_config.belongs_to_config.target.menu_item
22
22
  else
23
- [active_admin_config.parent_menu_item_name, active_admin_config.menu_item_name].compact.join("/")
23
+ active_admin_config.menu_item
24
24
  end
25
- end
25
+ end
26
26
 
27
27
  end
28
28
  end
@@ -0,0 +1,17 @@
1
+ ActiveAdmin.before_load do |app|
2
+ require "active_admin/batch_actions/resource_extension"
3
+ require "active_admin/batch_actions/controller"
4
+
5
+ # Add our Extensions
6
+ ActiveAdmin::Resource.send :include, ActiveAdmin::BatchActions::ResourceExtension
7
+ ActiveAdmin::ResourceController.send :include, ActiveAdmin::BatchActions::Controller
8
+
9
+ # Require all the views
10
+ require "active_admin/batch_actions/views/batch_action_form"
11
+ require "active_admin/batch_actions/views/batch_action_popover"
12
+ require "active_admin/batch_actions/views/selection_cells"
13
+ require "active_admin/batch_actions/views/batch_action_selector"
14
+
15
+ # Register the views with the view factory
16
+ app.view_factory.register :batch_action_selector => ActiveAdmin::BatchActions::BatchActionSelector
17
+ end
@@ -0,0 +1,25 @@
1
+ module ActiveAdmin
2
+ module BatchActions
3
+ module Controller
4
+
5
+ # Controller Action that get's called when submitting the batch action form
6
+ def batch_action
7
+ if selected_batch_action
8
+ selected_ids = params[:collection_selection]
9
+ selected_ids ||= []
10
+ instance_exec selected_ids, &selected_batch_action.block
11
+ else
12
+ raise "Couldn't find batch action \"#{params[:batch_action]}\""
13
+ end
14
+ end
15
+
16
+ protected
17
+
18
+ def selected_batch_action
19
+ return unless params[:batch_action].present?
20
+ active_admin_config.batch_actions.select { |action| action.sym == params[:batch_action].to_sym }.first
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,126 @@
1
+ module ActiveAdmin
2
+
3
+ module BatchActions
4
+ module ResourceExtension
5
+ def initialize(*)
6
+ super
7
+ @batch_actions = {}
8
+ add_default_batch_actions
9
+ end
10
+
11
+ # @return [Array] The set of batch actions for this resource
12
+ def batch_actions
13
+ batch_actions_enabled? ? @batch_actions.values.sort : []
14
+ end
15
+
16
+ # @return [Boolean] If batch actions are enabled for this resource
17
+ def batch_actions_enabled?
18
+ # If the resource config has been set, use it. Otherwise
19
+ # return the namespace setting
20
+ @batch_actions_enabled.nil? ? namespace.batch_actions : @batch_actions_enabled
21
+ end
22
+
23
+ # Disable or Enable batch actions for this resource
24
+ # Set to `nil` to inherit the setting from the namespace
25
+ def batch_actions=(bool)
26
+ @batch_actions_enabled = bool
27
+ end
28
+
29
+ # Add a new batch item to a resource
30
+ # @param [String] title
31
+ # @param [Hash] options
32
+ # => :if is a proc that will be called to determine if the BatchAction should be displayed
33
+ # => :sort_order is used to sort the batch actions ascending
34
+ # => :confirm is a string which the user will have to accept in order to process the action
35
+ #
36
+ def add_batch_action(sym, title, options = {}, &block)
37
+ @batch_actions[sym] = ActiveAdmin::BatchAction.new(sym, title, options, &block)
38
+ end
39
+
40
+ # Remove a batch action
41
+ # @param [Symbol] sym
42
+ # @returns [ActiveAdmin::BatchAction] the batch action, if it was present
43
+ #
44
+ def remove_batch_action(sym)
45
+ @batch_actions.delete(sym.to_sym)
46
+ end
47
+
48
+ # Clears all the existing batch actions for this resource
49
+ def clear_batch_actions!
50
+ @batch_actions = {}
51
+ end
52
+
53
+ # Path to the batch action itself
54
+ def batch_action_path
55
+ "batch_action_#{route_collection_path}".to_sym
56
+ end
57
+
58
+ private
59
+
60
+ # @return [ActiveAdmin::BatchAction] The default "delete" action
61
+ def add_default_batch_actions
62
+ destroy_options = {
63
+ :priority => 100,
64
+ :confirm => I18n.t('active_admin.batch_actions.delete_confirmation', :plural_model => plural_resource_label.downcase),
65
+ :if => proc{ controller.action_methods.include?('destroy') }
66
+ }
67
+
68
+ add_batch_action :destroy, I18n.t('active_admin.delete'), destroy_options do |selected_ids|
69
+ active_admin_config.resource_class.find(selected_ids).each { |r| r.destroy }
70
+
71
+ redirect_to collection_path, :notice => I18n.t("active_admin.batch_actions.succesfully_destroyed",
72
+ :count => selected_ids.count,
73
+ :model => active_admin_config.resource_label.downcase,
74
+ :plural_model => active_admin_config.plural_resource_label.downcase)
75
+ end
76
+ end
77
+
78
+ end
79
+ end
80
+
81
+ class BatchAction
82
+
83
+ include Comparable
84
+
85
+ attr_reader :block, :title, :sym, :confirm
86
+
87
+ # Create a Batch Action
88
+ #
89
+ # Examples:
90
+ #
91
+ # BatchAction.new :flag
92
+ # => Will create an action that appears in the action list popover
93
+ #
94
+ # BatchAction.new( :flag ) { |selection| redirect_to collection_path, :notice => "#{selection.length} users flagged" }
95
+ # => Will create an action that uses a block to process the request (which receives one paramater of the selected objects)
96
+ #
97
+ # BatchAction.new( "Perform Long Operation on the" ) { |selection| }
98
+ # => You can create batch actions with a title instead of a Symbol
99
+ #
100
+ # BatchAction.new( :flag, :if => proc { can? :flag, AdminUser } ) { |selection| }
101
+ # => You can provide an optional :if proc to optionally display the batch action
102
+ #
103
+ def initialize(sym, title, options = {}, &block)
104
+ @sym, @title, @options, @block, @confirm = sym, title, options, block, options[:confirm]
105
+ @block ||= proc {}
106
+ end
107
+
108
+ # Returns the display if block. If the block was not explicitly defined
109
+ # a default block always returning true will be returned.
110
+ def display_if_block
111
+ @options[:if] || proc { true }
112
+ end
113
+
114
+ # Used for sorting
115
+ def priority
116
+ @options[:priority] || 10
117
+ end
118
+
119
+ # sort operator
120
+ def <=>(other)
121
+ self.priority <=> other.priority
122
+ end
123
+
124
+ end
125
+
126
+ end
@@ -0,0 +1,35 @@
1
+ require 'active_admin/component'
2
+
3
+ module ActiveAdmin
4
+ module BatchActions
5
+
6
+ # Build an BatchActionForm
7
+ class BatchActionForm < ActiveAdmin::Component
8
+ builder_method :batch_action_form
9
+
10
+ attr_reader :prefix_html
11
+
12
+ def build(options = {}, &block)
13
+ options[:id] ||= "collection_selection"
14
+
15
+ # Open a form
16
+ text_node form_tag(send(active_admin_config.batch_action_path), :id => options[:id])
17
+ input(:name => :batch_action, :id => :batch_action, :type => :hidden)
18
+
19
+ super(options)
20
+ end
21
+
22
+ # Override the default to_s to include a closing form tag
23
+ def to_s
24
+ content + closing_form_tag
25
+ end
26
+
27
+ private
28
+
29
+ def closing_form_tag
30
+ '</form>'.html_safe
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_admin/views/components/action_list_popover'
2
+
3
+ module ActiveAdmin
4
+ module BatchActions
5
+ # Build an BatchActionPopover
6
+ class BatchActionPopover < ActiveAdmin::Views::ActionListPopover
7
+ builder_method :batch_action_popover
8
+
9
+ def build(options = {}, &block)
10
+ options[:id] ||= "batch_actions_popover"
11
+ super(options)
12
+ end
13
+
14
+ def action(batch_action, options = {})
15
+ options[:class] ||= []
16
+ options[:class] += %w(batch_action)
17
+ options.merge! "data-action" => batch_action.sym,
18
+ "data-confirm" => batch_action.confirm
19
+
20
+ title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", :default => batch_action.title)
21
+ label = I18n.t("active_admin.batch_actions.action_label", :title => title)
22
+
23
+ super(label, "#", options)
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,63 @@
1
+ require 'active_admin/component'
2
+
3
+ module ActiveAdmin
4
+ module BatchActions
5
+
6
+ class BatchActionSelector < ActiveAdmin::Component
7
+ builder_method :batch_action_selector
8
+
9
+ # Build a new batch actions selector
10
+ #
11
+ # @param [Array] batch_actions An array of batch actions
12
+ def build(batch_actions)
13
+ @batch_actions = Array(batch_actions)
14
+ @drop_down = build_drop_down
15
+ end
16
+
17
+ # We don't want to wrap the action list (or any other children) in
18
+ # an unecessary div, so instead we just return the children
19
+ def to_s
20
+ children.to_s
21
+ end
22
+
23
+ private
24
+
25
+ def build_drop_down
26
+ dropdown_menu I18n.t("active_admin.batch_actions.button_label"),
27
+ :id => "batch_actions_selector",
28
+ :button => { :class => "disabled" } do
29
+ batch_actions_to_display.each do |batch_action|
30
+ options = {
31
+ :class => "batch_action",
32
+ "data-action" => batch_action.sym,
33
+ "data-confirm" => batch_action.confirm
34
+ }
35
+
36
+ title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", :default => batch_action.title)
37
+ label = I18n.t("active_admin.batch_actions.action_label", :title => title)
38
+
39
+ item label, "#", options
40
+ end
41
+ end
42
+ end
43
+
44
+ # Return the set of batch actions that should be displayed
45
+ def batch_actions_to_display
46
+ @batch_actions.select do |batch_action|
47
+ call_method_or_proc_on(self, batch_action.display_if_block)
48
+ end
49
+ end
50
+
51
+ # def build_batch_action_button
52
+ # a :class => 'table_tools_button dropdown_button disabled', :href => "#batch_actions_popover", :id => "batch_actions_button" do
53
+ # text_node I18n.t("active_admin.batch_actions.button_label")
54
+ # end
55
+ # end
56
+
57
+ # def build_batch_action_popover
58
+ # end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,37 @@
1
+ require 'active_admin/component'
2
+
3
+ module ActiveAdmin
4
+ module BatchActions
5
+
6
+ # Creates the toggle checkbox used to toggle the collection selection on/off
7
+ class ResourceSelectionToggleCell < ActiveAdmin::Component
8
+ builder_method :resource_selection_toggle_cell
9
+
10
+ def build
11
+ input( :type => "checkbox", :id => "collection_selection_toggle_all", :name => "collection_selection_toggle_all", :class => "toggle_all" )
12
+ end
13
+ end
14
+
15
+ # Creates the checkbox used to select a resource in the collection selection
16
+ class ResourceSelectionCell < ActiveAdmin::Component
17
+ builder_method :resource_selection_cell
18
+
19
+ def build(resource)
20
+ input :type => "checkbox", :id => "batch_action_item_#{resource.id}", :value => resource.id, :class => "collection_selection", :name => "collection_selection[]"
21
+ end
22
+ end
23
+
24
+ # Creates a wrapper panel for all index pages, except for the table, as the table has the checkbox in the thead
25
+ class ResourceSelectionTogglePanel < ActiveAdmin::Component
26
+ builder_method :resource_selection_toggle_panel
27
+
28
+ def build
29
+ super(:id => "collection_selection_toggle_panel")
30
+ resource_selection_toggle_cell
31
+ div(:id => "collection_selection_toggle_explaination" ) { I18n.t('active_admin.batch_actions.selection_toggle_explanation', :default => "(Toggle Selection)") }
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end