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,8 @@
1
+ Then /^I should see a columns container$/ do
2
+ expect(page).to have_css '.columns'
3
+ end
4
+
5
+ Then /^I should see (a|\d+) columns?$/ do |count|
6
+ count = count == 'a' ? 1 : count.to_i
7
+ expect(page).to have_css '.column', count: count
8
+ end
@@ -0,0 +1,32 @@
1
+ Then /^I should see a comment by "([^"]*)"$/ do |name|
2
+ step %{I should see "#{name}" within ".active_admin_comment_author"}
3
+ end
4
+
5
+ When /^I add a comment "([^"]*)"$/ do |comment|
6
+ step %{I fill in "active_admin_comment_body" with "#{comment}"}
7
+ step %{I press "Add Comment"}
8
+ end
9
+
10
+ Given /^a tag with the name "([^"]*)" exists$/ do |tag_name|
11
+ Tag.create(name: tag_name)
12
+ end
13
+
14
+ Given /^(a|\d+) comments added by admin with an email "([^"]+)"?$/ do |number, email|
15
+ number = number == 'a' ? 1 : number.to_i
16
+ admin_user = ensure_user_created(email)
17
+
18
+ comment_text = 'Comment %i'
19
+
20
+ number.times do |i|
21
+ ActiveAdmin::Comment.create!(namespace: 'admin',
22
+ body: comment_text % i,
23
+ resource_type: Post.to_s,
24
+ resource_id: Post.first.id,
25
+ author_type: admin_user.class.to_s,
26
+ author_id: admin_user.id)
27
+ end
28
+ end
29
+
30
+ Then /^I should see (\d+) comments?$/ do |number|
31
+ expect(page).to have_selector('div.active_admin_comment', count: number.to_i)
32
+ end
@@ -0,0 +1,102 @@
1
+ module ActiveAdminReloading
2
+ def load_aa_config(config_content)
3
+ ActiveSupport::Notifications.publish ActiveAdmin::Application::BeforeLoadEvent, ActiveAdmin.application
4
+ eval(config_content)
5
+ ActiveSupport::Notifications.publish ActiveAdmin::Application::AfterLoadEvent, ActiveAdmin.application
6
+ Rails.application.reload_routes!
7
+ end
8
+ end
9
+
10
+ module ActiveAdminContentsRollback
11
+ def files
12
+ @files ||= {}
13
+ end
14
+
15
+ # Records the contents of a file the first time we are
16
+ # about to change it
17
+ def record(filename)
18
+ contents = File.read(filename) rescue nil
19
+ files[filename] = contents unless files.has_key? filename
20
+ end
21
+
22
+ # Rolls the recorded files back to their original states
23
+ def rollback!
24
+ files.each{ |file, contents| rollback_file(file, contents) }
25
+ @files = {}
26
+ end
27
+
28
+ # If the file originally had content, override the stuff on disk.
29
+ # Else, remove the file and its parent folder structure until Rails.root OR other files exist.
30
+ def rollback_file(file, contents)
31
+ if contents.present?
32
+ File.open(file, 'w') { |f| f << contents }
33
+ else
34
+ File.delete(file)
35
+ begin
36
+ dir = File.dirname(file)
37
+ until dir == Rails.root
38
+ Dir.rmdir(dir) # delete current folder
39
+ dir = dir.split('/')[0..-2].join('/') # select parent folder
40
+ end
41
+ rescue Errno::ENOTEMPTY # Directory not empty
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ World(ActiveAdminReloading)
48
+ World(ActiveAdminContentsRollback)
49
+
50
+ After do
51
+ rollback!
52
+
53
+ # Clear cached ActionView template partials.
54
+ ActionView::LookupContext::DetailsKey.clear
55
+ end
56
+
57
+ Given /^a(?:n? (index|show))? configuration of:$/ do |action, config_content|
58
+ load_aa_config(config_content)
59
+
60
+ case action
61
+ when 'index'
62
+ step 'I am logged in'
63
+ case resource = config_content.match(/ActiveAdmin\.register (\w+)/)[1]
64
+ when 'Post'
65
+ step 'I am on the index page for posts'
66
+ when 'Category'
67
+ step 'I am on the index page for categories'
68
+ else
69
+ raise "#{resource} is not supported"
70
+ end
71
+ when 'show'
72
+ case resource = config_content.match(/ActiveAdmin\.register (\w+)/)[1]
73
+ when 'Post'
74
+ step 'I am logged in'
75
+ step 'I am on the index page for posts'
76
+ step 'I follow "View"'
77
+ when 'Tag'
78
+ step 'I am logged in'
79
+ Tag.create!
80
+ visit admin_tag_path Tag.last
81
+ else
82
+ raise "#{resource} is not supported"
83
+ end
84
+ end
85
+ end
86
+
87
+ Given /^"([^"]*)" contains:$/ do |filename, contents|
88
+ path = Rails.root + filename
89
+ FileUtils.mkdir_p File.dirname path
90
+ record path
91
+
92
+ File.open(path, 'w+'){ |f| f << contents }
93
+ end
94
+
95
+ Given /^I add "([^"]*)" to the "([^"]*)" model$/ do |code, model_name|
96
+ path = File.join Rails.root, "app", "models", "#{model_name}.rb"
97
+ record path
98
+
99
+ str = File.read(path).gsub /^(class .+)$/, "\\1\n #{code}\n"
100
+ File.open(path, 'w+') { |f| f << str }
101
+ ActiveSupport::Dependencies.clear
102
+ end
@@ -0,0 +1,15 @@
1
+ Then /^I should see the default welcome message$/ do
2
+ step %{I should see "Welcome to Active Admin" within "#dashboard_default_message"}
3
+ end
4
+
5
+ Then /^I should not see the default welcome message$/ do
6
+ step %{I should not see "Welcome to Active Admin"}
7
+ end
8
+
9
+ Then /^I should see a dashboard widget "([^"]*)"$/ do |name|
10
+ expect(page).to have_css '.dashboard .panel h3', text: name
11
+ end
12
+
13
+ Then /^I should not see a dashboard widget "([^"]*)"$/ do |name|
14
+ expect(page).to_not have_css '.dashboard .panel h3', text: name
15
+ end
@@ -0,0 +1,35 @@
1
+ def create_user(name, type = 'User')
2
+ first_name, last_name = name.split(' ')
3
+ user = type.camelize.constantize.where(first_name: first_name, last_name: last_name).first_or_create(username: name.tr(' ', '').underscore)
4
+ end
5
+
6
+ Given /^(a|\d+)( published)?( unstarred|starred)? posts?(?: with the title "([^"]*)")?(?: and body "([^"]*)")?(?: written by "([^"]*)")?(?: in category "([^"]*)")? exists?$/ do |count, published, starred, title, body, user, category_name|
7
+ count = count == 'a' ? 1 : count.to_i
8
+ published = Time.now if published
9
+ starred = starred == " starred" if starred
10
+ author = create_user(user) if user
11
+ category = Category.where(name: category_name).first_or_create if category_name
12
+ title ||= "Hello World %i"
13
+ count.times do |i|
14
+ Post.create! title: title % i, body: body, author: author, published_date: published, custom_category_id: category.try(:id), starred: starred
15
+ end
16
+ end
17
+
18
+ Given /^a category named "([^"]*)" exists$/ do |name|
19
+ Category.create! name: name
20
+ end
21
+
22
+ Given /^a (user|publisher) named "([^"]*)" exists$/ do |type, name|
23
+ create_user name, type
24
+ end
25
+
26
+ Given /^a store named "([^"]*)" exists$/ do |name|
27
+ Store.create! name: name
28
+ end
29
+
30
+ Given /^I create a new post with the title "([^"]*)"$/ do |title|
31
+ first(:link, 'Posts').click
32
+ click_link "New Post"
33
+ fill_in 'post_title', with: title
34
+ click_button "Create Post"
35
+ end
@@ -0,0 +1,57 @@
1
+ Around '@filters' do |scenario, block|
2
+ previous_current_filters = ActiveAdmin.application.current_filters
3
+
4
+ begin
5
+ block.call
6
+ ensure
7
+ ActiveAdmin.application.current_filters = previous_current_filters
8
+ end
9
+ end
10
+
11
+ Then /^I should see a select filter for "([^"]*)"$/ do |label|
12
+ expect(page).to have_css '.filter_select label', text: label
13
+ end
14
+
15
+ Then /^I should see a string filter for "([^"]*)"$/ do |label|
16
+ expect(page).to have_css '.filter_string label', text: label
17
+ end
18
+
19
+ Then /^I should see a date range filter for "([^"]*)"$/ do |label|
20
+ expect(page).to have_css '.filter_date_range label', text: label
21
+ end
22
+
23
+ Then /^I should see the following filters:$/ do |table|
24
+ table.rows_hash.each do |label, type|
25
+ step %{I should see a #{type} filter for "#{label}"}
26
+ end
27
+ end
28
+
29
+ Given(/^I add parameter "([^"]*)" with value "([^"]*)" to the URL$/) do |key, value|
30
+ url = page.current_url
31
+ separator = url.include?('?') ? '&' : '?'
32
+ visit url + separator + key.to_s + '=' + value.to_s
33
+ end
34
+
35
+ Then(/^I should( not)? have parameter "([^"]*)" with value "([^"]*)"$/) do |negative, key, value|
36
+ query = URI(page.current_url).query
37
+ if query.nil?
38
+ expect(negative).to eq true
39
+ else
40
+ params = Rack::Utils.parse_query query
41
+ expect(params[key]).to_not eq value if negative
42
+ expect(params[key]).to eq value unless negative
43
+ end
44
+ end
45
+
46
+ Then /^I should see current filter "([^"]*)" equal to "([^"]*)" with label "([^"]*)"$/ do |name, value, label|
47
+ expect(page).to have_css "li.current_filter_#{name} span", text: label
48
+ expect(page).to have_css "li.current_filter_#{name} b", text: value
49
+ end
50
+
51
+ Then /^I should see current filter "([^"]*)" equal to "([^"]*)"$/ do |name, value|
52
+ expect(page).to have_css "li.current_filter_#{name} b", text: value
53
+ end
54
+
55
+ Then /^I should see link "([^"]*)" in current filters/ do |label|
56
+ expect(page).to have_css "li.current_filter b a", text: label
57
+ end
@@ -0,0 +1,11 @@
1
+ Then /^I should see a flash with "([^"]*)"$/ do |text|
2
+ expect(page).to have_content text
3
+ end
4
+
5
+ Then /^I should see a successful create flash$/ do
6
+ expect(page).to have_css 'div.flash_notice', text: /was successfully created/
7
+ end
8
+
9
+ Then /^I should not see a successful create flash$/ do
10
+ expect(page).to_not have_css 'div.flash_notice', text: /was successfully created/
11
+ end
@@ -0,0 +1,21 @@
1
+ Around '@footer' do |scenario, block|
2
+ previous_footer = ActiveAdmin.application.footer
3
+
4
+ begin
5
+ block.call
6
+ ensure
7
+ ActiveAdmin.application.footer = previous_footer
8
+ end
9
+ end
10
+
11
+ Then /^I should see the default footer$/ do
12
+ expect(page).to have_css '#footer', text: "Powered by Active Admin #{ActiveAdmin::VERSION}"
13
+ end
14
+
15
+ Then /^I should see the footer "([^"]*)"$/ do |footer|
16
+ expect(page).to have_css '#footer', text: footer
17
+ end
18
+
19
+ Then /^I should not see the footer "([^"]*)"$/ do |footer|
20
+ expect(page).to_not have_css '#footer', text: footer
21
+ end
@@ -0,0 +1,60 @@
1
+ require 'csv'
2
+
3
+ Around '@csv' do |scenario, block|
4
+ default_csv_options = ActiveAdmin.application.csv_options
5
+ default_disable_streaming_in = ActiveAdmin.application.disable_streaming_in
6
+
7
+ begin
8
+ block.call
9
+ ensure
10
+ ActiveAdmin.application.disable_streaming_in = default_disable_streaming_in
11
+ ActiveAdmin.application.csv_options = default_csv_options
12
+ end
13
+ end
14
+
15
+ Then "I should see nicely formatted datetimes" do
16
+ expect(page.body).to match /\w+ \d{1,2}, \d{4} \d{2}:\d{2}/
17
+ end
18
+
19
+ Then /^I should( not)? see a link to download "([^"]*)"$/ do |negate, format|
20
+ method = negate ? :to_not : :to
21
+ expect(page).send method, have_css("#index_footer a", text: format)
22
+ end
23
+
24
+ # Check first rows of the displayed CSV.
25
+ Then /^I should download a CSV file with "([^"]*)" separator for "([^"]*)" containing:$/ do |sep, resource_name, table|
26
+ body = page.driver.response.body
27
+ content_type_header, content_disposition_header = %w[Content-Type Content-Disposition].map do |header_name|
28
+ page.response_headers[header_name]
29
+ end
30
+ expect(content_type_header).to eq 'text/csv; charset=utf-8'
31
+ expect(content_disposition_header).to match /\Aattachment; filename=".+?\.csv"\z/
32
+
33
+ csv = CSV.parse(body, col_sep: sep)
34
+ table.raw.each_with_index do |expected_row, row_index|
35
+ expected_row.each_with_index do |expected_cell, col_index|
36
+ cell = csv.try(:[], row_index).try(:[], col_index)
37
+ if expected_cell.blank?
38
+ expect(cell).to eq nil
39
+ else
40
+ expect(cell || '').to match /#{expected_cell}/
41
+ end
42
+ end
43
+ end
44
+ end
45
+
46
+ Then /^I should download a CSV file for "([^"]*)" containing:$/ do |resource_name, table|
47
+ step %{I should download a CSV file with "," separator for "#{resource_name}" containing:}, table
48
+ end
49
+
50
+ Then /^the CSV file should contain "([^"]*)" in quotes$/ do |text|
51
+ expect(page.driver.response.body).to match /"#{text}"/
52
+ end
53
+
54
+ Then /^the encoding of the CSV file should be "([^"]*)"$/ do |text|
55
+ expect(page.driver.response.body.encoding).to be Encoding.find(Encoding.aliases[text] || text)
56
+ end
57
+
58
+ Then /^access denied$/ do
59
+ expect(page).to have_content(I18n.t("active_admin.access_denied.message"))
60
+ end
@@ -0,0 +1,11 @@
1
+ Given /^String "([^"]*)" corresponds to "([^"]*)"$/ do |translation, key|
2
+ *seq, last_key = key.split('.')
3
+ result = seq.reverse.inject({last_key.to_sym => translation}) do |temp_result, nested_key|
4
+ {nested_key.to_sym => temp_result}
5
+ end
6
+ I18n.backend.store_translations :en, active_admin: result
7
+ end
8
+
9
+ When /^I set my locale to "([^"]*)"$/ do |lang|
10
+ I18n.locale = lang
11
+ end
@@ -0,0 +1,42 @@
1
+ Then /^I should( not)? see the scope "([^"]*)"( selected)?$/ do |negate, name, selected|
2
+ should = "I should#{' not' if negate}"
3
+ scope = ".scopes#{' .selected' if selected}"
4
+ step %{#{should} see "#{name}" within "#{scope}"}
5
+ end
6
+
7
+ Then /^I should see the scope "([^"]*)" not selected$/ do |name|
8
+ step %{I should see the scope "#{name}"}
9
+ expect(page).to_not have_css '.scopes .selected', text: name
10
+ end
11
+
12
+ Then /^I should see the scope "([^"]*)" with the count (\d+)$/ do |name, count|
13
+ name = name.tr(' ', '').underscore.downcase
14
+ step %{I should see "#{count}" within ".scopes .#{name} .count"}
15
+ end
16
+
17
+ Then /^I should see the scope with label "([^"]*)"$/ do |label|
18
+ expect(page).to have_link(label)
19
+ end
20
+
21
+ Then /^I should see the current scope with label "([^"]*)"$/ do |label|
22
+ expect(page).to have_css '.current_scope_name', text: label
23
+ end
24
+
25
+ Then /^I should see the scope "([^"]*)" with no count$/ do |name|
26
+ name = name.tr(" ", "").underscore.downcase
27
+ expect(page).to have_css ".scopes .#{name}"
28
+ expect(page).to_not have_css ".scopes .#{name} .count"
29
+ end
30
+
31
+ Then "I should see a group {string} with the scopes {string} and {string}" do |group, name1, name2|
32
+ group = group.tr(" ", "").underscore.downcase
33
+ name1 = name1.tr(" ", "").underscore.downcase
34
+ name2 = name2.tr(" ", "").underscore.downcase
35
+ expect(page).to have_css ".scopes .scope-group-#{group} .#{name1}"
36
+ expect(page).to have_css ".scopes .scope-group-#{group} .#{name2}"
37
+ end
38
+
39
+ Then"I should see an empty group with the scope {string}" do |name|
40
+ name = name.tr(" ", "").underscore.downcase
41
+ expect(page).to have_css ".scopes .scope-default-group .#{name}"
42
+ end
@@ -0,0 +1,3 @@
1
+ When /^I click "(.*?)"$/ do |link|
2
+ click_link(link)
3
+ end
@@ -0,0 +1,3 @@
1
+ Then /^I should see the Active Admin layout$/ do
2
+ expect(page).to have_css '#active_admin_content #main_content_wrapper'
3
+ end
@@ -0,0 +1,7 @@
1
+ Then /^I should see an action item button "([^"]*)"$/ do |content|
2
+ expect(page).to have_css '.action_items a', text: content
3
+ end
4
+
5
+ Then /^I should not see an action item button "([^"]*)"$/ do |content|
6
+ expect(page).to_not have_css '.action_items', text: content
7
+ end
@@ -0,0 +1,11 @@
1
+ Then /^I should see a menu item for "([^"]*)"$/ do |name|
2
+ expect(page).to have_css '#tabs > li > a', text: name
3
+ end
4
+
5
+ Then /^I should not see a menu item for "([^"]*)"$/ do |name|
6
+ expect(page).to_not have_css '#tabs > li > a', text: name
7
+ end
8
+
9
+ Then /^I should see a nested menu item for "([^"]*)"$/ do |name|
10
+ expect(page).to have_css '#tabs > li > ul > li > a', text: name
11
+ end
@@ -0,0 +1,3 @@
1
+ Then /^the site should contain a meta tag with name "([^"]*)" and content "([^"]*)"$/ do |name, content|
2
+ expect(page).to have_xpath("//meta[@name='#{name}' and @content='#{content}']", visible: false)
3
+ end
@@ -0,0 +1,15 @@
1
+ Then /^I should not see pagination$/ do
2
+ expect(page).to_not have_css '.pagination'
3
+ end
4
+
5
+ Then /^I should see pagination with (\d+) pages$/ do |count|
6
+ expect(page).to have_css '.pagination span.page', count: count
7
+ end
8
+
9
+ Then /^I should see the pagination "Next" link/ do
10
+ expect(page).to have_css "a", text: "Next"
11
+ end
12
+
13
+ Then /^I should not see the pagination "Next" link/ do
14
+ expect(page).to_not have_css "a", text: "Next"
15
+ end
@@ -0,0 +1,9 @@
1
+ Around '@root' do |scenario, block|
2
+ previous_root = ActiveAdmin.application.root_to
3
+
4
+ begin
5
+ block.call
6
+ ensure
7
+ ActiveAdmin.application.root_to = previous_root
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ Then /^I should see a sidebar titled "([^"]*)"$/ do |title|
2
+ expect(page).to have_css '.sidebar_section h3', text: title
3
+ end
4
+
5
+ Then /^I should not see a sidebar titled "([^"]*)"$/ do |title|
6
+ expect(page).not_to have_css '.sidebar_section h3', text: title
7
+ end
8
+
9
+ Then(/^I should see a sidebar titled "(.*?)" above sidebar titled "(.*?)"$/) do |top_title, bottom_title|
10
+ expect(page).to have_css %Q(.sidebar_section:contains('#{top_title}') + .sidebar_section:contains('#{bottom_title}'))
11
+ end
@@ -0,0 +1,31 @@
1
+ Around '@site_title' do |scenario, block|
2
+ previous_site_title = ActiveAdmin.application.site_title
3
+ previous_site_title_link = ActiveAdmin.application.site_title_link
4
+ previous_site_title_image = ActiveAdmin.application.site_title_image
5
+
6
+ begin
7
+ block.call
8
+ ensure
9
+ ActiveAdmin.application.site_title = previous_site_title
10
+ ActiveAdmin.application.site_title_link = previous_site_title_link
11
+ ActiveAdmin.application.site_title_image = previous_site_title_image
12
+ end
13
+ end
14
+
15
+ Then /^I should see the site title "([^"]*)"$/ do |title|
16
+ expect(page).to have_css 'h1#site_title', text: title
17
+ end
18
+
19
+ Then /^I should not see the site title "([^"]*)"$/ do |title|
20
+ expect(page).to_not have_css 'h1#site_title', text: title
21
+ end
22
+
23
+ Then /^I should see the site title image "([^"]*)"$/ do |image|
24
+ img = page.find('h1#site_title img')
25
+ expect(img[:src]).to eq(image)
26
+ end
27
+
28
+ Then /^I should see the site title image linked to "([^"]*)"$/ do |url|
29
+ link = page.find('h1#site_title a')
30
+ expect(link[:href]).to eq(url)
31
+ end
@@ -0,0 +1,17 @@
1
+ Then(/^the "([^"]*)" tab should be selected$/) do |name|
2
+ step %{I should see "#{name}" within "ul#tabs li.current"}
3
+ end
4
+
5
+ Then("I should see tabs:") do |table|
6
+ table.rows.each do |title, _|
7
+ step %{I should see "#{title}" within "#main_content .tabs .nav"}
8
+ end
9
+ end
10
+
11
+ Then("I should see tab content {string}") do |string|
12
+ step %{I should see "#{string}" within "#main_content .tabs .tab-content"}
13
+ end
14
+
15
+ Then("I should not see tab content {string}") do |string|
16
+ step %{I should not see "#{string}" within "#main_content .tabs .tab-content"}
17
+ end
@@ -0,0 +1,116 @@
1
+ Then /^I should see (\d+) ([\w]*) in the table$/ do |count, resource_type|
2
+ expect(page).to \
3
+ have_css("table.index_table tr > td:first-child", count: count.to_i)
4
+ end
5
+
6
+ # TODO: simplify this, if possible?
7
+ class HtmlTableToTextHelper
8
+ def initialize(html, table_css_selector = "table")
9
+ @html = html
10
+ @selector = table_css_selector
11
+ end
12
+
13
+ def to_array
14
+ rows = Nokogiri::HTML(@html).css("#{@selector} tr")
15
+ rows.map do |row|
16
+ row.css('th, td').map do |td|
17
+ cell_to_string(td)
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def cell_to_string(td)
25
+ str = ""
26
+ input = td.css('input').last
27
+
28
+ if input
29
+ str << input_to_string(input)
30
+ end
31
+
32
+ str << td.content.strip.gsub("\n", ' ')
33
+ end
34
+
35
+ def input_to_string(input)
36
+ case input.attribute("type").value
37
+ when "checkbox"
38
+ if input.attribute("disabled")
39
+ "_"
40
+ else
41
+ if input.attribute("checked")
42
+ "[X]"
43
+ else
44
+ "[ ]"
45
+ end
46
+ end
47
+ when "text"
48
+ if input.attribute("value").present?
49
+ "[#{input.attribute("value")}]"
50
+ else
51
+ "[ ]"
52
+ end
53
+ when "submit"
54
+ input.attribute("value")
55
+ else
56
+ raise "I don't know what to do with #{input}"
57
+ end
58
+ end
59
+ end
60
+
61
+ module TableMatchHelper
62
+ # @param table [Array[Array]]
63
+ # @param expected_table [Array[Array[String]]]
64
+ # The expected_table values are String. They are converted to
65
+ # Regexp when they start and end with a '/'
66
+ # Example:
67
+ #
68
+ # assert_table_match(
69
+ # [["Name", "Date"], ["Philippe", "Feb 08"]],
70
+ # [["Name", "Date"], ["Philippe", "/\w{3} \d{2}/"]]
71
+ # )
72
+ def assert_tables_match(table, expected_table)
73
+ expected_table.each_index do |row_index|
74
+ expected_table[row_index].each_index do |column_index|
75
+ expected_cell = expected_table[row_index][column_index]
76
+ cell = table.try(:[], row_index).try(:[], column_index)
77
+ begin
78
+ assert_cells_match(cell, expected_cell)
79
+ rescue
80
+ puts "Cell at line #{row_index} and column #{column_index}: #{cell.inspect} does not match #{expected_cell.inspect}"
81
+ puts "Expecting:"
82
+ table.each { |row| puts row.inspect }
83
+ puts "to match:"
84
+ expected_table.each { |row| puts row.inspect }
85
+ raise $!
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ def assert_cells_match(cell, expected_cell)
92
+ if expected_cell =~ /^\/.*\/$/
93
+ expect(cell).to match /#{expected_cell[1..-2]}/
94
+ else
95
+ expect((cell || "").strip).to eq expected_cell
96
+ end
97
+ end
98
+ end
99
+
100
+ World(TableMatchHelper)
101
+
102
+ # Usage:
103
+ #
104
+ # I should see the "invoices" table:
105
+ # | Invoice # | Date | Total Amount |
106
+ # | /\d+/ | 27/01/12 | $30.00 |
107
+ # | /\d+/ | 12/02/12 | $25.00 |
108
+ #
109
+ Then /^I should see the "([^"]*)" table:$/ do |table_id, expected_table|
110
+ expect(page).to have_css "table##{table_id}"
111
+
112
+ assert_tables_match(
113
+ HtmlTableToTextHelper.new(page.body, "table##{table_id}").to_array,
114
+ expected_table.raw
115
+ )
116
+ end