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,134 @@
1
+ module ActiveAdmin
2
+ class Resource
3
+ module Routes
4
+ # @param params [Hash] of params: { study_id: 3 }
5
+ # @return [String] the path to this resource collection page
6
+ # @example "/admin/posts"
7
+ def route_collection_path(params = {}, additional_params = {})
8
+ route_builder.collection_path(params, additional_params)
9
+ end
10
+
11
+ def route_batch_action_path(params = {}, additional_params = {})
12
+ route_builder.batch_action_path(params, additional_params)
13
+ end
14
+
15
+ # @param resource [ActiveRecord::Base] the instance we want the path of
16
+ # @return [String] the path to this resource collection page
17
+ # @example "/admin/posts/1"
18
+ def route_instance_path(resource, additional_params = {})
19
+ route_builder.instance_path(resource, additional_params)
20
+ end
21
+
22
+ def route_edit_instance_path(resource, additional_params = {})
23
+ route_builder.edit_instance_path(resource, additional_params)
24
+ end
25
+
26
+ # Returns the routes prefix for this config
27
+ def route_prefix
28
+ namespace.route_prefix
29
+ end
30
+
31
+ def route_builder
32
+ @route_builder ||= RouteBuilder.new(self)
33
+ end
34
+
35
+ def route_uncountable?
36
+ config = resources_configuration[:self]
37
+
38
+ config[:route_collection_name] == config[:route_instance_name]
39
+ end
40
+
41
+ private
42
+
43
+ class RouteBuilder
44
+ def initialize(resource)
45
+ @resource = resource
46
+ end
47
+
48
+ def collection_path(params, additional_params = {})
49
+ route_name = route_name(
50
+ resource.resources_configuration[:self][:route_collection_name],
51
+ suffix: (resource.route_uncountable? ? "index_path" : "path")
52
+ )
53
+
54
+ routes.public_send route_name, *route_collection_params(params), additional_params
55
+ end
56
+
57
+ def batch_action_path(params, additional_params = {})
58
+ route_name = route_name(
59
+ resource.resources_configuration[:self][:route_collection_name],
60
+ action: :batch_action,
61
+ suffix: (resource.route_uncountable? ? "index_path" : "path")
62
+ )
63
+
64
+ query = params.slice(:q, :scope)
65
+ query = query.permit!.to_h
66
+ routes.public_send route_name, *route_collection_params(params), additional_params.merge(query)
67
+ end
68
+
69
+ # @return [String] the path to this resource collection page
70
+ # @param instance [ActiveRecord::Base] the instance we want the path of
71
+ # @example "/admin/posts/1"
72
+ def instance_path(instance, additional_params = {})
73
+ route_name = route_name(resource.resources_configuration[:self][:route_instance_name])
74
+
75
+ routes.public_send route_name, *route_instance_params(instance), additional_params
76
+ end
77
+
78
+ # @return [String] the path to the edit page of this resource
79
+ # @param instance [ActiveRecord::Base] the instance we want the path of
80
+ # @example "/admin/posts/1/edit"
81
+ def edit_instance_path(instance, additional_params = {})
82
+ path = resource.resources_configuration[:self][:route_instance_name]
83
+ route_name = route_name(path, action: :edit)
84
+
85
+ routes.public_send route_name, *route_instance_params(instance), additional_params
86
+ end
87
+
88
+ private
89
+
90
+ attr_reader :resource
91
+
92
+ def route_name(resource_path_name, options = {})
93
+ suffix = options[:suffix] || "path"
94
+ route = []
95
+
96
+ route << options[:action] # "batch_action", "edit" or "new"
97
+ route << resource.route_prefix # "admin"
98
+ route << belongs_to_name if nested? # "category"
99
+ route << resource_path_name # "posts" or "post"
100
+ route << suffix # "path" or "index path"
101
+
102
+ route.compact.join('_').to_sym # :admin_category_posts_path
103
+ end
104
+
105
+ # @return params to pass to instance path
106
+ def route_instance_params(instance)
107
+ if nested?
108
+ [instance.public_send(belongs_to_name).to_param, instance.to_param]
109
+ else
110
+ instance.to_param
111
+ end
112
+ end
113
+
114
+ def route_collection_params(params)
115
+ if nested?
116
+ params[:"#{belongs_to_name}_id"]
117
+ end
118
+ end
119
+
120
+ def nested?
121
+ resource.belongs_to? && resource.belongs_to_config.required?
122
+ end
123
+
124
+ def belongs_to_name
125
+ resource.belongs_to_config.target.resource_name.singular if nested?
126
+ end
127
+
128
+ def routes
129
+ Helpers::Routes
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,74 @@
1
+ module ActiveAdmin
2
+ class Resource
3
+ module ScopeTo
4
+
5
+ # Scope this controller to some object which has a relation
6
+ # to the resource. Can either accept a block or a symbol
7
+ # of a method to call.
8
+ #
9
+ # Eg:
10
+ #
11
+ # ActiveAdmin.register Post do
12
+ # scope_to :current_user
13
+ # end
14
+ #
15
+ # Then every time we instantiate and object, it would call
16
+ #
17
+ # current_user.posts.build
18
+ #
19
+ # By default Active Admin will use the resource name to build a
20
+ # method to call as the association. If its different, you can
21
+ # pass in the association_method as an option.
22
+ #
23
+ # scope_to :current_user, association_method: :blog_posts
24
+ #
25
+ # will result in the following
26
+ #
27
+ # current_user.blog_posts.build
28
+ #
29
+ # To conditionally use this scope, you can use conditional procs
30
+ #
31
+ # scope_to :current_user, if: proc{ admin_user_signed_in? }
32
+ #
33
+ # or
34
+ #
35
+ # scope_to :current_user, unless: proc{ current_user.admin? }
36
+ #
37
+ def scope_to(*args, &block)
38
+ options = args.extract_options!
39
+ method = args.first
40
+
41
+ scope_to_config[:method] = block || method
42
+ scope_to_config[:association_method] = options[:association_method]
43
+ scope_to_config[:if] = options[:if]
44
+ scope_to_config[:unless] = options[:unless]
45
+
46
+ end
47
+
48
+ def scope_to_association_method
49
+ scope_to_config[:association_method]
50
+ end
51
+
52
+ def scope_to_method
53
+ scope_to_config[:method]
54
+ end
55
+
56
+ def scope_to_config
57
+ @scope_to_config ||= {
58
+ method: nil,
59
+ association_method: nil,
60
+ if: nil,
61
+ unless: nil
62
+ }
63
+ end
64
+
65
+ def scope_to?(context = nil)
66
+ return false if scope_to_method.nil?
67
+ return render_in_context(context, scope_to_config[:if]) unless scope_to_config[:if].nil?
68
+ return !render_in_context(context, scope_to_config[:unless]) unless scope_to_config[:unless].nil?
69
+ true
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,52 @@
1
+ module ActiveAdmin
2
+ class Resource
3
+ module Scopes
4
+
5
+ # Return an array of scopes for this resource
6
+ def scopes
7
+ @scopes ||= []
8
+ end
9
+
10
+ # Returns a scope for this object by its identifier
11
+ def get_scope_by_id(id)
12
+ id = id.to_s
13
+ scopes.find{|s| s.id == id }
14
+ end
15
+
16
+ def default_scope(context = nil)
17
+ scopes.detect do |scope|
18
+ if scope.default_block.is_a?(Proc)
19
+ render_in_context(context, scope.default_block)
20
+ else
21
+ scope.default_block
22
+ end
23
+ end
24
+ end
25
+
26
+ # Create a new scope object for this resource.
27
+ # If you want to internationalize the scope name, you can add
28
+ # to your i18n files a key like "active_admin.scopes.scope_method".
29
+ def scope(*args, &block)
30
+ default_options = {show_count: namespace.scopes_show_count}
31
+ options = default_options.merge(args.extract_options!)
32
+ title = args[0] rescue nil
33
+ method = args[1] rescue nil
34
+
35
+ options[:localizer] ||= ActiveAdmin::Localizers.resource(self)
36
+ scope = ActiveAdmin::Scope.new(title, method, options, &block)
37
+
38
+ # Finds and replaces a scope by the same name if it already exists
39
+ existing_scope_index = scopes.index{|existing_scope| existing_scope.id == scope.id }
40
+ if existing_scope_index
41
+ scopes.delete_at(existing_scope_index)
42
+ scopes.insert(existing_scope_index, scope)
43
+ else
44
+ self.scopes << scope
45
+ end
46
+
47
+ scope
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,32 @@
1
+ require 'active_admin/helpers/optional_display'
2
+
3
+ module ActiveAdmin
4
+
5
+ class Resource
6
+ module Sidebars
7
+
8
+ def add_sidebar_section(name, options)
9
+ sidebar_sections << SidebarSection.new(name, options)
10
+ end
11
+
12
+ def sidebar_sections
13
+ @sidebar_sections ||= []
14
+ end
15
+
16
+ def clear_sidebar_sections!
17
+ @sidebar_sections = []
18
+ end
19
+
20
+ def sidebar_sections_for(action, render_context = nil)
21
+ sidebar_sections.select{|section| section.display_on?(action, render_context) }
22
+ .sort_by(&:priority)
23
+ end
24
+
25
+ def sidebar_sections?
26
+ !!@sidebar_sections && @sidebar_sections.any?
27
+ end
28
+
29
+ end
30
+ end
31
+
32
+ end
@@ -0,0 +1,215 @@
1
+ require 'active_admin/resource/action_items'
2
+ require 'active_admin/resource/attributes'
3
+ require 'active_admin/resource/controllers'
4
+ require 'active_admin/resource/menu'
5
+ require 'active_admin/resource/page_presenters'
6
+ require 'active_admin/resource/pagination'
7
+ require 'active_admin/resource/routes'
8
+ require 'active_admin/resource/naming'
9
+ require 'active_admin/resource/scopes'
10
+ require 'active_admin/resource/includes'
11
+ require 'active_admin/resource/scope_to'
12
+ require 'active_admin/resource/sidebars'
13
+ require 'active_admin/resource/belongs_to'
14
+ require 'active_admin/resource/ordering'
15
+
16
+ module ActiveAdmin
17
+
18
+ # Resource is the primary data storage for resource configuration in Active Admin
19
+ #
20
+ # When you register a resource (ActiveAdmin.register Post) you are actually creating
21
+ # a new Resource instance within the given Namespace.
22
+ #
23
+ # The instance of the current resource is available in ResourceController and views
24
+ # by calling the #active_admin_config method.
25
+ #
26
+ class Resource
27
+
28
+ # Event dispatched when a new resource is registered
29
+ RegisterEvent = 'active_admin.resource.register'.freeze
30
+
31
+ # The namespace this config belongs to
32
+ attr_reader :namespace
33
+
34
+ # The name of the resource class
35
+ attr_reader :resource_class_name
36
+
37
+ # An array of member actions defined for this resource
38
+ attr_reader :member_actions
39
+ def add_member_route(name, options)
40
+ member_actions << ControllerAction.new(name, options)
41
+ end
42
+
43
+ # An array of collection actions defined for this resource
44
+ attr_reader :collection_actions
45
+ def add_collection_route(name, options)
46
+ collection_actions << ControllerAction.new(name, options)
47
+ end
48
+
49
+ # The default sort order to use in the controller
50
+ attr_writer :sort_order
51
+ def sort_order
52
+ @sort_order ||= (resource_class.respond_to?(:primary_key) ? resource_class.primary_key.to_s : 'id') + '_desc'
53
+ end
54
+
55
+ # Set the configuration for the CSV
56
+ attr_writer :csv_builder
57
+
58
+ # Set breadcrumb builder
59
+ attr_writer :breadcrumb
60
+
61
+ #Set order clause
62
+ attr_writer :order_clause
63
+ # Display create another checkbox on a new page
64
+ # @return [Boolean]
65
+ attr_writer :create_another
66
+
67
+ # Store a reference to the DSL so that we can dereference it during garbage collection.
68
+ attr_accessor :dsl
69
+
70
+ # The string identifying a class to decorate our resource with for the view.
71
+ # nil to not decorate.
72
+ attr_accessor :decorator_class_name
73
+
74
+ # An array or proc returning whitelisted resource attribute names.
75
+ attr_accessor :permitted_attr_names
76
+
77
+ module Base
78
+ def initialize(namespace, resource_class, options = {})
79
+ @namespace = namespace
80
+ @resource_class_name = "::#{resource_class.name}"
81
+ @options = options
82
+ @sort_order = options[:sort_order]
83
+ @member_actions, @collection_actions = [], []
84
+ end
85
+ end
86
+
87
+ include MethodOrProcHelper
88
+
89
+ include Base
90
+ include ActionItems
91
+ include Authorization
92
+ include Controllers
93
+ include Menu
94
+ include Naming
95
+ include PagePresenters
96
+ include Pagination
97
+ include Scopes
98
+ include Includes
99
+ include ScopeTo
100
+ include Sidebars
101
+ include Routes
102
+ include Ordering
103
+ include Attributes
104
+
105
+ # The class this resource wraps. If you register the Post model, Resource#resource_class
106
+ # will point to the Post class
107
+ def resource_class
108
+ resource_class_name.constantize
109
+ end
110
+
111
+ def decorator_class
112
+ decorator_class_name&.constantize
113
+ end
114
+
115
+ def resource_table_name
116
+ resource_class.quoted_table_name
117
+ end
118
+
119
+ def resource_column_names
120
+ resource_class.column_names
121
+ end
122
+
123
+ def resource_quoted_column_name(column)
124
+ resource_class.connection.quote_column_name(column)
125
+ end
126
+
127
+ # Clears all the member actions this resource knows about
128
+ def clear_member_actions!
129
+ @member_actions = []
130
+ end
131
+
132
+ def clear_collection_actions!
133
+ @collection_actions = []
134
+ end
135
+
136
+ # Return only defined resource actions
137
+ def defined_actions
138
+ controller.instance_methods.map(&:to_sym) & ResourceController::ACTIVE_ADMIN_ACTIONS
139
+ end
140
+
141
+ def belongs_to(target, options = {})
142
+ @belongs_to = Resource::BelongsTo.new(self, target, options)
143
+ self.menu_item_options = false if @belongs_to.required?
144
+ controller.send :belongs_to, target, options.dup
145
+ end
146
+
147
+ def belongs_to_config
148
+ @belongs_to
149
+ end
150
+
151
+ def belongs_to_param
152
+ if belongs_to? && belongs_to_config.required?
153
+ belongs_to_config.to_param
154
+ end
155
+ end
156
+
157
+ # Do we belong to another resource?
158
+ def belongs_to?
159
+ !!belongs_to_config
160
+ end
161
+
162
+ # The csv builder for this resource
163
+ def csv_builder
164
+ @csv_builder || default_csv_builder
165
+ end
166
+
167
+ def breadcrumb
168
+ instance_variable_defined?(:@breadcrumb) ? @breadcrumb : namespace.breadcrumb
169
+ end
170
+
171
+ def order_clause
172
+ @order_clause || namespace.order_clause
173
+ end
174
+
175
+ def create_another
176
+ instance_variable_defined?(:@create_another) ? @create_another : namespace.create_another
177
+ end
178
+
179
+ def find_resource(id)
180
+ resource = resource_class.public_send *method_for_find(id)
181
+ (decorator_class && resource) ? decorator_class.new(resource) : resource
182
+ end
183
+
184
+ def resource_columns
185
+ resource_attributes.values
186
+ end
187
+
188
+ def resource_attributes
189
+ @resource_attributes ||= default_attributes
190
+ end
191
+
192
+ def association_columns
193
+ @association_columns ||= resource_attributes.select{ |key, value| key != value }.values
194
+ end
195
+
196
+ def content_columns
197
+ @content_columns ||= resource_attributes.select{ |key, value| key == value }.values
198
+ end
199
+
200
+ private
201
+
202
+ def method_for_find(id)
203
+ if finder = resources_configuration[:self][:finder]
204
+ [finder, id]
205
+ else
206
+ [:find_by, { resource_class.primary_key => id }]
207
+ end
208
+ end
209
+
210
+ def default_csv_builder
211
+ @default_csv_builder ||= CSVBuilder.default_for_resource(self)
212
+ end
213
+
214
+ end # class Resource
215
+ end # module ActiveAdmin
@@ -0,0 +1,72 @@
1
+ module ActiveAdmin
2
+ # This is a container for resources, which acts much like a Hash.
3
+ # It's assumed that an added resource responds to `resource_name`.
4
+ class ResourceCollection
5
+ include Enumerable
6
+ extend Forwardable
7
+ def_delegators :@collection, :empty?, :has_key?, :keys, :values, :size
8
+
9
+ def initialize
10
+ @collection = {}
11
+ end
12
+
13
+ def add(resource)
14
+ if match = @collection[resource.resource_name]
15
+ raise_if_mismatched! match, resource
16
+ match
17
+ else
18
+ @collection[resource.resource_name] = resource
19
+ end
20
+ end
21
+
22
+ # Changes `each` to pass in the value, instead of both the key and value.
23
+ def each(&block)
24
+ values.each &block
25
+ end
26
+
27
+ def [](obj)
28
+ @collection[obj] || find_resource(obj)
29
+ end
30
+
31
+ private
32
+
33
+ # Finds a resource based on the resource name, resource class, or base class.
34
+ def find_resource(obj)
35
+ resources.detect do |r|
36
+ r.resource_name.to_s == obj.to_s
37
+ end || resources.detect do |r|
38
+ r.resource_class.to_s == obj.to_s
39
+ end ||
40
+ if obj.respond_to? :base_class
41
+ resources.detect{ |r| r.resource_class.to_s == obj.base_class.to_s }
42
+ end
43
+ end
44
+
45
+ def resources
46
+ select{ |r| r.class <= Resource } # can otherwise be a Page
47
+ end
48
+
49
+ def raise_if_mismatched!(existing, given)
50
+ if existing.class != given.class
51
+ raise IncorrectClass.new existing, given
52
+ elsif given.class <= Resource && existing.resource_class != given.resource_class
53
+ raise ConfigMismatch.new existing, given
54
+ end
55
+ end
56
+
57
+ class IncorrectClass < StandardError
58
+ def initialize(existing, given)
59
+ super "You're trying to register #{given.resource_name} which is a #{given.class}, " +
60
+ "but #{existing.resource_name}, a #{existing.class} has already claimed that name."
61
+ end
62
+ end
63
+
64
+ class ConfigMismatch < StandardError
65
+ def initialize(existing, given)
66
+ super "You're trying to register #{given.resource_class} as #{given.resource_name}, " +
67
+ "but the existing #{existing.class} config was built for #{existing.resource_class}!"
68
+ end
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveAdmin
2
+ class ResourceController < BaseController
3
+
4
+ module ActionBuilder
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+
9
+ def clear_member_actions!
10
+ active_admin_config.clear_member_actions!
11
+ end
12
+
13
+ def clear_collection_actions!
14
+ active_admin_config.clear_collection_actions!
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+ end