yousty-activeadmin 1.0.4.pre → 1.0.5.pre

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +261 -211
  3. data/CONTRIBUTING.md +73 -39
  4. data/Gemfile +38 -20
  5. data/Guardfile +1 -0
  6. data/LICENSE +1 -1
  7. data/README.md +48 -24
  8. data/Rakefile +12 -4
  9. data/activeadmin.gemspec +21 -26
  10. data/app/assets/javascripts/active_admin/application.js.coffee +34 -5
  11. data/app/assets/javascripts/active_admin/base.js.coffee +11 -2
  12. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  13. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  14. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  15. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +3 -4
  16. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +51 -55
  17. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  18. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  19. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  20. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  21. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +29 -58
  22. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +2 -3
  23. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  24. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +51 -15
  25. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  26. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  27. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  28. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  29. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  30. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -12
  32. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +3 -1
  33. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  34. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  35. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  36. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +0 -0
  37. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  38. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  39. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +1 -0
  40. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  41. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  42. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  43. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -0
  44. data/app/assets/stylesheets/active_admin/mixins/{_gradients.css.scss → _gradients.scss} +1 -1
  45. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  46. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_rounded.css.scss → _rounded.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +7 -1
  49. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  51. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  52. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +10 -7
  53. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  54. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  55. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  56. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  57. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  58. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  59. data/app/views/active_admin/devise/sessions/new.html.erb +8 -8
  60. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  61. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  62. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  63. data/config/locales/ar.yml +120 -0
  64. data/config/locales/bg.yml +26 -6
  65. data/config/locales/bs.yml +122 -0
  66. data/config/locales/ca.yml +10 -1
  67. data/config/locales/cs.yml +7 -2
  68. data/config/locales/da.yml +7 -3
  69. data/config/locales/de-CH.yml +14 -31
  70. data/config/locales/de.yml +33 -33
  71. data/config/locales/el.yml +127 -0
  72. data/config/locales/en-GB.yml +11 -4
  73. data/config/locales/en.yml +21 -4
  74. data/config/locales/{es_MX.yml → es-MX.yml} +14 -24
  75. data/config/locales/es.yml +32 -25
  76. data/config/locales/fa.yml +120 -0
  77. data/config/locales/fi.yml +9 -5
  78. data/config/locales/fr.yml +28 -12
  79. data/config/locales/he.yml +7 -3
  80. data/config/locales/hr.yml +42 -11
  81. data/config/locales/hu.yml +10 -3
  82. data/config/locales/it.yml +31 -3
  83. data/config/locales/ja.yml +17 -4
  84. data/config/locales/ko.yml +7 -1
  85. data/config/locales/lt.yml +42 -11
  86. data/config/locales/lv.yml +7 -3
  87. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  88. data/config/locales/nl.yml +36 -5
  89. data/config/locales/pl.yml +13 -8
  90. data/config/locales/pt-BR.yml +36 -5
  91. data/config/locales/pt-PT.yml +8 -4
  92. data/config/locales/ro.yml +7 -3
  93. data/config/locales/ru.yml +26 -5
  94. data/config/locales/sv-SE.yml +9 -5
  95. data/config/locales/tr.yml +10 -3
  96. data/config/locales/uk.yml +36 -12
  97. data/config/locales/vi.yml +7 -3
  98. data/config/locales/zh-CN.yml +26 -10
  99. data/config/locales/zh-TW.yml +19 -13
  100. data/docs/0-installation.md +14 -6
  101. data/docs/1-general-configuration.md +8 -5
  102. data/docs/10-custom-pages.md +68 -70
  103. data/docs/11-decorators.md +48 -59
  104. data/docs/12-arbre-components.md +79 -73
  105. data/docs/13-authorization-adapter.md +128 -107
  106. data/docs/14-gotchas.md +90 -0
  107. data/docs/2-resource-customization.md +82 -15
  108. data/docs/3-index-pages.md +71 -12
  109. data/docs/3-index-pages/custom-index.md +31 -0
  110. data/docs/3-index-pages/index-as-table.md +45 -2
  111. data/docs/4-csv-format.md +1 -1
  112. data/docs/5-forms.md +78 -29
  113. data/docs/6-show-pages.md +31 -3
  114. data/docs/7-sidebars.md +46 -25
  115. data/docs/8-custom-actions.md +98 -77
  116. data/docs/9-batch-actions.md +211 -133
  117. data/docs/README.md +24 -0
  118. data/features/action_item.feature +3 -3
  119. data/features/authorization_pundit.feature +37 -0
  120. data/features/belongs_to.feature +3 -0
  121. data/features/breadcrumb.feature +48 -0
  122. data/features/comments/commenting.feature +44 -13
  123. data/features/development_reloading.feature +3 -4
  124. data/features/edit_page.feature +9 -19
  125. data/features/favicon.feature +3 -3
  126. data/features/i18n.feature +5 -0
  127. data/features/index/batch_actions.feature +41 -0
  128. data/features/index/filters.feature +23 -0
  129. data/features/index/format_as_csv.feature +90 -4
  130. data/features/index/index_as_blog.feature +4 -4
  131. data/features/index/index_as_table.feature +102 -6
  132. data/features/index/index_blank_slate.feature +22 -0
  133. data/features/index/index_scope_to.feature +16 -16
  134. data/features/index/page_title.feature +11 -0
  135. data/features/index/pagination.feature +1 -1
  136. data/features/index/switch_index_view.feature +14 -14
  137. data/features/new_page.feature +10 -20
  138. data/features/registering_pages.feature +1 -1
  139. data/features/renamed_resource.feature +32 -0
  140. data/features/show/page_title.feature +11 -0
  141. data/features/show/tabs.feature +27 -0
  142. data/features/sidebar_sections.feature +12 -0
  143. data/features/specifying_actions.feature +3 -3
  144. data/features/step_definitions/action_item_steps.rb +2 -2
  145. data/features/step_definitions/action_link_steps.rb +14 -1
  146. data/features/step_definitions/additional_web_steps.rb +17 -18
  147. data/features/step_definitions/asset_steps.rb +3 -3
  148. data/features/step_definitions/attribute_steps.rb +8 -3
  149. data/features/step_definitions/batch_action_steps.rb +26 -9
  150. data/features/step_definitions/blog_steps.rb +3 -0
  151. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  152. data/features/step_definitions/comment_steps.rb +1 -1
  153. data/features/step_definitions/configuration_steps.rb +1 -1
  154. data/features/step_definitions/dashboard_steps.rb +2 -2
  155. data/features/step_definitions/factory_steps.rb +6 -6
  156. data/features/step_definitions/filter_steps.rb +25 -3
  157. data/features/step_definitions/flash_steps.rb +3 -3
  158. data/features/step_definitions/format_steps.rb +17 -10
  159. data/features/step_definitions/index_scope_steps.rb +5 -5
  160. data/features/step_definitions/layout_steps.rb +1 -1
  161. data/features/step_definitions/member_link_steps.rb +2 -2
  162. data/features/step_definitions/menu_steps.rb +3 -3
  163. data/features/step_definitions/pagination_steps.rb +2 -3
  164. data/features/step_definitions/sidebar_steps.rb +8 -3
  165. data/features/step_definitions/site_title_steps.rb +6 -4
  166. data/features/step_definitions/symbol_leak_steps.rb +1 -1
  167. data/features/step_definitions/tab_steps.rb +5 -0
  168. data/features/step_definitions/table_steps.rb +4 -4
  169. data/features/step_definitions/user_steps.rb +15 -9
  170. data/features/step_definitions/web_steps.rb +10 -11
  171. data/features/sti_resource.feature +2 -10
  172. data/features/strong_parameters.feature +73 -0
  173. data/features/support/env.rb +35 -2
  174. data/features/support/paths.rb +2 -2
  175. data/features/support/selectors.rb +1 -1
  176. data/features/users/resetting_password.feature +7 -7
  177. data/lib/active_admin.rb +18 -13
  178. data/lib/active_admin/abstract_view_factory.rb +7 -17
  179. data/lib/active_admin/application.rb +50 -25
  180. data/lib/active_admin/asset_registration.rb +2 -2
  181. data/lib/active_admin/authorization_adapter.rb +2 -2
  182. data/lib/active_admin/base_controller.rb +2 -3
  183. data/lib/active_admin/base_controller/authorization.rb +13 -31
  184. data/lib/active_admin/batch_actions.rb +1 -1
  185. data/lib/active_admin/batch_actions/controller.rb +13 -7
  186. data/lib/active_admin/batch_actions/resource_extension.rb +43 -17
  187. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  188. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  189. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  190. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  191. data/lib/active_admin/callbacks.rb +25 -24
  192. data/lib/active_admin/cancan_adapter.rb +7 -11
  193. data/lib/active_admin/csv_builder.rb +92 -15
  194. data/lib/active_admin/dependency.rb +93 -0
  195. data/lib/active_admin/deprecation.rb +6 -7
  196. data/lib/active_admin/devise.rb +26 -14
  197. data/lib/active_admin/dsl.rb +18 -11
  198. data/lib/active_admin/engine.rb +7 -2
  199. data/lib/active_admin/error.rb +59 -0
  200. data/lib/active_admin/filters/dsl.rb +2 -2
  201. data/lib/active_admin/filters/forms.rb +19 -30
  202. data/lib/active_admin/filters/formtastic_addons.rb +20 -11
  203. data/lib/active_admin/filters/resource_extension.rb +16 -9
  204. data/lib/active_admin/form_builder.rb +94 -105
  205. data/lib/active_admin/helpers/collection.rb +7 -13
  206. data/lib/active_admin/helpers/i18n.rb +7 -0
  207. data/lib/active_admin/helpers/optional_display.rb +5 -5
  208. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  209. data/lib/active_admin/helpers/settings.rb +16 -9
  210. data/lib/active_admin/iconic.rb +17 -15
  211. data/lib/active_admin/iconic/icons.rb +136 -136
  212. data/lib/active_admin/inputs.rb +11 -7
  213. data/lib/active_admin/inputs/datepicker_input.rb +1 -1
  214. data/lib/active_admin/inputs/filters/base.rb +42 -0
  215. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  216. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  217. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  218. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  219. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  220. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  221. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  222. data/lib/active_admin/menu.rb +3 -3
  223. data/lib/active_admin/menu_collection.rb +1 -4
  224. data/lib/active_admin/namespace.rb +52 -29
  225. data/lib/active_admin/order_clause.rb +26 -0
  226. data/lib/active_admin/orm/active_record.rb +2 -0
  227. data/lib/active_admin/orm/active_record/comments.rb +48 -51
  228. data/lib/active_admin/orm/active_record/comments/comment.rb +16 -10
  229. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +1 -1
  230. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +1 -1
  231. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +15 -13
  232. data/lib/active_admin/page.rb +5 -1
  233. data/lib/active_admin/page_dsl.rb +1 -1
  234. data/lib/active_admin/page_presenter.rb +2 -2
  235. data/lib/active_admin/pundit_adapter.rb +68 -0
  236. data/lib/active_admin/resource.rb +12 -3
  237. data/lib/active_admin/resource/action_items.rb +15 -8
  238. data/lib/active_admin/resource/belongs_to.rb +7 -3
  239. data/lib/active_admin/resource/controllers.rb +1 -0
  240. data/lib/active_admin/resource/includes.rb +12 -0
  241. data/lib/active_admin/resource/menu.rb +5 -5
  242. data/lib/active_admin/resource/naming.rb +25 -47
  243. data/lib/active_admin/resource/page_presenters.rb +1 -1
  244. data/lib/active_admin/resource/routes.rb +26 -10
  245. data/lib/active_admin/resource/scope_to.rb +7 -7
  246. data/lib/active_admin/resource/sidebars.rb +1 -0
  247. data/lib/active_admin/resource_collection.rb +44 -16
  248. data/lib/active_admin/resource_controller.rb +6 -5
  249. data/lib/active_admin/resource_controller/data_access.rb +87 -82
  250. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  251. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  252. data/lib/active_admin/resource_dsl.rb +54 -10
  253. data/lib/active_admin/router.rb +7 -7
  254. data/lib/active_admin/scope.rb +6 -6
  255. data/lib/active_admin/sidebar_section.rb +10 -2
  256. data/lib/active_admin/version.rb +1 -1
  257. data/lib/active_admin/view_factory.rb +17 -16
  258. data/lib/active_admin/view_helpers.rb +0 -1
  259. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  260. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +13 -6
  261. data/lib/active_admin/view_helpers/display_helper.rb +30 -17
  262. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -24
  263. data/lib/active_admin/view_helpers/fields_for.rb +2 -2
  264. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  265. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  266. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  267. data/lib/active_admin/views/action_items.rb +2 -2
  268. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  269. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  270. data/lib/active_admin/views/components/attributes_table.rb +22 -13
  271. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  272. data/lib/active_admin/views/components/columns.rb +13 -7
  273. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  274. data/lib/active_admin/views/components/index_list.rb +7 -7
  275. data/lib/active_admin/views/components/paginated_collection.rb +33 -17
  276. data/lib/active_admin/views/components/panel.rb +8 -2
  277. data/lib/active_admin/views/components/popover.rb +1 -1
  278. data/lib/active_admin/views/components/scopes.rb +1 -1
  279. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  280. data/lib/active_admin/views/components/site_title.rb +2 -2
  281. data/lib/active_admin/views/components/status_tag.rb +34 -11
  282. data/lib/active_admin/views/components/table_for.rb +67 -22
  283. data/lib/active_admin/views/components/tabs.rb +28 -0
  284. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  285. data/lib/active_admin/views/footer.rb +3 -3
  286. data/lib/active_admin/views/header.rb +3 -3
  287. data/lib/active_admin/views/index_as_blog.rb +6 -6
  288. data/lib/active_admin/views/index_as_grid.rb +2 -2
  289. data/lib/active_admin/views/index_as_table.rb +127 -40
  290. data/lib/active_admin/views/pages/base.rb +22 -18
  291. data/lib/active_admin/views/pages/form.rb +16 -6
  292. data/lib/active_admin/views/pages/index.rb +36 -20
  293. data/lib/active_admin/views/pages/layout.rb +1 -1
  294. data/lib/active_admin/views/pages/show.rb +4 -4
  295. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  296. data/lib/active_admin/views/title_bar.rb +10 -8
  297. data/lib/generators/active_admin/assets/assets_generator.rb +1 -3
  298. data/lib/generators/active_admin/devise/devise_generator.rb +20 -28
  299. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  300. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +20 -22
  301. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -9
  302. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  303. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  304. data/lib/generators/active_admin/page/USAGE +8 -0
  305. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  306. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  307. data/lib/generators/active_admin/resource/resource_generator.rb +2 -4
  308. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  309. data/lib/ransack_ext.rb +4 -4
  310. data/script/local +2 -2
  311. data/script/travis_cache +107 -0
  312. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  313. data/spec/javascripts/fixtures/flashes.html +2 -0
  314. data/spec/rails_helper.rb +154 -0
  315. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  316. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  317. data/spec/requests/memory_spec.rb +23 -0
  318. data/spec/requests/stylesheets_spec.rb +18 -0
  319. data/spec/spec_helper.rb +12 -170
  320. data/spec/support/detect_rails_version.rb +31 -39
  321. data/spec/support/rails_template.rb +61 -34
  322. data/spec/support/rails_template_with_data.rb +14 -14
  323. data/spec/support/templates/admin/stores.rb +3 -5
  324. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  325. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  326. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  327. data/spec/support/templates/policies/application_policy.rb +45 -0
  328. data/spec/support/templates/policies/category_policy.rb +7 -0
  329. data/spec/support/templates/policies/post_policy.rb +15 -0
  330. data/spec/support/templates/policies/store_policy.rb +11 -0
  331. data/spec/support/templates/policies/user_policy.rb +11 -0
  332. data/spec/support/templates/post_decorator.rb +4 -46
  333. data/spec/unit/abstract_view_factory_spec.rb +11 -11
  334. data/spec/unit/action_builder_spec.rb +24 -18
  335. data/spec/unit/active_admin_spec.rb +2 -2
  336. data/spec/unit/application_spec.rb +30 -31
  337. data/spec/unit/asset_registration_spec.rb +11 -11
  338. data/spec/unit/authorization/authorization_adapter_spec.rb +7 -7
  339. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  340. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  341. data/spec/unit/auto_link_spec.rb +42 -5
  342. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  343. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  344. data/spec/unit/belongs_to_spec.rb +26 -17
  345. data/spec/unit/cancan_adapter_spec.rb +4 -4
  346. data/spec/unit/comments_spec.rb +99 -39
  347. data/spec/unit/component_spec.rb +3 -3
  348. data/spec/unit/config_shared_examples.rb +8 -8
  349. data/spec/unit/controller_filters_spec.rb +26 -14
  350. data/spec/unit/csv_builder_spec.rb +152 -24
  351. data/spec/unit/dependency_spec.rb +135 -0
  352. data/spec/unit/devise_spec.rb +17 -37
  353. data/spec/unit/dsl_spec.rb +70 -9
  354. data/spec/unit/event_spec.rb +9 -9
  355. data/spec/unit/filters/filter_form_builder_spec.rb +167 -157
  356. data/spec/unit/filters/resource_spec.rb +35 -33
  357. data/spec/unit/form_builder_spec.rb +383 -145
  358. data/spec/unit/generators/install_spec.rb +5 -5
  359. data/spec/unit/helpers/collection_spec.rb +18 -18
  360. data/spec/unit/helpers/scope_chain_spec.rb +5 -5
  361. data/spec/unit/helpers/settings_spec.rb +4 -4
  362. data/spec/unit/i18n_spec.rb +12 -0
  363. data/spec/unit/menu_collection_spec.rb +14 -14
  364. data/spec/unit/menu_item_spec.rb +42 -42
  365. data/spec/unit/menu_spec.rb +20 -20
  366. data/spec/unit/namespace/authorization_spec.rb +5 -5
  367. data/spec/unit/namespace/register_page_spec.rb +9 -9
  368. data/spec/unit/namespace/register_resource_spec.rb +26 -28
  369. data/spec/unit/namespace_spec.rb +20 -20
  370. data/spec/unit/order_clause_spec.rb +81 -0
  371. data/spec/unit/page_controller_spec.rb +1 -1
  372. data/spec/unit/page_spec.rb +18 -12
  373. data/spec/unit/pretty_format_spec.rb +42 -14
  374. data/spec/unit/pundit_adapter_spec.rb +98 -0
  375. data/spec/unit/resource/action_items_spec.rb +13 -10
  376. data/spec/unit/resource/includes_spec.rb +21 -0
  377. data/spec/unit/resource/menu_spec.rb +1 -1
  378. data/spec/unit/resource/naming_spec.rb +23 -23
  379. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  380. data/spec/unit/resource/pagination_spec.rb +6 -6
  381. data/spec/unit/resource/routes_spec.rb +10 -10
  382. data/spec/unit/resource/scopes_spec.rb +14 -7
  383. data/spec/unit/resource/sidebars_spec.rb +6 -6
  384. data/spec/unit/resource_collection_spec.rb +66 -68
  385. data/spec/unit/resource_controller/data_access_spec.rb +39 -21
  386. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  387. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  388. data/spec/unit/resource_controller_spec.rb +66 -62
  389. data/spec/unit/resource_registration_spec.rb +12 -12
  390. data/spec/unit/resource_spec.rb +75 -40
  391. data/spec/unit/routing_spec.rb +39 -31
  392. data/spec/unit/scope_spec.rb +112 -30
  393. data/spec/unit/settings_spec.rb +51 -21
  394. data/spec/unit/view_factory_spec.rb +2 -2
  395. data/spec/unit/view_helpers/breadcrumbs_spec.rb +137 -69
  396. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  397. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  398. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  399. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  400. data/spec/unit/view_helpers/form_helper_spec.rb +9 -22
  401. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +59 -21
  402. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  403. data/spec/unit/views/components/attributes_table_spec.rb +94 -52
  404. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  405. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  406. data/spec/unit/views/components/columns_spec.rb +52 -22
  407. data/spec/unit/views/components/index_list_spec.rb +11 -8
  408. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  409. data/spec/unit/views/components/paginated_collection_spec.rb +68 -59
  410. data/spec/unit/views/components/panel_spec.rb +32 -21
  411. data/spec/unit/views/components/popover_spec.rb +7 -7
  412. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  413. data/spec/unit/views/components/site_title_spec.rb +8 -8
  414. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  415. data/spec/unit/views/components/table_for_spec.rb +227 -44
  416. data/spec/unit/views/components/tabs_spec.rb +39 -0
  417. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  418. data/spec/unit/views/pages/form_spec.rb +17 -10
  419. data/spec/unit/views/pages/index_spec.rb +60 -0
  420. data/spec/unit/views/pages/layout_spec.rb +17 -21
  421. data/spec/unit/views/pages/show_spec.rb +16 -3
  422. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  423. data/tasks/docs.rake +1 -1
  424. data/tasks/parallel_tests.rake +8 -2
  425. data/tasks/test.rake +8 -4
  426. data/tasks/yard.rake +7 -5
  427. metadata +180 -101
  428. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  429. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  430. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  431. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  432. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  433. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  434. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  435. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  436. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  437. data/app/assets/images/active_admin/loading.gif +0 -0
  438. data/app/assets/javascripts/active_admin/components/application.js.coffee +0 -23
  439. data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +0 -26
  440. data/app/assets/javascripts/active_admin/components/has_many.js.coffee +0 -41
  441. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  442. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -39
  443. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  444. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  445. data/app/views/active_admin/resource/index.csv.erb +0 -17
  446. data/docs/3-index-pages/create-an-index.md +0 -29
  447. data/lib/active_admin/inputs/filter_base.rb +0 -33
  448. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  449. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -32
  450. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -51
  451. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  452. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  453. data/lib/active_admin/inputs/filter_select_input.rb +0 -61
  454. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  455. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  456. data/spec/integration/memory_spec.rb +0 -29
  457. data/spec/integration/stylesheets_spec.rb +0 -41
  458. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  459. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  460. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  461. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  462. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  463. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  464. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  465. data/spec/javascripts/support/jquery.min.js +0 -4
  466. data/spec/spec_helper_without_rails.rb +0 -16
  467. data/tasks/js.rake +0 -32
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
 
4
4
  module MockModuleToInclude
@@ -8,16 +8,15 @@ end
8
8
 
9
9
  describe ActiveAdmin::DSL do
10
10
 
11
- let(:config){ double }
12
11
  let(:application) { ActiveAdmin::Application.new }
13
12
  let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
14
13
  let(:resource_config) { ActiveAdmin::Resource.new namespace, Post }
15
- let(:dsl){ ActiveAdmin::DSL.new(config) }
14
+ let(:dsl){ ActiveAdmin::DSL.new(resource_config) }
16
15
 
17
16
  describe "#include" do
18
17
 
19
18
  it "should call the included class method on the module that is included" do
20
- MockModuleToInclude.should_receive(:included).with(dsl)
19
+ expect(MockModuleToInclude).to receive(:included).with(dsl)
21
20
  dsl.run_registration_block do
22
21
  include MockModuleToInclude
23
22
  end
@@ -25,12 +24,45 @@ describe ActiveAdmin::DSL do
25
24
 
26
25
  end
27
26
 
27
+
28
+ describe '#action_item' do
29
+ before do
30
+ @default_items_count = resource_config.action_items.size
31
+
32
+ dsl.run_registration_block do
33
+ action_item :awesome, only: :show do
34
+ "Awesome ActionItem"
35
+ end
36
+ end
37
+ end
38
+
39
+ it "adds action_item to the action_items of config" do
40
+ expect(resource_config.action_items.size).to eq(@default_items_count + 1)
41
+ end
42
+
43
+ context 'DEPRECATED: when used without a name' do
44
+ it "is configured for only the show action" do
45
+ expect(ActiveAdmin::Deprecation).to receive(:warn).with(instance_of(String))
46
+
47
+ dsl.run_registration_block do
48
+ action_item only: :edit do
49
+ "Awesome ActionItem"
50
+ end
51
+ end
52
+
53
+ item = resource_config.action_items.last
54
+ expect(item.display_on?(:edit)).to be true
55
+ expect(item.display_on?(:index)).to be false
56
+ end
57
+ end
58
+ end
59
+
28
60
  describe "#menu" do
29
61
 
30
62
  it "should set the menu_item_options on the configuration" do
31
- config.should_receive(:menu_item_options=).with({:parent => "Admin"})
63
+ expect(resource_config).to receive(:menu_item_options=).with({parent: "Admin"})
32
64
  dsl.run_registration_block do
33
- menu :parent => "Admin"
65
+ menu parent: "Admin"
34
66
  end
35
67
  end
36
68
 
@@ -39,23 +71,52 @@ describe ActiveAdmin::DSL do
39
71
  describe "#navigation_menu" do
40
72
 
41
73
  it "should set the navigation_menu_name on the configuration" do
42
- config.should_receive(:navigation_menu_name=).with(:admin)
74
+ expect(resource_config).to receive(:navigation_menu_name=).with(:admin)
43
75
  dsl.run_registration_block do
44
76
  navigation_menu :admin
45
77
  end
46
78
  end
47
79
 
48
80
  it "should accept a block" do
49
-
50
81
  dsl = ActiveAdmin::DSL.new(resource_config)
51
82
  dsl.run_registration_block do
52
83
  navigation_menu { :dynamic_menu }
53
84
  end
85
+ expect(resource_config.navigation_menu_name).to eq :dynamic_menu
86
+ end
87
+
88
+ end
89
+
90
+ describe "#sidebar" do
54
91
 
55
- resource_config.navigation_menu_name.should == :dynamic_menu
92
+ before do
93
+ dsl.config.sidebar_sections << ActiveAdmin::SidebarSection.new(:email)
94
+ end
56
95
 
96
+ it "add sidebar_section to the sidebar_sections of config" do
97
+ dsl.run_registration_block do
98
+ sidebar :help
99
+ end
100
+ expect(dsl.config.sidebar_sections.map(&:name)).to match_array([:filters, :email, :help])
57
101
  end
58
102
 
59
103
  end
60
104
 
105
+ describe "#batch_action" do
106
+ it "should add a batch action by symbol" do
107
+ dsl.run_registration_block do
108
+ config.batch_actions = true
109
+ batch_action :foo
110
+ end
111
+ expect(resource_config.batch_actions.map(&:sym)).to eq [:foo, :destroy]
112
+ end
113
+
114
+ it "should add a batch action by title" do
115
+ dsl.run_registration_block do
116
+ config.batch_actions = true
117
+ batch_action "foo bar"
118
+ end
119
+ expect(resource_config.batch_actions.map(&:sym)).to eq [:foo_bar, :destroy]
120
+ end
121
+ end
61
122
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
  require 'active_admin/event'
3
3
 
4
4
  describe ActiveAdmin::EventDispatcher do
@@ -7,15 +7,15 @@ describe ActiveAdmin::EventDispatcher do
7
7
  let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
8
8
 
9
9
  it "should add a subscriber for an event" do
10
- dispatcher.subscribers(test_event).size.should == 0
10
+ expect(dispatcher.subscribers(test_event).size).to eq 0
11
11
  dispatcher.subscribe(test_event){ true }
12
- dispatcher.subscribers(test_event).size.should == 1
12
+ expect(dispatcher.subscribers(test_event).size).to eq 1
13
13
  end
14
14
 
15
15
  it "should add a subscriber for multiple events" do
16
16
  dispatcher.subscribe(test_event, test_event + "1"){ true }
17
- dispatcher.subscribers(test_event).size.should == 1
18
- dispatcher.subscribers(test_event + "1").size.should == 1
17
+ expect(dispatcher.subscribers(test_event).size).to eq 1
18
+ expect(dispatcher.subscribers(test_event + "1").size).to eq 1
19
19
  end
20
20
 
21
21
  it "should call the dispatch block with no arguments" do
@@ -29,19 +29,19 @@ describe ActiveAdmin::EventDispatcher do
29
29
  arg = nil
30
30
  dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
31
31
  dispatcher.dispatch(test_event, "My Arg")
32
- arg.should == "My Arg"
32
+ expect(arg).to eq "My Arg"
33
33
  end
34
34
 
35
35
  it "should clear all subscribers" do
36
36
  dispatcher.subscribe(test_event){ false }
37
37
  dispatcher.subscribe(test_event + "_2"){ false }
38
38
  dispatcher.clear_all_subscribers!
39
- dispatcher.subscribers(test_event).size.should == 0
40
- dispatcher.subscribers(test_event + "_2").size.should == 0
39
+ expect(dispatcher.subscribers(test_event).size).to eq 0
40
+ expect(dispatcher.subscribers(test_event + "_2").size).to eq 0
41
41
  end
42
42
 
43
43
  it "should have a dispatcher available from ActiveAdmin::Event" do
44
- ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
44
+ expect(ActiveAdmin::Event).to be_an_instance_of(ActiveAdmin::EventDispatcher)
45
45
  end
46
46
 
47
47
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  class Post
4
4
  ransacker :custom_searcher do
@@ -30,7 +30,7 @@ describe ActiveAdmin::Filters::ViewHelper do
30
30
  def render_filter(search, filters)
31
31
  render_arbre_component({filter_args: [search, filters]}, helpers) do
32
32
  text_node active_admin_filters_form_for *assigns[:filter_args]
33
- end
33
+ end.to_s
34
34
  end
35
35
 
36
36
  def filter(name, options = {})
@@ -40,125 +40,111 @@ describe ActiveAdmin::Filters::ViewHelper do
40
40
  let(:scope) { Post.search }
41
41
 
42
42
  describe "the form in general" do
43
- let(:body) { filter :title }
43
+ let(:body) { Capybara.string(filter :title) }
44
44
 
45
45
  it "should generate a form which submits via get" do
46
- body.should have_tag("form", :attributes => { :method => 'get', :class => 'filter_form' })
46
+ expect(body).to have_selector("form.filter_form[method=get]")
47
47
  end
48
48
 
49
49
  it "should generate a filter button" do
50
- body.should have_tag("input", :attributes => { :type => "submit",
51
- :value => "Filter" })
50
+ expect(body).to have_selector("input[type=submit][value=Filter]")
52
51
  end
53
52
 
54
53
  it "should only generate the form once" do
55
- body.to_s.scan(/q\[title_contains\]/).size.should == 1
54
+ expect(body).to have_selector("form", count: 1)
56
55
  end
57
56
 
58
57
  it "should generate a clear filters link" do
59
- body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
58
+ expect(body).to have_selector("a.clear_filters_btn", text: "Clear Filters")
59
+ end
60
+
61
+ describe "label as proc" do
62
+ let(:body) { Capybara.string(filter :title, label: proc { 'Title from proc' }) }
63
+
64
+ it "should render proper label" do
65
+ expect(body).to have_selector("label", text: "Title from proc")
66
+ end
60
67
  end
61
68
  end
62
69
 
63
70
  describe "string attribute" do
64
- let(:body) { filter :title }
71
+ let(:body) { Capybara.string(filter :title) }
65
72
 
66
73
  it "should generate a select option for starts with" do
67
- body.should have_tag("option", "Starts with", :attributes => { :value => 'title_starts_with' })
74
+ expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
68
75
  end
69
76
 
70
77
  it "should generate a select option for ends with" do
71
- body.should have_tag("option", "Ends with", :attributes => { :value => 'title_ends_with' })
78
+ expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
72
79
  end
73
80
 
74
81
  it "should generate a select option for contains" do
75
- body.should have_tag("option", "Contains", :attributes => { :value => 'title_contains' })
82
+ expect(body).to have_selector("option[value=title_contains]", text: "Contains")
76
83
  end
77
84
 
78
85
  it "should generate a text field for input" do
79
- body.should have_tag("input", :attributes => { :name => 'q[title_contains]' })
86
+ expect(body).to have_selector("input[name='q[title_contains]']")
80
87
  end
81
-
88
+
82
89
  it "should have a proper label" do
83
- body.should have_tag('label', 'Title')
90
+ expect(body).to have_selector("label", text: "Title")
84
91
  end
85
92
 
86
93
  it "should translate the label for text field" do
87
- begin
88
- I18n.backend.store_translations(:en, :activerecord => { :attributes => { :post => { :title => "Name" } } })
89
- body.should have_tag('label', 'Name')
90
- ensure
91
- I18n.backend.reload!
94
+ with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
95
+ expect(body).to have_selector("label", text: "Name")
92
96
  end
93
97
  end
94
98
 
95
- it "should select the option which is currently being filtered"
96
-
97
- end
98
-
99
- describe "string attribute with sub filters" do
100
- let(:body) { filter :title_contains }
101
-
102
- it "should generate a search field for a string attribute with query contains" do
103
- body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
104
- body.should have_tag('label', 'Title contains')
99
+ it "should select the option which is currently being filtered" do
100
+ scope = Post.search title_starts_with: "foo"
101
+ body = Capybara.string(render_filter scope, title: {})
102
+ expect(body).to have_selector("option[value=title_starts_with][selected=selected]", text: "Starts with")
105
103
  end
106
104
 
107
- it "should NOT generate a select option for contains" do
108
- body.should_not have_tag("option", "Contains", :attributes => { :value => 'title_contains' })
109
- end
105
+ context "with predicate" do
106
+ %w[eq equals cont contains start starts_with end ends_with].each do |predicate|
107
+ describe "'#{predicate}'" do
108
+ let(:body) { Capybara.string(filter :"title_#{predicate}") }
110
109
 
111
- context "using starts_with and as" do
112
- let(:body) { filter :title_starts_with }
110
+ it "shouldn't include a select field" do
111
+ expect(body).not_to have_selector("select")
112
+ end
113
113
 
114
- it "should generate a search field for a string attribute with query starts_with" do
115
- body.should have_tag("input", :attributes => { :name => "q[title_starts_with]" })
116
- end
117
- end
118
-
119
- context "using ends_with and as" do
120
- let(:body) { filter :title_ends_with }
121
-
122
- it "should generate a search field for a string attribute with query ends_with" do
123
- body.should have_tag("input", :attributes => { :name => "q[title_ends_with]" })
124
- end
125
- end
126
-
127
- context "using contains and NO AS defined" do
128
- let(:body) { filter :title_contains }
129
-
130
- it "should generate a search field for a string attribute with query contains" do
131
- body.should have_tag("input", :attributes => { :name => "q[title_contains]" })
114
+ it "should build correctly" do
115
+ expect(body).to have_selector("input[name='q[title_#{predicate}]']")
116
+ end
117
+ end
132
118
  end
133
119
  end
134
120
  end
135
-
121
+
136
122
  describe "text attribute" do
137
- let(:body) { filter :body }
123
+ let(:body) { Capybara.string(filter :body) }
138
124
 
139
125
  it "should generate a search field for a text attribute" do
140
- body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
126
+ expect(body).to have_selector("input[name='q[body_contains]']")
141
127
  end
142
128
 
143
129
  it "should have a proper label" do
144
- body.should have_tag('label', 'Body')
130
+ expect(body).to have_selector("label", text: "Body")
145
131
  end
146
132
  end
147
133
 
148
134
  describe "string attribute, as a select" do
149
135
  let(:body) { filter :title, as: :select }
150
- let(:builder) { ActiveAdmin::Inputs::FilterSelectInput }
136
+ let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
151
137
 
152
138
  context "when loading collection from DB" do
153
139
  it "should use pluck for efficiency" do
154
- builder.any_instance.should_receive(:pluck_column) { [] }
140
+ expect_any_instance_of(builder).to receive(:pluck_column) { [] }
155
141
  body
156
142
  end
157
143
 
158
144
  it "should remove original ordering to prevent PostgreSQL error" do
159
- scope.object.klass.should_receive(:reorder).with('title asc') {
145
+ expect(scope.object.klass).to receive(:reorder).with('title asc') {
160
146
  m = double uniq: double(pluck: ['A Title'])
161
- m.uniq.should_receive(:pluck).with :title
147
+ expect(m.uniq).to receive(:pluck).with :title
162
148
  m
163
149
  }
164
150
  body
@@ -167,127 +153,132 @@ describe ActiveAdmin::Filters::ViewHelper do
167
153
  end
168
154
 
169
155
  describe "datetime attribute" do
170
- let(:body) { filter :created_at }
156
+ let(:body) { Capybara.string(filter :created_at) }
171
157
 
172
158
  it "should generate a date greater than" do
173
- body.should have_tag("input", :attributes => { :name => "q[created_at_gteq]", :class => "datepicker"})
159
+ expect(body).to have_selector("input.datepicker[name='q[created_at_gteq]']")
174
160
  end
175
161
  it "should generate a seperator" do
176
- body.should have_tag("span", :attributes => { :class => "seperator"})
162
+ expect(body).to have_selector("span.seperator")
177
163
  end
178
164
  it "should generate a date less than" do
179
- body.should have_tag("input", :attributes => { :name => "q[created_at_lteq]", :class => "datepicker"})
165
+ expect(body).to have_selector("input.datepicker[name='q[created_at_lteq]']")
180
166
  end
181
167
  end
182
168
 
183
169
  describe "integer attribute" do
184
- let(:body) { filter :id }
170
+ let(:body) { Capybara.string(filter :id) }
185
171
 
186
172
  it "should generate a select option for equal to" do
187
- body.should have_tag("option", "Equals", :attributes => { :value => 'id_equals' })
173
+ expect(body).to have_selector("option[value=id_equals]", text: "Equals")
188
174
  end
189
175
  it "should generate a select option for greater than" do
190
- body.should have_tag("option", "Greater than")
176
+ expect(body).to have_selector("option", text: "Greater than")
191
177
  end
192
178
  it "should generate a select option for less than" do
193
- body.should have_tag("option", "Less than")
179
+ expect(body).to have_selector("option", text: "Less than")
194
180
  end
195
181
  it "should generate a text field for input" do
196
- body.should have_tag("input", :attributes => { :name => 'q[id_equals]' })
182
+ expect(body).to have_selector("input[name='q[id_equals]']")
183
+ end
184
+ it "should select the option which is currently being filtered" do
185
+ scope = Post.search id_greater_than: 1
186
+ body = Capybara.string(render_filter scope, id: {})
187
+ expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
197
188
  end
198
- it "should select the option which is currently being filtered"
199
189
  end
200
190
 
201
191
  describe "boolean attribute" do
202
192
  context "boolean datatypes" do
203
- let(:body) { filter :starred }
193
+ let(:body) { Capybara.string(filter :starred) }
204
194
 
205
- it "should create a check box for equals to" do
206
- body.should have_tag("input", :attributes => {
207
- :name => "q[starred_eq]",
208
- :type => "checkbox" })
195
+ it "should generate a select" do
196
+ expect(body).to have_selector("select[name='q[starred_eq]']")
197
+ end
198
+ it "should set the default text to 'Any'" do
199
+ expect(body).to have_selector("option[value='']", text: "Any")
200
+ end
201
+ it "should create an option for true and false" do
202
+ expect(body).to have_selector("option[value=true]", text: "Yes")
203
+ expect(body).to have_selector("option[value=false]", text: "No")
209
204
  end
210
205
 
211
206
  it "should translate the label for boolean field" do
212
- begin
213
- I18n.backend.store_translations(:en, :activerecord => { :attributes => { :post => { :starred => "Faved" } } })
214
- body.should have_tag('label', 'Faved')
215
- ensure
216
- I18n.backend.reload!
207
+ with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
208
+ expect(body).to have_selector("label", text: "Faved")
217
209
  end
218
210
  end
219
211
  end
220
212
 
221
213
  context "non-boolean data types" do
222
- let(:body) { filter :title_present, :as => :boolean }
214
+ let(:body) { Capybara.string(filter :title_present, as: :boolean) }
223
215
 
224
- it "should create a check box for equals to" do
225
- body.should have_tag("input", :attributes => {
226
- :name => "q[title_present]",
227
- :type => "checkbox" })
216
+ it "should generate a select" do
217
+ expect(body).to have_selector("select[name='q[title_present]']")
218
+ end
219
+ it "should set the default text to 'Any'" do
220
+ expect(body).to have_selector("option[value='']", text: "Any")
221
+ end
222
+ it "should create an option for true and false" do
223
+ expect(body).to have_selector("option[value=true]", text: "Yes")
224
+ expect(body).to have_selector("option[value=false]", text: "No")
228
225
  end
229
226
  end
230
227
  end
231
228
 
232
229
  describe "belongs_to" do
233
230
  before do
234
- @john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
235
- @jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
231
+ @john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
232
+ @jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
236
233
  end
237
234
 
238
235
  context "when given as the _id attribute name" do
239
- let(:body) { filter :author_id }
236
+ let(:body) { Capybara.string(filter :author_id) }
240
237
 
241
238
  it "should generate a numeric filter" do
242
- body.should have_tag 'label', 'Author' # really this should be Author ID :/
243
- body.should have_tag 'option', :attributes => { :value => 'author_id_less_than' }
244
- body.should have_tag 'input', :attributes => { :id => 'q_author_id', :name => 'q[author_id_equals]'}
239
+ expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
240
+ expect(body).to have_selector("option[value=author_id_less_than]")
241
+ expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
245
242
  end
246
243
  end
247
244
 
248
245
  context "when given as the name of the relationship" do
249
- let(:body) { filter :author }
246
+ let(:body) { Capybara.string(filter :author) }
250
247
 
251
248
  it "should generate a select" do
252
- body.should have_tag "select", :attributes => { :name => "q[author_id_eq]" }
249
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
253
250
  end
254
251
  it "should set the default text to 'Any'" do
255
- body.should have_tag "option", "Any", :attributes => { :value => "" }
252
+ expect(body).to have_selector("option[value='']", text: "Any")
256
253
  end
257
254
  it "should create an option for each related object" do
258
- body.should have_tag "option", "John Doe", :attributes => { :value => @john.id }
259
- body.should have_tag "option", "Jane Doe", :attributes => { :value => @jane.id }
255
+ expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
256
+ expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
260
257
  end
261
258
 
262
259
  context "with a proc" do
263
260
  let :body do
264
- filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
261
+ Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
265
262
  end
266
263
 
267
264
  it "should use call the proc as the collection" do
268
- body.should have_tag("option", "Title One")
269
- body.should have_tag("option", "Title Two")
265
+ expect(body).to have_selector("option", text: "Title One")
266
+ expect(body).to have_selector("option", text: "Title Two")
270
267
  end
271
268
 
272
269
  it "should render the collection in the context of the view" do
273
- body = filter(:title, :as => :select, :collection => proc{[a_helper_method]})
274
- body.should have_tag("option", "A Helper Method")
270
+ body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
271
+ expect(body).to have_selector("option", text: "A Helper Method")
275
272
  end
276
273
  end
277
274
  end
278
275
 
279
276
  context "as check boxes" do
280
- let(:body) { filter :author, :as => :check_boxes }
277
+ let(:body) { Capybara.string(filter :author, as: :check_boxes) }
281
278
 
282
279
  it "should create a check box for each related object" do
283
- body.should have_tag("input", :attributes => {
284
- :name => "q[author_id_in][]",
285
- :type => "checkbox",
286
- :value => @john.id })
287
- body.should have_tag("input", :attributes => {
288
- :name => "q[author_id_in][]",
289
- :type => "checkbox",
290
- :value => @jane.id })
280
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
281
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
291
282
  end
292
283
  end
293
284
 
@@ -298,10 +289,19 @@ describe ActiveAdmin::Filters::ViewHelper do
298
289
  Formtastic::PolymorphicInputWithoutCollectionError
299
290
  end
300
291
  end
292
+
293
+ context "when using a custom foreign key" do
294
+ let(:scope) { Post.search }
295
+ let(:body) { Capybara.string(filter :category) }
296
+ it "should ignore that foreign key and let Ransack handle it" do
297
+ expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
298
+ expect(body).to have_selector("select[name='q[category_id_eq]']")
299
+ end
300
+ end
301
301
  end # belongs to
302
302
 
303
303
  describe "has_and_belongs_to_many" do
304
- pending "add HABTM models so this can be tested"
304
+ skip "add HABTM models so this can be tested"
305
305
  end
306
306
 
307
307
  describe "has_many :through" do
@@ -325,64 +325,63 @@ describe ActiveAdmin::Filters::ViewHelper do
325
325
  end
326
326
  let(:scope) { Category.search }
327
327
 
328
- let!(:john) { User.create :first_name => "John", :last_name => "Doe", :username => "john_doe" }
329
- let!(:jane) { User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe" }
328
+ let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
329
+ let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
330
330
 
331
331
  context "when given as the name of the relationship" do
332
- let(:body) { filter :authors }
332
+ let(:body) { Capybara.string(filter :authors) }
333
333
 
334
334
  it "should generate a select" do
335
- body.should have_tag 'select', :attributes => { :name => "q[posts_author_id_eq]" }
335
+ expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
336
336
  end
337
337
 
338
338
  it "should set the default text to 'Any'" do
339
- body.should have_tag "option", "Any", :attributes => { :value => "" }
339
+ expect(body).to have_selector("option[value='']", text: "Any")
340
340
  end
341
341
 
342
342
  it "should create an option for each related object" do
343
- body.should have_tag "option", "John Doe", :attributes => { :value => john.id }
344
- body.should have_tag "option", "Jane Doe", :attributes => { :value => jane.id }
343
+ expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
344
+ expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
345
345
  end
346
346
  end
347
347
 
348
348
  context "as check boxes" do
349
- let(:body) { filter :authors, :as => :check_boxes }
349
+ let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
350
350
 
351
351
  it "should create a check box for each related object" do
352
- body.should have_tag("input", :attributes => {
353
- :name => "q[posts_author_id_in][]",
354
- :type => "checkbox",
355
- :value => john.id })
356
- body.should have_tag("input", :attributes => {
357
- :name => "q[posts_author_id_in][]",
358
- :type => "checkbox",
359
- :value => jane.id })
352
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
353
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
360
354
  end
361
355
  end
362
356
  end
363
357
 
364
358
  describe "conditional display" do
365
- context "with :if block" do
366
- it "should be displayed if true" do
367
- body = filter :body, if: proc{true}
368
- body.should have_tag "input", attributes: {name: "q[body_contains]"}
369
- end
370
-
371
- it "should NOT be displayed if false" do
372
- body = filter :author, if: proc{false}
373
- body.should_not have_tag "input", attributes: {name: "q[author_id_eq]"}
374
- end
375
- end
376
-
377
- context "with :unless block" do
378
- it "should be displayed if false" do
379
- body = filter :created_at, unless: proc{false}
380
- body.should have_tag "input", attributes: {name: "q[created_at_gteq]"}
381
- end
382
-
383
- it "should NOT be displayed if true" do
384
- body = filter :updated_at, unless: proc{true}
385
- body.should_not have_tag "input", attributes: {name: "q[updated_at_gteq]"}
359
+ [:if, :unless].each do |verb|
360
+ should = verb == :if ? "should" : "shouldn't"
361
+ if_true = verb == :if ? :to : :to_not
362
+ if_false = verb == :if ? :to_not : :to
363
+ context "with #{verb.inspect} proc" do
364
+ it "#{should} be displayed if true" do
365
+ body = Capybara.string(filter :body, verb => proc{ true })
366
+ expect(body).send if_true, have_selector("input[name='q[body_contains]']")
367
+ end
368
+ it "#{should} be displayed if false" do
369
+ body = Capybara.string(filter :body, verb => proc{ false })
370
+ expect(body).send if_false, have_selector("input[name='q[body_contains]']")
371
+ end
372
+ it "should still be hidden on the second render" do
373
+ filters = {body: { verb => proc{ verb == :unless }}}
374
+ 2.times do
375
+ body = Capybara.string(render_filter scope, filters)
376
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
377
+ end
378
+ end
379
+ it "should successfully keep rendering other filters after one is hidden" do
380
+ filters = {body: { verb => proc{ verb == :unless }}, author: {}}
381
+ body = Capybara.string(render_filter scope, filters)
382
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
383
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
384
+ end
386
385
  end
387
386
  end
388
387
  end
@@ -390,32 +389,43 @@ describe ActiveAdmin::Filters::ViewHelper do
390
389
  describe "custom search methods" do
391
390
 
392
391
  it "should work as select" do
393
- body = filter :custom_searcher, as: :select, collection: ['foo']
394
- body.should have_tag "select", attributes: { name: "q[custom_searcher]" }
392
+ body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
393
+ expect(body).to have_selector("select[name='q[custom_searcher]']")
395
394
  end
396
395
 
397
396
  it "should work as string" do
398
- body = filter :custom_searcher, as: :string
399
- body.should have_tag "input", attributes: { name: "q[custom_searcher]" }
397
+ body = Capybara.string(filter :custom_searcher, as: :string)
398
+ expect(body).to have_selector("input[name='q[custom_searcher]']")
399
+ end
400
+ end
401
+
402
+ describe "does not support some filter inputs" do
403
+ it "should fallback to use formtastic inputs" do
404
+ body = Capybara.string(filter :custom_searcher, as: :text)
405
+ expect(body).to have_selector("textarea[name='q[custom_searcher]']")
400
406
  end
401
407
  end
402
408
 
403
409
  describe "blank option" do
404
410
  context "for a select filter" do
405
411
  it "should be there by default" do
406
- filter(:author).should have_tag "option", "Any"
412
+ body = Capybara.string(filter(:author))
413
+ expect(body).to have_selector("option", text: "Any")
407
414
  end
408
415
  it "should be able to be disabled" do
409
- filter(:author, include_blank: false).should_not have_tag "option", "Any"
416
+ body = Capybara.string(filter(:author, include_blank: false))
417
+ expect(body).to_not have_selector("option", text: "Any")
410
418
  end
411
419
  end
412
420
 
413
421
  context "for a multi-select filter" do
414
422
  it "should not be there by default" do
415
- filter(:author, multiple: true).should_not have_tag "option", "Any"
423
+ body = Capybara.string(filter(:author, multiple: true))
424
+ expect(body).to_not have_selector("option", text: "Any")
416
425
  end
417
426
  it "should be able to be enabled" do
418
- filter(:author, multiple: true, include_blank: true).should have_tag "option", "Any"
427
+ body = Capybara.string(filter(:author, multiple: true, include_blank: true))
428
+ expect(body).to have_selector("option", text: "Any")
419
429
  end
420
430
  end
421
431
  end