activeadmin 0.6.0 → 0.6.1

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 (322) hide show
  1. data/.gitignore +5 -1
  2. data/.travis.yml +1 -1
  3. data/.yardopts +2 -3
  4. data/CHANGELOG.md +180 -36
  5. data/CONTRIBUTING.md +12 -2
  6. data/Gemfile +9 -3
  7. data/README.rdoc +38 -65
  8. data/Rakefile +1 -3
  9. data/activeadmin.gemspec +10 -11
  10. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +1 -1
  11. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +1 -1
  12. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +1 -1
  13. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +1 -1
  14. data/app/assets/javascripts/active_admin/components/jquery.aa.checkbox-toggler.js.coffee +2 -2
  15. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +2 -2
  16. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +2 -2
  17. data/app/assets/javascripts/active_admin/components/jquery.aa.table-checkbox-toggler.js.coffee +2 -2
  18. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +2 -1
  19. data/app/assets/javascripts/active_admin/pages/application.js.coffee +6 -1
  20. data/app/assets/stylesheets/active_admin/_base.css.scss +29 -34
  21. data/app/assets/stylesheets/active_admin/_forms.css.scss +65 -62
  22. data/app/assets/stylesheets/active_admin/_header.css.scss +57 -45
  23. data/app/assets/stylesheets/active_admin/_typography.css.scss +9 -9
  24. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +1 -1
  25. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +5 -5
  26. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +2 -2
  27. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +1 -1
  28. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +20 -20
  29. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +16 -16
  30. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +25 -23
  31. data/app/assets/stylesheets/active_admin/components/_grid.scss +2 -2
  32. data/app/assets/stylesheets/active_admin/components/_index_list.scss +1 -1
  33. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -10
  34. data/app/assets/stylesheets/active_admin/components/_panels.scss +1 -1
  35. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +27 -27
  36. data/app/assets/stylesheets/active_admin/components/_scopes.scss +1 -1
  37. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +10 -10
  38. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +9 -9
  39. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +3 -3
  40. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +4 -4
  41. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +4 -7
  42. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +5 -5
  43. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +3 -3
  44. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +6 -6
  45. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +8 -8
  46. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +1 -1
  47. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +1 -1
  48. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +9 -1
  49. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +1 -1
  50. data/app/assets/stylesheets/active_admin/print.css.scss +2 -8
  51. data/app/assets/stylesheets/active_admin/structure/_footer.scss +5 -5
  52. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +13 -13
  53. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +14 -14
  54. data/app/views/active_admin/devise/passwords/edit.html.erb +1 -1
  55. data/app/views/active_admin/devise/sessions/new.html.erb +1 -1
  56. data/app/views/active_admin/devise/shared/_links.erb +8 -1
  57. data/app/views/active_admin/resource/index.csv.erb +3 -3
  58. data/app/views/layouts/active_admin_logged_out.html.erb +5 -3
  59. data/config/locales/bg.yml +101 -0
  60. data/{lib/active_admin → config}/locales/ca.yml +24 -7
  61. data/{lib/active_admin → config}/locales/cs.yml +34 -12
  62. data/{lib/active_admin → config}/locales/da.yml +29 -7
  63. data/config/locales/de-CH.yml +117 -0
  64. data/{lib/active_admin → config}/locales/de.yml +19 -9
  65. data/config/locales/en-GB.yml +90 -0
  66. data/{lib/active_admin → config}/locales/en.yml +16 -6
  67. data/config/locales/es.yml +106 -0
  68. data/{lib/active_admin/locales/es.yml → config/locales/es_MX.yml} +14 -8
  69. data/{lib/active_admin → config}/locales/fr.yml +14 -6
  70. data/{lib/active_admin → config}/locales/he.yml +16 -6
  71. data/{lib/active_admin → config}/locales/hr.yml +14 -6
  72. data/{lib/active_admin → config}/locales/hu.yml +31 -6
  73. data/{lib/active_admin → config}/locales/it.yml +14 -6
  74. data/{lib/active_admin → config}/locales/ja.yml +32 -7
  75. data/{lib/active_admin → config}/locales/ko.yml +14 -6
  76. data/{lib/active_admin → config}/locales/lt.yml +15 -6
  77. data/{lib/active_admin → config}/locales/lv.yml +14 -6
  78. data/{lib/active_admin → config}/locales/nl.yml +14 -6
  79. data/{lib/active_admin → config}/locales/no-NB.yml +14 -6
  80. data/{lib/active_admin → config}/locales/pl.yml +14 -6
  81. data/{lib/active_admin → config}/locales/pt-BR.yml +14 -6
  82. data/{lib/active_admin → config}/locales/pt-PT.yml +14 -6
  83. data/{lib/active_admin → config}/locales/ro.yml +32 -7
  84. data/{lib/active_admin → config}/locales/ru.yml +30 -8
  85. data/{lib/active_admin → config}/locales/sv-SE.yml +14 -6
  86. data/{lib/active_admin → config}/locales/tr.yml +15 -6
  87. data/config/locales/uk.yml +100 -0
  88. data/{lib/active_admin → config}/locales/vi.yml +15 -6
  89. data/{lib/active_admin → config}/locales/zh-CN.yml +15 -6
  90. data/{lib/active_admin → config}/locales/zh-TW.yml +15 -6
  91. data/docs/0-installation.md +22 -18
  92. data/docs/1-general-configuration.md +1 -1
  93. data/docs/10-custom-pages.md +3 -3
  94. data/docs/11-decorators.md +18 -2
  95. data/docs/12-arbre-components.md +53 -54
  96. data/docs/13-authorization-adapter.md +31 -10
  97. data/docs/2-resource-customization.md +16 -1
  98. data/docs/3-index-pages.md +13 -1
  99. data/docs/3-index-pages/create-an-index.md +4 -4
  100. data/docs/3-index-pages/index-as-block.md +1 -1
  101. data/docs/3-index-pages/index-as-blog.md +1 -1
  102. data/docs/3-index-pages/index-as-grid.md +1 -1
  103. data/docs/4-csv-format.md +4 -4
  104. data/docs/5-forms.md +46 -3
  105. data/docs/{6-show-screens.md → 6-show-pages.md} +3 -3
  106. data/docs/8-custom-actions.md +3 -3
  107. data/docs/9-batch-actions.md +9 -1
  108. data/features/action_item.feature +6 -6
  109. data/features/authorization_cancan.feature +1 -1
  110. data/features/belongs_to.feature +3 -3
  111. data/features/breadcrumb.feature +2 -2
  112. data/features/comments/commenting.feature +7 -5
  113. data/features/dashboard.feature +0 -51
  114. data/features/favicon.feature +20 -0
  115. data/features/global_navigation.feature +0 -1
  116. data/features/index/batch_actions.feature +12 -11
  117. data/features/index/filters.feature +6 -6
  118. data/features/index/format_as_csv.feature +4 -5
  119. data/features/index/index_as_blog.feature +20 -1
  120. data/features/index/index_as_table.feature +1 -1
  121. data/features/index/index_blank_slate.feature +3 -3
  122. data/features/index/index_parameters.feature +4 -10
  123. data/features/index/index_scope_to.feature +24 -0
  124. data/features/index/index_scopes.feature +17 -5
  125. data/features/index/pagination.feature +15 -0
  126. data/features/registering_pages.feature +1 -1
  127. data/features/registering_resources.feature +2 -2
  128. data/features/show/default_content.feature +3 -3
  129. data/features/sidebar_sections.feature +3 -3
  130. data/features/specifying_actions.feature +1 -1
  131. data/features/step_definitions/additional_web_steps.rb +3 -16
  132. data/features/step_definitions/asset_steps.rb +5 -1
  133. data/features/step_definitions/attribute_steps.rb +4 -4
  134. data/features/step_definitions/batch_action_steps.rb +25 -74
  135. data/features/step_definitions/breadcrumb_steps.rb +1 -3
  136. data/features/step_definitions/comment_steps.rb +0 -1
  137. data/features/step_definitions/configuration_steps.rb +53 -69
  138. data/features/step_definitions/dashboard_steps.rb +2 -2
  139. data/features/step_definitions/factory_steps.rb +17 -33
  140. data/features/step_definitions/filter_steps.rb +2 -2
  141. data/features/step_definitions/format_steps.rb +10 -14
  142. data/features/step_definitions/index_scope_steps.rb +9 -25
  143. data/features/step_definitions/index_views_steps.rb +1 -1
  144. data/features/step_definitions/sidebar_steps.rb +2 -1
  145. data/features/step_definitions/site_title_steps.rb +1 -1
  146. data/features/step_definitions/table_steps.rb +6 -1
  147. data/features/step_definitions/user_steps.rb +23 -38
  148. data/features/step_definitions/web_steps.rb +18 -147
  149. data/features/support/env.rb +13 -34
  150. data/features/support/paths.rb +2 -0
  151. data/features/users/logging_in.feature +2 -2
  152. data/features/users/logging_out.feature +0 -12
  153. data/features/users/resetting_password.feature +1 -1
  154. data/lib/active_admin.rb +4 -17
  155. data/lib/active_admin/abstract_view_factory.rb +1 -1
  156. data/lib/active_admin/application.rb +19 -28
  157. data/lib/active_admin/asset_registration.rb +7 -25
  158. data/lib/active_admin/authorization_adapter.rb +9 -5
  159. data/lib/active_admin/base_controller.rb +2 -2
  160. data/lib/active_admin/base_controller/authorization.rb +25 -27
  161. data/lib/active_admin/batch_actions/resource_extension.rb +3 -3
  162. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +1 -1
  163. data/lib/active_admin/batch_actions/views/selection_cells.rb +1 -1
  164. data/lib/active_admin/callbacks.rb +1 -1
  165. data/lib/active_admin/cancan_adapter.rb +2 -2
  166. data/lib/active_admin/comments.rb +32 -38
  167. data/lib/active_admin/comments/comment.rb +6 -8
  168. data/lib/active_admin/comments/views.rb +0 -1
  169. data/lib/active_admin/comments/views/active_admin_comments.rb +27 -38
  170. data/lib/active_admin/csv_builder.rb +4 -6
  171. data/lib/active_admin/dependency_checker.rb +4 -0
  172. data/lib/active_admin/deprecation.rb +3 -3
  173. data/lib/active_admin/dsl.rb +5 -5
  174. data/lib/active_admin/engine.rb +1 -1
  175. data/lib/active_admin/filters.rb +2 -1
  176. data/lib/active_admin/filters/forms.rb +36 -43
  177. data/lib/active_admin/filters/formtastic_addons.rb +45 -0
  178. data/lib/active_admin/filters/resource_extension.rb +9 -1
  179. data/lib/active_admin/form_builder.rb +30 -19
  180. data/lib/active_admin/helpers/optional_display.rb +11 -13
  181. data/lib/active_admin/helpers/settings.rb +50 -8
  182. data/lib/active_admin/inputs/filter_base.rb +5 -18
  183. data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
  184. data/lib/active_admin/inputs/filter_boolean_input.rb +6 -14
  185. data/lib/active_admin/inputs/filter_check_boxes_input.rb +1 -1
  186. data/lib/active_admin/inputs/filter_numeric_input.rb +2 -47
  187. data/lib/active_admin/inputs/filter_select_input.rb +32 -10
  188. data/lib/active_admin/inputs/filter_string_input.rb +12 -14
  189. data/lib/active_admin/namespace.rb +8 -40
  190. data/lib/active_admin/page.rb +2 -2
  191. data/lib/active_admin/page_dsl.rb +1 -1
  192. data/lib/active_admin/reloader.rb +3 -3
  193. data/lib/active_admin/resource.rb +16 -23
  194. data/lib/active_admin/resource/belongs_to.rb +8 -5
  195. data/lib/active_admin/resource/menu.rb +10 -23
  196. data/lib/active_admin/resource/naming.rb +3 -3
  197. data/lib/active_admin/resource/page_presenters.rb +2 -2
  198. data/lib/active_admin/resource/routes.rb +74 -21
  199. data/lib/active_admin/resource/scope_to.rb +74 -0
  200. data/lib/active_admin/resource/scopes.rb +8 -4
  201. data/lib/active_admin/resource_collection.rb +20 -66
  202. data/lib/active_admin/resource_controller.rb +12 -16
  203. data/lib/active_admin/resource_controller/data_access.rb +19 -22
  204. data/lib/active_admin/resource_controller/resource_class_methods.rb +2 -2
  205. data/lib/active_admin/resource_controller/scoping.rb +4 -9
  206. data/lib/active_admin/resource_dsl.rb +5 -32
  207. data/lib/active_admin/router.rb +34 -47
  208. data/lib/active_admin/scope.rb +5 -3
  209. data/lib/active_admin/sidebar_section.rb +1 -1
  210. data/lib/active_admin/version.rb +1 -1
  211. data/lib/active_admin/view_factory.rb +1 -1
  212. data/lib/active_admin/view_helpers/auto_link_helper.rb +1 -1
  213. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +8 -8
  214. data/lib/active_admin/view_helpers/display_helper.rb +15 -6
  215. data/lib/active_admin/view_helpers/download_format_links_helper.rb +2 -2
  216. data/lib/active_admin/view_helpers/form_helper.rb +6 -1
  217. data/lib/active_admin/view_helpers/icon_helper.rb +1 -1
  218. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +5 -5
  219. data/lib/active_admin/view_helpers/title_helper.rb +1 -1
  220. data/lib/active_admin/views/components/action_list_popover.rb +6 -6
  221. data/lib/active_admin/views/components/attributes_table.rb +9 -12
  222. data/lib/active_admin/views/components/blank_slate.rb +4 -4
  223. data/lib/active_admin/views/components/columns.rb +1 -1
  224. data/lib/active_admin/views/components/index_list.rb +1 -1
  225. data/lib/active_admin/views/components/paginated_collection.rb +20 -12
  226. data/lib/active_admin/views/components/panel.rb +1 -1
  227. data/lib/active_admin/views/components/scopes.rb +2 -1
  228. data/lib/active_admin/views/components/sidebar_section.rb +1 -1
  229. data/lib/active_admin/views/components/status_tag.rb +1 -1
  230. data/lib/active_admin/views/header.rb +2 -2
  231. data/lib/active_admin/views/index_as_blog.rb +16 -3
  232. data/lib/active_admin/views/index_as_table.rb +2 -2
  233. data/lib/active_admin/views/pages/base.rb +8 -3
  234. data/lib/active_admin/views/pages/form.rb +2 -2
  235. data/lib/active_admin/views/pages/index.rb +19 -17
  236. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +1 -1
  237. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +1 -13
  238. data/lib/generators/active_admin/devise/devise_generator.rb +22 -1
  239. data/lib/generators/active_admin/install/install_generator.rb +1 -5
  240. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +40 -19
  241. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +18 -18
  242. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  243. data/lib/generators/active_admin/resource/resource_generator.rb +1 -1
  244. data/lib/generators/active_admin/resource/templates/admin.rb +1 -1
  245. data/script/use_rails +1 -1
  246. data/spec/integration/memory_spec.rb +3 -2
  247. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +4 -4
  248. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +1 -1
  249. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +2 -2
  250. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +4 -4
  251. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +1 -1
  252. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +2 -2
  253. data/spec/spec_helper.rb +16 -6
  254. data/spec/spec_helper_without_rails.rb +2 -0
  255. data/spec/support/deferred_garbage_collection.rb +19 -0
  256. data/spec/support/jslint.yml +1 -1
  257. data/spec/support/rails_template.rb +29 -27
  258. data/spec/support/templates/admin/stores.rb +5 -1
  259. data/spec/unit/abstract_view_factory_spec.rb +1 -1
  260. data/spec/unit/action_builder_spec.rb +7 -7
  261. data/spec/unit/active_admin_spec.rb +0 -14
  262. data/spec/unit/application_spec.rb +16 -17
  263. data/spec/unit/asset_registration_spec.rb +21 -8
  264. data/spec/unit/authorization/authorization_adapter_spec.rb +3 -3
  265. data/spec/unit/authorization/controller_authorization_spec.rb +16 -24
  266. data/spec/unit/batch_actions/resource_spec.rb +11 -11
  267. data/spec/unit/belongs_to_spec.rb +1 -1
  268. data/spec/unit/cancan_adapter_spec.rb +11 -3
  269. data/spec/unit/comments_spec.rb +10 -28
  270. data/spec/unit/controller_filters_spec.rb +22 -24
  271. data/spec/unit/csv_builder_spec.rb +3 -3
  272. data/spec/unit/devise_spec.rb +10 -10
  273. data/spec/unit/filters/filter_form_builder_spec.rb +140 -45
  274. data/spec/unit/filters/resource_spec.rb +20 -19
  275. data/spec/unit/form_builder_spec.rb +122 -70
  276. data/spec/unit/menu_item_spec.rb +3 -3
  277. data/spec/unit/namespace/authorization_spec.rb +4 -8
  278. data/spec/unit/namespace/register_page_spec.rb +1 -1
  279. data/spec/unit/namespace/register_resource_spec.rb +12 -7
  280. data/spec/unit/namespace_spec.rb +4 -10
  281. data/spec/unit/page_spec.rb +1 -1
  282. data/spec/unit/resource/menu_spec.rb +1 -1
  283. data/spec/unit/resource/naming_spec.rb +9 -0
  284. data/spec/unit/resource/pagination_spec.rb +2 -2
  285. data/spec/unit/resource/routes_spec.rb +73 -0
  286. data/spec/unit/resource/scopes_spec.rb +1 -1
  287. data/spec/unit/resource_collection_spec.rb +95 -43
  288. data/spec/unit/resource_registration_spec.rb +3 -12
  289. data/spec/unit/resource_spec.rb +41 -48
  290. data/spec/unit/routing_spec.rb +10 -64
  291. data/spec/unit/scope_spec.rb +19 -0
  292. data/spec/unit/settings_spec.rb +88 -0
  293. data/spec/unit/view_factory_spec.rb +1 -0
  294. data/spec/unit/{breadcrumbs_spec.rb → view_helpers/breadcrumbs_spec.rb} +16 -7
  295. data/spec/unit/view_helpers/display_name_spec.rb +41 -0
  296. data/spec/unit/view_helpers/form_helper_spec.rb +36 -2
  297. data/spec/unit/views/components/attributes_table_spec.rb +17 -9
  298. data/spec/unit/views/components/batch_action_popover_spec.rb +4 -4
  299. data/spec/unit/views/components/index_list_spec.rb +2 -2
  300. data/spec/unit/views/components/paginated_collection_spec.rb +42 -0
  301. data/spec/unit/views/components/panel_spec.rb +8 -0
  302. data/spec/unit/views/components/site_title_spec.rb +2 -2
  303. data/spec/unit/views/components/table_for_spec.rb +4 -4
  304. data/spec/unit/views/pages/form_spec.rb +35 -0
  305. data/spec/unit/views/pages/layout_spec.rb +1 -1
  306. data/spec/unit/views/tabbed_navigation_spec.rb +10 -10
  307. data/tasks/parallel_tests.rake +1 -1
  308. data/tasks/test.rake +4 -1
  309. metadata +117 -106
  310. data/app/assets/stylesheets/active_admin/pages/_dashboard.scss +0 -5
  311. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  312. data/lib/active_admin/dashboards.rb +0 -68
  313. data/lib/active_admin/dashboards/dashboard_controller.rb +0 -50
  314. data/lib/active_admin/dashboards/section.rb +0 -34
  315. data/lib/active_admin/locales/bg.yml +0 -77
  316. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +0 -17
  317. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +0 -26
  318. data/spec/unit/base_controller_spec.rb +0 -6
  319. data/spec/unit/dashboard_controller_spec.rb +0 -76
  320. data/spec/unit/dashboard_section_spec.rb +0 -56
  321. data/spec/unit/dashboards_spec.rb +0 -59
  322. data/spec/unit/display_name_spec.rb +0 -29
@@ -0,0 +1,45 @@
1
+ module ActiveAdmin
2
+ module Filters
3
+ module FormtasticAddons
4
+
5
+ #
6
+ # The below are Formtastic overrides to use `base` instead of `class` for MetaSearch.
7
+ #
8
+
9
+ # Returns the default label for a given attribute. Uses ActiveModel I18n if available.
10
+ def humanized_method_name
11
+ if object.base.respond_to?(:human_attribute_name)
12
+ object.base.human_attribute_name(method)
13
+ else
14
+ method.to_s.send(builder.label_str_method)
15
+ end
16
+ end
17
+
18
+ # Returns the association reflection for the method if it exists
19
+ def reflection_for(method)
20
+ @object.base.reflect_on_association(method) if @object.base.respond_to?(:reflect_on_association)
21
+ end
22
+
23
+ # Returns the column for an attribute on the object being searched if it exists.
24
+ def column_for(method)
25
+ @object.base.columns_hash[method.to_s] if @object.base.respond_to?(:columns_hash)
26
+ end
27
+
28
+ #
29
+ # The below are custom methods that Formtastic does not provide.
30
+ #
31
+
32
+ def foreign_key?(method)
33
+ @object.base.reflections.select{ |_,r| r.macro == :belongs_to }.values
34
+ .map(&:foreign_key).include? method.to_s
35
+ end
36
+
37
+ def polymorphic_foreign_type?(method)
38
+ type = Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0 ? proc{ |r| r.options[:foreign_type] } : :foreign_type
39
+ @object.base.reflections.values.select{ |r| r.macro == :belongs_to && r.options[:polymorphic] }
40
+ .map(&type).include? method.to_s
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -96,7 +96,15 @@ module ActiveAdmin
96
96
  # Returns a default set of filters for the associations
97
97
  def default_association_filters
98
98
  if resource_class.respond_to?(:reflections)
99
- resource_class.reflections.collect{|name, r| { :attribute => name }}
99
+ block = if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0
100
+ proc{ |_,r| [r.options[:foreign_type], r.primary_key_name] }
101
+ else
102
+ proc{ |_,r| [r.foreign_type, r.foreign_key] }
103
+ end
104
+
105
+ poly, not_poly = resource_class.reflections.partition{ |_,r| r.macro == :belongs_to && r.options[:polymorphic] }
106
+ filters = poly.map(&block).flatten + not_poly.map(&:first)
107
+ filters.collect{ |name| { :attribute => name.to_sym } }
100
108
  else
101
109
  []
102
110
  end
@@ -9,7 +9,7 @@ module ActiveAdmin
9
9
  end
10
10
 
11
11
  def inputs(*args, &block)
12
- @inputs_with_block = block_given?
12
+ @use_form_buffer = block_given?
13
13
  form_buffers.last << with_new_form_buffer{ super }
14
14
  end
15
15
 
@@ -17,7 +17,7 @@ module ActiveAdmin
17
17
  # to the form buffer. Else, return it directly.
18
18
  def input(method, *args)
19
19
  content = with_new_form_buffer{ super }
20
- @inputs_with_block ? form_buffers.last << content : content
20
+ @use_form_buffer ? form_buffers.last << content : content
21
21
  end
22
22
 
23
23
  def cancel_link(url = {:action => "index"}, html_options = {}, li_attrs = {})
@@ -42,7 +42,7 @@ module ActiveAdmin
42
42
  end
43
43
 
44
44
  def has_many(association, options = {}, &block)
45
- options = { :for => association }.merge(options)
45
+ options = { :for => association, :new_record => true }.merge(options)
46
46
  options[:class] ||= ""
47
47
  options[:class] << "inputs has_many_fields"
48
48
 
@@ -57,9 +57,13 @@ module ActiveAdmin
57
57
  end
58
58
 
59
59
  if has_many_form.object.new_record?
60
- contents += template.content_tag(:li) do
60
+ contents += template.content_tag(:li, :class => 'has_many_delete') do
61
61
  template.link_to I18n.t('active_admin.has_many_delete'), "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
62
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')
66
+
63
67
  end
64
68
 
65
69
  contents
@@ -67,10 +71,17 @@ module ActiveAdmin
67
71
 
68
72
  form_buffers.last << with_new_form_buffer do
69
73
  template.content_tag :div, :class => "has_many #{association}" do
70
- form_buffers.last << template.content_tag(:h3, object.class.reflect_on_association(association).klass.model_name.human(:count => 1.1))
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
+
71
81
  inputs options, &form_block
72
82
 
73
- form_buffers.last << js_for_has_many(association, form_block, template)
83
+ js = options[:new_record] ? js_for_has_many(association, form_block, template) : ""
84
+ form_buffers.last << js.html_safe
74
85
  end
75
86
  end
76
87
  end
@@ -119,7 +130,7 @@ module ActiveAdmin
119
130
  "ActiveAdmin::Inputs::#{as.to_s.camelize}Input"
120
131
  end
121
132
 
122
- # prevent exceptions in production environment for better performance
133
+ # Overrides Formtastic's version to include ActiveAdmin::Inputs::*
123
134
  def input_class_with_const_defined(as)
124
135
  input_class_name = custom_input_class_name(as)
125
136
 
@@ -130,33 +141,33 @@ module ActiveAdmin
130
141
  elsif Formtastic::Inputs.const_defined?(input_class_name)
131
142
  standard_input_class_name(as).constantize
132
143
  else
133
- raise Formtastic::UnknownInputError
144
+ raise Formtastic::UnknownInputError, "Unable to find input class #{input_class_name}"
134
145
  end
135
146
  end
136
147
 
137
148
  # use auto-loading in development environment
138
149
  def input_class_by_trying(as)
139
150
  begin
151
+ custom_input_class_name(as).constantize
152
+ rescue NameError
140
153
  begin
141
- custom_input_class_name(as).constantize
154
+ active_admin_input_class_name(as).constantize
142
155
  rescue NameError
143
- begin
144
- active_admin_input_class_name(as).constantize
145
- rescue NameError
146
- standard_input_class_name(as).constantize
147
- end
156
+ standard_input_class_name(as).constantize
148
157
  end
149
158
  end
150
159
  rescue NameError
151
- raise Formtastic::UnknownInputError
160
+ raise Formtastic::UnknownInputError, "Unable to find input class for #{as}"
152
161
  end
153
162
 
154
163
  # This method calls the block it's passed (in our case, the `f.inputs` block)
155
- # and wraps the resulting HTML in a fieldset. If your block happens to return
156
- # nil (but it otherwise built the form correctly), the below override passes
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
157
166
  # the most recent part of the Active Admin form buffer.
158
167
  def field_set_and_list_wrapping(*args, &block)
159
- block_given? ? super{ yield || form_buffers.last } : super
168
+ block_given? ? super{
169
+ (val = yield).is_a?(String) ? val : form_buffers.last
170
+ } : super
160
171
  end
161
172
 
162
173
  private
@@ -172,7 +183,7 @@ module ActiveAdmin
172
183
  def js_for_has_many(association, form_block, template)
173
184
  assoc_reflection = object.class.reflect_on_association(association)
174
185
  assoc_name = assoc_reflection.klass.model_name
175
- placeholder = "NEW_#{assoc_name.upcase.split(' ').join('_')}_RECORD"
186
+ placeholder = "NEW_#{assoc_name.to_s.upcase.split(' ').join('_')}_RECORD"
176
187
  opts = {
177
188
  :for => [association, assoc_reflection.klass.new],
178
189
  :class => "inputs has_many_fields",
@@ -14,26 +14,24 @@ module ActiveAdmin
14
14
  # to ensure that the display options are setup correctly
15
15
 
16
16
  module OptionalDisplay
17
- def display_on?(action, render_context = nil)
18
- return false if @options[:only] && !@options[:only].include?(action.to_sym)
17
+ def display_on?(action, render_context = self)
18
+ return false if @options[:only] && !@options[:only].include?(action.to_sym)
19
19
  return false if @options[:except] && @options[:except].include?(action.to_sym)
20
- if @options[:if]
21
- symbol_or_proc = @options[:if]
22
- return case symbol_or_proc
23
- when Symbol, String
24
- render_context ? render_context.send(symbol_or_proc) : self.send(symbol_or_proc)
25
- when Proc
26
- render_context ? render_context.instance_exec(&symbol_or_proc) : instance_exec(&symbol_or_proc)
27
- else symbol_or_proc
28
- end
20
+
21
+ case condition = @options[:if]
22
+ when Symbol, String
23
+ render_context.send condition
24
+ when Proc
25
+ render_context.instance_exec &condition
26
+ else
27
+ true
29
28
  end
30
- true
31
29
  end
32
30
 
33
31
  private
34
32
 
35
33
  def normalize_display_options!
36
- @options[:only] = Array(@options[:only]) if @options[:only]
34
+ @options[:only] = Array(@options[:only]) if @options[:only]
37
35
  @options[:except] = Array(@options[:except]) if @options[:except]
38
36
  end
39
37
  end
@@ -1,5 +1,3 @@
1
- require 'active_support/concern'
2
-
3
1
  module ActiveAdmin
4
2
 
5
3
  # Adds a class method to a class to create settings with default values.
@@ -18,7 +16,10 @@ module ActiveAdmin
18
16
  # conf.site_title #=> "Override Default"
19
17
  #
20
18
  module Settings
21
- extend ActiveSupport::Concern
19
+
20
+ def self.included(base)
21
+ base.extend ClassMethods
22
+ end
22
23
 
23
24
  def read_default_setting(name)
24
25
  default_settings[name]
@@ -34,10 +35,9 @@ module ActiveAdmin
34
35
 
35
36
  def setting(name, default)
36
37
  default_settings[name] = default
37
- attr_accessor(name)
38
+ attr_writer name
38
39
 
39
- # Create an accessor that grabs from the defaults
40
- # if @name has not been set yet
40
+ # Creates a reader that will grab the default if no value has been set.
41
41
  class_eval <<-EOC, __FILE__, __LINE__ + 1
42
42
  def #{name}
43
43
  if instance_variable_defined? :@#{name}
@@ -50,10 +50,10 @@ module ActiveAdmin
50
50
  end
51
51
 
52
52
  def deprecated_setting(name, default, message = nil)
53
- message = message || "The #{name} setting is deprecated and will be removed."
54
53
  setting(name, default)
55
54
 
56
- ActiveAdmin::Deprecation.deprecate self, name, message
55
+ message ||= "The #{name} setting is deprecated and will be removed."
56
+ ActiveAdmin::Deprecation.deprecate self, name, message
57
57
  ActiveAdmin::Deprecation.deprecate self, :"#{name}=", message
58
58
  end
59
59
 
@@ -62,5 +62,47 @@ module ActiveAdmin
62
62
  end
63
63
 
64
64
  end
65
+
66
+
67
+ # Allows you to define child classes that should receive the same
68
+ # settings, as well as the same default values.
69
+ #
70
+ # Example from the codebase:
71
+ #
72
+ # class Application
73
+ # include Settings
74
+ # include Settings::Inheritance
75
+ #
76
+ # settings_inherited_by :Namespace
77
+ #
78
+ # inheritable_setting :root_to, 'dashboard#index'
79
+ # end
80
+ #
81
+ module Inheritance
82
+
83
+ def self.included(base)
84
+ base.extend ClassMethods
85
+ end
86
+
87
+ module ClassMethods
88
+
89
+ def settings_inherited_by(heir)
90
+ (@setting_heirs ||= []) << heir
91
+ heir.send :include, ActiveAdmin::Settings
92
+ end
93
+
94
+ def inheritable_setting(name, default)
95
+ setting name, default
96
+ @setting_heirs.each{ |c| c.setting name, default }
97
+ end
98
+
99
+ def deprecated_inheritable_setting(name, default)
100
+ deprecated_setting name, default
101
+ @setting_heirs.each{ |c| c.deprecated_setting name, default }
102
+ end
103
+
104
+ end
105
+ end
106
+
65
107
  end
66
108
  end
@@ -2,12 +2,13 @@ module ActiveAdmin
2
2
  module Inputs
3
3
  module FilterBase
4
4
  include ::Formtastic::Inputs::Base
5
+ include ::ActiveAdmin::Filters::FormtasticAddons
6
+
7
+ extend ::ActiveSupport::Autoload
8
+ autoload :SearchMethodSelect
5
9
 
6
10
  def input_wrapping(&block)
7
- template.content_tag(:div,
8
- template.capture(&block),
9
- wrapper_html_options
10
- )
11
+ template.content_tag :div, template.capture(&block), wrapper_html_options
11
12
  end
12
13
 
13
14
  def required?
@@ -27,20 +28,6 @@ module ActiveAdmin
27
28
  end
28
29
  end
29
30
 
30
- # Returns the default label for a given attribute
31
- # Will use ActiveModel I18n if possible
32
- def humanized_method_name
33
- if object.base.respond_to?(:human_attribute_name)
34
- object.base.human_attribute_name(method)
35
- else
36
- method.to_s.send(builder.label_str_method)
37
- end
38
- end
39
-
40
- # Returns the association reflection for the method if it exists
41
- def reflection_for(method)
42
- @object.base.reflect_on_association(method) if @object.base.respond_to?(:reflect_on_association)
43
- end
44
31
  end
45
32
  end
46
33
  end
@@ -0,0 +1,73 @@
1
+ # This is a common set of Formtastic overrides needed to build a filter form
2
+ # that lets you select from a set of search methods for a given attribute.
3
+ #
4
+ # Your class must declare available filters for this module to work.
5
+ # Those filters must be recognizable by Metasearch. For example:
6
+ #
7
+ # class FilterNumericInput < ::Formtastic::Inputs::NumberInput
8
+ # include FilterBase
9
+ # include FilterBase::SearchMethodSelect
10
+ #
11
+ # filter :equals, :greater_than, :less_than
12
+ # end
13
+ #
14
+ module ActiveAdmin
15
+ module Inputs
16
+ module FilterBase
17
+ module SearchMethodSelect
18
+
19
+ def self.included(base)
20
+ base.extend ClassMethods
21
+ end
22
+
23
+ module ClassMethods
24
+ attr_reader :filters
25
+
26
+ def filter(*filters)
27
+ (@filters ||= []).push *filters
28
+ end
29
+ end
30
+
31
+ def wrapper_html_options
32
+ opts = super
33
+ (opts[:class] ||= '') << ' select_and_search'
34
+ opts
35
+ end
36
+
37
+ def to_html
38
+ input_wrapping do
39
+ label_html << # your label
40
+ select_html << # the dropdown that holds the available search methods
41
+ input_html # your input field
42
+ end
43
+ end
44
+
45
+ def input_html
46
+ builder.text_field current_filter, input_html_options
47
+ end
48
+
49
+ def select_html
50
+ template.select_tag '', template.options_for_select(filter_options, current_filter)
51
+ end
52
+
53
+ def filters
54
+ options[:filters] || self.class.filters
55
+ end
56
+
57
+ def current_filter
58
+ @current_filter ||= begin
59
+ methods = filters.map{ |f| "#{method}_#{f}" }
60
+ methods.detect{ |m| @object.send m } || methods.first
61
+ end
62
+ end
63
+
64
+ def filter_options
65
+ filters.collect do |filter|
66
+ [I18n.t("active_admin.filters.predicates.#{filter}"), "#{method}_#{filter}"]
67
+ end
68
+ end
69
+
70
+ end
71
+ end
72
+ end
73
+ end
@@ -4,35 +4,27 @@ module ActiveAdmin
4
4
  include FilterBase
5
5
 
6
6
  def to_html
7
- input_wrapping do
7
+ input_wrapping do
8
8
  [ label_html,
9
9
  check_box_html
10
10
  ].join("\n").html_safe
11
11
  end
12
12
  end
13
13
 
14
- def check_box_html
15
- template.check_box_tag("#{object_name}[#{method}]", checked_value, checked?, input_html_options)
16
- end
17
-
18
14
  def search_method
19
- method.to_s.match(metasearch_conditions) ? method : "#{method}_eq"
15
+ method.to_s.match(search_conditions) ? method : "#{method}_eq"
20
16
  end
21
17
 
22
18
  def checked?
23
- if defined? ActionView::Helpers::InstanceTag
24
- object && ActionView::Helpers::InstanceTag.check_box_checked?(object.send(search_method), checked_value)
25
- else
26
- object && boolean_checked?(object.send(search_method), checked_value)
27
- end
19
+ object && boolean_checked?(object.send(search_method), checked_value)
28
20
  end
29
21
 
30
22
  def input_html_options
31
- { :name => "q[#{search_method}]" }
23
+ { :name => "q[#{ search_method }]" }
32
24
  end
33
25
 
34
- def metasearch_conditions
35
- /(is_true|is_false|is_present|is_blank|is_null|is_not_null)$/
26
+ def search_conditions
27
+ /(is_true|is_false|is_present|is_blank|is_null|is_not_null)\z/
36
28
  end
37
29
 
38
30
  end