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,221 @@
1
+ module ActiveAdmin
2
+ # This is the class where all the register blocks are evaluated.
3
+ class ResourceDSL < DSL
4
+
5
+ private
6
+
7
+ # Redefine sort behaviour for column
8
+ #
9
+ # For example:
10
+ #
11
+ # # nulls last
12
+ # order_by(:age) do |order_clause|
13
+ # [order_clause.to_sql, 'NULLS LAST'].join(' ') if order_clause.order == 'desc'
14
+ # end
15
+ #
16
+ # # by last_name but in the case that there is no last name, by first_name.
17
+ # order_by(:full_name) do |order_clause|
18
+ # ['COALESCE(NULLIF(last_name, ''), first_name), first_name', order_clause.order].join(' ')
19
+ # end
20
+ #
21
+ #
22
+ def order_by(column, &block)
23
+ config.ordering[column] = block
24
+ end
25
+
26
+ def belongs_to(target, options = {})
27
+ config.belongs_to(target, options)
28
+ end
29
+
30
+ # Scope collection to a relation
31
+ def scope_to(*args, &block)
32
+ config.scope_to(*args, &block)
33
+ end
34
+
35
+ # Create a scope
36
+ def scope(*args, &block)
37
+ config.scope(*args, &block)
38
+ end
39
+
40
+ # Store relations that should be included
41
+ def includes(*args)
42
+ config.includes.push *args
43
+ end
44
+
45
+ #
46
+ # Keys included in the `permitted_params` setting are automatically whitelisted.
47
+ #
48
+ # Either
49
+ #
50
+ # permit_params :title, :author, :body, tags: []
51
+ #
52
+ # Or
53
+ #
54
+ # permit_params do
55
+ # defaults = [:title, :body]
56
+ # if current_user.admin?
57
+ # defaults + [:author]
58
+ # else
59
+ # defaults
60
+ # end
61
+ # end
62
+ #
63
+ def permit_params(*args, &block)
64
+ config.permitted_attr_names = block_given? ? block : args
65
+ end
66
+
67
+ # Configure the index page for the resource
68
+ def index(options = {}, &block)
69
+ if block_given?
70
+ options[:as] ||= :table
71
+ config.set_page_presenter :index, ActiveAdmin::PagePresenter.new(options, &block)
72
+ else
73
+ config.set_page_options :index, options
74
+ end
75
+ end
76
+
77
+ # Configure the show page for the resource
78
+ def show(options = {}, &block)
79
+ if block_given?
80
+ config.set_page_presenter :show, ActiveAdmin::PagePresenter.new(options, &block)
81
+ else
82
+ config.set_page_options :show, options
83
+ end
84
+ end
85
+
86
+ def form(options = {}, &block)
87
+ if block_given?
88
+ config.set_page_presenter :form, ActiveAdmin::PagePresenter.new(options, &block)
89
+ else
90
+ config.set_page_options :form, options
91
+ end
92
+ end
93
+
94
+ # Configure the CSV format
95
+ #
96
+ # For example:
97
+ #
98
+ # csv do
99
+ # column :name
100
+ # column("Author") { |post| post.author.full_name }
101
+ # end
102
+ #
103
+ # csv col_sep: ";", force_quotes: true do
104
+ # column :name
105
+ # end
106
+ #
107
+ def csv(options = {}, &block)
108
+ options[:resource] = config
109
+
110
+ config.csv_builder = CSVBuilder.new(options, &block)
111
+ end
112
+
113
+ # Member Actions give you the functionality of defining both the
114
+ # action and the route directly from your ActiveAdmin registration
115
+ # block.
116
+ #
117
+ # For example:
118
+ #
119
+ # ActiveAdmin.register Post do
120
+ # member_action :comments do
121
+ # @post = Post.find(params[:id]
122
+ # @comments = @post.comments
123
+ # end
124
+ # end
125
+ #
126
+ # Will create a new controller action comments and will hook it up to
127
+ # the named route (comments_admin_post_path) /admin/posts/:id/comments
128
+ #
129
+ # You can treat everything within the block as a standard Rails controller
130
+ # action.
131
+ #
132
+ def member_action(name, options = {}, &block)
133
+ if (title = options.delete(:title))
134
+ set_title_before_action(name, title)
135
+ end
136
+
137
+ define_controller_method(name, &block)
138
+
139
+ config.add_member_route(name, options)
140
+ end
141
+
142
+ def collection_action(name, options = {}, &block)
143
+ if (title = options.delete(:title))
144
+ set_title_before_action(name, title)
145
+ end
146
+
147
+ define_controller_method(name, &block)
148
+
149
+ config.add_collection_route(name, options)
150
+ end
151
+
152
+ def decorate_with(decorator_class)
153
+ # Force storage as a string. This will help us with reloading issues.
154
+ # Assuming decorator_class.to_s will return the name of the class allows
155
+ # us to handle a string or a class.
156
+ config.decorator_class_name = "::#{ decorator_class }"
157
+ end
158
+
159
+ # Defined Callbacks
160
+ #
161
+ # == After Build
162
+ # Called after the resource is built in the new and create actions.
163
+ #
164
+ # ActiveAdmin.register Post do
165
+ # after_build do |post|
166
+ # post.author = current_user
167
+ # end
168
+ # end
169
+ #
170
+ # == Before / After Create
171
+ # Called before and after a resource is saved to the db on the create action.
172
+ #
173
+ # == Before / After Update
174
+ # Called before and after a resource is saved to the db on the update action.
175
+ #
176
+ # == Before / After Save
177
+ # Called before and after the object is saved in the create and update action.
178
+ # Note: Gets called after the create and update callbacks
179
+ #
180
+ # == Before / After Destroy
181
+ # Called before and after the object is destroyed from the database.
182
+ #
183
+ delegate :before_build, :after_build, to: :controller
184
+ delegate :before_create, :after_create, to: :controller
185
+ delegate :before_update, :after_update, to: :controller
186
+ delegate :before_save, :after_save, to: :controller
187
+ delegate :before_destroy, :after_destroy, to: :controller
188
+
189
+ # This code defines both *_filter and *_action for Rails 5.0 and *_action for Rails >= 5.1
190
+ phases = [
191
+ :before, :skip_before,
192
+ :after, :skip_after,
193
+ :around, :skip
194
+ ]
195
+ keywords = if Rails::VERSION::MAJOR == 5 && Rails::VERSION::MINOR >= 1
196
+ [:action]
197
+ else
198
+ [:action, :filter]
199
+ end
200
+
201
+ keywords.each do |name|
202
+ phases.each do |action|
203
+ define_method "#{action}_#{name}" do |*args, &block|
204
+ controller.public_send "#{action}_action", *args, &block
205
+ end
206
+ end
207
+ end
208
+
209
+ # Specify which actions to create in the controller
210
+ #
211
+ # Eg:
212
+ #
213
+ # ActiveAdmin.register Post do
214
+ # actions :index, :show
215
+ # end
216
+ #
217
+ # Will only create the index and show actions (no create, update or delete)
218
+ delegate :actions, to: :controller
219
+
220
+ end
221
+ end
@@ -0,0 +1,113 @@
1
+ module ActiveAdmin
2
+ # @private
3
+ class Router
4
+ attr_reader :namespaces, :router
5
+
6
+ def initialize(router:, namespaces:)
7
+ @router, @namespaces = router, namespaces
8
+ end
9
+
10
+ def apply
11
+ define_root_routes
12
+ define_resources_routes
13
+ end
14
+
15
+ private
16
+
17
+ def define_root_routes
18
+ namespaces.each do |namespace|
19
+ if namespace.root?
20
+ router.root namespace.root_to_options.merge(to: namespace.root_to, as: nil)
21
+ else
22
+ router.namespace namespace.name, namespace.route_options.dup do
23
+ router.root namespace.root_to_options.merge(to: namespace.root_to, as: :root)
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ # Defines the routes for each resource
30
+ def define_resources_routes
31
+ resources = namespaces.flat_map{ |n| n.resources.values }
32
+ resources.each do |config|
33
+ define_resource_routes(config)
34
+ end
35
+ end
36
+
37
+ def define_resource_routes(config)
38
+ if config.namespace.root?
39
+ define_routes(config)
40
+ else
41
+ # Add on the namespace if required
42
+ define_namespace(config)
43
+ end
44
+ end
45
+
46
+ def define_routes(config)
47
+ if config.belongs_to?
48
+ define_belongs_to_routes(config)
49
+ else
50
+ page_or_resource_routes(config)
51
+ end
52
+ end
53
+
54
+ def page_or_resource_routes(config)
55
+ config.is_a?(Page) ? page_routes(config) : resource_routes(config)
56
+ end
57
+
58
+ def resource_routes(config)
59
+ router.resources config.resource_name.route_key, only: config.defined_actions do
60
+ define_actions(config)
61
+ end
62
+ end
63
+
64
+ def page_routes(config)
65
+ page = config.underscored_resource_name
66
+ router.get "/#{page}" => "#{page}#index"
67
+ config.page_actions.each do |action|
68
+ Array.wrap(action.http_verb).each do |verb|
69
+ build_route(verb, "/#{page}/#{action.name}" => "#{page}##{action.name}")
70
+ end
71
+ end
72
+ end
73
+
74
+ # Defines member and collection actions
75
+ def define_actions(config)
76
+ router.member do
77
+ config.member_actions.each { |action| build_action(action) }
78
+ end
79
+
80
+ router.collection do
81
+ config.collection_actions.each { |action| build_action(action) }
82
+ router.post :batch_action if config.batch_actions_enabled?
83
+ end
84
+ end
85
+
86
+ # Deals with +ControllerAction+ instances
87
+ # Builds one route for each HTTP verb passed in
88
+ def build_action(action)
89
+ build_route(action.http_verb, action.name)
90
+ end
91
+
92
+ def build_route(verbs, *args)
93
+ Array.wrap(verbs).each { |verb| router.send(verb, *args) }
94
+ end
95
+
96
+ def define_belongs_to_routes(config)
97
+ # If it's optional, make the normal resource routes
98
+ page_or_resource_routes(config) if config.belongs_to_config.optional?
99
+
100
+ # Make the nested belongs_to routes
101
+ # :only is set to nothing so that we don't clobber any existing routes on the resource
102
+ router.resources config.belongs_to_config.target.resource_name.plural, only: [] do
103
+ page_or_resource_routes(config)
104
+ end
105
+ end
106
+
107
+ def define_namespace(config)
108
+ router.namespace config.namespace.name, config.namespace.route_options.dup do
109
+ define_routes(config)
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,60 @@
1
+ module ActiveAdmin
2
+ class Scope
3
+
4
+ attr_reader :scope_method, :id, :scope_block, :display_if_block, :show_count, :default_block, :group
5
+
6
+ # Create a Scope
7
+ #
8
+ # Examples:
9
+ #
10
+ # Scope.new(:published)
11
+ # # => Scope with name 'Published' and scope method :published
12
+ #
13
+ # Scope.new('Published', :public)
14
+ # # => Scope with name 'Published' and scope method :public
15
+ #
16
+ # Scope.new 'Published', :public, if: proc { current_admin_user.can? :manage, resource_class } do |articles|
17
+ # articles.where published: true
18
+ # end
19
+ # # => Scope with name 'Published' and scope method :public, optionally displaying the scope per the :if block
20
+ #
21
+ # Scope.new('Published') { |articles| articles.where(published: true) }
22
+ # # => Scope with name 'Published' using a block to scope
23
+ #
24
+ # Scope.new ->{Date.today.strftime '%A'}, :published_today
25
+ # # => Scope with dynamic title using the :published_today scope method
26
+ #
27
+ # Scope.new :published, nil, group: :status
28
+ # # => Scope with the group :status
29
+ #
30
+ def initialize(name, method = nil, options = {}, &block)
31
+ @name, @scope_method = name, method.try(:to_sym)
32
+
33
+ if name.is_a? Proc
34
+ raise "A string/symbol is required as the second argument if your label is a proc." unless method
35
+ @id = method.to_s.parameterize(separator: "_")
36
+ else
37
+ @scope_method ||= name.to_sym
38
+ @id = name.to_s.parameterize(separator: "_")
39
+ end
40
+
41
+ @scope_method = nil if @scope_method == :all
42
+ @scope_method, @scope_block = nil, block if block_given?
43
+
44
+ @localizer = options[:localizer]
45
+ @show_count = options.fetch(:show_count, true)
46
+ @display_if_block = options[:if] || proc{ true }
47
+ @default_block = options[:default] || proc{ false }
48
+ @group = options[:group].try(:to_sym)
49
+ end
50
+
51
+ def name
52
+ case @name
53
+ when String then @name
54
+ when Symbol then @localizer ? @localizer.t(@name, scope: 'scopes') : @name.to_s.titleize
55
+ else @name
56
+ end
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,19 @@
1
+ module ActiveAdmin
2
+
3
+ class SettingsNode
4
+ class << self
5
+ # Never instantiated. Variables are stored in the singleton_class.
6
+ private_class_method :new
7
+
8
+ # @returns anonymous class with same accessors as the superclass.
9
+ def build(superclass = self)
10
+ Class.new(superclass)
11
+ end
12
+
13
+ def register(name, value)
14
+ class_attribute name
15
+ send "#{name}=", value
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveAdmin
2
+
3
+ class SidebarSection
4
+ include ActiveAdmin::OptionalDisplay
5
+
6
+ attr_accessor :name, :options, :block
7
+
8
+ def initialize(name, options = {}, &block)
9
+ @name, @options, @block = name.to_s, options, block
10
+ normalize_display_options!
11
+ end
12
+
13
+ # The id gets used for the div in the view
14
+ def id
15
+ "#{name.downcase.underscore}_sidebar_section".parameterize
16
+ end
17
+
18
+ # The title gets displayed within the section in the view
19
+ def title
20
+ I18n.t("active_admin.sidebars.#{name}", default: name.titlecase)
21
+ end
22
+
23
+ # If a block is not passed in, the name of the partial to render
24
+ def partial_name
25
+ options[:partial] || "#{name.downcase.tr(' ', '_')}_sidebar"
26
+ end
27
+
28
+ def custom_class
29
+ options[:class]
30
+ end
31
+
32
+ def priority
33
+ options[:priority] || 10
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,3 @@
1
+ module ActiveAdmin
2
+ VERSION = '1.7.0'
3
+ end
@@ -0,0 +1,10 @@
1
+ require 'active_admin/abstract_view_factory'
2
+
3
+ module ActiveAdmin
4
+ class ViewFactory < AbstractViewFactory
5
+
6
+ # Register Helper Renderers
7
+ register site_title: ActiveAdmin::Views::SiteTitle,
8
+ index_scopes: ActiveAdmin::Views::Scopes
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module ActiveAdminApplicationHelper
4
+
5
+ # Returns the current Active Admin application instance
6
+ def active_admin_application
7
+ ActiveAdmin.application
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module AutoLinkHelper
4
+
5
+ # Automatically links objects to their resource controllers. If
6
+ # the resource has not been registered, a string representation of
7
+ # the object is returned.
8
+ #
9
+ # The default content in the link is returned from ActiveAdmin::ViewHelpers::DisplayHelper#display_name
10
+ #
11
+ # You can pass in the content to display
12
+ # eg: auto_link(@post, "My Link")
13
+ #
14
+ def auto_link(resource, content = display_name(resource))
15
+ if url = auto_url_for(resource)
16
+ link_to content, url
17
+ else
18
+ content
19
+ end
20
+ end
21
+
22
+ # Like `auto_link`, except that it only returns a URL instead of a full <a> tag
23
+ def auto_url_for(resource)
24
+ config = active_admin_resource_for(resource.class)
25
+ return unless config
26
+
27
+ if config.controller.action_methods.include?("show") &&
28
+ authorized?(ActiveAdmin::Auth::READ, resource)
29
+ url_for config.route_instance_path resource, url_options
30
+ elsif config.controller.action_methods.include?("edit") &&
31
+ authorized?(ActiveAdmin::Auth::UPDATE, resource)
32
+ url_for config.route_edit_instance_path resource, url_options
33
+ end
34
+ end
35
+
36
+ # Returns the ActiveAdmin::Resource instance for a class
37
+ def active_admin_resource_for(klass)
38
+ if respond_to? :active_admin_namespace
39
+ active_admin_namespace.resource_for klass
40
+ end
41
+ end
42
+
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,52 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module BreadcrumbHelper
4
+
5
+ # Returns an array of links to use in a breadcrumb
6
+ def breadcrumb_links(path = request.path)
7
+ setting = active_admin_config.breadcrumb
8
+
9
+ if setting.blank?
10
+ nil
11
+ elsif setting.is_a?(Proc)
12
+ instance_exec(controller, &setting)
13
+ else
14
+ default_breadcrumb_links(path)
15
+ end
16
+ end
17
+
18
+ GUID_REGEX = '(?:[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12})'
19
+ ID_REGEX = '\d+|[a-f0-9]{24}|' + GUID_REGEX
20
+
21
+ def default_breadcrumb_links(path)
22
+ # remove leading "/" and split up the URL
23
+ # and remove last since it's used as the page title
24
+ parts = path.split('/').select(&:present?)[0..-2]
25
+
26
+ parts.each_with_index.map do |part, index|
27
+ config = breadcrumb_part_config(parts[index-1]) if part.match?(/\A(#{ID_REGEX})\z/)
28
+
29
+ # 1. try using `display_name` if we can locate a DB object
30
+ # 2. try using the model name translation
31
+ # 3. default to calling `titlecase` on the URL fragment
32
+ name = config && display_name(config.find_resource part)
33
+ name ||= I18n.t "activerecord.models.#{part.singularize}", count: ::ActiveAdmin::Helpers::I18n::PLURAL_MANY_COUNT, default: part.titlecase
34
+
35
+ # Don't create a link if the resource's show action is disabled
36
+ if !config || config.defined_actions.include?(:show)
37
+ link_to name, '/' + parts[0..index].join('/')
38
+ else
39
+ name
40
+ end
41
+ end
42
+ end
43
+
44
+ def breadcrumb_part_config(parent_part)
45
+ config = active_admin_config
46
+ parent = config.belongs_to_config.try :target
47
+ parent && parent.resource_name.route_key == parent_part ? parent : config
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,95 @@
1
+ module ActiveAdmin
2
+ module ViewHelpers
3
+ module DisplayHelper
4
+
5
+ DISPLAY_NAME_FALLBACK = ->{
6
+ name, klass = "", self.class
7
+ name << klass.model_name.human if klass.respond_to? :model_name
8
+ name << " ##{send(klass.primary_key)}" if klass.respond_to? :primary_key
9
+ name.present? ? name : to_s
10
+ }
11
+ def DISPLAY_NAME_FALLBACK.inspect
12
+ 'DISPLAY_NAME_FALLBACK'
13
+ end
14
+
15
+ # Attempts to call any known display name methods on the resource.
16
+ # See the setting in `application.rb` for the list of methods and their priority.
17
+ def display_name(resource)
18
+ sanitize(render_in_context(resource, display_name_method_for(resource)).to_s) unless resource.nil?
19
+ end
20
+
21
+ # Looks up and caches the first available display name method.
22
+ # To prevent conflicts, we exclude any methods that happen to be associations.
23
+ # If no methods are available and we're about to use the Kernel's `to_s`, provide our own.
24
+ def display_name_method_for(resource)
25
+ @@display_name_methods_cache ||= {}
26
+ @@display_name_methods_cache[resource.class] ||= begin
27
+ methods = active_admin_application.display_name_methods - association_methods_for(resource)
28
+ method = methods.detect{ |method| resource.respond_to? method }
29
+
30
+ if method != :to_s || resource.method(method).source_location
31
+ method
32
+ else
33
+ DISPLAY_NAME_FALLBACK
34
+ end
35
+ end
36
+ end
37
+
38
+ def association_methods_for(resource)
39
+ return [] unless resource.class.respond_to? :reflect_on_all_associations
40
+ resource.class.reflect_on_all_associations.map(&:name)
41
+ end
42
+
43
+ def format_attribute(resource, attr)
44
+ value = find_value resource, attr
45
+
46
+ if value.is_a?(Arbo::Element)
47
+ value
48
+ elsif boolean_attr?(resource, attr, value)
49
+ Arbo::Context.new { status_tag value }
50
+ else
51
+ pretty_format value
52
+ end
53
+ end
54
+
55
+ def find_value(resource, attr)
56
+ if attr.is_a? Proc
57
+ attr.call resource
58
+ elsif resource.respond_to? attr
59
+ resource.public_send attr
60
+ elsif resource.respond_to? :[]
61
+ resource[attr]
62
+ end
63
+ end
64
+
65
+ # Attempts to create a human-readable string for any object
66
+ def pretty_format(object)
67
+ case object
68
+ when String, Numeric, Symbol, Arbo::Element
69
+ object.to_s
70
+ when Date, Time
71
+ I18n.localize object, format: active_admin_application.localize_format
72
+ else
73
+ if defined?(::ActiveRecord) && object.is_a?(ActiveRecord::Base) ||
74
+ defined?(::Mongoid) && object.class.include?(Mongoid::Document)
75
+ auto_link object
76
+ else
77
+ display_name object
78
+ end
79
+ end
80
+ end
81
+
82
+ def boolean_attr?(resource, attr, value)
83
+ case value
84
+ when TrueClass, FalseClass
85
+ true
86
+ else
87
+ if resource.class.respond_to? :columns_hash
88
+ column = resource.class.columns_hash[attr.to_s] and column.type == :boolean
89
+ end
90
+ end
91
+ end
92
+
93
+ end
94
+ end
95
+ end