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,73 @@
1
+ ---
2
+ layout: default
3
+ parent: Customizing the Index Page
4
+ nav_order: 3
5
+ title: Index as a Blog
6
+ redirect_from: /docs/3-index-pages/index-as-blog.html
7
+ ---
8
+
9
+ # Index as Blog
10
+
11
+ Render your index page as a set of posts. The post has two main options:
12
+ title and body.
13
+
14
+ ```ruby
15
+ index as: :blog do
16
+ title :my_title # Calls #my_title on each resource
17
+ body :my_body # Calls #my_body on each resource
18
+ end
19
+ ```
20
+
21
+ ## Post Title
22
+
23
+ The title is the content that will be rendered within a link to the
24
+ resource. There are two main ways to set the content for the title
25
+
26
+ First, you can pass in a method to be called on your resource. For example:
27
+
28
+ ```ruby
29
+ index as: :blog do
30
+ title :a_method_to_call
31
+ end
32
+ ```
33
+
34
+ Second, you can pass a block to the tile option which will then be
35
+ used as the contents of the title. The resource being rendered
36
+ is passed in to the block. For Example:
37
+
38
+ ```ruby
39
+ index as: :blog do
40
+ title do |post|
41
+ span post.title, class: 'title'
42
+ span post.created_at, class: 'created_at'
43
+ end
44
+ end
45
+ ```
46
+
47
+ ## Post Body
48
+
49
+ The body is rendered underneath the title of each post. The same two
50
+ style of options work as the Post Title above.
51
+
52
+ Call a method on the resource as the body:
53
+
54
+ ```ruby
55
+ index as: :blog do
56
+ title :my_title
57
+ body :my_body
58
+ end
59
+ ```
60
+
61
+ Or, render a block as the body:
62
+
63
+ ```ruby
64
+ index as: :blog do
65
+ title :my_title
66
+ body do |post|
67
+ div truncate post.title
68
+ div class: 'meta' do
69
+ span "Post in #{post.categories.join(', ')}"
70
+ end
71
+ end
72
+ end
73
+ ```
@@ -0,0 +1,31 @@
1
+ ---
2
+ layout: default
3
+ parent: Customizing the Index Page
4
+ nav_order: 1
5
+ title: Index as a Grid
6
+ redirect_from: /docs/3-index-pages/index-as-grid.html
7
+ ---
8
+
9
+ # Index as a Grid
10
+
11
+ Sometimes you want to display the index screen for a set of resources as a grid
12
+ (possibly a grid of thumbnail images). To do so, use the :grid option for the
13
+ index block.
14
+
15
+ ```ruby
16
+ index as: :grid do |product|
17
+ link_to image_tag(product.image_path), admin_product_path(product)
18
+ end
19
+ ```
20
+
21
+ The block is rendered within a cell in the grid once for each resource in the
22
+ collection. The resource is passed into the block for you to use in the view.
23
+
24
+ You can customize the number of columns that are rendered using the columns
25
+ option:
26
+
27
+ ```ruby
28
+ index as: :grid, columns: 5 do |product|
29
+ link_to image_tag(product.image_path), admin_product_path(product)
30
+ end
31
+ ```
@@ -0,0 +1,259 @@
1
+ ---
2
+ layout: default
3
+ parent: Customizing the Index Page
4
+ nav_order: 0
5
+ title: Index as a Table
6
+ redirect_from: /docs/3-index-pages/index-as-table.html
7
+ ---
8
+
9
+ # Index as a Table
10
+
11
+ The index page is a table with each of the models content columns and links to
12
+ show, edit and delete the object.
13
+
14
+ By default ActiveAdmin renders :index using `/app/views/active_admin/resource/index.html.arb`,
15
+ which passes a paginated collection to `/app/views/active_admin/resource/_index_as_table.html.arb`:
16
+
17
+ ```ruby
18
+ index_table_for(collection, default_table_options) do |t|
19
+ selectable_column
20
+ id_column if resource_class.primary_key
21
+ active_admin_config.resource_columns.each do |attribute|
22
+ column attribute
23
+ end
24
+ actions
25
+ end
26
+ ```
27
+
28
+ There are many ways to customize what gets displayed.
29
+
30
+ ## Defining Columns
31
+
32
+ To display an attribute or a method on a resource, simply pass a symbol into the
33
+ column method:
34
+
35
+ ```ruby
36
+ # /app/views/admin/posts/_index_as_table.html.arb
37
+ index_table_for(collection, default_table_options) do |t|
38
+ selectable_column
39
+ column :title
40
+ end
41
+ ```
42
+
43
+ For association columns we make an educated guess on what to display by
44
+ calling the following methods in the following order:
45
+
46
+ ```ruby
47
+ :display_name, :full_name, :name, :username, :login, :title, :email, :to_s
48
+ ```
49
+
50
+ This can be customized in `config/initializers/active_admin.rb`.
51
+
52
+ If the default title does not work for you, pass it as the first argument:
53
+
54
+ ```ruby
55
+ # /app/views/admin/posts/_index_as_table.html.arb
56
+ index_table_for(collection, default_table_options) do |t|
57
+ selectable_column
58
+ column "My Custom Title", :title
59
+ end
60
+ ```
61
+
62
+ Sometimes that just isn't enough and you need to write some view-specific code.
63
+ For example, say we wanted a "Title" column that links to the posts admin screen.
64
+
65
+ `column` accepts a block that will be rendered for each of the objects in the collection.
66
+ The block is called once for each resource, which is passed as an argument to the block.
67
+
68
+ ```ruby
69
+ # /app/views/admin/posts/_index_as_table.html.arb
70
+ index_table_for(collection, default_table_options) do |t|
71
+ selectable_column
72
+ column "Title" do |post|
73
+ link_to post.title, admin_post_path(post)
74
+ end
75
+ end
76
+ ```
77
+
78
+ ## Defining Actions
79
+
80
+ To setup links to View, Edit and Delete a resource, use the `actions` method:
81
+
82
+ ```ruby
83
+ # /app/views/admin/posts/_index_as_table.html.arb
84
+ index_table_for(collection, default_table_options) do |t|
85
+ selectable_column
86
+ column :title
87
+ actions
88
+ end
89
+ ```
90
+
91
+ You can also append custom links to the default links:
92
+
93
+ ```ruby
94
+ # /app/views/admin/posts/_index_as_table.html.arb
95
+ index_table_for(collection, default_table_options) do |t|
96
+ selectable_column
97
+ column :title
98
+ actions do |post|
99
+ item "Preview", admin_preview_post_path(post), class: "member_link"
100
+ end
101
+ end
102
+ ```
103
+
104
+ Or forego the default links entirely:
105
+
106
+ ```ruby
107
+ # /app/views/admin/posts/_index_as_table.html.arb
108
+ index_table_for(collection, default_table_options) do |t|
109
+ column :title
110
+ actions defaults: false do |post|
111
+ item "View", admin_post_path(post)
112
+ end
113
+ end
114
+ ```
115
+
116
+ Or append custom action with custom html via arbre:
117
+
118
+ ```ruby
119
+ # /app/views/admin/posts/_index_as_table.html.arb
120
+ index_table_for(collection, default_table_options) do |t|
121
+ column :title
122
+ actions do |post|
123
+ a "View", href: admin_post_path(post)
124
+ end
125
+ end
126
+ ```
127
+
128
+ In case you prefer to list actions links in a dropdown menu:
129
+
130
+ ```ruby
131
+ # /app/views/admin/posts/_index_as_table.html.arb
132
+ index_table_for(collection, default_table_options) do |t|
133
+ selectable_column
134
+ column :title
135
+ actions dropdown: true do |post|
136
+ item "Preview", admin_preview_post_path(post)
137
+ end
138
+ end
139
+ ```
140
+
141
+ In addition, you can insert the position of the row in the greater collection by using the index_column special command:
142
+
143
+ ```ruby
144
+ # /app/views/admin/posts/_index_as_table.html.arb
145
+ index_table_for(collection, default_table_options) do |t|
146
+ selectable_column
147
+ index_column
148
+ column :title
149
+ end
150
+ ```
151
+
152
+ index_column take an optional offset parameter to allow a developer to set the starting number for the index (default is 1).
153
+
154
+ ## Sorting
155
+
156
+ When a column is generated from an Active Record attribute, the table is
157
+ sortable by default. If you are creating a custom column, you may need to give
158
+ Active Admin a hint for how to sort the table.
159
+
160
+ You can pass the key specifying the attribute which gets used to sort objects using Active Record.
161
+ By default, this is the column on the resource's table that the attribute corresponds to.
162
+ Otherwise, any attribute that the resource collection responds to can be used.
163
+
164
+ ```ruby
165
+ # /app/views/admin/posts/_index_as_table.html.arb
166
+ index_table_for(collection, default_table_options) do |t|
167
+ column :title, sortable: :title do |post|
168
+ link_to post.title, admin_post_path(post)
169
+ end
170
+ end
171
+ ```
172
+
173
+ You can turn off sorting on any column by passing false:
174
+
175
+ ```ruby
176
+ # /app/views/admin/posts/_index_as_table.html.arb
177
+ index_table_for(collection, default_table_options) do |t|
178
+ column :title, sortable: false
179
+ end
180
+ ```
181
+
182
+ It's also possible to sort by PostgreSQL's hstore column key. You should set `sortable`
183
+ option to a `column->'key'` value:
184
+
185
+ ```ruby
186
+ # /app/views/admin/posts/_index_as_table.html.arb
187
+ index_table_for(collection, default_table_options) do |t|
188
+ column :keywords, sortable: "meta->'keywords'"
189
+ end
190
+ ```
191
+
192
+ ## Custom sorting
193
+
194
+ It is also possible to use database specific expressions and options for sorting by column
195
+
196
+ ```ruby
197
+ # /app/views/admin/posts/_index_as_table.html.arb
198
+ order_by(:title) do |order_clause|
199
+ if order_clause.order == 'desc'
200
+ [order_clause.to_sql, 'NULLS LAST'].join(' ')
201
+ else
202
+ [order_clause.to_sql, 'NULLS FIRST'].join(' ')
203
+ end
204
+ end
205
+
206
+ index_table_for(collection, table_options) do |t|
207
+ column :title
208
+ end
209
+ ```
210
+
211
+ ## Associated Sorting
212
+
213
+ You're normally able to sort columns alphabetically, but by default you
214
+ can't sort by associated objects. Though with a few simple changes, you can.
215
+
216
+ Assuming you're on the Books index page, and Book has_one Publisher:
217
+
218
+ ```ruby
219
+ Admin::PostsController < ActiveAdmin::ResourceController
220
+ def apply_includes(collection)
221
+ collection.includes :publisher # prevents N+1 queries to your database
222
+ end
223
+ end
224
+ ```
225
+
226
+ Then it's simple to sort by any Publisher attribute from within the index table:
227
+
228
+ ```ruby
229
+ # /app/views/admin/posts/_index_as_table.html.arb
230
+ index_table_for(collection, default_table_options) do |t|
231
+ column :publisher, sortable: 'publishers.name'
232
+ end
233
+ ```
234
+
235
+ ## Showing and Hiding Columns
236
+
237
+ The entire index block is rendered within the context of the view, so you can
238
+ easily do things that show or hide columns based on the current context.
239
+
240
+ For example, if you were using CanCan:
241
+
242
+ ```ruby
243
+ # /app/views/admin/posts/_index_as_table.html.arb
244
+ index_table_for(collection, default_table_options) do |t|
245
+ column :title, sortable: false
246
+ column :secret_data if can? :manage, Post
247
+ end
248
+ ```
249
+
250
+ ## Custom row class
251
+
252
+ In order to add special class to table rows pass the proc object as a `:row_class` option
253
+ of the `index` method.
254
+
255
+ ```ruby
256
+ index row_class: ->elem { 'active' if elem.active? } do
257
+ # columns
258
+ end
259
+ ```
@@ -0,0 +1,349 @@
1
+ ---
2
+ layout: default
3
+ nav_order: 3
4
+ title: Customizing the Index Page
5
+ redirect_from: /docs/3-index-pages.html
6
+ has_children: true
7
+ ---
8
+
9
+ # Customizing the Index Page
10
+
11
+ Filtering and listing resources is one of the most important tasks for
12
+ administering a web application. Active Admin provides many different tools for
13
+ you to build a compelling interface into your data for the admin staff.
14
+
15
+ Built in, Active Admin has the following index renderers:
16
+
17
+ * *Table*: A table drawn with each row being a resource ([View Table Docs](3-index-pages/index-as-table.md))
18
+ * *Grid*: A set of rows and columns each cell being a resource ([View Grid Docs](3-index-pages/index-as-grid.md))
19
+ * *Blocks*: A set of rows (not tabular) each row being a resource ([View Blocks Docs](3-index-pages/index-as-block.md))
20
+ * *Blog*: A title and body content, similar to a blog index ([View Blog Docs](3-index-pages/index-as-blog.md))
21
+
22
+ All index pages also support scopes, filters, pagination, action items, and
23
+ sidebar sections.
24
+
25
+ ## Multiple Index Pages
26
+
27
+ Sometime you may want more than one index page for a resource to represent
28
+ different views to the user. If multiple index pages exist, Active Admin will
29
+ automatically build links at the top of the default index page. Including
30
+ multiple views is simple and requires creating multiple index components in
31
+ your resource.
32
+
33
+ ```ruby
34
+ index do
35
+ id_column
36
+ column :image_title
37
+ actions
38
+ end
39
+
40
+ index as: :grid do |product|
41
+ link_to image_tag(product.image_path), admin_product_path(product)
42
+ end
43
+ ```
44
+
45
+ The first index component will be the default index page unless you indicate
46
+ otherwise by setting `:default` to true.
47
+
48
+ ```ruby
49
+ index do
50
+ column :image_title
51
+ actions
52
+ end
53
+
54
+ index as: :grid, default: true do |product|
55
+ link_to image_tag(product.image_path), admin_product_path(product)
56
+ end
57
+ ```
58
+
59
+ ## Custom Index
60
+
61
+ Active Admin does not limit the index page to be a table, block, blog or grid.
62
+ If you've created your own [custom index](3-index-pages/custom-index.md) page it
63
+ can be included by setting `:as` to the class of the index component you created.
64
+
65
+ ```ruby
66
+ index as: ActiveAdmin::Views::IndexAsMyIdea do
67
+ column :image_title
68
+ actions
69
+ end
70
+ ```
71
+
72
+ ## Index Filters
73
+
74
+ By default the index screen includes a "Filters" sidebar on the right hand side
75
+ with a filter for each attribute of the registered model. You can customize the
76
+ filters that are displayed as well as the type of widgets they use.
77
+
78
+ To display a filter for an attribute, customize `filters_form.html.erb`
79
+
80
+ ```erb
81
+ # app/views/admin/posts/_filters_form.html.erb
82
+ <%= active_admin_filters_form_for(@search,
83
+ title: { label: 'Title', as: :string },
84
+ ) %>
85
+ ```
86
+
87
+ Out of the box, Active Admin supports the following filter types:
88
+
89
+ * *:string* - A drop down for selecting "Contains", "Equals", "Starts with",
90
+ "Ends with" and an input for a value.
91
+ * *:date_range* - A start and end date field with calendar inputs
92
+ * *:numeric* - A drop down for selecting "Equal To", "Greater Than" or "Less
93
+ Than" and an input for a value.
94
+ * *:select* - A drop down which filters based on a selected item in a collection
95
+ or all.
96
+ * *:check_boxes* - A list of check boxes users can turn on and off to filter
97
+
98
+ By default, Active Admin will pick the most relevant filter based on the
99
+ attribute type. You can force the type by passing the `:as` option.
100
+
101
+ ```erb
102
+ # app/views/admin/posts/_filters_form.html.erb
103
+ <%= active_admin_filters_form_for(@search,
104
+ author: { as: :check_boxes }
105
+ ) %>
106
+ ```
107
+
108
+ The `:check_boxes` and `:select` types accept options for the collection. By default
109
+ it attempts to create a collection based on an association. But you can pass in
110
+ the collection as a proc to be called at render time.
111
+
112
+ ```erb
113
+ # app/views/admin/posts/_filters_form.html.erb
114
+ <%= active_admin_filters_form_for(@search,
115
+ author: { as: :check_boxes, collection: proc { Author.all } }
116
+ ) %>
117
+ ```
118
+
119
+ To override options for string or numeric filter pass `filters` option.
120
+
121
+ ```erb
122
+ # app/views/admin/posts/_filters_form.html.erb
123
+ <%= active_admin_filters_form_for(@search,
124
+ title: { filters: [:starts_with, :ends_with] },
125
+ ) %>
126
+ ```
127
+
128
+ Also, if you don't need the select with the options 'contains', 'equals',
129
+ 'starts_with' or 'ends_with' just add the option to the filter name with an
130
+ underscore.
131
+
132
+ For example:
133
+
134
+ ```erb
135
+ # app/views/admin/posts/_filters_form.html.erb
136
+ <%= active_admin_filters_form_for(@search,
137
+ name_equals: { as: :string },
138
+ # or
139
+ name_contains: { as: :string },
140
+ ) %>
141
+ ```
142
+
143
+ You can change the filter label by passing a label option:
144
+
145
+ ```erb
146
+ # app/views/admin/posts/_filters_form.html.erb
147
+ <%= active_admin_filters_form_for(@search,
148
+ author: { label: 'Something else' }
149
+ ) %>
150
+ ```
151
+
152
+ By default, Active Admin will try to use ActiveModel I18n to determine the label.
153
+
154
+ You can also filter on more than one attribute of a model using the [Ransack
155
+ search predicate
156
+ syntax](https://github.com/activerecord-hackery/ransack/wiki/Basic-Searching).
157
+ If using a custom search method, you will also need to specify the field type
158
+ using `:as` and the label.
159
+
160
+ ```erb
161
+ # app/views/admin/posts/_filters_form.html.erb
162
+ <%= active_admin_filters_form_for(@search,
163
+ first_name_or_last_name_cont: { as: :string, label: "Name" }
164
+ ) %>
165
+ ```
166
+
167
+ Filters can also be disabled for a resource, a namespace or the entire
168
+ application.
169
+
170
+ To disable for a specific resource:
171
+
172
+ ```ruby
173
+ ActiveAdmin.configure_resource Post do |config|
174
+ config.filters = false
175
+ end
176
+ ```
177
+
178
+ To disable for a namespace, in the initializer:
179
+
180
+ ```ruby
181
+ ActiveAdmin.setup do |config|
182
+ config.namespace :my_namespace do |my_namespace|
183
+ my_namespace.filters = false
184
+ end
185
+ end
186
+ ```
187
+
188
+ Or to disable for the entire application:
189
+
190
+ ```ruby
191
+ ActiveAdmin.setup do |config|
192
+ config.filters = false
193
+ end
194
+ ```
195
+
196
+ You can also add a filter and still preserve the default filters:
197
+
198
+ ```ruby
199
+ preserve_default_filters!
200
+ filter :author
201
+ ```
202
+
203
+ Or you can also remove a filter and still preserve the default filters:
204
+
205
+ ```ruby
206
+ preserve_default_filters!
207
+ remove_filter :id
208
+ ```
209
+
210
+ ## Index Scopes
211
+
212
+ You can define custom scopes for your index page. This will add a tab bar above
213
+ the index table to quickly filter your collection on pre-defined scopes. There
214
+ are a number of ways to define your scopes:
215
+
216
+ ```ruby
217
+ config.scope :all, default: true
218
+
219
+ # assumes the model has a scope called ':active'
220
+ config.scope :active
221
+
222
+ # renames model scope ':leaves' to ':subcategories'
223
+ config.scope "Subcategories", :leaves
224
+
225
+ # Dynamic scope name
226
+ config.scope ->{ Date.today.strftime '%A' }, :published_today
227
+
228
+ # custom scope not defined on the model
229
+ config.scope("Inactive") { |scope| scope.where(active: false) }
230
+
231
+ # conditionally show a custom controller scope
232
+ config.scope "Published", if: -> { current_admin_user.can? :manage, Posts } do |posts|
233
+ posts.published
234
+ end
235
+ ```
236
+
237
+ Scopes can be labelled with a translation, e.g.
238
+ `activerecord.scopes.invoice.expired`.
239
+
240
+ ### Scopes groups
241
+
242
+ You can assign group names to scopes to keep related scopes together and separate them from the rest.
243
+
244
+ ```ruby
245
+ # a scope in the default group
246
+ config.scope :all
247
+
248
+ # two scopes used to filter by status
249
+ config.scope :active, group: :status
250
+ config.scope :inactive, group: :status
251
+
252
+ # two scopes used to filter by date
253
+ config.scope :today, group: :date
254
+ config.scope :tomorrow, group: :date
255
+ ```
256
+
257
+ ## Index default sort order
258
+
259
+ You can define the default sort order for index pages:
260
+
261
+ ```ruby
262
+ ActiveAdmin.configure_resource Post do |config|
263
+ config.sort_order = 'name_asc'
264
+ end
265
+ ```
266
+
267
+ ## Index pagination
268
+
269
+ You can set the number of records per page as default:
270
+
271
+ ```ruby
272
+ ActiveAdmin.setup do |config|
273
+ config.default_per_page = 30
274
+ end
275
+ ```
276
+
277
+ You can set the number of records per page per resources:
278
+
279
+ ```ruby
280
+ ActiveAdmin.configure_resource Post do |config|
281
+ config.per_page = 10
282
+ end
283
+ ```
284
+
285
+ Or allow users to choose themselves using dropdown with values
286
+
287
+ ```ruby
288
+ ActiveAdmin.configure_resource Post do |config|
289
+ config.per_page = [10, 50, 100]
290
+ end
291
+ ```
292
+
293
+ You can change it per request / action too:
294
+
295
+ ```ruby
296
+ class Admin::PostsController < ActiveAdmin::ResourceController
297
+ before_action only: :index do
298
+ @per_page = 100
299
+ end
300
+ end
301
+ ```
302
+
303
+ You can also disable pagination:
304
+
305
+ ```ruby
306
+ ActiveAdmin.configure_resource Post do |config|
307
+ config.paginate = false
308
+ end
309
+ ```
310
+
311
+ If you have a very large database, you might want to disable `SELECT COUNT(*)`
312
+ queries caused by the pagination info at the bottom of the page:
313
+
314
+ ```ruby
315
+ ActiveAdmin.configure_resource Post do |config|
316
+ config.set_page_options :index, pagination_total: false
317
+ end
318
+ ```
319
+
320
+ ## Customizing Download Links
321
+
322
+ You can easily remove or customize the download links you want displayed:
323
+
324
+ ```ruby
325
+ # Per resource:
326
+ ActiveAdmin.configure_resource Post do |config|
327
+
328
+ config.set_page_options :index, download_links: false
329
+ config.set_page_options :index, download_links: [:pdf]
330
+ config.set_page_options :index, download_links: proc{ current_user.can_view_download_links? }
331
+
332
+ end
333
+
334
+ # For the entire application:
335
+ ActiveAdmin.setup do |config|
336
+
337
+ config.download_links = false
338
+ config.download_links = [:csv, :xml, :json, :pdf]
339
+ config.download_links = proc { current_user.can_view_download_links? }
340
+
341
+ end
342
+ ```
343
+
344
+ Note: you have to actually implement PDF rendering for your action, ActiveAdmin
345
+ does not provide this feature. This setting just allows you to specify formats
346
+ that you want to show up under the index collection.
347
+
348
+ You'll need to use a PDF rendering library like PDFKit or WickedPDF to get the
349
+ PDF generation you want.