activeadmin 0.6.6 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (512) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -8
  3. data/.hound.yml +11 -0
  4. data/.travis.yml +36 -10
  5. data/.yardopts +2 -1
  6. data/CHANGELOG.md +118 -67
  7. data/CONTRIBUTING.md +96 -73
  8. data/Gemfile +35 -35
  9. data/Guardfile +1 -0
  10. data/LICENSE +1 -1
  11. data/README.md +98 -0
  12. data/Rakefile +12 -4
  13. data/activeadmin.gemspec +21 -24
  14. data/app/assets/javascripts/active_admin/application.js.coffee +32 -0
  15. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  16. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  17. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  18. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  19. data/app/assets/javascripts/active_admin/{components/jquery.aa.checkbox-toggler.js.coffee → lib/checkbox-toggler.js.coffee} +3 -4
  20. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
  21. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  22. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  23. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  24. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  25. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  26. data/app/assets/javascripts/active_admin/{components/jquery.aa.table-checkbox-toggler.js.coffee → lib/table-checkbox-toggler.js.coffee} +2 -3
  27. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  28. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +61 -17
  29. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  30. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  32. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  33. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +0 -1
  34. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  35. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  36. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -14
  37. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +5 -4
  38. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  39. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  40. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  41. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +2 -3
  42. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  43. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  44. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +4 -2
  45. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  46. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -1
  49. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  51. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  52. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  53. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +8 -2
  54. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -7
  55. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +0 -9
  56. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  57. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  58. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +5 -2
  59. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +11 -9
  60. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  61. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  62. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  63. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  64. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  65. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  66. data/app/views/active_admin/devise/sessions/new.html.erb +9 -7
  67. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  68. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  69. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  70. data/config/locales/ar.yml +120 -0
  71. data/config/locales/bg.yml +26 -6
  72. data/config/locales/bs.yml +122 -0
  73. data/config/locales/ca.yml +10 -1
  74. data/config/locales/cs.yml +7 -2
  75. data/config/locales/da.yml +7 -3
  76. data/config/locales/de-CH.yml +14 -31
  77. data/config/locales/de.yml +33 -33
  78. data/config/locales/el.yml +28 -2
  79. data/config/locales/en-GB.yml +12 -4
  80. data/config/locales/en.yml +29 -3
  81. data/config/locales/{es_MX.yml → es-MX.yml} +9 -24
  82. data/config/locales/es.yml +32 -25
  83. data/config/locales/fa.yml +120 -0
  84. data/config/locales/fi.yml +113 -0
  85. data/config/locales/fr.yml +21 -11
  86. data/config/locales/he.yml +7 -3
  87. data/config/locales/hr.yml +42 -11
  88. data/config/locales/hu.yml +10 -3
  89. data/config/locales/it.yml +31 -3
  90. data/config/locales/ja.yml +8 -3
  91. data/config/locales/ko.yml +7 -1
  92. data/config/locales/lt.yml +42 -11
  93. data/config/locales/lv.yml +7 -3
  94. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  95. data/config/locales/nl.yml +36 -5
  96. data/config/locales/pl.yml +13 -8
  97. data/config/locales/pt-BR.yml +37 -5
  98. data/config/locales/pt-PT.yml +8 -4
  99. data/config/locales/ro.yml +7 -3
  100. data/config/locales/ru.yml +26 -5
  101. data/config/locales/sv-SE.yml +9 -5
  102. data/config/locales/tr.yml +10 -3
  103. data/config/locales/uk.yml +36 -12
  104. data/config/locales/vi.yml +7 -3
  105. data/config/locales/zh-CN.yml +26 -10
  106. data/config/locales/zh-TW.yml +19 -13
  107. data/docs/0-installation.md +65 -29
  108. data/docs/1-general-configuration.md +92 -81
  109. data/docs/10-custom-pages.md +68 -68
  110. data/docs/11-decorators.md +48 -59
  111. data/docs/12-arbre-components.md +80 -74
  112. data/docs/13-authorization-adapter.md +128 -107
  113. data/docs/14-gotchas.md +92 -0
  114. data/docs/2-resource-customization.md +293 -178
  115. data/docs/3-index-pages.md +160 -86
  116. data/docs/3-index-pages/custom-index.md +31 -0
  117. data/docs/3-index-pages/index-as-block.md +14 -9
  118. data/docs/3-index-pages/index-as-blog.md +41 -31
  119. data/docs/3-index-pages/index-as-grid.md +16 -8
  120. data/docs/3-index-pages/index-as-table.md +129 -52
  121. data/docs/4-csv-format.md +31 -24
  122. data/docs/5-forms.md +133 -56
  123. data/docs/6-show-pages.md +89 -27
  124. data/docs/7-sidebars.md +48 -27
  125. data/docs/8-custom-actions.md +98 -77
  126. data/docs/9-batch-actions.md +210 -146
  127. data/docs/README.md +24 -0
  128. data/features/action_item.feature +3 -3
  129. data/features/authorization_pundit.feature +37 -0
  130. data/features/breadcrumb.feature +48 -0
  131. data/features/comments/commenting.feature +56 -13
  132. data/features/development_reloading.feature +17 -30
  133. data/features/edit_page.feature +12 -1
  134. data/features/favicon.feature +3 -3
  135. data/features/i18n.feature +5 -4
  136. data/features/index/batch_actions.feature +41 -0
  137. data/features/index/filters.feature +67 -0
  138. data/features/index/format_as_csv.feature +90 -4
  139. data/features/index/formats.feature +27 -0
  140. data/features/index/index_as_blog.feature +4 -4
  141. data/features/index/index_as_table.feature +102 -6
  142. data/features/index/index_blank_slate.feature +22 -0
  143. data/features/index/index_scope_to.feature +16 -16
  144. data/features/index/page_title.feature +11 -0
  145. data/features/index/pagination.feature +1 -1
  146. data/features/index/switch_index_view.feature +14 -14
  147. data/features/new_page.feature +13 -2
  148. data/features/registering_pages.feature +1 -1
  149. data/features/renamed_resource.feature +32 -0
  150. data/features/show/page_title.feature +11 -0
  151. data/features/show/tabs.feature +27 -0
  152. data/features/sidebar_sections.feature +12 -0
  153. data/features/site_title.feature +2 -2
  154. data/features/specifying_actions.feature +3 -3
  155. data/features/step_definitions/action_item_steps.rb +2 -2
  156. data/features/step_definitions/action_link_steps.rb +14 -1
  157. data/features/step_definitions/additional_web_steps.rb +19 -20
  158. data/features/step_definitions/asset_steps.rb +3 -3
  159. data/features/step_definitions/attribute_steps.rb +8 -3
  160. data/features/step_definitions/batch_action_steps.rb +26 -9
  161. data/features/step_definitions/blog_steps.rb +3 -0
  162. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  163. data/features/step_definitions/comment_steps.rb +1 -1
  164. data/features/step_definitions/configuration_steps.rb +9 -2
  165. data/features/step_definitions/dashboard_steps.rb +2 -2
  166. data/features/step_definitions/factory_steps.rb +9 -8
  167. data/features/step_definitions/filter_steps.rb +25 -3
  168. data/features/step_definitions/flash_steps.rb +3 -3
  169. data/features/step_definitions/format_steps.rb +18 -18
  170. data/features/step_definitions/index_scope_steps.rb +5 -5
  171. data/features/step_definitions/layout_steps.rb +1 -1
  172. data/features/step_definitions/member_link_steps.rb +2 -2
  173. data/features/step_definitions/menu_steps.rb +3 -3
  174. data/features/step_definitions/pagination_steps.rb +2 -3
  175. data/features/step_definitions/sidebar_steps.rb +8 -3
  176. data/features/step_definitions/site_title_steps.rb +6 -4
  177. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  178. data/features/step_definitions/tab_steps.rb +5 -0
  179. data/features/step_definitions/table_steps.rb +4 -4
  180. data/features/step_definitions/user_steps.rb +10 -7
  181. data/features/step_definitions/web_steps.rb +14 -11
  182. data/features/sti_resource.feature +6 -2
  183. data/features/strong_parameters.feature +73 -0
  184. data/features/support/env.rb +34 -9
  185. data/features/support/paths.rb +14 -6
  186. data/features/support/selectors.rb +1 -1
  187. data/features/symbol_leak.feature +35 -0
  188. data/features/users/resetting_password.feature +5 -6
  189. data/lib/active_admin.rb +26 -25
  190. data/lib/active_admin/abstract_view_factory.rb +7 -17
  191. data/lib/active_admin/application.rb +72 -59
  192. data/lib/active_admin/asset_registration.rb +2 -2
  193. data/lib/active_admin/authorization_adapter.rb +2 -2
  194. data/lib/active_admin/base_controller.rb +2 -3
  195. data/lib/active_admin/base_controller/authorization.rb +13 -31
  196. data/lib/active_admin/batch_actions.rb +1 -1
  197. data/lib/active_admin/batch_actions/controller.rb +24 -8
  198. data/lib/active_admin/batch_actions/resource_extension.rb +47 -18
  199. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  200. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  201. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  202. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  203. data/lib/active_admin/callbacks.rb +25 -24
  204. data/lib/active_admin/cancan_adapter.rb +7 -11
  205. data/lib/active_admin/csv_builder.rb +92 -15
  206. data/lib/active_admin/dependency.rb +93 -0
  207. data/lib/active_admin/deprecation.rb +6 -7
  208. data/lib/active_admin/devise.rb +28 -18
  209. data/lib/active_admin/dsl.rb +18 -11
  210. data/lib/active_admin/engine.rb +10 -8
  211. data/lib/active_admin/error.rb +62 -0
  212. data/lib/active_admin/filters/dsl.rb +2 -2
  213. data/lib/active_admin/filters/forms.rb +17 -27
  214. data/lib/active_admin/filters/formtastic_addons.rb +49 -15
  215. data/lib/active_admin/filters/resource_extension.rb +43 -34
  216. data/lib/active_admin/form_builder.rb +93 -154
  217. data/lib/active_admin/helpers/collection.rb +7 -13
  218. data/lib/active_admin/helpers/i18n.rb +7 -0
  219. data/lib/active_admin/helpers/optional_display.rb +5 -5
  220. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  221. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  222. data/lib/active_admin/helpers/settings.rb +16 -9
  223. data/lib/active_admin/iconic.rb +17 -15
  224. data/lib/active_admin/iconic/icons.rb +136 -136
  225. data/lib/active_admin/inputs.rb +11 -7
  226. data/lib/active_admin/inputs/datepicker_input.rb +12 -3
  227. data/lib/active_admin/inputs/filters/base.rb +42 -0
  228. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  229. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  230. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  231. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  232. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  233. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  234. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  235. data/lib/active_admin/menu.rb +6 -4
  236. data/lib/active_admin/menu_collection.rb +1 -4
  237. data/lib/active_admin/namespace.rb +55 -29
  238. data/lib/active_admin/order_clause.rb +26 -0
  239. data/lib/active_admin/orm/active_record.rb +5 -0
  240. data/lib/active_admin/orm/active_record/comments.rb +81 -0
  241. data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
  242. data/lib/active_admin/{comments → orm/active_record/comments}/namespace_helper.rb +2 -2
  243. data/lib/active_admin/{comments → orm/active_record/comments}/resource_helper.rb +1 -1
  244. data/lib/active_admin/{comments → orm/active_record/comments}/show_page_helper.rb +0 -0
  245. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  246. data/lib/active_admin/{comments → orm/active_record/comments}/views/active_admin_comments.rb +16 -14
  247. data/lib/active_admin/orm/mongoid.rb +1 -0
  248. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  249. data/lib/active_admin/page.rb +7 -3
  250. data/lib/active_admin/page_dsl.rb +1 -1
  251. data/lib/active_admin/page_presenter.rb +2 -2
  252. data/lib/active_admin/pundit_adapter.rb +68 -0
  253. data/lib/active_admin/resource.rb +16 -17
  254. data/lib/active_admin/resource/action_items.rb +23 -18
  255. data/lib/active_admin/resource/belongs_to.rb +7 -3
  256. data/lib/active_admin/resource/controllers.rb +1 -0
  257. data/lib/active_admin/resource/includes.rb +12 -0
  258. data/lib/active_admin/resource/menu.rb +5 -5
  259. data/lib/active_admin/resource/naming.rb +27 -43
  260. data/lib/active_admin/resource/page_presenters.rb +1 -1
  261. data/lib/active_admin/resource/routes.rb +27 -11
  262. data/lib/active_admin/resource/scope_to.rb +7 -7
  263. data/lib/active_admin/resource/sidebars.rb +1 -0
  264. data/lib/active_admin/resource_controller.rb +6 -7
  265. data/lib/active_admin/resource_controller/data_access.rb +101 -93
  266. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  267. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  268. data/lib/active_admin/resource_dsl.rb +53 -10
  269. data/lib/active_admin/router.rb +7 -7
  270. data/lib/active_admin/scope.rb +6 -6
  271. data/lib/active_admin/sidebar_section.rb +10 -2
  272. data/lib/active_admin/version.rb +1 -1
  273. data/lib/active_admin/view_factory.rb +17 -17
  274. data/lib/active_admin/view_helpers.rb +0 -1
  275. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  276. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
  277. data/lib/active_admin/view_helpers/display_helper.rb +30 -15
  278. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -25
  279. data/lib/active_admin/view_helpers/fields_for.rb +4 -4
  280. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  281. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  282. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  283. data/lib/active_admin/views/action_items.rb +2 -2
  284. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  285. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  286. data/lib/active_admin/views/components/attributes_table.rb +63 -21
  287. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  288. data/lib/active_admin/views/components/columns.rb +13 -7
  289. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  290. data/lib/active_admin/views/components/index_list.rb +7 -7
  291. data/lib/active_admin/views/components/paginated_collection.rb +38 -20
  292. data/lib/active_admin/views/components/panel.rb +8 -2
  293. data/lib/active_admin/views/components/popover.rb +1 -1
  294. data/lib/active_admin/views/components/scopes.rb +5 -4
  295. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  296. data/lib/active_admin/views/components/site_title.rb +2 -2
  297. data/lib/active_admin/views/components/status_tag.rb +34 -11
  298. data/lib/active_admin/views/components/table_for.rb +90 -45
  299. data/lib/active_admin/views/components/tabs.rb +28 -0
  300. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  301. data/lib/active_admin/views/footer.rb +3 -3
  302. data/lib/active_admin/views/header.rb +3 -3
  303. data/lib/active_admin/views/index_as_block.rb +10 -10
  304. data/lib/active_admin/views/index_as_blog.rb +45 -39
  305. data/lib/active_admin/views/index_as_grid.rb +14 -10
  306. data/lib/active_admin/views/index_as_table.rb +242 -129
  307. data/lib/active_admin/views/pages/base.rb +22 -18
  308. data/lib/active_admin/views/pages/form.rb +21 -11
  309. data/lib/active_admin/views/pages/index.rb +40 -35
  310. data/lib/active_admin/views/pages/layout.rb +1 -1
  311. data/lib/active_admin/views/pages/show.rb +4 -4
  312. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  313. data/lib/active_admin/views/title_bar.rb +10 -8
  314. data/lib/generators/active_admin/assets/assets_generator.rb +3 -28
  315. data/lib/generators/active_admin/assets/templates/{3.1/active_admin.css.scss → active_admin.css.scss} +0 -0
  316. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  317. data/lib/generators/active_admin/devise/devise_generator.rb +24 -26
  318. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  319. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +28 -26
  320. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -2
  321. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  322. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  323. data/lib/generators/active_admin/page/USAGE +8 -0
  324. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  325. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  326. data/lib/generators/active_admin/resource/resource_generator.rb +3 -5
  327. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  328. data/lib/ransack_ext.rb +12 -0
  329. data/script/local +2 -2
  330. data/script/travis_cache +107 -0
  331. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  332. data/spec/javascripts/fixtures/flashes.html +2 -0
  333. data/spec/rails_helper.rb +154 -0
  334. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  335. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  336. data/spec/requests/memory_spec.rb +23 -0
  337. data/spec/requests/stylesheets_spec.rb +18 -0
  338. data/spec/spec_helper.rb +12 -173
  339. data/spec/support/detect_rails_version.rb +9 -17
  340. data/spec/support/rails_template.rb +64 -35
  341. data/spec/support/rails_template_with_data.rb +14 -14
  342. data/spec/support/templates/admin/stores.rb +5 -1
  343. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  344. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  345. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  346. data/spec/support/templates/policies/application_policy.rb +45 -0
  347. data/spec/support/templates/policies/category_policy.rb +7 -0
  348. data/spec/support/templates/policies/post_policy.rb +15 -0
  349. data/spec/support/templates/policies/store_policy.rb +11 -0
  350. data/spec/support/templates/policies/user_policy.rb +11 -0
  351. data/spec/support/templates/post_decorator.rb +4 -46
  352. data/spec/unit/abstract_view_factory_spec.rb +16 -16
  353. data/spec/unit/action_builder_spec.rb +24 -18
  354. data/spec/unit/active_admin_spec.rb +2 -2
  355. data/spec/unit/application_spec.rb +33 -34
  356. data/spec/unit/asset_registration_spec.rb +25 -29
  357. data/spec/unit/authorization/authorization_adapter_spec.rb +10 -10
  358. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  359. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  360. data/spec/unit/auto_link_spec.rb +43 -13
  361. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  362. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  363. data/spec/unit/belongs_to_spec.rb +28 -19
  364. data/spec/unit/cancan_adapter_spec.rb +8 -8
  365. data/spec/unit/comments_spec.rb +99 -39
  366. data/spec/unit/component_spec.rb +3 -3
  367. data/spec/unit/config_shared_examples.rb +10 -10
  368. data/spec/unit/controller_filters_spec.rb +23 -16
  369. data/spec/unit/csv_builder_spec.rb +165 -24
  370. data/spec/unit/dependency_spec.rb +135 -0
  371. data/spec/unit/devise_spec.rb +17 -37
  372. data/spec/unit/dsl_spec.rb +70 -9
  373. data/spec/unit/event_spec.rb +11 -11
  374. data/spec/unit/filters/filter_form_builder_spec.rb +207 -148
  375. data/spec/unit/filters/resource_spec.rb +60 -26
  376. data/spec/unit/form_builder_spec.rb +419 -145
  377. data/spec/unit/generators/install_spec.rb +23 -0
  378. data/spec/unit/helpers/collection_spec.rb +18 -18
  379. data/spec/unit/helpers/scope_chain_spec.rb +6 -6
  380. data/spec/unit/helpers/settings_spec.rb +4 -4
  381. data/spec/unit/i18n_spec.rb +12 -0
  382. data/spec/unit/menu_collection_spec.rb +14 -14
  383. data/spec/unit/menu_item_spec.rb +42 -42
  384. data/spec/unit/menu_spec.rb +20 -20
  385. data/spec/unit/namespace/authorization_spec.rb +8 -8
  386. data/spec/unit/namespace/register_page_spec.rb +11 -11
  387. data/spec/unit/namespace/register_resource_spec.rb +28 -30
  388. data/spec/unit/namespace_spec.rb +20 -20
  389. data/spec/unit/order_clause_spec.rb +81 -0
  390. data/spec/unit/page_controller_spec.rb +1 -1
  391. data/spec/unit/page_spec.rb +18 -12
  392. data/spec/unit/pretty_format_spec.rb +42 -14
  393. data/spec/unit/pundit_adapter_spec.rb +98 -0
  394. data/spec/unit/resource/action_items_spec.rb +15 -12
  395. data/spec/unit/resource/includes_spec.rb +21 -0
  396. data/spec/unit/resource/menu_spec.rb +1 -1
  397. data/spec/unit/resource/naming_spec.rb +35 -21
  398. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  399. data/spec/unit/resource/pagination_spec.rb +6 -6
  400. data/spec/unit/resource/routes_spec.rb +10 -10
  401. data/spec/unit/resource/scopes_spec.rb +14 -7
  402. data/spec/unit/resource/sidebars_spec.rb +6 -6
  403. data/spec/unit/resource_collection_spec.rb +31 -38
  404. data/spec/unit/resource_controller/data_access_spec.rb +96 -30
  405. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  406. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  407. data/spec/unit/resource_controller_spec.rb +73 -70
  408. data/spec/unit/resource_registration_spec.rb +12 -12
  409. data/spec/unit/resource_spec.rb +77 -42
  410. data/spec/unit/routing_spec.rb +39 -31
  411. data/spec/unit/scope_spec.rb +112 -30
  412. data/spec/unit/settings_spec.rb +51 -21
  413. data/spec/unit/view_factory_spec.rb +2 -3
  414. data/spec/unit/view_helpers/breadcrumbs_spec.rb +71 -60
  415. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  416. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  417. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  418. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  419. data/spec/unit/view_helpers/form_helper_spec.rb +10 -23
  420. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +64 -22
  421. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  422. data/spec/unit/views/components/attributes_table_spec.rb +171 -30
  423. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  424. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  425. data/spec/unit/views/components/columns_spec.rb +52 -22
  426. data/spec/unit/views/components/index_list_spec.rb +11 -8
  427. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  428. data/spec/unit/views/components/paginated_collection_spec.rb +79 -90
  429. data/spec/unit/views/components/panel_spec.rb +32 -21
  430. data/spec/unit/views/components/popover_spec.rb +7 -7
  431. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  432. data/spec/unit/views/components/site_title_spec.rb +26 -26
  433. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  434. data/spec/unit/views/components/table_for_spec.rb +237 -35
  435. data/spec/unit/views/components/tabs_spec.rb +39 -0
  436. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  437. data/spec/unit/views/pages/form_spec.rb +17 -10
  438. data/spec/unit/views/pages/index_spec.rb +60 -0
  439. data/spec/unit/views/pages/layout_spec.rb +17 -21
  440. data/spec/unit/views/pages/show_spec.rb +18 -6
  441. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  442. data/tasks/docs.rake +9 -11
  443. data/tasks/parallel_tests.rake +8 -2
  444. data/tasks/test.rake +13 -9
  445. data/tasks/yard.rake +7 -4
  446. metadata +219 -163
  447. data/.document +0 -5
  448. data/README.rdoc +0 -88
  449. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  450. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  451. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  452. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  453. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  454. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  455. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  456. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  457. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  458. data/app/assets/images/active_admin/loading.gif +0 -0
  459. data/app/assets/javascripts/active_admin/application.js +0 -3
  460. data/app/assets/javascripts/active_admin/base.js +0 -5
  461. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +0 -105
  462. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +0 -97
  463. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +0 -4
  464. data/app/assets/javascripts/active_admin/pages/application.js.coffee +0 -21
  465. data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +0 -26
  466. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  467. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -41
  468. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  469. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +0 -38
  470. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +0 -43
  471. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  472. data/app/views/active_admin/resource/index.csv.erb +0 -23
  473. data/docs/3-index-pages/create-an-index.md +0 -29
  474. data/lib/active_admin/comments.rb +0 -83
  475. data/lib/active_admin/comments/comment.rb +0 -42
  476. data/lib/active_admin/comments/views.rb +0 -2
  477. data/lib/active_admin/dependency_checker.rb +0 -46
  478. data/lib/active_admin/inputs/filter_base.rb +0 -33
  479. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  480. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -36
  481. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -40
  482. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  483. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  484. data/lib/active_admin/inputs/filter_select_input.rb +0 -49
  485. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  486. data/lib/active_admin/reloader.rb +0 -130
  487. data/lib/active_admin/resource_controller/actions.rb +0 -81
  488. data/lib/active_admin/sass/active_admin.scss +0 -3
  489. data/lib/active_admin/sass/css_loader.rb +0 -16
  490. data/lib/active_admin/sass/helpers.rb +0 -45
  491. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  492. data/lib/active_admin/views/dashboard_section_renderer.rb +0 -19
  493. data/lib/active_admin/views/pages/dashboard.rb +0 -62
  494. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +0 -1
  495. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +0 -1
  496. data/lib/meta_search_ext.rb +0 -10
  497. data/spec/integration/memory_spec.rb +0 -29
  498. data/spec/integration/stylesheets_spec.rb +0 -41
  499. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  500. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  501. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  502. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  503. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  504. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  505. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  506. data/spec/javascripts/support/jquery.min.js +0 -4
  507. data/spec/spec_helper_without_rails.rb +0 -11
  508. data/spec/unit/generators/install_rails_3_1_spec.rb +0 -16
  509. data/spec/unit/rails_spec.rb +0 -43
  510. data/spec/unit/reloader_spec.rb +0 -124
  511. data/spec/unit/sass/helpers_spec.rb +0 -47
  512. data/tasks/js.rake +0 -32
@@ -1,6 +1,12 @@
1
1
  module ActiveAdmin
2
2
  module Filters
3
3
 
4
+ class Disabled < RuntimeError
5
+ def initialize
6
+ super "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
7
+ end
8
+ end
9
+
4
10
  module ResourceExtension
5
11
 
6
12
  def initialize(*)
@@ -11,9 +17,9 @@ module ActiveAdmin
11
17
  # Returns the filters for this resource. If filters are not enabled,
12
18
  # it will always return an empty array.
13
19
  #
14
- # @return [Array] Filters that apply for this resource
20
+ # @return [Hash] Filters that apply for this resource
15
21
  def filters
16
- filters_enabled? ? filter_lookup : []
22
+ filters_enabled? ? filter_lookup : {}
17
23
  end
18
24
 
19
25
  # Setter to enable / disable filters on this resource.
@@ -39,14 +45,11 @@ module ActiveAdmin
39
45
  # Remove a filter for this resource. If filters are not enabled, this method
40
46
  # will raise a RuntimeError
41
47
  #
42
- # @param [Symbol] attribute The attribute to not filter on
43
- def remove_filter(attribute)
44
- unless filters_enabled?
45
- raise RuntimeError, "Can't remove a filter when filters are disabled. Enable filters with 'config.filters = true'"
46
- end
48
+ # @param [Symbol] attributes The attributes to not filter on
49
+ def remove_filter(*attributes)
50
+ raise Disabled unless filters_enabled?
47
51
 
48
- @filters_to_remove ||= []
49
- @filters_to_remove << attribute
52
+ attributes.each { |attribute| (@filters_to_remove ||= []) << attribute.to_sym }
50
53
  end
51
54
 
52
55
  # Add a filter for this resource. If filters are not enabled, this method
@@ -54,14 +57,11 @@ module ActiveAdmin
54
57
  #
55
58
  # @param [Symbol] attribute The attribute to filter on
56
59
  # @param [Hash] options The set of options that are passed through to
57
- # metasearch for the field definition.
60
+ # ransack for the field definition.
58
61
  def add_filter(attribute, options = {})
59
- unless filters_enabled?
60
- raise RuntimeError, "Can't add a filter when filters are disabled. Enable filters with 'config.filters = true'"
61
- end
62
+ raise Disabled unless filters_enabled?
62
63
 
63
- @filters ||= []
64
- @filters << options.merge({ :attribute => attribute })
64
+ (@filters ||= {})[attribute.to_sym] = options
65
65
  end
66
66
 
67
67
  # Reset the filters to use defaults
@@ -70,40 +70,49 @@ module ActiveAdmin
70
70
  @filters_to_remove = nil
71
71
  end
72
72
 
73
- private
73
+ private
74
74
 
75
75
  # Collapses the waveform, if you will, of which filters should be displayed.
76
76
  # Removes filters and adds in default filters as desired.
77
77
  def filter_lookup
78
- filters = @filters.try(:dup) || []
79
- filters.push *default_filters if filters.empty? || preserve_default_filters?
78
+ filters = @filters.try(:dup) || {}
80
79
 
81
- if @filters_to_remove
82
- @filters_to_remove.each do |attr|
83
- filters.delete_if{ |f| f.fetch(:attribute) == attr }
80
+ if filters.empty? || preserve_default_filters?
81
+ default_filters.each do |f|
82
+ filters[f] ||= {}
84
83
  end
85
84
  end
86
85
 
86
+ if @filters_to_remove
87
+ @filters_to_remove.each &filters.method(:delete)
88
+ end
89
+
87
90
  filters
88
91
  end
89
92
 
90
93
  # @return [Array] The array of default filters for this resource
91
94
  def default_filters
92
- default_association_filters + default_content_filters
95
+ default_association_filters + default_content_filters + custom_ransack_filters
96
+ end
97
+
98
+ def custom_ransack_filters
99
+ if resource_class.respond_to?(:_ransackers)
100
+ resource_class._ransackers.keys.map(&:to_sym)
101
+ else
102
+ []
103
+ end
93
104
  end
94
105
 
95
106
  # Returns a default set of filters for the associations
96
107
  def default_association_filters
97
- if resource_class.respond_to?(:reflections)
98
- block = if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0
99
- proc{ |_,r| [r.options[:foreign_type], r.primary_key_name] }
100
- else
101
- proc{ |_,r| [r.foreign_type, r.foreign_key] }
102
- end
108
+ if resource_class.respond_to?(:reflect_on_all_associations)
109
+ poly, not_poly = resource_class.reflect_on_all_associations.partition{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
110
+
111
+ # remove deeply nested associations
112
+ not_poly.reject!{ |r| r.chain.length > 2 }
103
113
 
104
- poly, not_poly = resource_class.reflections.partition{ |_,r| r.macro == :belongs_to && r.options[:polymorphic] }
105
- filters = poly.map(&block).flatten + not_poly.map(&:first)
106
- filters.collect{ |name| { :attribute => name.to_sym } }
114
+ filters = poly.map(&:foreign_type) + not_poly.map(&:name)
115
+ filters.map &:to_sym
107
116
  else
108
117
  []
109
118
  end
@@ -111,8 +120,8 @@ module ActiveAdmin
111
120
 
112
121
  # Returns a default set of filters for the content columns
113
122
  def default_content_filters
114
- if resource_class.respond_to?(:content_columns)
115
- resource_class.content_columns.collect{|c| { :attribute => c.name.to_sym } }
123
+ if resource_class.respond_to? :content_columns
124
+ resource_class.content_columns.map{ |c| c.name.to_sym }
116
125
  else
117
126
  []
118
127
  end
@@ -123,7 +132,7 @@ module ActiveAdmin
123
132
  end
124
133
 
125
134
  def filters_sidebar_section
126
- ActiveAdmin::SidebarSection.new(:filters, :only => :index, :if => proc{ active_admin_config.filters.any? } ) do
135
+ ActiveAdmin::SidebarSection.new :filters, only: :index, if: ->{ active_admin_config.filters.any? } do
127
136
  active_admin_filters_form_for assigns[:search], active_admin_config.filters
128
137
  end
129
138
  end
@@ -1,201 +1,140 @@
1
- module ActiveAdmin
2
- class FormBuilder < ::Formtastic::FormBuilder
3
-
4
- attr_reader :form_buffers
5
-
6
- def initialize(*args)
7
- @form_buffers = ["".html_safe]
8
- super
1
+ # Provides an intuitive way to build has_many associated records in the same form.
2
+ module Formtastic
3
+ module Inputs
4
+ module Base
5
+ def input_wrapping(&block)
6
+ html = super
7
+ template.concat(html) if template.output_buffer && template.assigns['has_many_block']
8
+ html
9
+ end
9
10
  end
11
+ end
12
+ end
10
13
 
11
- def inputs(*args, &block)
12
- @use_form_buffer = block_given?
13
- form_buffers.last << with_new_form_buffer{ super }
14
- end
14
+ module ActiveAdmin
15
+ class FormBuilder < ::Formtastic::FormBuilder
16
+ self.input_namespaces = [::Object, ::ActiveAdmin::Inputs, ::Formtastic::Inputs]
15
17
 
16
- # If this `input` call is inside a `inputs` block, add the content
17
- # to the form buffer. Else, return it directly.
18
- def input(method, *args)
19
- content = with_new_form_buffer{ super }
20
- @use_form_buffer ? form_buffers.last << content : content
21
- end
18
+ # TODO: remove both class finders after formtastic 4 (where it will be default)
19
+ self.input_class_finder = ::Formtastic::InputClassFinder
20
+ self.action_class_finder = ::Formtastic::ActionClassFinder
22
21
 
23
- def cancel_link(url = {:action => "index"}, html_options = {}, li_attrs = {})
22
+ def cancel_link(url = {action: "index"}, html_options = {}, li_attrs = {})
24
23
  li_attrs[:class] ||= "cancel"
25
24
  li_content = template.link_to I18n.t('active_admin.cancel'), url, html_options
26
- form_buffers.last << template.content_tag(:li, li_content, li_attrs)
25
+ template.content_tag(:li, li_content, li_attrs)
27
26
  end
28
27
 
29
- def actions(*args, &block)
30
- form_buffers.last << with_new_form_buffer do
31
- block_given? ? super : super{ commit_action_with_cancel_link }
32
- end
33
- end
34
-
35
- def action(*args)
36
- form_buffers.last << with_new_form_buffer{ super }
37
- end
28
+ attr_accessor :already_in_an_inputs_block
38
29
 
39
- def commit_action_with_cancel_link
40
- action(:submit)
41
- cancel_link
30
+ def assoc_heading(assoc)
31
+ object.class.reflect_on_association(assoc).klass.model_name.
32
+ human(count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT)
42
33
  end
43
34
 
44
- def has_many(association, options = {}, &block)
45
- options = { :for => association, :new_record => true }.merge(options)
46
- options[:class] ||= ""
47
- options[:class] << "inputs has_many_fields"
35
+ def has_many(assoc, options = {}, &block)
36
+ # remove options that should not render as attributes
37
+ custom_settings = :new_record, :allow_destroy, :heading, :sortable, :sortable_start
38
+ builder_options = {new_record: true}.merge! options.slice *custom_settings
39
+ options = {for: assoc }.merge! options.except *custom_settings
40
+ options[:class] = [options[:class], "inputs has_many_fields"].compact.join(' ')
41
+ sortable_column = builder_options[:sortable]
42
+ sortable_start = builder_options.fetch(:sortable_start, 0)
48
43
 
49
- # Add Delete Links
50
- form_block = proc do |has_many_form|
51
- # @see https://github.com/justinfrench/formtastic/blob/2.2.1/lib/formtastic/helpers/inputs_helper.rb#L373
52
- contents = if block.arity == 1 # for backwards compatibility with REE & Ruby 1.8.x
53
- block.call(has_many_form)
54
- else
55
- index = parent_child_index(options[:parent]) if options[:parent]
56
- block.call(has_many_form, index)
57
- end
58
-
59
- if has_many_form.object.new_record?
60
- contents += template.content_tag(:li, :class => 'has_many_delete') do
61
- template.link_to I18n.t('active_admin.has_many_delete'), "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
62
- end
63
- elsif options[:allow_destroy]
64
- has_many_form.input :_destroy, :as => :boolean, :wrapper_html => {:class => "has_many_remove"},
65
- :label => I18n.t('active_admin.has_many_remove')
44
+ if sortable_column
45
+ options[:for] = [assoc, sorted_children(assoc, sortable_column)]
46
+ end
66
47
 
48
+ html = "".html_safe
49
+ unless builder_options.key?(:heading) && !builder_options[:heading]
50
+ html << template.content_tag(:h3) do
51
+ builder_options[:heading] || assoc_heading(assoc)
67
52
  end
68
-
69
- contents
70
53
  end
71
54
 
72
- form_buffers.last << with_new_form_buffer do
73
- template.content_tag :div, :class => "has_many #{association}" do
74
- # Allow customization of the nested form heading
75
- unless options.key?(:heading) && !options[:heading]
76
- form_heading = options[:heading] ||
77
- object.class.reflect_on_association(association).klass.model_name.human(:count => 1.1)
78
- form_buffers.last << template.content_tag(:h3, form_heading)
79
- end
80
-
81
- inputs options, &form_block
55
+ html << template.capture do
56
+ contents = "".html_safe
57
+ form_block = proc do |has_many_form|
58
+ index = parent_child_index options[:parent] if options[:parent]
59
+ block.call has_many_form, index
60
+ template.concat has_many_actions(has_many_form, builder_options, "".html_safe)
61
+ end
62
+
63
+ template.assign('has_many_block'=> true)
64
+ contents = without_wrapper { inputs(options, &form_block) }
82
65
 
83
- js = options[:new_record] ? js_for_has_many(association, form_block, template) : ""
84
- form_buffers.last << js.html_safe
66
+ if builder_options[:new_record]
67
+ contents << js_for_has_many(assoc, form_block, template, builder_options[:new_record], options[:class])
68
+ else
69
+ contents
85
70
  end
86
71
  end
87
- end
88
72
 
89
- def semantic_errors(*args)
90
- form_buffers.last << with_new_form_buffer{ super }
73
+ tag = @already_in_an_inputs_block ? :li : :div
74
+ html = template.content_tag(tag, html, class: "has_many_container #{assoc}", 'data-sortable' => sortable_column, 'data-sortable-start' => sortable_start)
75
+ template.concat(html) if template.output_buffer
76
+ html
91
77
  end
92
78
 
93
- # These methods are deprecated and removed from Formtastic, however are
94
- # supported here to help with transition.
95
- module DeprecatedMethods
96
-
97
- # Formtastic has depreciated #commit_button in favor of #action(:submit)
98
- def commit_button(*args)
99
- ::ActiveSupport::Deprecation.warn("f.commit_button is deprecated in favour of f.action(:submit)")
79
+ protected
100
80
 
101
- options = args.extract_options!
102
- if String === args.first
103
- options[:label] = args.first unless options.has_key?(:label)
81
+ def has_many_actions(has_many_form, builder_options, contents)
82
+ if has_many_form.object.new_record?
83
+ contents << template.content_tag(:li) do
84
+ template.link_to I18n.t('active_admin.has_many_remove'), "#", class: 'button has_many_remove'
104
85
  end
105
-
106
- action(:submit, options)
86
+ elsif builder_options[:allow_destroy]
87
+ has_many_form.input(:_destroy, as: :boolean,
88
+ wrapper_html: {class: 'has_many_delete'},
89
+ label: I18n.t('active_admin.has_many_delete'))
107
90
  end
108
91
 
109
- def commit_button_with_cancel_link
110
- # Formtastic has depreciated #buttons in favor of #actions
111
- ::ActiveSupport::Deprecation.warn("f.commit_button_with_cancel_link is deprecated in favour of f.commit_action_with_cancel_link")
92
+ if builder_options[:sortable]
93
+ has_many_form.input builder_options[:sortable], as: :hidden
112
94
 
113
- commit_action_with_cancel_link
114
- end
115
-
116
- # The buttons method always needs to be wrapped in a new buffer
117
- def buttons(*args, &block)
118
- # Formtastic has depreciated #buttons in favor of #actions
119
- ::ActiveSupport::Deprecation.warn("f.buttons is deprecated in favour of f.actions")
120
-
121
- actions args, &block
95
+ contents << template.content_tag(:li, class: 'handle') do
96
+ Iconic.icon :move_vertical
97
+ end
122
98
  end
123
99
 
100
+ contents
124
101
  end
125
- include DeprecatedMethods
126
-
127
- protected
128
102
 
129
- def active_admin_input_class_name(as)
130
- "ActiveAdmin::Inputs::#{as.to_s.camelize}Input"
131
- end
132
-
133
- # Overrides Formtastic's version to include ActiveAdmin::Inputs::*
134
- def input_class_with_const_defined(as)
135
- input_class_name = custom_input_class_name(as)
136
-
137
- if ::Object.const_defined?(input_class_name)
138
- input_class_name.constantize
139
- elsif ActiveAdmin::Inputs.const_defined?(input_class_name)
140
- active_admin_input_class_name(as).constantize
141
- elsif Formtastic::Inputs.const_defined?(input_class_name)
142
- standard_input_class_name(as).constantize
143
- else
144
- raise Formtastic::UnknownInputError, "Unable to find input class #{input_class_name}"
103
+ def sorted_children(assoc, column)
104
+ object.public_send(assoc).sort_by do |o|
105
+ attribute = o.public_send column
106
+ [attribute.nil? ? Float::INFINITY : attribute, o.id || Float::INFINITY]
145
107
  end
146
108
  end
147
109
 
148
- # use auto-loading in development environment
149
- def input_class_by_trying(as)
150
- begin
151
- custom_input_class_name(as).constantize
152
- rescue NameError
153
- begin
154
- active_admin_input_class_name(as).constantize
155
- rescue NameError
156
- standard_input_class_name(as).constantize
157
- end
158
- end
159
- rescue NameError
160
- raise Formtastic::UnknownInputError, "Unable to find input class for #{as}"
161
- end
110
+ private
162
111
 
163
- # This method calls the block it's passed (in our case, the `f.inputs` block)
164
- # and wraps the resulting HTML in a fieldset. If your block doesn't have a
165
- # valid return value but it was otherwise built correctly, we instead use
166
- # the most recent part of the Active Admin form buffer.
167
- def field_set_and_list_wrapping(*args, &block)
168
- block_given? ? super{
169
- (val = yield).is_a?(String) ? val : form_buffers.last
170
- } : super
171
- end
112
+ def without_wrapper
113
+ is_being_wrapped = @already_in_an_inputs_block
114
+ @already_in_an_inputs_block = false
172
115
 
173
- private
116
+ html = yield
174
117
 
175
- def with_new_form_buffer
176
- form_buffers << ''.html_safe
177
- return_value = (yield || '').html_safe
178
- form_buffers.pop
179
- return_value
118
+ @already_in_an_inputs_block = is_being_wrapped
119
+ html
180
120
  end
181
121
 
182
122
  # Capture the ADD JS
183
- def js_for_has_many(association, form_block, template)
184
- assoc_reflection = object.class.reflect_on_association(association)
123
+ def js_for_has_many(assoc, form_block, template, new_record, class_string)
124
+ assoc_reflection = object.class.reflect_on_association assoc
185
125
  assoc_name = assoc_reflection.klass.model_name
186
- placeholder = "NEW_#{assoc_name.to_s.upcase.split(' ').join('_')}_RECORD"
126
+ placeholder = "NEW_#{assoc_name.to_s.underscore.upcase.gsub(/\//, '_')}_RECORD"
187
127
  opts = {
188
- :for => [association, assoc_reflection.klass.new],
189
- :class => "inputs has_many_fields",
190
- :for_options => { :child_index => placeholder }
128
+ for: [assoc, assoc_reflection.klass.new],
129
+ class: class_string,
130
+ for_options: { child_index: placeholder }
191
131
  }
192
- js = with_new_form_buffer{ inputs_for_nested_attributes opts, &form_block }
193
- js = template.escape_javascript js
132
+ html = template.capture{ inputs_for_nested_attributes opts, &form_block }
133
+ text = new_record.is_a?(String) ? new_record : I18n.t('active_admin.has_many_new', model: assoc_name.human)
194
134
 
195
- onclick = "$(this).before('#{js}'.replace(/#{placeholder}/g, new Date().getTime())); return false;"
196
- text = I18n.t 'active_admin.has_many_new', :model => assoc_name.human
197
-
198
- template.link_to(text, "#", :onclick => onclick, :class => "button").html_safe
135
+ template.link_to text, '#', class: "button has_many_add", data: {
136
+ html: CGI.escapeHTML(html).html_safe, placeholder: placeholder
137
+ }
199
138
  end
200
139
 
201
140
  end
@@ -1,22 +1,16 @@
1
1
  module ActiveAdmin
2
2
  module Helpers
3
3
  module Collection
4
- # Works around this issue: https://github.com/rails/rails/issues/7121
5
- #
6
- # GROUP BY + COUNT drops SELECT statement. This leads to SQL error when
7
- # the ORDER statement mentions a column defined in the SELECT statement.
8
- #
9
- # We remove the ORDER statement to work around this issue.
10
- def collection_size(collection=collection())
11
- size = collection.reorder("").count
12
- # when GROUP BY is used, AR returns Hash instead of Fixnum for .size
13
- size = size.size if size.kind_of?(Hash)
4
+ # 1. removes `select` and `order` to prevent invalid SQL
5
+ # 2. correctly handles the Hash returned when `group by` is used
6
+ def collection_size(c = collection)
7
+ c = c.except :select, :order
14
8
 
15
- size
9
+ c.group_values.present? ? c.count.count : c.count
16
10
  end
17
11
 
18
- def collection_is_empty?(collection=collection())
19
- collection_size(collection) == 0
12
+ def collection_is_empty?(c = collection)
13
+ collection_size(c) == 0
20
14
  end
21
15
  end
22
16
  end