activeadmin-orac 1.0.0.pre4

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 (529) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +49 -0
  3. data/.hound.yml +14 -0
  4. data/.travis.yml +40 -0
  5. data/.yardopts +8 -0
  6. data/CHANGELOG.md +120 -0
  7. data/CODE_OF_CONDUCT.md +22 -0
  8. data/CONTRIBUTING.md +144 -0
  9. data/Gemfile +78 -0
  10. data/Guardfile +8 -0
  11. data/LICENSE +20 -0
  12. data/README.md +102 -0
  13. data/Rakefile +33 -0
  14. data/activeadmin.gemspec +31 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  16. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  17. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  18. data/app/assets/images/active_admin/orderable.png +0 -0
  19. data/app/assets/javascripts/active_admin/base.js.coffee +9 -0
  20. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  21. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  22. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +7 -0
  23. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +10 -0
  24. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +22 -0
  25. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +3 -0
  26. data/app/assets/javascripts/active_admin/jquery_ui.js.erb +11 -0
  27. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  28. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +44 -0
  29. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
  30. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  31. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  32. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  33. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +42 -0
  34. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
  35. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  36. data/app/assets/stylesheets/active_admin/_forms.scss +333 -0
  37. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  38. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  39. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  40. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  41. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  42. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  43. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  44. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  45. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  46. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  47. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  48. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  49. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  50. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  51. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  52. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  53. data/app/assets/stylesheets/active_admin/components/_pagination.scss +44 -0
  54. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  55. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  56. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
  57. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  58. data/app/assets/stylesheets/active_admin/components/_tables.scss +110 -0
  59. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  60. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  61. data/app/assets/stylesheets/active_admin/mixins/_all.scss +10 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_reset.scss +165 -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 +288 -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 +27 -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/layouts/active_admin.html.arb +1 -0
  91. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  92. data/config/locales/ar.yml +136 -0
  93. data/config/locales/bg.yml +121 -0
  94. data/config/locales/bs.yml +122 -0
  95. data/config/locales/ca.yml +107 -0
  96. data/config/locales/cs.yml +110 -0
  97. data/config/locales/da.yml +106 -0
  98. data/config/locales/de-CH.yml +102 -0
  99. data/config/locales/de.yml +135 -0
  100. data/config/locales/el.yml +127 -0
  101. data/config/locales/en-GB.yml +98 -0
  102. data/config/locales/en.yml +136 -0
  103. data/config/locales/es-MX.yml +94 -0
  104. data/config/locales/es.yml +136 -0
  105. data/config/locales/fa.yml +120 -0
  106. data/config/locales/fi.yml +113 -0
  107. data/config/locales/fr.yml +119 -0
  108. data/config/locales/he.yml +95 -0
  109. data/config/locales/hr.yml +124 -0
  110. data/config/locales/hu.yml +99 -0
  111. data/config/locales/id.yml +136 -0
  112. data/config/locales/it.yml +136 -0
  113. data/config/locales/ja.yml +136 -0
  114. data/config/locales/ko.yml +121 -0
  115. data/config/locales/lt.yml +121 -0
  116. data/config/locales/lv.yml +93 -0
  117. data/config/locales/nb.yml +121 -0
  118. data/config/locales/nl.yml +134 -0
  119. data/config/locales/pl.yml +98 -0
  120. data/config/locales/pt-BR.yml +136 -0
  121. data/config/locales/pt-PT.yml +93 -0
  122. data/config/locales/ro.yml +97 -0
  123. data/config/locales/ru.yml +140 -0
  124. data/config/locales/sv-SE.yml +134 -0
  125. data/config/locales/tr.yml +136 -0
  126. data/config/locales/uk.yml +137 -0
  127. data/config/locales/vi.yml +94 -0
  128. data/config/locales/zh-CN.yml +112 -0
  129. data/config/locales/zh-TW.yml +136 -0
  130. data/cucumber.yml +3 -0
  131. data/docs/0-installation.md +112 -0
  132. data/docs/1-general-configuration.md +171 -0
  133. data/docs/10-custom-pages.md +106 -0
  134. data/docs/11-decorators.md +55 -0
  135. data/docs/12-arbre-components.md +150 -0
  136. data/docs/13-authorization-adapter.md +248 -0
  137. data/docs/14-gotchas.md +116 -0
  138. data/docs/2-resource-customization.md +422 -0
  139. data/docs/3-index-pages.md +272 -0
  140. data/docs/3-index-pages/custom-index.md +31 -0
  141. data/docs/3-index-pages/index-as-block.md +21 -0
  142. data/docs/3-index-pages/index-as-blog.md +71 -0
  143. data/docs/3-index-pages/index-as-grid.md +29 -0
  144. data/docs/3-index-pages/index-as-table.md +213 -0
  145. data/docs/4-csv-format.md +58 -0
  146. data/docs/5-forms.md +172 -0
  147. data/docs/6-show-pages.md +105 -0
  148. data/docs/7-sidebars.md +71 -0
  149. data/docs/8-custom-actions.md +160 -0
  150. data/docs/9-batch-actions.md +233 -0
  151. data/docs/README.md +24 -0
  152. data/features/action_item.feature +73 -0
  153. data/features/authorization.feature +64 -0
  154. data/features/authorization_cancan.feature +52 -0
  155. data/features/authorization_pundit.feature +37 -0
  156. data/features/belongs_to.feature +66 -0
  157. data/features/breadcrumb.feature +75 -0
  158. data/features/comments/commenting.feature +171 -0
  159. data/features/comments/viewing_index.feature +19 -0
  160. data/features/dashboard.feature +16 -0
  161. data/features/decorators.feature +43 -0
  162. data/features/development_reloading.feature +30 -0
  163. data/features/edit_page.feature +117 -0
  164. data/features/favicon.feature +20 -0
  165. data/features/first_boot.feature +16 -0
  166. data/features/global_navigation.feature +29 -0
  167. data/features/i18n.feature +43 -0
  168. data/features/index/batch_actions.feature +196 -0
  169. data/features/index/filters.feature +161 -0
  170. data/features/index/format_as_csv.feature +203 -0
  171. data/features/index/formats.feature +66 -0
  172. data/features/index/index_as_block.feature +15 -0
  173. data/features/index/index_as_blog.feature +69 -0
  174. data/features/index/index_as_grid.feature +45 -0
  175. data/features/index/index_as_table.feature +291 -0
  176. data/features/index/index_blank_slate.feature +83 -0
  177. data/features/index/index_parameters.feature +75 -0
  178. data/features/index/index_scope_to.feature +56 -0
  179. data/features/index/index_scopes.feature +251 -0
  180. data/features/index/page_title.feature +42 -0
  181. data/features/index/pagination.feature +63 -0
  182. data/features/index/switch_index_view.feature +73 -0
  183. data/features/menu.feature +53 -0
  184. data/features/meta_tags.feature +21 -0
  185. data/features/new_page.feature +109 -0
  186. data/features/registering_assets.feature +34 -0
  187. data/features/registering_pages.feature +148 -0
  188. data/features/registering_resources.feature +33 -0
  189. data/features/renamed_resource.feature +32 -0
  190. data/features/root_to.feature +17 -0
  191. data/features/show/columns.feature +40 -0
  192. data/features/show/default_content.feature +44 -0
  193. data/features/show/page_title.feature +59 -0
  194. data/features/show/tabs.feature +27 -0
  195. data/features/sidebar_sections.feature +210 -0
  196. data/features/site_title.feature +47 -0
  197. data/features/specifying_actions.feature +93 -0
  198. data/features/step_definitions/action_item_steps.rb +7 -0
  199. data/features/step_definitions/action_link_steps.rb +20 -0
  200. data/features/step_definitions/additional_web_steps.rb +81 -0
  201. data/features/step_definitions/asset_steps.rb +15 -0
  202. data/features/step_definitions/attribute_steps.rb +18 -0
  203. data/features/step_definitions/batch_action_steps.rb +81 -0
  204. data/features/step_definitions/blog_steps.rb +3 -0
  205. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  206. data/features/step_definitions/column_steps.rb +8 -0
  207. data/features/step_definitions/comment_steps.rb +12 -0
  208. data/features/step_definitions/configuration_steps.rb +100 -0
  209. data/features/step_definitions/dashboard_steps.rb +15 -0
  210. data/features/step_definitions/factory_steps.rb +35 -0
  211. data/features/step_definitions/filter_steps.rb +39 -0
  212. data/features/step_definitions/flash_steps.rb +11 -0
  213. data/features/step_definitions/format_steps.rb +52 -0
  214. data/features/step_definitions/i18n_steps.rb +3 -0
  215. data/features/step_definitions/index_scope_steps.rb +21 -0
  216. data/features/step_definitions/index_views_steps.rb +3 -0
  217. data/features/step_definitions/layout_steps.rb +3 -0
  218. data/features/step_definitions/member_link_steps.rb +7 -0
  219. data/features/step_definitions/menu_steps.rb +11 -0
  220. data/features/step_definitions/meta_tag_steps.rb +3 -0
  221. data/features/step_definitions/pagination_steps.rb +15 -0
  222. data/features/step_definitions/sidebar_steps.rb +13 -0
  223. data/features/step_definitions/site_title_steps.rb +17 -0
  224. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  225. data/features/step_definitions/tab_steps.rb +8 -0
  226. data/features/step_definitions/table_steps.rb +116 -0
  227. data/features/step_definitions/user_steps.rb +52 -0
  228. data/features/step_definitions/web_steps.rb +85 -0
  229. data/features/sti_resource.feature +65 -0
  230. data/features/strong_parameters.feature +73 -0
  231. data/features/support/env.rb +162 -0
  232. data/features/support/paths.rb +71 -0
  233. data/features/support/selectors.rb +45 -0
  234. data/features/symbol_leak.feature +35 -0
  235. data/features/users/logging_in.feature +36 -0
  236. data/features/users/logging_out.feature +13 -0
  237. data/features/users/resetting_password.feature +34 -0
  238. data/lib/active_admin.rb +130 -0
  239. data/lib/active_admin/abstract_view_factory.rb +85 -0
  240. data/lib/active_admin/application.rb +324 -0
  241. data/lib/active_admin/asset_registration.rb +29 -0
  242. data/lib/active_admin/authorization_adapter.rb +132 -0
  243. data/lib/active_admin/base_controller.rb +87 -0
  244. data/lib/active_admin/base_controller/authorization.rb +130 -0
  245. data/lib/active_admin/base_controller/menu.rb +38 -0
  246. data/lib/active_admin/batch_actions.rb +16 -0
  247. data/lib/active_admin/batch_actions/controller.rb +40 -0
  248. data/lib/active_admin/batch_actions/resource_extension.rb +159 -0
  249. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  250. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  251. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  252. data/lib/active_admin/callbacks.rb +88 -0
  253. data/lib/active_admin/cancan_adapter.rb +36 -0
  254. data/lib/active_admin/component.rb +5 -0
  255. data/lib/active_admin/controller_action.rb +12 -0
  256. data/lib/active_admin/csv_builder.rb +129 -0
  257. data/lib/active_admin/dependency.rb +168 -0
  258. data/lib/active_admin/deprecation.rb +35 -0
  259. data/lib/active_admin/devise.rb +80 -0
  260. data/lib/active_admin/dsl.rb +173 -0
  261. data/lib/active_admin/engine.rb +16 -0
  262. data/lib/active_admin/error.rb +62 -0
  263. data/lib/active_admin/event.rb +24 -0
  264. data/lib/active_admin/filters.rb +9 -0
  265. data/lib/active_admin/filters/active.rb +30 -0
  266. data/lib/active_admin/filters/dsl.rb +21 -0
  267. data/lib/active_admin/filters/forms.rb +83 -0
  268. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  269. data/lib/active_admin/filters/humanized.rb +68 -0
  270. data/lib/active_admin/filters/resource_extension.rb +194 -0
  271. data/lib/active_admin/form_builder.rb +145 -0
  272. data/lib/active_admin/generators/boilerplate.rb +45 -0
  273. data/lib/active_admin/helpers/collection.rb +17 -0
  274. data/lib/active_admin/helpers/i18n.rb +7 -0
  275. data/lib/active_admin/helpers/optional_display.rb +38 -0
  276. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  277. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  278. data/lib/active_admin/helpers/settings.rb +115 -0
  279. data/lib/active_admin/inputs.rb +20 -0
  280. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  281. data/lib/active_admin/inputs/filters/base.rb +44 -0
  282. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  283. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  284. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  285. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  286. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  287. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  288. data/lib/active_admin/inputs/filters/select_input.rb +55 -0
  289. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  290. data/lib/active_admin/menu.rb +108 -0
  291. data/lib/active_admin/menu_collection.rb +93 -0
  292. data/lib/active_admin/menu_item.rb +97 -0
  293. data/lib/active_admin/namespace.rb +247 -0
  294. data/lib/active_admin/order_clause.rb +26 -0
  295. data/lib/active_admin/orm/active_record.rb +5 -0
  296. data/lib/active_admin/orm/active_record/comments.rb +95 -0
  297. data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
  298. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  299. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  300. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  301. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  302. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +88 -0
  303. data/lib/active_admin/orm/mongoid.rb +1 -0
  304. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  305. data/lib/active_admin/page.rb +92 -0
  306. data/lib/active_admin/page_controller.rb +33 -0
  307. data/lib/active_admin/page_dsl.rb +28 -0
  308. data/lib/active_admin/page_presenter.rb +32 -0
  309. data/lib/active_admin/pundit_adapter.rb +68 -0
  310. data/lib/active_admin/reloader.rb +25 -0
  311. data/lib/active_admin/resource.rb +168 -0
  312. data/lib/active_admin/resource/action_items.rb +108 -0
  313. data/lib/active_admin/resource/belongs_to.rb +44 -0
  314. data/lib/active_admin/resource/controllers.rb +19 -0
  315. data/lib/active_admin/resource/includes.rb +12 -0
  316. data/lib/active_admin/resource/menu.rb +64 -0
  317. data/lib/active_admin/resource/naming.rb +62 -0
  318. data/lib/active_admin/resource/page_presenters.rb +82 -0
  319. data/lib/active_admin/resource/pagination.rb +23 -0
  320. data/lib/active_admin/resource/routes.rb +115 -0
  321. data/lib/active_admin/resource/scope_to.rb +74 -0
  322. data/lib/active_admin/resource/scopes.rb +50 -0
  323. data/lib/active_admin/resource/sidebars.rb +28 -0
  324. data/lib/active_admin/resource_collection.rb +72 -0
  325. data/lib/active_admin/resource_controller.rb +51 -0
  326. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  327. data/lib/active_admin/resource_controller/data_access.rb +317 -0
  328. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  329. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  330. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  331. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  332. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  333. data/lib/active_admin/resource_dsl.rb +190 -0
  334. data/lib/active_admin/router.rb +106 -0
  335. data/lib/active_admin/scope.rb +56 -0
  336. data/lib/active_admin/sidebar_section.rb +37 -0
  337. data/lib/active_admin/version.rb +3 -0
  338. data/lib/active_admin/view_factory.rb +27 -0
  339. data/lib/active_admin/view_helpers.rb +19 -0
  340. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  341. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  342. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  343. data/lib/active_admin/view_helpers/display_helper.rb +97 -0
  344. data/lib/active_admin/view_helpers/download_format_links_helper.rb +46 -0
  345. data/lib/active_admin/view_helpers/fields_for.rb +51 -0
  346. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  347. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  348. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  349. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  350. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  351. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  352. data/lib/active_admin/views.rb +8 -0
  353. data/lib/active_admin/views/action_items.rb +17 -0
  354. data/lib/active_admin/views/components/active_admin_form.rb +124 -0
  355. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  356. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  357. data/lib/active_admin/views/components/columns.rb +161 -0
  358. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  359. data/lib/active_admin/views/components/index_list.rb +68 -0
  360. data/lib/active_admin/views/components/paginated_collection.rb +163 -0
  361. data/lib/active_admin/views/components/panel.rb +38 -0
  362. data/lib/active_admin/views/components/scopes.rb +66 -0
  363. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  364. data/lib/active_admin/views/components/site_title.rb +55 -0
  365. data/lib/active_admin/views/components/status_tag.rb +80 -0
  366. data/lib/active_admin/views/components/table_for.rb +218 -0
  367. data/lib/active_admin/views/components/tabs.rb +28 -0
  368. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  369. data/lib/active_admin/views/footer.rb +20 -0
  370. data/lib/active_admin/views/header.rb +32 -0
  371. data/lib/active_admin/views/index_as_block.rb +36 -0
  372. data/lib/active_admin/views/index_as_blog.rb +156 -0
  373. data/lib/active_admin/views/index_as_grid.rb +80 -0
  374. data/lib/active_admin/views/index_as_table.rb +373 -0
  375. data/lib/active_admin/views/pages/base.rb +147 -0
  376. data/lib/active_admin/views/pages/form.rb +65 -0
  377. data/lib/active_admin/views/pages/index.rb +163 -0
  378. data/lib/active_admin/views/pages/layout.rb +26 -0
  379. data/lib/active_admin/views/pages/page.rb +30 -0
  380. data/lib/active_admin/views/pages/show.rb +59 -0
  381. data/lib/active_admin/views/tabbed_navigation.rb +66 -0
  382. data/lib/active_admin/views/title_bar.rb +55 -0
  383. data/lib/activeadmin.rb +1 -0
  384. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  385. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  386. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  387. data/lib/generators/active_admin/devise/devise_generator.rb +65 -0
  388. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  389. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +272 -0
  390. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
  391. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  392. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  393. data/lib/generators/active_admin/page/USAGE +8 -0
  394. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  395. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  396. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  397. data/lib/generators/active_admin/resource/templates/admin.rb +45 -0
  398. data/lib/ransack_ext.rb +20 -0
  399. data/script/local +53 -0
  400. data/script/travis_cache +107 -0
  401. data/script/use_rails +53 -0
  402. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  403. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  404. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  405. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  406. data/spec/javascripts/fixtures/flashes.html +2 -0
  407. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  408. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  409. data/spec/javascripts/support/jasmine.yml +74 -0
  410. data/spec/javascripts/support/jasmine_config.rb +23 -0
  411. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  412. data/spec/rails_helper.rb +161 -0
  413. data/spec/requests/default_namespace_spec.rb +61 -0
  414. data/spec/requests/javascript_spec.rb +22 -0
  415. data/spec/requests/memory_spec.rb +21 -0
  416. data/spec/requests/stylesheets_spec.rb +18 -0
  417. data/spec/spec_helper.rb +17 -0
  418. data/spec/support/active_admin_request_helpers.rb +27 -0
  419. data/spec/support/deferred_garbage_collection.rb +19 -0
  420. data/spec/support/detect_rails_version.rb +34 -0
  421. data/spec/support/jslint.yml +80 -0
  422. data/spec/support/rails_template.rb +162 -0
  423. data/spec/support/rails_template_with_data.rb +74 -0
  424. data/spec/support/templates/admin/stores.rb +9 -0
  425. data/spec/support/templates/en.yml +8 -0
  426. data/spec/support/templates/manifest.js +3 -0
  427. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  428. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  429. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  430. data/spec/support/templates/policies/application_policy.rb +45 -0
  431. data/spec/support/templates/policies/category_policy.rb +7 -0
  432. data/spec/support/templates/policies/post_policy.rb +15 -0
  433. data/spec/support/templates/policies/store_policy.rb +11 -0
  434. data/spec/support/templates/policies/user_policy.rb +11 -0
  435. data/spec/support/templates/post_decorator.rb +11 -0
  436. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  437. data/spec/unit/action_builder_spec.rb +134 -0
  438. data/spec/unit/active_admin_spec.rb +11 -0
  439. data/spec/unit/application_spec.rb +165 -0
  440. data/spec/unit/asset_registration_spec.rb +52 -0
  441. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  442. data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
  443. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  444. data/spec/unit/auto_link_spec.rb +69 -0
  445. data/spec/unit/batch_actions/resource_spec.rb +97 -0
  446. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  447. data/spec/unit/belongs_to_spec.rb +65 -0
  448. data/spec/unit/cancan_adapter_spec.rb +43 -0
  449. data/spec/unit/comments_spec.rb +188 -0
  450. data/spec/unit/component_spec.rb +18 -0
  451. data/spec/unit/config_shared_examples.rb +59 -0
  452. data/spec/unit/controller_filters_spec.rb +41 -0
  453. data/spec/unit/csv_builder_spec.rb +303 -0
  454. data/spec/unit/dependency_spec.rb +135 -0
  455. data/spec/unit/devise_spec.rb +96 -0
  456. data/spec/unit/dsl_spec.rb +122 -0
  457. data/spec/unit/filters/filter_form_builder_spec.rb +434 -0
  458. data/spec/unit/filters/humanized_spec.rb +64 -0
  459. data/spec/unit/filters/resource_spec.rb +128 -0
  460. data/spec/unit/form_builder_spec.rb +932 -0
  461. data/spec/unit/generators/install_spec.rb +24 -0
  462. data/spec/unit/helpers/collection_spec.rb +65 -0
  463. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  464. data/spec/unit/helpers/settings_spec.rb +30 -0
  465. data/spec/unit/i18n_spec.rb +12 -0
  466. data/spec/unit/menu_collection_spec.rb +62 -0
  467. data/spec/unit/menu_item_spec.rb +143 -0
  468. data/spec/unit/menu_spec.rb +71 -0
  469. data/spec/unit/namespace/authorization_spec.rb +27 -0
  470. data/spec/unit/namespace/register_page_spec.rb +73 -0
  471. data/spec/unit/namespace/register_resource_spec.rb +160 -0
  472. data/spec/unit/namespace_spec.rb +103 -0
  473. data/spec/unit/order_clause_spec.rb +81 -0
  474. data/spec/unit/page_controller_spec.rb +5 -0
  475. data/spec/unit/page_spec.rb +78 -0
  476. data/spec/unit/pretty_format_spec.rb +77 -0
  477. data/spec/unit/pundit_adapter_spec.rb +98 -0
  478. data/spec/unit/resource/action_items_spec.rb +65 -0
  479. data/spec/unit/resource/includes_spec.rb +21 -0
  480. data/spec/unit/resource/menu_spec.rb +18 -0
  481. data/spec/unit/resource/naming_spec.rb +122 -0
  482. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  483. data/spec/unit/resource/pagination_spec.rb +38 -0
  484. data/spec/unit/resource/routes_spec.rb +77 -0
  485. data/spec/unit/resource/scopes_spec.rb +50 -0
  486. data/spec/unit/resource/sidebars_spec.rb +43 -0
  487. data/spec/unit/resource_collection_spec.rb +175 -0
  488. data/spec/unit/resource_controller/data_access_spec.rb +140 -0
  489. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  490. data/spec/unit/resource_controller/sidebars_spec.rb +38 -0
  491. data/spec/unit/resource_controller_spec.rb +269 -0
  492. data/spec/unit/resource_registration_spec.rb +56 -0
  493. data/spec/unit/resource_spec.rb +337 -0
  494. data/spec/unit/routing_spec.rb +185 -0
  495. data/spec/unit/scope_spec.rb +185 -0
  496. data/spec/unit/settings_spec.rb +118 -0
  497. data/spec/unit/view_factory_spec.rb +19 -0
  498. data/spec/unit/view_helpers/breadcrumbs_spec.rb +217 -0
  499. data/spec/unit/view_helpers/display_helper_spec.rb +165 -0
  500. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  501. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  502. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  503. data/spec/unit/view_helpers/form_helper_spec.rb +43 -0
  504. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +139 -0
  505. data/spec/unit/views/components/attributes_table_spec.rb +272 -0
  506. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  507. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  508. data/spec/unit/views/components/columns_spec.rb +189 -0
  509. data/spec/unit/views/components/index_list_spec.rb +35 -0
  510. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  511. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  512. data/spec/unit/views/components/panel_spec.rb +58 -0
  513. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  514. data/spec/unit/views/components/site_title_spec.rb +78 -0
  515. data/spec/unit/views/components/status_tag_spec.rb +249 -0
  516. data/spec/unit/views/components/table_for_spec.rb +434 -0
  517. data/spec/unit/views/components/tabs_spec.rb +39 -0
  518. data/spec/unit/views/components/unsupported_browser_spec.rb +41 -0
  519. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  520. data/spec/unit/views/pages/form_spec.rb +51 -0
  521. data/spec/unit/views/pages/index_spec.rb +60 -0
  522. data/spec/unit/views/pages/layout_spec.rb +59 -0
  523. data/spec/unit/views/pages/show_spec.rb +33 -0
  524. data/spec/unit/views/tabbed_navigation_spec.rb +158 -0
  525. data/tasks/docs.rake +37 -0
  526. data/tasks/parallel_tests.rake +66 -0
  527. data/tasks/test.rake +91 -0
  528. data/tasks/yard.rake +9 -0
  529. metadata +974 -0
@@ -0,0 +1,135 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActiveAdmin::Dependency do
4
+
5
+ k = ActiveAdmin::Dependency
6
+
7
+ describe 'method_missing' do
8
+ before do
9
+ allow(Gem).to receive(:loaded_specs)
10
+ .and_return 'foo' => Gem::Specification.new('foo', '1.2.3')
11
+ end
12
+
13
+ it 'returns a Matcher' do
14
+ expect(k.foo).to be_a ActiveAdmin::Dependency::Matcher
15
+ expect(k.foo.inspect).to eq '<ActiveAdmin::Dependency::Matcher for foo 1.2.3>'
16
+ expect(k.bar.inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
17
+ end
18
+
19
+ describe '`?`' do
20
+ it 'base' do
21
+ expect(k.foo?).to eq true
22
+ expect(k.bar?).to eq false
23
+ end
24
+ it '=' do
25
+ expect(k.foo? '= 1.2.3').to eq true
26
+ expect(k.foo? '= 1' ).to eq false
27
+ end
28
+ it '>' do
29
+ expect(k.foo? '> 1').to eq true
30
+ expect(k.foo? '> 2').to eq false
31
+ end
32
+ it '<' do
33
+ expect(k.foo? '< 2').to eq true
34
+ expect(k.foo? '< 1').to eq false
35
+ end
36
+ it '>=' do
37
+ expect(k.foo? '>= 1.2.3').to eq true
38
+ expect(k.foo? '>= 1.2.2').to eq true
39
+ expect(k.foo? '>= 1.2.4').to eq false
40
+ end
41
+ it '<=' do
42
+ expect(k.foo? '<= 1.2.3').to eq true
43
+ expect(k.foo? '<= 1.2.4').to eq true
44
+ expect(k.foo? '<= 1.2.2').to eq false
45
+ end
46
+ it '~>' do
47
+ expect(k.foo? '~> 1.2.0').to eq true
48
+ expect(k.foo? '~> 1.1' ).to eq true
49
+ expect(k.foo? '~> 1.2.4').to eq false
50
+ end
51
+ end
52
+
53
+ describe '`!`' do
54
+ it 'raises an error if requirement not met' do
55
+ expect{ k.foo! '5' }.to raise_error ActiveAdmin::DependencyError,
56
+ 'You provided foo 1.2.3 but we need: 5.'
57
+ end
58
+ it 'accepts multiple arguments' do
59
+ expect{ k.foo! '> 1', '< 1.2' }.to raise_error ActiveAdmin::DependencyError,
60
+ 'You provided foo 1.2.3 but we need: > 1, < 1.2.'
61
+ end
62
+ it 'raises an error if not provided' do
63
+ expect{ k.bar! }.to raise_error ActiveAdmin::DependencyError,
64
+ 'To use bar you need to specify it in your Gemfile.'
65
+ end
66
+ end
67
+ end
68
+
69
+ describe '[]' do
70
+ before do
71
+ allow(Gem).to receive(:loaded_specs)
72
+ .and_return 'a-b' => Gem::Specification.new('a-b', '1.2.3')
73
+ end
74
+
75
+ it 'allows access to gems with an arbitrary name' do
76
+ expect(k['a-b']).to be_a ActiveAdmin::Dependency::Matcher
77
+ expect(k['a-b'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for a-b 1.2.3>'
78
+ expect(k['c-d'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
79
+ end
80
+
81
+ # Note: more extensive tests for match? and match! are above.
82
+
83
+ it 'match?' do
84
+ expect(k['a-b'].match? ).to eq true
85
+ expect(k['a-b'].match? '1.2.3').to eq true
86
+ expect(k['b-c'].match? ).to eq false
87
+ end
88
+
89
+ it 'match!' do
90
+ expect(k['a-b'].match! ).to eq nil
91
+ expect(k['a-b'].match! '1.2.3').to eq nil
92
+
93
+ expect{ k['a-b'].match! '2.5' }.to raise_error ActiveAdmin::DependencyError,
94
+ 'You provided a-b 1.2.3 but we need: 2.5.'
95
+
96
+ expect{ k['b-c'].match! }.to raise_error ActiveAdmin::DependencyError,
97
+ 'To use b-c you need to specify it in your Gemfile.'
98
+ end
99
+
100
+ # Note: Ruby comparison operators are separate from the `foo? '> 1'` syntax
101
+
102
+ describe 'Ruby comparison syntax' do
103
+
104
+ it '==' do
105
+ expect(k['a-b'] == '1.2.3').to eq true
106
+ expect(k['a-b'] == '1.2' ).to eq false
107
+ expect(k['a-b'] == 1 ).to eq false
108
+ end
109
+ it '>' do
110
+ expect(k['a-b'] > 1).to eq true
111
+ expect(k['a-b'] > 2).to eq false
112
+ end
113
+ it '<' do
114
+ expect(k['a-b'] < 2).to eq true
115
+ expect(k['a-b'] < 1).to eq false
116
+ end
117
+ it '>=' do
118
+ expect(k['a-b'] >= '1.2.3').to eq true
119
+ expect(k['a-b'] >= '1.2.2').to eq true
120
+ expect(k['a-b'] >= '1.2.4').to eq false
121
+ end
122
+ it '<=' do
123
+ expect(k['a-b'] <= '1.2.3').to eq true
124
+ expect(k['a-b'] <= '1.2.4').to eq true
125
+ expect(k['a-b'] <= '1.2.2').to eq false
126
+ end
127
+
128
+ it 'throws a custom error if the gem is missing' do
129
+ expect{ k['b-c'] < 23 }.to raise_error ActiveAdmin::DependencyError,
130
+ 'To use b-c you need to specify it in your Gemfile.'
131
+ end
132
+ end
133
+ end
134
+
135
+ end
@@ -0,0 +1,96 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActiveAdmin::Devise::Controller do
4
+
5
+ let(:controller_class) do
6
+ klass = Class.new do
7
+ def self.layout(*); end
8
+ def self.helper(*); end
9
+ end
10
+ klass.send(:include, ActiveAdmin::Devise::Controller)
11
+ klass
12
+ end
13
+
14
+ let(:controller) { controller_class.new }
15
+
16
+ context 'with a RAILS_RELATIVE_URL_ROOT set' do
17
+
18
+ before { Rails.configuration.action_controller[:relative_url_root] = '/foo' }
19
+
20
+ it "should set the root path to the default namespace" do
21
+ expect(controller.root_path).to eq "/foo/admin"
22
+ end
23
+
24
+ it "should set the root path to '/' when no default namespace" do
25
+ allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
26
+ expect(controller.root_path).to eq "/foo/"
27
+ end
28
+
29
+ end
30
+
31
+ context 'without a RAILS_RELATIVE_URL_ROOT set' do
32
+
33
+ before { Rails.configuration.action_controller[:relative_url_root] = nil }
34
+
35
+ it "should set the root path to the default namespace" do
36
+ expect(controller.root_path).to eq "/admin"
37
+ end
38
+
39
+ it "should set the root path to '/' when no default namespace" do
40
+ allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
41
+ expect(controller.root_path).to eq "/"
42
+ end
43
+
44
+ end
45
+
46
+ context "within a scoped route" do
47
+
48
+ SCOPE = '/aa_scoped'
49
+
50
+ before do
51
+ # Remove existing routes
52
+ routes = Rails.application.routes
53
+ routes.clear!
54
+
55
+ # Add scoped routes
56
+ routes.draw do
57
+ scope path: SCOPE do
58
+ ActiveAdmin.routes(self)
59
+ devise_for :admin_users, ActiveAdmin::Devise.config
60
+ end
61
+ end
62
+ end
63
+
64
+ after do
65
+ # Resume default routes
66
+ reload_routes!
67
+ end
68
+
69
+ it "should include scope path in root_path" do
70
+ expect(controller.root_path).to eq "#{SCOPE}/admin"
71
+ end
72
+
73
+ end
74
+
75
+ describe "#config" do
76
+ let(:config) { ActiveAdmin::Devise.config }
77
+
78
+ describe ":sign_out_via option" do
79
+ it "should contain the application.logout_link_method" do
80
+ expect(::Devise).to receive(:sign_out_via).and_return(:delete)
81
+ expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
82
+
83
+ expect(config[:sign_out_via]).to include(:get)
84
+ end
85
+
86
+ it "should contain Devise's logout_via_method(s)" do
87
+ expect(::Devise).to receive(:sign_out_via).and_return([:delete, :post])
88
+ expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
89
+
90
+ expect(config[:sign_out_via]).to eq [:delete, :post, :get]
91
+ end
92
+
93
+ end # describe ":sign_out_via option"
94
+ end # describe "#config"
95
+
96
+ end
@@ -0,0 +1,122 @@
1
+ require 'rails_helper'
2
+
3
+
4
+ module MockModuleToInclude
5
+ def self.included(dsl)
6
+ end
7
+ end
8
+
9
+ describe ActiveAdmin::DSL do
10
+
11
+ let(:application) { ActiveAdmin::Application.new }
12
+ let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
13
+ let(:resource_config) { ActiveAdmin::Resource.new namespace, Post }
14
+ let(:dsl){ ActiveAdmin::DSL.new(resource_config) }
15
+
16
+ describe "#include" do
17
+
18
+ it "should call the included class method on the module that is included" do
19
+ expect(MockModuleToInclude).to receive(:included).with(dsl)
20
+ dsl.run_registration_block do
21
+ include MockModuleToInclude
22
+ end
23
+ end
24
+
25
+ end
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
+
60
+ describe "#menu" do
61
+
62
+ it "should set the menu_item_options on the configuration" do
63
+ expect(resource_config).to receive(:menu_item_options=).with({parent: "Admin"})
64
+ dsl.run_registration_block do
65
+ menu parent: "Admin"
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ describe "#navigation_menu" do
72
+
73
+ it "should set the navigation_menu_name on the configuration" do
74
+ expect(resource_config).to receive(:navigation_menu_name=).with(:admin)
75
+ dsl.run_registration_block do
76
+ navigation_menu :admin
77
+ end
78
+ end
79
+
80
+ it "should accept a block" do
81
+ dsl = ActiveAdmin::DSL.new(resource_config)
82
+ dsl.run_registration_block do
83
+ navigation_menu { :dynamic_menu }
84
+ end
85
+ expect(resource_config.navigation_menu_name).to eq :dynamic_menu
86
+ end
87
+
88
+ end
89
+
90
+ describe "#sidebar" do
91
+
92
+ before do
93
+ dsl.config.sidebar_sections << ActiveAdmin::SidebarSection.new(:email)
94
+ end
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', 'Search status:', 'email', 'help']
101
+ end
102
+
103
+ end
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
122
+ end
@@ -0,0 +1,434 @@
1
+ require 'rails_helper'
2
+
3
+ class Post
4
+ ransacker :custom_searcher do
5
+ # nothing to see here
6
+ end
7
+ end
8
+
9
+ describe ActiveAdmin::Filters::ViewHelper do
10
+
11
+ # Setup an ActionView::Base object which can be used for
12
+ # generating the form for.
13
+ let(:helpers) do
14
+ view = action_view
15
+ def view.collection_path
16
+ "/posts"
17
+ end
18
+
19
+ def view.protect_against_forgery?
20
+ false
21
+ end
22
+
23
+ def view.a_helper_method
24
+ "A Helper Method"
25
+ end
26
+
27
+ view
28
+ end
29
+
30
+ def render_filter(search, filters)
31
+ render_arbre_component({filter_args: [search, filters]}, helpers) do
32
+ text_node active_admin_filters_form_for *assigns[:filter_args]
33
+ end.to_s
34
+ end
35
+
36
+ def filter(name, options = {})
37
+ render_filter scope, name => options
38
+ end
39
+
40
+ let(:scope) { Post.search }
41
+
42
+ describe "the form in general" do
43
+ let(:body) { Capybara.string(filter :title) }
44
+
45
+ it "should generate a form which submits via get" do
46
+ expect(body).to have_selector("form.filter_form[method=get]")
47
+ end
48
+
49
+ it "should generate a filter button" do
50
+ expect(body).to have_selector("input[type=submit][value=Filter]")
51
+ end
52
+
53
+ it "should only generate the form once" do
54
+ expect(body).to have_selector("form", count: 1)
55
+ end
56
+
57
+ it "should generate a clear filters link" do
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
67
+ end
68
+ end
69
+
70
+ describe "string attribute" do
71
+ let(:body) { Capybara.string(filter :title) }
72
+
73
+ it "should generate a select option for starts with" do
74
+ expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
75
+ end
76
+
77
+ it "should generate a select option for ends with" do
78
+ expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
79
+ end
80
+
81
+ it "should generate a select option for contains" do
82
+ expect(body).to have_selector("option[value=title_contains]", text: "Contains")
83
+ end
84
+
85
+ it "should generate a text field for input" do
86
+ expect(body).to have_selector("input[name='q[title_contains]']")
87
+ end
88
+
89
+ it "should have a proper label" do
90
+ expect(body).to have_selector("label", text: "Title")
91
+ end
92
+
93
+ it "should translate the label for text field" do
94
+ with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
95
+ expect(body).to have_selector("label", text: "Name")
96
+ end
97
+ end
98
+
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")
103
+ end
104
+
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}") }
109
+
110
+ it "shouldn't include a select field" do
111
+ expect(body).not_to have_selector("select")
112
+ end
113
+
114
+ it "should build correctly" do
115
+ expect(body).to have_selector("input[name='q[title_#{predicate}]']")
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ describe "text attribute" do
123
+ let(:body) { Capybara.string(filter :body) }
124
+
125
+ it "should generate a search field for a text attribute" do
126
+ expect(body).to have_selector("input[name='q[body_contains]']")
127
+ end
128
+
129
+ it "should have a proper label" do
130
+ expect(body).to have_selector("label", text: "Body")
131
+ end
132
+ end
133
+
134
+ describe "string attribute, as a select" do
135
+ let(:body) { filter :title, as: :select }
136
+ let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
137
+
138
+ context "when loading collection from DB" do
139
+ it "should use pluck for efficiency" do
140
+ expect_any_instance_of(builder).to receive(:pluck_column) { [] }
141
+ body
142
+ end
143
+
144
+ it "should remove original ordering to prevent PostgreSQL error" do
145
+ expect(scope.object.klass).to receive(:reorder).with('title asc') {
146
+ distinct = ActiveAdmin::Dependency.rails >= 4 ? :distinct : :uniq
147
+ m = double distinct => double(pluck: ['A Title'])
148
+ expect(m.send(distinct)).to receive(:pluck).with :title
149
+ m
150
+ }
151
+ body
152
+ end
153
+ end
154
+ end
155
+
156
+ describe "datetime attribute" do
157
+ let(:body) { Capybara.string(filter :created_at) }
158
+
159
+ it "should generate a date greater than" do
160
+ expect(body).to have_selector("input.datepicker[name='q[created_at_gteq_date]']")
161
+ end
162
+ it "should generate a seperator" do
163
+ expect(body).to have_selector("span.seperator")
164
+ end
165
+ it "should generate a date less than" do
166
+ expect(body).to have_selector("input.datepicker[name='q[created_at_lteq_date]']")
167
+ end
168
+ end
169
+
170
+ describe "integer attribute" do
171
+ let(:body) { Capybara.string(filter :id) }
172
+
173
+ it "should generate a select option for equal to" do
174
+ expect(body).to have_selector("option[value=id_equals]", text: "Equals")
175
+ end
176
+ it "should generate a select option for greater than" do
177
+ expect(body).to have_selector("option", text: "Greater than")
178
+ end
179
+ it "should generate a select option for less than" do
180
+ expect(body).to have_selector("option", text: "Less than")
181
+ end
182
+ it "should generate a text field for input" do
183
+ expect(body).to have_selector("input[name='q[id_equals]']")
184
+ end
185
+ it "should select the option which is currently being filtered" do
186
+ scope = Post.search id_greater_than: 1
187
+ body = Capybara.string(render_filter scope, id: {})
188
+ expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
189
+ end
190
+ end
191
+
192
+ describe "boolean attribute" do
193
+ context "boolean datatypes" do
194
+ let(:body) { Capybara.string(filter :starred) }
195
+
196
+ it "should generate a select" do
197
+ expect(body).to have_selector("select[name='q[starred_eq]']")
198
+ end
199
+ it "should set the default text to 'Any'" do
200
+ expect(body).to have_selector("option[value='']", text: "Any")
201
+ end
202
+ it "should create an option for true and false" do
203
+ expect(body).to have_selector("option[value=true]", text: "Yes")
204
+ expect(body).to have_selector("option[value=false]", text: "No")
205
+ end
206
+
207
+ it "should translate the label for boolean field" do
208
+ with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
209
+ expect(body).to have_selector("label", text: "Faved")
210
+ end
211
+ end
212
+ end
213
+
214
+ context "non-boolean data types" do
215
+ let(:body) { Capybara.string(filter :title_present, as: :boolean) }
216
+
217
+ it "should generate a select" do
218
+ expect(body).to have_selector("select[name='q[title_present]']")
219
+ end
220
+ it "should set the default text to 'Any'" do
221
+ expect(body).to have_selector("option[value='']", text: "Any")
222
+ end
223
+ it "should create an option for true and false" do
224
+ expect(body).to have_selector("option[value=true]", text: "Yes")
225
+ expect(body).to have_selector("option[value=false]", text: "No")
226
+ end
227
+ end
228
+ end
229
+
230
+ describe "belongs_to" do
231
+ before do
232
+ @john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
233
+ @jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
234
+ end
235
+
236
+ context "when given as the _id attribute name" do
237
+ let(:body) { Capybara.string(filter :author_id) }
238
+
239
+ it "should generate a numeric filter" do
240
+ expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
241
+ expect(body).to have_selector("option[value=author_id_less_than]")
242
+ expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
243
+ end
244
+ end
245
+
246
+ context "when given as the name of the relationship" do
247
+ let(:body) { Capybara.string(filter :author) }
248
+
249
+ it "should generate a select" do
250
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
251
+ end
252
+ it "should set the default text to 'Any'" do
253
+ expect(body).to have_selector("option[value='']", text: "Any")
254
+ end
255
+ it "should create an option for each related object" do
256
+ expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
257
+ expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
258
+ end
259
+
260
+ context "with a proc" do
261
+ let :body do
262
+ Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
263
+ end
264
+
265
+ it "should use call the proc as the collection" do
266
+ expect(body).to have_selector("option", text: "Title One")
267
+ expect(body).to have_selector("option", text: "Title Two")
268
+ end
269
+
270
+ it "should render the collection in the context of the view" do
271
+ body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
272
+ expect(body).to have_selector("option", text: "A Helper Method")
273
+ end
274
+ end
275
+ end
276
+
277
+ context "as check boxes" do
278
+ let(:body) { Capybara.string(filter :author, as: :check_boxes) }
279
+
280
+ it "should create a check box for each related object" do
281
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
282
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
283
+ end
284
+ end
285
+
286
+ context "when polymorphic relationship" do
287
+ let(:scope) { ActiveAdmin::Comment.search }
288
+ it "should raise an error if a collection isn't provided" do
289
+ expect { filter :resource }.to raise_error \
290
+ Formtastic::PolymorphicInputWithoutCollectionError
291
+ end
292
+ end
293
+
294
+ context "when using a custom foreign key" do
295
+ let(:scope) { Post.search }
296
+ let(:body) { Capybara.string(filter :category) }
297
+ it "should ignore that foreign key and let Ransack handle it" do
298
+ expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
299
+ expect(body).to have_selector("select[name='q[category_id_eq]']")
300
+ end
301
+ end
302
+ end # belongs to
303
+
304
+ describe "has_and_belongs_to_many" do
305
+ skip "add HABTM models so this can be tested"
306
+ end
307
+
308
+ describe "has_many :through" do
309
+ # Setup an ActionView::Base object which can be used for
310
+ # generating the form for.
311
+ let(:helpers) do
312
+ view = action_view
313
+ def view.collection_path
314
+ "/categories"
315
+ end
316
+
317
+ def view.protect_against_forgery?
318
+ false
319
+ end
320
+
321
+ def view.a_helper_method
322
+ "A Helper Method"
323
+ end
324
+
325
+ view
326
+ end
327
+ let(:scope) { Category.search }
328
+
329
+ let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
330
+ let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
331
+
332
+ context "when given as the name of the relationship" do
333
+ let(:body) { Capybara.string(filter :authors) }
334
+
335
+ it "should generate a select" do
336
+ expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
337
+ end
338
+
339
+ it "should set the default text to 'Any'" do
340
+ expect(body).to have_selector("option[value='']", text: "Any")
341
+ end
342
+
343
+ it "should create an option for each related object" do
344
+ expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
345
+ expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
346
+ end
347
+ end
348
+
349
+ context "as check boxes" do
350
+ let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
351
+
352
+ it "should create a check box for each related object" do
353
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
354
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
355
+ end
356
+ end
357
+ end
358
+
359
+ describe "conditional display" do
360
+ [:if, :unless].each do |verb|
361
+ should = verb == :if ? "should" : "shouldn't"
362
+ if_true = verb == :if ? :to : :to_not
363
+ if_false = verb == :if ? :to_not : :to
364
+ context "with #{verb.inspect} proc" do
365
+ it "#{should} be displayed if true" do
366
+ body = Capybara.string(filter :body, verb => proc{ true })
367
+ expect(body).send if_true, have_selector("input[name='q[body_contains]']")
368
+ end
369
+ it "#{should} be displayed if false" do
370
+ body = Capybara.string(filter :body, verb => proc{ false })
371
+ expect(body).send if_false, have_selector("input[name='q[body_contains]']")
372
+ end
373
+ it "should still be hidden on the second render" do
374
+ filters = {body: { verb => proc{ verb == :unless }}}
375
+ 2.times do
376
+ body = Capybara.string(render_filter scope, filters)
377
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
378
+ end
379
+ end
380
+ it "should successfully keep rendering other filters after one is hidden" do
381
+ filters = {body: { verb => proc{ verb == :unless }}, author: {}}
382
+ body = Capybara.string(render_filter scope, filters)
383
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
384
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
385
+ end
386
+ end
387
+ end
388
+ end
389
+
390
+ describe "custom search methods" do
391
+
392
+ it "should work as select" do
393
+ body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
394
+ expect(body).to have_selector("select[name='q[custom_searcher]']")
395
+ end
396
+
397
+ it "should work as string" do
398
+ body = Capybara.string(filter :custom_searcher, as: :string)
399
+ expect(body).to have_selector("input[name='q[custom_searcher]']")
400
+ end
401
+ end
402
+
403
+ describe "does not support some filter inputs" do
404
+ it "should fallback to use formtastic inputs" do
405
+ body = Capybara.string(filter :custom_searcher, as: :text)
406
+ expect(body).to have_selector("textarea[name='q[custom_searcher]']")
407
+ end
408
+ end
409
+
410
+ describe "blank option" do
411
+ context "for a select filter" do
412
+ it "should be there by default" do
413
+ body = Capybara.string(filter(:author))
414
+ expect(body).to have_selector("option", text: "Any")
415
+ end
416
+ it "should be able to be disabled" do
417
+ body = Capybara.string(filter(:author, include_blank: false))
418
+ expect(body).to_not have_selector("option", text: "Any")
419
+ end
420
+ end
421
+
422
+ context "for a multi-select filter" do
423
+ it "should not be there by default" do
424
+ body = Capybara.string(filter(:author, multiple: true))
425
+ expect(body).to_not have_selector("option", text: "Any")
426
+ end
427
+ it "should be able to be enabled" do
428
+ body = Capybara.string(filter(:author, multiple: true, include_blank: true))
429
+ expect(body).to have_selector("option", text: "Any")
430
+ end
431
+ end
432
+ end
433
+
434
+ end