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
@@ -4,20 +4,27 @@ module ActiveAdmin
4
4
 
5
5
  # Returns an array of links to use in a breadcrumb
6
6
  def breadcrumb_links(path = request.path)
7
- parts = path[1..-1].split('/') # remove leading "/" and split up the URL
8
- parts.pop # remove last since it's used as the page title
7
+ # remove leading "/" and split up the URL
8
+ # and remove last since it's used as the page title
9
+ parts = path.split('/').select(&:present?)[0..-2]
9
10
 
10
11
  parts.each_with_index.map do |part, index|
11
12
  # 1. try using `display_name` if we can locate a DB object
12
13
  # 2. try using the model name translation
13
14
  # 3. default to calling `titlecase` on the URL fragment
14
15
  if part =~ /\A(\d+|[a-f0-9]{24})\z/ && parts[index-1]
15
- config = active_admin_config.belongs_to_config.try(:target) || active_admin_config
16
- name = display_name config.find_resource(part)
16
+ parent = active_admin_config.belongs_to_config.try :target
17
+ config = parent && parent.resource_name.route_key == parts[index-1] ? parent : active_admin_config
18
+ name = display_name config.find_resource part
17
19
  end
18
- name ||= I18n.t "activerecord.models.#{part.singularize}", :count => 1.1, :default => part.titlecase
20
+ name ||= I18n.t "activerecord.models.#{part.singularize}", count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT, default: part.titlecase
19
21
 
20
- link_to name, '/' + parts[0..index].join('/')
22
+ # Don't create a link if the resource's show action is disabled
23
+ if !config || config.defined_actions.include?(:show)
24
+ link_to name, '/' + parts[0..index].join('/')
25
+ else
26
+ name
27
+ end
21
28
  end
22
29
  end
23
30
 
@@ -2,45 +2,58 @@ module ActiveAdmin
2
2
  module ViewHelpers
3
3
  module DisplayHelper
4
4
 
5
+ DISPLAY_NAME_FALLBACK = ->{
6
+ name, klass = "", self.class
7
+ name << klass.model_name.human if klass.respond_to? :model_name
8
+ name << " ##{send(klass.primary_key)}" if klass.respond_to? :primary_key
9
+ name.present? ? name : to_s
10
+ }
11
+ def DISPLAY_NAME_FALLBACK.inspect
12
+ 'DISPLAY_NAME_FALLBACK'
13
+ end
14
+
5
15
  # Attempts to call any known display name methods on the resource.
6
16
  # See the setting in `application.rb` for the list of methods and their priority.
7
17
  def display_name(resource)
8
- resource.send display_name_method_for resource if resource
18
+ render_in_context resource, display_name_method_for(resource) if resource
9
19
  end
10
20
 
11
21
  # Looks up and caches the first available display name method.
22
+ # To prevent conflicts, we exclude any methods that happen to be associations.
23
+ # If no methods are available and we're about to use the Kernel's `to_s`, provide our own.
12
24
  def display_name_method_for(resource)
13
25
  @@display_name_methods_cache ||= {}
14
26
  @@display_name_methods_cache[resource.class] ||= begin
15
27
  methods = active_admin_application.display_name_methods - association_methods_for(resource)
16
- methods.detect{ |method| resource.respond_to? method }
28
+ method = methods.detect{ |method| resource.respond_to? method }
29
+
30
+ if method != :to_s || resource.method(method).source_location
31
+ method
32
+ else
33
+ DISPLAY_NAME_FALLBACK
34
+ end
17
35
  end
18
36
  end
19
37
 
20
- # To prevent conflicts, we exclude any methods that happen to be associations.
21
38
  def association_methods_for(resource)
22
39
  return [] unless resource.class.respond_to? :reflect_on_all_associations
23
40
  resource.class.reflect_on_all_associations.map(&:name)
24
41
  end
25
42
 
26
- # Return a pretty string for any object
27
- # Date Time are formatted via #localize with :format => :long
28
- # ActiveRecord and Mongoid objects are formatted via #auto_link
29
- # We attempt to #display_name of any other objects
43
+ # Attempts to create a human-readable string for any object
30
44
  def pretty_format(object)
31
45
  case object
32
- when String
33
- object
34
- when Arbre::Element
35
- object
46
+ when String, Numeric, Arbre::Element
47
+ object.to_s
36
48
  when Date, Time
37
- localize(object, :format => :long)
38
- when ->(obj){defined?(::ActiveRecord) && obj.is_a?(ActiveRecord::Base)}
39
- auto_link(object)
40
- when ->(obj){defined?(::Mongoid) && obj.class.included_modules.include?(Mongoid::Document)}
41
- auto_link(object)
49
+ localize object, format: :long
42
50
  else
43
- display_name(object)
51
+ if defined?(::ActiveRecord) && object.is_a?(ActiveRecord::Base) ||
52
+ defined?(::Mongoid) && object.class.include?(Mongoid::Document)
53
+ auto_link object
54
+ else
55
+ display_name object
56
+ end
44
57
  end
45
58
  end
46
59
 
@@ -2,6 +2,20 @@ module ActiveAdmin
2
2
  module ViewHelpers
3
3
  module DownloadFormatLinksHelper
4
4
 
5
+ def build_download_format_links(formats = self.class.formats)
6
+ params = request.query_parameters.except :format, :commit
7
+ div class: "download_links" do
8
+ span I18n.t('active_admin.download')
9
+ formats.each do |format|
10
+ a format.upcase, href: url_for(params: params, format: format)
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.included base
16
+ base.extend ClassMethods
17
+ end
18
+
5
19
  module ClassMethods
6
20
 
7
21
  # A ready only of formats to make available in index/paginated
@@ -14,36 +28,19 @@ module ActiveAdmin
14
28
  @formats.clone
15
29
  end
16
30
 
17
- # Adds a mime type extension to the list of available formats.
18
- # You must register the extension prior to adding it to the list
19
- # of avilable formats. This should be used by plugins that want
20
- # to add additional formats to the download format links.
21
- # @param [Symbol] extension the mime extension to add
31
+ # Adds a mime type to the list of available formats available for data
32
+ # export. You must register the extension prior to adding it here.
33
+ # @param [Symbol] format the mime type to add
22
34
  # @return [Array] A copy of the updated formats array.
23
- def add_format extension
24
- unless formats.include?(extension)
25
- if Mime::Type.lookup_by_extension(extension).nil?
26
- raise ArgumentError, "The mime extension you defined: #{extension} is not registered. Please register it via Mime::Type.register before adding it to the available formats."
27
- end
28
- @formats << extension
35
+ def add_format(format)
36
+ unless Mime::Type.lookup_by_extension format
37
+ raise ArgumentError, "Please register the #{format} mime type with `Mime::Type.register`"
29
38
  end
39
+ @formats << format unless formats.include? format
30
40
  formats
31
41
  end
32
42
  end
33
43
 
34
- # TODO: Refactor to new HTML DSL
35
- def build_download_format_links(formats = self.class.formats)
36
- params = request.query_parameters.except :format, :commit
37
- links = formats.map { |format| link_to format.to_s.upcase, params: params, format: format }
38
- div :class => "download_links" do
39
- text_node [I18n.t('active_admin.download'), links].flatten.join("&nbsp;").html_safe
40
- end
41
- end
42
-
43
- def self.included base
44
- base.extend ClassMethods
45
- end
46
44
  end
47
45
  end
48
46
  end
49
-
@@ -31,13 +31,13 @@ module ActiveAdmin
31
31
  when Symbol
32
32
  { k => v.to_s }
33
33
  when Hash
34
- fields_for_params(v, :namespace => k)
34
+ fields_for_params(v, namespace: k)
35
35
  when Array
36
36
  v.map do |v|
37
37
  { "#{k}[]" => v }
38
38
  end
39
39
  when nil
40
- { k => '' }
40
+ { k => '' }
41
41
  when TrueClass,FalseClass
42
42
  { k => v }
43
43
  else
@@ -3,9 +3,10 @@ module ActiveAdmin
3
3
  module FlashHelper
4
4
 
5
5
  # Returns all the flash keys to display in any Active Admin view.
6
- # This method removes the :timedout key that Devise uses by default
7
- def active_admin_flash_messages
8
- @active_admin_flash_messages ||= flash.to_hash.except(:timedout)
6
+ # This method removes the :timedout key that Devise uses by default.
7
+ # Note Rails >= 4.1 normalizes keys to strings automatically.
8
+ def flash_messages
9
+ @flash_messages ||= flash.to_hash.with_indifferent_access.except(*active_admin_application.flash_keys_to_except)
9
10
  end
10
11
 
11
12
  end
@@ -3,22 +3,18 @@ module ActiveAdmin
3
3
  module FormHelper
4
4
 
5
5
  def active_admin_form_for(resource, options = {}, &block)
6
- options = Marshal.load( Marshal.dump(options) )
7
- options[:builder] ||= ActiveAdmin::FormBuilder
8
-
9
- if ! options.fetch(:decorate, true)
10
- resource = resource.model
11
- end
12
-
13
- semantic_form_for resource, options, &block
6
+ Arbre::Context.new({}, self) do
7
+ active_admin_form_for resource, options, &block
8
+ end.content
14
9
  end
15
10
 
16
11
  def hidden_field_tags_for(params, options={})
17
12
  fields_for_params(params, options).map do |kv|
18
13
  k, v = kv.first
19
- hidden_field_tag k, v, :id => sanitize_to_id("hidden_active_admin_#{k}")
14
+ hidden_field_tag k, v, id: sanitize_to_id("hidden_active_admin_#{k}")
20
15
  end.join("\n").html_safe
21
16
  end
17
+
22
18
  end
23
19
  end
24
20
  end
@@ -25,7 +25,7 @@ module MethodOrProcHelper
25
25
  # or instance_exec a proc passing in the object as the first parameter. This
26
26
  # method wraps that pattern.
27
27
  #
28
- # Calling with a Symbol:
28
+ # Calling with a String or Symbol:
29
29
  #
30
30
  # call_method_or_proc_on(@my_obj, :size) same as @my_obj.size
31
31
  #
@@ -35,11 +35,11 @@ module MethodOrProcHelper
35
35
  # call_method_or_proc_on(@my_obj, proc)
36
36
  #
37
37
  # By default, the Proc will be instance_exec'd within self. If you would rather
38
- # not instance exec, but just call the Proc, then pass along `:exec => false` in
38
+ # not instance exec, but just call the Proc, then pass along `exec: false` in
39
39
  # the options hash.
40
40
  #
41
41
  # proc = Proc.new{|s| s.size }
42
- # call_method_or_proc_on(@my_obj, proc, :exec => false)
42
+ # call_method_or_proc_on(@my_obj, proc, exec: false)
43
43
  #
44
44
  # You can pass along any necessary arguments to the method / Proc as arguments. For
45
45
  # example:
@@ -47,13 +47,13 @@ module MethodOrProcHelper
47
47
  # call_method_or_proc_on(@my_obj, :find, 1) #=> @my_obj.find(1)
48
48
  #
49
49
  def call_method_or_proc_on(receiver, *args)
50
- options = { :exec => true }.merge(args.extract_options!)
50
+ options = { exec: true }.merge(args.extract_options!)
51
51
 
52
52
  symbol_or_proc = args.shift
53
53
 
54
54
  case symbol_or_proc
55
55
  when Symbol, String
56
- receiver.send(symbol_or_proc.to_sym, *args)
56
+ receiver.public_send symbol_or_proc.to_sym, *args
57
57
  when Proc
58
58
  if options[:exec]
59
59
  instance_exec(receiver, *args, &symbol_or_proc)
@@ -85,7 +85,7 @@ module MethodOrProcHelper
85
85
  when Proc
86
86
  context.instance_exec *args, &obj
87
87
  when Symbol
88
- context.send obj, *args
88
+ context.public_send obj, *args
89
89
  else
90
90
  obj
91
91
  end
@@ -5,8 +5,8 @@ module ActiveAdmin
5
5
 
6
6
  def build(action_items)
7
7
  action_items.each do |action_item|
8
- span :class => "action_item" do
9
- instance_eval(&action_item.block)
8
+ span class: "action_item" do
9
+ instance_exec(&action_item.block)
10
10
  end
11
11
  end
12
12
  end
@@ -8,7 +8,7 @@ module ActiveAdmin
8
8
 
9
9
 
10
10
  def build(*args, &block)
11
- @contents = ul :class => "popover_contents"
11
+ @contents = ul class: "popover_contents"
12
12
 
13
13
  options = args.extract_options!
14
14
 
@@ -0,0 +1,123 @@
1
+ module ActiveAdmin
2
+ module Views
3
+ class FormtasticProxy < ::Arbre::Rails::Forms::FormBuilderProxy
4
+ def split_string_on(string, match)
5
+ return "" unless string && match
6
+ part_1 = string.split(Regexp.new("#{match}\\z")).first
7
+ [part_1, match]
8
+ end
9
+
10
+ def opening_tag
11
+ @opening_tag || ""
12
+ end
13
+
14
+ def closing_tag
15
+ @closing_tag || ""
16
+ end
17
+
18
+ def to_s
19
+ opening_tag << children.to_s << closing_tag
20
+ end
21
+ end
22
+
23
+ class ActiveAdminForm < FormtasticProxy
24
+ builder_method :active_admin_form_for
25
+
26
+ def build(resource, options = {}, &block)
27
+ @resource = resource
28
+ options = options.deep_dup
29
+ options[:builder] ||= ActiveAdmin::FormBuilder
30
+ form_string = semantic_form_for(resource, options) do |f|
31
+ @form_builder = f
32
+ end
33
+
34
+ @opening_tag, @closing_tag = split_string_on(form_string, "</form>")
35
+ instance_eval(&block) if block_given?
36
+
37
+ # Rails 4 sets multipart automatically if a file field is present,
38
+ # but the form tag has already been rendered before the block eval.
39
+ if multipart? && @opening_tag !~ /multipart/
40
+ @opening_tag.sub!(/<form/, '<form enctype="multipart/form-data"')
41
+ end
42
+ end
43
+
44
+ def inputs(*args, &block)
45
+ if block_given? && block.arity == 0
46
+ wrapped_block = proc do
47
+ wrap_it = form_builder.already_in_an_inputs_block ? true : false
48
+ form_builder.already_in_an_inputs_block = true
49
+ form_builder.template.assign('has_many_block'=> true)
50
+ content = form_builder.template.capture do
51
+ block.call
52
+ end
53
+ form_builder.already_in_an_inputs_block = wrap_it
54
+ content
55
+ end
56
+ insert_tag(SemanticInputsProxy, form_builder, *args, &wrapped_block)
57
+ else
58
+ proxy_call_to_form(:inputs, *args, &block)
59
+ end
60
+ end
61
+
62
+ def input(*args)
63
+ proxy_call_to_form :input, *args
64
+ end
65
+
66
+ def actions(*args, &block)
67
+ block_given? ?
68
+ insert_tag(SemanticActionsProxy, form_builder, *args, &block) :
69
+ actions(*args) { commit_action_with_cancel_link }
70
+ end
71
+
72
+ def commit_action_with_cancel_link
73
+ action(:submit)
74
+ cancel_link
75
+ end
76
+
77
+ def has_many(*args, &block)
78
+ insert_tag(HasManyProxy, form_builder, *args, &block)
79
+ end
80
+
81
+ def multipart?
82
+ form_builder && form_builder.multipart?
83
+ end
84
+
85
+ def object
86
+ form_builder.object
87
+ end
88
+
89
+ def form_buffers
90
+ raise "'form_buffers' has been removed from ActiveAdmin::FormBuilder, please read https://github.com/activeadmin/activeadmin/blob/master/docs/5-forms.md for details."
91
+ end
92
+ end
93
+
94
+ class SemanticInputsProxy < FormtasticProxy
95
+ def build(form_builder, *args, &block)
96
+ options = args.extract_options!
97
+ legend = args.shift
98
+ legend_tag = legend ? "<legend><span>#{legend}</span></legend>" : ""
99
+ klasses = ["inputs"]
100
+ klasses << options[:class] if options[:class]
101
+ @opening_tag = "<fieldset class=\"#{klasses.join(" ")}\">#{legend_tag}<ol>"
102
+ @closing_tag = "</ol></fieldset>"
103
+ super(*(args << options), &block)
104
+ end
105
+ end
106
+
107
+ class SemanticActionsProxy < FormtasticProxy
108
+ def build(form_builder, *args, &block)
109
+ @opening_tag = "<fieldset class=\"actions\"><ol>"
110
+ @closing_tag = "</ol></fieldset>"
111
+ super(*args, &block)
112
+ end
113
+ end
114
+
115
+ class HasManyProxy < FormtasticProxy
116
+ def build(form_builder, *args, &block)
117
+ assoc = args[0]
118
+ builder_options = args[1] || {}
119
+ text_node form_builder.has_many(*args, &block)
120
+ end
121
+ end
122
+ end
123
+ end
@@ -4,8 +4,8 @@ module ActiveAdmin
4
4
  class AttributesTable < ActiveAdmin::Component
5
5
  builder_method :attributes_table_for
6
6
 
7
- def build(record_or_collection, *attrs)
8
- @collection = Array(record_or_collection)
7
+ def build(obj, *attrs)
8
+ @collection = is_array?(obj) ? obj : [obj]
9
9
  @resource_class = @collection.first.class
10
10
  options = { }
11
11
  options[:for] = @collection.first if single_record?
@@ -59,44 +59,53 @@ module ActiveAdmin
59
59
  col # column for row headers
60
60
  @collection.each do |record|
61
61
  classes = Arbre::HTML::ClassList.new
62
- classes << cycle(:even, :odd, :name => self.class.to_s)
62
+ classes << cycle(:even, :odd, name: self.class.to_s)
63
63
  classes << dom_class_name_for(record)
64
- col(:id => dom_id_for(record), :class => classes)
64
+ col(id: dom_id_for(record), class: classes)
65
65
  end
66
66
  end
67
67
  end
68
68
 
69
69
  def header_content_for(attr)
70
70
  if @resource_class.respond_to?(:human_attribute_name)
71
- @resource_class.human_attribute_name(attr, :default => attr.to_s.titleize)
71
+ @resource_class.human_attribute_name(attr, default: attr.to_s.titleize)
72
72
  else
73
73
  attr.to_s.titleize
74
74
  end
75
75
  end
76
76
 
77
77
  def empty_value
78
- span I18n.t('active_admin.empty'), :class => "empty"
78
+ span I18n.t('active_admin.empty'), class: "empty"
79
79
  end
80
80
 
81
81
  def content_for(record, attr)
82
- previous = current_arbre_element.to_s
83
- value = pretty_format find_attr_value(record, attr)
84
- value.blank? && previous == current_arbre_element.to_s ? empty_value : value
82
+ value = pretty_format find_attr_value(record, attr)
83
+ value.blank? && current_arbre_element.children.to_s.empty? ? empty_value : value
85
84
  end
86
85
 
87
86
  def find_attr_value(record, attr)
88
87
  if attr.is_a?(Proc)
89
88
  attr.call(record)
90
- elsif attr.to_s[/\A(.+)_id\z/] && record.respond_to?($1.to_sym)
91
- record.send($1.to_sym)
92
- else
93
- record.send(attr.to_sym)
89
+ elsif attr =~ /\A(.+)_id\z/ && reflection_for(record.class, $1.to_sym)
90
+ record.public_send $1
91
+ elsif record.respond_to? attr
92
+ record.public_send attr
93
+ elsif record.respond_to? :[]
94
+ record[attr]
94
95
  end
95
96
  end
96
97
 
98
+ def reflection_for(klass, method)
99
+ klass.reflect_on_association method if klass.respond_to? :reflect_on_association
100
+ end
101
+
97
102
  def single_record?
98
103
  @single_record ||= @collection.size == 1
99
104
  end
105
+
106
+ def is_array?(obj)
107
+ obj.respond_to?(:each) && obj.respond_to?(:first) && !obj.is_a?(Hash)
108
+ end
100
109
  end
101
110
 
102
111
  end