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
@@ -26,7 +26,7 @@ your resource.
26
26
  index do
27
27
  id_column
28
28
  column :image_title
29
- default_actions
29
+ actions
30
30
  end
31
31
 
32
32
  index as: :grid do |product|
@@ -35,12 +35,12 @@ end
35
35
  ```
36
36
 
37
37
  The first index component will be the default index page unless you indicate
38
- otherwise by setting :default to true.
38
+ otherwise by setting `:default` to true.
39
39
 
40
40
  ```ruby
41
41
  index do
42
42
  column :image_title
43
- default_actions
43
+ actions
44
44
  end
45
45
 
46
46
  index as: :grid, default: true do |product|
@@ -48,14 +48,16 @@ index as: :grid, default: true do |product|
48
48
  end
49
49
  ```
50
50
 
51
+ ## Custom Index
52
+
51
53
  Active Admin does not limit the index page to be a table, block, blog or grid.
52
- If you've [created your own index page](3-index-pages/create-an-index.md) it
53
- can be included by setting :as to the class of the index component you created.
54
+ If you've created your own [custom index](3-index-pages/custom-index.md) page it
55
+ can be included by setting `:as` to the class of the index component you created.
54
56
 
55
57
  ```ruby
56
- index as: ActiveAdmin::Views::IndexAsTable do
58
+ index as: ActiveAdmin::Views::IndexAsMyIdea do
57
59
  column :image_title
58
- default_actions
60
+ actions
59
61
  end
60
62
  ```
61
63
 
@@ -65,7 +67,7 @@ By default the index screen includes a "Filters" sidebar on the right hand side
65
67
  with a filter for each attribute of the registered model. You can customize the
66
68
  filters that are displayed as well as the type of widgets they use.
67
69
 
68
- To display a filter for an attribute, use the filter method
70
+ To display a filter for an attribute, use the `filter` method
69
71
 
70
72
  ```ruby
71
73
  ActiveAdmin.register Post do
@@ -84,13 +86,13 @@ Out of the box, Active Admin supports the following filter types:
84
86
  * *:check_boxes* - A list of check boxes users can turn on and off to filter
85
87
 
86
88
  By default, Active Admin will pick the most relevant filter based on the
87
- attribute type. You can force the type by passing the :as option.
89
+ attribute type. You can force the type by passing the `:as` option.
88
90
 
89
91
  ```ruby
90
92
  filter :author, as: :check_boxes
91
93
  ```
92
94
 
93
- The :check_boxes and :select types accept options for the collection. By default
95
+ The `:check_boxes` and `:select` types accept options for the collection. By default
94
96
  it attempts to create a collection based on an association. But you can pass in
95
97
  the collection as a proc to be called at render time.
96
98
 
@@ -106,6 +108,14 @@ filter :author, label: 'Something else'
106
108
 
107
109
  By default, Active Admin will try to use ActiveModel I18n to determine the label.
108
110
 
111
+ You can also filter on more than one attribute of a model using the
112
+ [Ransack search predicate syntax](https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching). If using a custom search method, you will
113
+ also need to specify the field type using `:as` and the label.
114
+
115
+ ```ruby
116
+ filter :first_name_or_last_name_cont, as: :string, label: "Name"
117
+ ```
118
+
109
119
  Filters can also be disabled for a resource, a namespace or the entire
110
120
  application.
111
121
 
@@ -142,18 +152,53 @@ preserve_default_filters!
142
152
  filter :author
143
153
  ```
144
154
 
155
+ ## Index Scopes
156
+
157
+ You can define custom scopes for your index page. This will add a tab bar above
158
+ the index table to quickly filter your collection on pre-defined scopes. There are
159
+ a number of ways to define your scopes:
160
+
161
+ ```ruby
162
+ scope :all, default: true
163
+
164
+ # assumes the model has a scope called ':active'
165
+ scope :active
166
+
167
+ # renames model scope ':leaves' to ':subcategories'
168
+ scope "Subcategories", :leaves
169
+
170
+ # Dynamic scope name
171
+ scope ->{ Date.today.strftime '%A' }, :published_today
172
+
173
+ # custom scope not defined on the model
174
+ scope("Inactive") { |scope| scope.where(active: false) }
175
+
176
+ # conditionally show a custom controller scope
177
+ scope "Published", if: proc { current_admin_user.can? :manage, Posts } do |posts|
178
+ posts.published
179
+ end
180
+ ```
181
+
145
182
  ## Index default sort order
146
183
 
147
184
  You can define the default sort order for index pages:
148
185
 
149
186
  ```ruby
150
187
  ActiveAdmin.register Post do
151
- config.sort_order = 'name asc'
188
+ config.sort_order = 'name_asc'
152
189
  end
153
190
  ```
154
191
 
155
192
  ## Index pagination
156
193
 
194
+ You can set the number of records per page as default:
195
+
196
+ ```ruby
197
+ ActiveAdmin.setup do |config|
198
+ config.default_per_page = 30
199
+ end
200
+ ```
201
+
157
202
  You can set the number of records per page per resources:
158
203
 
159
204
  ```ruby
@@ -162,6 +207,16 @@ ActiveAdmin.register Post do
162
207
  end
163
208
  ```
164
209
 
210
+ You can change it per request / action too:
211
+
212
+ ```ruby
213
+ controller do
214
+ before_filter :only => :index do
215
+ @per_page = 100
216
+ end
217
+ end
218
+ ```
219
+
165
220
  You can also disable pagination:
166
221
 
167
222
  ```ruby
@@ -170,7 +225,7 @@ ActiveAdmin.register Post do
170
225
  end
171
226
  ```
172
227
 
173
- If you have a very large database, you might want to disable SELECT COUNT(*)
228
+ If you have a very large database, you might want to disable `SELECT COUNT(*)`
174
229
  queries caused by the pagination info at the bottom of the page:
175
230
 
176
231
  ```ruby
@@ -204,3 +259,7 @@ ActiveAdmin.setup do |config|
204
259
 
205
260
  end
206
261
  ```
262
+
263
+ Note: you have to actually implement PDF rendering for your action, ActiveAdmin does not provide this feature. This setting just allows you to specify formats that you want to show up under the index collection.
264
+
265
+ You'll need to use a PDF rendering library like PDFKit or WickedPDF to get the PDF generation you want.
@@ -0,0 +1,31 @@
1
+ # Custom Index
2
+
3
+ If the supplied Active Admin index components are insufficient for your project
4
+ feel free to define your own. Index classes inherit from `ActiveAdmin::Component`
5
+ and require a `build` method and an `index_name` class method.
6
+
7
+ ```ruby
8
+ module ActiveAdmin
9
+ module Views
10
+ class IndexAsMyIdea < ActiveAdmin::Component
11
+
12
+ def build(page_presenter, collection)
13
+ # ...
14
+ end
15
+
16
+ def self.index_name
17
+ "my_idea"
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ ```
24
+
25
+ The build method takes a PagePresenter object and collection of whatever you
26
+ choose.
27
+
28
+ The `index_name` class method takes no arguments and returns a string that should
29
+ be representative of the the class name. If this method is not defined, your
30
+ index component will not be able take advantage of Active Admin's
31
+ *multiple index pages* feature.
@@ -72,7 +72,7 @@ index do
72
72
  selectable_column
73
73
  column :title
74
74
  actions do |post|
75
- link_to "Preview", admin_preview_post_path(post), class: "member_link"
75
+ item "Preview", admin_preview_post_path(post), class: "member_link"
76
76
  end
77
77
  end
78
78
  ```
@@ -83,7 +83,30 @@ Or forego the default links entirely:
83
83
  index do
84
84
  column :title
85
85
  actions defaults: false do |post|
86
- link_to "View", admin_post_path(post)
86
+ item "View", admin_post_path(post)
87
+ end
88
+ end
89
+ ```
90
+
91
+ Or append custom action with custom html via arbre:
92
+
93
+ ```ruby
94
+ index do
95
+ column :title
96
+ actions do |post|
97
+ a link_to "View", admin_post_path(post)
98
+ end
99
+ end
100
+ ```
101
+
102
+ In case you prefer to list actions links in a dropdown menu:
103
+
104
+ ```ruby
105
+ index do
106
+ selectable_column
107
+ column :title
108
+ actions dropdown: true do |post|
109
+ item "Preview", admin_preview_post_path(post)
87
110
  end
88
111
  end
89
112
  ```
@@ -116,6 +139,15 @@ index do
116
139
  end
117
140
  ```
118
141
 
142
+ It's also possible to sort by PostgreSQL's hstore column key. You should set `sortable`
143
+ option to a `column->'key'` value:
144
+
145
+ ```ruby
146
+ index do
147
+ column :keywords, sortable: "meta->'keywords'"
148
+ end
149
+ ```
150
+
119
151
  ## Associated Sorting
120
152
 
121
153
  You're normally able to sort columns alphabetically, but by default you
@@ -152,3 +184,14 @@ index do
152
184
  column :secret_data if can? :manage, Post
153
185
  end
154
186
  ```
187
+
188
+ ## Custom row class
189
+
190
+ In order to add special class to table rows pass the proc object as a `:row_class` option
191
+ of the `index` method.
192
+
193
+ ```ruby
194
+ index row_class: ->elem { 'active' if elem.active? } do
195
+ # columns
196
+ end
197
+ ```
data/docs/4-csv-format.md CHANGED
@@ -19,7 +19,7 @@ You can also set custom CSV settings for an individual resource:
19
19
 
20
20
  ```ruby
21
21
  ActiveAdmin.register Post do
22
- csv force_quotes: true, col_sep: ';' do
22
+ csv force_quotes: true, col_sep: ';', column_names: false do
23
23
  column :title
24
24
  column(:author) { |post| post.author.full_name }
25
25
  end
data/docs/5-forms.md CHANGED
@@ -1,4 +1,4 @@
1
- # Customizing the Form
1
+ # Forms
2
2
 
3
3
  Active Admin gives you complete control over the output of the form by creating
4
4
  a thin DSL on top of [Formtastic](https://github.com/justinfrench/formtastic):
@@ -7,23 +7,40 @@ a thin DSL on top of [Formtastic](https://github.com/justinfrench/formtastic):
7
7
  ActiveAdmin.register Post do
8
8
 
9
9
  form do |f|
10
- f.inputs 'Details' do
11
- f.input :title
12
- f.input :published_at, label: "Publish Post At"
13
- f.input :category
10
+ inputs 'Details' do
11
+ input :title
12
+ input :published_at, label: "Publish Post At"
13
+ li "Created at #{f.object.created_at}" unless f.object.new_record?
14
+ input :category
14
15
  end
15
- f.inputs 'Content', :body
16
- f.actions
16
+ panel 'Markup' do
17
+ "The following can be used in the content below..."
18
+ end
19
+ inputs 'Content', :body
20
+ para "Press cancel to return to the list without saving."
21
+ actions
17
22
  end
18
23
 
19
24
  end
20
25
  ```
21
26
 
22
- Please view [the documentation](http://github.com/justinfrench/formtastic)
23
- for Formtastic to see all the wonderful things you can do.
27
+ For more details, please see Formtastic's documentation.
24
28
 
25
- If you require a more custom form than can be provided through the DSL, you can
26
- user a partial instead:
29
+ ## Default
30
+
31
+ Resources come with a default form defined as such:
32
+
33
+ ```ruby
34
+ form do |f|
35
+ f.semantic_errors # shows errors on :base
36
+ f.inputs # builds an input field for every attribute
37
+ f.actions # adds the 'Submit' and 'Cancel' buttons
38
+ end
39
+ ```
40
+
41
+ ## Partials
42
+
43
+ If you want to split a custom form into a separate partial use:
27
44
 
28
45
  ```ruby
29
46
  ActiveAdmin.register Post do
@@ -33,20 +50,19 @@ end
33
50
 
34
51
  Which looks for something like this:
35
52
 
36
- ```erb
37
- <%# app/views/admin/posts/_form.html.erb %>
38
- <%= semantic_form_for [:admin, @post] do |f| %>
39
- <%= f.inputs :title, :body %>
40
- <%= f.actions do %>
41
- <%= f.action :submit %>
42
- <li class="cancel"><%= link_to 'Cancel', collection_path %></li>
43
- <% end %>
44
- <% end %>
53
+ ```ruby
54
+ # app/views/admin/posts/_form.html.arb
55
+ active_admin_form_for resource do |f|
56
+ inputs :title, :body
57
+ actions
58
+ end
45
59
  ```
46
60
 
61
+ This is a regular Rails partial so any template engine may be used.
62
+
47
63
  ## Nested Resources
48
64
 
49
- You can create forms with nested models using the `has_many` method:
65
+ You can create forms with nested models using the `has_many` method, even if your model uses `has_one`:
50
66
 
51
67
  ```ruby
52
68
  ActiveAdmin.register Post do
@@ -62,6 +78,11 @@ ActiveAdmin.register Post do
62
78
  a.input :title
63
79
  end
64
80
  end
81
+ f.inputs do
82
+ f.has_many :taggings, sortable: :position, sortable_start: 1 do |t|
83
+ t.input :tag
84
+ end
85
+ end
65
86
  f.inputs do
66
87
  f.has_many :comment, new_record: 'Leave Comment' do |b|
67
88
  b.input :body
@@ -82,16 +103,20 @@ The `:heading` option adds a custom heading. You can hide it entirely by passing
82
103
  The `:new_record` option controls the visibility of the new record button (shown by default).
83
104
  If you pass a string, it will be used as the text for the new record button.
84
105
 
85
- ## DatePicker
106
+ The `:sortable` option adds a hidden field and will enable drag & drop sorting of the children. It
107
+ expects the name of the column that will store the index of each child.
108
+
109
+ The `:sortable_start` option sets the value (0 by default) of the first position in the list.
110
+
111
+ ## Datepicker
86
112
 
87
- ActiveAdmin offers the `datepicker` input, which uses the [jQueryUI Datepicker](http://jqueryui.com/datepicker/).
88
- The datepicker input accepts any of the options available to the standard
89
- jQueryUI Datepicker, e.g.
113
+ ActiveAdmin offers the `datepicker` input, which uses the [jQuery UI datepicker](http://jqueryui.com/datepicker/).
114
+ The datepicker input accepts any of the options available to the standard jQueryUI Datepicker. For example:
90
115
 
91
116
  ```ruby
92
117
  form do |f|
93
- f.input :starts_at, as: :datepicker, datepicker_options: { min_date: "2013-10-8", max_date: 3.days.from_now.to_date }
94
- f.input :ends_at, as: :datepicker, datepicker_options: { min_date: 3.days.ago.to_date, max_date: "+1W +5D" }
118
+ f.input :starts_at, as: :datepicker, datepicker_options: { min_date: "2013-10-8", max_date: "+3D" }
119
+ f.input :ends_at, as: :datepicker, datepicker_options: { min_date: 3.days.ago.to_date, max_date: "+1W +5D" }
95
120
  end
96
121
  ```
97
122
 
@@ -102,9 +127,33 @@ To display a list of all validation errors:
102
127
  ```ruby
103
128
  form do |f|
104
129
  f.semantic_errors *f.object.errors.keys
105
- f.inputs
106
- f.actions
130
+ # ...
107
131
  end
108
132
  ```
109
133
 
110
134
  This is particularly useful to display errors on virtual or hidden attributes.
135
+
136
+ # Tabs
137
+
138
+ You can arrage content in tabs as shown below:
139
+
140
+ ```ruby
141
+ form do |f|
142
+ tabs do
143
+ tab 'Basic' do
144
+ f.inputs 'Basic Details' do
145
+ f.input :email
146
+ f.input :password
147
+ f.input :password_confirmation
148
+ end
149
+ end
150
+
151
+ tab 'Advanced' do
152
+ f.inputs 'Advanced Details' do
153
+ f.input :role
154
+ end
155
+ end
156
+ end
157
+ f.actions
158
+ end
159
+ ```
data/docs/6-show-pages.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Customize the Show Page
2
2
 
3
- The show block is rendered within the context of the view and uses [Arbre](https://github.com/gregbell/arbre) syntax.
3
+ The show block is rendered within the context of the view and uses [Arbre](https://github.com/activeadmin/arbre) syntax.
4
4
 
5
5
  With the `show` block, you can render anything you want.
6
6
 
@@ -33,7 +33,7 @@ ActiveAdmin.register Ad do
33
33
  show do
34
34
  attributes_table do
35
35
  row :title
36
- row :image do
36
+ row :image do |ad|
37
37
  image_tag ad.image.url
38
38
  end
39
39
  end
@@ -70,8 +70,36 @@ ActiveAdmin.register Book do
70
70
  row :title
71
71
  row :author
72
72
  row :publisher
73
- row('Published?') { |b| status_tag b.published? ? 'Yes' : 'No' }
73
+ row('Published?') { |b| status_tag b.published? }
74
74
  end
75
75
  end
76
76
  end
77
77
  ```
78
+
79
+ # Tabs
80
+
81
+ You can arrage content in tabs as shown below:
82
+
83
+ ```ruby
84
+ ActiveAdmin.register Order do
85
+ show do
86
+ tabs do
87
+ tab 'Overview' do
88
+ attributes_table do
89
+ row(:status) { status_tag(order.status) }
90
+ row(:paid) { number_to_currency(order.amount_paid_in_dollars) }
91
+ end
92
+ end
93
+
94
+ tab 'Payments' do
95
+ table_for order.payments do
96
+ column('Payment Type') { |p| p.payment_type.titleize }
97
+ column('Received On', :created_at)
98
+ column('Payment Details & Notes', :notes)
99
+ column('Amount') { |p| number_to_currency(p.amount_in_dollars) }
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ ```