activeadmin 0.6.6 → 1.0.0.pre1

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 (512) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -8
  3. data/.hound.yml +11 -0
  4. data/.travis.yml +36 -10
  5. data/.yardopts +2 -1
  6. data/CHANGELOG.md +118 -67
  7. data/CONTRIBUTING.md +96 -73
  8. data/Gemfile +35 -35
  9. data/Guardfile +1 -0
  10. data/LICENSE +1 -1
  11. data/README.md +98 -0
  12. data/Rakefile +12 -4
  13. data/activeadmin.gemspec +21 -24
  14. data/app/assets/javascripts/active_admin/application.js.coffee +32 -0
  15. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  16. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  17. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  18. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  19. data/app/assets/javascripts/active_admin/{components/jquery.aa.checkbox-toggler.js.coffee → lib/checkbox-toggler.js.coffee} +3 -4
  20. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
  21. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  22. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  23. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  24. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  25. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  26. data/app/assets/javascripts/active_admin/{components/jquery.aa.table-checkbox-toggler.js.coffee → lib/table-checkbox-toggler.js.coffee} +2 -3
  27. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  28. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +61 -17
  29. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  30. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  32. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  33. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +0 -1
  34. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  35. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  36. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -14
  37. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +5 -4
  38. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  39. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  40. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  41. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +2 -3
  42. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  43. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  44. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +4 -2
  45. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  46. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -1
  49. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  51. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  52. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  53. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +8 -2
  54. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -7
  55. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +0 -9
  56. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  57. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  58. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +5 -2
  59. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +11 -9
  60. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  61. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  62. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  63. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  64. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  65. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  66. data/app/views/active_admin/devise/sessions/new.html.erb +9 -7
  67. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  68. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  69. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  70. data/config/locales/ar.yml +120 -0
  71. data/config/locales/bg.yml +26 -6
  72. data/config/locales/bs.yml +122 -0
  73. data/config/locales/ca.yml +10 -1
  74. data/config/locales/cs.yml +7 -2
  75. data/config/locales/da.yml +7 -3
  76. data/config/locales/de-CH.yml +14 -31
  77. data/config/locales/de.yml +33 -33
  78. data/config/locales/el.yml +28 -2
  79. data/config/locales/en-GB.yml +12 -4
  80. data/config/locales/en.yml +29 -3
  81. data/config/locales/{es_MX.yml → es-MX.yml} +9 -24
  82. data/config/locales/es.yml +32 -25
  83. data/config/locales/fa.yml +120 -0
  84. data/config/locales/fi.yml +113 -0
  85. data/config/locales/fr.yml +21 -11
  86. data/config/locales/he.yml +7 -3
  87. data/config/locales/hr.yml +42 -11
  88. data/config/locales/hu.yml +10 -3
  89. data/config/locales/it.yml +31 -3
  90. data/config/locales/ja.yml +8 -3
  91. data/config/locales/ko.yml +7 -1
  92. data/config/locales/lt.yml +42 -11
  93. data/config/locales/lv.yml +7 -3
  94. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  95. data/config/locales/nl.yml +36 -5
  96. data/config/locales/pl.yml +13 -8
  97. data/config/locales/pt-BR.yml +37 -5
  98. data/config/locales/pt-PT.yml +8 -4
  99. data/config/locales/ro.yml +7 -3
  100. data/config/locales/ru.yml +26 -5
  101. data/config/locales/sv-SE.yml +9 -5
  102. data/config/locales/tr.yml +10 -3
  103. data/config/locales/uk.yml +36 -12
  104. data/config/locales/vi.yml +7 -3
  105. data/config/locales/zh-CN.yml +26 -10
  106. data/config/locales/zh-TW.yml +19 -13
  107. data/docs/0-installation.md +65 -29
  108. data/docs/1-general-configuration.md +92 -81
  109. data/docs/10-custom-pages.md +68 -68
  110. data/docs/11-decorators.md +48 -59
  111. data/docs/12-arbre-components.md +80 -74
  112. data/docs/13-authorization-adapter.md +128 -107
  113. data/docs/14-gotchas.md +92 -0
  114. data/docs/2-resource-customization.md +293 -178
  115. data/docs/3-index-pages.md +160 -86
  116. data/docs/3-index-pages/custom-index.md +31 -0
  117. data/docs/3-index-pages/index-as-block.md +14 -9
  118. data/docs/3-index-pages/index-as-blog.md +41 -31
  119. data/docs/3-index-pages/index-as-grid.md +16 -8
  120. data/docs/3-index-pages/index-as-table.md +129 -52
  121. data/docs/4-csv-format.md +31 -24
  122. data/docs/5-forms.md +133 -56
  123. data/docs/6-show-pages.md +89 -27
  124. data/docs/7-sidebars.md +48 -27
  125. data/docs/8-custom-actions.md +98 -77
  126. data/docs/9-batch-actions.md +210 -146
  127. data/docs/README.md +24 -0
  128. data/features/action_item.feature +3 -3
  129. data/features/authorization_pundit.feature +37 -0
  130. data/features/breadcrumb.feature +48 -0
  131. data/features/comments/commenting.feature +56 -13
  132. data/features/development_reloading.feature +17 -30
  133. data/features/edit_page.feature +12 -1
  134. data/features/favicon.feature +3 -3
  135. data/features/i18n.feature +5 -4
  136. data/features/index/batch_actions.feature +41 -0
  137. data/features/index/filters.feature +67 -0
  138. data/features/index/format_as_csv.feature +90 -4
  139. data/features/index/formats.feature +27 -0
  140. data/features/index/index_as_blog.feature +4 -4
  141. data/features/index/index_as_table.feature +102 -6
  142. data/features/index/index_blank_slate.feature +22 -0
  143. data/features/index/index_scope_to.feature +16 -16
  144. data/features/index/page_title.feature +11 -0
  145. data/features/index/pagination.feature +1 -1
  146. data/features/index/switch_index_view.feature +14 -14
  147. data/features/new_page.feature +13 -2
  148. data/features/registering_pages.feature +1 -1
  149. data/features/renamed_resource.feature +32 -0
  150. data/features/show/page_title.feature +11 -0
  151. data/features/show/tabs.feature +27 -0
  152. data/features/sidebar_sections.feature +12 -0
  153. data/features/site_title.feature +2 -2
  154. data/features/specifying_actions.feature +3 -3
  155. data/features/step_definitions/action_item_steps.rb +2 -2
  156. data/features/step_definitions/action_link_steps.rb +14 -1
  157. data/features/step_definitions/additional_web_steps.rb +19 -20
  158. data/features/step_definitions/asset_steps.rb +3 -3
  159. data/features/step_definitions/attribute_steps.rb +8 -3
  160. data/features/step_definitions/batch_action_steps.rb +26 -9
  161. data/features/step_definitions/blog_steps.rb +3 -0
  162. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  163. data/features/step_definitions/comment_steps.rb +1 -1
  164. data/features/step_definitions/configuration_steps.rb +9 -2
  165. data/features/step_definitions/dashboard_steps.rb +2 -2
  166. data/features/step_definitions/factory_steps.rb +9 -8
  167. data/features/step_definitions/filter_steps.rb +25 -3
  168. data/features/step_definitions/flash_steps.rb +3 -3
  169. data/features/step_definitions/format_steps.rb +18 -18
  170. data/features/step_definitions/index_scope_steps.rb +5 -5
  171. data/features/step_definitions/layout_steps.rb +1 -1
  172. data/features/step_definitions/member_link_steps.rb +2 -2
  173. data/features/step_definitions/menu_steps.rb +3 -3
  174. data/features/step_definitions/pagination_steps.rb +2 -3
  175. data/features/step_definitions/sidebar_steps.rb +8 -3
  176. data/features/step_definitions/site_title_steps.rb +6 -4
  177. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  178. data/features/step_definitions/tab_steps.rb +5 -0
  179. data/features/step_definitions/table_steps.rb +4 -4
  180. data/features/step_definitions/user_steps.rb +10 -7
  181. data/features/step_definitions/web_steps.rb +14 -11
  182. data/features/sti_resource.feature +6 -2
  183. data/features/strong_parameters.feature +73 -0
  184. data/features/support/env.rb +34 -9
  185. data/features/support/paths.rb +14 -6
  186. data/features/support/selectors.rb +1 -1
  187. data/features/symbol_leak.feature +35 -0
  188. data/features/users/resetting_password.feature +5 -6
  189. data/lib/active_admin.rb +26 -25
  190. data/lib/active_admin/abstract_view_factory.rb +7 -17
  191. data/lib/active_admin/application.rb +72 -59
  192. data/lib/active_admin/asset_registration.rb +2 -2
  193. data/lib/active_admin/authorization_adapter.rb +2 -2
  194. data/lib/active_admin/base_controller.rb +2 -3
  195. data/lib/active_admin/base_controller/authorization.rb +13 -31
  196. data/lib/active_admin/batch_actions.rb +1 -1
  197. data/lib/active_admin/batch_actions/controller.rb +24 -8
  198. data/lib/active_admin/batch_actions/resource_extension.rb +47 -18
  199. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  200. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  201. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  202. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  203. data/lib/active_admin/callbacks.rb +25 -24
  204. data/lib/active_admin/cancan_adapter.rb +7 -11
  205. data/lib/active_admin/csv_builder.rb +92 -15
  206. data/lib/active_admin/dependency.rb +93 -0
  207. data/lib/active_admin/deprecation.rb +6 -7
  208. data/lib/active_admin/devise.rb +28 -18
  209. data/lib/active_admin/dsl.rb +18 -11
  210. data/lib/active_admin/engine.rb +10 -8
  211. data/lib/active_admin/error.rb +62 -0
  212. data/lib/active_admin/filters/dsl.rb +2 -2
  213. data/lib/active_admin/filters/forms.rb +17 -27
  214. data/lib/active_admin/filters/formtastic_addons.rb +49 -15
  215. data/lib/active_admin/filters/resource_extension.rb +43 -34
  216. data/lib/active_admin/form_builder.rb +93 -154
  217. data/lib/active_admin/helpers/collection.rb +7 -13
  218. data/lib/active_admin/helpers/i18n.rb +7 -0
  219. data/lib/active_admin/helpers/optional_display.rb +5 -5
  220. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  221. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  222. data/lib/active_admin/helpers/settings.rb +16 -9
  223. data/lib/active_admin/iconic.rb +17 -15
  224. data/lib/active_admin/iconic/icons.rb +136 -136
  225. data/lib/active_admin/inputs.rb +11 -7
  226. data/lib/active_admin/inputs/datepicker_input.rb +12 -3
  227. data/lib/active_admin/inputs/filters/base.rb +42 -0
  228. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  229. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  230. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  231. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  232. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  233. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  234. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  235. data/lib/active_admin/menu.rb +6 -4
  236. data/lib/active_admin/menu_collection.rb +1 -4
  237. data/lib/active_admin/namespace.rb +55 -29
  238. data/lib/active_admin/order_clause.rb +26 -0
  239. data/lib/active_admin/orm/active_record.rb +5 -0
  240. data/lib/active_admin/orm/active_record/comments.rb +81 -0
  241. data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
  242. data/lib/active_admin/{comments → orm/active_record/comments}/namespace_helper.rb +2 -2
  243. data/lib/active_admin/{comments → orm/active_record/comments}/resource_helper.rb +1 -1
  244. data/lib/active_admin/{comments → orm/active_record/comments}/show_page_helper.rb +0 -0
  245. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  246. data/lib/active_admin/{comments → orm/active_record/comments}/views/active_admin_comments.rb +16 -14
  247. data/lib/active_admin/orm/mongoid.rb +1 -0
  248. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  249. data/lib/active_admin/page.rb +7 -3
  250. data/lib/active_admin/page_dsl.rb +1 -1
  251. data/lib/active_admin/page_presenter.rb +2 -2
  252. data/lib/active_admin/pundit_adapter.rb +68 -0
  253. data/lib/active_admin/resource.rb +16 -17
  254. data/lib/active_admin/resource/action_items.rb +23 -18
  255. data/lib/active_admin/resource/belongs_to.rb +7 -3
  256. data/lib/active_admin/resource/controllers.rb +1 -0
  257. data/lib/active_admin/resource/includes.rb +12 -0
  258. data/lib/active_admin/resource/menu.rb +5 -5
  259. data/lib/active_admin/resource/naming.rb +27 -43
  260. data/lib/active_admin/resource/page_presenters.rb +1 -1
  261. data/lib/active_admin/resource/routes.rb +27 -11
  262. data/lib/active_admin/resource/scope_to.rb +7 -7
  263. data/lib/active_admin/resource/sidebars.rb +1 -0
  264. data/lib/active_admin/resource_controller.rb +6 -7
  265. data/lib/active_admin/resource_controller/data_access.rb +101 -93
  266. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  267. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  268. data/lib/active_admin/resource_dsl.rb +53 -10
  269. data/lib/active_admin/router.rb +7 -7
  270. data/lib/active_admin/scope.rb +6 -6
  271. data/lib/active_admin/sidebar_section.rb +10 -2
  272. data/lib/active_admin/version.rb +1 -1
  273. data/lib/active_admin/view_factory.rb +17 -17
  274. data/lib/active_admin/view_helpers.rb +0 -1
  275. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  276. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
  277. data/lib/active_admin/view_helpers/display_helper.rb +30 -15
  278. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -25
  279. data/lib/active_admin/view_helpers/fields_for.rb +4 -4
  280. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  281. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  282. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  283. data/lib/active_admin/views/action_items.rb +2 -2
  284. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  285. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  286. data/lib/active_admin/views/components/attributes_table.rb +63 -21
  287. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  288. data/lib/active_admin/views/components/columns.rb +13 -7
  289. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  290. data/lib/active_admin/views/components/index_list.rb +7 -7
  291. data/lib/active_admin/views/components/paginated_collection.rb +38 -20
  292. data/lib/active_admin/views/components/panel.rb +8 -2
  293. data/lib/active_admin/views/components/popover.rb +1 -1
  294. data/lib/active_admin/views/components/scopes.rb +5 -4
  295. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  296. data/lib/active_admin/views/components/site_title.rb +2 -2
  297. data/lib/active_admin/views/components/status_tag.rb +34 -11
  298. data/lib/active_admin/views/components/table_for.rb +90 -45
  299. data/lib/active_admin/views/components/tabs.rb +28 -0
  300. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  301. data/lib/active_admin/views/footer.rb +3 -3
  302. data/lib/active_admin/views/header.rb +3 -3
  303. data/lib/active_admin/views/index_as_block.rb +10 -10
  304. data/lib/active_admin/views/index_as_blog.rb +45 -39
  305. data/lib/active_admin/views/index_as_grid.rb +14 -10
  306. data/lib/active_admin/views/index_as_table.rb +242 -129
  307. data/lib/active_admin/views/pages/base.rb +22 -18
  308. data/lib/active_admin/views/pages/form.rb +21 -11
  309. data/lib/active_admin/views/pages/index.rb +40 -35
  310. data/lib/active_admin/views/pages/layout.rb +1 -1
  311. data/lib/active_admin/views/pages/show.rb +4 -4
  312. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  313. data/lib/active_admin/views/title_bar.rb +10 -8
  314. data/lib/generators/active_admin/assets/assets_generator.rb +3 -28
  315. data/lib/generators/active_admin/assets/templates/{3.1/active_admin.css.scss → active_admin.css.scss} +0 -0
  316. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  317. data/lib/generators/active_admin/devise/devise_generator.rb +24 -26
  318. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  319. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +28 -26
  320. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -2
  321. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  322. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  323. data/lib/generators/active_admin/page/USAGE +8 -0
  324. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  325. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  326. data/lib/generators/active_admin/resource/resource_generator.rb +3 -5
  327. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  328. data/lib/ransack_ext.rb +12 -0
  329. data/script/local +2 -2
  330. data/script/travis_cache +107 -0
  331. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  332. data/spec/javascripts/fixtures/flashes.html +2 -0
  333. data/spec/rails_helper.rb +154 -0
  334. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  335. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  336. data/spec/requests/memory_spec.rb +23 -0
  337. data/spec/requests/stylesheets_spec.rb +18 -0
  338. data/spec/spec_helper.rb +12 -173
  339. data/spec/support/detect_rails_version.rb +9 -17
  340. data/spec/support/rails_template.rb +64 -35
  341. data/spec/support/rails_template_with_data.rb +14 -14
  342. data/spec/support/templates/admin/stores.rb +5 -1
  343. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  344. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  345. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  346. data/spec/support/templates/policies/application_policy.rb +45 -0
  347. data/spec/support/templates/policies/category_policy.rb +7 -0
  348. data/spec/support/templates/policies/post_policy.rb +15 -0
  349. data/spec/support/templates/policies/store_policy.rb +11 -0
  350. data/spec/support/templates/policies/user_policy.rb +11 -0
  351. data/spec/support/templates/post_decorator.rb +4 -46
  352. data/spec/unit/abstract_view_factory_spec.rb +16 -16
  353. data/spec/unit/action_builder_spec.rb +24 -18
  354. data/spec/unit/active_admin_spec.rb +2 -2
  355. data/spec/unit/application_spec.rb +33 -34
  356. data/spec/unit/asset_registration_spec.rb +25 -29
  357. data/spec/unit/authorization/authorization_adapter_spec.rb +10 -10
  358. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  359. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  360. data/spec/unit/auto_link_spec.rb +43 -13
  361. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  362. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  363. data/spec/unit/belongs_to_spec.rb +28 -19
  364. data/spec/unit/cancan_adapter_spec.rb +8 -8
  365. data/spec/unit/comments_spec.rb +99 -39
  366. data/spec/unit/component_spec.rb +3 -3
  367. data/spec/unit/config_shared_examples.rb +10 -10
  368. data/spec/unit/controller_filters_spec.rb +23 -16
  369. data/spec/unit/csv_builder_spec.rb +165 -24
  370. data/spec/unit/dependency_spec.rb +135 -0
  371. data/spec/unit/devise_spec.rb +17 -37
  372. data/spec/unit/dsl_spec.rb +70 -9
  373. data/spec/unit/event_spec.rb +11 -11
  374. data/spec/unit/filters/filter_form_builder_spec.rb +207 -148
  375. data/spec/unit/filters/resource_spec.rb +60 -26
  376. data/spec/unit/form_builder_spec.rb +419 -145
  377. data/spec/unit/generators/install_spec.rb +23 -0
  378. data/spec/unit/helpers/collection_spec.rb +18 -18
  379. data/spec/unit/helpers/scope_chain_spec.rb +6 -6
  380. data/spec/unit/helpers/settings_spec.rb +4 -4
  381. data/spec/unit/i18n_spec.rb +12 -0
  382. data/spec/unit/menu_collection_spec.rb +14 -14
  383. data/spec/unit/menu_item_spec.rb +42 -42
  384. data/spec/unit/menu_spec.rb +20 -20
  385. data/spec/unit/namespace/authorization_spec.rb +8 -8
  386. data/spec/unit/namespace/register_page_spec.rb +11 -11
  387. data/spec/unit/namespace/register_resource_spec.rb +28 -30
  388. data/spec/unit/namespace_spec.rb +20 -20
  389. data/spec/unit/order_clause_spec.rb +81 -0
  390. data/spec/unit/page_controller_spec.rb +1 -1
  391. data/spec/unit/page_spec.rb +18 -12
  392. data/spec/unit/pretty_format_spec.rb +42 -14
  393. data/spec/unit/pundit_adapter_spec.rb +98 -0
  394. data/spec/unit/resource/action_items_spec.rb +15 -12
  395. data/spec/unit/resource/includes_spec.rb +21 -0
  396. data/spec/unit/resource/menu_spec.rb +1 -1
  397. data/spec/unit/resource/naming_spec.rb +35 -21
  398. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  399. data/spec/unit/resource/pagination_spec.rb +6 -6
  400. data/spec/unit/resource/routes_spec.rb +10 -10
  401. data/spec/unit/resource/scopes_spec.rb +14 -7
  402. data/spec/unit/resource/sidebars_spec.rb +6 -6
  403. data/spec/unit/resource_collection_spec.rb +31 -38
  404. data/spec/unit/resource_controller/data_access_spec.rb +96 -30
  405. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  406. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  407. data/spec/unit/resource_controller_spec.rb +73 -70
  408. data/spec/unit/resource_registration_spec.rb +12 -12
  409. data/spec/unit/resource_spec.rb +77 -42
  410. data/spec/unit/routing_spec.rb +39 -31
  411. data/spec/unit/scope_spec.rb +112 -30
  412. data/spec/unit/settings_spec.rb +51 -21
  413. data/spec/unit/view_factory_spec.rb +2 -3
  414. data/spec/unit/view_helpers/breadcrumbs_spec.rb +71 -60
  415. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  416. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  417. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  418. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  419. data/spec/unit/view_helpers/form_helper_spec.rb +10 -23
  420. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +64 -22
  421. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  422. data/spec/unit/views/components/attributes_table_spec.rb +171 -30
  423. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  424. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  425. data/spec/unit/views/components/columns_spec.rb +52 -22
  426. data/spec/unit/views/components/index_list_spec.rb +11 -8
  427. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  428. data/spec/unit/views/components/paginated_collection_spec.rb +79 -90
  429. data/spec/unit/views/components/panel_spec.rb +32 -21
  430. data/spec/unit/views/components/popover_spec.rb +7 -7
  431. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  432. data/spec/unit/views/components/site_title_spec.rb +26 -26
  433. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  434. data/spec/unit/views/components/table_for_spec.rb +237 -35
  435. data/spec/unit/views/components/tabs_spec.rb +39 -0
  436. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  437. data/spec/unit/views/pages/form_spec.rb +17 -10
  438. data/spec/unit/views/pages/index_spec.rb +60 -0
  439. data/spec/unit/views/pages/layout_spec.rb +17 -21
  440. data/spec/unit/views/pages/show_spec.rb +18 -6
  441. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  442. data/tasks/docs.rake +9 -11
  443. data/tasks/parallel_tests.rake +8 -2
  444. data/tasks/test.rake +13 -9
  445. data/tasks/yard.rake +7 -4
  446. metadata +219 -163
  447. data/.document +0 -5
  448. data/README.rdoc +0 -88
  449. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  450. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  451. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  452. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  453. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  454. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  455. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  456. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  457. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  458. data/app/assets/images/active_admin/loading.gif +0 -0
  459. data/app/assets/javascripts/active_admin/application.js +0 -3
  460. data/app/assets/javascripts/active_admin/base.js +0 -5
  461. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +0 -105
  462. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +0 -97
  463. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +0 -4
  464. data/app/assets/javascripts/active_admin/pages/application.js.coffee +0 -21
  465. data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +0 -26
  466. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  467. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -41
  468. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  469. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +0 -38
  470. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +0 -43
  471. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  472. data/app/views/active_admin/resource/index.csv.erb +0 -23
  473. data/docs/3-index-pages/create-an-index.md +0 -29
  474. data/lib/active_admin/comments.rb +0 -83
  475. data/lib/active_admin/comments/comment.rb +0 -42
  476. data/lib/active_admin/comments/views.rb +0 -2
  477. data/lib/active_admin/dependency_checker.rb +0 -46
  478. data/lib/active_admin/inputs/filter_base.rb +0 -33
  479. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  480. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -36
  481. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -40
  482. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  483. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  484. data/lib/active_admin/inputs/filter_select_input.rb +0 -49
  485. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  486. data/lib/active_admin/reloader.rb +0 -130
  487. data/lib/active_admin/resource_controller/actions.rb +0 -81
  488. data/lib/active_admin/sass/active_admin.scss +0 -3
  489. data/lib/active_admin/sass/css_loader.rb +0 -16
  490. data/lib/active_admin/sass/helpers.rb +0 -45
  491. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  492. data/lib/active_admin/views/dashboard_section_renderer.rb +0 -19
  493. data/lib/active_admin/views/pages/dashboard.rb +0 -62
  494. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +0 -1
  495. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +0 -1
  496. data/lib/meta_search_ext.rb +0 -10
  497. data/spec/integration/memory_spec.rb +0 -29
  498. data/spec/integration/stylesheets_spec.rb +0 -41
  499. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  500. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  501. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  502. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  503. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  504. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  505. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  506. data/spec/javascripts/support/jquery.min.js +0 -4
  507. data/spec/spec_helper_without_rails.rb +0 -11
  508. data/spec/unit/generators/install_rails_3_1_spec.rb +0 -16
  509. data/spec/unit/rails_spec.rb +0 -43
  510. data/spec/unit/reloader_spec.rb +0 -124
  511. data/spec/unit/sass/helpers_spec.rb +0 -47
  512. data/tasks/js.rake +0 -32
@@ -17,7 +17,7 @@ module ActiveAdmin
17
17
 
18
18
  attr_reader :namespaces
19
19
  def initialize
20
- @namespaces = {}
20
+ @namespaces = Namespace::Store.new
21
21
  end
22
22
 
23
23
  # Load paths for admin configurations. Add folders to this load path
@@ -36,7 +36,7 @@ module ActiveAdmin
36
36
 
37
37
  # Set the site title image displayed in the main layout (has precendence over :site_title)
38
38
  inheritable_setting :site_title_image, ""
39
-
39
+
40
40
  # Set a favicon
41
41
  inheritable_setting :favicon, false
42
42
 
@@ -67,8 +67,14 @@ module ActiveAdmin
67
67
  # The namespace root.
68
68
  inheritable_setting :root_to, 'dashboard#index'
69
69
 
70
+ # Options that a passed to root_to.
71
+ inheritable_setting :root_to_options, {}
72
+
73
+ # Display breadcrumbs
74
+ inheritable_setting :breadcrumb, true
75
+
70
76
  # Default CSV options
71
- inheritable_setting :csv_options, {:col_sep => ','}
77
+ inheritable_setting :csv_options, { col_sep: ',', byte_order_mark: "\xEF\xBB\xBF" }
72
78
 
73
79
  # Default Download Links options
74
80
  inheritable_setting :download_links, true
@@ -79,6 +85,17 @@ module ActiveAdmin
79
85
  # A proc to be used when a user is not authorized to view the current resource
80
86
  inheritable_setting :on_unauthorized_access, :rescue_active_admin_access_denied
81
87
 
88
+ # A regex to detect unsupported browser, set to false to disable
89
+ inheritable_setting :unsupported_browser_matcher, /MSIE [1-8]\.0/
90
+
91
+ # Request parameters that are permitted by default
92
+ inheritable_setting :permitted_params, [
93
+ :utf8, :_method, :authenticity_token, :commit, :id
94
+ ]
95
+
96
+ # Set flash message keys that shouldn't show in ActiveAdmin
97
+ inheritable_setting :flash_keys_to_except, ['timedout']
98
+
82
99
  # Active Admin makes educated guesses when displaying objects, this is
83
100
  # the list of methods it tries calling in order
84
101
  setting :display_name_methods, [ :display_name,
@@ -92,43 +109,45 @@ module ActiveAdmin
92
109
 
93
110
  # == Deprecated Settings
94
111
 
95
- # (none currently)
112
+ def allow_comments=(*)
113
+ raise "`config.allow_comments` is no longer provided in ActiveAdmin 1.x. Use `config.comments` instead."
114
+ end
96
115
 
97
116
  include AssetRegistration
98
117
 
99
118
  # Event that gets triggered on load of Active Admin
100
119
  BeforeLoadEvent = 'active_admin.application.before_load'.freeze
101
- AfterLoadEvent = 'active_admin.application.after_load'.freeze
120
+ AfterLoadEvent = 'active_admin.application.after_load'.freeze
102
121
 
122
+ # Runs before the app's AA initializer
103
123
  def setup!
104
124
  register_default_assets
105
125
  end
106
126
 
127
+ # Runs after the app's AA initializer
107
128
  def prepare!
108
129
  remove_active_admin_load_paths_from_rails_autoload_and_eager_load
109
130
  attach_reloader
110
- generate_stylesheets
111
131
  end
112
132
 
113
133
  # Registers a brand new configuration for the given resource.
114
134
  def register(resource, options = {}, &block)
115
- ns_name = namespace_name(options)
116
- namespace(ns_name).register resource, options, &block
135
+ ns = options.fetch(:namespace){ default_namespace }
136
+ namespace(ns).register resource, options, &block
117
137
  end
118
138
 
119
139
  # Creates a namespace for the given name
120
140
  #
121
141
  # Yields the namespace if a block is given
122
142
  #
123
- # @returns [Namespace] the new or existing namespace
143
+ # @return [Namespace] the new or existing namespace
124
144
  def namespace(name)
125
145
  name ||= :root
126
146
 
127
- if namespaces[name]
128
- namespace = namespaces[name]
129
- else
130
- namespace = namespaces[name] = Namespace.new(self, name)
147
+ namespace = namespaces[name] ||= begin
148
+ namespace = Namespace.new(self, name)
131
149
  ActiveAdmin::Event.dispatch ActiveAdmin::Namespace::RegisterEvent, namespace
150
+ namespace
132
151
  end
133
152
 
134
153
  yield(namespace) if block_given?
@@ -139,12 +158,12 @@ module ActiveAdmin
139
158
  # Register a page
140
159
  #
141
160
  # @param name [String] The page name
142
- # @options [Hash] Accepts option :namespace.
161
+ # @option [Hash] Accepts option :namespace.
143
162
  # @&block The registration block.
144
163
  #
145
164
  def register_page(name, options = {}, &block)
146
- ns_name = namespace_name(options)
147
- namespace(ns_name).register_page name, options, &block
165
+ ns = options.fetch(:namespace){ default_namespace }
166
+ namespace(ns).register_page name, options, &block
148
167
  end
149
168
 
150
169
  # Whether all configuration files have been loaded
@@ -155,7 +174,7 @@ module ActiveAdmin
155
174
  # Removes all defined controllers from memory. Useful in
156
175
  # development, where they are reloaded on each request.
157
176
  def unload!
158
- namespaces.values.each{ |namespace| namespace.unload! }
177
+ namespaces.each &:unload!
159
178
  @@loaded = false
160
179
  end
161
180
 
@@ -171,9 +190,13 @@ module ActiveAdmin
171
190
  end
172
191
  end
173
192
 
193
+ def load(file)
194
+ DatabaseHitDuringLoad.capture{ super }
195
+ end
196
+
174
197
  # Returns ALL the files to be loaded
175
198
  def files
176
- load_paths.flatten.compact.uniq.map{ |path| Dir["#{path}/**/*.rb"] }.flatten
199
+ load_paths.flatten.compact.uniq.flat_map{ |path| Dir["#{path}/**/*.rb"] }
177
200
  end
178
201
 
179
202
  def router
@@ -192,62 +215,52 @@ module ActiveAdmin
192
215
  #
193
216
  %w(before_filter skip_before_filter after_filter skip_after_filter around_filter skip_filter).each do |name|
194
217
  define_method name do |*args, &block|
195
- ActiveAdmin::BaseController.send name, *args, &block
196
- ActiveAdmin::Devise::PasswordsController.send name, *args, &block
197
- ActiveAdmin::Devise::SessionsController.send name, *args, &block
198
- ActiveAdmin::Devise::UnlocksController.send name, *args, &block
218
+ controllers_for_filters.each do |controller|
219
+ controller.public_send name, *args, &block
220
+ end
199
221
  end
200
222
  end
201
223
 
202
- # Helper method to add a dashboard section
203
- def dashboard_section(name, options = {}, &block)
204
- ActiveAdmin::Dashboards.add_section(name, options, &block)
224
+ def controllers_for_filters
225
+ controllers = [BaseController]
226
+ controllers.push *Devise.controllers_for_filters if Dependency.devise?
227
+ controllers
205
228
  end
206
229
 
207
- private
208
-
209
- # Return either the passed in namespace or the default
210
- def namespace_name(options)
211
- options.fetch(:namespace){ default_namespace }
212
- end
230
+ private
213
231
 
214
232
  def register_default_assets
215
- register_stylesheet 'active_admin.css', :media => 'screen'
216
- register_stylesheet 'active_admin/print.css', :media => 'print'
217
-
218
- unless ActiveAdmin.use_asset_pipeline?
219
- register_javascript 'jquery.min.js'
220
- register_javascript 'jquery-ui.min.js'
221
- register_javascript 'jquery_ujs.js'
222
- end
233
+ register_stylesheet 'active_admin.css', media: 'screen'
234
+ register_stylesheet 'active_admin/print.css', media: 'print'
223
235
 
224
236
  register_javascript 'active_admin.js'
225
237
  end
226
238
 
227
- # Since we're dealing with all our own file loading, we need
228
- # to remove our paths from the ActiveSupport autoload paths.
229
- # If not, file naming becomes very important and can cause clashes.
239
+ # Since app/admin is alphabetically before app/models, we have to remove it
240
+ # from the host app's +autoload_paths+ to prevent missing constant errors.
241
+ #
242
+ # As well, we have to remove it from +eager_load_paths+ to prevent the
243
+ # files from being loaded twice in production.
230
244
  def remove_active_admin_load_paths_from_rails_autoload_and_eager_load
231
- ActiveSupport::Dependencies.autoload_paths.reject!{|path| load_paths.include?(path) }
232
- # Don't eagerload our configs, we'll deal with them ourselves
233
- Rails.application.config.eager_load_paths = Rails.application.config.eager_load_paths.reject do |path|
234
- load_paths.include?(path)
235
- end
245
+ ActiveSupport::Dependencies.autoload_paths -= load_paths
246
+ Rails.application.config.eager_load_paths -= load_paths
236
247
  end
237
248
 
249
+ # Hooks the app/admin directory into our Rails Engine's +watchable_dirs+, so the
250
+ # files are automatically reloaded in your development environment.
251
+ #
252
+ # If files have changed on disk, we forcibly unload all AA configurations, and
253
+ # tell the host application to redraw routes (triggering AA itself to reload).
238
254
  def attach_reloader
239
- ActiveAdmin::Reloader.build(Rails.application, self, Rails.version).attach!
240
- end
241
-
242
- def generate_stylesheets
243
- # Create our own asset pipeline in Rails 3.0
244
- if ActiveAdmin.use_asset_pipeline?
245
- # Add our mixins to the load path for SASS
246
- ::Sass::Engine::DEFAULT_OPTIONS[:load_paths] << File.expand_path("../../../app/assets/stylesheets", __FILE__)
247
- else
248
- require 'active_admin/sass/css_loader'
249
- ::Sass::Plugin.add_template_location(File.expand_path("../../../app/assets/stylesheets", __FILE__))
250
- ::Sass::Plugin.add_template_location(File.expand_path("../sass", __FILE__))
255
+ load_paths.each do |path|
256
+ ActiveAdmin::Engine.config.watchable_dirs[path] = [:rb]
257
+ end
258
+
259
+ Rails.application.config.after_initialize do
260
+ ActionDispatch::Reloader.to_prepare do
261
+ ActiveAdmin.application.unload!
262
+ Rails.application.reload_routes!
263
+ end
251
264
  end
252
265
  end
253
266
  end
@@ -10,7 +10,7 @@ module ActiveAdmin
10
10
  end
11
11
 
12
12
  def clear_stylesheets!
13
- @stylesheets = {}
13
+ stylesheets.clear
14
14
  end
15
15
 
16
16
  def register_javascript(name)
@@ -22,7 +22,7 @@ module ActiveAdmin
22
22
  end
23
23
 
24
24
  def clear_javascripts!
25
- @javascripts = Set.new
25
+ javascripts.clear
26
26
  end
27
27
 
28
28
  end
@@ -49,7 +49,7 @@ module ActiveAdmin
49
49
  # global navigation. To deal with this nicely in a case statement, take
50
50
  # a look at `#normalized(klasss)`
51
51
  #
52
- # @returns [Boolean]
52
+ # @return [Boolean]
53
53
  def authorized?(action, subject = nil)
54
54
  true
55
55
  end
@@ -66,7 +66,7 @@ module ActiveAdmin
66
66
  # one of the `ActiveAdmin::Auth::*` symbols. Defaults to `Auth::READ` if
67
67
  # no action passed in.
68
68
  #
69
- # @returns [ActiveRecord::Relation] A new collection, scoped to the
69
+ # @return [ActiveRecord::Relation] A new collection, scoped to the
70
70
  # objects that the current user has access to.
71
71
  def scope_collection(collection, action = Auth::READ)
72
72
  collection
@@ -1,5 +1,3 @@
1
- require 'inherited_resources'
2
-
3
1
  require 'active_admin/base_controller/authorization'
4
2
  require 'active_admin/base_controller/menu'
5
3
 
@@ -8,6 +6,7 @@ module ActiveAdmin
8
6
  # It implements ActiveAdmin controllers core features.
9
7
  class BaseController < ::InheritedResources::Base
10
8
  helper ::ActiveAdmin::ViewHelpers
9
+ helper_method :env
11
10
 
12
11
  layout :determine_active_admin_layout
13
12
 
@@ -23,7 +22,7 @@ module ActiveAdmin
23
22
  attr_accessor :active_admin_config
24
23
  end
25
24
 
26
- # By default Rails will render un-implemented actions when the view exists. Becuase Active
25
+ # By default Rails will render un-implemented actions when the view exists. Because Active
27
26
  # Admin allows you to not render any of the actions by using the #actions method, we need
28
27
  # to check if they are implemented.
29
28
  def only_render_implemented_actions
@@ -1,39 +1,21 @@
1
1
  module ActiveAdmin
2
-
3
- # Exception class to raise when there is an authorized access
4
- # exception thrown. The exception has a few goodies that may
5
- # be useful for capturing / recognizing security issues.
6
- class AccessDenied < StandardError
7
- attr_reader :user, :action, :subject
8
-
9
- def initialize(user, action, subject)
10
- @user, @action, @subject = user, action, subject
11
-
12
- super()
13
- end
14
-
15
- def message
16
- I18n.t("active_admin.access_denied.message")
17
- end
18
- end
19
-
20
2
  class BaseController < ::InheritedResources::Base
21
3
  module Authorization
22
4
  include MethodOrProcHelper
23
5
  extend ActiveSupport::Concern
24
6
 
25
7
  ACTIONS_DICTIONARY = {
26
- :index => ActiveAdmin::Authorization::READ,
27
- :show => ActiveAdmin::Authorization::READ,
28
- :new => ActiveAdmin::Authorization::CREATE,
29
- :create => ActiveAdmin::Authorization::CREATE,
30
- :edit => ActiveAdmin::Authorization::UPDATE,
31
- :update => ActiveAdmin::Authorization::UPDATE,
32
- :destroy => ActiveAdmin::Authorization::DESTROY
8
+ index: ActiveAdmin::Authorization::READ,
9
+ show: ActiveAdmin::Authorization::READ,
10
+ new: ActiveAdmin::Authorization::CREATE,
11
+ create: ActiveAdmin::Authorization::CREATE,
12
+ edit: ActiveAdmin::Authorization::UPDATE,
13
+ update: ActiveAdmin::Authorization::UPDATE,
14
+ destroy: ActiveAdmin::Authorization::DESTROY
33
15
  }
34
16
 
35
17
  included do
36
- rescue_from ActiveAdmin::AccessDenied, :with => :dispatch_active_admin_access_denied
18
+ rescue_from ActiveAdmin::AccessDenied, with: :dispatch_active_admin_access_denied
37
19
 
38
20
  helper_method :authorized?
39
21
  helper_method :authorize!
@@ -50,7 +32,7 @@ module ActiveAdmin
50
32
  # @param [any] subject The subject that the user is trying to perform
51
33
  # the action on.
52
34
  #
53
- # @returns [Boolean]
35
+ # @return [Boolean]
54
36
  #
55
37
  def authorized?(action, subject = nil)
56
38
  active_admin_authorization.authorized?(action, subject)
@@ -67,7 +49,7 @@ module ActiveAdmin
67
49
  # @param [any] subject The subject that the user is trying to perform
68
50
  # the action on.
69
51
  #
70
- # @returns [Boolean] True if authorized, otherwise raises
52
+ # @return [Boolean] True if authorized, otherwise raises
71
53
  # an ActiveAdmin::AccessDenied.
72
54
  def authorize!(action, subject = nil)
73
55
  unless authorized? action, subject
@@ -87,7 +69,7 @@ module ActiveAdmin
87
69
 
88
70
  # Retrieve or instantiate the authorization instance for this resource
89
71
  #
90
- # @returns [ActiveAdmin::AuthorizationAdapter]
72
+ # @return [ActiveAdmin::AuthorizationAdapter]
91
73
  def active_admin_authorization
92
74
  @active_admin_authorization ||=
93
75
  active_admin_authorization_adapter.new active_admin_config, current_active_admin_user
@@ -95,7 +77,7 @@ module ActiveAdmin
95
77
 
96
78
  # Returns the class to be used as the authorization adapter
97
79
  #
98
- # @returns [Class]
80
+ # @return [Class]
99
81
  def active_admin_authorization_adapter
100
82
  adapter = active_admin_namespace.authorization_adapter
101
83
  if adapter.is_a? String
@@ -111,7 +93,7 @@ module ActiveAdmin
111
93
  #
112
94
  # @param [String, Symbol] action The controller action name.
113
95
  #
114
- # @returns [Symbol] The permission name to use.
96
+ # @return [Symbol] The permission name to use.
115
97
  def action_to_permission(action)
116
98
  if action && action = action.to_sym
117
99
  Authorization::ACTIONS_DICTIONARY[action] || action
@@ -13,5 +13,5 @@ ActiveAdmin.before_load do |app|
13
13
  require "active_admin/batch_actions/views/batch_action_selector"
14
14
 
15
15
  # Register the views with the view factory
16
- app.view_factory.register :batch_action_selector => ActiveAdmin::BatchActions::BatchActionSelector
16
+ app.view_factory.register batch_action_selector: ActiveAdmin::BatchActions::BatchActionSelector
17
17
  end
@@ -2,12 +2,14 @@ module ActiveAdmin
2
2
  module BatchActions
3
3
  module Controller
4
4
 
5
- # Controller Action that get's called when submitting the batch action form
5
+ # Controller action that is called when submitting the batch action form
6
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
7
+ if action_present?
8
+ selection = params[:collection_selection] || []
9
+ inputs = JSON.parse params[:batch_action_inputs] || '{}'
10
+ valid_keys = render_in_context(self, current_batch_action.inputs).try(:keys)
11
+ inputs = inputs.with_indifferent_access.slice *valid_keys
12
+ instance_exec selection, inputs, &current_batch_action.block
11
13
  else
12
14
  raise "Couldn't find batch action \"#{params[:batch_action]}\""
13
15
  end
@@ -15,11 +17,25 @@ module ActiveAdmin
15
17
 
16
18
  protected
17
19
 
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
20
+ def action_present?
21
+ params[:batch_action].present? && current_batch_action
21
22
  end
22
23
 
24
+ def current_batch_action
25
+ active_admin_config.batch_actions.detect{ |action| action.sym.to_s == params[:batch_action] }
26
+ end
27
+
28
+ COLLECTION_APPLIES = [
29
+ :authorization_scope,
30
+ :collection_decorator,
31
+ :filtering,
32
+ :scoping,
33
+ :includes
34
+ ].freeze
35
+
36
+ def batch_action_collection(only = COLLECTION_APPLIES)
37
+ find_collection(only: only)
38
+ end
23
39
  end
24
40
  end
25
41
  end
@@ -5,7 +5,7 @@ module ActiveAdmin
5
5
  def initialize(*)
6
6
  super
7
7
  @batch_actions = {}
8
- add_default_batch_actions
8
+ add_default_batch_action
9
9
  end
10
10
 
11
11
  # @return [Array] The set of batch actions for this resource
@@ -31,7 +31,8 @@ module ActiveAdmin
31
31
  # @param [Hash] options
32
32
  # => :if is a proc that will be called to determine if the BatchAction should be displayed
33
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
34
+ # => :confirm is a string to prompt the user with (or a boolean to use the default message)
35
+ # => :form is a Hash of form fields you want the user to fill out
35
36
  #
36
37
  def add_batch_action(sym, title, options = {}, &block)
37
38
  @batch_actions[sym] = ActiveAdmin::BatchAction.new(sym, title, options, &block)
@@ -39,7 +40,7 @@ module ActiveAdmin
39
40
 
40
41
  # Remove a batch action
41
42
  # @param [Symbol] sym
42
- # @returns [ActiveAdmin::BatchAction] the batch action, if it was present
43
+ # @return [ActiveAdmin::BatchAction] the batch action, if it was present
43
44
  #
44
45
  def remove_batch_action(sym)
45
46
  @batch_actions.delete(sym.to_sym)
@@ -58,21 +59,24 @@ module ActiveAdmin
58
59
  private
59
60
 
60
61
  # @return [ActiveAdmin::BatchAction] The default "delete" action
61
- def add_default_batch_actions
62
+ def add_default_batch_action
62
63
  destroy_options = {
63
- :priority => 100,
64
- :confirm => proc { I18n.t('active_admin.batch_actions.delete_confirmation', :plural_model => active_admin_config.plural_resource_label.downcase) },
65
- :if => proc{ controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, active_admin_config.resource_class) }
64
+ priority: 100,
65
+ confirm: proc{ I18n.t('active_admin.batch_actions.delete_confirmation', plural_model: active_admin_config.plural_resource_label.downcase) },
66
+ if: proc{ controller.action_methods.include?('destroy') && authorized?(ActiveAdmin::Auth::DESTROY, active_admin_config.resource_class) }
66
67
  }
67
68
 
68
69
  add_batch_action :destroy, proc { I18n.t('active_admin.delete') }, destroy_options do |selected_ids|
69
- active_admin_config.resource_class.find(selected_ids).each { |r| r.destroy }
70
+ batch_action_collection.find(selected_ids).each do |record|
71
+ authorize! ActiveAdmin::Auth::DESTROY, record
72
+ destroy_resource(record)
73
+ end
70
74
 
71
75
  redirect_to active_admin_config.route_collection_path(params),
72
- :notice => I18n.t("active_admin.batch_actions.succesfully_destroyed",
73
- :count => selected_ids.count,
74
- :model => active_admin_config.resource_label.downcase,
75
- :plural_model => active_admin_config.plural_resource_label(:count => selected_ids.count).downcase)
76
+ notice: I18n.t("active_admin.batch_actions.succesfully_destroyed",
77
+ count: selected_ids.count,
78
+ model: active_admin_config.resource_label.downcase,
79
+ plural_model: active_admin_config.plural_resource_label(count: selected_ids.count).downcase)
76
80
  end
77
81
  end
78
82
 
@@ -83,7 +87,9 @@ module ActiveAdmin
83
87
 
84
88
  include Comparable
85
89
 
86
- attr_reader :block, :title, :sym, :confirm
90
+ attr_reader :block, :title, :sym
91
+
92
+ DEFAULT_CONFIRM_MESSAGE = proc{ I18n.t 'active_admin.batch_actions.default_confirmation' }
87
93
 
88
94
  # Create a Batch Action
89
95
  #
@@ -92,24 +98,47 @@ module ActiveAdmin
92
98
  # BatchAction.new :flag
93
99
  # => Will create an action that appears in the action list popover
94
100
  #
95
- # BatchAction.new( :flag ) { |selection| redirect_to collection_path, :notice => "#{selection.length} users flagged" }
101
+ # BatchAction.new(:flag) { |selection| redirect_to collection_path, notice: "#{selection.length} users flagged" }
96
102
  # => Will create an action that uses a block to process the request (which receives one paramater of the selected objects)
97
103
  #
98
- # BatchAction.new( "Perform Long Operation on the" ) { |selection| }
104
+ # BatchAction.new("Perform Long Operation on") { |selection| }
99
105
  # => You can create batch actions with a title instead of a Symbol
100
106
  #
101
- # BatchAction.new( :flag, :if => proc { can? :flag, AdminUser } ) { |selection| }
102
- # => You can provide an optional :if proc to optionally display the batch action
107
+ # BatchAction.new(:flag, if: proc{ can? :flag, AdminUser }) { |selection| }
108
+ # => You can provide an `:if` proc to choose when the batch action should be displayed
109
+ #
110
+ # BatchAction.new :flag, confirm: true
111
+ # => You can pass `true` to `:confirm` to use the default confirm message.
112
+ #
113
+ # BatchAction.new(:flag, confirm: "Are you sure?") { |selection| }
114
+ # => You can pass a custom confirmation message through `:confirm`
115
+ #
116
+ # BatchAction.new(:flag, form: {foo: :text, bar: :checkbox}) { |selection, inputs| }
117
+ # => You can pass a hash of options to `:form` that will be rendered as form input fields for the user to fill out.
103
118
  #
104
119
  def initialize(sym, title, options = {}, &block)
105
120
  @sym, @title, @options, @block, @confirm = sym, title, options, block, options[:confirm]
106
121
  @block ||= proc {}
107
122
  end
108
123
 
124
+ def confirm
125
+ if @confirm == true
126
+ DEFAULT_CONFIRM_MESSAGE
127
+ elsif !@confirm && @options[:form]
128
+ DEFAULT_CONFIRM_MESSAGE
129
+ else
130
+ @confirm
131
+ end
132
+ end
133
+
134
+ def inputs
135
+ @options[:form]
136
+ end
137
+
109
138
  # Returns the display if block. If the block was not explicitly defined
110
139
  # a default block always returning true will be returned.
111
140
  def display_if_block
112
- @options[:if] || proc { true }
141
+ @options[:if] || proc{ true }
113
142
  end
114
143
 
115
144
  # Used for sorting