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,132 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Namespace do
4
+
5
+ let(:application){ ActiveAdmin::Application.new }
6
+
7
+ context "when new" do
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
9
+
10
+ it "should have an application instance" do
11
+ expect(namespace.application).to eq application
12
+ end
13
+
14
+ it "should have a name" do
15
+ expect(namespace.name).to eq :admin
16
+ end
17
+
18
+ it "should have no resources" do
19
+ expect(namespace.resources).to be_empty
20
+ end
21
+
22
+ it "should not have any menu item" do
23
+ expect(namespace.fetch_menu(:default).children).to be_empty
24
+ end
25
+ end # context "when new"
26
+
27
+ describe "#unload!" do
28
+ context "when controller is only defined without a namespace" do
29
+ before do
30
+ # To ensure Admin::PostsController is defined
31
+ ActiveAdmin.register Post
32
+
33
+ # To ensure ::PostsController is defined
34
+ ActiveAdmin.register Post, namespace: false
35
+
36
+ # To prevent unload! from unregistering ::PostsController
37
+ ActiveAdmin.application.namespaces.instance_variable_get(:@namespaces).delete(:root)
38
+
39
+ # To force Admin::PostsController to not be there
40
+ Admin.send(:remove_const, 'PostsController')
41
+ end
42
+
43
+ it "should not crash" do
44
+ expect { ActiveAdmin.unload! }.not_to raise_error
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "settings" do
50
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
51
+
52
+ it "should inherit the site title from the application" do
53
+ if Rails.gem_version >= Gem::Version.new("7.1.0")
54
+ Rails.application.deprecators.silence do
55
+ ActiveAdmin::Namespace.setting :site_title, "Not the Same"
56
+ end
57
+ else
58
+ ActiveSupport::Deprecation.silence do
59
+ ActiveAdmin::Namespace.setting :site_title, "Not the Same"
60
+ end
61
+ end
62
+ expect(namespace.site_title).to eq application.site_title
63
+ end
64
+
65
+ it "should be able to override the site title" do
66
+ expect(namespace.site_title).to eq application.site_title
67
+ namespace.site_title = "My Site Title"
68
+ expect(namespace.site_title).to_not eq application.site_title
69
+ end
70
+ end
71
+
72
+ describe "#fetch_menu" do
73
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
74
+
75
+ it "returns the menu" do
76
+ expect(namespace.fetch_menu(:default)).to be_an_instance_of(ActiveAdmin::Menu)
77
+ end
78
+
79
+ it "should have utility nav menu" do
80
+ expect(namespace.fetch_menu(:utility_navigation)).to be_an_instance_of(ActiveAdmin::Menu)
81
+ end
82
+
83
+ it "should raise an exception if the menu doesn't exist" do
84
+ expect {
85
+ namespace.fetch_menu(:not_a_menu_that_exists)
86
+ }.to raise_error(KeyError)
87
+ end
88
+ end
89
+
90
+ describe "#build_menu" do
91
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
92
+
93
+ it "should set the block as a menu build callback" do
94
+ namespace.build_menu do |menu|
95
+ menu.add label: "menu item"
96
+ end
97
+
98
+ expect(namespace.fetch_menu(:default)["menu item"]).to_not eq nil
99
+ end
100
+
101
+ it "should set a block on a custom menu" do
102
+ namespace.build_menu :test do |menu|
103
+ menu.add label: "menu item"
104
+ end
105
+
106
+ expect(namespace.fetch_menu(:test)["menu item"]).to_not eq nil
107
+ end
108
+ end
109
+
110
+ describe "utility navigation" do
111
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
112
+ let(:menu) do
113
+ namespace.build_menu :utility_navigation do |menu|
114
+ menu.add label: "ActiveAdmin.org", url: "http://www.activeadmin.org", html_options: { target: :blank }
115
+ namespace.add_logout_button_to_menu menu, 1, class: "matt"
116
+ end
117
+ namespace.fetch_menu(:utility_navigation)
118
+ end
119
+
120
+ it "should have a logout button to the far left" do
121
+ expect(menu["Logout"]).to_not eq nil
122
+ expect(menu["Logout"].priority).to eq 1
123
+ end
124
+
125
+ it "should have a static link with a target of :blank" do
126
+ expect(menu["ActiveAdmin.org"]).to_not eq nil
127
+ expect(menu["ActiveAdmin.org"].html_options).to include(target: :blank)
128
+ end
129
+
130
+ end
131
+
132
+ end
@@ -0,0 +1,81 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::OrderClause do
4
+ subject { described_class.new(config, clause) }
5
+
6
+ let(:application) { ActiveAdmin::Application.new }
7
+ let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
8
+ let(:config) { ActiveAdmin::Resource.new namespace, Post }
9
+
10
+ describe 'id_asc (existing column)' do
11
+ let(:clause) { 'id_asc' }
12
+
13
+ it { is_expected.to be_valid }
14
+
15
+ describe '#field' do
16
+ subject { super().field }
17
+ it { is_expected.to eq('id') }
18
+ end
19
+
20
+ describe '#order' do
21
+ subject { super().order }
22
+ it { is_expected.to eq('asc') }
23
+ end
24
+
25
+ specify '#to_sql prepends table name' do
26
+ expect(subject.to_sql).to eq '"posts"."id" asc'
27
+ end
28
+ end
29
+
30
+ describe 'virtual_column_asc' do
31
+ let(:clause) { 'virtual_column_asc' }
32
+
33
+ it { is_expected.to be_valid }
34
+
35
+ describe '#field' do
36
+ subject { super().field }
37
+ it { is_expected.to eq('virtual_column') }
38
+ end
39
+
40
+ describe '#order' do
41
+ subject { super().order }
42
+ it { is_expected.to eq('asc') }
43
+ end
44
+
45
+ specify '#to_sql' do
46
+ expect(subject.to_sql).to eq '"virtual_column" asc'
47
+ end
48
+ end
49
+
50
+ describe "hstore_col->'field'_desc" do
51
+ let(:clause) { "hstore_col->'field'_desc" }
52
+
53
+ it { is_expected.to be_valid }
54
+
55
+ describe '#field' do
56
+ subject { super().field }
57
+ it { is_expected.to eq("hstore_col->'field'") }
58
+ end
59
+
60
+ describe '#order' do
61
+ subject { super().order }
62
+ it { is_expected.to eq('desc') }
63
+ end
64
+
65
+ it 'converts to sql' do
66
+ expect(subject.to_sql).to eq %Q("hstore_col"->'field' desc)
67
+ end
68
+ end
69
+
70
+ describe '_asc' do
71
+ let(:clause) { '_asc' }
72
+
73
+ it { is_expected.not_to be_valid }
74
+ end
75
+
76
+ describe 'nil' do
77
+ let(:clause) { nil }
78
+
79
+ it { is_expected.not_to be_valid }
80
+ end
81
+ end
@@ -0,0 +1,5 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::PageController do
4
+ let(:controller) { ActiveAdmin::PageController.new }
5
+ end
@@ -0,0 +1,128 @@
1
+ require 'rails_helper'
2
+ require File.expand_path('config_shared_examples', File.dirname(__FILE__))
3
+
4
+ module ActiveAdmin
5
+ RSpec.describe Page do
6
+
7
+ it_should_behave_like "ActiveAdmin::Resource"
8
+ before { load_defaults! }
9
+
10
+ let(:application){ ActiveAdmin::Application.new }
11
+ let(:namespace){ Namespace.new(application, :admin) }
12
+ let(:page_name) { "Chocolate I lØve You!" }
13
+
14
+ def config(options = {})
15
+ @config ||= namespace.register_page("Chocolate I lØve You!", options)
16
+ end
17
+
18
+ describe "controller name" do
19
+ it "should return a namespaced controller name" do
20
+ expect(config.controller_name).to eq "Admin::ChocolateILoveYouController"
21
+ end
22
+ context "when non namespaced controller" do
23
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :root) }
24
+ it "should return a non namespaced controller name" do
25
+ expect(config.controller_name).to eq "ChocolateILoveYouController"
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#resource_name" do
31
+ it "returns the name" do
32
+ expect(config.resource_name).to eq "Chocolate I lØve You!"
33
+ end
34
+
35
+ it "returns the singular, lowercase name" do
36
+ if RUBY_VERSION >= '2.4.0'
37
+ expect(config.resource_name.singular).to eq "chocolate i løve you!"
38
+ else
39
+ expect(config.resource_name.singular).to eq "chocolate i lØve you!"
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#plural_resource_label" do
45
+ it "returns the singular name" do
46
+ expect(config.plural_resource_label).to eq "Chocolate I lØve You!"
47
+ end
48
+ end
49
+
50
+ describe "#underscored_resource_name" do
51
+ it "returns the resource name underscored" do
52
+ expect(config.underscored_resource_name).to eq "chocolate_i_love_you"
53
+ end
54
+ end
55
+
56
+ describe "#camelized_resource_name" do
57
+ it "returns the resource name camel case" do
58
+ expect(config.camelized_resource_name).to eq "ChocolateILoveYou"
59
+ end
60
+ end
61
+
62
+ describe "#namespace_name" do
63
+ it "returns the name of the namespace" do
64
+ expect(config.namespace_name).to eq "admin"
65
+ end
66
+ end
67
+
68
+ it "should not belong_to anything" do
69
+ expect(config.belongs_to?).to eq false
70
+ end
71
+
72
+ it "should not have any action_items" do
73
+ expect(config.action_items?).to eq false
74
+ end
75
+
76
+ it "should not have any sidebar_sections" do
77
+ expect(config.sidebar_sections?).to eq false
78
+ end
79
+
80
+ context "with belongs to config" do
81
+ let!(:post_config) { namespace.register Post }
82
+ let!(:page_config) {
83
+ namespace.register_page page_name do
84
+ belongs_to :post
85
+ end
86
+ }
87
+
88
+ it "configures page with belongs_to" do
89
+ expect(page_config.belongs_to?).to be true
90
+ end
91
+
92
+ it "sets navigation menu to parent" do
93
+ expect(page_config.navigation_menu_name).to eq :post
94
+ end
95
+
96
+ it "builds a belongs_to relationship" do
97
+ belongs_to = page_config.belongs_to_config
98
+
99
+ expect(belongs_to.target).to eq(post_config)
100
+ expect(belongs_to.owner).to eq(page_config)
101
+ expect(belongs_to.optional?).to be_falsy
102
+ end
103
+
104
+ it "forwards belongs_to call to controller" do
105
+ options = { optional: true }
106
+ expect(page_config.controller).to receive(:belongs_to).with(:post, options)
107
+ page_config.belongs_to :post, options
108
+ end
109
+ end # context "with belongs to config" do
110
+
111
+ context "with optional belongs to config" do
112
+ let!(:post_config) { namespace.register Post }
113
+ let!(:page_config) {
114
+ namespace.register_page page_name do
115
+ belongs_to :post, optional: true
116
+ end
117
+ }
118
+
119
+ it "does not override default navigation menu" do
120
+ expect(page_config.navigation_menu_name).to eq(:default)
121
+ end
122
+ end # context "with optional belongs to config" do
123
+
124
+ it "has no belongs_to by default" do
125
+ expect(config.belongs_to?).to be_falsy
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,133 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/view_helpers/display_helper'
3
+
4
+ RSpec.describe "#pretty_format" do
5
+ let(:view_klass) do
6
+ Class.new(ActionView::Base) do
7
+ include ActiveAdmin::ViewHelpers
8
+ end
9
+ end
10
+
11
+ let(:view) { mock_action_view(view_klass) }
12
+
13
+ let(:formatted_obj) { view.pretty_format(obj) }
14
+
15
+ shared_examples_for 'an object convertible to string' do
16
+ it "should call `to_s` on the given object" do
17
+ expect(formatted_obj).to eq obj.to_s
18
+ end
19
+ end
20
+
21
+ context 'when given a string' do
22
+ let(:obj) { 'hello' }
23
+
24
+ it_behaves_like 'an object convertible to string'
25
+ end
26
+
27
+ context 'when given an integer' do
28
+ let(:obj) { 23 }
29
+
30
+ it_behaves_like 'an object convertible to string'
31
+ end
32
+
33
+ context 'when given a float' do
34
+ let(:obj) { 5.67 }
35
+
36
+ it_behaves_like 'an object convertible to string'
37
+ end
38
+
39
+ context 'when given an exponential' do
40
+ let(:obj) { 10**30 }
41
+
42
+ it_behaves_like 'an object convertible to string'
43
+ end
44
+
45
+ context 'when given a symbol' do
46
+ let(:obj) { :foo }
47
+
48
+ it_behaves_like 'an object convertible to string'
49
+ end
50
+
51
+ context 'when given an arbo element' do
52
+ let(:obj) { Arbo::Element.new.br }
53
+
54
+ it_behaves_like 'an object convertible to string'
55
+ end
56
+
57
+ shared_examples_for 'a time-ish object' do
58
+ it "formats it with the default long format" do
59
+ expect(formatted_obj).to eq "February 28, 1985 20:15"
60
+ end
61
+
62
+ it "formats it with a customized long format" do
63
+ with_translation time: { formats: { long: "%B %d, %Y, %l:%M%P" } } do
64
+ expect(formatted_obj).to eq "February 28, 1985, 8:15pm"
65
+ end
66
+ end
67
+
68
+ context "with a custom localize format" do
69
+ around do |example|
70
+ previous_localize_format = ActiveAdmin.application.localize_format
71
+ ActiveAdmin.application.localize_format = :short
72
+ example.call
73
+ ActiveAdmin.application.localize_format = previous_localize_format
74
+ end
75
+
76
+ it "formats it with the default custom format" do
77
+ expect(formatted_obj).to eq "28 Feb 20:15"
78
+ end
79
+
80
+ it "formats it with i18n custom format" do
81
+ with_translation time: { formats: { short: "%-m %d %Y" } } do
82
+ expect(formatted_obj).to eq "2 28 1985"
83
+ end
84
+ end
85
+ end
86
+
87
+ context "with non-English locale" do
88
+ around do |example|
89
+ I18n.with_locale(:es) { example.call }
90
+ end
91
+
92
+ it "formats it with the default long format" do
93
+ expect(formatted_obj).to eq "28 de febrero de 1985 20:15"
94
+ end
95
+
96
+ it "formats it with a customized long format" do
97
+ with_translation time: { formats: { long: "El %d de %B de %Y a las %H horas y %M minutos" } } do
98
+ expect(formatted_obj).to eq "El 28 de febrero de 1985 a las 20 horas y 15 minutos"
99
+ end
100
+ end
101
+ end
102
+ end
103
+
104
+ context 'when given a Time in utc' do
105
+ let(:obj) { Time.utc(1985, "feb", 28, 20, 15, 1) }
106
+
107
+ it_behaves_like 'a time-ish object'
108
+ end
109
+
110
+ context 'when given a DateTime' do
111
+ let(:obj) { DateTime.new(1985, 2, 28, 20, 15, 1) }
112
+
113
+ it_behaves_like 'a time-ish object'
114
+ end
115
+
116
+ context "given an ActiveRecord object" do
117
+ let(:obj) { Post.new }
118
+
119
+ it "should delegate to auto_link" do
120
+ expect(view).to receive(:auto_link).with(obj).and_return("model name")
121
+ expect(formatted_obj).to eq "model name"
122
+ end
123
+ end
124
+
125
+ context "given an arbitrary object" do
126
+ let(:obj) { Class.new.new }
127
+
128
+ it "should delegate to `display_name`" do
129
+ expect(view).to receive(:display_name).with(obj) { "I'm not famous" }
130
+ expect(formatted_obj).to eq "I'm not famous"
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,98 @@
1
+ require 'rails_helper'
2
+
3
+ class DefaultPolicy < ApplicationPolicy
4
+ def respond_to_missing?(method, include_private = false)
5
+ method.to_s[0...3] == "foo" || super
6
+ end
7
+
8
+ def method_missing(method, *args, &block)
9
+ if method.to_s[0...3] == "foo"
10
+ method.to_s[4...7] == "yes"
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ class Scope
17
+
18
+ attr_reader :user, :scope
19
+
20
+ def initialize(user, scope)
21
+ @user = user
22
+ @scope = scope
23
+ end
24
+
25
+ def resolve
26
+ scope
27
+ end
28
+ end
29
+ end
30
+
31
+ RSpec.describe ActiveAdmin::PunditAdapter do
32
+
33
+ describe "full integration" do
34
+
35
+ let(:application) { ActiveAdmin::Application.new }
36
+ let(:namespace) { ActiveAdmin::Namespace.new(application, "Admin") }
37
+ let(:resource) { namespace.register(Post) }
38
+ let(:auth) { namespace.authorization_adapter.new(resource, double) }
39
+ let(:default_policy_klass) { DefaultPolicy }
40
+ let(:default_policy_klass_name) { "DefaultPolicy" }
41
+
42
+ before do
43
+ namespace.authorization_adapter = ActiveAdmin::PunditAdapter
44
+ end
45
+
46
+ it "should initialize the ability stored in the namespace configuration" do
47
+ expect(auth.authorized?(:read, Post)).to eq true
48
+ expect(auth.authorized?(:update, Post)).to eq false
49
+ end
50
+
51
+ it "should scope the collection" do
52
+ class RSpec::Mocks::DoublePolicy < ApplicationPolicy
53
+ class Scope < Struct.new(:user, :scope)
54
+ def resolve
55
+ scope
56
+ end
57
+ end
58
+ end
59
+
60
+ collection = double
61
+ auth.scope_collection(collection, :read)
62
+ expect(collection).to eq collection
63
+ end
64
+
65
+ it "works well with method_missing" do
66
+ allow(auth).to receive(:retrieve_policy).and_return(DefaultPolicy.new(double, double))
67
+ expect(auth.authorized?(:foo_no)).to eq false
68
+ expect(auth.authorized?(:foo_yes)).to eq true
69
+ expect(auth.authorized?(:bar_yes)).to eq false
70
+ end
71
+
72
+ context 'when Pundit is unable to find policy scope' do
73
+ let(:collection) { double("collection", to_sym: :collection) }
74
+ subject(:scope) { auth.scope_collection(collection, :read) }
75
+
76
+ before do
77
+ allow(ActiveAdmin.application).to receive(:pundit_default_policy).and_return default_policy_klass_name
78
+ allow(Pundit).to receive(:policy_scope!) { raise Pundit::NotDefinedError.new }
79
+ end
80
+
81
+ it("should return default policy's scope if defined") { is_expected.to eq(collection) }
82
+ end
83
+
84
+ context "when Pundit is unable to find policy" do
85
+ let(:record) { double }
86
+
87
+ subject(:policy) { auth.retrieve_policy(record) }
88
+
89
+ before do
90
+ allow(ActiveAdmin.application).to receive(:pundit_default_policy).and_return default_policy_klass_name
91
+ allow(Pundit).to receive(:policy!) { raise Pundit::NotDefinedError.new }
92
+ end
93
+
94
+ it("should return default policy instance") { is_expected.to be_instance_of(default_policy_klass) }
95
+ end
96
+ end
97
+
98
+ end
@@ -0,0 +1,83 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Resource::ActionItems do
4
+
5
+ let(:resource) do
6
+ namespace = ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin)
7
+ namespace.register(Post)
8
+ end
9
+
10
+ describe "adding a new action item" do
11
+
12
+ before do
13
+ resource.clear_action_items!
14
+ resource.add_action_item :empty, class: :test do
15
+ # Empty ...
16
+ end
17
+ end
18
+
19
+ it "should add an action item" do
20
+ expect(resource.action_items.size).to eq 1
21
+ end
22
+
23
+ it "should store an instance of ActionItem" do
24
+ expect(resource.action_items.first).to be_an_instance_of(ActiveAdmin::ActionItem)
25
+ end
26
+
27
+ it "should store the block in the action item" do
28
+ expect(resource.action_items.first.block).to_not eq nil
29
+ end
30
+
31
+ it "should include class from options" do
32
+ expect(resource.action_items.first.html_class).to eq("action_item test")
33
+ end
34
+
35
+ it 'should be ordered by priority' do
36
+ resource.add_action_item :first, priority: 0 do
37
+ # Empty ...
38
+ end
39
+ resource.add_action_item :some_other do
40
+ # Empty ...
41
+ end
42
+ resource.add_action_item :second, priority: 1 do
43
+ # Empty ...
44
+ end
45
+
46
+ expect(resource.action_items_for(:index).collect(&:name)).to eq [:first, :second, :empty, :some_other]
47
+ end
48
+
49
+ end
50
+
51
+ describe "setting an action item to only display on specific controller actions" do
52
+
53
+ before do
54
+ resource.clear_action_items!
55
+ resource.add_action_item :new, only: :index do
56
+ raise StandardError
57
+ end
58
+ resource.add_action_item :edit, only: :show do
59
+ # Empty ...
60
+ end
61
+ end
62
+
63
+ it "should return only relevant action items" do
64
+ expect(resource.action_items_for(:index).size).to eq 1
65
+ expect {
66
+ resource.action_items_for(:index).first.call
67
+ }.to raise_exception(StandardError)
68
+ end
69
+
70
+ end
71
+
72
+ describe "default action items" do
73
+ it "should have 3 action items" do
74
+ expect(resource.action_items.size).to eq 3
75
+ end
76
+
77
+ it 'can be removed by name' do
78
+ resource.remove_action_item :new
79
+ expect(resource.action_items.size).to eq 2
80
+ end
81
+ end
82
+
83
+ end