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,255 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe "Breadcrumbs" do
4
+
5
+ include ActiveAdmin::ViewHelpers
6
+ include ActionView::Helpers::SanitizeHelper
7
+
8
+ describe "generating a trail from paths" do
9
+
10
+ def params; {}; end
11
+ def link_to(name, url); {name: name, path: url}; end
12
+
13
+ actions = ActiveAdmin::BaseController::ACTIVE_ADMIN_ACTIONS
14
+
15
+ let(:user) { double display_name: 'Jane Doe' }
16
+ let(:user_config) { double find_resource: user, resource_name: double(route_key: 'users'),
17
+ defined_actions: actions }
18
+ let(:post) { double display_name: 'Hello World' }
19
+ let(:post_config) { double find_resource: post, resource_name: double(route_key: 'posts'),
20
+ breadcrumb: true,
21
+ defined_actions: actions, belongs_to_config: double(target: user_config) }
22
+
23
+ let :active_admin_config do
24
+ post_config
25
+ end
26
+
27
+ let(:trail) { breadcrumb_links(path) }
28
+
29
+ context "when request '/admin'" do
30
+ let(:path) { "/admin" }
31
+
32
+ it "should not have any items" do
33
+ expect(trail.size).to eq 0
34
+ end
35
+ end
36
+
37
+ context "when path 'admin/users'" do
38
+ let(:path) { 'admin/users' }
39
+
40
+ it 'should have one item' do
41
+ expect(trail.size).to eq 1
42
+ end
43
+ it 'should have a link to /admin' do
44
+ expect(trail[0][:name]).to eq 'Admin'
45
+ expect(trail[0][:path]).to eq '/admin'
46
+ end
47
+ end
48
+
49
+ context "when path '/admin/users'" do
50
+ let(:path) { "/admin/users" }
51
+
52
+ it "should have one item" do
53
+ expect(trail.size).to eq 1
54
+ end
55
+ it "should have a link to /admin" do
56
+ expect(trail[0][:name]).to eq "Admin"
57
+ expect(trail[0][:path]).to eq "/admin"
58
+ end
59
+ end
60
+
61
+ context "when path '/admin/users/1'" do
62
+ let(:path) { "/admin/users/1" }
63
+
64
+ it "should have 2 items" do
65
+ expect(trail.size).to eq 2
66
+ end
67
+ it "should have a link to /admin" do
68
+ expect(trail[0][:name]).to eq "Admin"
69
+ expect(trail[0][:path]).to eq "/admin"
70
+ end
71
+ it "should have a link to /admin/users" do
72
+ expect(trail[1][:name]).to eq "Users"
73
+ expect(trail[1][:path]).to eq "/admin/users"
74
+ end
75
+ end
76
+
77
+ context "when path '/admin/users/1/posts'" do
78
+ let(:path) { "/admin/users/1/posts" }
79
+
80
+ it "should have 3 items" do
81
+ expect(trail.size).to eq 3
82
+ end
83
+ it "should have a link to /admin" do
84
+ expect(trail[0][:name]).to eq "Admin"
85
+ expect(trail[0][:path]).to eq "/admin"
86
+ end
87
+ it "should have a link to /admin/users" do
88
+ expect(trail[1][:name]).to eq "Users"
89
+ expect(trail[1][:path]).to eq "/admin/users"
90
+ end
91
+
92
+ context "when User.find(1) doesn't exist" do
93
+ before { allow(user_config).to receive(:find_resource) }
94
+ it "should have a link to /admin/users/1" do
95
+ expect(trail[2][:name]).to eq "1"
96
+ expect(trail[2][:path]).to eq "/admin/users/1"
97
+ end
98
+ end
99
+
100
+ context "when User.find(1) does exist" do
101
+ it "should have a link to /admin/users/1 using display name" do
102
+ expect(trail[2][:name]).to eq "Jane Doe"
103
+ expect(trail[2][:path]).to eq "/admin/users/1"
104
+ end
105
+ end
106
+ end
107
+
108
+ context "when path '/admin/users/4e24d6249ccf967313000000/posts'" do
109
+ let(:path) { "/admin/users/4e24d6249ccf967313000000/posts" }
110
+
111
+ it "should have 3 items" do
112
+ expect(trail.size).to eq 3
113
+ end
114
+ it "should have a link to /admin" do
115
+ expect(trail[0][:name]).to eq "Admin"
116
+ expect(trail[0][:path]).to eq "/admin"
117
+ end
118
+ it "should have a link to /admin/users" do
119
+ expect(trail[1][:name]).to eq "Users"
120
+ expect(trail[1][:path]).to eq "/admin/users"
121
+ end
122
+
123
+ context "when User.find(4e24d6249ccf967313000000) doesn't exist" do
124
+ before { allow(user_config).to receive(:find_resource) }
125
+ it "should have a link to /admin/users/4e24d6249ccf967313000000" do
126
+ expect(trail[2][:name]).to eq "4e24d6249ccf967313000000"
127
+ expect(trail[2][:path]).to eq "/admin/users/4e24d6249ccf967313000000"
128
+ end
129
+ end
130
+
131
+ context "when User.find(4e24d6249ccf967313000000) does exist" do
132
+ before do
133
+ display_name = double(display_name: 'Hello :)')
134
+ allow(user_config).to receive(:find_resource).and_return(display_name)
135
+ end
136
+ it "should have a link to /admin/users/4e24d6249ccf967313000000 using display name" do
137
+ expect(trail[2][:name]).to eq "Hello :)"
138
+ expect(trail[2][:path]).to eq "/admin/users/4e24d6249ccf967313000000"
139
+ end
140
+ end
141
+ end
142
+
143
+ context "when path '/admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4/posts'" do
144
+ let(:path) { "/admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4/posts" }
145
+
146
+ it "should have 3 items" do
147
+ expect(trail.size).to eq 3
148
+ end
149
+ it "should have a link to /admin" do
150
+ expect(trail[0][:name]).to eq "Admin"
151
+ expect(trail[0][:path]).to eq "/admin"
152
+ end
153
+ it "should have a link to /admin/users" do
154
+ expect(trail[1][:name]).to eq "Users"
155
+ expect(trail[1][:path]).to eq "/admin/users"
156
+ end
157
+
158
+ context "when User.find(2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4) doesn't exist" do
159
+ before { allow(user_config).to receive(:find_resource) }
160
+ it "should have a link to /admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4" do
161
+ expect(trail[2][:name]).to eq "2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4".titlecase
162
+ expect(trail[2][:path]).to eq "/admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4"
163
+ end
164
+ end
165
+
166
+ context "when User.find(2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4) does exist" do
167
+ before do
168
+ display_name = double(display_name: 'Hello :)')
169
+ allow(user_config).to receive(:find_resource).and_return(display_name)
170
+ end
171
+ it "should have a link to /admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4 using display name" do
172
+ expect(trail[2][:name]).to eq "Hello :)"
173
+ expect(trail[2][:path]).to eq "/admin/users/2b2f0fc2-9a0d-41b8-b39d-aa21963aaee4"
174
+ end
175
+ end
176
+ end
177
+
178
+ context "when path '/admin/users/1/coments/1'" do
179
+ let(:path) { "/admin/users/1/posts/1" }
180
+
181
+ it "should have 4 items" do
182
+ expect(trail.size).to eq 4
183
+ end
184
+ it "should have a link to /admin" do
185
+ expect(trail[0][:name]).to eq "Admin"
186
+ expect(trail[0][:path]).to eq "/admin"
187
+ end
188
+ it "should have a link to /admin/users" do
189
+ expect(trail[1][:name]).to eq "Users"
190
+ expect(trail[1][:path]).to eq "/admin/users"
191
+ end
192
+ it "should have a link to /admin/users/1" do
193
+ expect(trail[2][:name]).to eq "Jane Doe"
194
+ expect(trail[2][:path]).to eq "/admin/users/1"
195
+ end
196
+ it "should have a link to /admin/users/1/posts" do
197
+ expect(trail[3][:name]).to eq "Posts"
198
+ expect(trail[3][:path]).to eq "/admin/users/1/posts"
199
+ end
200
+ end
201
+
202
+ context "when path '/admin/users/1/coments/1/edit'" do
203
+ let(:path) { "/admin/users/1/posts/1/edit" }
204
+
205
+ it "should have 5 items" do
206
+ expect(trail.size).to eq 5
207
+ end
208
+ it "should have a link to /admin" do
209
+ expect(trail[0][:name]).to eq "Admin"
210
+ expect(trail[0][:path]).to eq "/admin"
211
+ end
212
+ it "should have a link to /admin/users" do
213
+ expect(trail[1][:name]).to eq "Users"
214
+ expect(trail[1][:path]).to eq "/admin/users"
215
+ end
216
+ it "should have a link to /admin/users/1" do
217
+ expect(trail[2][:name]).to eq "Jane Doe"
218
+ expect(trail[2][:path]).to eq "/admin/users/1"
219
+ end
220
+ it "should have a link to /admin/users/1/posts" do
221
+ expect(trail[3][:name]).to eq "Posts"
222
+ expect(trail[3][:path]).to eq "/admin/users/1/posts"
223
+ end
224
+ it "should have a link to /admin/users/1/posts/1" do
225
+ expect(trail[4][:name]).to eq "Hello World"
226
+ expect(trail[4][:path]).to eq "/admin/users/1/posts/1"
227
+ end
228
+ end
229
+
230
+ context "when the 'show' action is disabled" do
231
+ let(:post_config) { double find_resource: post, resource_name: double(route_key: 'posts'),
232
+ defined_actions: actions - [:show], # this is the change
233
+ breadcrumb: true,
234
+ belongs_to_config: double(target: user_config) }
235
+
236
+ let(:path) { "/admin/posts/1/edit" }
237
+
238
+ it "should have 3 items" do
239
+ expect(trail.size).to eq 3
240
+ end
241
+ it "should have a link to /admin" do
242
+ expect(trail[0][:name]).to eq "Admin"
243
+ expect(trail[0][:path]).to eq "/admin"
244
+ end
245
+ it "should have a link to /admin/posts" do
246
+ expect(trail[1][:name]).to eq "Posts"
247
+ expect(trail[1][:path]).to eq "/admin/posts"
248
+ end
249
+ it "should not link to the show view for the post" do
250
+ expect(trail[2]).to eq "Hello World"
251
+ end
252
+ end
253
+
254
+ end
255
+ end
@@ -0,0 +1,203 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/view_helpers/active_admin_application_helper'
3
+ require 'active_admin/view_helpers/auto_link_helper'
4
+ require 'active_admin/view_helpers/display_helper'
5
+ require 'active_admin/view_helpers/method_or_proc_helper'
6
+
7
+ RSpec.describe ActiveAdmin::ViewHelpers::DisplayHelper do
8
+ include ActiveAdmin::ViewHelpers::ActiveAdminApplicationHelper
9
+ include ActiveAdmin::ViewHelpers::AutoLinkHelper
10
+ include ActiveAdmin::ViewHelpers::DisplayHelper
11
+ include MethodOrProcHelper
12
+ include ActionView::Helpers::UrlHelper
13
+ include ActionView::Helpers::TranslationHelper
14
+ include ActionView::Helpers::SanitizeHelper
15
+
16
+ def active_admin_namespace
17
+ active_admin_application.namespaces[:admin]
18
+ end
19
+
20
+ def authorized?(*)
21
+ true
22
+ end
23
+
24
+ def url_options
25
+ { locale: nil }
26
+ end
27
+
28
+ before do
29
+ load_resources do
30
+ ActiveAdmin.register(User)
31
+ ActiveAdmin.register(Post){ belongs_to :user, optional: true }
32
+ end
33
+ end
34
+
35
+ describe '#display_name' do
36
+ ActiveAdmin::Application.new.display_name_methods.map(&:to_s).each do |m|
37
+ it "should return #{m} when defined" do
38
+ klass = Class.new do
39
+ define_method(m) { m }
40
+ end
41
+ expect(display_name klass.new).to eq m
42
+ end
43
+
44
+ it "should sanitize the result of #{m} when defined" do
45
+ klass = Class.new do
46
+ define_method(m) { '<script>alert(1)</script>' }
47
+ end
48
+ expect(display_name klass.new).to eq 'alert(1)'
49
+ end
50
+ end
51
+
52
+ it "should memoize the result for the class" do
53
+ subject = Class.new.new
54
+ expect(subject).to receive(:name).twice.and_return "My Name"
55
+
56
+ expect(display_name subject).to eq "My Name"
57
+
58
+ expect(ActiveAdmin.application).to_not receive(:display_name_methods)
59
+ expect(display_name subject).to eq "My Name"
60
+ end
61
+
62
+ it "should not call a method if it's an association" do
63
+ klass = Class.new
64
+ subject = klass.new
65
+ allow(klass).to receive(:reflect_on_all_associations).and_return [ double(name: :login) ]
66
+ allow(subject).to receive :login
67
+ expect(subject).to_not receive :login
68
+ allow(subject).to receive(:email).and_return 'foo@bar.baz'
69
+
70
+ expect(display_name subject).to eq 'foo@bar.baz'
71
+ end
72
+
73
+ it "should return `nil` when the passed object is `nil`" do
74
+ expect(display_name nil).to eq nil
75
+ end
76
+
77
+ it "should return 'false' when the passed object is `false`" do
78
+ expect(display_name false).to eq "false"
79
+ end
80
+
81
+ it "should default to `to_s`" do
82
+ subject = Class.new.new
83
+ expect(display_name subject).to eq sanitize(subject.to_s)
84
+ end
85
+
86
+ context "when no display name method is defined" do
87
+ context "on a Rails model" do
88
+ it "should show the model name" do
89
+ class ThisModel
90
+ extend ActiveModel::Naming
91
+ end
92
+ subject = ThisModel.new
93
+ expect(display_name subject).to eq "This model"
94
+ end
95
+
96
+ it "should show the model name, plus the ID if in use" do
97
+ subject = Tagging.create!
98
+ expect(display_name subject).to eq "Tagging #1"
99
+ end
100
+
101
+ it "should translate the model name" do
102
+ with_translation activerecord: {models: {tagging: {one: "Different"}}} do
103
+ subject = Tagging.create!
104
+ expect(display_name subject).to eq "Different #1"
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ describe '#format_attribute' do
112
+ it 'calls the provided block to format the value' do
113
+ value = format_attribute double(foo: 2), ->r { r.foo + 1 }
114
+
115
+ expect(value).to eq '3'
116
+ end
117
+
118
+ it 'finds values as methods' do
119
+ value = format_attribute double(name: 'Joe'), :name
120
+
121
+ expect(value).to eq 'Joe'
122
+ end
123
+
124
+ it 'finds values from hashes' do
125
+ value = format_attribute({id: 100}, :id)
126
+
127
+ expect(value).to eq '100'
128
+ end
129
+
130
+ [1, 1.2, :a_symbol].each do |val|
131
+ it "calls to_s to format the value of type #{val.class}" do
132
+ value = format_attribute double(foo: val), :foo
133
+
134
+ expect(value).to eq val.to_s
135
+ end
136
+ end
137
+
138
+ it 'localizes dates' do
139
+ date = Date.parse '2016/02/28'
140
+
141
+ value = format_attribute double(date: date), :date
142
+
143
+ expect(value).to eq 'February 28, 2016'
144
+ end
145
+
146
+ it 'localizes times' do
147
+ time = Time.parse '2016/02/28 9:34 PM'
148
+
149
+ value = format_attribute double(time: time), :time
150
+
151
+ expect(value).to eq 'February 28, 2016 21:34'
152
+ end
153
+
154
+ it 'uses a display_name method for arbitrary objects' do
155
+ object = double to_s: :wrong, display_name: :right
156
+
157
+ value = format_attribute double(object: object), :object
158
+
159
+ expect(value).to eq 'right'
160
+ end
161
+
162
+ it 'auto-links ActiveRecord records by association' do
163
+ post = Post.create! author: User.new
164
+
165
+ value = format_attribute post, :author
166
+
167
+ expect(value).to match /<a href="\/admin\/users\/\d+"> <\/a>/
168
+ end
169
+
170
+ it 'auto-links ActiveRecord records & uses a display_name method' do
171
+ post = Post.create! author: User.new(first_name: 'A', last_name: 'B')
172
+
173
+ value = format_attribute post, :author
174
+
175
+ expect(value).to match /<a href="\/admin\/users\/\d+">A B<\/a>/
176
+ end
177
+
178
+ pending 'auto-links Mongoid records'
179
+
180
+ it 'calls status_tag for boolean values' do
181
+ post = Post.new starred: true
182
+
183
+ value = format_attribute post, :starred
184
+
185
+ expect(value.render_in).to eq "<span class=\"status_tag yes\">Yes</span>\n"
186
+ end
187
+
188
+ it 'calls status_tag for boolean non-database values' do
189
+ post = Post.new
190
+ post.define_singleton_method(:true_method) do
191
+ true
192
+ end
193
+ post.define_singleton_method(:false_method) do
194
+ false
195
+ end
196
+ true_value = format_attribute post, :true_method
197
+ expect(true_value.render_in).to eq "<span class=\"status_tag yes\">Yes</span>\n"
198
+ false_value = format_attribute post, :false_method
199
+ expect(false_value.render_in).to eq "<span class=\"status_tag no\">No</span>\n"
200
+ end
201
+
202
+ end
203
+ end
@@ -0,0 +1,39 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::ViewHelpers::DownloadFormatLinksHelper do
4
+ describe "class methods" do
5
+ before :all do
6
+ begin
7
+ # The mime type to be used in respond_to |format| style web-services in rails
8
+ Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx
9
+ rescue NameError
10
+ puts "Mime module not defined. Skipping registration of xlsx"
11
+ end
12
+ end
13
+
14
+ subject do
15
+ Class.new do
16
+ include ActiveAdmin::ViewHelpers::DownloadFormatLinksHelper
17
+ end
18
+ end
19
+
20
+ it "extends the class to add a formats class method that returns the default formats." do
21
+ expect(subject.formats).to eq [:csv, :xml, :json]
22
+ end
23
+
24
+ it "does not let you alter the formats array directly" do
25
+ subject.formats << :xlsx
26
+ expect(subject.formats).to eq [:csv, :xml, :json]
27
+ end
28
+
29
+ it "allows us to add new formats" do
30
+ subject.add_format :xlsx
31
+ expect(subject.formats).to eq [:csv, :xml, :json, :xlsx]
32
+ end
33
+
34
+ it "raises an exception if you provide an unregisterd mime type extension" do
35
+ expect{ subject.add_format :hoge }.to raise_error 'Please register the hoge mime type with `Mime::Type.register`'
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,50 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::ViewHelpers::FormHelper, ".fields_for" do
4
+ include ActiveAdmin::ViewHelpers::FormHelper
5
+
6
+ it "should skip :action, :controller and :commit" do
7
+ expect(fields_for_params(
8
+ scope: "All", action: "index", controller: "PostController", commit: "Filter", utf8: "Yes!")).
9
+ to eq [ { scope: "All" } ]
10
+ end
11
+
12
+ it "should skip the except" do
13
+ expect(fields_for_params({scope: "All", name: "Greg"}, except: :name)).
14
+ to eq [ { scope: "All" } ]
15
+ end
16
+
17
+ it "should allow an array for the except" do
18
+ expect(fields_for_params({scope: "All", name: "Greg", age: "12"}, except: [:name, :age])).
19
+ to eq [ { scope: "All" } ]
20
+ end
21
+
22
+ it "should work with hashes" do
23
+ params = fields_for_params(filters: { name: "John", age: "12" })
24
+
25
+ expect(params.size).to eq 2
26
+ expect(params).to include({"filters[name]" => "John" })
27
+ expect(params).to include({ "filters[age]" => "12" })
28
+ end
29
+
30
+ it "should work with nested hashes" do
31
+ expect(fields_for_params(filters: { user: { name: "John" }})).
32
+ to eq [ { "filters[user][name]" => "John" } ]
33
+ end
34
+
35
+ it "should work with arrays" do
36
+ expect(fields_for_params(people: ["greg", "emily", "philippe"])).
37
+ to eq [ { "people[]" => "greg" },
38
+ { "people[]" => "emily" },
39
+ { "people[]" => "philippe" } ]
40
+ end
41
+
42
+ it "should work with symbols" do
43
+ expect(fields_for_params(filter: :id)).
44
+ to eq [ { filter: "id" } ]
45
+ end
46
+
47
+ it "should work with booleans" do
48
+ expect(fields_for_params(booleantest: false)).to eq [ { booleantest: false } ]
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::ViewHelpers::FlashHelper do
4
+
5
+ describe '.flash_messages' do
6
+ let(:view) { mock_action_view }
7
+
8
+ it "should not include 'timedout' flash messages by default" do
9
+ view.request.flash[:alert] = "Alert"
10
+ view.request.flash[:timedout] = true
11
+ expect(view.flash_messages).to include 'alert'
12
+ expect(view.flash_messages).to_not include 'timedout'
13
+ end
14
+
15
+ it "should not return flash messages included in flash_keys_to_except" do
16
+ expect(view.active_admin_application).to receive(:flash_keys_to_except).and_return ["hideme"]
17
+ view.request.flash[:alert] = "Alert"
18
+ view.request.flash[:hideme] = "Do not show"
19
+ expect(view.flash_messages).to include 'alert'
20
+ expect(view.flash_messages).to_not include 'hideme'
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,42 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::ViewHelpers::FormHelper do
4
+
5
+ describe '.active_admin_form_for' do
6
+ let(:view) { mock_action_view }
7
+ let(:resource) { double 'resource' }
8
+ let(:default_options) { { builder: ActiveAdmin::FormBuilder } }
9
+
10
+ it 'calls semantic_form_for with the ActiveAdmin form builder' do
11
+ expect(view).to receive(:semantic_form_for).with(resource, { builder: ActiveAdmin::FormBuilder })
12
+ view.active_admin_form_for(resource)
13
+ end
14
+
15
+ it 'allows the form builder to be customized' do
16
+ # We can't use a stub here because options gets marshalled, and a new
17
+ # instance built. Any constant will work.
18
+ custom_builder = Object
19
+ expect(view).to receive(:semantic_form_for).with(resource, { builder: custom_builder })
20
+ view.active_admin_form_for(resource, builder: custom_builder)
21
+ end
22
+ end
23
+
24
+ describe ".hidden_field_tags_for" do
25
+ let(:view) { mock_action_view }
26
+
27
+ it "should render hidden field tags for params" do
28
+ html = Capybara.string view.hidden_field_tags_for(ActionController::Parameters.new(scope: "All", filter: "None"))
29
+ expect(html).to have_selector("input#hidden_active_admin_scope[name=scope][type=hidden][value=All]", visible: false)
30
+ expect(html).to have_selector("input#hidden_active_admin_filter[name=filter][type=hidden][value=None]", visible: false)
31
+ end
32
+
33
+ it "should generate not default id for hidden input" do
34
+ expect(view.hidden_field_tags_for(ActionController::Parameters.new(scope: "All"))[/id="([^"]+)"/, 1]).to_not eq "scope"
35
+ end
36
+
37
+ it "should filter out the field passed via the option :except" do
38
+ html = Capybara.string view.hidden_field_tags_for(ActionController::Parameters.new(scope: "All", filter: "None"), except: :filter)
39
+ expect(html).to have_selector("input#hidden_active_admin_scope[name=scope][type=hidden][value=All]", visible: false)
40
+ end
41
+ end
42
+ end