yousty-activeadmin 1.0.4.pre → 1.0.5.pre

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -211
  3. data/CONTRIBUTING.md +73 -39
  4. data/Gemfile +38 -20
  5. data/Guardfile +1 -0
  6. data/LICENSE +1 -1
  7. data/README.md +48 -24
  8. data/Rakefile +12 -4
  9. data/activeadmin.gemspec +21 -26
  10. data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
  11. data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
  12. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  13. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  14. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  15. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +3 -4
  16. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
  17. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  18. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  19. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  20. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  21. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +29 -58
  22. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +2 -3
  23. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  24. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +51 -15
  25. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  26. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  27. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  28. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  29. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -12
  32. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
  33. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  34. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  35. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  36. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +0 -0
  37. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  38. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  39. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +1 -0
  40. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  41. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  42. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  43. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
  44. data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
  45. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  46. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_rounded.css.scss → _rounded.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
  49. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  51. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  52. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +10 -7
  53. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  54. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  55. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  56. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  57. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  58. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  59. data/app/views/active_admin/devise/sessions/new.html.erb +8 -8
  60. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  61. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  62. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  63. data/config/locales/ar.yml +120 -0
  64. data/config/locales/bg.yml +26 -6
  65. data/config/locales/bs.yml +122 -0
  66. data/config/locales/ca.yml +10 -1
  67. data/config/locales/cs.yml +7 -2
  68. data/config/locales/da.yml +7 -3
  69. data/config/locales/de-CH.yml +14 -31
  70. data/config/locales/de.yml +33 -33
  71. data/config/locales/el.yml +127 -0
  72. data/config/locales/en-GB.yml +11 -4
  73. data/config/locales/en.yml +21 -4
  74. data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
  75. data/config/locales/es.yml +32 -25
  76. data/config/locales/fa.yml +120 -0
  77. data/config/locales/fi.yml +9 -5
  78. data/config/locales/fr.yml +28 -12
  79. data/config/locales/he.yml +7 -3
  80. data/config/locales/hr.yml +42 -11
  81. data/config/locales/hu.yml +10 -3
  82. data/config/locales/it.yml +31 -3
  83. data/config/locales/ja.yml +17 -4
  84. data/config/locales/ko.yml +7 -1
  85. data/config/locales/lt.yml +42 -11
  86. data/config/locales/lv.yml +7 -3
  87. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  88. data/config/locales/nl.yml +36 -5
  89. data/config/locales/pl.yml +13 -8
  90. data/config/locales/pt-BR.yml +36 -5
  91. data/config/locales/pt-PT.yml +8 -4
  92. data/config/locales/ro.yml +7 -3
  93. data/config/locales/ru.yml +26 -5
  94. data/config/locales/sv-SE.yml +9 -5
  95. data/config/locales/tr.yml +10 -3
  96. data/config/locales/uk.yml +36 -12
  97. data/config/locales/vi.yml +7 -3
  98. data/config/locales/zh-CN.yml +26 -10
  99. data/config/locales/zh-TW.yml +19 -13
  100. data/docs/0-installation.md +14 -6
  101. data/docs/1-general-configuration.md +8 -5
  102. data/docs/10-custom-pages.md +68 -70
  103. data/docs/11-decorators.md +48 -59
  104. data/docs/12-arbre-components.md +79 -73
  105. data/docs/13-authorization-adapter.md +128 -107
  106. data/docs/14-gotchas.md +90 -0
  107. data/docs/2-resource-customization.md +82 -15
  108. data/docs/3-index-pages.md +71 -12
  109. data/docs/3-index-pages/custom-index.md +31 -0
  110. data/docs/3-index-pages/index-as-table.md +45 -2
  111. data/docs/4-csv-format.md +1 -1
  112. data/docs/5-forms.md +78 -29
  113. data/docs/6-show-pages.md +31 -3
  114. data/docs/7-sidebars.md +46 -25
  115. data/docs/8-custom-actions.md +98 -77
  116. data/docs/9-batch-actions.md +211 -133
  117. data/docs/README.md +24 -0
  118. data/features/action_item.feature +3 -3
  119. data/features/authorization_pundit.feature +37 -0
  120. data/features/belongs_to.feature +3 -0
  121. data/features/breadcrumb.feature +48 -0
  122. data/features/comments/commenting.feature +44 -13
  123. data/features/development_reloading.feature +3 -4
  124. data/features/edit_page.feature +9 -19
  125. data/features/favicon.feature +3 -3
  126. data/features/i18n.feature +5 -0
  127. data/features/index/batch_actions.feature +41 -0
  128. data/features/index/filters.feature +23 -0
  129. data/features/index/format_as_csv.feature +90 -4
  130. data/features/index/index_as_blog.feature +4 -4
  131. data/features/index/index_as_table.feature +102 -6
  132. data/features/index/index_blank_slate.feature +22 -0
  133. data/features/index/index_scope_to.feature +16 -16
  134. data/features/index/page_title.feature +11 -0
  135. data/features/index/pagination.feature +1 -1
  136. data/features/index/switch_index_view.feature +14 -14
  137. data/features/new_page.feature +10 -20
  138. data/features/registering_pages.feature +1 -1
  139. data/features/renamed_resource.feature +32 -0
  140. data/features/show/page_title.feature +11 -0
  141. data/features/show/tabs.feature +27 -0
  142. data/features/sidebar_sections.feature +12 -0
  143. data/features/specifying_actions.feature +3 -3
  144. data/features/step_definitions/action_item_steps.rb +2 -2
  145. data/features/step_definitions/action_link_steps.rb +14 -1
  146. data/features/step_definitions/additional_web_steps.rb +17 -18
  147. data/features/step_definitions/asset_steps.rb +3 -3
  148. data/features/step_definitions/attribute_steps.rb +8 -3
  149. data/features/step_definitions/batch_action_steps.rb +26 -9
  150. data/features/step_definitions/blog_steps.rb +3 -0
  151. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  152. data/features/step_definitions/comment_steps.rb +1 -1
  153. data/features/step_definitions/configuration_steps.rb +1 -1
  154. data/features/step_definitions/dashboard_steps.rb +2 -2
  155. data/features/step_definitions/factory_steps.rb +6 -6
  156. data/features/step_definitions/filter_steps.rb +25 -3
  157. data/features/step_definitions/flash_steps.rb +3 -3
  158. data/features/step_definitions/format_steps.rb +17 -10
  159. data/features/step_definitions/index_scope_steps.rb +5 -5
  160. data/features/step_definitions/layout_steps.rb +1 -1
  161. data/features/step_definitions/member_link_steps.rb +2 -2
  162. data/features/step_definitions/menu_steps.rb +3 -3
  163. data/features/step_definitions/pagination_steps.rb +2 -3
  164. data/features/step_definitions/sidebar_steps.rb +8 -3
  165. data/features/step_definitions/site_title_steps.rb +6 -4
  166. data/features/step_definitions/symbol_leak_steps.rb +1 -1
  167. data/features/step_definitions/tab_steps.rb +5 -0
  168. data/features/step_definitions/table_steps.rb +4 -4
  169. data/features/step_definitions/user_steps.rb +15 -9
  170. data/features/step_definitions/web_steps.rb +10 -11
  171. data/features/sti_resource.feature +2 -10
  172. data/features/strong_parameters.feature +73 -0
  173. data/features/support/env.rb +35 -2
  174. data/features/support/paths.rb +2 -2
  175. data/features/support/selectors.rb +1 -1
  176. data/features/users/resetting_password.feature +7 -7
  177. data/lib/active_admin.rb +18 -13
  178. data/lib/active_admin/abstract_view_factory.rb +7 -17
  179. data/lib/active_admin/application.rb +50 -25
  180. data/lib/active_admin/asset_registration.rb +2 -2
  181. data/lib/active_admin/authorization_adapter.rb +2 -2
  182. data/lib/active_admin/base_controller.rb +2 -3
  183. data/lib/active_admin/base_controller/authorization.rb +13 -31
  184. data/lib/active_admin/batch_actions.rb +1 -1
  185. data/lib/active_admin/batch_actions/controller.rb +13 -7
  186. data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
  187. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  188. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  189. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  190. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  191. data/lib/active_admin/callbacks.rb +25 -24
  192. data/lib/active_admin/cancan_adapter.rb +7 -11
  193. data/lib/active_admin/csv_builder.rb +92 -15
  194. data/lib/active_admin/dependency.rb +93 -0
  195. data/lib/active_admin/deprecation.rb +6 -7
  196. data/lib/active_admin/devise.rb +26 -14
  197. data/lib/active_admin/dsl.rb +18 -11
  198. data/lib/active_admin/engine.rb +7 -2
  199. data/lib/active_admin/error.rb +59 -0
  200. data/lib/active_admin/filters/dsl.rb +2 -2
  201. data/lib/active_admin/filters/forms.rb +19 -30
  202. data/lib/active_admin/filters/formtastic_addons.rb +20 -11
  203. data/lib/active_admin/filters/resource_extension.rb +16 -9
  204. data/lib/active_admin/form_builder.rb +94 -105
  205. data/lib/active_admin/helpers/collection.rb +7 -13
  206. data/lib/active_admin/helpers/i18n.rb +7 -0
  207. data/lib/active_admin/helpers/optional_display.rb +5 -5
  208. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  209. data/lib/active_admin/helpers/settings.rb +16 -9
  210. data/lib/active_admin/iconic.rb +17 -15
  211. data/lib/active_admin/iconic/icons.rb +136 -136
  212. data/lib/active_admin/inputs.rb +11 -7
  213. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  214. data/lib/active_admin/inputs/filters/base.rb +42 -0
  215. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  216. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  217. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  218. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  219. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  220. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  221. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  222. data/lib/active_admin/menu.rb +3 -3
  223. data/lib/active_admin/menu_collection.rb +1 -4
  224. data/lib/active_admin/namespace.rb +52 -29
  225. data/lib/active_admin/order_clause.rb +26 -0
  226. data/lib/active_admin/orm/active_record.rb +2 -0
  227. data/lib/active_admin/orm/active_record/comments.rb +48 -51
  228. data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
  229. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
  230. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
  231. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
  232. data/lib/active_admin/page.rb +5 -1
  233. data/lib/active_admin/page_dsl.rb +1 -1
  234. data/lib/active_admin/page_presenter.rb +2 -2
  235. data/lib/active_admin/pundit_adapter.rb +68 -0
  236. data/lib/active_admin/resource.rb +12 -3
  237. data/lib/active_admin/resource/action_items.rb +15 -8
  238. data/lib/active_admin/resource/belongs_to.rb +7 -3
  239. data/lib/active_admin/resource/controllers.rb +1 -0
  240. data/lib/active_admin/resource/includes.rb +12 -0
  241. data/lib/active_admin/resource/menu.rb +5 -5
  242. data/lib/active_admin/resource/naming.rb +25 -47
  243. data/lib/active_admin/resource/page_presenters.rb +1 -1
  244. data/lib/active_admin/resource/routes.rb +26 -10
  245. data/lib/active_admin/resource/scope_to.rb +7 -7
  246. data/lib/active_admin/resource/sidebars.rb +1 -0
  247. data/lib/active_admin/resource_collection.rb +44 -16
  248. data/lib/active_admin/resource_controller.rb +6 -5
  249. data/lib/active_admin/resource_controller/data_access.rb +87 -82
  250. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  251. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  252. data/lib/active_admin/resource_dsl.rb +54 -10
  253. data/lib/active_admin/router.rb +7 -7
  254. data/lib/active_admin/scope.rb +6 -6
  255. data/lib/active_admin/sidebar_section.rb +10 -2
  256. data/lib/active_admin/version.rb +1 -1
  257. data/lib/active_admin/view_factory.rb +17 -16
  258. data/lib/active_admin/view_helpers.rb +0 -1
  259. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  260. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +13 -6
  261. data/lib/active_admin/view_helpers/display_helper.rb +30 -17
  262. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
  263. data/lib/active_admin/view_helpers/fields_for.rb +2 -2
  264. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  265. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  266. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  267. data/lib/active_admin/views/action_items.rb +2 -2
  268. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  269. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  270. data/lib/active_admin/views/components/attributes_table.rb +22 -13
  271. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  272. data/lib/active_admin/views/components/columns.rb +13 -7
  273. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  274. data/lib/active_admin/views/components/index_list.rb +7 -7
  275. data/lib/active_admin/views/components/paginated_collection.rb +33 -17
  276. data/lib/active_admin/views/components/panel.rb +8 -2
  277. data/lib/active_admin/views/components/popover.rb +1 -1
  278. data/lib/active_admin/views/components/scopes.rb +1 -1
  279. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  280. data/lib/active_admin/views/components/site_title.rb +2 -2
  281. data/lib/active_admin/views/components/status_tag.rb +34 -11
  282. data/lib/active_admin/views/components/table_for.rb +67 -22
  283. data/lib/active_admin/views/components/tabs.rb +28 -0
  284. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  285. data/lib/active_admin/views/footer.rb +3 -3
  286. data/lib/active_admin/views/header.rb +3 -3
  287. data/lib/active_admin/views/index_as_blog.rb +6 -6
  288. data/lib/active_admin/views/index_as_grid.rb +2 -2
  289. data/lib/active_admin/views/index_as_table.rb +127 -40
  290. data/lib/active_admin/views/pages/base.rb +22 -18
  291. data/lib/active_admin/views/pages/form.rb +16 -6
  292. data/lib/active_admin/views/pages/index.rb +36 -20
  293. data/lib/active_admin/views/pages/layout.rb +1 -1
  294. data/lib/active_admin/views/pages/show.rb +4 -4
  295. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  296. data/lib/active_admin/views/title_bar.rb +10 -8
  297. data/lib/generators/active_admin/assets/assets_generator.rb +1 -3
  298. data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
  299. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  300. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
  301. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
  302. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  303. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  304. data/lib/generators/active_admin/page/USAGE +8 -0
  305. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  306. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  307. data/lib/generators/active_admin/resource/resource_generator.rb +2 -4
  308. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  309. data/lib/ransack_ext.rb +4 -4
  310. data/script/local +2 -2
  311. data/script/travis_cache +107 -0
  312. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  313. data/spec/javascripts/fixtures/flashes.html +2 -0
  314. data/spec/rails_helper.rb +154 -0
  315. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  316. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  317. data/spec/requests/memory_spec.rb +23 -0
  318. data/spec/requests/stylesheets_spec.rb +18 -0
  319. data/spec/spec_helper.rb +12 -170
  320. data/spec/support/detect_rails_version.rb +31 -39
  321. data/spec/support/rails_template.rb +61 -34
  322. data/spec/support/rails_template_with_data.rb +14 -14
  323. data/spec/support/templates/admin/stores.rb +3 -5
  324. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  325. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  326. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  327. data/spec/support/templates/policies/application_policy.rb +45 -0
  328. data/spec/support/templates/policies/category_policy.rb +7 -0
  329. data/spec/support/templates/policies/post_policy.rb +15 -0
  330. data/spec/support/templates/policies/store_policy.rb +11 -0
  331. data/spec/support/templates/policies/user_policy.rb +11 -0
  332. data/spec/support/templates/post_decorator.rb +4 -46
  333. data/spec/unit/abstract_view_factory_spec.rb +11 -11
  334. data/spec/unit/action_builder_spec.rb +24 -18
  335. data/spec/unit/active_admin_spec.rb +2 -2
  336. data/spec/unit/application_spec.rb +30 -31
  337. data/spec/unit/asset_registration_spec.rb +11 -11
  338. data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
  339. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  340. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  341. data/spec/unit/auto_link_spec.rb +42 -5
  342. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  343. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  344. data/spec/unit/belongs_to_spec.rb +26 -17
  345. data/spec/unit/cancan_adapter_spec.rb +4 -4
  346. data/spec/unit/comments_spec.rb +99 -39
  347. data/spec/unit/component_spec.rb +3 -3
  348. data/spec/unit/config_shared_examples.rb +8 -8
  349. data/spec/unit/controller_filters_spec.rb +26 -14
  350. data/spec/unit/csv_builder_spec.rb +152 -24
  351. data/spec/unit/dependency_spec.rb +135 -0
  352. data/spec/unit/devise_spec.rb +17 -37
  353. data/spec/unit/dsl_spec.rb +70 -9
  354. data/spec/unit/event_spec.rb +9 -9
  355. data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
  356. data/spec/unit/filters/resource_spec.rb +35 -33
  357. data/spec/unit/form_builder_spec.rb +383 -145
  358. data/spec/unit/generators/install_spec.rb +5 -5
  359. data/spec/unit/helpers/collection_spec.rb +18 -18
  360. data/spec/unit/helpers/scope_chain_spec.rb +5 -5
  361. data/spec/unit/helpers/settings_spec.rb +4 -4
  362. data/spec/unit/i18n_spec.rb +12 -0
  363. data/spec/unit/menu_collection_spec.rb +14 -14
  364. data/spec/unit/menu_item_spec.rb +42 -42
  365. data/spec/unit/menu_spec.rb +20 -20
  366. data/spec/unit/namespace/authorization_spec.rb +5 -5
  367. data/spec/unit/namespace/register_page_spec.rb +9 -9
  368. data/spec/unit/namespace/register_resource_spec.rb +26 -28
  369. data/spec/unit/namespace_spec.rb +20 -20
  370. data/spec/unit/order_clause_spec.rb +81 -0
  371. data/spec/unit/page_controller_spec.rb +1 -1
  372. data/spec/unit/page_spec.rb +18 -12
  373. data/spec/unit/pretty_format_spec.rb +42 -14
  374. data/spec/unit/pundit_adapter_spec.rb +98 -0
  375. data/spec/unit/resource/action_items_spec.rb +13 -10
  376. data/spec/unit/resource/includes_spec.rb +21 -0
  377. data/spec/unit/resource/menu_spec.rb +1 -1
  378. data/spec/unit/resource/naming_spec.rb +23 -23
  379. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  380. data/spec/unit/resource/pagination_spec.rb +6 -6
  381. data/spec/unit/resource/routes_spec.rb +10 -10
  382. data/spec/unit/resource/scopes_spec.rb +14 -7
  383. data/spec/unit/resource/sidebars_spec.rb +6 -6
  384. data/spec/unit/resource_collection_spec.rb +66 -68
  385. data/spec/unit/resource_controller/data_access_spec.rb +39 -21
  386. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  387. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  388. data/spec/unit/resource_controller_spec.rb +66 -62
  389. data/spec/unit/resource_registration_spec.rb +12 -12
  390. data/spec/unit/resource_spec.rb +75 -40
  391. data/spec/unit/routing_spec.rb +39 -31
  392. data/spec/unit/scope_spec.rb +112 -30
  393. data/spec/unit/settings_spec.rb +51 -21
  394. data/spec/unit/view_factory_spec.rb +2 -2
  395. data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
  396. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  397. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  398. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  399. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  400. data/spec/unit/view_helpers/form_helper_spec.rb +9 -22
  401. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
  402. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  403. data/spec/unit/views/components/attributes_table_spec.rb +94 -52
  404. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  405. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  406. data/spec/unit/views/components/columns_spec.rb +52 -22
  407. data/spec/unit/views/components/index_list_spec.rb +11 -8
  408. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  409. data/spec/unit/views/components/paginated_collection_spec.rb +68 -59
  410. data/spec/unit/views/components/panel_spec.rb +32 -21
  411. data/spec/unit/views/components/popover_spec.rb +7 -7
  412. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  413. data/spec/unit/views/components/site_title_spec.rb +8 -8
  414. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  415. data/spec/unit/views/components/table_for_spec.rb +227 -44
  416. data/spec/unit/views/components/tabs_spec.rb +39 -0
  417. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  418. data/spec/unit/views/pages/form_spec.rb +17 -10
  419. data/spec/unit/views/pages/index_spec.rb +60 -0
  420. data/spec/unit/views/pages/layout_spec.rb +17 -21
  421. data/spec/unit/views/pages/show_spec.rb +16 -3
  422. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  423. data/tasks/docs.rake +1 -1
  424. data/tasks/parallel_tests.rake +8 -2
  425. data/tasks/test.rake +8 -4
  426. data/tasks/yard.rake +7 -5
  427. metadata +180 -101
  428. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  429. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  430. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  431. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  432. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  433. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  434. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  435. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  436. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  437. data/app/assets/images/active_admin/loading.gif +0 -0
  438. data/app/assets/javascripts/active_admin/components/application.js.coffee +0 -23
  439. data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
  440. data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
  441. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  442. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -39
  443. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  444. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  445. data/app/views/active_admin/resource/index.csv.erb +0 -17
  446. data/docs/3-index-pages/create-an-index.md +0 -29
  447. data/lib/active_admin/inputs/filter_base.rb +0 -33
  448. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  449. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -32
  450. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
  451. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  452. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  453. data/lib/active_admin/inputs/filter_select_input.rb +0 -61
  454. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  455. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  456. data/spec/integration/memory_spec.rb +0 -29
  457. data/spec/integration/stylesheets_spec.rb +0 -41
  458. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  459. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  460. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  461. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  462. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  463. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  464. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  465. data/spec/javascripts/support/jquery.min.js +0 -4
  466. data/spec/spec_helper_without_rails.rb +0 -16
  467. data/tasks/js.rake +0 -32
@@ -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,11 +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
- 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
10
13
  else
11
14
  raise "Couldn't find batch action \"#{params[:batch_action]}\""
12
15
  end
@@ -14,9 +17,12 @@ module ActiveAdmin
14
17
 
15
18
  protected
16
19
 
17
- def selected_batch_action
18
- return unless params[:batch_action].present?
19
- active_admin_config.batch_actions.detect { |action| action.sym.to_s == params[:batch_action] }
20
+ def action_present?
21
+ params[:batch_action].present? && current_batch_action
22
+ end
23
+
24
+ def current_batch_action
25
+ active_admin_config.batch_actions.detect{ |action| action.sym.to_s == params[:batch_action] }
20
26
  end
21
27
 
22
28
  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,21 @@ 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
70
  active_admin_config.resource_class.find(selected_ids).each { |r| r.destroy }
70
71
 
71
72
  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)
73
+ notice: I18n.t("active_admin.batch_actions.succesfully_destroyed",
74
+ count: selected_ids.count,
75
+ model: active_admin_config.resource_label.downcase,
76
+ plural_model: active_admin_config.plural_resource_label(count: selected_ids.count).downcase)
76
77
  end
77
78
  end
78
79
 
@@ -83,7 +84,9 @@ module ActiveAdmin
83
84
 
84
85
  include Comparable
85
86
 
86
- attr_reader :block, :title, :sym, :confirm
87
+ attr_reader :block, :title, :sym
88
+
89
+ DEFAULT_CONFIRM_MESSAGE = proc{ I18n.t 'active_admin.batch_actions.default_confirmation' }
87
90
 
88
91
  # Create a Batch Action
89
92
  #
@@ -92,24 +95,47 @@ module ActiveAdmin
92
95
  # BatchAction.new :flag
93
96
  # => Will create an action that appears in the action list popover
94
97
  #
95
- # BatchAction.new( :flag ) { |selection| redirect_to collection_path, :notice => "#{selection.length} users flagged" }
98
+ # BatchAction.new(:flag) { |selection| redirect_to collection_path, notice: "#{selection.length} users flagged" }
96
99
  # => Will create an action that uses a block to process the request (which receives one paramater of the selected objects)
97
100
  #
98
- # BatchAction.new( "Perform Long Operation on the" ) { |selection| }
101
+ # BatchAction.new("Perform Long Operation on") { |selection| }
99
102
  # => You can create batch actions with a title instead of a Symbol
100
103
  #
101
- # BatchAction.new( :flag, :if => proc { can? :flag, AdminUser } ) { |selection| }
102
- # => You can provide an optional :if proc to optionally display the batch action
104
+ # BatchAction.new(:flag, if: proc{ can? :flag, AdminUser }) { |selection| }
105
+ # => You can provide an `:if` proc to choose when the batch action should be displayed
106
+ #
107
+ # BatchAction.new :flag, confirm: true
108
+ # => You can pass `true` to `:confirm` to use the default confirm message.
109
+ #
110
+ # BatchAction.new(:flag, confirm: "Are you sure?") { |selection| }
111
+ # => You can pass a custom confirmation message through `:confirm`
112
+ #
113
+ # BatchAction.new(:flag, form: {foo: :text, bar: :checkbox}) { |selection, inputs| }
114
+ # => You can pass a hash of options to `:form` that will be rendered as form input fields for the user to fill out.
103
115
  #
104
116
  def initialize(sym, title, options = {}, &block)
105
117
  @sym, @title, @options, @block, @confirm = sym, title, options, block, options[:confirm]
106
118
  @block ||= proc {}
107
119
  end
108
120
 
121
+ def confirm
122
+ if @confirm == true
123
+ DEFAULT_CONFIRM_MESSAGE
124
+ elsif !@confirm && @options[:form]
125
+ DEFAULT_CONFIRM_MESSAGE
126
+ else
127
+ @confirm
128
+ end
129
+ end
130
+
131
+ def inputs
132
+ @options[:form]
133
+ end
134
+
109
135
  # Returns the display if block. If the block was not explicitly defined
110
136
  # a default block always returning true will be returned.
111
137
  def display_if_block
112
- @options[:if] || proc { true }
138
+ @options[:if] || proc{ true }
113
139
  end
114
140
 
115
141
  # Used for sorting
@@ -3,7 +3,7 @@ require 'active_admin/component'
3
3
  module ActiveAdmin
4
4
  module BatchActions
5
5
 
6
- # Build an BatchActionForm
6
+ # Build a BatchActionForm
7
7
  class BatchActionForm < ActiveAdmin::Component
8
8
  builder_method :batch_action_form
9
9
 
@@ -12,9 +12,12 @@ module ActiveAdmin
12
12
  def build(options = {}, &block)
13
13
  options[:id] ||= "collection_selection"
14
14
 
15
- # Open a form
16
- text_node form_tag(active_admin_config.batch_action_path(params), :id => options[:id])
17
- input(:name => :batch_action, :id => :batch_action, :type => :hidden)
15
+ # Open a form with two hidden input fields:
16
+ # batch_action => name of the specific action called
17
+ # batch_action_inputs => a JSON string of any requested confirmation values
18
+ text_node form_tag active_admin_config.batch_action_path(params), id: options[:id]
19
+ input name: :batch_action, id: :batch_action, type: :hidden
20
+ input name: :batch_action_inputs, id: :batch_action_inputs, type: :hidden
18
21
 
19
22
  super(options)
20
23
  end
@@ -13,12 +13,12 @@ module ActiveAdmin
13
13
 
14
14
  def action(batch_action, options = {})
15
15
  options[:class] ||= []
16
- options[:class] += %w(batch_action)
16
+ options[:class] << "batch_action"
17
17
  options.merge! "data-action" => batch_action.sym,
18
18
  "data-confirm" => batch_action.confirm
19
19
 
20
- title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", :default => batch_action.title)
21
- label = I18n.t("active_admin.batch_actions.action_label", :title => title)
20
+ title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", default: batch_action.title)
21
+ label = I18n.t("active_admin.batch_actions.action_label", title: title)
22
22
 
23
23
  super(label, "#", options)
24
24
  end
@@ -24,20 +24,21 @@ module ActiveAdmin
24
24
 
25
25
  def build_drop_down
26
26
  dropdown_menu I18n.t("active_admin.batch_actions.button_label"),
27
- :id => "batch_actions_selector",
28
- :button => { :class => "disabled" } do
27
+ class: "batch_actions_selector dropdown_menu",
28
+ button: { class: "disabled" } do
29
29
  batch_actions_to_display.each do |batch_action|
30
30
  confirmation_text = render_or_call_method_or_proc_on(self, batch_action.confirm)
31
31
 
32
32
  options = {
33
- :class => "batch_action",
34
- "data-action" => batch_action.sym,
35
- "data-confirm" => confirmation_text
33
+ :class => "batch_action",
34
+ "data-action" => batch_action.sym,
35
+ "data-confirm" => confirmation_text,
36
+ "data-inputs" => render_in_context(self, batch_action.inputs).to_json
36
37
  }
37
38
 
38
39
  default_title = render_or_call_method_or_proc_on(self, batch_action.title)
39
- title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", :default => default_title)
40
- label = I18n.t("active_admin.batch_actions.action_label", :title => title)
40
+ title = I18n.t("active_admin.batch_actions.labels.#{batch_action.sym}", default: default_title)
41
+ label = I18n.t("active_admin.batch_actions.action_label", title: title)
41
42
 
42
43
  item label, "#", options
43
44
  end
@@ -51,16 +52,6 @@ module ActiveAdmin
51
52
  end
52
53
  end
53
54
 
54
- # def build_batch_action_button
55
- # a :class => 'table_tools_button dropdown_button disabled', :href => "#batch_actions_popover", :id => "batch_actions_button" do
56
- # text_node I18n.t("active_admin.batch_actions.button_label")
57
- # end
58
- # end
59
-
60
- # def build_batch_action_popover
61
- # end
62
-
63
55
  end
64
-
65
56
  end
66
57
  end
@@ -8,7 +8,7 @@ module ActiveAdmin
8
8
  builder_method :resource_selection_toggle_cell
9
9
 
10
10
  def build
11
- input( :type => "checkbox", :id => "collection_selection_toggle_all", :name => "collection_selection_toggle_all", :class => "toggle_all" )
11
+ input type: "checkbox", id: "collection_selection_toggle_all", name: "collection_selection_toggle_all", class: "toggle_all"
12
12
  end
13
13
  end
14
14
 
@@ -17,7 +17,7 @@ module ActiveAdmin
17
17
  builder_method :resource_selection_cell
18
18
 
19
19
  def build(resource)
20
- input :type => "checkbox", :id => "batch_action_item_#{resource.id}", :value => resource.id, :class => "collection_selection", :name => "collection_selection[]"
20
+ input type: "checkbox", id: "batch_action_item_#{resource.id}", value: resource.id, class: "collection_selection", name: "collection_selection[]"
21
21
  end
22
22
  end
23
23
 
@@ -26,9 +26,9 @@ module ActiveAdmin
26
26
  builder_method :resource_selection_toggle_panel
27
27
 
28
28
  def build
29
- super(:id => "collection_selection_toggle_panel")
29
+ super(id: "collection_selection_toggle_panel")
30
30
  resource_selection_toggle_cell
31
- div(:id => "collection_selection_toggle_explaination" ) { I18n.t('active_admin.batch_actions.selection_toggle_explanation', :default => "(Toggle Selection)") }
31
+ div(id: "collection_selection_toggle_explaination" ) { I18n.t('active_admin.batch_actions.selection_toggle_explanation', default: "(Toggle Selection)") }
32
32
  end
33
33
 
34
34
  end
@@ -2,7 +2,7 @@ module ActiveAdmin
2
2
  module Callbacks
3
3
  extend ActiveSupport::Concern
4
4
 
5
- protected
5
+ private
6
6
 
7
7
  # Simple callback system. Implements before and after callbacks for
8
8
  # use within the controllers.
@@ -11,7 +11,7 @@ module ActiveAdmin
11
11
  # passing in any arbitrary object into the callback method (which we
12
12
  # need to do)
13
13
 
14
- def call_callback_with(method, *args)
14
+ def run_callback(method, *args)
15
15
  case method
16
16
  when Symbol
17
17
  send(method, *args)
@@ -24,6 +24,8 @@ module ActiveAdmin
24
24
 
25
25
  module ClassMethods
26
26
 
27
+ private
28
+
27
29
  # Define a new callback.
28
30
  #
29
31
  # Example:
@@ -56,32 +58,31 @@ module ActiveAdmin
56
58
  def define_active_admin_callbacks(*names)
57
59
  names.each do |name|
58
60
  [:before, :after].each do |type|
61
+ callback_name = "#{type}_#{name}_callbacks"
62
+ callback_ivar = "@#{callback_name}"
59
63
 
60
- # Define a method to set the callback
61
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
62
- # def self.before_create_callbacks
63
- def self.#{type}_#{name}_callbacks
64
- @#{type}_#{name}_callbacks ||= []
65
- end
64
+ # def self.before_create_callbacks
65
+ singleton_class.send :define_method, callback_name do
66
+ instance_variable_get(callback_ivar) || instance_variable_set(callback_ivar, [])
67
+ end
68
+ singleton_class.send :private, callback_name
66
69
 
67
- # def self.before_create
68
- def self.#{type}_#{name}(method = nil, &block)
69
- #{type}_#{name}_callbacks << (method || block)
70
- end
71
- EOS
70
+ # def self.before_create
71
+ singleton_class.send :define_method, "#{type}_#{name}" do |method = nil, &block|
72
+ send(callback_name).push method || block
73
+ end
72
74
  end
73
75
 
74
- # Define a method to run the callbacks
75
- class_eval(<<-EOS, __FILE__, __LINE__ + 1)
76
- def run_#{name}_callbacks(*args)
77
- self.class.before_#{name}_callbacks.each{|callback| call_callback_with(callback, *args)}
78
- value = yield if block_given?
79
- self.class.after_#{name}_callbacks.each{|callback| call_callback_with(callback, *args)}
80
- return value
81
- end
82
- EOS
83
- end
84
- end
76
+ # def run_create_callbacks
77
+ define_method "run_#{name}_callbacks" do |*args, &block|
78
+ self.class.send("before_#{name}_callbacks").each{ |cbk| run_callback(cbk, *args) }
79
+ value = block.try :call
80
+ self.class.send("after_#{name}_callbacks").each { |cbk| run_callback(cbk, *args) }
81
+ return value
82
+ end
83
+ send :private, "run_#{name}_callbacks"
84
+ end
85
+ end
85
86
  end
86
87
  end
87
88
  end
@@ -1,3 +1,7 @@
1
+ unless ActiveAdmin::Dependency.cancan? || ActiveAdmin::Dependency.cancancan?
2
+ ActiveAdmin::Dependency.cancan!
3
+ end
4
+
1
5
  require 'cancan'
2
6
 
3
7
  # Add a setting to the application to configure the ability
@@ -21,18 +25,10 @@ module ActiveAdmin
21
25
 
22
26
  private
23
27
 
24
- # The setting allows the class to be stored as a string
25
- # to enable reloading in development.
26
28
  def initialize_cancan_ability
27
- ability_class_name = resource.namespace.cancan_ability_class
28
-
29
- if ability_class_name.is_a?(String)
30
- ability_class = ActiveSupport::Dependencies.constantize(ability_class_name)
31
- else
32
- ability_class = ability_class_name
33
- end
34
-
35
- ability_class.new(user)
29
+ klass = resource.namespace.cancan_ability_class
30
+ klass = klass.constantize if klass.is_a? String
31
+ klass.new user
36
32
  end
37
33
 
38
34
  end
@@ -6,8 +6,11 @@ module ActiveAdmin
6
6
  # csv_builder = CSVBuilder.new
7
7
  # csv_builder.column :id
8
8
  # csv_builder.column("Name") { |resource| resource.full_name }
9
+ # csv_builder.column(:name, humanize: false)
10
+ # csv_builder.column("name", humanize: false) { |resource| resource.full_name }
9
11
  #
10
- # csv_builder = CSVBuilder.new :col_sep => ";"
12
+ # csv_builder = CSVBuilder.new col_sep: ";"
13
+ # csv_builder = CSVBuilder.new humanize_name: false
11
14
  # csv_builder.column :id
12
15
  #
13
16
  #
@@ -17,33 +20,107 @@ module ActiveAdmin
17
20
  # The CSVBuilder's columns would be Id followed by this
18
21
  # resource's content columns
19
22
  def self.default_for_resource(resource)
20
- new.tap do |csv_builder|
21
- csv_builder.column(:id)
22
- resource.content_columns.each do |content_column|
23
- csv_builder.column(content_column.name.to_sym)
24
- end
23
+ new resource: resource do
24
+ column :id
25
+ resource.content_columns.each { |c| column c.name.to_sym }
25
26
  end
26
27
  end
27
28
 
28
- attr_reader :columns, :options
29
+ attr_reader :columns, :options, :view_context
30
+
31
+ COLUMN_TRANSITIVE_OPTIONS = [:humanize_name].freeze
29
32
 
30
33
  def initialize(options={}, &block)
31
- @columns, @options = [], options
32
- instance_eval &block if block_given?
34
+ @resource = options.delete(:resource)
35
+ @columns, @options, @block = [], options, block
33
36
  end
34
37
 
35
- # Add a column
36
- def column(name, &block)
37
- @columns << Column.new(name, block)
38
+ def column(name, options={}, &block)
39
+ @columns << Column.new(name, @resource, column_transitive_options.merge(options), block)
40
+ end
41
+
42
+ def build(controller, receiver)
43
+ @collection = controller.send(:collection)
44
+ options = ActiveAdmin.application.csv_options.merge self.options
45
+ columns = exec_columns controller.view_context
46
+
47
+ if byte_order_mark = options.delete(:byte_order_mark)
48
+ receiver << byte_order_mark
49
+ end
50
+
51
+ if options.delete(:column_names) { true }
52
+ receiver << CSV.generate_line(columns.map{ |c| encode c.name, options }, options)
53
+ end
54
+
55
+ (1..paginated_collection.total_pages).each do |page_no|
56
+ paginated_collection(page_no).each do |resource|
57
+ resource = controller.send :apply_decorator, resource
58
+ receiver << CSV.generate_line(build_row(resource, columns, options), options)
59
+ end
60
+ end
61
+ end
62
+
63
+ def exec_columns(view_context = nil)
64
+ @view_context = view_context
65
+ @columns = [] # we want to re-render these every instance
66
+ instance_exec &@block if @block.present?
67
+ columns
68
+ end
69
+
70
+ def build_row(resource, columns, options)
71
+ columns.map do |column|
72
+ encode call_method_or_proc_on(resource, column.data), options
73
+ end
74
+ end
75
+
76
+ def encode(content, options)
77
+ if options[:encoding]
78
+ content.to_s.encode! options[:encoding], options[:encoding_options]
79
+ else
80
+ content
81
+ end
82
+ end
83
+
84
+ def method_missing(method, *args, &block)
85
+ if @view_context.respond_to? method
86
+ @view_context.public_send method, *args, &block
87
+ else
88
+ super
89
+ end
38
90
  end
39
91
 
40
92
  class Column
41
- attr_reader :name, :data
93
+ attr_reader :name, :data, :options
94
+
95
+ DEFAULT_OPTIONS = { humanize_name: true }
42
96
 
43
- def initialize(name, block = nil)
44
- @name = name.is_a?(Symbol) ? name.to_s.titleize : name
97
+ def initialize(name, resource = nil, options = {}, block = nil)
98
+ @options = options.reverse_merge(DEFAULT_OPTIONS)
99
+ @name = humanize_name(name, resource, @options[:humanize_name])
45
100
  @data = block || name.to_sym
46
101
  end
102
+
103
+ def humanize_name(name, resource, humanize_name_option)
104
+ if humanize_name_option
105
+ name.is_a?(Symbol) && resource.present? ? resource.human_attribute_name(name) : name.to_s.humanize
106
+ else
107
+ name.to_s
108
+ end
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def column_transitive_options
115
+ @column_transitive_options ||= @options.slice(*COLUMN_TRANSITIVE_OPTIONS)
116
+ end
117
+
118
+ def paginated_collection(page_no = 1)
119
+ @collection.public_send(Kaminari.config.page_method_name, page_no).per(batch_size)
120
+ end
121
+
122
+ def batch_size
123
+ 1000
47
124
  end
48
125
  end
49
126
  end