activeadmin-rb 1.4.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 (614) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.gitignore +21 -0
  5. data/.mdlrc +1 -0
  6. data/.rubocop.yml +84 -0
  7. data/.simplecov +13 -0
  8. data/.travis.yml +49 -0
  9. data/.yardopts +7 -0
  10. data/CHANGELOG.md +389 -0
  11. data/CODE_OF_CONDUCT.md +22 -0
  12. data/CONTRIBUTING.md +184 -0
  13. data/Gemfile +58 -0
  14. data/LICENSE +20 -0
  15. data/README.md +75 -0
  16. data/Rakefile +54 -0
  17. data/activeadmin-rb.gemspec +32 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js.coffee +13 -0
  22. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  23. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  24. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +11 -0
  25. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +14 -0
  26. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +26 -0
  27. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +7 -0
  28. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +42 -0
  29. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +46 -0
  30. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +104 -0
  31. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  32. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  33. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  34. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +46 -0
  35. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +22 -0
  36. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  37. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  38. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  39. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  40. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  41. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  42. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  43. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  44. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  45. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  46. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  47. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  48. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  49. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  50. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  51. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  52. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  53. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  54. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  55. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  56. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  57. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  58. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  59. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  60. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  61. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  76. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  81. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  82. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  83. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  84. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  85. data/app/views/active_admin/page/index.html.arb +1 -0
  86. data/app/views/active_admin/resource/edit.html.arb +1 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  91. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  92. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  93. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  94. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  95. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  96. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  97. data/app/views/layouts/active_admin.html.arb +1 -0
  98. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  99. data/codecov.yml +25 -0
  100. data/config/i18n-tasks.yml +26 -0
  101. data/config/locales/ar.yml +134 -0
  102. data/config/locales/bg.yml +119 -0
  103. data/config/locales/bs.yml +120 -0
  104. data/config/locales/ca.yml +105 -0
  105. data/config/locales/cs.yml +108 -0
  106. data/config/locales/da.yml +136 -0
  107. data/config/locales/de-CH.yml +100 -0
  108. data/config/locales/de.yml +143 -0
  109. data/config/locales/el.yml +125 -0
  110. data/config/locales/en-CA.yml +138 -0
  111. data/config/locales/en-GB.yml +138 -0
  112. data/config/locales/en.yml +161 -0
  113. data/config/locales/eo.yml +144 -0
  114. data/config/locales/es-MX.yml +95 -0
  115. data/config/locales/es.yml +161 -0
  116. data/config/locales/fa.yml +118 -0
  117. data/config/locales/fi.yml +111 -0
  118. data/config/locales/fr.yml +140 -0
  119. data/config/locales/he.yml +141 -0
  120. data/config/locales/hr.yml +122 -0
  121. data/config/locales/hu.yml +97 -0
  122. data/config/locales/id.yml +134 -0
  123. data/config/locales/it.yml +143 -0
  124. data/config/locales/ja.yml +140 -0
  125. data/config/locales/ko.yml +119 -0
  126. data/config/locales/lt.yml +141 -0
  127. data/config/locales/lv.yml +91 -0
  128. data/config/locales/nb.yml +129 -0
  129. data/config/locales/nl.yml +143 -0
  130. data/config/locales/pl.yml +167 -0
  131. data/config/locales/pt-BR.yml +142 -0
  132. data/config/locales/pt-PT.yml +91 -0
  133. data/config/locales/ro.yml +95 -0
  134. data/config/locales/ru.yml +140 -0
  135. data/config/locales/sk.yml +108 -0
  136. data/config/locales/sv-SE.yml +134 -0
  137. data/config/locales/tr.yml +143 -0
  138. data/config/locales/uk.yml +135 -0
  139. data/config/locales/vi.yml +133 -0
  140. data/config/locales/zh-CN.yml +142 -0
  141. data/config/locales/zh-TW.yml +134 -0
  142. data/config/mdl_style.rb +9 -0
  143. data/cucumber.yml +6 -0
  144. data/docs/0-installation.md +118 -0
  145. data/docs/1-general-configuration.md +204 -0
  146. data/docs/10-custom-pages.md +150 -0
  147. data/docs/11-decorators.md +59 -0
  148. data/docs/12-arbre-components.md +203 -0
  149. data/docs/13-authorization-adapter.md +285 -0
  150. data/docs/14-gotchas.md +138 -0
  151. data/docs/2-resource-customization.md +466 -0
  152. data/docs/3-index-pages.md +328 -0
  153. data/docs/3-index-pages/custom-index.md +35 -0
  154. data/docs/3-index-pages/index-as-block.md +19 -0
  155. data/docs/3-index-pages/index-as-blog.md +69 -0
  156. data/docs/3-index-pages/index-as-grid.md +27 -0
  157. data/docs/3-index-pages/index-as-table.md +225 -0
  158. data/docs/4-csv-format.md +74 -0
  159. data/docs/5-forms.md +231 -0
  160. data/docs/6-show-pages.md +81 -0
  161. data/docs/7-sidebars.md +75 -0
  162. data/docs/8-custom-actions.md +177 -0
  163. data/docs/9-batch-actions.md +237 -0
  164. data/docs/CNAME +1 -0
  165. data/docs/Gemfile +2 -0
  166. data/docs/README.md +24 -0
  167. data/docs/_config.yml +2 -0
  168. data/docs/_includes/footer.html +8 -0
  169. data/docs/_includes/google-analytics.html +16 -0
  170. data/docs/_includes/head.html +7 -0
  171. data/docs/_includes/toc.html +98 -0
  172. data/docs/_includes/top-menu.html +9 -0
  173. data/docs/_layouts/default.html +21 -0
  174. data/docs/documentation.md +60 -0
  175. data/docs/images/activeadmin.png +0 -0
  176. data/docs/images/code-header.png +0 -0
  177. data/docs/images/divider.png +0 -0
  178. data/docs/images/features.png +0 -0
  179. data/docs/index.html +125 -0
  180. data/docs/stylesheets/main.css +1152 -0
  181. data/features/action_item.feature +73 -0
  182. data/features/authorization.feature +64 -0
  183. data/features/authorization_cancan.feature +52 -0
  184. data/features/authorization_pundit.feature +37 -0
  185. data/features/belongs_to.feature +124 -0
  186. data/features/breadcrumb.feature +76 -0
  187. data/features/comments/commenting.feature +178 -0
  188. data/features/comments/viewing_index.feature +19 -0
  189. data/features/create_another.feature +55 -0
  190. data/features/dashboard.feature +16 -0
  191. data/features/decorators.feature +43 -0
  192. data/features/development_reloading.feature +28 -0
  193. data/features/edit_page.feature +116 -0
  194. data/features/favicon.feature +20 -0
  195. data/features/first_boot.feature +16 -0
  196. data/features/footer.feature +29 -0
  197. data/features/global_navigation.feature +29 -0
  198. data/features/i18n.feature +55 -0
  199. data/features/index/batch_actions.feature +218 -0
  200. data/features/index/filters.feature +251 -0
  201. data/features/index/format_as_csv.feature +227 -0
  202. data/features/index/formats.feature +88 -0
  203. data/features/index/index_as_block.feature +15 -0
  204. data/features/index/index_as_blog.feature +69 -0
  205. data/features/index/index_as_grid.feature +45 -0
  206. data/features/index/index_as_table.feature +291 -0
  207. data/features/index/index_blank_slate.feature +83 -0
  208. data/features/index/index_parameters.feature +75 -0
  209. data/features/index/index_scope_to.feature +56 -0
  210. data/features/index/index_scopes.feature +325 -0
  211. data/features/index/page_title.feature +41 -0
  212. data/features/index/pagination.feature +63 -0
  213. data/features/index/switch_index_view.feature +73 -0
  214. data/features/menu.feature +85 -0
  215. data/features/meta_tags.feature +21 -0
  216. data/features/new_page.feature +136 -0
  217. data/features/registering_assets.feature +38 -0
  218. data/features/registering_pages.feature +237 -0
  219. data/features/registering_resources.feature +33 -0
  220. data/features/renamed_resource.feature +30 -0
  221. data/features/root_to.feature +18 -0
  222. data/features/show/attributes_table_title.feature +54 -0
  223. data/features/show/columns.feature +40 -0
  224. data/features/show/default_content.feature +44 -0
  225. data/features/show/page_title.feature +58 -0
  226. data/features/show/tabs.feature +33 -0
  227. data/features/sidebar_sections.feature +210 -0
  228. data/features/site_title.feature +47 -0
  229. data/features/specifying_actions.feature +118 -0
  230. data/features/step_definitions/action_item_steps.rb +7 -0
  231. data/features/step_definitions/action_link_steps.rb +19 -0
  232. data/features/step_definitions/additional_web_steps.rb +81 -0
  233. data/features/step_definitions/asset_steps.rb +15 -0
  234. data/features/step_definitions/attribute_steps.rb +18 -0
  235. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  236. data/features/step_definitions/batch_action_steps.rb +81 -0
  237. data/features/step_definitions/blog_steps.rb +3 -0
  238. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  239. data/features/step_definitions/column_steps.rb +8 -0
  240. data/features/step_definitions/comment_steps.rb +32 -0
  241. data/features/step_definitions/configuration_steps.rb +100 -0
  242. data/features/step_definitions/dashboard_steps.rb +15 -0
  243. data/features/step_definitions/factory_steps.rb +35 -0
  244. data/features/step_definitions/filter_steps.rb +57 -0
  245. data/features/step_definitions/flash_steps.rb +11 -0
  246. data/features/step_definitions/footer_steps.rb +21 -0
  247. data/features/step_definitions/format_steps.rb +58 -0
  248. data/features/step_definitions/i18n_steps.rb +11 -0
  249. data/features/step_definitions/index_scope_steps.rb +42 -0
  250. data/features/step_definitions/index_views_steps.rb +3 -0
  251. data/features/step_definitions/layout_steps.rb +3 -0
  252. data/features/step_definitions/member_link_steps.rb +7 -0
  253. data/features/step_definitions/menu_steps.rb +11 -0
  254. data/features/step_definitions/meta_tag_steps.rb +3 -0
  255. data/features/step_definitions/pagination_steps.rb +15 -0
  256. data/features/step_definitions/root_steps.rb +9 -0
  257. data/features/step_definitions/sidebar_steps.rb +11 -0
  258. data/features/step_definitions/site_title_steps.rb +31 -0
  259. data/features/step_definitions/tab_steps.rb +8 -0
  260. data/features/step_definitions/table_steps.rb +116 -0
  261. data/features/step_definitions/user_steps.rb +52 -0
  262. data/features/step_definitions/web_steps.rb +86 -0
  263. data/features/sti_resource.feature +65 -0
  264. data/features/strong_parameters.feature +69 -0
  265. data/features/support/env.rb +121 -0
  266. data/features/support/paths.rb +73 -0
  267. data/features/support/regular_env.rb +7 -0
  268. data/features/support/reload_env.rb +7 -0
  269. data/features/support/selectors.rb +45 -0
  270. data/features/users/logging_in.feature +32 -0
  271. data/features/users/logging_out.feature +29 -0
  272. data/features/users/resetting_password.feature +30 -0
  273. data/gemfiles/rails_42.gemfile +11 -0
  274. data/gemfiles/rails_50.gemfile +11 -0
  275. data/gemfiles/rails_51.gemfile +11 -0
  276. data/gemfiles/rails_52.gemfile +12 -0
  277. data/lib/active_admin.rb +128 -0
  278. data/lib/active_admin/abstract_view_factory.rb +47 -0
  279. data/lib/active_admin/application.rb +241 -0
  280. data/lib/active_admin/application_settings.rb +39 -0
  281. data/lib/active_admin/asset_registration.rb +37 -0
  282. data/lib/active_admin/authorization_adapter.rb +129 -0
  283. data/lib/active_admin/base_controller.rb +81 -0
  284. data/lib/active_admin/base_controller/authorization.rb +128 -0
  285. data/lib/active_admin/base_controller/menu.rb +34 -0
  286. data/lib/active_admin/batch_actions.rb +16 -0
  287. data/lib/active_admin/batch_actions/controller.rb +40 -0
  288. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  289. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  290. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  291. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  292. data/lib/active_admin/callbacks.rb +88 -0
  293. data/lib/active_admin/cancan_adapter.rb +36 -0
  294. data/lib/active_admin/component.rb +5 -0
  295. data/lib/active_admin/controller_action.rb +12 -0
  296. data/lib/active_admin/csv_builder.rb +131 -0
  297. data/lib/active_admin/dependency.rb +172 -0
  298. data/lib/active_admin/deprecation.rb +10 -0
  299. data/lib/active_admin/devise.rb +80 -0
  300. data/lib/active_admin/dsl.rb +167 -0
  301. data/lib/active_admin/dynamic_setting.rb +38 -0
  302. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  303. data/lib/active_admin/engine.rb +21 -0
  304. data/lib/active_admin/error.rb +62 -0
  305. data/lib/active_admin/event.rb +24 -0
  306. data/lib/active_admin/filters.rb +11 -0
  307. data/lib/active_admin/filters/active.rb +29 -0
  308. data/lib/active_admin/filters/active_filter.rb +123 -0
  309. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  310. data/lib/active_admin/filters/dsl.rb +21 -0
  311. data/lib/active_admin/filters/forms.rb +85 -0
  312. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  313. data/lib/active_admin/filters/resource_extension.rb +155 -0
  314. data/lib/active_admin/form_builder.rb +182 -0
  315. data/lib/active_admin/generators/boilerplate.rb +45 -0
  316. data/lib/active_admin/helpers/collection.rb +19 -0
  317. data/lib/active_admin/helpers/i18n.rb +7 -0
  318. data/lib/active_admin/helpers/optional_display.rb +38 -0
  319. data/lib/active_admin/helpers/output_safety_helper.rb +35 -0
  320. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  321. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  322. data/lib/active_admin/inputs.rb +21 -0
  323. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  324. data/lib/active_admin/inputs/filters/base.rb +44 -0
  325. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  326. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  327. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  328. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  329. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  330. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  331. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  332. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  333. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  334. data/lib/active_admin/localizers.rb +11 -0
  335. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  336. data/lib/active_admin/menu.rb +102 -0
  337. data/lib/active_admin/menu_collection.rb +91 -0
  338. data/lib/active_admin/menu_item.rb +69 -0
  339. data/lib/active_admin/namespace.rb +266 -0
  340. data/lib/active_admin/namespace_settings.rb +107 -0
  341. data/lib/active_admin/order_clause.rb +48 -0
  342. data/lib/active_admin/orm/active_record.rb +5 -0
  343. data/lib/active_admin/orm/active_record/comments.rb +101 -0
  344. data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
  345. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  346. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  347. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  348. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  349. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  350. data/lib/active_admin/orm/mongoid.rb +1 -0
  351. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  352. data/lib/active_admin/page.rb +111 -0
  353. data/lib/active_admin/page_controller.rb +29 -0
  354. data/lib/active_admin/page_dsl.rb +32 -0
  355. data/lib/active_admin/page_presenter.rb +32 -0
  356. data/lib/active_admin/pundit_adapter.rb +68 -0
  357. data/lib/active_admin/reloader.rb +25 -0
  358. data/lib/active_admin/resource.rb +206 -0
  359. data/lib/active_admin/resource/action_items.rb +120 -0
  360. data/lib/active_admin/resource/attributes.rb +44 -0
  361. data/lib/active_admin/resource/belongs_to.rb +48 -0
  362. data/lib/active_admin/resource/controllers.rb +19 -0
  363. data/lib/active_admin/resource/includes.rb +12 -0
  364. data/lib/active_admin/resource/menu.rb +67 -0
  365. data/lib/active_admin/resource/naming.rb +62 -0
  366. data/lib/active_admin/resource/ordering.rb +11 -0
  367. data/lib/active_admin/resource/page_presenters.rb +82 -0
  368. data/lib/active_admin/resource/pagination.rb +23 -0
  369. data/lib/active_admin/resource/routes.rb +134 -0
  370. data/lib/active_admin/resource/scope_to.rb +74 -0
  371. data/lib/active_admin/resource/scopes.rb +52 -0
  372. data/lib/active_admin/resource/sidebars.rb +28 -0
  373. data/lib/active_admin/resource_collection.rb +72 -0
  374. data/lib/active_admin/resource_controller.rb +64 -0
  375. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  376. data/lib/active_admin/resource_controller/data_access.rb +322 -0
  377. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  378. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  379. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  380. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  381. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  382. data/lib/active_admin/resource_dsl.rb +222 -0
  383. data/lib/active_admin/router.rb +113 -0
  384. data/lib/active_admin/scope.rb +60 -0
  385. data/lib/active_admin/settings_node.rb +19 -0
  386. data/lib/active_admin/sidebar_section.rb +37 -0
  387. data/lib/active_admin/version.rb +3 -0
  388. data/lib/active_admin/view_factory.rb +27 -0
  389. data/lib/active_admin/view_helpers.rb +20 -0
  390. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  391. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  392. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  393. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  394. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  395. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  396. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  397. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  398. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  399. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  400. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  401. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  402. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  403. data/lib/active_admin/views.rb +8 -0
  404. data/lib/active_admin/views/action_items.rb +17 -0
  405. data/lib/active_admin/views/components/active_admin_form.rb +149 -0
  406. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  407. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  408. data/lib/active_admin/views/components/columns.rb +161 -0
  409. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  410. data/lib/active_admin/views/components/index_list.rb +69 -0
  411. data/lib/active_admin/views/components/menu.rb +32 -0
  412. data/lib/active_admin/views/components/menu_item.rb +58 -0
  413. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  414. data/lib/active_admin/views/components/panel.rb +38 -0
  415. data/lib/active_admin/views/components/scopes.rb +72 -0
  416. data/lib/active_admin/views/components/sidebar.rb +13 -0
  417. data/lib/active_admin/views/components/sidebar_section.rb +37 -0
  418. data/lib/active_admin/views/components/site_title.rb +54 -0
  419. data/lib/active_admin/views/components/status_tag.rb +88 -0
  420. data/lib/active_admin/views/components/table_for.rb +209 -0
  421. data/lib/active_admin/views/components/tabs.rb +31 -0
  422. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  423. data/lib/active_admin/views/footer.rb +30 -0
  424. data/lib/active_admin/views/header.rb +19 -0
  425. data/lib/active_admin/views/index_as_block.rb +36 -0
  426. data/lib/active_admin/views/index_as_blog.rb +155 -0
  427. data/lib/active_admin/views/index_as_grid.rb +80 -0
  428. data/lib/active_admin/views/index_as_table.rb +389 -0
  429. data/lib/active_admin/views/pages/base.rb +123 -0
  430. data/lib/active_admin/views/pages/form.rb +64 -0
  431. data/lib/active_admin/views/pages/index.rb +163 -0
  432. data/lib/active_admin/views/pages/layout.rb +26 -0
  433. data/lib/active_admin/views/pages/page.rb +30 -0
  434. data/lib/active_admin/views/pages/show.rb +65 -0
  435. data/lib/active_admin/views/tabbed_navigation.rb +11 -0
  436. data/lib/active_admin/views/title_bar.rb +55 -0
  437. data/lib/activeadmin-rb.rb +1 -0
  438. data/lib/bug_report_templates/active_admin_master.rb +112 -0
  439. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  440. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  442. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  443. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  444. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +293 -0
  445. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  446. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  447. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +30 -0
  448. data/lib/generators/active_admin/page/USAGE +8 -0
  449. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  450. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  451. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  452. data/lib/generators/active_admin/resource/templates/admin.rb.erb +43 -0
  453. data/lib/ransack_ext.rb +20 -0
  454. data/spec/bug_report_templates_spec.rb +26 -0
  455. data/spec/changelog_spec.rb +15 -0
  456. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -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/flashes.html +2 -0
  461. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  462. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  463. data/spec/javascripts/support/jasmine.yml +74 -0
  464. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  465. data/spec/rails_helper.rb +60 -0
  466. data/spec/requests/default_namespace_spec.rb +81 -0
  467. data/spec/requests/memory_spec.rb +25 -0
  468. data/spec/requests/stylesheets_spec.rb +18 -0
  469. data/spec/spec_helper.rb +1 -0
  470. data/spec/support/active_admin_integration_spec_helper.rb +73 -0
  471. data/spec/support/active_admin_request_helpers.rb +39 -0
  472. data/spec/support/rails_template.rb +156 -0
  473. data/spec/support/rails_template_with_data.rb +327 -0
  474. data/spec/support/templates/admin/stores.rb +7 -0
  475. data/spec/support/templates/en.yml +8 -0
  476. data/spec/support/templates/manifest.js +3 -0
  477. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  478. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  479. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  480. data/spec/support/templates/policies/application_policy.rb +44 -0
  481. data/spec/support/templates/policies/category_policy.rb +7 -0
  482. data/spec/support/templates/policies/post_policy.rb +15 -0
  483. data/spec/support/templates/policies/store_policy.rb +11 -0
  484. data/spec/support/templates/policies/user_policy.rb +11 -0
  485. data/spec/support/templates/post_decorator.rb +24 -0
  486. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  487. data/spec/unit/action_builder_spec.rb +158 -0
  488. data/spec/unit/active_admin_spec.rb +11 -0
  489. data/spec/unit/application_spec.rb +180 -0
  490. data/spec/unit/asset_registration_spec.rb +81 -0
  491. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  492. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  493. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  494. data/spec/unit/auto_link_spec.rb +93 -0
  495. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  496. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  497. data/spec/unit/belongs_to_spec.rb +76 -0
  498. data/spec/unit/cancan_adapter_spec.rb +43 -0
  499. data/spec/unit/comments_spec.rb +189 -0
  500. data/spec/unit/component_spec.rb +18 -0
  501. data/spec/unit/config_shared_examples.rb +59 -0
  502. data/spec/unit/controller_filters_spec.rb +41 -0
  503. data/spec/unit/csv_builder_spec.rb +313 -0
  504. data/spec/unit/dependency_spec.rb +135 -0
  505. data/spec/unit/devise_spec.rb +110 -0
  506. data/spec/unit/dsl_spec.rb +120 -0
  507. data/spec/unit/dynamic_settings_spec.rb +28 -0
  508. data/spec/unit/filters/active_filter_spec.rb +218 -0
  509. data/spec/unit/filters/active_spec.rb +24 -0
  510. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  511. data/spec/unit/filters/resource_spec.rb +128 -0
  512. data/spec/unit/form_builder_spec.rb +1012 -0
  513. data/spec/unit/generators/install_spec.rb +31 -0
  514. data/spec/unit/helpers/collection_spec.rb +68 -0
  515. data/spec/unit/helpers/output_safety_helper_spec.rb +79 -0
  516. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  517. data/spec/unit/i18n_spec.rb +29 -0
  518. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  519. data/spec/unit/menu_collection_spec.rb +62 -0
  520. data/spec/unit/menu_item_spec.rb +82 -0
  521. data/spec/unit/menu_spec.rb +60 -0
  522. data/spec/unit/namespace/authorization_spec.rb +27 -0
  523. data/spec/unit/namespace/register_page_spec.rb +99 -0
  524. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  525. data/spec/unit/namespace_spec.rb +126 -0
  526. data/spec/unit/order_clause_spec.rb +81 -0
  527. data/spec/unit/page_controller_spec.rb +5 -0
  528. data/spec/unit/page_spec.rb +128 -0
  529. data/spec/unit/pretty_format_spec.rb +82 -0
  530. data/spec/unit/pundit_adapter_spec.rb +98 -0
  531. data/spec/unit/resource/action_items_spec.rb +83 -0
  532. data/spec/unit/resource/attributes_spec.rb +49 -0
  533. data/spec/unit/resource/includes_spec.rb +21 -0
  534. data/spec/unit/resource/menu_spec.rb +18 -0
  535. data/spec/unit/resource/naming_spec.rb +120 -0
  536. data/spec/unit/resource/ordering_spec.rb +35 -0
  537. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  538. data/spec/unit/resource/pagination_spec.rb +38 -0
  539. data/spec/unit/resource/routes_spec.rb +125 -0
  540. data/spec/unit/resource/scopes_spec.rb +50 -0
  541. data/spec/unit/resource/sidebars_spec.rb +43 -0
  542. data/spec/unit/resource_collection_spec.rb +175 -0
  543. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  544. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  545. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  546. data/spec/unit/resource_controller_spec.rb +273 -0
  547. data/spec/unit/resource_registration_spec.rb +61 -0
  548. data/spec/unit/resource_spec.rb +320 -0
  549. data/spec/unit/routing_spec.rb +211 -0
  550. data/spec/unit/scope_spec.rb +225 -0
  551. data/spec/unit/settings_node_spec.rb +26 -0
  552. data/spec/unit/view_factory_spec.rb +19 -0
  553. data/spec/unit/view_helpers/breadcrumbs_spec.rb +253 -0
  554. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  555. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  556. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  557. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  558. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  559. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  560. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  561. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  562. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  563. data/spec/unit/views/components/columns_spec.rb +187 -0
  564. data/spec/unit/views/components/index_list_spec.rb +49 -0
  565. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  566. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  567. data/spec/unit/views/components/menu_spec.rb +168 -0
  568. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  569. data/spec/unit/views/components/panel_spec.rb +58 -0
  570. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  571. data/spec/unit/views/components/sidebar_spec.rb +24 -0
  572. data/spec/unit/views/components/site_title_spec.rb +82 -0
  573. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  574. data/spec/unit/views/components/table_for_spec.rb +441 -0
  575. data/spec/unit/views/components/tabs_spec.rb +71 -0
  576. data/spec/unit/views/components/unsupported_browser_spec.rb +39 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/spec/unit/views/pages/base_spec.rb +14 -0
  579. data/spec/unit/views/pages/form_spec.rb +54 -0
  580. data/spec/unit/views/pages/index_spec.rb +60 -0
  581. data/spec/unit/views/pages/layout_spec.rb +59 -0
  582. data/spec/unit/views/pages/show_spec.rb +32 -0
  583. data/tasks/docs.rake +64 -0
  584. data/tasks/lint.rake +21 -0
  585. data/tasks/local.rake +25 -0
  586. data/tasks/parallel_tests.rake +66 -0
  587. data/tasks/test.rake +24 -0
  588. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  589. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  590. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  591. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  592. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  593. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  594. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  595. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  596. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  597. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  598. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  599. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  600. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  601. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  602. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  603. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  604. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +300 -0
  605. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  606. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  607. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  608. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  609. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  610. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  611. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  612. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  613. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  614. metadata +1037 -0
@@ -0,0 +1,49 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::IndexList do
4
+
5
+ describe "#index_list_renderer" do
6
+
7
+ let(:index_classes) { [ActiveAdmin::Views::IndexAsTable, ActiveAdmin::Views::IndexAsBlock] }
8
+
9
+ let(:collection) {
10
+ Post.create(title: 'First Post', starred: true)
11
+ Post.where(nil)
12
+ }
13
+
14
+ let(:helpers) do
15
+ helpers = mock_action_view
16
+ allow(helpers).to receive(:url_for) { |url| "/?#{ url.to_query }" }
17
+ allow(helpers.request).to receive(:query_parameters).and_return as: "table", q: { title_contains: "terms" }
18
+ allow(helpers).to receive(:params).and_return(ActionController::Parameters.new(as: "table", q: { title_contains: "terms" }))
19
+ allow(helpers).to receive(:collection).and_return(collection)
20
+ helpers
21
+ end
22
+
23
+ subject do
24
+ render_arbre_component({index_classes: index_classes}, helpers) do
25
+ index_list_renderer(index_classes)
26
+ end
27
+ end
28
+
29
+ describe '#tag_name' do
30
+ subject { super().tag_name }
31
+ it { is_expected.to eq 'ul'}
32
+ end
33
+
34
+ it "should contain the names of available indexes in links" do
35
+ a_tags = subject.find_by_tag("a")
36
+ expect(a_tags.size).to eq 2
37
+ expect(a_tags.first.to_s).to include("Table")
38
+ expect(a_tags.last.to_s).to include("List")
39
+ end
40
+
41
+ it "should maintain index filter parameters" do
42
+ a_tags = subject.find_by_tag("a")
43
+ expect(a_tags.first.attributes[:href])
44
+ .to eq("/?#{ { as: "table", q: { title_contains: "terms" } }.to_query }")
45
+ expect(a_tags.last.attributes[:href])
46
+ .to eq("/?#{ { as: "block", q: { title_contains: "terms" } }.to_query }")
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,127 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::IndexAsTable::IndexTableFor do
4
+ describe 'creating with the dsl' do
5
+ let(:collection) do
6
+ [Post.new(title: 'First Post', starred: true)]
7
+ end
8
+ let(:active_admin_config) do
9
+ namespace = ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin)
10
+ namespace.batch_actions = [ActiveAdmin::BatchAction.new(:flag, 'Flag') {}]
11
+ namespace
12
+ end
13
+
14
+ let(:assigns) do
15
+ {
16
+ collection: collection,
17
+ active_admin_config: active_admin_config
18
+ }
19
+ end
20
+ let(:helpers) { mock_action_view }
21
+
22
+ context 'when creating a selectable column' do
23
+ let(:table) do
24
+ render_arbre_component assigns, helpers do
25
+ insert_tag(ActiveAdmin::Views::IndexAsTable::IndexTableFor, collection, {sortable: true}) do
26
+ selectable_column
27
+ end
28
+ end
29
+ end
30
+
31
+ context 'creates a table header based on the selectable column' do
32
+ let(:header) do
33
+ table.find_by_tag('th').first
34
+ end
35
+
36
+ it 'with selectable column class name' do
37
+ expect(header.attributes[:class]).to include 'col-selectable'
38
+ end
39
+
40
+ it 'not sortable' do
41
+ expect(header.attributes[:class]).not_to include 'sortable'
42
+ end
43
+ end
44
+ end
45
+
46
+ context 'when creating an index column' do
47
+ let(:base_collection) do
48
+ posts = [
49
+ Post.new(title: 'First Post', starred: true),
50
+ Post.new(title: 'Second Post', starred: true),
51
+ Post.new(title: 'Third Post', starred: true),
52
+ Post.new(title: 'Fourth Post', starred: true)
53
+ ]
54
+ Kaminari.paginate_array(posts, limit: 2)
55
+ end
56
+ let(:collection) do
57
+ base_collection.page(1)
58
+ end
59
+
60
+ let(:table) do
61
+ render_arbre_component assigns, helpers do
62
+ insert_tag(ActiveAdmin::Views::IndexAsTable::IndexTableFor, collection, {sortable: true}) do
63
+ index_column
64
+ end
65
+ end
66
+ end
67
+
68
+ context 'creates a table header based on the index column' do
69
+ let(:header) do
70
+ table.find_by_tag('th').first
71
+ end
72
+
73
+ it 'with index column class name' do
74
+ expect(header.attributes[:class]).to include 'col-index'
75
+ end
76
+
77
+ it 'not sortable' do
78
+ expect(header.attributes[:class]).not_to include 'sortable'
79
+ end
80
+ end
81
+
82
+ context 'verifying the indices for the rows' do
83
+ let(:index_values) do
84
+ table.find_by_tag('tr').map do |row|
85
+ next unless row.find_by_tag('td').first
86
+ row.find_by_tag('td').first.content
87
+ end.compact
88
+ end
89
+
90
+ context 'viewing the first page' do
91
+ it 'shows the correct indices' do
92
+ expect(index_values).to eq(['1', '2'])
93
+ end
94
+ end
95
+ context 'viewing the second page' do
96
+ let(:collection) do
97
+ base_collection.page(2)
98
+ end
99
+ it 'shows the correct indices' do
100
+ expect(index_values).to eq(['3', '4'])
101
+ end
102
+ end
103
+ end
104
+
105
+ context 'allows for zero-based indices' do
106
+ let(:table) do
107
+ render_arbre_component assigns, helpers do
108
+ insert_tag(ActiveAdmin::Views::IndexAsTable::IndexTableFor, collection, {sortable: true}) do
109
+ index_column(0)
110
+ end
111
+ end
112
+ end
113
+
114
+ let(:index_values) do
115
+ table.find_by_tag('tr').map do |row|
116
+ next unless row.find_by_tag('td').first
117
+ row.find_by_tag('td').first.content
118
+ end.compact
119
+ end
120
+
121
+ it 'shows the correct indices' do
122
+ expect(index_values).to eq(['0', '1'])
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_helper'
2
+ require 'active_admin/menu_item'
3
+ require 'active_admin/views/components/menu_item'
4
+
5
+ RSpec.describe ActiveAdmin::Views::MenuItem do
6
+ let(:item) do
7
+ i = ActiveAdmin::MenuItem.new(label: "Dashboard")
8
+ i.add label: "Blog", url: 'blogs'
9
+ i.add label: "Cars", url: 'cars'
10
+ i.add label: "Restricted", url: 'secret', if: proc{false}
11
+ i.add label: "Users", priority: 1, url: 'admin_users'
12
+ i.add label: "Settings", priority: 2, url: 'setup'
13
+ i.add label: "Analytics", priority: 44, url: 'reports'
14
+ i
15
+ end
16
+
17
+ let(:arbe_menu_item) do
18
+ render_arbre_component(item: item) do
19
+ menu_item(item)
20
+ end
21
+ end
22
+
23
+ let(:html) { Capybara.string(arbe_menu_item.to_s) }
24
+
25
+ it "sorts the child items" do
26
+ ids = html.all('li').map { |i| i[:id] }
27
+ expect(ids).to eq %w(dashboard users settings blog cars analytics)
28
+ end
29
+ end
@@ -0,0 +1,168 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::Menu do
4
+
5
+ let(:menu){ ActiveAdmin::Menu.new }
6
+
7
+ let(:assigns){ { active_admin_menu: menu } }
8
+ let(:helpers){ mock_action_view }
9
+
10
+ let(:menu_component) do
11
+ arbre(assigns, helpers) {
12
+ insert_tag(ActiveAdmin::Views::Menu, active_admin_menu)
13
+ }.children.first
14
+ end
15
+
16
+ let(:html) { Capybara.string(menu_component.to_s) }
17
+
18
+ before do
19
+ load_resources { ActiveAdmin.register Post }
20
+ allow(helpers).to receive(:admin_logged_in?).and_return(false)
21
+ end
22
+
23
+ describe "rendering a menu" do
24
+
25
+ before do
26
+ menu.add label: "Blog Posts", url: :admin_posts_path
27
+
28
+ menu.add label: "Reports", url: "/admin/reports" do |reports|
29
+ reports.add label: "A Sub Reports", url: "/admin/a-sub-reports"
30
+ reports.add label: "B Sub Reports", url: "/admin/b-sub-reports"
31
+ reports.add label: proc{ "Label Proc Sub Reports" }, url: "/admin/label-proc-sub-reports", id: "Label Proc Sub Reports"
32
+ end
33
+
34
+ menu.add label: "Administration", url: "/admin/administration" do |administration|
35
+ administration.add label: "User administration",
36
+ url: '/admin/user-administration',
37
+ priority: 10,
38
+ if: proc { false }
39
+ end
40
+
41
+ menu.add label: "Management", url: "#" do |management|
42
+ management.add label: "Order management",
43
+ url: '/admin/order-management',
44
+ priority: 10,
45
+ if: proc { false }
46
+ management.add label: "Bill management",
47
+ url: '/admin/bill-management',
48
+ priority: 10,
49
+ if: :admin_logged_in?
50
+ end
51
+
52
+ menu.add label: "Charles Smith", id: "current_user", url: -> { nil }
53
+ end
54
+
55
+ it "should generate a ul" do
56
+ expect(html).to have_selector("ul")
57
+ end
58
+
59
+ it "should generate an li for each item" do
60
+ expect(html).to have_selector("ul > li")
61
+ end
62
+
63
+ it "should generate a link for each item" do
64
+ expect(html).to have_selector("a[href='/admin/posts']", text: "Blog Posts")
65
+ end
66
+
67
+ it "should generate a nested list for children" do
68
+ expect(html).to have_selector("li > ul")
69
+ end
70
+
71
+ it "should generate a nested list with li for each child" do
72
+ expect(html).to have_selector("ul > li#a_sub_reports")
73
+ expect(html).to have_selector("ul > li#b_sub_reports")
74
+ end
75
+
76
+ it "should generate a valid id from a label proc" do
77
+ expect(html).to have_selector("ul > li#label_proc_sub_reports")
78
+ end
79
+
80
+ it "should not generate a link for user administration" do
81
+ expect(html).to_not have_selector("a[href='/admin/user-administration']", text: "User administration")
82
+ end
83
+
84
+ it "should generate the administration parent menu" do
85
+ expect(html).to have_selector("a[href='/admin/administration']", text: "Administration")
86
+ end
87
+
88
+ it "should not generate a link for order management" do
89
+ expect(html).to_not have_selector("a[href='/admin/order-management']", text: "Order management")
90
+ end
91
+
92
+ it "should not generate a link for bill management" do
93
+ expect(html).to_not have_selector("a[href='/admin/bill-management']", text: "Bill management")
94
+ end
95
+
96
+ it "should not generate the management parent menu" do
97
+ expect(html).to_not have_selector("a[href='#']", text: "Management")
98
+ end
99
+
100
+ context "when url is nil" do
101
+ it "should generate a span" do
102
+ selector = "li#current_user > span"
103
+ expect(html).to have_selector(selector, text: "Charles Smith")
104
+ end
105
+ end
106
+
107
+ describe "marking current item" do
108
+
109
+ it "should add the 'current' class to the li" do
110
+ assigns[:current_tab] = menu["Blog Posts"]
111
+ expect(html).to have_selector("li.current")
112
+ end
113
+
114
+ it "should add the 'current' and 'has_nested' classes to the li and 'current' to the sub li" do
115
+ assigns[:current_tab] = menu["Reports"]["A Sub Reports"]
116
+ expect(html).to have_selector("li#reports.current")
117
+ expect(html).to have_selector("li#reports.has_nested")
118
+ expect(html).to have_selector("li#a_sub_reports.current")
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+
125
+ describe "returning the menu items to display" do
126
+
127
+ it "should return one item with no if block" do
128
+ menu.add label: "Hello World", url: "/"
129
+ expect(menu_component.children.map(&:id)).to eq %w(hello_world)
130
+ end
131
+
132
+ it "should not include menu items with an if block that returns false" do
133
+ menu.add label: "Don't Show", url: "/", priority: 10, if: proc{ false }
134
+ expect(menu_component.children).to be_empty
135
+ end
136
+
137
+ it "should not include menu items with an if block that calls a method that returns false" do
138
+ menu.add label: "Don't Show", url: "/", priority: 10, if: :admin_logged_in?
139
+ expect(menu_component.children).to be_empty
140
+ end
141
+
142
+ it "should not display any items that have no children to display" do
143
+ menu.add label: "Parent", url: "#" do |p|
144
+ p.add label: "Child", url: "/", priority: 10, if: proc{ false }
145
+ end
146
+ expect(html.all('li')).to be_empty
147
+ end
148
+
149
+ it "should display a parent that has a child to display" do
150
+ menu.add label: "Parent", url: "#" do |p|
151
+ p.add label: "Hidden Child", url: "/", priority: 10, if: proc{ false }
152
+ p.add label: "Child", url: "/"
153
+ end
154
+ expect(menu_component.children.size).to eq(1)
155
+ end
156
+
157
+ end
158
+
159
+ describe "sorting items" do
160
+ it "should sort children by the result of their label proc" do
161
+ menu.add label: proc{ "G" }, id: "not related 1"
162
+ menu.add label: proc{ "B" }, id: "not related 2"
163
+ menu.add label: proc{ "A" }, id: "not related 3"
164
+
165
+ expect(menu_component.children.map(&:label)).to eq %w[A B G]
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,249 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Views::PaginatedCollection do
4
+ describe "creating with the dsl" do
5
+
6
+ before :all do
7
+ load_defaults!
8
+ reload_routes!
9
+ end
10
+
11
+ let(:view) do
12
+ view = mock_action_view
13
+ allow(view.request).to receive(:query_parameters).and_return page: '1'
14
+ allow(view.request).to receive(:path_parameters).and_return controller: 'admin/posts', action: 'index'
15
+ view
16
+ end
17
+
18
+ # Helper to render paginated collections within an arbre context
19
+ def paginated_collection(*args)
20
+ render_arbre_component({paginated_collection_args: args}, view) do
21
+ paginated_collection(*paginated_collection_args)
22
+ end
23
+ end
24
+
25
+ let(:collection) do
26
+ posts = [Post.new(title: "First Post"), Post.new(title: "Second Post"), Post.new(title: "Third Post")]
27
+ Kaminari.paginate_array(posts).page(1).per(5)
28
+ end
29
+
30
+ before do
31
+ allow(collection).to receive(:except) { collection } unless collection.respond_to? :except
32
+ allow(collection).to receive(:group_values) { [] } unless collection.respond_to? :group_values
33
+ end
34
+
35
+ let(:pagination){ paginated_collection collection }
36
+
37
+ it "should set :collection as the passed in collection" do
38
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 3</b> posts"
39
+ end
40
+
41
+ it "should raise error if collection has no pagination scope" do
42
+ expect {
43
+ paginated_collection([Post.new, Post.new])
44
+ }.to raise_error(StandardError, "Collection is not a paginated scope. Set collection.page(params[:page]).per(10) before calling :paginated_collection.")
45
+ end
46
+
47
+ it 'should preserve custom query params' do
48
+ allow(view.request).to receive(:query_parameters).and_return page: '1', something: 'else'
49
+ pagination_content = pagination.content
50
+ expect(pagination_content).to include '/admin/posts.csv?page=1&amp;something=else'
51
+ expect(pagination_content).to include '/admin/posts.xml?page=1&amp;something=else'
52
+ expect(pagination_content).to include '/admin/posts.json?page=1&amp;something=else'
53
+ end
54
+
55
+ context "when specifying :param_name option" do
56
+ let(:collection) do
57
+ posts = 10.times.map{ Post.new }
58
+ Kaminari.paginate_array(posts).page(1).per(5)
59
+ end
60
+
61
+ let(:pagination) { paginated_collection(collection, param_name: :post_page) }
62
+
63
+ it "should customize the page number parameter in pagination links" do
64
+ expect(pagination.children.last.content).to match(/\/admin\/posts\?post_page=2/)
65
+ end
66
+ end
67
+
68
+ context "when specifying :params option" do
69
+ let(:collection) do
70
+ posts = 10.times.map{ Post.new }
71
+ Kaminari.paginate_array(posts).page(1).per(5)
72
+ end
73
+
74
+ let(:pagination) { paginated_collection(collection, param_name: :post_page, params: { anchor: 'here' }) }
75
+
76
+ it "should pass it through to Kaminari" do
77
+ expect(pagination.children.last.content).to match(/\/admin\/posts\?post_page=2#here/)
78
+ end
79
+ end
80
+
81
+ context "when specifying download_links: false option" do
82
+ let(:collection) do
83
+ posts = 10.times.map{ Post.new }
84
+ Kaminari.paginate_array(posts).page(1).per(5)
85
+ end
86
+
87
+ let(:pagination) { paginated_collection(collection, download_links: false) }
88
+
89
+ it "should not render download links" do
90
+ expect(pagination.find_by_tag('div').last.content).to_not match(/Download:/)
91
+ end
92
+ end
93
+
94
+ context "when specifying :entry_name option with a single item" do
95
+ let(:collection) do
96
+ posts = [Post.new]
97
+ Kaminari.paginate_array(posts).page(1).per(5)
98
+ end
99
+
100
+ let(:pagination) { paginated_collection(collection, entry_name: "message") }
101
+
102
+ it "should use :entry_name as the collection name" do
103
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>1</b> message"
104
+ end
105
+ end
106
+
107
+ context "when specifying :entry_name option with multiple items" do
108
+ let(:pagination) { paginated_collection(collection, entry_name: "message") }
109
+
110
+ it "should use :entry_name as the collection name" do
111
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 3</b> messages"
112
+ end
113
+ end
114
+
115
+ context "when specifying :entry_name and :entries_name option with a single item" do
116
+ let(:collection) do
117
+ posts = [Post.new]
118
+ Kaminari.paginate_array(posts).page(1).per(5)
119
+ end
120
+
121
+ let(:pagination) { paginated_collection(collection, entry_name: "singular", entries_name: "plural") }
122
+
123
+ it "should use :entry_name as the collection name" do
124
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>1</b> singular"
125
+ end
126
+ end
127
+
128
+ context "when specifying :entry_name and :entries_name option with a multiple items" do
129
+ let(:pagination) { paginated_collection(collection, entry_name: "singular", entries_name: "plural") }
130
+
131
+ it "should use :entries_name as the collection name" do
132
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 3</b> plural"
133
+ end
134
+ end
135
+
136
+ context "when omitting :entry_name with a single item" do
137
+ let(:collection) do
138
+ posts = [Post.new]
139
+ Kaminari.paginate_array(posts).page(1).per(5)
140
+ end
141
+
142
+ it "should use 'post' as the collection name when there is no I18n translation" do
143
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>1</b> post"
144
+ end
145
+
146
+ it "should use 'Singular' as the collection name when there is an I18n translation" do
147
+ allow(I18n).to receive(:translate) { "Singular" }
148
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>1</b> Singular"
149
+ end
150
+ end
151
+
152
+ context "when omitting :entry_name with multiple items" do
153
+ it "should use 'posts' as the collection name when there is no I18n translation" do
154
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 3</b> posts"
155
+ end
156
+
157
+ it "should use 'Plural' as the collection name when there is an I18n translation" do
158
+ allow(I18n).to receive(:translate) { "Plural" }
159
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 3</b> Plural"
160
+ end
161
+ end
162
+
163
+ context "when specifying an empty collection" do
164
+ let(:collection) do
165
+ posts = []
166
+ Kaminari.paginate_array(posts).page(1).per(5)
167
+ end
168
+
169
+ it "should display 'No entries found'" do
170
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "No entries found"
171
+ end
172
+ end
173
+
174
+ context "when collection comes from find with GROUP BY" do
175
+ let(:collection) do
176
+ %w{Foo Foo Bar}.each {|title| Post.create(title: title) }
177
+ Post.select(:title).group(:title).page(1).per(5)
178
+ end
179
+
180
+ it "should display proper message (including number and not hash)" do
181
+ expect(pagination.find_by_class('pagination_information').first.content).to eq "Displaying <b>all 2</b> posts"
182
+ end
183
+ end
184
+
185
+ context "when collection with many pages comes from find with GROUP BY" do
186
+ let(:collection) do
187
+ %w{Foo Foo Bar Baz}.each {|title| Post.create(title: title) }
188
+ Post.select(:title).group(:title).page(1).per(2)
189
+ end
190
+
191
+ it "should display proper message (including number and not hash)" do
192
+ expect(pagination.find_by_class('pagination_information').first.content.gsub('&nbsp;', ' ')).
193
+ to eq "Displaying posts <b>1 - 2</b> of <b>3</b> in total"
194
+ end
195
+ end
196
+
197
+ context "when viewing the last page of a collection that has multiple pages" do
198
+ let(:collection) do
199
+ Kaminari.paginate_array([Post.new] * 81).page(3).per(30)
200
+ end
201
+
202
+ it "should show the proper item counts" do
203
+ expect(pagination.find_by_class('pagination_information').first.content.gsub('&nbsp;', ' ')).
204
+ to eq "Displaying posts <b>61 - 81</b> of <b>81</b> in total"
205
+ end
206
+ end
207
+
208
+ context "with :pagination_total" do
209
+ let(:collection) do
210
+ Kaminari.paginate_array([Post.new] * 256).page(1).per(30)
211
+ end
212
+
213
+ describe "set to false" do
214
+ it "should not show the total item counts" do
215
+ expect(collection).not_to receive(:total_pages)
216
+ pagination = paginated_collection(collection, pagination_total: false)
217
+ info = pagination.find_by_class('pagination_information').first.content.gsub('&nbsp;', ' ')
218
+ expect(info).to eq "Displaying posts <b>1 - 30</b>"
219
+ end
220
+ end
221
+
222
+ describe "set to true" do
223
+ let(:pagination) { paginated_collection(collection, pagination_total: true) }
224
+
225
+ it "should show the total item counts" do
226
+ info = pagination.find_by_class('pagination_information').first.content.gsub('&nbsp;', ' ')
227
+ expect(info).to eq "Displaying posts <b>1 - 30</b> of <b>256</b> in total"
228
+ end
229
+ end
230
+ end
231
+
232
+ context "when specifying per_page: array option" do
233
+ let(:collection) do
234
+ posts = 10.times.map { Post.new }
235
+ Kaminari.paginate_array(posts).page(1).per(5)
236
+ end
237
+
238
+ let(:pagination) { paginated_collection(collection, per_page: [1, 2, 3]) }
239
+ let(:pagination_html) { pagination.find_by_class("pagination_per_page").first }
240
+ let(:pagination_node) { Capybara.string(pagination_html.to_s) }
241
+
242
+ it "should render per_page select tag" do
243
+ expect(pagination_html.content).to match(/Per page:/)
244
+ expect(pagination_node).to have_css("select option", count: 3)
245
+ end
246
+ end
247
+
248
+ end
249
+ end