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,43 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Controller Authorization", type: :controller do
4
+
5
+ let(:authorization){ controller.send(:active_admin_authorization) }
6
+
7
+ before do
8
+ load_resources { ActiveAdmin.register Post }
9
+ @controller = Admin::PostsController.new
10
+ allow(authorization).to receive(:authorized?)
11
+ end
12
+
13
+ it "should authorize the index action" do
14
+ expect(authorization).to receive(:authorized?).with(auth::READ, Post).and_return true
15
+ get :index
16
+ expect(response).to be_successful
17
+ end
18
+
19
+ it "should authorize the new action" do
20
+ expect(authorization).to receive(:authorized?).with(auth::CREATE, an_instance_of(Post)).and_return true
21
+ get :new
22
+ expect(response).to be_successful
23
+ end
24
+
25
+ it "should authorize the create action with the new resource" do
26
+ expect(authorization).to receive(:authorized?).with(auth::CREATE, an_instance_of(Post)).and_return true
27
+ post :create
28
+ expect(response).to redirect_to action: 'show', id: Post.last.id
29
+ end
30
+
31
+ it "should redirect when the user isn't authorized" do
32
+ expect(authorization).to receive(:authorized?).with(auth::READ, Post).and_return false
33
+ get :index
34
+
35
+ expect(response).to redirect_to '/admin'
36
+ end
37
+
38
+ private
39
+
40
+ def auth
41
+ ActiveAdmin::Authorization
42
+ end
43
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe 'Index overriding', type: :controller do
4
+ before do
5
+ load_resources { ActiveAdmin.register Post }
6
+ @controller = Admin::PostsController.new
7
+
8
+ @controller.instance_eval do
9
+ def index
10
+ super do
11
+ render body: 'Rendered from passed block'
12
+ return
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ it 'should call block passed to overridden index' do
19
+ get :index
20
+ expect(response.body).to eq 'Rendered from passed block'
21
+ end
22
+
23
+ end
@@ -0,0 +1,103 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/view_helpers/active_admin_application_helper'
3
+ require 'active_admin/view_helpers/auto_link_helper'
4
+ require 'active_admin/view_helpers/display_helper'
5
+ require 'active_admin/view_helpers/method_or_proc_helper'
6
+
7
+ RSpec.describe "#auto_link" do
8
+ let(:view_klass) do
9
+ Class.new(ActionView::Base) do
10
+ include ActiveAdmin::ViewHelpers::ActiveAdminApplicationHelper
11
+ include ActiveAdmin::ViewHelpers::AutoLinkHelper
12
+ include ActiveAdmin::ViewHelpers::DisplayHelper
13
+ include MethodOrProcHelper
14
+ end
15
+ end
16
+
17
+ let(:view) { mock_action_view(view_klass) }
18
+
19
+ let(:linked_post) { view.auto_link(post) }
20
+
21
+ let(:active_admin_namespace){ ActiveAdmin.application.namespace(:admin) }
22
+ let(:post){ Post.create! title: "Hello World" }
23
+
24
+ before do
25
+ allow(view).to receive(:authorized?).and_return(true)
26
+ allow(view).to receive(:active_admin_namespace).and_return(active_admin_namespace)
27
+ allow(view).to receive(:url_options).and_return({})
28
+ end
29
+
30
+ context "when the resource is not registered" do
31
+ before do
32
+ load_resources {}
33
+ end
34
+
35
+ it "should return the display name of the object" do
36
+ expect(linked_post).to eq "Hello World"
37
+ end
38
+ end
39
+
40
+ context "when the resource is registered" do
41
+ before do
42
+ load_resources do
43
+ active_admin_namespace.register Post
44
+ end
45
+ end
46
+
47
+ it "should return a link with the display name of the object" do
48
+ expect(linked_post).to \
49
+ match(%r{<a href="/admin/posts/\d+">Hello World</a>})
50
+ end
51
+
52
+ it "should keep locale in the url if present" do
53
+ expect(view).to receive(:url_options).and_return(locale: 'en')
54
+
55
+ expect(linked_post).to \
56
+ match(%r{<a href="/admin/posts/\d+\?locale=en">Hello World</a>})
57
+ end
58
+
59
+ context "but the user doesn't have access" do
60
+ before do
61
+ allow(view).to receive(:authorized?).and_return(false)
62
+ end
63
+
64
+ it "should return the display name of the object" do
65
+ expect(linked_post).to eq "Hello World"
66
+ end
67
+ end
68
+ end
69
+
70
+ context "when the resource is registered with the show action disabled" do
71
+ before do
72
+ load_resources do
73
+ active_admin_namespace.register(Post) { actions :all, except: :show }
74
+ end
75
+ end
76
+
77
+ it "should fallback to edit" do
78
+ expect(linked_post).to \
79
+ match(%r{<a href="/admin/posts/\d+/edit">Hello World</a>})
80
+ end
81
+
82
+ it "should keep locale in the url if present" do
83
+ expect(view).to receive(:url_options).and_return(locale: 'en')
84
+
85
+ expect(linked_post).to \
86
+ match(%r{<a href="/admin/posts/\d+/edit\?locale=en">Hello World</a>})
87
+ end
88
+ end
89
+
90
+ context "when the resource is registered with the show & edit actions disabled" do
91
+ before do
92
+ load_resources do
93
+ active_admin_namespace.register(Post) do
94
+ actions :all, except: [:show, :edit]
95
+ end
96
+ end
97
+
98
+ it "should return the display name of the object" do
99
+ expect(linked_post).to eq "Hello World"
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,84 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::BatchActions::ResourceExtension do
4
+
5
+ let(:resource) do
6
+ namespace = ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin)
7
+ namespace.batch_actions = true
8
+ namespace.register(Post)
9
+ end
10
+
11
+ describe "default action" do
12
+
13
+ it "should have the default action by default" do
14
+ expect(resource.batch_actions.size).to eq 1
15
+ expect(resource.batch_actions.first.sym == :destroy).to eq true
16
+ end
17
+
18
+ end
19
+
20
+ describe "adding a new batch action" do
21
+
22
+ before do
23
+ resource.clear_batch_actions!
24
+ resource.add_batch_action :flag, "Flag" do
25
+ # Empty
26
+ end
27
+ end
28
+
29
+ it "should add an batch action" do
30
+ expect(resource.batch_actions.size).to eq 1
31
+ end
32
+
33
+ it "should store an instance of BatchAction" do
34
+ expect(resource.batch_actions.first).to be_an_instance_of(ActiveAdmin::BatchAction)
35
+ end
36
+
37
+ it "should store the block in the batch action" do
38
+ expect(resource.batch_actions.first.block).to_not eq nil
39
+ end
40
+
41
+ end
42
+
43
+ describe "removing batch action" do
44
+
45
+ before do
46
+ resource.remove_batch_action :destroy
47
+ end
48
+
49
+ it "should allow for batch action removal" do
50
+ expect(resource.batch_actions.size).to eq 0
51
+ end
52
+
53
+ end
54
+
55
+ describe "#display_if_block" do
56
+
57
+ it "should return true by default" do
58
+ action = ActiveAdmin::BatchAction.new :default, "Default"
59
+ expect(action.display_if_block.call).to eq true
60
+ end
61
+
62
+ it "should return the :if block if set" do
63
+ action = ActiveAdmin::BatchAction.new :with_block, "With Block", if: proc { false }
64
+ expect(action.display_if_block.call).to eq false
65
+ end
66
+
67
+ end
68
+
69
+ describe "batch action priority" do
70
+
71
+ it "should have a default priority" do
72
+ action = ActiveAdmin::BatchAction.new :default, "Default"
73
+ expect(action.priority).to eq 10
74
+ end
75
+
76
+ it "should correctly order two actions" do
77
+ priority_one = ActiveAdmin::BatchAction.new :one, "One", priority: 1
78
+ priority_ten = ActiveAdmin::BatchAction.new :ten, "Ten", priority: 10
79
+ expect(priority_one).to be < priority_ten
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,61 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Batch Actions Settings" do
4
+ let(:app) { ActiveAdmin::Application.new }
5
+ let(:ns) { ActiveAdmin::Namespace.new(app, "Admin") }
6
+ let(:post_resource) { ns.register Post }
7
+
8
+ it "should be disabled globally by default" do
9
+ # Note: the default initializer would set it to true
10
+
11
+ expect(app.batch_actions).to eq false
12
+ expect(ns.batch_actions).to eq false
13
+ expect(post_resource.batch_actions_enabled?).to eq false
14
+ end
15
+
16
+ it "should be settable to true" do
17
+ app.batch_actions = true
18
+ expect(app.batch_actions).to eq true
19
+ end
20
+
21
+ it "should be an inheritable_setting" do
22
+ app.batch_actions = true
23
+ expect(ns.batch_actions).to eq true
24
+ end
25
+
26
+ it "should be settable at the namespace level" do
27
+ app.batch_actions = true
28
+ ns.batch_actions = false
29
+
30
+ expect(app.batch_actions).to eq true
31
+ expect(ns.batch_actions).to eq false
32
+ end
33
+
34
+ it "should be settable at the resource level" do
35
+ expect(post_resource.batch_actions_enabled?).to eq false
36
+ post_resource.batch_actions = true
37
+ expect(post_resource.batch_actions_enabled?).to eq true
38
+ end
39
+
40
+ it "should inherit the setting on the resource from the namespace" do
41
+ ns.batch_actions = false
42
+ expect(post_resource.batch_actions_enabled?).to eq false
43
+ expect(post_resource.batch_actions).to be_empty
44
+
45
+ post_resource.batch_actions = true
46
+ expect(post_resource.batch_actions_enabled?).to eq true
47
+ expect(post_resource.batch_actions).to_not be_empty
48
+ end
49
+
50
+ it "should inherit the setting from the namespace when set to nil" do
51
+ ns.batch_actions = true
52
+
53
+ post_resource.batch_actions = true
54
+ expect(post_resource.batch_actions_enabled?).to eq true
55
+ expect(post_resource.batch_actions).to_not be_empty
56
+
57
+ post_resource.batch_actions = nil
58
+ expect(post_resource.batch_actions_enabled?).to eq true # inherited from namespace
59
+ expect(post_resource.batch_actions).to_not be_empty
60
+ end
61
+ end
@@ -0,0 +1,76 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Resource::BelongsTo do
4
+ before do
5
+ load_resources do
6
+ ActiveAdmin.register User
7
+ ActiveAdmin.register Post do belongs_to :user end
8
+ end
9
+ end
10
+
11
+ let(:namespace) { ActiveAdmin.application.namespace(:admin) }
12
+ let(:user_config){ ActiveAdmin.register User }
13
+ let(:post_config){ ActiveAdmin.register Post do belongs_to :user end }
14
+ let(:belongs_to){ post_config.belongs_to_config }
15
+
16
+ it "should have an owner" do
17
+ expect(belongs_to.owner).to eq post_config
18
+ end
19
+
20
+ describe "finding the target" do
21
+ context "when the resource has been registered" do
22
+ it "should return the target resource" do
23
+ expect(belongs_to.target).to eq user_config
24
+ end
25
+ end
26
+
27
+ context "when the resource has not been registered" do
28
+ let(:belongs_to){ ActiveAdmin::Resource::BelongsTo.new post_config, :missing }
29
+
30
+ it "should raise a ActiveAdmin::BelongsTo::TargetNotFound" do
31
+ expect {
32
+ belongs_to.target
33
+ }.to raise_error(ActiveAdmin::Resource::BelongsTo::TargetNotFound)
34
+ end
35
+ end
36
+
37
+ context "when the resource is on a namespace" do
38
+ let(:blog_post_config){ ActiveAdmin.register Blog::Post do; end }
39
+ let(:belongs_to) { ActiveAdmin::Resource::BelongsTo.new blog_post_config, :blog_author, class_name: "Blog::Author" }
40
+ before do
41
+ class Blog::Author
42
+ include ActiveModel::Naming
43
+ end
44
+ @blog_author_config = ActiveAdmin.register Blog::Author do; end
45
+ end
46
+ it "should return the target resource" do
47
+ expect(belongs_to.target).to eq @blog_author_config
48
+ end
49
+ end
50
+ end
51
+
52
+ it "should be optional" do
53
+ belongs_to = ActiveAdmin::Resource::BelongsTo.new post_config, :user, optional: true
54
+ expect(belongs_to).to be_optional
55
+ end
56
+
57
+ describe "controller" do
58
+ let(:controller) { post_config.controller.new }
59
+ let(:http_params) { {user_id: user.id} }
60
+ let(:user) { User.create! }
61
+
62
+ before do
63
+ request = double 'Request', format: 'application/json'
64
+ allow(controller).to receive(:params) { ActionController::Parameters.new(http_params) }
65
+ allow(controller).to receive(:request){ request }
66
+ end
67
+
68
+ it 'should be able to access the collection' do
69
+ expect(controller.send :collection).to be_a ActiveRecord::Relation
70
+
71
+ end
72
+ it 'should be able to build a new resource' do
73
+ expect(controller.send :build_resource).to be_a Post
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,43 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::CanCanAdapter do
4
+
5
+ describe "full integration" do
6
+
7
+ let(:application){ ActiveAdmin::Application.new }
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, "Admin") }
9
+ let(:resource){ namespace.register(Post) }
10
+
11
+ let :ability_class do
12
+ Class.new do
13
+ include CanCan::Ability
14
+
15
+ def initialize(user)
16
+ can :read, Post
17
+ cannot :update, Post
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+ let(:auth) { namespace.authorization_adapter.new(resource, double) }
24
+
25
+ before do
26
+ namespace.authorization_adapter = ActiveAdmin::CanCanAdapter
27
+ namespace.cancan_ability_class = ability_class
28
+ end
29
+
30
+ it "should initialize the ability stored in the namespace configuration" do
31
+ expect(auth.authorized?(:read, Post)).to eq true
32
+ expect(auth.authorized?(:update, Post)).to eq false
33
+ end
34
+
35
+ it "should scope the collection with accessible_by" do
36
+ collection = double
37
+ expect(collection).to receive(:accessible_by).with(auth.cancan_ability, :edit)
38
+ auth.scope_collection(collection, :edit)
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,204 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Comments" do
4
+ let(:application) { ActiveAdmin::Application.new }
5
+
6
+ describe ActiveAdmin::Comment do
7
+ let(:comment){ ActiveAdmin::Comment.new }
8
+
9
+ let(:user) { User.create!(first_name: "John", last_name: "Doe") }
10
+
11
+ let(:post) { Post.create!(title: "Hello World") }
12
+
13
+ it "belongs to a resource" do
14
+ comment.assign_attributes(resource_type: "Post", resource_id: post.id)
15
+
16
+ expect(comment.resource).to eq(post)
17
+ end
18
+
19
+ it "belongs to an author" do
20
+ comment.assign_attributes(author_type: "User", author_id: user.id)
21
+
22
+ expect(comment.author).to eq(user)
23
+ end
24
+
25
+ it "needs a body" do
26
+ expect(comment).to_not be_valid
27
+ expect(comment.errors[:body]).to eq(["can't be blank"])
28
+ end
29
+
30
+ it "needs a namespace" do
31
+ expect(comment).to_not be_valid
32
+ expect(comment.errors[:namespace]).to eq(["can't be blank"])
33
+ end
34
+
35
+ it "needs a resource" do
36
+ expect(comment).to_not be_valid
37
+ expect(comment.errors[:resource]).to eq(["can't be blank"])
38
+ end
39
+
40
+ describe ".find_for_resource_in_namespace" do
41
+ let(:namespace_name) { "admin" }
42
+
43
+ before do
44
+ @comment = ActiveAdmin::Comment.create! author: user,
45
+ resource: post,
46
+ body: "A Comment",
47
+ namespace: namespace_name
48
+ end
49
+
50
+ it "should return a comment for the resource in the same namespace" do
51
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)).to eq [@comment]
52
+ end
53
+
54
+ it "should not return a comment for the same resource in a different namespace" do
55
+ ActiveAdmin.application.namespaces[:public] = ActiveAdmin.application.namespaces[:admin]
56
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(post, 'public')).to eq []
57
+ ActiveAdmin.application.namespaces.instance_variable_get(:@namespaces).delete(:public)
58
+ end
59
+
60
+ it "should not return a comment for a different resource" do
61
+ another_post = Post.create! title: "Another Hello World"
62
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(another_post, namespace_name)).to eq []
63
+ end
64
+
65
+ it "should return the most recent comment first by default" do
66
+ another_comment = ActiveAdmin::Comment.create! author: user,
67
+ resource: post,
68
+ body: "Another Comment",
69
+ namespace: namespace_name,
70
+ created_at: @comment.created_at + 20.minutes
71
+
72
+ yet_another_comment = ActiveAdmin::Comment.create! author: user,
73
+ resource: post,
74
+ body: "Yet Another Comment",
75
+ namespace: namespace_name,
76
+ created_at: @comment.created_at + 10.minutes
77
+
78
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(post, namespace_name)
79
+ expect(comments.size).to eq 3
80
+ expect(comments.first).to eq(@comment)
81
+ expect(comments.second).to eq(yet_another_comment)
82
+ expect(comments.last).to eq(another_comment)
83
+ end
84
+
85
+ context "when custom ordering configured" do
86
+ around do |example|
87
+ previous_order = ActiveAdmin.application.comments_order
88
+ ActiveAdmin.application.comments_order = "created_at DESC"
89
+
90
+ example.call
91
+
92
+ ActiveAdmin.application.comments_order = previous_order
93
+ end
94
+
95
+ it "should return the correctly ordered comments" do
96
+ another_comment = ActiveAdmin::Comment.create!(
97
+ author: user,
98
+ resource: post,
99
+ body: "Another Comment",
100
+ namespace: namespace_name,
101
+ created_at: @comment.created_at + 20.minutes
102
+ )
103
+
104
+ comments = ActiveAdmin::Comment.find_for_resource_in_namespace(
105
+ post, namespace_name
106
+ )
107
+ expect(comments.size).to eq 2
108
+ expect(comments.first).to eq(another_comment)
109
+ expect(comments.last).to eq(@comment)
110
+ end
111
+ end
112
+ end
113
+
114
+ describe ".resource_type" do
115
+ let(:post) { Post.create!(title: "Testing.") }
116
+ let(:post_decorator) { double 'PostDecorator' }
117
+
118
+ before do
119
+ allow(post_decorator).to receive(:model).and_return(post)
120
+ allow(post_decorator).to receive(:decorated?).and_return(true)
121
+ end
122
+
123
+ context "when a decorated object is passed" do
124
+ let(:resource) { post_decorator }
125
+
126
+ it "returns undeorated object class string" do
127
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
128
+ end
129
+ end
130
+
131
+ context "when an undecorated object is passed" do
132
+ let(:resource) { post }
133
+
134
+ it "returns object class string" do
135
+ expect(ActiveAdmin::Comment.resource_type resource).to eql 'Post'
136
+ end
137
+ end
138
+ end
139
+
140
+ describe "Commenting on resource with string id" do
141
+ let(:tag) { Tag.create!(name: "cooltags") }
142
+ let(:namespace_name) { "admin" }
143
+
144
+ it "should allow commenting" do
145
+ comment = ActiveAdmin::Comment.create!(
146
+ author: user,
147
+ resource: tag,
148
+ body: "Another Comment",
149
+ namespace: namespace_name)
150
+
151
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(tag, namespace_name)).to eq [comment]
152
+ end
153
+ end
154
+
155
+ describe "commenting on child of STI resource" do
156
+ let(:publisher) { Publisher.create!(username: "tenderlove") }
157
+ let(:namespace_name) { "admin" }
158
+
159
+ it "should assign child class as commented resource" do
160
+ comment = ActiveAdmin::Comment.create!(
161
+ author: user,
162
+ resource: publisher,
163
+ body: "Lorem Ipsum",
164
+ namespace: namespace_name)
165
+
166
+ expect(ActiveAdmin::Comment.find_for_resource_in_namespace(publisher, namespace_name).last.resource_type).
167
+ to eq("User")
168
+ end
169
+ end
170
+ end
171
+
172
+ describe ActiveAdmin::Comments::NamespaceHelper do
173
+ describe "#comments?" do
174
+
175
+ it "should have comments when the namespace allows comments" do
176
+ ns = ActiveAdmin::Namespace.new(application, :admin)
177
+ ns.comments = true
178
+ expect(ns.comments?).to eq true
179
+ end
180
+
181
+ it "should not have comments when the namespace does not allow comments" do
182
+ ns = ActiveAdmin::Namespace.new(application, :admin)
183
+ ns.comments = false
184
+ expect(ns.comments?).to eq false
185
+ end
186
+ end
187
+ end
188
+
189
+ describe ActiveAdmin::Comments::ResourceHelper do
190
+ it "should add an attr_accessor :comments to ActiveAdmin::Resource" do
191
+ ns = ActiveAdmin::Namespace.new(application, :admin)
192
+ resource = ActiveAdmin::Resource.new(ns, Post)
193
+ expect(resource.comments).to eq nil
194
+ resource.comments = true
195
+ expect(resource.comments).to eq true
196
+ end
197
+ it "should disable comments if set to false" do
198
+ ns = ActiveAdmin::Namespace.new(application, :admin)
199
+ resource = ActiveAdmin::Resource.new(ns, Post)
200
+ resource.comments = false
201
+ expect(resource.comments?).to eq false
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails_helper'
2
+
3
+ class MockComponentClass < ActiveAdmin::Component; end
4
+
5
+ RSpec.describe ActiveAdmin::Component do
6
+
7
+ let(:component_class){ MockComponentClass }
8
+ let(:component){ component_class.new }
9
+
10
+ it "should be a subclass of an html div" do
11
+ expect(ActiveAdmin::Component.ancestors).to include(Arbo::HTML::Div)
12
+ end
13
+
14
+ it "should render to a div, even as a subclass" do
15
+ expect(component.tag_name).to eq 'div'
16
+ end
17
+
18
+ end