activeadmin-rb 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.gitignore +21 -0
  5. data/.mdlrc +1 -0
  6. data/.rubocop.yml +84 -0
  7. data/.simplecov +13 -0
  8. data/.travis.yml +49 -0
  9. data/.yardopts +7 -0
  10. data/CHANGELOG.md +389 -0
  11. data/CODE_OF_CONDUCT.md +22 -0
  12. data/CONTRIBUTING.md +184 -0
  13. data/Gemfile +58 -0
  14. data/LICENSE +20 -0
  15. data/README.md +75 -0
  16. data/Rakefile +54 -0
  17. data/activeadmin-rb.gemspec +32 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js.coffee +13 -0
  22. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  23. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  24. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +11 -0
  25. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +14 -0
  26. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +26 -0
  27. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +7 -0
  28. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +42 -0
  29. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +46 -0
  30. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +104 -0
  31. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  32. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  33. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  34. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +46 -0
  35. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +22 -0
  36. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  37. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  38. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  39. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  40. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  41. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  42. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  43. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  44. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  45. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  46. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  47. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  48. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  49. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  50. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  51. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  52. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  53. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  54. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  55. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  56. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  57. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  58. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  59. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  60. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  61. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  76. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  81. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  82. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  83. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  84. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  85. data/app/views/active_admin/page/index.html.arb +1 -0
  86. data/app/views/active_admin/resource/edit.html.arb +1 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  91. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  92. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  93. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  94. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  95. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  96. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  97. data/app/views/layouts/active_admin.html.arb +1 -0
  98. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  99. data/codecov.yml +25 -0
  100. data/config/i18n-tasks.yml +26 -0
  101. data/config/locales/ar.yml +134 -0
  102. data/config/locales/bg.yml +119 -0
  103. data/config/locales/bs.yml +120 -0
  104. data/config/locales/ca.yml +105 -0
  105. data/config/locales/cs.yml +108 -0
  106. data/config/locales/da.yml +136 -0
  107. data/config/locales/de-CH.yml +100 -0
  108. data/config/locales/de.yml +143 -0
  109. data/config/locales/el.yml +125 -0
  110. data/config/locales/en-CA.yml +138 -0
  111. data/config/locales/en-GB.yml +138 -0
  112. data/config/locales/en.yml +161 -0
  113. data/config/locales/eo.yml +144 -0
  114. data/config/locales/es-MX.yml +95 -0
  115. data/config/locales/es.yml +161 -0
  116. data/config/locales/fa.yml +118 -0
  117. data/config/locales/fi.yml +111 -0
  118. data/config/locales/fr.yml +140 -0
  119. data/config/locales/he.yml +141 -0
  120. data/config/locales/hr.yml +122 -0
  121. data/config/locales/hu.yml +97 -0
  122. data/config/locales/id.yml +134 -0
  123. data/config/locales/it.yml +143 -0
  124. data/config/locales/ja.yml +140 -0
  125. data/config/locales/ko.yml +119 -0
  126. data/config/locales/lt.yml +141 -0
  127. data/config/locales/lv.yml +91 -0
  128. data/config/locales/nb.yml +129 -0
  129. data/config/locales/nl.yml +143 -0
  130. data/config/locales/pl.yml +167 -0
  131. data/config/locales/pt-BR.yml +142 -0
  132. data/config/locales/pt-PT.yml +91 -0
  133. data/config/locales/ro.yml +95 -0
  134. data/config/locales/ru.yml +140 -0
  135. data/config/locales/sk.yml +108 -0
  136. data/config/locales/sv-SE.yml +134 -0
  137. data/config/locales/tr.yml +143 -0
  138. data/config/locales/uk.yml +135 -0
  139. data/config/locales/vi.yml +133 -0
  140. data/config/locales/zh-CN.yml +142 -0
  141. data/config/locales/zh-TW.yml +134 -0
  142. data/config/mdl_style.rb +9 -0
  143. data/cucumber.yml +6 -0
  144. data/docs/0-installation.md +118 -0
  145. data/docs/1-general-configuration.md +204 -0
  146. data/docs/10-custom-pages.md +150 -0
  147. data/docs/11-decorators.md +59 -0
  148. data/docs/12-arbre-components.md +203 -0
  149. data/docs/13-authorization-adapter.md +285 -0
  150. data/docs/14-gotchas.md +138 -0
  151. data/docs/2-resource-customization.md +466 -0
  152. data/docs/3-index-pages.md +328 -0
  153. data/docs/3-index-pages/custom-index.md +35 -0
  154. data/docs/3-index-pages/index-as-block.md +19 -0
  155. data/docs/3-index-pages/index-as-blog.md +69 -0
  156. data/docs/3-index-pages/index-as-grid.md +27 -0
  157. data/docs/3-index-pages/index-as-table.md +225 -0
  158. data/docs/4-csv-format.md +74 -0
  159. data/docs/5-forms.md +231 -0
  160. data/docs/6-show-pages.md +81 -0
  161. data/docs/7-sidebars.md +75 -0
  162. data/docs/8-custom-actions.md +177 -0
  163. data/docs/9-batch-actions.md +237 -0
  164. data/docs/CNAME +1 -0
  165. data/docs/Gemfile +2 -0
  166. data/docs/README.md +24 -0
  167. data/docs/_config.yml +2 -0
  168. data/docs/_includes/footer.html +8 -0
  169. data/docs/_includes/google-analytics.html +16 -0
  170. data/docs/_includes/head.html +7 -0
  171. data/docs/_includes/toc.html +98 -0
  172. data/docs/_includes/top-menu.html +9 -0
  173. data/docs/_layouts/default.html +21 -0
  174. data/docs/documentation.md +60 -0
  175. data/docs/images/activeadmin.png +0 -0
  176. data/docs/images/code-header.png +0 -0
  177. data/docs/images/divider.png +0 -0
  178. data/docs/images/features.png +0 -0
  179. data/docs/index.html +125 -0
  180. data/docs/stylesheets/main.css +1152 -0
  181. data/features/action_item.feature +73 -0
  182. data/features/authorization.feature +64 -0
  183. data/features/authorization_cancan.feature +52 -0
  184. data/features/authorization_pundit.feature +37 -0
  185. data/features/belongs_to.feature +124 -0
  186. data/features/breadcrumb.feature +76 -0
  187. data/features/comments/commenting.feature +178 -0
  188. data/features/comments/viewing_index.feature +19 -0
  189. data/features/create_another.feature +55 -0
  190. data/features/dashboard.feature +16 -0
  191. data/features/decorators.feature +43 -0
  192. data/features/development_reloading.feature +28 -0
  193. data/features/edit_page.feature +116 -0
  194. data/features/favicon.feature +20 -0
  195. data/features/first_boot.feature +16 -0
  196. data/features/footer.feature +29 -0
  197. data/features/global_navigation.feature +29 -0
  198. data/features/i18n.feature +55 -0
  199. data/features/index/batch_actions.feature +218 -0
  200. data/features/index/filters.feature +251 -0
  201. data/features/index/format_as_csv.feature +227 -0
  202. data/features/index/formats.feature +88 -0
  203. data/features/index/index_as_block.feature +15 -0
  204. data/features/index/index_as_blog.feature +69 -0
  205. data/features/index/index_as_grid.feature +45 -0
  206. data/features/index/index_as_table.feature +291 -0
  207. data/features/index/index_blank_slate.feature +83 -0
  208. data/features/index/index_parameters.feature +75 -0
  209. data/features/index/index_scope_to.feature +56 -0
  210. data/features/index/index_scopes.feature +325 -0
  211. data/features/index/page_title.feature +41 -0
  212. data/features/index/pagination.feature +63 -0
  213. data/features/index/switch_index_view.feature +73 -0
  214. data/features/menu.feature +85 -0
  215. data/features/meta_tags.feature +21 -0
  216. data/features/new_page.feature +136 -0
  217. data/features/registering_assets.feature +38 -0
  218. data/features/registering_pages.feature +237 -0
  219. data/features/registering_resources.feature +33 -0
  220. data/features/renamed_resource.feature +30 -0
  221. data/features/root_to.feature +18 -0
  222. data/features/show/attributes_table_title.feature +54 -0
  223. data/features/show/columns.feature +40 -0
  224. data/features/show/default_content.feature +44 -0
  225. data/features/show/page_title.feature +58 -0
  226. data/features/show/tabs.feature +33 -0
  227. data/features/sidebar_sections.feature +210 -0
  228. data/features/site_title.feature +47 -0
  229. data/features/specifying_actions.feature +118 -0
  230. data/features/step_definitions/action_item_steps.rb +7 -0
  231. data/features/step_definitions/action_link_steps.rb +19 -0
  232. data/features/step_definitions/additional_web_steps.rb +81 -0
  233. data/features/step_definitions/asset_steps.rb +15 -0
  234. data/features/step_definitions/attribute_steps.rb +18 -0
  235. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  236. data/features/step_definitions/batch_action_steps.rb +81 -0
  237. data/features/step_definitions/blog_steps.rb +3 -0
  238. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  239. data/features/step_definitions/column_steps.rb +8 -0
  240. data/features/step_definitions/comment_steps.rb +32 -0
  241. data/features/step_definitions/configuration_steps.rb +100 -0
  242. data/features/step_definitions/dashboard_steps.rb +15 -0
  243. data/features/step_definitions/factory_steps.rb +35 -0
  244. data/features/step_definitions/filter_steps.rb +57 -0
  245. data/features/step_definitions/flash_steps.rb +11 -0
  246. data/features/step_definitions/footer_steps.rb +21 -0
  247. data/features/step_definitions/format_steps.rb +58 -0
  248. data/features/step_definitions/i18n_steps.rb +11 -0
  249. data/features/step_definitions/index_scope_steps.rb +42 -0
  250. data/features/step_definitions/index_views_steps.rb +3 -0
  251. data/features/step_definitions/layout_steps.rb +3 -0
  252. data/features/step_definitions/member_link_steps.rb +7 -0
  253. data/features/step_definitions/menu_steps.rb +11 -0
  254. data/features/step_definitions/meta_tag_steps.rb +3 -0
  255. data/features/step_definitions/pagination_steps.rb +15 -0
  256. data/features/step_definitions/root_steps.rb +9 -0
  257. data/features/step_definitions/sidebar_steps.rb +11 -0
  258. data/features/step_definitions/site_title_steps.rb +31 -0
  259. data/features/step_definitions/tab_steps.rb +8 -0
  260. data/features/step_definitions/table_steps.rb +116 -0
  261. data/features/step_definitions/user_steps.rb +52 -0
  262. data/features/step_definitions/web_steps.rb +86 -0
  263. data/features/sti_resource.feature +65 -0
  264. data/features/strong_parameters.feature +69 -0
  265. data/features/support/env.rb +121 -0
  266. data/features/support/paths.rb +73 -0
  267. data/features/support/regular_env.rb +7 -0
  268. data/features/support/reload_env.rb +7 -0
  269. data/features/support/selectors.rb +45 -0
  270. data/features/users/logging_in.feature +32 -0
  271. data/features/users/logging_out.feature +29 -0
  272. data/features/users/resetting_password.feature +30 -0
  273. data/gemfiles/rails_42.gemfile +11 -0
  274. data/gemfiles/rails_50.gemfile +11 -0
  275. data/gemfiles/rails_51.gemfile +11 -0
  276. data/gemfiles/rails_52.gemfile +12 -0
  277. data/lib/active_admin.rb +128 -0
  278. data/lib/active_admin/abstract_view_factory.rb +47 -0
  279. data/lib/active_admin/application.rb +241 -0
  280. data/lib/active_admin/application_settings.rb +39 -0
  281. data/lib/active_admin/asset_registration.rb +37 -0
  282. data/lib/active_admin/authorization_adapter.rb +129 -0
  283. data/lib/active_admin/base_controller.rb +81 -0
  284. data/lib/active_admin/base_controller/authorization.rb +128 -0
  285. data/lib/active_admin/base_controller/menu.rb +34 -0
  286. data/lib/active_admin/batch_actions.rb +16 -0
  287. data/lib/active_admin/batch_actions/controller.rb +40 -0
  288. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  289. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  290. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  291. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  292. data/lib/active_admin/callbacks.rb +88 -0
  293. data/lib/active_admin/cancan_adapter.rb +36 -0
  294. data/lib/active_admin/component.rb +5 -0
  295. data/lib/active_admin/controller_action.rb +12 -0
  296. data/lib/active_admin/csv_builder.rb +131 -0
  297. data/lib/active_admin/dependency.rb +172 -0
  298. data/lib/active_admin/deprecation.rb +10 -0
  299. data/lib/active_admin/devise.rb +80 -0
  300. data/lib/active_admin/dsl.rb +167 -0
  301. data/lib/active_admin/dynamic_setting.rb +38 -0
  302. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  303. data/lib/active_admin/engine.rb +21 -0
  304. data/lib/active_admin/error.rb +62 -0
  305. data/lib/active_admin/event.rb +24 -0
  306. data/lib/active_admin/filters.rb +11 -0
  307. data/lib/active_admin/filters/active.rb +29 -0
  308. data/lib/active_admin/filters/active_filter.rb +123 -0
  309. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  310. data/lib/active_admin/filters/dsl.rb +21 -0
  311. data/lib/active_admin/filters/forms.rb +85 -0
  312. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  313. data/lib/active_admin/filters/resource_extension.rb +155 -0
  314. data/lib/active_admin/form_builder.rb +182 -0
  315. data/lib/active_admin/generators/boilerplate.rb +45 -0
  316. data/lib/active_admin/helpers/collection.rb +19 -0
  317. data/lib/active_admin/helpers/i18n.rb +7 -0
  318. data/lib/active_admin/helpers/optional_display.rb +38 -0
  319. data/lib/active_admin/helpers/output_safety_helper.rb +35 -0
  320. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  321. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  322. data/lib/active_admin/inputs.rb +21 -0
  323. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  324. data/lib/active_admin/inputs/filters/base.rb +44 -0
  325. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  326. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  327. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  328. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  329. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  330. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  331. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  332. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  333. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  334. data/lib/active_admin/localizers.rb +11 -0
  335. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  336. data/lib/active_admin/menu.rb +102 -0
  337. data/lib/active_admin/menu_collection.rb +91 -0
  338. data/lib/active_admin/menu_item.rb +69 -0
  339. data/lib/active_admin/namespace.rb +266 -0
  340. data/lib/active_admin/namespace_settings.rb +107 -0
  341. data/lib/active_admin/order_clause.rb +48 -0
  342. data/lib/active_admin/orm/active_record.rb +5 -0
  343. data/lib/active_admin/orm/active_record/comments.rb +101 -0
  344. data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
  345. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  346. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  347. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  348. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  349. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  350. data/lib/active_admin/orm/mongoid.rb +1 -0
  351. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  352. data/lib/active_admin/page.rb +111 -0
  353. data/lib/active_admin/page_controller.rb +29 -0
  354. data/lib/active_admin/page_dsl.rb +32 -0
  355. data/lib/active_admin/page_presenter.rb +32 -0
  356. data/lib/active_admin/pundit_adapter.rb +68 -0
  357. data/lib/active_admin/reloader.rb +25 -0
  358. data/lib/active_admin/resource.rb +206 -0
  359. data/lib/active_admin/resource/action_items.rb +120 -0
  360. data/lib/active_admin/resource/attributes.rb +44 -0
  361. data/lib/active_admin/resource/belongs_to.rb +48 -0
  362. data/lib/active_admin/resource/controllers.rb +19 -0
  363. data/lib/active_admin/resource/includes.rb +12 -0
  364. data/lib/active_admin/resource/menu.rb +67 -0
  365. data/lib/active_admin/resource/naming.rb +62 -0
  366. data/lib/active_admin/resource/ordering.rb +11 -0
  367. data/lib/active_admin/resource/page_presenters.rb +82 -0
  368. data/lib/active_admin/resource/pagination.rb +23 -0
  369. data/lib/active_admin/resource/routes.rb +134 -0
  370. data/lib/active_admin/resource/scope_to.rb +74 -0
  371. data/lib/active_admin/resource/scopes.rb +52 -0
  372. data/lib/active_admin/resource/sidebars.rb +28 -0
  373. data/lib/active_admin/resource_collection.rb +72 -0
  374. data/lib/active_admin/resource_controller.rb +64 -0
  375. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  376. data/lib/active_admin/resource_controller/data_access.rb +322 -0
  377. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  378. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  379. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  380. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  381. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  382. data/lib/active_admin/resource_dsl.rb +222 -0
  383. data/lib/active_admin/router.rb +113 -0
  384. data/lib/active_admin/scope.rb +60 -0
  385. data/lib/active_admin/settings_node.rb +19 -0
  386. data/lib/active_admin/sidebar_section.rb +37 -0
  387. data/lib/active_admin/version.rb +3 -0
  388. data/lib/active_admin/view_factory.rb +27 -0
  389. data/lib/active_admin/view_helpers.rb +20 -0
  390. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  391. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  392. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  393. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  394. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  395. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  396. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  397. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  398. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  399. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  400. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  401. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  402. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  403. data/lib/active_admin/views.rb +8 -0
  404. data/lib/active_admin/views/action_items.rb +17 -0
  405. data/lib/active_admin/views/components/active_admin_form.rb +149 -0
  406. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  407. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  408. data/lib/active_admin/views/components/columns.rb +161 -0
  409. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  410. data/lib/active_admin/views/components/index_list.rb +69 -0
  411. data/lib/active_admin/views/components/menu.rb +32 -0
  412. data/lib/active_admin/views/components/menu_item.rb +58 -0
  413. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  414. data/lib/active_admin/views/components/panel.rb +38 -0
  415. data/lib/active_admin/views/components/scopes.rb +72 -0
  416. data/lib/active_admin/views/components/sidebar.rb +13 -0
  417. data/lib/active_admin/views/components/sidebar_section.rb +37 -0
  418. data/lib/active_admin/views/components/site_title.rb +54 -0
  419. data/lib/active_admin/views/components/status_tag.rb +88 -0
  420. data/lib/active_admin/views/components/table_for.rb +209 -0
  421. data/lib/active_admin/views/components/tabs.rb +31 -0
  422. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  423. data/lib/active_admin/views/footer.rb +30 -0
  424. data/lib/active_admin/views/header.rb +19 -0
  425. data/lib/active_admin/views/index_as_block.rb +36 -0
  426. data/lib/active_admin/views/index_as_blog.rb +155 -0
  427. data/lib/active_admin/views/index_as_grid.rb +80 -0
  428. data/lib/active_admin/views/index_as_table.rb +389 -0
  429. data/lib/active_admin/views/pages/base.rb +123 -0
  430. data/lib/active_admin/views/pages/form.rb +64 -0
  431. data/lib/active_admin/views/pages/index.rb +163 -0
  432. data/lib/active_admin/views/pages/layout.rb +26 -0
  433. data/lib/active_admin/views/pages/page.rb +30 -0
  434. data/lib/active_admin/views/pages/show.rb +65 -0
  435. data/lib/active_admin/views/tabbed_navigation.rb +11 -0
  436. data/lib/active_admin/views/title_bar.rb +55 -0
  437. data/lib/activeadmin-rb.rb +1 -0
  438. data/lib/bug_report_templates/active_admin_master.rb +112 -0
  439. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  440. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  442. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  443. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  444. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +293 -0
  445. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  446. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  447. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +30 -0
  448. data/lib/generators/active_admin/page/USAGE +8 -0
  449. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  450. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  451. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  452. data/lib/generators/active_admin/resource/templates/admin.rb.erb +43 -0
  453. data/lib/ransack_ext.rb +20 -0
  454. data/spec/bug_report_templates_spec.rb +26 -0
  455. data/spec/changelog_spec.rb +15 -0
  456. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  458. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  459. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  460. data/spec/javascripts/fixtures/flashes.html +2 -0
  461. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  462. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  463. data/spec/javascripts/support/jasmine.yml +74 -0
  464. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  465. data/spec/rails_helper.rb +60 -0
  466. data/spec/requests/default_namespace_spec.rb +81 -0
  467. data/spec/requests/memory_spec.rb +25 -0
  468. data/spec/requests/stylesheets_spec.rb +18 -0
  469. data/spec/spec_helper.rb +1 -0
  470. data/spec/support/active_admin_integration_spec_helper.rb +73 -0
  471. data/spec/support/active_admin_request_helpers.rb +39 -0
  472. data/spec/support/rails_template.rb +156 -0
  473. data/spec/support/rails_template_with_data.rb +327 -0
  474. data/spec/support/templates/admin/stores.rb +7 -0
  475. data/spec/support/templates/en.yml +8 -0
  476. data/spec/support/templates/manifest.js +3 -0
  477. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  478. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  479. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  480. data/spec/support/templates/policies/application_policy.rb +44 -0
  481. data/spec/support/templates/policies/category_policy.rb +7 -0
  482. data/spec/support/templates/policies/post_policy.rb +15 -0
  483. data/spec/support/templates/policies/store_policy.rb +11 -0
  484. data/spec/support/templates/policies/user_policy.rb +11 -0
  485. data/spec/support/templates/post_decorator.rb +24 -0
  486. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  487. data/spec/unit/action_builder_spec.rb +158 -0
  488. data/spec/unit/active_admin_spec.rb +11 -0
  489. data/spec/unit/application_spec.rb +180 -0
  490. data/spec/unit/asset_registration_spec.rb +81 -0
  491. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  492. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  493. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  494. data/spec/unit/auto_link_spec.rb +93 -0
  495. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  496. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  497. data/spec/unit/belongs_to_spec.rb +76 -0
  498. data/spec/unit/cancan_adapter_spec.rb +43 -0
  499. data/spec/unit/comments_spec.rb +189 -0
  500. data/spec/unit/component_spec.rb +18 -0
  501. data/spec/unit/config_shared_examples.rb +59 -0
  502. data/spec/unit/controller_filters_spec.rb +41 -0
  503. data/spec/unit/csv_builder_spec.rb +313 -0
  504. data/spec/unit/dependency_spec.rb +135 -0
  505. data/spec/unit/devise_spec.rb +110 -0
  506. data/spec/unit/dsl_spec.rb +120 -0
  507. data/spec/unit/dynamic_settings_spec.rb +28 -0
  508. data/spec/unit/filters/active_filter_spec.rb +218 -0
  509. data/spec/unit/filters/active_spec.rb +24 -0
  510. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  511. data/spec/unit/filters/resource_spec.rb +128 -0
  512. data/spec/unit/form_builder_spec.rb +1012 -0
  513. data/spec/unit/generators/install_spec.rb +31 -0
  514. data/spec/unit/helpers/collection_spec.rb +68 -0
  515. data/spec/unit/helpers/output_safety_helper_spec.rb +79 -0
  516. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  517. data/spec/unit/i18n_spec.rb +29 -0
  518. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  519. data/spec/unit/menu_collection_spec.rb +62 -0
  520. data/spec/unit/menu_item_spec.rb +82 -0
  521. data/spec/unit/menu_spec.rb +60 -0
  522. data/spec/unit/namespace/authorization_spec.rb +27 -0
  523. data/spec/unit/namespace/register_page_spec.rb +99 -0
  524. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  525. data/spec/unit/namespace_spec.rb +126 -0
  526. data/spec/unit/order_clause_spec.rb +81 -0
  527. data/spec/unit/page_controller_spec.rb +5 -0
  528. data/spec/unit/page_spec.rb +128 -0
  529. data/spec/unit/pretty_format_spec.rb +82 -0
  530. data/spec/unit/pundit_adapter_spec.rb +98 -0
  531. data/spec/unit/resource/action_items_spec.rb +83 -0
  532. data/spec/unit/resource/attributes_spec.rb +49 -0
  533. data/spec/unit/resource/includes_spec.rb +21 -0
  534. data/spec/unit/resource/menu_spec.rb +18 -0
  535. data/spec/unit/resource/naming_spec.rb +120 -0
  536. data/spec/unit/resource/ordering_spec.rb +35 -0
  537. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  538. data/spec/unit/resource/pagination_spec.rb +38 -0
  539. data/spec/unit/resource/routes_spec.rb +125 -0
  540. data/spec/unit/resource/scopes_spec.rb +50 -0
  541. data/spec/unit/resource/sidebars_spec.rb +43 -0
  542. data/spec/unit/resource_collection_spec.rb +175 -0
  543. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  544. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  545. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  546. data/spec/unit/resource_controller_spec.rb +273 -0
  547. data/spec/unit/resource_registration_spec.rb +61 -0
  548. data/spec/unit/resource_spec.rb +320 -0
  549. data/spec/unit/routing_spec.rb +211 -0
  550. data/spec/unit/scope_spec.rb +225 -0
  551. data/spec/unit/settings_node_spec.rb +26 -0
  552. data/spec/unit/view_factory_spec.rb +19 -0
  553. data/spec/unit/view_helpers/breadcrumbs_spec.rb +253 -0
  554. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  555. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  556. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  557. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  558. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  559. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  560. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  561. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  562. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  563. data/spec/unit/views/components/columns_spec.rb +187 -0
  564. data/spec/unit/views/components/index_list_spec.rb +49 -0
  565. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  566. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  567. data/spec/unit/views/components/menu_spec.rb +168 -0
  568. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  569. data/spec/unit/views/components/panel_spec.rb +58 -0
  570. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  571. data/spec/unit/views/components/sidebar_spec.rb +24 -0
  572. data/spec/unit/views/components/site_title_spec.rb +82 -0
  573. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  574. data/spec/unit/views/components/table_for_spec.rb +441 -0
  575. data/spec/unit/views/components/tabs_spec.rb +71 -0
  576. data/spec/unit/views/components/unsupported_browser_spec.rb +39 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/spec/unit/views/pages/base_spec.rb +14 -0
  579. data/spec/unit/views/pages/form_spec.rb +54 -0
  580. data/spec/unit/views/pages/index_spec.rb +60 -0
  581. data/spec/unit/views/pages/layout_spec.rb +59 -0
  582. data/spec/unit/views/pages/show_spec.rb +32 -0
  583. data/tasks/docs.rake +64 -0
  584. data/tasks/lint.rake +21 -0
  585. data/tasks/local.rake +25 -0
  586. data/tasks/parallel_tests.rake +66 -0
  587. data/tasks/test.rake +24 -0
  588. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  589. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  590. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  591. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  592. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  593. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  594. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  595. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  596. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  597. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  598. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  599. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  600. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  601. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  602. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  603. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  604. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +300 -0
  605. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  606. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  607. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  608. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  609. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  610. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  611. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  612. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  613. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  614. metadata +1037 -0
@@ -0,0 +1,24 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Filters::Active do
4
+
5
+ let(:resource) do
6
+ namespace = ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin)
7
+ namespace.register(Post)
8
+ end
9
+
10
+ subject { described_class.new(resource, search) }
11
+
12
+ let(:params) do
13
+ ::ActionController::Parameters.new(q: {author_id_eq: 1})
14
+ end
15
+
16
+ let(:search) do
17
+ Post.ransack(params[:q])
18
+ end
19
+
20
+ it 'should have filters' do
21
+ expect(subject.filters.size).to eq(1)
22
+ end
23
+
24
+ end
@@ -0,0 +1,524 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.describe ActiveAdmin::Filters::ViewHelper do
4
+
5
+ # Setup an ActionView::Base object which can be used for
6
+ # generating the form for.
7
+ let(:helpers) do
8
+ view = action_view
9
+ def view.collection_path
10
+ "/posts"
11
+ end
12
+
13
+ def view.protect_against_forgery?
14
+ false
15
+ end
16
+
17
+ def view.a_helper_method
18
+ "A Helper Method"
19
+ end
20
+
21
+ view
22
+ end
23
+
24
+ def render_filter(search, filters)
25
+ render_arbre_component({filter_args: [search, filters]}, helpers) do
26
+ text_node active_admin_filters_form_for *assigns[:filter_args]
27
+ end.to_s
28
+ end
29
+
30
+ def filter(name, options = {})
31
+ render_filter scope, name => options
32
+ end
33
+
34
+ let(:scope) { Post.search }
35
+
36
+ describe "the form in general" do
37
+ let(:body) { Capybara.string(filter :title) }
38
+
39
+ it "should generate a form which submits via get" do
40
+ expect(body).to have_selector("form.filter_form[method=get]")
41
+ end
42
+
43
+ it "should generate a filter button" do
44
+ expect(body).to have_selector("input[type=submit][value=Filter]")
45
+ end
46
+
47
+ it "should only generate the form once" do
48
+ expect(body).to have_selector("form", count: 1)
49
+ end
50
+
51
+ it "should generate a clear filters link" do
52
+ expect(body).to have_selector("a.clear_filters_btn", text: "Clear Filters")
53
+ end
54
+
55
+ describe "label as proc" do
56
+ let(:body) { Capybara.string(filter :title, label: proc { 'Title from proc' }) }
57
+
58
+ it "should render proper label" do
59
+ expect(body).to have_selector("label", text: "Title from proc")
60
+ end
61
+ end
62
+
63
+ describe "input html as proc" do
64
+ let(:body) { Capybara.string(filter :title, as: :select, input_html: proc{ {'data-ajax-url': '/'} }) }
65
+
66
+ it "should render proper label" do
67
+ expect(body).to have_selector('select[data-ajax-url="/"]')
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "string attribute" do
73
+ let(:body) { Capybara.string(filter :title) }
74
+
75
+ it "should generate a select option for starts with" do
76
+ expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
77
+ end
78
+
79
+ it "should generate a select option for ends with" do
80
+ expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
81
+ end
82
+
83
+ it "should generate a select option for contains" do
84
+ expect(body).to have_selector("option[value=title_contains]", text: "Contains")
85
+ end
86
+
87
+ it "should generate a text field for input" do
88
+ expect(body).to have_selector("input[name='q[title_contains]']")
89
+ end
90
+
91
+ it "should have a proper label" do
92
+ expect(body).to have_selector("label", text: "Title")
93
+ end
94
+
95
+ it "should translate the label for text field" do
96
+ with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
97
+ expect(body).to have_selector("label", text: "Name")
98
+ end
99
+ end
100
+
101
+ it "should select the option which is currently being filtered" do
102
+ scope = Post.search title_starts_with: "foo"
103
+ body = Capybara.string(render_filter scope, title: {})
104
+ expect(body).to have_selector("option[value=title_starts_with][selected=selected]", text: "Starts with")
105
+ end
106
+
107
+ context "with filters options" do
108
+ let(:body) { Capybara.string(filter :title, filters: [:contains, :starts_with]) }
109
+
110
+ it "should generate provided options for filter select" do
111
+ expect(body).to have_selector("option[value=title_contains]", text: "Contains")
112
+ expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
113
+ end
114
+
115
+ it "should not generate a select option for ends with" do
116
+ expect(body).not_to have_selector("option[value=title_ends_with]")
117
+ end
118
+ end
119
+
120
+ context "with predicate" do
121
+ %w[eq equals cont contains start starts_with end ends_with].each do |predicate|
122
+ describe "'#{predicate}'" do
123
+ let(:body) { Capybara.string(filter :"title_#{predicate}") }
124
+
125
+ it "shouldn't include a select field" do
126
+ expect(body).not_to have_selector("select")
127
+ end
128
+
129
+ it "should build correctly" do
130
+ expect(body).to have_selector("input[name='q[title_#{predicate}]']")
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ describe "text attribute" do
138
+ let(:body) { Capybara.string(filter :body) }
139
+
140
+ it "should generate a search field for a text attribute" do
141
+ expect(body).to have_selector("input[name='q[body_contains]']")
142
+ end
143
+
144
+ it "should have a proper label" do
145
+ expect(body).to have_selector("label", text: "Body")
146
+ end
147
+ end
148
+
149
+ describe "string attribute, as a select" do
150
+ let(:body) { filter :title, as: :select }
151
+ let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
152
+
153
+ context "when loading collection from DB" do
154
+ it "should use pluck for efficiency" do
155
+ expect_any_instance_of(builder).to receive(:pluck_column) { [] }
156
+ body
157
+ end
158
+
159
+ it "should remove original ordering to prevent PostgreSQL error" do
160
+ expect(scope.object.klass).to receive(:reorder).with('title asc') {
161
+ m = double distinct: double(pluck: ['A Title'])
162
+ expect(m.distinct).to receive(:pluck).with :title
163
+ m
164
+ }
165
+ body
166
+ end
167
+ end
168
+ end
169
+
170
+ describe "date attribute" do
171
+ let(:body) { Capybara.string(filter :published_date) }
172
+
173
+ it "should generate a date greater than" do
174
+ expect(body).to have_selector("input.datepicker[name='q[published_date_gteq]']")
175
+ end
176
+ it "should generate a date less than" do
177
+ expect(body).to have_selector("input.datepicker[name='q[published_date_lteq]']")
178
+ end
179
+ end
180
+
181
+ describe "datetime attribute" do
182
+ let(:body) { Capybara.string(filter :created_at) }
183
+
184
+ it "should generate a date greater than" do
185
+ expect(body).to have_selector("input.datepicker[name='q[created_at_gteq_datetime]']")
186
+ end
187
+ it "should generate a date less than" do
188
+ expect(body).to have_selector("input.datepicker[name='q[created_at_lteq_datetime]']")
189
+ end
190
+ end
191
+
192
+ describe "integer attribute" do
193
+ context "without options" do
194
+ let(:body) { Capybara.string(filter :id) }
195
+
196
+ it "should generate a select option for equal to" do
197
+ expect(body).to have_selector("option[value=id_equals]", text: "Equals")
198
+ end
199
+ it "should generate a select option for greater than" do
200
+ expect(body).to have_selector("option[value=id_greater_than]", text: "Greater than")
201
+ end
202
+ it "should generate a select option for less than" do
203
+ expect(body).to have_selector("option[value=id_less_than]", text: "Less than")
204
+ end
205
+ it "should generate a text field for input" do
206
+ expect(body).to have_selector("input[name='q[id_equals]']")
207
+ end
208
+ it "should select the option which is currently being filtered" do
209
+ scope = Post.search id_greater_than: 1
210
+ body = Capybara.string(render_filter scope, id: {})
211
+ expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
212
+ end
213
+ end
214
+
215
+ context "with filters options" do
216
+ let(:body) { Capybara.string(filter :id, filters: [:equals, :greater_than]) }
217
+
218
+ it "should generate provided options for filter select" do
219
+ expect(body).to have_selector("option[value=id_equals]", text: "Equals")
220
+ expect(body).to have_selector("option[value=id_greater_than]", text: "Greater than")
221
+ end
222
+
223
+ it "should not generate a select option for less than" do
224
+ expect(body).not_to have_selector("option[value=id_less_than]")
225
+ end
226
+ end
227
+ end
228
+
229
+ describe "boolean attribute" do
230
+ context "boolean datatypes" do
231
+ let(:body) { Capybara.string(filter :starred) }
232
+
233
+ it "should generate a select" do
234
+ expect(body).to have_selector("select[name='q[starred_eq]']")
235
+ end
236
+ it "should set the default text to 'Any'" do
237
+ expect(body).to have_selector("option[value='']", text: "Any")
238
+ end
239
+ it "should create an option for true and false" do
240
+ expect(body).to have_selector("option[value=true]", text: "Yes")
241
+ expect(body).to have_selector("option[value=false]", text: "No")
242
+ end
243
+
244
+ it "should translate the label for boolean field" do
245
+ with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
246
+ expect(body).to have_selector("label", text: "Faved")
247
+ end
248
+ end
249
+ end
250
+
251
+ context "non-boolean data types" do
252
+ let(:body) { Capybara.string(filter :title_present, as: :boolean) }
253
+
254
+ it "should generate a select" do
255
+ expect(body).to have_selector("select[name='q[title_present]']")
256
+ end
257
+ it "should set the default text to 'Any'" do
258
+ expect(body).to have_selector("option[value='']", text: "Any")
259
+ end
260
+ it "should create an option for true and false" do
261
+ expect(body).to have_selector("option[value=true]", text: "Yes")
262
+ expect(body).to have_selector("option[value=false]", text: "No")
263
+ end
264
+ end
265
+ end
266
+
267
+ describe "belongs_to" do
268
+ before do
269
+ @john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
270
+ @jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
271
+ end
272
+
273
+ context "when given as the _id attribute name" do
274
+ let(:body) { Capybara.string(filter :author_id) }
275
+
276
+ it "should generate a numeric filter" do
277
+ expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
278
+ expect(body).to have_selector("option[value=author_id_less_than]")
279
+ expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
280
+ end
281
+ end
282
+
283
+ context "when given as the name of the relationship" do
284
+ let(:body) { Capybara.string(filter :author) }
285
+
286
+ it "should generate a select" do
287
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
288
+ end
289
+ it "should set the default text to 'Any'" do
290
+ expect(body).to have_selector("option[value='']", text: "Any")
291
+ end
292
+ it "should create an option for each related object" do
293
+ expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
294
+ expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
295
+ end
296
+
297
+ context "with a proc" do
298
+ let :body do
299
+ Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
300
+ end
301
+
302
+ it "should use call the proc as the collection" do
303
+ expect(body).to have_selector("option", text: "Title One")
304
+ expect(body).to have_selector("option", text: "Title Two")
305
+ end
306
+
307
+ it "should render the collection in the context of the view" do
308
+ body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
309
+ expect(body).to have_selector("option", text: "A Helper Method")
310
+ end
311
+ end
312
+ end
313
+
314
+ context "when given the name of relationship with a primary key other than id" do
315
+ let(:resource_klass) {
316
+ Class.new(Post) do
317
+ belongs_to :kategory, class_name: "Category", primary_key: :name, foreign_key: :title
318
+
319
+ def self.name
320
+ "SuperPost"
321
+ end
322
+ end
323
+ }
324
+
325
+ let(:scope) do
326
+ resource_klass.search
327
+ end
328
+
329
+ let(:body) { Capybara.string(filter :kategory) }
330
+
331
+ it "should use the association primary key" do
332
+ expect(body).to have_selector("select[name='q[kategory_name_eq]']")
333
+ end
334
+ end
335
+
336
+ context "as check boxes" do
337
+ let(:body) { Capybara.string(filter :author, as: :check_boxes) }
338
+
339
+ it "should create a check box for each related object" do
340
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
341
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
342
+ end
343
+ end
344
+
345
+ context "when polymorphic relationship" do
346
+ let(:scope) { ActiveAdmin::Comment.search }
347
+ it "should raise an error if a collection isn't provided" do
348
+ expect { filter :resource }.to raise_error \
349
+ Formtastic::PolymorphicInputWithoutCollectionError
350
+ end
351
+ end
352
+
353
+ context "when using a custom foreign key" do
354
+ let(:scope) { Post.search }
355
+ let(:body) { Capybara.string(filter :category) }
356
+ it "should ignore that foreign key and let Ransack handle it" do
357
+ expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
358
+ expect(body).to have_selector("select[name='q[category_id_eq]']")
359
+ end
360
+ end
361
+ end # belongs to
362
+
363
+ describe "has_and_belongs_to_many" do
364
+ skip "add HABTM models so this can be tested"
365
+ end
366
+
367
+ describe "has_many :through" do
368
+ # Setup an ActionView::Base object which can be used for
369
+ # generating the form for.
370
+ let(:helpers) do
371
+ view = action_view
372
+ def view.collection_path
373
+ "/categories"
374
+ end
375
+
376
+ def view.protect_against_forgery?
377
+ false
378
+ end
379
+
380
+ def view.a_helper_method
381
+ "A Helper Method"
382
+ end
383
+
384
+ view
385
+ end
386
+ let(:scope) { Category.search }
387
+
388
+ let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
389
+ let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
390
+
391
+ context "when given as the name of the relationship" do
392
+ let(:body) { Capybara.string(filter :authors) }
393
+
394
+ it "should generate a select" do
395
+ expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
396
+ end
397
+
398
+ it "should set the default text to 'Any'" do
399
+ expect(body).to have_selector("option[value='']", text: "Any")
400
+ end
401
+
402
+ it "should create an option for each related object" do
403
+ expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
404
+ expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
405
+ end
406
+ end
407
+
408
+ context "as check boxes" do
409
+ let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
410
+
411
+ it "should create a check box for each related object" do
412
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
413
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
414
+ end
415
+ end
416
+ end
417
+
418
+ describe "conditional display" do
419
+ [:if, :unless].each do |verb|
420
+ should = verb == :if ? "should" : "shouldn't"
421
+ if_true = verb == :if ? :to : :to_not
422
+ if_false = verb == :if ? :to_not : :to
423
+ context "with #{verb.inspect} proc" do
424
+ it "#{should} be displayed if true" do
425
+ body = Capybara.string(filter :body, verb => proc{ true })
426
+ expect(body).send if_true, have_selector("input[name='q[body_contains]']")
427
+ end
428
+ it "#{should} be displayed if false" do
429
+ body = Capybara.string(filter :body, verb => proc{ false })
430
+ expect(body).send if_false, have_selector("input[name='q[body_contains]']")
431
+ end
432
+ it "should still be hidden on the second render" do
433
+ filters = {body: { verb => proc{ verb == :unless }}}
434
+ 2.times do
435
+ body = Capybara.string(render_filter scope, filters)
436
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
437
+ end
438
+ end
439
+ it "should successfully keep rendering other filters after one is hidden" do
440
+ filters = {body: { verb => proc{ verb == :unless }}, author: {}}
441
+ body = Capybara.string(render_filter scope, filters)
442
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
443
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
444
+ end
445
+ end
446
+ end
447
+ end
448
+
449
+ describe "custom search methods" do
450
+
451
+ it "should use the default type of the ransacker" do
452
+ body = Capybara.string(filter :custom_searcher_numeric)
453
+ expect(body).to have_selector("option[value=custom_searcher_numeric_equals]")
454
+ expect(body).to have_selector("option[value=custom_searcher_numeric_greater_than]")
455
+ expect(body).to have_selector("option[value=custom_searcher_numeric_less_than]")
456
+ end
457
+
458
+ it "should work as select" do
459
+ body = Capybara.string(filter :custom_title_searcher, as: :select, collection: ['foo'])
460
+ expect(body).to have_selector("select[name='q[custom_title_searcher_eq]']")
461
+ end
462
+
463
+ it "should work as string" do
464
+ body = Capybara.string(filter :custom_title_searcher, as: :string)
465
+ expect(body).to have_selector("option[value=custom_title_searcher_contains]")
466
+ expect(body).to have_selector("option[value=custom_title_searcher_starts_with]")
467
+ end
468
+
469
+ describe "custom date range search" do
470
+ let(:qteq) { "2010-10-01" }
471
+ let(:lteq) { "2010-10-02" }
472
+ let(:scope){ Post.search custom_created_at_searcher_gteq_datetime: qteq, custom_created_at_searcher_lteq_datetime: lteq }
473
+ let(:body) { Capybara.string(render_filter scope, custom_created_at_searcher: {as: :date_range}) }
474
+
475
+ it "should work as date_range" do
476
+ expect(body).to have_selector("input[name='q[custom_created_at_searcher_gteq_datetime]'][value='2010-10-01']")
477
+ expect(body).to have_selector("input[name='q[custom_created_at_searcher_lteq_datetime]'][value='2010-10-02']")
478
+ end
479
+
480
+ context "filter value can't be casted to date" do
481
+ let(:qteq) { "Ooops" }
482
+ let(:lteq) { "Ooops" }
483
+
484
+ it "should work display empty filter values" do
485
+ expect(body).to have_selector("input[name='q[custom_created_at_searcher_gteq_datetime]'][value='']")
486
+ expect(body).to have_selector("input[name='q[custom_created_at_searcher_lteq_datetime]'][value='']")
487
+ end
488
+ end
489
+
490
+ end
491
+ end
492
+
493
+ describe "does not support some filter inputs" do
494
+ it "should fallback to use formtastic inputs" do
495
+ body = Capybara.string(filter :custom_title_searcher, as: :text)
496
+ expect(body).to have_selector("textarea[name='q[custom_title_searcher]']")
497
+ end
498
+ end
499
+
500
+ describe "blank option" do
501
+ context "for a select filter" do
502
+ it "should be there by default" do
503
+ body = Capybara.string(filter(:author))
504
+ expect(body).to have_selector("option", text: "Any")
505
+ end
506
+ it "should be able to be disabled" do
507
+ body = Capybara.string(filter(:author, include_blank: false))
508
+ expect(body).to_not have_selector("option", text: "Any")
509
+ end
510
+ end
511
+
512
+ context "for a multi-select filter" do
513
+ it "should not be there by default" do
514
+ body = Capybara.string(filter(:author, multiple: true))
515
+ expect(body).to_not have_selector("option", text: "Any")
516
+ end
517
+ it "should be able to be enabled" do
518
+ body = Capybara.string(filter(:author, multiple: true, include_blank: true))
519
+ expect(body).to have_selector("option", text: "Any")
520
+ end
521
+ end
522
+ end
523
+
524
+ end