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,31 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "AA installation" do
4
+ context "should create" do
5
+
6
+ it "active_admin.scss" do
7
+ path = Rails.root + "app/assets/stylesheets/active_admin.scss"
8
+
9
+ expect(File.exist?(path)).to eq true
10
+ end
11
+
12
+ it "active_admin.js" do
13
+ path = Rails.root + "app/assets/javascripts/active_admin.js"
14
+
15
+ expect(File.exist?(path)).to eq true
16
+ end
17
+
18
+ it "the dashboard" do
19
+ path = Rails.root + "app/admin/dashboard.rb"
20
+
21
+ expect(File.exist?(path)).to eq true
22
+ end
23
+
24
+ it "the initializer" do
25
+ path = Rails.root + "config/initializers/active_admin.rb"
26
+
27
+ expect(File.exist?(path)).to eq true
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,68 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Helpers::Collection do
4
+
5
+ include ActiveAdmin::Helpers::Collection
6
+
7
+ before do
8
+ Post.create!(title: "A post")
9
+ Post.create!(title: "A post")
10
+ Post.create!(title: "An other post")
11
+ end
12
+
13
+ describe "#collection_size" do
14
+ it "should return the collection size for an ActiveRecord class" do
15
+ expect(collection_size(Post.where(nil))).to eq 3
16
+ end
17
+
18
+ it "should return the collection size for an ActiveRecord::Relation" do
19
+ expect(collection_size(Post.where(title: "A post"))).to eq 2
20
+ end
21
+
22
+ it "should return the collection size for a collection with group by" do
23
+ expect(collection_size(Post.group(:title))).to eq 2
24
+ end
25
+
26
+ it "should return the collection size for a collection with group by, select and custom order" do
27
+ expect(collection_size(Post.select("title, count(*) as nb_posts").group(:title).order("nb_posts"))).to eq 2
28
+ end
29
+
30
+ it "should return the collection size for an Array" do
31
+ expect(collection_size(Post.where(title: "A post").to_a)).to eq 2
32
+ end
33
+
34
+ it "should take the defined collection by default" do
35
+ def collection; Post.where(nil); end
36
+
37
+ expect(collection_size).to eq 3
38
+
39
+ def collection; Post.where(title: "An other post"); end
40
+
41
+ expect(collection_size).to eq 1
42
+
43
+ def collection; Post.where(title: "A post").to_a end
44
+
45
+ expect(collection_size).to eq 2
46
+ end
47
+ end
48
+
49
+ describe "#collection_is_empty?" do
50
+ it "should return true when the collection is empty" do
51
+ expect(collection_is_empty?(Post.where(title: "Non existing post"))).to eq true
52
+ end
53
+
54
+ it "should return false when the collection is not empty" do
55
+ expect(collection_is_empty?(Post.where(title: "A post"))).to eq false
56
+ end
57
+
58
+ it "should take the defined collection by default" do
59
+ def collection; Post.where(nil); end
60
+
61
+ expect(collection_is_empty?).to eq false
62
+
63
+ def collection; Post.where(title: "Non existing post"); end
64
+
65
+ expect(collection_is_empty?).to eq true
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,35 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::ScopeChain do
4
+
5
+ include ActiveAdmin::ScopeChain
6
+
7
+ describe "#scope_chain" do
8
+ let(:relation) { double }
9
+
10
+ context "when Scope has a scope method" do
11
+ let(:scope) { ActiveAdmin::Scope.new :published }
12
+
13
+ it "should call the method on the relation and return it" do
14
+ expect(relation).to receive(:published).and_return(:scoped_relation)
15
+ expect(scope_chain(scope, relation)).to eq :scoped_relation
16
+ end
17
+ end
18
+
19
+ context "when Scope has the scope method method ':all'" do
20
+ let(:scope) { ActiveAdmin::Scope.new :all }
21
+
22
+ it "should return the relation" do
23
+ expect(scope_chain(scope, relation)).to eq relation
24
+ end
25
+ end
26
+
27
+ context "when Scope has a name and a scope block" do
28
+ let(:scope) { ActiveAdmin::Scope.new("My Scope"){|s| :scoped_relation } }
29
+
30
+ it "should instance_exec the block and return it" do
31
+ expect(scope_chain(scope, relation)).to eq :scoped_relation
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_helper'
2
+ require 'i18n/tasks'
3
+
4
+ Dir.glob('config/locales/*.yml') do |locale_file|
5
+ RSpec.describe locale_file do
6
+ it { is_expected.to be_parseable }
7
+ it { is_expected.to have_one_top_level_namespace }
8
+ it { is_expected.to be_named_like_top_level_namespace }
9
+ it { is_expected.to_not have_legacy_interpolations }
10
+ it { is_expected.to have_a_valid_locale }
11
+ it { is_expected.to be_a_subset_of 'config/locales/en.yml' }
12
+ end
13
+ end
14
+
15
+ RSpec.describe 'I18n' do
16
+ let(:i18n) { I18n::Tasks::BaseTask.new }
17
+ let(:unused_keys) { i18n.unused_keys }
18
+
19
+ let(:failure_msg) do
20
+ <<-MSG.squish
21
+ #{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to
22
+ show them
23
+ MSG
24
+ end
25
+
26
+ it 'does not have unused keys' do
27
+ expect(unused_keys).to be_empty, failure_msg
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.shared_examples_for "ActiveAdmin::Localizers::ResourceLocalizer" do
4
+ it "should use proper translation" do
5
+ string = ActiveAdmin::Localizers::ResourceLocalizer.t(action, model: model, model_name: model_name)
6
+ expect(string).to eq translation
7
+ end
8
+
9
+ it "should accessible via ActiveAdmin::Localizers" do
10
+ resource = double(resource_label: model, resource_name: double(i18n_key: model_name))
11
+ localizer = ActiveAdmin::Localizers.resource(resource)
12
+ expect(localizer.t(action)).to eq translation
13
+ end
14
+ end
15
+
16
+ RSpec.describe ActiveAdmin::Localizers::ResourceLocalizer do
17
+ let(:action) { 'new_model' }
18
+ let(:model) { 'Comment' }
19
+ let(:model_name) { 'comment' }
20
+
21
+ it_behaves_like "ActiveAdmin::Localizers::ResourceLocalizer" do
22
+ let(:translation) { 'New Comment' }
23
+ end
24
+
25
+ describe "model action specified" do
26
+ around do |example|
27
+ with_translation active_admin: {resources: {comment: {new_model: 'Write comment'}}} do
28
+ example.call
29
+ end
30
+ end
31
+
32
+ it_behaves_like "ActiveAdmin::Localizers::ResourceLocalizer" do
33
+ let(:translation) { 'Write comment' }
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::MenuCollection do
4
+
5
+ let(:menus) { ActiveAdmin::MenuCollection.new }
6
+
7
+ describe "#add" do
8
+
9
+ it "should initialize a new menu when first item" do
10
+ menus.add :default, label: "Hello World"
11
+
12
+ expect(menus.fetch(:default).items.size).to eq 1
13
+ expect(menus.fetch(:default)["Hello World"]).to be_an_instance_of(ActiveAdmin::MenuItem)
14
+ end
15
+
16
+ it "should add items to an existing menu" do
17
+ menus.add :default, label: "Hello World"
18
+ menus.add :default, label: "Hello World Again"
19
+
20
+ expect(menus.fetch(:default).items.size).to eq 2
21
+ end
22
+
23
+ end
24
+
25
+ describe "#clear!" do
26
+
27
+ it "should remove all menus" do
28
+ menus.add :default, label: "Hello World"
29
+
30
+ menus.clear!
31
+
32
+ expect {
33
+ menus.fetch(:non_default_menu)
34
+ }.to raise_error(ActiveAdmin::NoMenuError)
35
+
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -0,0 +1,82 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/menu'
3
+ require 'active_admin/menu_item'
4
+
5
+ module ActiveAdmin
6
+ RSpec.describe MenuItem do
7
+
8
+ it "should have a label" do
9
+ item = MenuItem.new(label: "Dashboard")
10
+ expect(item.label).to eq "Dashboard"
11
+ end
12
+
13
+ it "should have a url" do
14
+ item = MenuItem.new(url: "/admin")
15
+ expect(item.url).to eq "/admin"
16
+ end
17
+
18
+ it "should have a priority of 10 by default" do
19
+ item = MenuItem.new
20
+ expect(item.priority).to eq 10
21
+ end
22
+
23
+ it "should default to an empty hash for html_options" do
24
+ item = MenuItem.new
25
+ expect(item.html_options).to be_empty
26
+ end
27
+
28
+ it "should accept an options hash for link_to" do
29
+ item = MenuItem.new html_options: { target: :blank }
30
+ expect(item.html_options).to include(target: :blank)
31
+ end
32
+
33
+ context "with no items" do
34
+ it "should be empty" do
35
+ item = MenuItem.new
36
+ expect(item.items).to be_empty
37
+ end
38
+
39
+ it "should accept new children" do
40
+ item = MenuItem.new label: "Dashboard"
41
+ item.add label: "My Child Dashboard"
42
+ expect(item.items.first).to be_a MenuItem
43
+ expect(item.items.first.label).to eq "My Child Dashboard"
44
+ end
45
+ end
46
+
47
+ context "with many children" do
48
+ let(:item) do
49
+ i = MenuItem.new(label: "Dashboard")
50
+ i.add label: "Blog"
51
+ i.add label: "Cars"
52
+ i.add label: "Users", priority: 1
53
+ i.add label: "Settings", priority: 2
54
+ i.add label: "Analytics", priority: 44
55
+ i
56
+ end
57
+
58
+ it "should contain 5 submenu items" do
59
+ expect(item.items.count).to eq 5
60
+ end
61
+
62
+ it "should give access to the menu item as an array" do
63
+ expect(item['Blog'].label).to eq 'Blog'
64
+ end
65
+
66
+ it "children should hold a reference to their parent" do
67
+ expect(item["Blog"].parent).to eq item
68
+ end
69
+ end
70
+
71
+ describe "#id" do
72
+ it "should be normalized" do
73
+ expect(MenuItem.new(id: "Foo Bar").id).to eq "foo_bar"
74
+ end
75
+
76
+ it "should not accept Procs" do
77
+ expect{ MenuItem.new(id: proc{"Dynamic"}).id }.to raise_error TypeError
78
+ end
79
+ end
80
+
81
+ end
82
+ end
@@ -0,0 +1,60 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/menu'
3
+ require 'active_admin/menu_item'
4
+
5
+ include ActiveAdmin
6
+
7
+ RSpec.describe ActiveAdmin::Menu do
8
+
9
+ context "with no items" do
10
+ it "should have an empty item collection" do
11
+ menu = Menu.new
12
+ expect(menu.items).to be_empty
13
+ end
14
+
15
+ it "should accept new items" do
16
+ menu = Menu.new
17
+ menu.add label: "Dashboard"
18
+ expect(menu.items.first.label).to eq "Dashboard"
19
+ end
20
+ end
21
+
22
+ context "with many items" do
23
+ let(:menu) do
24
+ Menu.new do |m|
25
+ m.add label: "Dashboard"
26
+ m.add label: "Blog"
27
+ end
28
+ end
29
+
30
+ it "should give access to the menu item as an array" do
31
+ expect(menu['Dashboard'].label).to eq 'Dashboard'
32
+ end
33
+ end
34
+
35
+ describe "adding items with children" do
36
+ it "should add an empty item if the parent does not exist" do
37
+ menu = Menu.new
38
+ menu.add parent: "Admin", label: "Users"
39
+
40
+ expect(menu["Admin"]["Users"]).to be_an_instance_of(ActiveAdmin::MenuItem)
41
+ end
42
+
43
+ it "should add a child to a parent if it exists" do
44
+ menu = Menu.new
45
+ menu.add parent: "Admin", label: "Users"
46
+ menu.add parent: "Admin", label: "Projects"
47
+
48
+ expect(menu["Admin"]["Projects"]).to be_an_instance_of(ActiveAdmin::MenuItem)
49
+ end
50
+
51
+ it "should assign children regardless of resource file load order" do
52
+ menu = Menu.new
53
+ menu.add parent: "Users", label: "Posts"
54
+ menu.add label: "Users", url: "/some/url"
55
+
56
+ expect(menu["Users"].url).to eq "/some/url"
57
+ expect(menu["Users"]["Posts"]).to be_a ActiveAdmin::MenuItem
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,27 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Resource, "authorization" do
4
+
5
+ let(:app){ ActiveAdmin::Application.new }
6
+ let(:namespace){ ActiveAdmin::Namespace.new(app, :admin) }
7
+ let(:auth){ double }
8
+
9
+ describe "authorization_adapter" do
10
+
11
+ it "should return AuthorizationAdapter by default" do
12
+ expect(app.authorization_adapter).to eq ActiveAdmin::AuthorizationAdapter
13
+ expect(namespace.authorization_adapter).to eq ActiveAdmin::AuthorizationAdapter
14
+ end
15
+
16
+ it "should be settable on the namespace" do
17
+ namespace.authorization_adapter = auth
18
+ expect(namespace.authorization_adapter).to eq auth
19
+ end
20
+
21
+ it "should be settable on the application" do
22
+ app.authorization_adapter = auth
23
+ expect(app.authorization_adapter).to eq auth
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,99 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Namespace, "registering a page" do
4
+ let(:application){ ActiveAdmin::Application.new }
5
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
6
+ let(:menu){ namespace.fetch_menu(:default) }
7
+
8
+ context "with no configuration" do
9
+ before do
10
+ namespace.register_page "Status"
11
+ end
12
+
13
+ it "should store the namespaced registered configuration" do
14
+ expect(namespace.resources.keys).to include('Status')
15
+ end
16
+
17
+ it "should create a new controller in the default namespace" do
18
+ expect(defined?(Admin::StatusController)).to eq 'constant'
19
+ end
20
+
21
+ it "should create a menu item" do
22
+ expect(menu["Status"]).to be_an_instance_of(ActiveAdmin::MenuItem)
23
+ end
24
+ end
25
+
26
+ context "with a block configuration" do
27
+ it "should be evaluated in the dsl" do
28
+ expect{ |block|
29
+ namespace.register_page "Status", &block
30
+ }.to yield_control
31
+ end
32
+ end
33
+
34
+ describe "adding to the menu" do
35
+ describe "adding as a top level item" do
36
+ before do
37
+ namespace.register_page "Status"
38
+ end
39
+
40
+ it "should add a new menu item" do
41
+ expect(menu['Status']).to_not eq nil
42
+ end
43
+ end
44
+
45
+ describe "adding as a child" do
46
+ before do
47
+ namespace.register_page "Status" do
48
+ menu parent: 'Extra'
49
+ end
50
+ end
51
+
52
+ it "should generate the parent menu item" do
53
+ expect(menu['Extra']).to_not eq nil
54
+ end
55
+
56
+ it "should generate its own child item" do
57
+ expect(menu['Extra']['Status']).to_not eq nil
58
+ end
59
+ end
60
+
61
+ describe "disabling the menu" do
62
+ before do
63
+ namespace.register_page "Status" do
64
+ menu false
65
+ end
66
+ end
67
+
68
+ it "should not create a menu item" do
69
+ expect(menu["Status"]).to eq nil
70
+ end
71
+ end # describe "disabling the menu"
72
+ end # describe "adding to the menu"
73
+
74
+ describe "adding as a belongs to" do
75
+ context "when not optional" do
76
+ before do
77
+ namespace.register_page "Reports" do
78
+ belongs_to :author
79
+ end
80
+ end
81
+
82
+ it "should be excluded from the menu" do
83
+ expect(menu["Reports"]).to be_nil
84
+ end
85
+ end
86
+
87
+ context "when optional" do
88
+ before do
89
+ namespace.register_page "Reports" do
90
+ belongs_to :author, optional: true
91
+ end
92
+ end
93
+
94
+ it "should be in the menu" do
95
+ expect(menu["Reports"]).to_not be_nil
96
+ end
97
+ end
98
+ end # describe "adding as a belongs to"
99
+ end
@@ -0,0 +1,162 @@
1
+ require 'rails_helper'
2
+
3
+ # TODO: refactor this file so it doesn't depend on the Admin namespace in such a broken way.
4
+ # Specifically, the dashboard is already defined.
5
+
6
+ RSpec.describe ActiveAdmin::Namespace, "registering a resource" do
7
+ let(:application){ ActiveAdmin::Application.new }
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
9
+ let(:menu){ namespace.fetch_menu(:default) }
10
+
11
+ after { namespace.unload! }
12
+
13
+ context "with no configuration" do
14
+ before do
15
+ namespace.register Category
16
+ end
17
+
18
+ it "should store the namespaced registered configuration" do
19
+ expect(namespace.resources.keys).to include('Category')
20
+ end
21
+
22
+ it "should create a new controller in the default namespace" do
23
+ expect(defined?(Admin::CategoriesController)).to eq 'constant'
24
+ end
25
+
26
+ skip "should not create the dashboard controller" do
27
+ defined?(Admin::DashboardController).to_not eq 'constant'
28
+ end
29
+
30
+ it "should create a menu item" do
31
+ expect(menu["Categories"]).to be_a ActiveAdmin::MenuItem
32
+ expect(menu["Categories"].instance_variable_get(:@url)).to be_a Proc
33
+ end
34
+ end
35
+
36
+ context "with a block configuration" do
37
+ it "should be evaluated in the dsl" do
38
+ expect{ |block|
39
+ namespace.register Category, &block
40
+ }.to yield_control
41
+ end
42
+ end
43
+
44
+ context "with a resource that's namespaced" do
45
+ before do
46
+ module ::Mock; class Resource; def self.has_many(arg1, arg2); end; end; end
47
+ namespace.register Mock::Resource
48
+ end
49
+
50
+ it "should store the namespaced registered configuration" do
51
+ expect(namespace.resources.keys).to include('Mock::Resource')
52
+ end
53
+ it "should create a new controller in the default namespace" do
54
+ expect(defined?(Admin::MockResourcesController)).to eq 'constant'
55
+ end
56
+ it "should create a menu item" do
57
+ expect(menu["Mock Resources"]).to be_an_instance_of(ActiveAdmin::MenuItem)
58
+ end
59
+
60
+ it "should use the resource as the model in the controller" do
61
+ expect(Admin::MockResourcesController.resource_class).to eq Mock::Resource
62
+ end
63
+ end # context "with a resource that's namespaced"
64
+
65
+ describe "finding resource instances" do
66
+ it "should return the resource when its been registered" do
67
+ post = namespace.register Post
68
+ expect(namespace.resource_for(Post)).to eq post
69
+ end
70
+
71
+ it 'should return nil when the resource has not been registered' do
72
+ expect(namespace.resource_for(Post)).to eq nil
73
+ end
74
+
75
+ it "should return the parent when the parent class has been registered and the child has not" do
76
+ user = namespace.register User
77
+ expect(namespace.resource_for(Publisher)).to eq user
78
+ end
79
+
80
+ it "should return the resource if it and it's parent were registered" do
81
+ user = namespace.register User
82
+ publisher = namespace.register Publisher
83
+ expect(namespace.resource_for(Publisher)).to eq publisher
84
+ end
85
+ end # describe "finding resource instances"
86
+
87
+ describe "adding to the menu" do
88
+ describe "adding as a top level item" do
89
+ before do
90
+ namespace.register Category
91
+ end
92
+ it "should add a new menu item" do
93
+ expect(menu['Categories']).to_not eq nil
94
+ end
95
+ end # describe "adding as a top level item"
96
+
97
+ describe "adding as a child" do
98
+ before do
99
+ namespace.register Category do
100
+ menu parent: 'Blog'
101
+ end
102
+ end
103
+ it "should generate the parent menu item" do
104
+ expect(menu['Blog']).to_not eq nil
105
+ end
106
+ it "should generate its own child item" do
107
+ expect(menu['Blog']['Categories']).to_not eq nil
108
+ end
109
+ end # describe "adding as a child"
110
+
111
+ describe "disabling the menu" do
112
+ before do
113
+ namespace.register Category do
114
+ menu false
115
+ end
116
+ end
117
+ it "should not create a menu item" do
118
+ expect(menu["Categories"]).to eq nil
119
+ end
120
+ end # describe "disabling the menu"
121
+
122
+ describe "adding as a belongs to" do
123
+ context "when not optional" do
124
+ before do
125
+ namespace.register Post do
126
+ belongs_to :author
127
+ end
128
+ end
129
+ it "should not show up in the menu" do
130
+ expect(menu["Posts"]).to eq nil
131
+ end
132
+ end
133
+ context "when optional" do
134
+ before do
135
+ namespace.register Post do
136
+ belongs_to :author, optional: true
137
+ end
138
+ end
139
+ it "should show up in the menu" do
140
+ expect(menu["Posts"]).to_not eq nil
141
+ end
142
+ end
143
+ end
144
+ end # describe "adding to the menu"
145
+
146
+ describe "dashboard controller name" do
147
+ context "when namespaced" do
148
+ it "should be namespaced" do
149
+ namespace = ActiveAdmin::Namespace.new(application, :one)
150
+ namespace.register Category
151
+ expect(defined?(One::CategoriesController)).to eq 'constant'
152
+ end
153
+ end
154
+ context "when not namespaced" do
155
+ it "should not be namespaced" do
156
+ namespace = ActiveAdmin::Namespace.new(application, :two)
157
+ namespace.register Category
158
+ expect(defined?(Two::CategoriesController)).to eq 'constant'
159
+ end
160
+ end
161
+ end # describe "dashboard controller name"
162
+ end # describe "registering a resource"