activeadmin 0.6.6 → 1.0.0.pre1

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 (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
@@ -7,17 +7,28 @@ module ActiveAdmin
7
7
  # The module also deals with authorization and resource callbacks.
8
8
  #
9
9
  module DataAccess
10
- extend ActiveSupport::Concern
11
10
 
12
- include ActiveAdmin::Callbacks
13
- include ActiveAdmin::ScopeChain
11
+ def self.included(base)
12
+ base.class_exec do
13
+ include Callbacks
14
+ include ScopeChain
14
15
 
15
- included do
16
- define_active_admin_callbacks :build, :create, :update, :save, :destroy
16
+ define_active_admin_callbacks :build, :create, :update, :save, :destroy
17
+ end
17
18
  end
18
19
 
19
20
  protected
20
21
 
22
+ COLLECTION_APPLIES = [
23
+ :authorization_scope,
24
+ :sorting,
25
+ :filtering,
26
+ :scoping,
27
+ :includes,
28
+ :pagination,
29
+ :collection_decorator
30
+ ].freeze
31
+
21
32
  # Retrieve, memoize and authorize the current collection from the db. This
22
33
  # method delegates the finding of the collection to #find_collection.
23
34
  #
@@ -25,16 +36,13 @@ module ActiveAdmin
25
36
  # either the @collection instance variable or an instance variable named
26
37
  # after the resource that the collection is for. eg: Post => @post.
27
38
  #
28
- # @returns [ActiveRecord::Relation] The collection for the index
39
+ # @return [ActiveRecord::Relation] The collection for the index
29
40
  def collection
30
- _collection = get_collection_ivar
31
-
32
- return _collection if _collection
33
-
34
- _collection = find_collection
35
- authorize! ActiveAdmin::Authorization::READ, active_admin_config.resource_class
36
-
37
- set_collection_ivar _collection
41
+ get_collection_ivar || begin
42
+ collection = find_collection
43
+ authorize! Authorization::READ, active_admin_config.resource_class
44
+ set_collection_ivar collection
45
+ end
38
46
  end
39
47
 
40
48
 
@@ -43,17 +51,12 @@ module ActiveAdmin
43
51
  # some additional db # work before your controller returns and
44
52
  # authorizes the collection.
45
53
  #
46
- # @returns [ActiveRecord::Relation] The collectin for the index
47
- def find_collection
54
+ # @return [ActiveRecord::Relation] The collection for the index
55
+ def find_collection(options = {})
48
56
  collection = scoped_collection
49
-
50
- collection = apply_authorization_scope(collection)
51
- collection = apply_sorting(collection)
52
- collection = apply_filtering(collection)
53
- collection = apply_scoping(collection)
54
- collection = apply_pagination(collection)
55
- collection = apply_decorator(collection)
56
-
57
+ collection_applies(options).each do |applyer|
58
+ collection = send("apply_#{applyer}", collection)
59
+ end
57
60
  collection
58
61
  end
59
62
 
@@ -81,37 +84,27 @@ module ActiveAdmin
81
84
  # * update
82
85
  # * destroy
83
86
  #
84
- # @returns [ActiveRecord::Base] An active record object
87
+ # @return [ActiveRecord::Base] An active record object
85
88
  def resource
86
- _resource = get_resource_ivar
87
-
88
- return _resource if _resource
89
-
90
- _resource = find_resource
91
- authorize_resource! _resource
89
+ get_resource_ivar || begin
90
+ resource = find_resource
91
+ authorize_resource! resource
92
92
 
93
- if decorator?
94
- _resource = decorator_class.new(_resource)
93
+ resource = apply_decorator resource
94
+ set_resource_ivar resource
95
95
  end
96
-
97
- set_resource_ivar(_resource)
98
- end
99
-
100
- def decorator?
101
- !!active_admin_config.decorator_class
102
96
  end
103
97
 
104
- def decorator_class
105
- active_admin_config.decorator_class
106
- end
107
-
108
-
109
98
  # Does the actual work of finding a resource in the database. This
110
99
  # method uses the finder method as defined in InheritedResources.
111
100
  #
112
- # @returns [ActiveRecord::Base] An active record object.
101
+ # Note that public_send can't be used here because Rails 3.2's
102
+ # ActiveRecord::Associations::CollectionProxy (belongs_to associations)
103
+ # mysteriously returns an Enumerator object.
104
+ #
105
+ # @return [ActiveRecord::Base] An active record object.
113
106
  def find_resource
114
- scoped_collection.send(method_for_find, params[:id])
107
+ scoped_collection.send method_for_find, params[:id]
115
108
  end
116
109
 
117
110
 
@@ -122,31 +115,34 @@ module ActiveAdmin
122
115
  # This method is used to instantiate and authorize new resources in the
123
116
  # new and create controller actions.
124
117
  #
125
- # @returns [ActiveRecord::Base] An un-saved active record base object
118
+ # @return [ActiveRecord::Base] An un-saved active record base object
126
119
  def build_resource
127
- return resource if resource = get_resource_ivar
128
-
129
- resource = build_new_resource
130
-
131
- run_build_callbacks resource
132
- authorize_resource! resource
120
+ get_resource_ivar || begin
121
+ resource = build_new_resource
122
+ run_build_callbacks resource
123
+ authorize_resource! resource
133
124
 
134
- set_resource_ivar(resource)
125
+ resource = apply_decorator resource
126
+ set_resource_ivar resource
127
+ end
135
128
  end
136
129
 
137
130
  # Builds a new resource. This method uses the method_for_build provided
138
131
  # by Inherited Resources.
139
132
  #
140
- # @returns [ActiveRecord::Base] An un-saved active record base object
133
+ # Note that public_send can't be used here w/ Rails 3.2 & a belongs_to
134
+ # config, or you'll get undefined method `build' for []:Array.
135
+ #
136
+ # @return [ActiveRecord::Base] An un-saved active record base object
141
137
  def build_new_resource
142
- scoped_collection.send(method_for_build, *resource_params)
138
+ scoped_collection.send method_for_build, *resource_params
143
139
  end
144
140
 
145
141
  # Calls all the appropriate callbacks and then creates the new resource.
146
142
  #
147
143
  # @param [ActiveRecord::Base] object The new resource to create
148
144
  #
149
- # @returns [void]
145
+ # @return [void]
150
146
  def create_resource(object)
151
147
  run_create_callbacks object do
152
148
  save_resource(object)
@@ -157,7 +153,7 @@ module ActiveAdmin
157
153
  #
158
154
  # @param [ActiveRecord::Base] object The new resource to save
159
155
  #
160
- # @returns [void]
156
+ # @return [void]
161
157
  def save_resource(object)
162
158
  run_save_callbacks object do
163
159
  object.save
@@ -173,7 +169,7 @@ module ActiveAdmin
173
169
  # and the Active Record "role" in the second. The role
174
170
  # may be set to nil.
175
171
  #
176
- # @returns [void]
172
+ # @return [void]
177
173
  def update_resource(object, attributes)
178
174
  if object.respond_to?(:assign_attributes)
179
175
  object.assign_attributes(*attributes)
@@ -188,7 +184,7 @@ module ActiveAdmin
188
184
 
189
185
  # Destroys an object from the database and calls appropriate callbacks.
190
186
  #
191
- # @returns [void]
187
+ # @return [void]
192
188
  def destroy_resource(object)
193
189
  run_destroy_callbacks object do
194
190
  object.destroy
@@ -208,40 +204,37 @@ module ActiveAdmin
208
204
  #
209
205
  # @param [ActiveRecord::Relation] collection The collection to scope
210
206
  #
211
- # @retruns [ActiveRecord::Relation] a scoped collection of query
207
+ # @return [ActiveRecord::Relation] a scoped collection of query
212
208
  def apply_authorization_scope(collection)
213
209
  action_name = action_to_permission(params[:action])
214
210
  active_admin_authorization.scope_collection(collection, action_name)
215
211
  end
216
212
 
217
-
218
213
  def apply_sorting(chain)
219
214
  params[:order] ||= active_admin_config.sort_order
220
- if params[:order] && params[:order] =~ /^([\w\_\.]+)_(desc|asc)$/
221
- column = $1
222
- order = $2
223
- table = active_admin_config.resource_column_names.include?(column) ? active_admin_config.resource_table_name : nil
224
- table_column = (column =~ /\./) ? column :
225
- [table, active_admin_config.resource_quoted_column_name(column)].compact.join(".")
226
-
227
- chain.reorder("#{table_column} #{order}")
215
+
216
+ order_clause = OrderClause.new params[:order]
217
+
218
+ if order_clause.valid?
219
+ chain.reorder(order_clause.to_sql(active_admin_config))
228
220
  else
229
221
  chain # just return the chain
230
222
  end
231
223
  end
232
224
 
225
+ # Applies any Ransack search methods to the currently scoped collection.
226
+ # Both `search` and `ransack` are provided, but we use `ransack` to prevent conflicts.
233
227
  def apply_filtering(chain)
234
- @search = chain.metasearch(clean_search_params(params[:q]))
235
- @search.relation
228
+ @search = chain.ransack clean_search_params params[:q]
229
+ @search.result
236
230
  end
237
231
 
238
- def clean_search_params(search_params)
239
- return {} unless search_params.is_a?(Hash)
240
- search_params = search_params.dup
241
- search_params.delete_if do |key, value|
242
- value == ""
232
+ def clean_search_params(params)
233
+ if params.is_a? Hash
234
+ params.dup.delete_if{ |key, value| value.blank? }
235
+ else
236
+ {}
243
237
  end
244
- search_params
245
238
  end
246
239
 
247
240
  def apply_scoping(chain)
@@ -254,13 +247,21 @@ module ActiveAdmin
254
247
  end
255
248
  end
256
249
 
250
+ def apply_includes(chain)
251
+ if active_admin_config.includes.any?
252
+ chain.includes *active_admin_config.includes
253
+ else
254
+ chain
255
+ end
256
+ end
257
+
257
258
  def collection_before_scope
258
259
  @collection_before_scope
259
260
  end
260
261
 
261
262
  def current_scope
262
263
  @current_scope ||= if params[:scope]
263
- active_admin_config.get_scope_by_id(params[:scope]) if params[:scope]
264
+ active_admin_config.get_scope_by_id(params[:scope])
264
265
  else
265
266
  active_admin_config.default_scope(self)
266
267
  end
@@ -270,32 +271,39 @@ module ActiveAdmin
270
271
  page_method_name = Kaminari.config.page_method_name
271
272
  page = params[Kaminari.config.param_name]
272
273
 
273
- chain.send(page_method_name, page).per(per_page)
274
+ chain.public_send(page_method_name, page).per(per_page)
274
275
  end
275
276
 
276
- def per_page
277
- return max_csv_records if request.format == 'text/csv'
278
- return max_per_page if active_admin_config.paginate == false
279
-
280
- @per_page || active_admin_config.per_page
277
+ def collection_applies(options = {})
278
+ only = Array(options.fetch(:only, COLLECTION_APPLIES))
279
+ except = Array(options.fetch(:except, []))
280
+ COLLECTION_APPLIES && only - except
281
281
  end
282
282
 
283
- def max_csv_records
284
- 10_000
283
+ def per_page
284
+ if active_admin_config.paginate
285
+ dynamic_per_page || configured_per_page
286
+ else
287
+ max_per_page
288
+ end
285
289
  end
286
290
 
287
- def max_per_page
288
- 10_000
291
+ def dynamic_per_page
292
+ params[:per_page] || @per_page
289
293
  end
290
294
 
291
- def apply_decorator(chain)
292
- if decorator?
293
- decorator_class.decorate_collection(chain)
295
+ def configured_per_page
296
+ if active_admin_config.per_page.is_a?(Array)
297
+ active_admin_config.per_page[0]
294
298
  else
295
- chain
299
+ active_admin_config.per_page
296
300
  end
297
301
  end
298
302
 
303
+ def max_per_page
304
+ 10_000
305
+ end
306
+
299
307
  end
300
308
  end
301
309
  end
@@ -1,20 +1,102 @@
1
1
  module ActiveAdmin
2
2
  class ResourceController < BaseController
3
3
  module Decorators
4
- protected
5
4
 
6
- def resource
7
- decorator = active_admin_config.decorator_class
8
- resource = super
9
- decorator ? decorator.new(resource) : resource
5
+ protected
6
+
7
+ def apply_decorator(resource)
8
+ decorate? ? decorator_class.new(resource) : resource
9
+ end
10
+
11
+ def apply_collection_decorator(collection)
12
+ if decorate?
13
+ collection_decorator.decorate collection, with: decorator_class
14
+ else
15
+ collection
16
+ end
17
+ end
18
+
19
+ def self.undecorate(resource)
20
+ if resource.respond_to?(:decorated?) && resource.decorated?
21
+ resource.model
22
+ else
23
+ resource
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def decorate?
30
+ case action_name
31
+ when 'new', 'edit'
32
+ form = active_admin_config.get_page_presenter :form
33
+ form && form.options[:decorate] && decorator_class.present?
34
+ else
35
+ decorator_class.present?
36
+ end
37
+ end
38
+
39
+ def decorator_class
40
+ active_admin_config.decorator_class
10
41
  end
11
42
 
12
- def active_admin_collection
13
- decorator = active_admin_config.decorator_class
14
- collection = super
15
- decorator ? decorator.decorate_collection(collection) : collection
43
+ # When using Draper, we wrap the collection draper in a new class that
44
+ # correctly delegates methods that Active Admin depends on.
45
+ def collection_decorator
46
+ if decorator_class
47
+ Wrapper.wrap decorator_class
48
+ end
16
49
  end
17
50
 
51
+ class Wrapper
52
+ @cache = {}
53
+
54
+ def self.wrap(decorator)
55
+ collection_decorator = find_collection_decorator(decorator)
56
+
57
+ if draper_collection_decorator? collection_decorator
58
+ name = "#{collection_decorator.name} of #{decorator} + ActiveAdmin"
59
+ @cache[name] ||= wrap! collection_decorator, name
60
+ else
61
+ collection_decorator
62
+ end
63
+ end
64
+
65
+ private
66
+
67
+ def self.wrap!(parent, name)
68
+ ::Class.new parent do
69
+ delegate :reorder, :page, :current_page, :total_pages, :limit_value,
70
+ :total_count, :num_pages, :to_key, :group_values, :except,
71
+ :find_each
72
+
73
+ define_singleton_method(:name) { name }
74
+ end
75
+ end
76
+
77
+ # Draper::CollectionDecorator was introduced in 1.0.0
78
+ # Draper::Decorator#collection_decorator_class was introduced in 1.3.0
79
+ def self.find_collection_decorator(decorator)
80
+ if Dependency.draper? '>= 1.3.0'
81
+ decorator.collection_decorator_class
82
+ elsif Dependency.draper? '>= 1.0.0'
83
+ draper_collection_decorator
84
+ else
85
+ decorator
86
+ end
87
+ end
88
+
89
+ def self.draper_collection_decorator?(decorator)
90
+ decorator && decorator <= draper_collection_decorator
91
+ rescue NameError
92
+ false
93
+ end
94
+
95
+ def self.draper_collection_decorator
96
+ ::Draper::CollectionDecorator
97
+ end
98
+
99
+ end
18
100
  end
19
101
  end
20
102
  end
@@ -0,0 +1,37 @@
1
+ require 'csv'
2
+
3
+ module ActiveAdmin
4
+ class ResourceController < BaseController
5
+
6
+ # This module overrides CSV responses to allow large data downloads.
7
+ # Could be expanded to JSON and XML in the future.
8
+ #
9
+ module Streaming
10
+
11
+ def index
12
+ super do |format|
13
+ format.csv { stream_csv }
14
+ yield(format) if block_given?
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def stream_resource(&block)
21
+ headers['X-Accel-Buffering'] = 'no'
22
+ headers['Cache-Control'] = 'no-cache'
23
+ self.response_body = Enumerator.new &block
24
+ end
25
+
26
+ def csv_filename
27
+ "#{resource_collection_name.to_s.gsub('_', '-')}-#{Time.zone.now.to_date.to_s(:default)}.csv"
28
+ end
29
+
30
+ def stream_csv
31
+ headers['Content-Disposition'] = %{attachment; filename="#{csv_filename}"}
32
+ stream_resource &active_admin_config.csv_builder.method(:build).to_proc.curry[self]
33
+ end
34
+
35
+ end
36
+ end
37
+ end