activeadministration 0.0.1

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 (522) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.travis.yml +19 -0
  4. data/.yardopts +9 -0
  5. data/CHANGELOG.md +1074 -0
  6. data/CONTRIBUTING.md +139 -0
  7. data/Gemfile +52 -0
  8. data/Guardfile +7 -0
  9. data/LICENSE +25 -0
  10. data/README.md +8 -0
  11. data/Rakefile +33 -0
  12. data/activeadministration.gemspec +34 -0
  13. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  18. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  19. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
  20. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
  21. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
  22. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
  23. data/app/assets/images/active_admin/loading.gif +0 -0
  24. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  25. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  26. data/app/assets/images/active_admin/orderable.png +0 -0
  27. data/app/assets/javascripts/active_admin/application.js.coffee +30 -0
  28. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  29. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  30. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  31. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  32. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +36 -0
  33. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +85 -0
  34. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +75 -0
  35. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +36 -0
  36. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  37. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
  38. data/app/assets/stylesheets/active_admin/_base.css.scss +42 -0
  39. data/app/assets/stylesheets/active_admin/_forms.css.scss +329 -0
  40. data/app/assets/stylesheets/active_admin/_header.css.scss +156 -0
  41. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  42. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  43. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
  44. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
  45. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  46. data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
  47. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  48. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
  49. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +127 -0
  50. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
  51. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
  52. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  53. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  54. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  55. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +31 -0
  56. data/app/assets/stylesheets/active_admin/components/_pagination.scss +34 -0
  57. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  58. data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
  59. data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
  60. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
  61. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +65 -0
  62. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +111 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
  71. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  72. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
  73. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +34 -0
  74. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  75. data/app/assets/stylesheets/active_admin/print.css.scss +284 -0
  76. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  77. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  78. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +46 -0
  79. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  80. data/app/views/active_admin/devise/confirmations/new.html.erb +14 -0
  81. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  82. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  83. data/app/views/active_admin/devise/passwords/edit.html.erb +19 -0
  84. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  85. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  86. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  87. data/app/views/active_admin/devise/shared/_links.erb +27 -0
  88. data/app/views/active_admin/devise/unlocks/new.html.erb +14 -0
  89. data/app/views/active_admin/page/index.html.arb +1 -0
  90. data/app/views/active_admin/resource/edit.html.arb +1 -0
  91. data/app/views/active_admin/resource/index.csv.erb +17 -0
  92. data/app/views/active_admin/resource/index.html.arb +1 -0
  93. data/app/views/active_admin/resource/new.html.arb +1 -0
  94. data/app/views/active_admin/resource/show.html.arb +1 -0
  95. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  96. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  97. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  98. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  99. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  100. data/app/views/kaminari/active_admin/_paginator.html.erb +23 -0
  101. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  102. data/app/views/layouts/active_admin.html.arb +1 -0
  103. data/app/views/layouts/active_admin_logged_out.html.erb +37 -0
  104. data/config/locales/bg.yml +102 -0
  105. data/config/locales/bs.yml +121 -0
  106. data/config/locales/ca.yml +102 -0
  107. data/config/locales/cs.yml +106 -0
  108. data/config/locales/da.yml +103 -0
  109. data/config/locales/de-CH.yml +118 -0
  110. data/config/locales/de.yml +143 -0
  111. data/config/locales/el.yml +111 -0
  112. data/config/locales/en-GB.yml +95 -0
  113. data/config/locales/en.yml +117 -0
  114. data/config/locales/es.yml +127 -0
  115. data/config/locales/es_MX.yml +110 -0
  116. data/config/locales/fi.yml +110 -0
  117. data/config/locales/fr.yml +109 -0
  118. data/config/locales/he.yml +92 -0
  119. data/config/locales/hr.yml +121 -0
  120. data/config/locales/hu.yml +96 -0
  121. data/config/locales/it.yml +114 -0
  122. data/config/locales/ja.yml +114 -0
  123. data/config/locales/ko.yml +85 -0
  124. data/config/locales/lt.yml +118 -0
  125. data/config/locales/lv.yml +90 -0
  126. data/config/locales/nl.yml +94 -0
  127. data/config/locales/no-NB.yml +111 -0
  128. data/config/locales/pl.yml +100 -0
  129. data/config/locales/pt-BR.yml +117 -0
  130. data/config/locales/pt-PT.yml +90 -0
  131. data/config/locales/ro.yml +94 -0
  132. data/config/locales/ru.yml +121 -0
  133. data/config/locales/sv-SE.yml +90 -0
  134. data/config/locales/tr.yml +94 -0
  135. data/config/locales/uk.yml +121 -0
  136. data/config/locales/vi.yml +91 -0
  137. data/config/locales/zh-CN.yml +112 -0
  138. data/config/locales/zh-TW.yml +94 -0
  139. data/cucumber.yml +3 -0
  140. data/docs/0-installation.md +84 -0
  141. data/docs/1-general-configuration.md +138 -0
  142. data/docs/10-custom-pages.md +84 -0
  143. data/docs/11-decorators.md +50 -0
  144. data/docs/12-arbre-components.md +150 -0
  145. data/docs/13-authorization-adapter.md +239 -0
  146. data/docs/2-resource-customization.md +359 -0
  147. data/docs/3-index-pages.md +245 -0
  148. data/docs/3-index-pages/create-an-index.md +31 -0
  149. data/docs/3-index-pages/index-as-block.md +21 -0
  150. data/docs/3-index-pages/index-as-blog.md +71 -0
  151. data/docs/3-index-pages/index-as-grid.md +29 -0
  152. data/docs/3-index-pages/index-as-table.md +163 -0
  153. data/docs/4-csv-format.md +39 -0
  154. data/docs/5-forms.md +118 -0
  155. data/docs/6-show-pages.md +77 -0
  156. data/docs/7-sidebars.md +63 -0
  157. data/docs/8-custom-actions.md +159 -0
  158. data/docs/9-batch-actions.md +233 -0
  159. data/features/action_item.feature +73 -0
  160. data/features/authorization.feature +64 -0
  161. data/features/authorization_cancan.feature +52 -0
  162. data/features/authorization_pundit.feature +37 -0
  163. data/features/belongs_to.feature +66 -0
  164. data/features/breadcrumb.feature +75 -0
  165. data/features/comments/commenting.feature +159 -0
  166. data/features/comments/viewing_index.feature +19 -0
  167. data/features/dashboard.feature +16 -0
  168. data/features/decorators.feature +41 -0
  169. data/features/development_reloading.feature +31 -0
  170. data/features/edit_page.feature +114 -0
  171. data/features/favicon.feature +20 -0
  172. data/features/first_boot.feature +16 -0
  173. data/features/global_navigation.feature +29 -0
  174. data/features/i18n.feature +43 -0
  175. data/features/index/batch_actions.feature +123 -0
  176. data/features/index/filters.feature +138 -0
  177. data/features/index/format_as_csv.feature +117 -0
  178. data/features/index/formats.feature +66 -0
  179. data/features/index/index_as_block.feature +15 -0
  180. data/features/index/index_as_blog.feature +69 -0
  181. data/features/index/index_as_grid.feature +45 -0
  182. data/features/index/index_as_table.feature +208 -0
  183. data/features/index/index_blank_slate.feature +83 -0
  184. data/features/index/index_parameters.feature +75 -0
  185. data/features/index/index_scope_to.feature +56 -0
  186. data/features/index/index_scopes.feature +251 -0
  187. data/features/index/page_title.feature +41 -0
  188. data/features/index/pagination.feature +59 -0
  189. data/features/index/switch_index_view.feature +73 -0
  190. data/features/menu.feature +53 -0
  191. data/features/new_page.feature +106 -0
  192. data/features/registering_assets.feature +35 -0
  193. data/features/registering_pages.feature +148 -0
  194. data/features/registering_resources.feature +33 -0
  195. data/features/root_to.feature +17 -0
  196. data/features/show/default_content.feature +43 -0
  197. data/features/show/page_title.feature +58 -0
  198. data/features/sidebar_sections.feature +210 -0
  199. data/features/site_title.feature +47 -0
  200. data/features/specifying_actions.feature +93 -0
  201. data/features/step_definitions/action_item_steps.rb +7 -0
  202. data/features/step_definitions/action_link_steps.rb +7 -0
  203. data/features/step_definitions/additional_web_steps.rb +82 -0
  204. data/features/step_definitions/asset_steps.rb +15 -0
  205. data/features/step_definitions/attribute_steps.rb +18 -0
  206. data/features/step_definitions/batch_action_steps.rb +55 -0
  207. data/features/step_definitions/breadcrumb_steps.rb +3 -0
  208. data/features/step_definitions/comment_steps.rb +12 -0
  209. data/features/step_definitions/configuration_steps.rb +100 -0
  210. data/features/step_definitions/dashboard_steps.rb +15 -0
  211. data/features/step_definitions/factory_steps.rb +34 -0
  212. data/features/step_definitions/filter_steps.rb +17 -0
  213. data/features/step_definitions/flash_steps.rb +11 -0
  214. data/features/step_definitions/format_steps.rb +45 -0
  215. data/features/step_definitions/i18n_steps.rb +3 -0
  216. data/features/step_definitions/index_scope_steps.rb +21 -0
  217. data/features/step_definitions/index_views_steps.rb +3 -0
  218. data/features/step_definitions/layout_steps.rb +3 -0
  219. data/features/step_definitions/member_link_steps.rb +7 -0
  220. data/features/step_definitions/menu_steps.rb +11 -0
  221. data/features/step_definitions/pagination_steps.rb +8 -0
  222. data/features/step_definitions/sidebar_steps.rb +12 -0
  223. data/features/step_definitions/site_title_steps.rb +15 -0
  224. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  225. data/features/step_definitions/tab_steps.rb +3 -0
  226. data/features/step_definitions/table_steps.rb +119 -0
  227. data/features/step_definitions/user_steps.rb +41 -0
  228. data/features/step_definitions/web_steps.rb +86 -0
  229. data/features/sti_resource.feature +65 -0
  230. data/features/strong_parameters.feature +72 -0
  231. data/features/support/env.rb +119 -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 +34 -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 +135 -0
  239. data/lib/active_admin/abstract_view_factory.rb +86 -0
  240. data/lib/active_admin/application.rb +250 -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 +78 -0
  244. data/lib/active_admin/base_controller/authorization.rb +151 -0
  245. data/lib/active_admin/base_controller/menu.rb +34 -0
  246. data/lib/active_admin/batch_actions.rb +17 -0
  247. data/lib/active_admin/batch_actions/controller.rb +29 -0
  248. data/lib/active_admin/batch_actions/resource_extension.rb +154 -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_popover.rb +28 -0
  251. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +57 -0
  252. data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
  253. data/lib/active_admin/callbacks.rb +84 -0
  254. data/lib/active_admin/cancan_adapter.rb +40 -0
  255. data/lib/active_admin/component.rb +5 -0
  256. data/lib/active_admin/controller_action.rb +12 -0
  257. data/lib/active_admin/csv_builder.rb +70 -0
  258. data/lib/active_admin/dependencies.rb +38 -0
  259. data/lib/active_admin/deprecation.rb +35 -0
  260. data/lib/active_admin/devise.rb +80 -0
  261. data/lib/active_admin/dsl.rb +165 -0
  262. data/lib/active_admin/engine.rb +7 -0
  263. data/lib/active_admin/error.rb +22 -0
  264. data/lib/active_admin/event.rb +33 -0
  265. data/lib/active_admin/filters.rb +9 -0
  266. data/lib/active_admin/filters/dsl.rb +21 -0
  267. data/lib/active_admin/filters/forms.rb +87 -0
  268. data/lib/active_admin/filters/formtastic_addons.rb +73 -0
  269. data/lib/active_admin/filters/resource_extension.rb +135 -0
  270. data/lib/active_admin/form_builder.rb +185 -0
  271. data/lib/active_admin/helpers/collection.rb +23 -0
  272. data/lib/active_admin/helpers/i18n.rb +7 -0
  273. data/lib/active_admin/helpers/optional_display.rb +38 -0
  274. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  275. data/lib/active_admin/helpers/settings.rb +106 -0
  276. data/lib/active_admin/iconic.rb +54 -0
  277. data/lib/active_admin/iconic/icons.rb +142 -0
  278. data/lib/active_admin/inputs.rb +15 -0
  279. data/lib/active_admin/inputs/datepicker_input.rb +20 -0
  280. data/lib/active_admin/inputs/filter_base.rb +40 -0
  281. data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
  282. data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
  283. data/lib/active_admin/inputs/filter_check_boxes_input.rb +48 -0
  284. data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
  285. data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
  286. data/lib/active_admin/inputs/filter_select_input.rb +53 -0
  287. data/lib/active_admin/inputs/filter_string_input.rb +24 -0
  288. data/lib/active_admin/menu.rb +107 -0
  289. data/lib/active_admin/menu_collection.rb +96 -0
  290. data/lib/active_admin/menu_item.rb +97 -0
  291. data/lib/active_admin/namespace.rb +231 -0
  292. data/lib/active_admin/order_clause.rb +26 -0
  293. data/lib/active_admin/orm/active_record.rb +3 -0
  294. data/lib/active_admin/orm/active_record/comments.rb +84 -0
  295. data/lib/active_admin/orm/active_record/comments/comment.rb +49 -0
  296. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  297. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  298. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  299. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  300. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +75 -0
  301. data/lib/active_admin/orm/mongoid.rb +1 -0
  302. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  303. data/lib/active_admin/page.rb +88 -0
  304. data/lib/active_admin/page_controller.rb +29 -0
  305. data/lib/active_admin/page_dsl.rb +28 -0
  306. data/lib/active_admin/page_presenter.rb +32 -0
  307. data/lib/active_admin/pundit_adapter.rb +42 -0
  308. data/lib/active_admin/resource.rb +156 -0
  309. data/lib/active_admin/resource/action_items.rb +91 -0
  310. data/lib/active_admin/resource/belongs_to.rb +36 -0
  311. data/lib/active_admin/resource/controllers.rb +18 -0
  312. data/lib/active_admin/resource/menu.rb +64 -0
  313. data/lib/active_admin/resource/naming.rb +84 -0
  314. data/lib/active_admin/resource/page_presenters.rb +82 -0
  315. data/lib/active_admin/resource/pagination.rb +19 -0
  316. data/lib/active_admin/resource/routes.rb +99 -0
  317. data/lib/active_admin/resource/scope_to.rb +74 -0
  318. data/lib/active_admin/resource/scopes.rb +50 -0
  319. data/lib/active_admin/resource/sidebars.rb +28 -0
  320. data/lib/active_admin/resource_collection.rb +70 -0
  321. data/lib/active_admin/resource_controller.rb +50 -0
  322. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  323. data/lib/active_admin/resource_controller/data_access.rb +284 -0
  324. data/lib/active_admin/resource_controller/decorators.rb +100 -0
  325. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  326. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  327. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  328. data/lib/active_admin/resource_dsl.rb +171 -0
  329. data/lib/active_admin/router.rb +106 -0
  330. data/lib/active_admin/scope.rb +57 -0
  331. data/lib/active_admin/sidebar_section.rb +45 -0
  332. data/lib/active_admin/version.rb +3 -0
  333. data/lib/active_admin/view_factory.rb +27 -0
  334. data/lib/active_admin/view_helpers.rb +21 -0
  335. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  336. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  337. data/lib/active_admin/view_helpers/auto_link_helper.rb +37 -0
  338. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +27 -0
  339. data/lib/active_admin/view_helpers/display_helper.rb +64 -0
  340. data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
  341. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  342. data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
  343. data/lib/active_admin/view_helpers/form_helper.rb +21 -0
  344. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  345. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -0
  346. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  347. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  348. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  349. data/lib/active_admin/views.rb +8 -0
  350. data/lib/active_admin/views/action_items.rb +17 -0
  351. data/lib/active_admin/views/components/action_list_popover.rb +29 -0
  352. data/lib/active_admin/views/components/attributes_table.rb +105 -0
  353. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  354. data/lib/active_admin/views/components/columns.rb +157 -0
  355. data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
  356. data/lib/active_admin/views/components/index_list.rb +68 -0
  357. data/lib/active_admin/views/components/paginated_collection.rb +126 -0
  358. data/lib/active_admin/views/components/panel.rb +34 -0
  359. data/lib/active_admin/views/components/popover.rb +27 -0
  360. data/lib/active_admin/views/components/scopes.rb +66 -0
  361. data/lib/active_admin/views/components/sidebar_section.rb +29 -0
  362. data/lib/active_admin/views/components/site_title.rb +55 -0
  363. data/lib/active_admin/views/components/status_tag.rb +67 -0
  364. data/lib/active_admin/views/components/table_for.rb +212 -0
  365. data/lib/active_admin/views/footer.rb +20 -0
  366. data/lib/active_admin/views/header.rb +32 -0
  367. data/lib/active_admin/views/index_as_block.rb +36 -0
  368. data/lib/active_admin/views/index_as_blog.rb +156 -0
  369. data/lib/active_admin/views/index_as_grid.rb +80 -0
  370. data/lib/active_admin/views/index_as_table.rb +277 -0
  371. data/lib/active_admin/views/pages/base.rb +139 -0
  372. data/lib/active_admin/views/pages/form.rb +51 -0
  373. data/lib/active_admin/views/pages/index.rb +163 -0
  374. data/lib/active_admin/views/pages/layout.rb +26 -0
  375. data/lib/active_admin/views/pages/page.rb +30 -0
  376. data/lib/active_admin/views/pages/show.rb +59 -0
  377. data/lib/active_admin/views/tabbed_navigation.rb +62 -0
  378. data/lib/active_admin/views/title_bar.rb +55 -0
  379. data/lib/activeadmin.rb +1 -0
  380. data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
  381. data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
  382. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  383. data/lib/generators/active_admin/devise/devise_generator.rb +66 -0
  384. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  385. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +243 -0
  386. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
  387. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  388. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
  389. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  390. data/lib/generators/active_admin/resource/templates/admin.rb +17 -0
  391. data/lib/ransack_ext.rb +12 -0
  392. data/script/local +44 -0
  393. data/script/use_rails +53 -0
  394. data/spec/integration/default_namespace_spec.rb +61 -0
  395. data/spec/integration/javascript_spec.rb +20 -0
  396. data/spec/integration/memory_spec.rb +29 -0
  397. data/spec/integration/stylesheets_spec.rb +18 -0
  398. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  399. data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
  400. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  401. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
  402. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
  403. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
  404. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  405. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  406. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  407. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
  408. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
  409. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -0
  410. data/spec/javascripts/support/jasmine.yml +74 -0
  411. data/spec/javascripts/support/jasmine_config.rb +23 -0
  412. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  413. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
  414. data/spec/javascripts/support/jquery.min.js +4 -0
  415. data/spec/spec_helper.rb +182 -0
  416. data/spec/spec_helper_without_rails.rb +16 -0
  417. data/spec/support/deferred_garbage_collection.rb +19 -0
  418. data/spec/support/detect_rails_version.rb +42 -0
  419. data/spec/support/integration_example_group.rb +31 -0
  420. data/spec/support/jslint.yml +80 -0
  421. data/spec/support/rails_template.rb +117 -0
  422. data/spec/support/rails_template_with_data.rb +59 -0
  423. data/spec/support/templates/admin/stores.rb +11 -0
  424. data/spec/support/templates/cucumber.rb +24 -0
  425. data/spec/support/templates/cucumber_with_reloading.rb +5 -0
  426. data/spec/support/templates/en.yml +8 -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 +126 -0
  438. data/spec/unit/active_admin_spec.rb +11 -0
  439. data/spec/unit/application_spec.rb +140 -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/auto_link_spec.rb +34 -0
  444. data/spec/unit/batch_actions/resource_spec.rb +92 -0
  445. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  446. data/spec/unit/belongs_to_spec.rb +42 -0
  447. data/spec/unit/cancan_adapter_spec.rb +43 -0
  448. data/spec/unit/comments_spec.rb +144 -0
  449. data/spec/unit/component_spec.rb +18 -0
  450. data/spec/unit/config_shared_examples.rb +59 -0
  451. data/spec/unit/controller_filters_spec.rb +37 -0
  452. data/spec/unit/csv_builder_spec.rb +134 -0
  453. data/spec/unit/devise_spec.rb +116 -0
  454. data/spec/unit/dsl_spec.rb +61 -0
  455. data/spec/unit/event_spec.rb +47 -0
  456. data/spec/unit/filters/filter_form_builder_spec.rb +418 -0
  457. data/spec/unit/filters/resource_spec.rb +121 -0
  458. data/spec/unit/form_builder_spec.rb +576 -0
  459. data/spec/unit/generators/install_spec.rb +23 -0
  460. data/spec/unit/helpers/collection_spec.rb +65 -0
  461. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  462. data/spec/unit/helpers/settings_spec.rb +30 -0
  463. data/spec/unit/menu_collection_spec.rb +62 -0
  464. data/spec/unit/menu_item_spec.rb +143 -0
  465. data/spec/unit/menu_spec.rb +71 -0
  466. data/spec/unit/namespace/authorization_spec.rb +27 -0
  467. data/spec/unit/namespace/register_page_spec.rb +74 -0
  468. data/spec/unit/namespace/register_resource_spec.rb +163 -0
  469. data/spec/unit/namespace_spec.rb +103 -0
  470. data/spec/unit/order_clause_spec.rb +57 -0
  471. data/spec/unit/page_controller_spec.rb +5 -0
  472. data/spec/unit/page_spec.rb +72 -0
  473. data/spec/unit/pretty_format_spec.rb +63 -0
  474. data/spec/unit/pundit_adapter_spec.rb +36 -0
  475. data/spec/unit/resource/action_items_spec.rb +62 -0
  476. data/spec/unit/resource/menu_spec.rb +18 -0
  477. data/spec/unit/resource/naming_spec.rb +122 -0
  478. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  479. data/spec/unit/resource/pagination_spec.rb +38 -0
  480. data/spec/unit/resource/routes_spec.rb +73 -0
  481. data/spec/unit/resource/scopes_spec.rb +50 -0
  482. data/spec/unit/resource/sidebars_spec.rb +43 -0
  483. data/spec/unit/resource_collection_spec.rb +158 -0
  484. data/spec/unit/resource_controller/data_access_spec.rb +73 -0
  485. data/spec/unit/resource_controller/decorators_spec.rb +86 -0
  486. data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
  487. data/spec/unit/resource_controller_spec.rb +265 -0
  488. data/spec/unit/resource_registration_spec.rb +56 -0
  489. data/spec/unit/resource_spec.rb +263 -0
  490. data/spec/unit/routing_spec.rb +172 -0
  491. data/spec/unit/scope_spec.rb +114 -0
  492. data/spec/unit/settings_spec.rb +88 -0
  493. data/spec/unit/view_factory_spec.rb +21 -0
  494. data/spec/unit/view_helpers/breadcrumbs_spec.rb +180 -0
  495. data/spec/unit/view_helpers/display_name_spec.rb +68 -0
  496. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  497. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  498. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  499. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +97 -0
  500. data/spec/unit/views/components/action_list_popover_spec.rb +29 -0
  501. data/spec/unit/views/components/attributes_table_spec.rb +259 -0
  502. data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
  503. data/spec/unit/views/components/blank_slate_spec.rb +17 -0
  504. data/spec/unit/views/components/columns_spec.rb +172 -0
  505. data/spec/unit/views/components/index_list_spec.rb +32 -0
  506. data/spec/unit/views/components/paginated_collection_spec.rb +229 -0
  507. data/spec/unit/views/components/panel_spec.rb +51 -0
  508. data/spec/unit/views/components/popover_spec.rb +33 -0
  509. data/spec/unit/views/components/sidebar_section_spec.rb +47 -0
  510. data/spec/unit/views/components/site_title_spec.rb +78 -0
  511. data/spec/unit/views/components/status_tag_spec.rb +102 -0
  512. data/spec/unit/views/components/table_for_spec.rb +242 -0
  513. data/spec/unit/views/pages/form_spec.rb +35 -0
  514. data/spec/unit/views/pages/layout_spec.rb +63 -0
  515. data/spec/unit/views/pages/show_spec.rb +20 -0
  516. data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
  517. data/tasks/docs.rake +37 -0
  518. data/tasks/js.rake +32 -0
  519. data/tasks/parallel_tests.rake +60 -0
  520. data/tasks/test.rake +79 -0
  521. data/tasks/yard.rake +7 -0
  522. metadata +741 -0
@@ -0,0 +1,418 @@
1
+ require 'spec_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
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) { filter :title }
44
+
45
+ it "should generate a form which submits via get" do
46
+ expect(body).to have_tag("form", attributes: { method: 'get', class: 'filter_form' })
47
+ end
48
+
49
+ it "should generate a filter button" do
50
+ expect(body).to have_tag("input", attributes: { type: "submit",
51
+ value: "Filter" })
52
+ end
53
+
54
+ it "should only generate the form once" do
55
+ expect(body.to_s.scan(/q\[title_contains\]/).size).to eq 1
56
+ end
57
+
58
+ it "should generate a clear filters link" do
59
+ expect(body).to have_tag("a", "Clear Filters", attributes: { class: "clear_filters_btn" })
60
+ end
61
+
62
+ describe "label as proc" do
63
+ let(:body) { filter :title, label: proc { 'Title from proc' } }
64
+
65
+ it "should render proper label" do
66
+ expect(body).to have_tag('label', 'Title from proc')
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "string attribute" do
72
+ let(:body) { filter :title }
73
+
74
+ it "should generate a select option for starts with" do
75
+ expect(body).to have_tag("option", "Starts with", attributes: { value: 'title_starts_with' })
76
+ end
77
+
78
+ it "should generate a select option for ends with" do
79
+ expect(body).to have_tag("option", "Ends with", attributes: { value: 'title_ends_with' })
80
+ end
81
+
82
+ it "should generate a select option for contains" do
83
+ expect(body).to have_tag("option", "Contains", attributes: { value: 'title_contains' })
84
+ end
85
+
86
+ it "should generate a text field for input" do
87
+ expect(body).to have_tag("input", attributes: { name: 'q[title_contains]' })
88
+ end
89
+
90
+ it "should have a proper label" do
91
+ expect(body).to have_tag('label', 'Title')
92
+ end
93
+
94
+ it "should translate the label for text field" do
95
+ with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
96
+ expect(body).to have_tag('label', 'Name')
97
+ end
98
+ end
99
+
100
+ it "should select the option which is currently being filtered"
101
+
102
+
103
+ context "with predicate" do
104
+ %w[equals contains starts_with ends_with].each do |predicate|
105
+ describe '"'+predicate+'"' do
106
+ let(:body) { filter :"title_#{predicate}" }
107
+
108
+ it "shouldn't include a select field" do
109
+ expect(body).not_to have_tag "select"
110
+ end
111
+
112
+ it "should build correctly" do
113
+ expect(body).to have_tag("input", attributes: { name: "q[title_#{predicate}]" })
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ describe "text attribute" do
121
+ let(:body) { filter :body }
122
+
123
+ it "should generate a search field for a text attribute" do
124
+ expect(body).to have_tag("input", attributes: { name: "q[body_contains]"})
125
+ end
126
+
127
+ it "should have a proper label" do
128
+ expect(body).to have_tag('label', 'Body')
129
+ end
130
+ end
131
+
132
+ describe "string attribute, as a select" do
133
+ let(:body) { filter :title, as: :select }
134
+ let(:builder) { ActiveAdmin::Inputs::FilterSelectInput }
135
+
136
+ context "when loading collection from DB" do
137
+ it "should use pluck for efficiency" do
138
+ builder.any_instance.should_receive(:pluck_column) { [] }
139
+ body
140
+ end
141
+
142
+ it "should remove original ordering to prevent PostgreSQL error" do
143
+ expect(scope.object.klass).to receive(:reorder).with('title asc') {
144
+ m = double uniq: double(pluck: ['A Title'])
145
+ expect(m.uniq).to receive(:pluck).with :title
146
+ m
147
+ }
148
+ body
149
+ end
150
+ end
151
+ end
152
+
153
+ describe "datetime attribute" do
154
+ let(:body) { filter :created_at }
155
+
156
+ it "should generate a date greater than" do
157
+ expect(body).to have_tag("input", attributes: { name: "q[created_at_gteq]", class: "datepicker"})
158
+ end
159
+ it "should generate a seperator" do
160
+ expect(body).to have_tag("span", attributes: { class: "seperator"})
161
+ end
162
+ it "should generate a date less than" do
163
+ expect(body).to have_tag("input", attributes: { name: "q[created_at_lteq]", class: "datepicker"})
164
+ end
165
+ end
166
+
167
+ describe "integer attribute" do
168
+ let(:body) { filter :id }
169
+
170
+ it "should generate a select option for equal to" do
171
+ expect(body).to have_tag("option", "Equals", attributes: { value: 'id_equals' })
172
+ end
173
+ it "should generate a select option for greater than" do
174
+ expect(body).to have_tag("option", "Greater than")
175
+ end
176
+ it "should generate a select option for less than" do
177
+ expect(body).to have_tag("option", "Less than")
178
+ end
179
+ it "should generate a text field for input" do
180
+ expect(body).to have_tag("input", attributes: { name: 'q[id_equals]' })
181
+ end
182
+ it "should select the option which is currently being filtered"
183
+ end
184
+
185
+ describe "boolean attribute" do
186
+ context "boolean datatypes" do
187
+ let(:body) { filter :starred }
188
+
189
+ it "should create a check box for equals to" do
190
+ expect(body).to have_tag("input", attributes: {
191
+ name: "q[starred_eq]",
192
+ type: "checkbox" })
193
+ end
194
+
195
+ it "should translate the label for boolean field" do
196
+ with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
197
+ expect(body).to have_tag('label', 'Faved')
198
+ end
199
+ end
200
+ end
201
+
202
+ context "non-boolean data types" do
203
+ let(:body) { filter :title_present, as: :boolean }
204
+
205
+ it "should create a check box for equals to" do
206
+ expect(body).to have_tag("input", attributes: {
207
+ name: "q[title_present]",
208
+ type: "checkbox" })
209
+ end
210
+ end
211
+ end
212
+
213
+ describe "belongs_to" do
214
+ before do
215
+ @john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
216
+ @jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
217
+ end
218
+
219
+ context "when given as the _id attribute name" do
220
+ let(:body) { filter :author_id }
221
+
222
+ it "should generate a numeric filter" do
223
+ expect(body).to have_tag 'label', 'Author' # really this should be Author ID :/
224
+ expect(body).to have_tag 'option', attributes: { value: 'author_id_less_than' }
225
+ expect(body).to have_tag 'input', attributes: { id: 'q_author_id', name: 'q[author_id_equals]'}
226
+ end
227
+ end
228
+
229
+ context "when given as the name of the relationship" do
230
+ let(:body) { filter :author }
231
+
232
+ it "should generate a select" do
233
+ expect(body).to have_tag "select", attributes: { name: "q[author_id_eq]" }
234
+ end
235
+ it "should set the default text to 'Any'" do
236
+ expect(body).to have_tag "option", "Any", attributes: { value: "" }
237
+ end
238
+ it "should create an option for each related object" do
239
+ expect(body).to have_tag "option", "John Doe", attributes: { value: @john.id }
240
+ expect(body).to have_tag "option", "Jane Doe", attributes: { value: @jane.id }
241
+ end
242
+
243
+ context "with a proc" do
244
+ let :body do
245
+ filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] }
246
+ end
247
+
248
+ it "should use call the proc as the collection" do
249
+ expect(body).to have_tag("option", "Title One")
250
+ expect(body).to have_tag("option", "Title Two")
251
+ end
252
+
253
+ it "should render the collection in the context of the view" do
254
+ body = filter(:title, as: :select, collection: proc{[a_helper_method]})
255
+ expect(body).to have_tag("option", "A Helper Method")
256
+ end
257
+ end
258
+ end
259
+
260
+ context "as check boxes" do
261
+ let(:body) { filter :author, as: :check_boxes }
262
+
263
+ it "should create a check box for each related object" do
264
+ expect(body).to have_tag("input", attributes: {
265
+ name: "q[author_id_in][]",
266
+ type: "checkbox",
267
+ value: @john.id })
268
+ expect(body).to have_tag("input", attributes: {
269
+ name: "q[author_id_in][]",
270
+ type: "checkbox",
271
+ value: @jane.id })
272
+ end
273
+ end
274
+
275
+ context "when polymorphic relationship" do
276
+ let(:scope) { ActiveAdmin::Comment.search }
277
+ it "should raise an error if a collection isn't provided" do
278
+ expect { filter :resource }.to raise_error \
279
+ Formtastic::PolymorphicInputWithoutCollectionError
280
+ end
281
+ end
282
+
283
+ context "when using a custom foreign key" do
284
+ let(:scope) { Post.search }
285
+ let(:body) { filter :category }
286
+ it "should should ignore that foreign key and let Ransack handle it" do
287
+ expect(Post.reflections[:category].foreign_key).to eq :custom_category_id
288
+ expect(body).to have_tag "select", attributes: { name: "q[category_id_eq]" }
289
+ end
290
+ end
291
+ end # belongs to
292
+
293
+ describe "has_and_belongs_to_many" do
294
+ pending "add HABTM models so this can be tested"
295
+ end
296
+
297
+ describe "has_many :through" do
298
+ # Setup an ActionView::Base object which can be used for
299
+ # generating the form for.
300
+ let(:helpers) do
301
+ view = action_view
302
+ def view.collection_path
303
+ "/categories"
304
+ end
305
+
306
+ def view.protect_against_forgery?
307
+ false
308
+ end
309
+
310
+ def view.a_helper_method
311
+ "A Helper Method"
312
+ end
313
+
314
+ view
315
+ end
316
+ let(:scope) { Category.search }
317
+
318
+ let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
319
+ let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
320
+
321
+ context "when given as the name of the relationship" do
322
+ let(:body) { filter :authors }
323
+
324
+ it "should generate a select" do
325
+ expect(body).to have_tag 'select', attributes: { name: "q[posts_author_id_eq]" }
326
+ end
327
+
328
+ it "should set the default text to 'Any'" do
329
+ expect(body).to have_tag "option", "Any", attributes: { value: "" }
330
+ end
331
+
332
+ it "should create an option for each related object" do
333
+ expect(body).to have_tag "option", "John Doe", attributes: { value: john.id }
334
+ expect(body).to have_tag "option", "Jane Doe", attributes: { value: jane.id }
335
+ end
336
+ end
337
+
338
+ context "as check boxes" do
339
+ let(:body) { filter :authors, as: :check_boxes }
340
+
341
+ it "should create a check box for each related object" do
342
+ expect(body).to have_tag("input", attributes: {
343
+ name: "q[posts_author_id_in][]",
344
+ type: "checkbox",
345
+ value: john.id })
346
+ expect(body).to have_tag("input", attributes: {
347
+ name: "q[posts_author_id_in][]",
348
+ type: "checkbox",
349
+ value: jane.id })
350
+ end
351
+ end
352
+ end
353
+
354
+ describe "conditional display" do
355
+ [:if, :unless].each do |verb|
356
+ should = verb == :if ? "should" : "shouldn't"
357
+ if_true = verb == :if ? :to : :to_not
358
+ if_false = verb == :if ? :to_not : :to
359
+ context "with #{verb.inspect} proc" do
360
+ it "#{should} be displayed if true" do
361
+ body = filter :body, verb => proc{ true }
362
+ expect(body).send if_true, have_tag("input", attributes: {name: "q[body_contains]"})
363
+ end
364
+ it "#{should} be displayed if false" do
365
+ body = filter :body, verb => proc{ false }
366
+ expect(body).send if_false, have_tag("input", attributes: {name: "q[body_contains]"})
367
+ end
368
+ it "should still be hidden on the second render" do
369
+ filters = {body: { verb => proc{ verb == :unless }}}
370
+ 2.times do
371
+ body = render_filter scope, filters
372
+ expect(body).not_to have_tag "input", attributes: {name: "q[body_contains]"}
373
+ end
374
+ end
375
+ it "should successfully keep rendering other filters after one is hidden" do
376
+ filters = {body: { verb => proc{ verb == :unless }}, author: {}}
377
+ body = render_filter scope, filters
378
+ expect(body).not_to have_tag "input", attributes: {name: "q[body_contains]"}
379
+ expect(body).to have_tag "select", attributes: {name: "q[author_id_eq]"}
380
+ end
381
+ end
382
+ end
383
+ end
384
+
385
+ describe "custom search methods" do
386
+
387
+ it "should work as select" do
388
+ body = filter :custom_searcher, as: :select, collection: ['foo']
389
+ expect(body).to have_tag "select", attributes: { name: "q[custom_searcher]" }
390
+ end
391
+
392
+ it "should work as string" do
393
+ body = filter :custom_searcher, as: :string
394
+ expect(body).to have_tag "input", attributes: { name: "q[custom_searcher]" }
395
+ end
396
+ end
397
+
398
+ describe "blank option" do
399
+ context "for a select filter" do
400
+ it "should be there by default" do
401
+ expect(filter(:author)).to have_tag "option", "Any"
402
+ end
403
+ it "should be able to be disabled" do
404
+ expect(filter(:author, include_blank: false)).to_not have_tag "option", "Any"
405
+ end
406
+ end
407
+
408
+ context "for a multi-select filter" do
409
+ it "should not be there by default" do
410
+ expect(filter(:author, multiple: true)).to_not have_tag "option", "Any"
411
+ end
412
+ it "should be able to be enabled" do
413
+ expect(filter(:author, multiple: true, include_blank: true)).to have_tag "option", "Any"
414
+ end
415
+ end
416
+ end
417
+
418
+ end
@@ -0,0 +1,121 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Filters::ResourceExtension do
4
+
5
+ let(:resource) do
6
+ namespace = ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin)
7
+ namespace.register(Post)
8
+ end
9
+
10
+ it "should return a Hash" do
11
+ expect(resource.filters).to be_a Hash
12
+ end
13
+
14
+ it "should return the defaults if no filters are set" do
15
+ expect(resource.filters.keys).to match_array([
16
+ :author, :body, :category, :created_at, :published_at, :starred, :taggings, :title, :updated_at
17
+ ])
18
+ end
19
+
20
+ it "should not have defaults when filters are disabled on the resource" do
21
+ resource.filters = false
22
+ expect(resource.filters).to be_empty
23
+ end
24
+
25
+ it "should not have defaults when the filters are disabled on the namespace" do
26
+ resource.namespace.filters = false
27
+ expect(resource.filters).to be_empty
28
+ end
29
+
30
+ it "should not have defaults when the filters are disabled on the application" do
31
+ resource.namespace.application.filters = false
32
+ expect(resource.filters).to be_empty
33
+ end
34
+
35
+ describe "removing a filter" do
36
+ it "should work" do
37
+ expect(resource.filters.keys).to include :author
38
+ resource.remove_filter :author
39
+ expect(resource.filters.keys).to_not include :author
40
+ end
41
+
42
+ it "should work as a string" do
43
+ expect(resource.filters.keys).to include :author
44
+ resource.remove_filter 'author'
45
+ expect(resource.filters.keys).to_not include :author
46
+ end
47
+
48
+ it "should be lazy" do
49
+ expect(resource).to_not receive :default_filters # this hits the DB
50
+ resource.remove_filter :author
51
+ end
52
+
53
+ it "should not prevent the default filters from being added" do
54
+ resource.remove_filter :author
55
+ expect(resource.filters).to_not be_empty
56
+ end
57
+
58
+ it "should raise an exception when filters are disabled" do
59
+ resource.filters = false
60
+ expect{ resource.remove_filter :author }.to raise_error ActiveAdmin::Filters::Disabled
61
+ end
62
+ end
63
+
64
+ describe "removing a multiple filters inline" do
65
+ it "should work" do
66
+ expect(resource.filters.keys).to include :author, :body
67
+ resource.remove_filter :author, :body
68
+ expect(resource.filters.keys).to_not include :author, :body
69
+ end
70
+ end
71
+
72
+ describe "adding a filter" do
73
+ it "should work" do
74
+ resource.add_filter :title
75
+ expect(resource.filters).to eq title: {}
76
+ end
77
+
78
+ it "should work as a string" do
79
+ resource.add_filter 'title'
80
+ expect(resource.filters).to eq title: {}
81
+ end
82
+
83
+ it "should work with specified options" do
84
+ resource.add_filter :title, as: :string
85
+ expect(resource.filters).to eq title: {as: :string}
86
+ end
87
+
88
+ it "should override an existing filter" do
89
+ resource.add_filter :title, one: :two
90
+ resource.add_filter :title, three: :four
91
+
92
+ expect(resource.filters).to eq title: {three: :four}
93
+ end
94
+
95
+ it "should preserve default filters" do
96
+ resource.preserve_default_filters!
97
+ resource.add_filter :count, as: :string
98
+
99
+ expect(resource.filters.keys).to match_array([
100
+ :author, :body, :category, :count, :created_at, :published_at, :starred, :taggings, :title, :updated_at
101
+ ])
102
+ end
103
+
104
+ it "should raise an exception when filters are disabled" do
105
+ resource.filters = false
106
+ expect{ resource.add_filter :title }.to raise_error ActiveAdmin::Filters::Disabled
107
+ end
108
+ end
109
+
110
+ it "should reset filters" do
111
+ resource.add_filter :title
112
+ expect(resource.filters.size).to eq 1
113
+ resource.reset_filters!
114
+ expect(resource.filters.size).to be > 1
115
+ end
116
+
117
+ it "should add a sidebar section for the filters" do
118
+ expect(resource.sidebar_sections.first.name).to eq :filters
119
+ end
120
+
121
+ end