activeadmin-rails 1.7.0

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 (584) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.github/workflows/ci.yaml +64 -0
  5. data/.github/workflows/daily.yaml +64 -0
  6. data/.github/workflows/pages.yml +72 -0
  7. data/.gitignore +23 -0
  8. data/.mdlrc +1 -0
  9. data/.rubocop.yml +84 -0
  10. data/.simplecov +13 -0
  11. data/.yardopts +7 -0
  12. data/CHANGELOG.md +514 -0
  13. data/CODE_OF_CONDUCT.md +22 -0
  14. data/CONTRIBUTING.md +190 -0
  15. data/Gemfile +51 -0
  16. data/LICENSE +20 -0
  17. data/README.md +84 -0
  18. data/Rakefile +56 -0
  19. data/activeadmin-rails.gemspec +39 -0
  20. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  21. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  22. data/app/assets/images/active_admin/orderable.png +0 -0
  23. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  24. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  25. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  26. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  27. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  28. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  29. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  30. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +59 -0
  31. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  32. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  33. data/app/assets/javascripts/active_admin/lib/has_many.es6 +89 -0
  34. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  35. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  36. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  37. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  38. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  39. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  40. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  41. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  42. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  43. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  44. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  45. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  46. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  47. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  48. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  49. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  50. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  51. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  52. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  53. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  54. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  55. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  56. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  57. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  58. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  59. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  60. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  61. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  72. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  73. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  74. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  75. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  76. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  77. data/app/views/active_admin/_head.html.erb +14 -0
  78. data/app/views/active_admin/base/_action_items.html.arb +7 -0
  79. data/app/views/active_admin/base/_breadcrumbs.html.arb +8 -0
  80. data/app/views/active_admin/base/_footer.html.arb +11 -0
  81. data/app/views/active_admin/base/_header.html.arb +5 -0
  82. data/app/views/active_admin/base/_sidebar.html.arb +3 -0
  83. data/app/views/active_admin/base/_title_bar.html.arb +9 -0
  84. data/app/views/active_admin/base/_unsupported_browser.html.erb +5 -0
  85. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  86. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  87. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  88. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  89. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  90. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  91. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  92. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  93. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  94. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  95. data/app/views/active_admin/page/_content.html.arb +1 -0
  96. data/app/views/active_admin/page/index.html.arb +8 -0
  97. data/app/views/active_admin/resource/_filters_form.html.erb +1 -0
  98. data/app/views/active_admin/resource/_form.html.arb +11 -0
  99. data/app/views/active_admin/resource/_index_as_table.html.arb +8 -0
  100. data/app/views/active_admin/resource/_show.html.arb +1 -0
  101. data/app/views/active_admin/resource/edit.html.arb +13 -0
  102. data/app/views/active_admin/resource/index.html.arb +101 -0
  103. data/app/views/active_admin/resource/new.html.arb +13 -0
  104. data/app/views/active_admin/resource/show.html.arb +22 -0
  105. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  106. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  107. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  108. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  109. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  110. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  111. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  112. data/app/views/layouts/active_admin.html.erb +33 -0
  113. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  114. data/codecov.yml +25 -0
  115. data/config/i18n-tasks.yml +26 -0
  116. data/config/locales/ar.yml +133 -0
  117. data/config/locales/bg.yml +118 -0
  118. data/config/locales/bs.yml +119 -0
  119. data/config/locales/ca.yml +104 -0
  120. data/config/locales/cs.yml +107 -0
  121. data/config/locales/da.yml +135 -0
  122. data/config/locales/de-CH.yml +99 -0
  123. data/config/locales/de.yml +142 -0
  124. data/config/locales/el.yml +124 -0
  125. data/config/locales/en-CA.yml +137 -0
  126. data/config/locales/en-GB.yml +137 -0
  127. data/config/locales/en.yml +160 -0
  128. data/config/locales/eo.yml +143 -0
  129. data/config/locales/es-MX.yml +94 -0
  130. data/config/locales/es.yml +160 -0
  131. data/config/locales/fa.yml +117 -0
  132. data/config/locales/fi.yml +110 -0
  133. data/config/locales/fr.yml +139 -0
  134. data/config/locales/he.yml +140 -0
  135. data/config/locales/hr.yml +121 -0
  136. data/config/locales/hu.yml +96 -0
  137. data/config/locales/id.yml +133 -0
  138. data/config/locales/it.yml +142 -0
  139. data/config/locales/ja.yml +139 -0
  140. data/config/locales/ko.yml +118 -0
  141. data/config/locales/lt.yml +140 -0
  142. data/config/locales/lv.yml +90 -0
  143. data/config/locales/nb.yml +128 -0
  144. data/config/locales/nl.yml +142 -0
  145. data/config/locales/pl.yml +166 -0
  146. data/config/locales/pt-BR.yml +141 -0
  147. data/config/locales/pt-PT.yml +90 -0
  148. data/config/locales/ro.yml +94 -0
  149. data/config/locales/ru.yml +139 -0
  150. data/config/locales/sk.yml +107 -0
  151. data/config/locales/sv-SE.yml +133 -0
  152. data/config/locales/tr.yml +142 -0
  153. data/config/locales/uk.yml +134 -0
  154. data/config/locales/vi.yml +132 -0
  155. data/config/locales/zh-CN.yml +141 -0
  156. data/config/locales/zh-TW.yml +133 -0
  157. data/config/mdl_style.rb +9 -0
  158. data/cucumber.yml +6 -0
  159. data/docs/0-installation.md +121 -0
  160. data/docs/1-general-configuration.md +207 -0
  161. data/docs/10-custom-pages.md +148 -0
  162. data/docs/11-decorators.md +66 -0
  163. data/docs/12-arbo-components.md +200 -0
  164. data/docs/13-authorization-adapter.md +288 -0
  165. data/docs/14-gotchas.md +141 -0
  166. data/docs/2-resource-customization.md +480 -0
  167. data/docs/3-index-pages/custom-index.md +39 -0
  168. data/docs/3-index-pages/index-as-block.md +23 -0
  169. data/docs/3-index-pages/index-as-blog.md +73 -0
  170. data/docs/3-index-pages/index-as-grid.md +31 -0
  171. data/docs/3-index-pages/index-as-table.md +259 -0
  172. data/docs/3-index-pages.md +349 -0
  173. data/docs/4-csv-format.md +86 -0
  174. data/docs/5-forms.md +233 -0
  175. data/docs/6-show-pages.md +61 -0
  176. data/docs/7-sidebars.md +63 -0
  177. data/docs/8-custom-actions.md +160 -0
  178. data/docs/9-batch-actions.md +248 -0
  179. data/docs/CNAME +1 -0
  180. data/docs/Gemfile +7 -0
  181. data/docs/README.md +24 -0
  182. data/docs/_config.yml +15 -0
  183. data/docs/_includes/nav_footer_custom.html +3 -0
  184. data/docs/documentation.md +61 -0
  185. data/docs/images/activeadmin.png +0 -0
  186. data/docs/images/divider.png +0 -0
  187. data/docs/images/features.png +0 -0
  188. data/docs/index.css +835 -0
  189. data/docs/index.html +105 -0
  190. data/features/action_item.feature +73 -0
  191. data/features/authorization.feature +64 -0
  192. data/features/authorization_cancan.feature +52 -0
  193. data/features/authorization_pundit.feature +37 -0
  194. data/features/belongs_to.feature +124 -0
  195. data/features/breadcrumb.feature +76 -0
  196. data/features/comments/commenting.feature +178 -0
  197. data/features/comments/viewing_index.feature +18 -0
  198. data/features/create_another.feature +55 -0
  199. data/features/dashboard.feature +16 -0
  200. data/features/decorators.feature +43 -0
  201. data/features/development_reloading.feature +28 -0
  202. data/features/edit_page.feature +116 -0
  203. data/features/favicon.feature +20 -0
  204. data/features/filter_attributes.feature +46 -0
  205. data/features/first_boot.feature +16 -0
  206. data/features/footer.feature +29 -0
  207. data/features/global_navigation.feature +29 -0
  208. data/features/i18n.feature +55 -0
  209. data/features/index/batch_actions.feature +218 -0
  210. data/features/index/filters.feature +251 -0
  211. data/features/index/format_as_csv.feature +273 -0
  212. data/features/index/formats.feature +88 -0
  213. data/features/index/index_as_block.feature +15 -0
  214. data/features/index/index_as_blog.feature +69 -0
  215. data/features/index/index_as_grid.feature +45 -0
  216. data/features/index/index_as_table.feature +291 -0
  217. data/features/index/index_blank_slate.feature +83 -0
  218. data/features/index/index_parameters.feature +75 -0
  219. data/features/index/index_scope_to.feature +56 -0
  220. data/features/index/index_scopes.feature +325 -0
  221. data/features/index/page_title.feature +41 -0
  222. data/features/index/pagination.feature +63 -0
  223. data/features/index/switch_index_view.feature +73 -0
  224. data/features/menu.feature +85 -0
  225. data/features/meta_tags.feature +21 -0
  226. data/features/new_page.feature +136 -0
  227. data/features/registering_assets.feature +34 -0
  228. data/features/registering_pages.feature +237 -0
  229. data/features/registering_resources.feature +33 -0
  230. data/features/renamed_resource.feature +29 -0
  231. data/features/root_to.feature +18 -0
  232. data/features/show/attributes_table_title.feature +54 -0
  233. data/features/show/columns.feature +40 -0
  234. data/features/show/default_content.feature +44 -0
  235. data/features/show/page_title.feature +58 -0
  236. data/features/show/tabs.feature +47 -0
  237. data/features/sidebar_sections.feature +210 -0
  238. data/features/site_title.feature +47 -0
  239. data/features/specifying_actions.feature +118 -0
  240. data/features/step_definitions/action_item_steps.rb +7 -0
  241. data/features/step_definitions/action_link_steps.rb +19 -0
  242. data/features/step_definitions/additional_web_steps.rb +81 -0
  243. data/features/step_definitions/asset_steps.rb +15 -0
  244. data/features/step_definitions/attribute_steps.rb +18 -0
  245. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  246. data/features/step_definitions/batch_action_steps.rb +78 -0
  247. data/features/step_definitions/blog_steps.rb +3 -0
  248. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  249. data/features/step_definitions/column_steps.rb +8 -0
  250. data/features/step_definitions/comment_steps.rb +32 -0
  251. data/features/step_definitions/configuration_steps.rb +102 -0
  252. data/features/step_definitions/dashboard_steps.rb +15 -0
  253. data/features/step_definitions/factory_steps.rb +35 -0
  254. data/features/step_definitions/filter_steps.rb +57 -0
  255. data/features/step_definitions/flash_steps.rb +11 -0
  256. data/features/step_definitions/footer_steps.rb +21 -0
  257. data/features/step_definitions/format_steps.rb +60 -0
  258. data/features/step_definitions/i18n_steps.rb +11 -0
  259. data/features/step_definitions/index_scope_steps.rb +42 -0
  260. data/features/step_definitions/index_views_steps.rb +3 -0
  261. data/features/step_definitions/layout_steps.rb +3 -0
  262. data/features/step_definitions/member_link_steps.rb +7 -0
  263. data/features/step_definitions/menu_steps.rb +11 -0
  264. data/features/step_definitions/meta_tag_steps.rb +3 -0
  265. data/features/step_definitions/pagination_steps.rb +15 -0
  266. data/features/step_definitions/root_steps.rb +9 -0
  267. data/features/step_definitions/sidebar_steps.rb +11 -0
  268. data/features/step_definitions/site_title_steps.rb +31 -0
  269. data/features/step_definitions/tab_steps.rb +17 -0
  270. data/features/step_definitions/table_steps.rb +116 -0
  271. data/features/step_definitions/user_steps.rb +52 -0
  272. data/features/step_definitions/web_steps.rb +86 -0
  273. data/features/sti_resource.feature +65 -0
  274. data/features/strong_parameters.feature +69 -0
  275. data/features/support/env.rb +129 -0
  276. data/features/support/paths.rb +75 -0
  277. data/features/support/regular_env.rb +7 -0
  278. data/features/support/reload_env.rb +7 -0
  279. data/features/support/selectors.rb +45 -0
  280. data/features/users/logging_in.feature +32 -0
  281. data/features/users/logging_out.feature +29 -0
  282. data/features/users/resetting_password.feature +30 -0
  283. data/gemfiles/rails_42.gemfile +12 -0
  284. data/gemfiles/rails_52.gemfile +15 -0
  285. data/gemfiles/rails_60.gemfile +16 -0
  286. data/gemfiles/rails_61.gemfile +15 -0
  287. data/gemfiles/rails_61_turbolinks.gemfile +15 -0
  288. data/gemfiles/rails_70.gemfile +15 -0
  289. data/gemfiles/rails_70_hotwire.gemfile +15 -0
  290. data/gemfiles/rails_71.gemfile +17 -0
  291. data/lib/active_admin/abstract_view_factory.rb +47 -0
  292. data/lib/active_admin/application.rb +255 -0
  293. data/lib/active_admin/application_settings.rb +42 -0
  294. data/lib/active_admin/asset_registration.rb +29 -0
  295. data/lib/active_admin/authorization_adapter.rb +129 -0
  296. data/lib/active_admin/base_controller/authorization.rb +126 -0
  297. data/lib/active_admin/base_controller/menu.rb +34 -0
  298. data/lib/active_admin/base_controller.rb +91 -0
  299. data/lib/active_admin/batch_actions/controller.rb +45 -0
  300. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  301. data/lib/active_admin/batch_actions/views/batch_action_form.rb +45 -0
  302. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  303. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  304. data/lib/active_admin/batch_actions.rb +16 -0
  305. data/lib/active_admin/callbacks.rb +88 -0
  306. data/lib/active_admin/cancan_adapter.rb +36 -0
  307. data/lib/active_admin/component.rb +5 -0
  308. data/lib/active_admin/controller_action.rb +12 -0
  309. data/lib/active_admin/csv_builder.rb +136 -0
  310. data/lib/active_admin/dependency.rb +96 -0
  311. data/lib/active_admin/deprecation.rb +10 -0
  312. data/lib/active_admin/devise.rb +80 -0
  313. data/lib/active_admin/dsl.rb +193 -0
  314. data/lib/active_admin/dynamic_setting.rb +38 -0
  315. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  316. data/lib/active_admin/engine.rb +22 -0
  317. data/lib/active_admin/error.rb +62 -0
  318. data/lib/active_admin/event.rb +24 -0
  319. data/lib/active_admin/filters/active.rb +29 -0
  320. data/lib/active_admin/filters/active_filter.rb +123 -0
  321. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  322. data/lib/active_admin/filters/dsl.rb +21 -0
  323. data/lib/active_admin/filters/forms.rb +85 -0
  324. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  325. data/lib/active_admin/filters/resource_extension.rb +153 -0
  326. data/lib/active_admin/filters.rb +11 -0
  327. data/lib/active_admin/form_builder.rb +182 -0
  328. data/lib/active_admin/generators/boilerplate.rb +45 -0
  329. data/lib/active_admin/helpers/collection.rb +19 -0
  330. data/lib/active_admin/helpers/i18n.rb +7 -0
  331. data/lib/active_admin/helpers/optional_display.rb +38 -0
  332. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  333. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  334. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  335. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  336. data/lib/active_admin/inputs/filters/base.rb +44 -0
  337. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  338. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  339. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  340. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  341. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  342. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  343. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  344. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  345. data/lib/active_admin/inputs.rb +21 -0
  346. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  347. data/lib/active_admin/localizers.rb +11 -0
  348. data/lib/active_admin/menu.rb +106 -0
  349. data/lib/active_admin/menu_collection.rb +55 -0
  350. data/lib/active_admin/menu_item.rb +79 -0
  351. data/lib/active_admin/namespace.rb +325 -0
  352. data/lib/active_admin/namespace_settings.rb +107 -0
  353. data/lib/active_admin/order_clause.rb +48 -0
  354. data/lib/active_admin/orm/active_record/comments/comment.rb +35 -0
  355. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  356. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  357. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  358. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  359. data/lib/active_admin/orm/active_record/comments.rb +99 -0
  360. data/lib/active_admin/orm/active_record.rb +5 -0
  361. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  362. data/lib/active_admin/orm/mongoid.rb +1 -0
  363. data/lib/active_admin/page.rb +114 -0
  364. data/lib/active_admin/page_controller.rb +29 -0
  365. data/lib/active_admin/page_dsl.rb +35 -0
  366. data/lib/active_admin/page_presenter.rb +32 -0
  367. data/lib/active_admin/pundit_adapter.rb +68 -0
  368. data/lib/active_admin/resource/action_items.rb +120 -0
  369. data/lib/active_admin/resource/attributes.rb +47 -0
  370. data/lib/active_admin/resource/belongs_to.rb +48 -0
  371. data/lib/active_admin/resource/controllers.rb +19 -0
  372. data/lib/active_admin/resource/includes.rb +12 -0
  373. data/lib/active_admin/resource/menu.rb +65 -0
  374. data/lib/active_admin/resource/naming.rb +62 -0
  375. data/lib/active_admin/resource/ordering.rb +11 -0
  376. data/lib/active_admin/resource/page_presenters.rb +90 -0
  377. data/lib/active_admin/resource/pagination.rb +23 -0
  378. data/lib/active_admin/resource/routes.rb +134 -0
  379. data/lib/active_admin/resource/scope_to.rb +74 -0
  380. data/lib/active_admin/resource/scopes.rb +52 -0
  381. data/lib/active_admin/resource/sidebars.rb +32 -0
  382. data/lib/active_admin/resource.rb +215 -0
  383. data/lib/active_admin/resource_collection.rb +72 -0
  384. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  385. data/lib/active_admin/resource_controller/data_access.rb +341 -0
  386. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  387. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  388. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  389. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  390. data/lib/active_admin/resource_controller/streaming.rb +47 -0
  391. data/lib/active_admin/resource_controller.rb +116 -0
  392. data/lib/active_admin/resource_dsl.rb +221 -0
  393. data/lib/active_admin/router.rb +113 -0
  394. data/lib/active_admin/scope.rb +60 -0
  395. data/lib/active_admin/settings_node.rb +19 -0
  396. data/lib/active_admin/sidebar_section.rb +37 -0
  397. data/lib/active_admin/version.rb +3 -0
  398. data/lib/active_admin/view_factory.rb +10 -0
  399. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  400. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  401. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +52 -0
  402. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  403. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  404. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  405. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  406. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  407. data/lib/active_admin/view_helpers/layout_helper.rb +32 -0
  408. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  409. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  410. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  411. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  412. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  413. data/lib/active_admin/view_helpers.rb +21 -0
  414. data/lib/active_admin/views/components/action_link.rb +13 -0
  415. data/lib/active_admin/views/components/active_admin_form.rb +163 -0
  416. data/lib/active_admin/views/components/attributes_panel.rb +23 -0
  417. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  418. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  419. data/lib/active_admin/views/components/columns.rb +161 -0
  420. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  421. data/lib/active_admin/views/components/index_list.rb +69 -0
  422. data/lib/active_admin/views/components/menu.rb +32 -0
  423. data/lib/active_admin/views/components/menu_item.rb +58 -0
  424. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  425. data/lib/active_admin/views/components/panel.rb +38 -0
  426. data/lib/active_admin/views/components/scopes.rb +72 -0
  427. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  428. data/lib/active_admin/views/components/site_title.rb +28 -0
  429. data/lib/active_admin/views/components/status_tag.rb +88 -0
  430. data/lib/active_admin/views/components/table_for.rb +209 -0
  431. data/lib/active_admin/views/components/tabs.rb +40 -0
  432. data/lib/active_admin/views/index_as_block.rb +36 -0
  433. data/lib/active_admin/views/index_as_blog.rb +155 -0
  434. data/lib/active_admin/views/index_as_grid.rb +80 -0
  435. data/lib/active_admin/views/index_as_table.rb +377 -0
  436. data/lib/active_admin/views.rb +8 -0
  437. data/lib/active_admin.rb +132 -0
  438. data/lib/activeadmin-rails.rb +1 -0
  439. data/lib/bug_report_templates/active_admin_main.rb +110 -0
  440. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  442. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  443. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  444. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  445. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +300 -0
  446. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  447. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  448. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -0
  449. data/lib/generators/active_admin/page/USAGE +8 -0
  450. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  451. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  452. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  453. data/lib/generators/active_admin/resource/templates/admin.rb.erb +6 -0
  454. data/lib/ransack_ext.rb +20 -0
  455. data/spec/bug_report_templates_spec.rb +28 -0
  456. data/spec/changelog_spec.rb +15 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  458. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  459. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  460. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  461. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  462. data/spec/javascripts/support/jasmine.yml +74 -0
  463. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  464. data/spec/rails_helper.rb +67 -0
  465. data/spec/requests/default_namespace_spec.rb +81 -0
  466. data/spec/requests/memory_spec.rb +25 -0
  467. data/spec/requests/pages/form_spec.rb +73 -0
  468. data/spec/requests/pages/index_spec.rb +96 -0
  469. data/spec/requests/pages/layout_spec.rb +59 -0
  470. data/spec/requests/pages/show_spec.rb +38 -0
  471. data/spec/requests/stylesheets_spec.rb +18 -0
  472. data/spec/spec_helper.rb +1 -0
  473. data/spec/support/active_admin_integration_spec_helper.rb +79 -0
  474. data/spec/support/active_admin_request_helpers.rb +39 -0
  475. data/spec/support/rails_template.rb +224 -0
  476. data/spec/support/rails_template_with_data.rb +328 -0
  477. data/spec/support/templates/admin/stores.rb +7 -0
  478. data/spec/support/templates/en.yml +8 -0
  479. data/spec/support/templates/manifest.js +3 -0
  480. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  481. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  482. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  483. data/spec/support/templates/policies/application_policy.rb +44 -0
  484. data/spec/support/templates/policies/category_policy.rb +7 -0
  485. data/spec/support/templates/policies/post_policy.rb +15 -0
  486. data/spec/support/templates/policies/store_policy.rb +11 -0
  487. data/spec/support/templates/policies/user_policy.rb +11 -0
  488. data/spec/support/templates/post_decorator.rb +24 -0
  489. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  490. data/spec/unit/action_builder_spec.rb +160 -0
  491. data/spec/unit/active_admin_spec.rb +11 -0
  492. data/spec/unit/application_spec.rb +180 -0
  493. data/spec/unit/asset_registration_spec.rb +52 -0
  494. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  495. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  496. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  497. data/spec/unit/auto_link_spec.rb +103 -0
  498. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  499. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  500. data/spec/unit/belongs_to_spec.rb +76 -0
  501. data/spec/unit/cancan_adapter_spec.rb +43 -0
  502. data/spec/unit/comments_spec.rb +204 -0
  503. data/spec/unit/component_spec.rb +18 -0
  504. data/spec/unit/config_shared_examples.rb +59 -0
  505. data/spec/unit/controller_filters_spec.rb +41 -0
  506. data/spec/unit/csv_builder_spec.rb +321 -0
  507. data/spec/unit/dependency_spec.rb +135 -0
  508. data/spec/unit/devise_spec.rb +110 -0
  509. data/spec/unit/dsl_spec.rb +120 -0
  510. data/spec/unit/dynamic_settings_spec.rb +28 -0
  511. data/spec/unit/filters/active_filter_spec.rb +222 -0
  512. data/spec/unit/filters/active_spec.rb +24 -0
  513. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  514. data/spec/unit/filters/resource_spec.rb +128 -0
  515. data/spec/unit/form_builder_spec.rb +1013 -0
  516. data/spec/unit/generators/install_spec.rb +31 -0
  517. data/spec/unit/helpers/collection_spec.rb +68 -0
  518. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  519. data/spec/unit/i18n_spec.rb +29 -0
  520. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  521. data/spec/unit/menu_collection_spec.rb +40 -0
  522. data/spec/unit/menu_item_spec.rb +82 -0
  523. data/spec/unit/menu_spec.rb +60 -0
  524. data/spec/unit/namespace/authorization_spec.rb +27 -0
  525. data/spec/unit/namespace/register_page_spec.rb +99 -0
  526. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  527. data/spec/unit/namespace_spec.rb +132 -0
  528. data/spec/unit/order_clause_spec.rb +81 -0
  529. data/spec/unit/page_controller_spec.rb +5 -0
  530. data/spec/unit/page_spec.rb +128 -0
  531. data/spec/unit/pretty_format_spec.rb +133 -0
  532. data/spec/unit/pundit_adapter_spec.rb +98 -0
  533. data/spec/unit/resource/action_items_spec.rb +83 -0
  534. data/spec/unit/resource/attributes_spec.rb +56 -0
  535. data/spec/unit/resource/includes_spec.rb +21 -0
  536. data/spec/unit/resource/menu_spec.rb +18 -0
  537. data/spec/unit/resource/naming_spec.rb +120 -0
  538. data/spec/unit/resource/ordering_spec.rb +35 -0
  539. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  540. data/spec/unit/resource/pagination_spec.rb +38 -0
  541. data/spec/unit/resource/routes_spec.rb +125 -0
  542. data/spec/unit/resource/scopes_spec.rb +50 -0
  543. data/spec/unit/resource/sidebars_spec.rb +43 -0
  544. data/spec/unit/resource_collection_spec.rb +175 -0
  545. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  546. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  547. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  548. data/spec/unit/resource_controller_spec.rb +290 -0
  549. data/spec/unit/resource_registration_spec.rb +61 -0
  550. data/spec/unit/resource_spec.rb +320 -0
  551. data/spec/unit/routing_spec.rb +211 -0
  552. data/spec/unit/scope_spec.rb +225 -0
  553. data/spec/unit/settings_node_spec.rb +26 -0
  554. data/spec/unit/view_factory_spec.rb +13 -0
  555. data/spec/unit/view_helpers/breadcrumbs_spec.rb +255 -0
  556. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  557. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  558. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  559. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  560. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  561. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  562. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  563. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  564. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  565. data/spec/unit/views/components/columns_spec.rb +187 -0
  566. data/spec/unit/views/components/index_list_spec.rb +49 -0
  567. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  568. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  569. data/spec/unit/views/components/menu_spec.rb +168 -0
  570. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  571. data/spec/unit/views/components/panel_spec.rb +58 -0
  572. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  573. data/spec/unit/views/components/site_title_spec.rb +82 -0
  574. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  575. data/spec/unit/views/components/table_for_spec.rb +441 -0
  576. data/spec/unit/views/components/tabs_spec.rb +99 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/tasks/docs.rake +64 -0
  579. data/tasks/lint.rake +21 -0
  580. data/tasks/local.rake +25 -0
  581. data/tasks/parallel_tests.rake +66 -0
  582. data/tasks/test.rake +24 -0
  583. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  584. metadata +1012 -0
@@ -0,0 +1,148 @@
1
+ ---
2
+ layout: default
3
+ nav_order: 10
4
+ title: Custom Pages
5
+ redirect_from: /docs/10-custom-pages.html
6
+ ---
7
+
8
+ # Custom Pages
9
+
10
+ If you have data you want on a standalone page that isn't tied to a resource,
11
+ custom pages provide you with a familiar syntax and feature set:
12
+
13
+ * a menu item
14
+ * sidebars
15
+ * action items
16
+ * page actions
17
+
18
+ ## Create a new Page
19
+
20
+ Creating a page is as simple as calling `register_page`:
21
+
22
+ ```ruby
23
+ # app/admin/calendar.rb
24
+ ActiveAdmin.register_page "Calendar" do
25
+ end
26
+ ```
27
+
28
+ and defining a partial:
29
+
30
+ ```ruby
31
+ # app/views/admin/calendar/_calendar.html.arb
32
+ table do
33
+ thead do
34
+ tr do
35
+ %w[Sunday Monday Tuesday Wednesday Thursday Friday Saturday].each &method(:th)
36
+ end
37
+ end
38
+ tbody do
39
+ # ...
40
+ end
41
+ end
42
+ ```
43
+
44
+ ## Customize the Menu
45
+
46
+ See the [Menu](2-resource-customization.md#customize-the-menu) documentation.
47
+
48
+ ## Customize the breadcrumbs
49
+
50
+ ```ruby
51
+ ActiveAdmin.register_page "Calendar" do
52
+ breadcrumb do
53
+ ['admin', 'calendar']
54
+ end
55
+ end
56
+ ```
57
+
58
+ ## Customize the Namespace
59
+
60
+ We use the `admin` namespace by default, but you can use anything:
61
+
62
+ ```ruby
63
+ # Available at /today/calendar
64
+ ActiveAdmin.register_page "Calendar", namespace: :today
65
+
66
+ # Available at /calendar
67
+ ActiveAdmin.register_page "Calendar", namespace: false
68
+ ```
69
+
70
+ ## Belongs To
71
+
72
+ To nest the page within another resource, you can use the `belongs_to` method:
73
+
74
+ ```ruby
75
+ ActiveAdmin.configure_resource Project
76
+ ActiveAdmin.register_page "Status" do
77
+ config.belongs_to :project
78
+ end
79
+ ```
80
+
81
+ See also the [Belongs To](2-resource-customization.md#belongs-to) documentation
82
+ and examples.
83
+
84
+ ## Add a Sidebar
85
+
86
+ See the [Sidebars](7-sidebars.md) documentation.
87
+
88
+ ## Add an Action Link
89
+
90
+ Just like other resources, you can add action links.
91
+
92
+ ```ruby
93
+ # app/views/admin/calendar/action_item.html.arb
94
+ div(class: :action_items) do
95
+ ...
96
+ action_link "View Site", "/"
97
+ end
98
+ ```
99
+
100
+ ## Add a Page Action
101
+
102
+ Page actions are custom controller actions (which mirror the resource DSL for
103
+ the same feature).
104
+
105
+ ```ruby
106
+ # admin/calendar.rb
107
+ # Defines the route `/admin/calendar/add_event` which can handle HTTP POST requests.
108
+ config.add_page_route :add_event, method: :post
109
+
110
+ # app/controllers/admin/calendar_controller
111
+ class Admin::CalendarController < ActiveAdmin::PageController
112
+ def add_event
113
+ # ...
114
+ redirect_to admin_calendar_path, notice: "Your event was added"
115
+ end
116
+ end
117
+
118
+ # app/views/admin/calendar/action_item.html.arb
119
+ div(class: :action_items) do
120
+ ...
121
+ action_link "Add Event", admin_calendar_add_event_path, method: :post
122
+ end
123
+ ```
124
+
125
+ Clicking on the action item will reload page and display the message "Your event
126
+ was added"
127
+
128
+ Page actions can handle multiple HTTP verbs.
129
+
130
+ ```ruby
131
+ config.add_page_route :add_event, method: [:get, :post] do
132
+ # ...
133
+ end
134
+ ```
135
+
136
+ See also the [Custom Actions](8-custom-actions.md#http-verbs) example.
137
+
138
+ ## Use custom column as id
139
+
140
+ You can use custom parameter instead of id
141
+
142
+ ```ruby
143
+ class Admin::User < ActiveAdmin::ResourceController
144
+ defaults finder: :find_by_name
145
+ end
146
+ ```
147
+
148
+ This defines the resource route as `/admin/users/john` if user name is john
@@ -0,0 +1,66 @@
1
+ ---
2
+ layout: default
3
+ nav_order: 11
4
+ title: Decorators
5
+ redirect_from: /docs/11-decorators.html
6
+ ---
7
+
8
+ # Decorators
9
+
10
+ Active Admin allows you to use the decorator pattern to provide view-specific
11
+ versions of a resource. [Draper](https://github.com/drapergem/draper) is
12
+ recommended but not required.
13
+
14
+ To use decorator support without Draper, your decorator must support a variety
15
+ of collection methods to support pagination, filtering, etc. See
16
+ [this github issue discussion](https://github.com/activeadmin/activeadmin/issues/3600)
17
+ and [this gem](https://github.com/kiote/activeadmin-poro-decorator) for more details.
18
+
19
+ ## Example usage
20
+
21
+ ```ruby
22
+ # app/models/post.rb
23
+ class Post < ActiveRecord::Base
24
+ # has title, content, and image_url
25
+ end
26
+
27
+ # app/decorators/post_decorator.rb
28
+ class PostDecorator < Draper::Decorator
29
+ delegate_all
30
+
31
+ def image
32
+ h.image_tag model.image_url
33
+ end
34
+ end
35
+
36
+ # app/admin/post.rb
37
+ ActiveAdmin.configure_resource Post do |config|
38
+ config.decorator_class_name = "PostDecorator"
39
+ end
40
+
41
+ # /app/views/admin/posts/_index_as_table.html.arb
42
+ index_table_for(collection, default_table_options) do |t|
43
+ column :title
44
+ column :image
45
+ actions
46
+ end
47
+ ```
48
+
49
+ ## Forms
50
+
51
+ By default, ActiveAdmin does *not* decorate the resource used to render forms.
52
+ If you need ActiveAdmin to decorate the forms, you can pass `decorate: true` to the
53
+ form page presenter.
54
+
55
+ ```ruby
56
+ ActiveAdmin.configure_resource Post do |config|
57
+ config.decorator_class_name = "PostDecorator"
58
+
59
+ config.set_page_options :form, decorate: true
60
+ end
61
+
62
+ # app/views/admin/posts/_form.html.arb
63
+ active_admin_form_for(resource) do |f|
64
+ # ...
65
+ end
66
+ ```
@@ -0,0 +1,200 @@
1
+ ---
2
+ layout: default
3
+ nav_order: 12
4
+ title: Arbo Components
5
+ redirect_from: /docs/12-arbo-components.html
6
+ ---
7
+
8
+ # Arbo Components
9
+
10
+ Arbo allows the creation of shareable and extendable HTML components and is
11
+ used throughout Active Admin to create view components.
12
+
13
+ ## Text Node
14
+
15
+ Sometimes it makes sense to insert something into a registered resource like a
16
+ non-breaking space or some text. The text_node method can be used to insert
17
+ these elements into the page inside of other Arbo components or resource
18
+ controller functions.
19
+
20
+ ```ruby
21
+ panel "Post Details" do
22
+ attributes_table_for post do
23
+ row :id
24
+ row 'Tags' do
25
+ post.tags.each do |tag|
26
+ a tag, href: admin_post_path(q: {tagged_with_contains: tag})
27
+ text_node "&nbsp;".html_safe
28
+ end
29
+ end
30
+ end
31
+ end
32
+ ```
33
+
34
+ ## Panels
35
+
36
+ A panel is a component that takes up all available horizontal space and takes a
37
+ title and a hash of attributes as arguments. If a sidebar is present, a panel
38
+ will take up the remaining space.
39
+
40
+ This will create two stacked panels:
41
+
42
+ ```ruby
43
+ panel "Post Details" do
44
+ render partial: "details", locals: {post: post}
45
+ end
46
+
47
+ panel "Post Tags" do
48
+ render partial: "tags", locals: {post: post}
49
+ end
50
+ ```
51
+
52
+ ## Columns
53
+
54
+ The Columns component allows you draw content into scalable columns. All you
55
+ need to do is define the number of columns and the component will take care of
56
+ the rest.
57
+
58
+ ### Simple Columns
59
+
60
+ To create simple columns, use the `columns` method. Within the block, call
61
+ the #column method to create a new column.
62
+
63
+ ```ruby
64
+ columns do
65
+ column do
66
+ span "Column #1"
67
+ end
68
+
69
+ column do
70
+ span "Column #2"
71
+ end
72
+ end
73
+ ```
74
+
75
+ ### Spanning Multiple Columns
76
+
77
+ To create columns that have multiple spans, pass the :span option to the column
78
+ method.
79
+
80
+ ```ruby
81
+ columns do
82
+ column span: 2 do
83
+ span "Column # 1"
84
+ end
85
+ column do
86
+ span "Column # 2"
87
+ end
88
+ end
89
+ ```
90
+
91
+ By default, each column spans 1 column. The above layout would have 2 columns,
92
+ the first being twice as large as the second.
93
+
94
+ ### Custom Column Widths
95
+
96
+ Active Admin uses a fluid width layout, causing column width to be defined
97
+ using percentages. Due to using this style of layout, columns can shrink or
98
+ expand past points that may not be desirable. To overcome this issue,
99
+ columns provide `:max_width` and `:min_width` options.
100
+
101
+ ```ruby
102
+ columns do
103
+ column max_width: "200px", min_width: "100px" do
104
+ span "Column # 1"
105
+ end
106
+ column do
107
+ span "Column # 2"
108
+ end
109
+ end
110
+ ```
111
+
112
+ In the above example, the first column will not grow larger than 200px and will
113
+ not shrink less than 100px.
114
+
115
+
116
+ ### Custom Column Class
117
+
118
+ Pass the `:class` option to the column method to set a custom class.
119
+
120
+ ```ruby
121
+ columns do
122
+ column class: "important" do
123
+ span "Column # 1"
124
+ end
125
+ column do
126
+ span "Column # 2"
127
+ end
128
+ end
129
+ ```
130
+
131
+
132
+ ## Table For
133
+
134
+ Table For provides the ability to create tables like those present
135
+ in `index_as_table`. It takes a collection and a hash of options and then
136
+ uses `column` to build the fields to show with the table.
137
+
138
+ ```ruby
139
+ table_for order.payments do
140
+ column(:payment_type) { |payment| payment.payment_type.titleize }
141
+ column "Received On", :created_at
142
+ column "Details & Notes", :payment_details
143
+ column "Amount", :amount_in_dollars
144
+ end
145
+ ```
146
+
147
+ The `column` method can take a title as its first argument and data
148
+ (`:your_method`) as its second (or first if no title provided). Column also
149
+ takes a block.
150
+
151
+ ### Internationalization
152
+
153
+ To customize the internationalization for the component, specify a resource to
154
+ use for translations via the `i18n` named parameter. This is only necessary for
155
+ non-`ActiveRecord::Relation` collections:
156
+
157
+ ```ruby
158
+ table_for payments, i18n: Payment do
159
+ # ...
160
+ end
161
+ ```
162
+
163
+ ## Status tag
164
+
165
+ Status tags provide convenient syntactic sugar for styling items that have
166
+ status. A common example of where the status tag could be useful is for orders
167
+ that are complete or in progress. `status_tag` takes a status, like
168
+ "In Progress", and a hash of options. The status_tag will generate HTML markup
169
+ that Active Admin CSS uses in styling.
170
+
171
+ ```ruby
172
+ status_tag 'In Progress'
173
+ # => <span class='status_tag in_progress'>In Progress</span>
174
+
175
+ status_tag 'active', class: 'important', id: 'status_123', label: 'on'
176
+ # => <span class='status_tag active important' id='status_123'>on</span>
177
+ ```
178
+
179
+ ## Tabs
180
+
181
+ The Tabs component is helpful for saving page real estate. The first tab will be
182
+ the one open when the page initially loads and the rest hidden. You can click
183
+ each tab to toggle back and forth between them. Arbo supports unlimited number
184
+ of tabs.
185
+
186
+ ```ruby
187
+ tabs do
188
+ tab :active do
189
+ table_for orders.active do
190
+ ...
191
+ end
192
+ end
193
+
194
+ tab :inactive do
195
+ table_for orders.inactive do
196
+ ...
197
+ end
198
+ end
199
+ end
200
+ ```
@@ -0,0 +1,288 @@
1
+ ---
2
+ layout: default
3
+ nav_order: 13
4
+ title: Authorization Adapter
5
+ redirect_from: /docs/13-authorization-adapter.html
6
+ ---
7
+
8
+ # Authorization Adapter
9
+
10
+ Active Admin offers the ability to define and use your own authorization
11
+ adapter. If implemented, the '#authorized?' will be called when an action is
12
+ taken. By default, '#authorized?' returns true.
13
+
14
+ ## Setting up your own AuthorizationAdapter
15
+
16
+ The following example shows how to set up and tie your authorization
17
+ adapter class to Active Admin:
18
+
19
+ ```ruby
20
+ # app/models/only_authors_authorization.rb
21
+ class OnlyAuthorsAuthorization < ActiveAdmin::AuthorizationAdapter
22
+
23
+ def authorized?(action, subject = nil)
24
+ case subject
25
+ when normalized(Post)
26
+ # Only let the author update and delete posts
27
+ if action == :update || action == :destroy
28
+ subject.author == user
29
+ else
30
+ true
31
+ end
32
+ else
33
+ true
34
+ end
35
+ end
36
+
37
+ end
38
+ ```
39
+
40
+ In order to hook up `OnlyAuthorsAuthorization` to Active Admin, go to your
41
+ application's `config/initializers/active_admin.rb` and add/modify the line:
42
+
43
+ ```ruby
44
+ config.authorization_adapter = "OnlyAuthorsAuthorization"
45
+ ```
46
+
47
+ Now, whenever a controller action is performed, the `OnlyAuthorsAuthorization`'s
48
+ `#authorized?` method will be called.
49
+
50
+ Authorization adapters can be configured per ActiveAdmin namespace as well, for
51
+ example:
52
+
53
+ ```ruby
54
+ ActiveAdmin.setup do |config|
55
+ config.namespace :admin do |ns|
56
+ ns.authorization_adapter = "AdminAuthorization"
57
+ end
58
+ config.namespace :my do |ns|
59
+ ns.authorization_adapter = "DashboardAuthorization"
60
+ end
61
+ end
62
+ ```
63
+
64
+ ## Getting Access to the Current User
65
+
66
+ From within your authorization adapter, you can call the `#user` method to
67
+ retrieve the current user.
68
+
69
+ ```ruby
70
+ class OnlyAdmins < ActiveAdmin::AuthorizationAdapter
71
+
72
+ def authorized?(action, subject = nil)
73
+ user.admin?
74
+ end
75
+
76
+ end
77
+ ```
78
+
79
+ ## Scoping Collections in Authorization Adapters
80
+
81
+ `ActiveAdmin::AuthorizationAdapter` also provides a hook method
82
+ (`#scope_collection`) for the adapter to scope the resource's collection. For
83
+ example, you may want to centralize the scoping:
84
+
85
+ ```ruby
86
+ class OnlyMyAccount < ActiveAdmin::AuthorizationAdapter
87
+
88
+ def authorized?(action, subject = nil)
89
+ subject.account == user.account
90
+ end
91
+
92
+ def scope_collection(collection, action = Auth::READ)
93
+ collection.where(account_id: user.account_id)
94
+ end
95
+
96
+ end
97
+ ```
98
+
99
+ All collections presented on Index Screens will be passed through this method
100
+ and will be scoped accordingly.
101
+
102
+ ## Managing Access to Pages
103
+
104
+ Pages, just like resources, get authorized too. When authorizing a page, the
105
+ subject will be an instance of `ActiveAdmin::Page`.
106
+
107
+ ```ruby
108
+ class OnlyDashboard < ActiveAdmin::AuthorizationAdapter
109
+ def authorized?(action, subject = nil)
110
+ case subject
111
+ when ActiveAdmin::Page
112
+ action == :read &&
113
+ subject.name == "Dashboard" &&
114
+ subject.namespace.name == :admin
115
+ else
116
+ false
117
+ end
118
+ end
119
+ end
120
+ ```
121
+
122
+ ## Action Types
123
+
124
+ By default Active Admin simplifies the controller actions into 4 actions:
125
+
126
+ * `:read` - This controls if the user can view the menu item as well as the
127
+ index and show screens.
128
+ * `:create` - This controls if the user can view the new screen and submit
129
+ the form to the create action.
130
+ * `:update` - This controls if the user can view the edit screen and submit
131
+ the form to the update action.
132
+ * `:destroy` - This controls if the user can delete a resource.
133
+
134
+ Each of these actions is available as a constant. Eg: `:read` is available as
135
+ `ActiveAdmin::Authorization::READ`.
136
+
137
+ ## Checking for Authorization in Controllers and Views
138
+
139
+ Active Admin provides a helper method to check if the current user is
140
+ authorized to perform an action on a subject.
141
+
142
+ Use the `#authorized?(action, subject)` method to check.
143
+
144
+ ```ruby
145
+ # /app/views/admin/posts/_index_as_table.html.arb
146
+ index_table_for(collection, default_table_options) do |t|
147
+ column :title
148
+ column '' do |post|
149
+ link_to 'Edit', admin_post_path(post) if authorized? :update, post
150
+ end
151
+ end
152
+ ```
153
+
154
+ If you are implementing a custom controller action, you can use the
155
+ `#authorize!` method to raise an `ActiveAdmin::AccessDenied` exception.
156
+
157
+ ```ruby
158
+ class Admin::Post < ActiveAdmin::ResourceController
159
+
160
+ def publish
161
+ post = Post.find(params[:id])
162
+
163
+ authorize! :publish, post
164
+ post.publish!
165
+
166
+ flash[:notice] = "Post has been published"
167
+ redirect_to [:admin, post]
168
+ end
169
+ end
170
+
171
+ # app/views/admin/posts/_action_item.html.arb
172
+ div(class: :action_items) do
173
+ if params[:action] == 'show'
174
+ if !post.published? && authorized?(:publish, post)
175
+ action_link :publish, publish_admin_post_path(post), method: :post
176
+ end
177
+ end
178
+
179
+ end
180
+ ```
181
+
182
+ ## Using the CanCan Adapter
183
+
184
+ Sub-classing `ActiveAdmin::AuthorizationAdapter` is fairly low level. Many times
185
+ it's nicer to have a simpler DSL for managing authorization. Active Admin
186
+ provides an adapter out of the box for [CanCan](https://github.com/ryanb/cancan)
187
+ and [CanCanCan](https://github.com/CanCanCommunity/cancancan).
188
+
189
+ To use the CanCan adapter, update the configuration in the Active Admin
190
+ initializer:
191
+
192
+ ```ruby
193
+ config.authorization_adapter = ActiveAdmin::CanCanAdapter
194
+ ```
195
+
196
+ You can also specify a method to be called on unauthorized access. This is
197
+ necessary in order to prevent a redirect loop that can happen if a user tries to
198
+ access a page they don't have permissions for (see
199
+ [#2081](https://github.com/activeadmin/activeadmin/issues/2081)).
200
+
201
+ ```ruby
202
+ config.on_unauthorized_access = :access_denied
203
+ ```
204
+
205
+ The method `access_denied` would be defined in `application_controller.rb`. Here
206
+ is one example that redirects the user from the page they don't have permission
207
+ to access to a resource they have permission to access (organizations in this
208
+ case), and also displays the error message in the browser:
209
+
210
+ ```ruby
211
+ class ApplicationController < ActionController::Base
212
+ protect_from_forgery
213
+
214
+ def access_denied(exception)
215
+ redirect_to admin_organizations_path, alert: exception.message
216
+ end
217
+ end
218
+ ```
219
+
220
+ By default this will use the ability class named "Ability". This can also be
221
+ changed from the initializer:
222
+
223
+ ```ruby
224
+ config.cancan_ability_class = "MyCustomAbility"
225
+ ```
226
+
227
+ Now you can simply use CanCan or CanCanCan the way that you would expect and
228
+ Active Admin will use it for authorization:
229
+
230
+ ```ruby
231
+ # app/models/ability.rb
232
+ class Ability
233
+ include CanCan::Ability
234
+
235
+ def initialize(user)
236
+ can :manage, Post
237
+ can :read, User
238
+ can :manage, User, id: user.id
239
+ can :read, ActiveAdmin::Page, name: "Dashboard", namespace_name: "admin"
240
+ end
241
+
242
+ end
243
+ ```
244
+
245
+ To view more details about the API's, visit project pages of
246
+ [CanCan](https://github.com/ryanb/cancan) and
247
+ [CanCanCan](https://github.com/CanCanCommunity/cancancan).
248
+
249
+ ## Using the Pundit Adapter
250
+
251
+ Active Admin also provides an adapter out of the box for
252
+ [Pundit](https://github.com/elabs/pundit).
253
+
254
+ To use the Pundit adapter, update the configuration in the Active Admin
255
+ initializer:
256
+
257
+ ```ruby
258
+ config.authorization_adapter = ActiveAdmin::PunditAdapter
259
+ ```
260
+
261
+ Once that's done, Active Admin will pick up your Pundit policies, and use
262
+ them for authorization. For more information about setting up Pundit, see
263
+ [their documention](https://github.com/elabs/pundit#installation).
264
+
265
+ Pundit also has [verify_authorized and/or verify_policy_scoped
266
+ methods](https://github.com/varvet/pundit#ensuring-policies-and-scopes-are-used)
267
+ to enforce usage of `authorized` and `policy_scope`. This conflicts with Active
268
+ Admin's authorization architecture, so if you're using those features, you'll
269
+ want to disable them for Active Admin's controllers:
270
+
271
+ ```ruby
272
+ class ApplicationController < ActionController::Base
273
+ include Pundit
274
+ after_action :verify_authorized, except: :index, unless: :active_admin_controller?
275
+ after_action :verify_policy_scoped, only: :index, unless: :active_admin_controller?
276
+
277
+ def active_admin_controller?
278
+ is_a?(ActiveAdmin::BaseController)
279
+ end
280
+ end
281
+ ```
282
+
283
+ If you want to use batch actions, ensure that `destroy_all?` method is defined
284
+ in your policy class. You can use this [template
285
+ policy](https://github.com/varyonic/activeadmin/blob/main/spec/support/templates/policies/application_policy.rb)
286
+ in your application instead of default one generated by Pundit's
287
+ `rails g pundit:install` command.
288
+