nsm-activeadmin 0.2.2

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 (321) hide show
  1. data/.document +5 -0
  2. data/.gitignore +34 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +8 -0
  5. data/CHANGELOG.rdoc +76 -0
  6. data/Gemfile +39 -0
  7. data/LICENSE +25 -0
  8. data/README.rdoc +487 -0
  9. data/Rakefile +27 -0
  10. data/activeadmin.gemspec +28 -0
  11. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  12. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  13. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  17. data/app/assets/images/active_admin/loading.gif +0 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js +12 -0
  22. data/app/assets/javascripts/active_admin/vendor.js +382 -0
  23. data/app/assets/stylesheets/active_admin/_base.css.scss +400 -0
  24. data/app/assets/stylesheets/active_admin/_forms.css.scss +256 -0
  25. data/app/assets/stylesheets/active_admin/_header.css.scss +110 -0
  26. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  27. data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
  28. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +40 -0
  29. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
  30. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +38 -0
  31. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +8 -0
  32. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
  33. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
  34. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  35. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  36. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  37. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
  38. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
  39. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
  40. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  41. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  42. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  43. data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
  44. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  45. data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
  46. data/app/views/active_admin/devise/shared/_links.erb +20 -0
  47. data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
  48. data/app/views/active_admin/resource/edit.html.arb +1 -0
  49. data/app/views/active_admin/resource/index.csv.erb +20 -0
  50. data/app/views/active_admin/resource/index.html.arb +1 -0
  51. data/app/views/active_admin/resource/new.html.arb +1 -0
  52. data/app/views/active_admin/resource/show.html.arb +1 -0
  53. data/app/views/layouts/active_admin.html.arb +1 -0
  54. data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
  55. data/cucumber.yml +2 -0
  56. data/docs/1-general-configuration.md +52 -0
  57. data/docs/2-resource-customization.md +35 -0
  58. data/docs/3-index-pages.md +55 -0
  59. data/docs/3-index-pages/index-as-block.md +16 -0
  60. data/docs/3-index-pages/index-as-blog.md +61 -0
  61. data/docs/3-index-pages/index-as-grid.md +21 -0
  62. data/docs/3-index-pages/index-as-table.md +74 -0
  63. data/docs/4-csv-format.md +14 -0
  64. data/docs/5-forms.md +39 -0
  65. data/docs/6-show-screens.md +22 -0
  66. data/docs/7-sidebars.md +35 -0
  67. data/docs/8-custom-actions.md +123 -0
  68. data/features/comments/commenting.feature +112 -0
  69. data/features/comments/viewing_index.feature +19 -0
  70. data/features/dashboard.feature +26 -0
  71. data/features/edit_page.feature +106 -0
  72. data/features/first_boot.feature +16 -0
  73. data/features/global_navigation.feature +30 -0
  74. data/features/index/format_as_csv.feature +46 -0
  75. data/features/index/formats.feature +12 -0
  76. data/features/index/index_as_block.feature +15 -0
  77. data/features/index/index_as_blog.feature +50 -0
  78. data/features/index/index_as_grid.feature +45 -0
  79. data/features/index/index_as_table.feature +81 -0
  80. data/features/index/index_blank_slate.feature +55 -0
  81. data/features/index/index_scopes.feature +52 -0
  82. data/features/index/pagination.feature +17 -0
  83. data/features/menu.feature +26 -0
  84. data/features/new_page.feature +75 -0
  85. data/features/registering_assets.feature +35 -0
  86. data/features/registering_resources.feature +33 -0
  87. data/features/show/default_content.feature +43 -0
  88. data/features/show/page_title.feature +33 -0
  89. data/features/sidebar_sections.feature +127 -0
  90. data/features/specifying_actions.feature +87 -0
  91. data/features/step_definitions/action_item_steps.rb +7 -0
  92. data/features/step_definitions/additional_web_steps.rb +77 -0
  93. data/features/step_definitions/asset_steps.rb +7 -0
  94. data/features/step_definitions/attribute_steps.rb +13 -0
  95. data/features/step_definitions/comment_steps.rb +8 -0
  96. data/features/step_definitions/configuration_steps.rb +31 -0
  97. data/features/step_definitions/dashboard_steps.rb +11 -0
  98. data/features/step_definitions/factory_steps.rb +29 -0
  99. data/features/step_definitions/flash_steps.rb +3 -0
  100. data/features/step_definitions/format_steps.rb +35 -0
  101. data/features/step_definitions/index_scope_steps.rb +20 -0
  102. data/features/step_definitions/layout_steps.rb +3 -0
  103. data/features/step_definitions/menu_steps.rb +7 -0
  104. data/features/step_definitions/pagination_steps.rb +8 -0
  105. data/features/step_definitions/sidebar_steps.rb +7 -0
  106. data/features/step_definitions/tab_steps.rb +3 -0
  107. data/features/step_definitions/user_steps.rb +26 -0
  108. data/features/step_definitions/web_steps.rb +211 -0
  109. data/features/sti_resource.feature +61 -0
  110. data/features/support/env.rb +90 -0
  111. data/features/support/paths.rb +50 -0
  112. data/features/support/selectors.rb +45 -0
  113. data/features/users/logging_in.feature +34 -0
  114. data/features/users/logging_out.feature +13 -0
  115. data/lib/active_admin.rb +74 -0
  116. data/lib/active_admin/abstract_view_factory.rb +95 -0
  117. data/lib/active_admin/application.rb +228 -0
  118. data/lib/active_admin/arbre.rb +23 -0
  119. data/lib/active_admin/arbre/attributes.rb +20 -0
  120. data/lib/active_admin/arbre/class_list.rb +28 -0
  121. data/lib/active_admin/arbre/collection.rb +27 -0
  122. data/lib/active_admin/arbre/context.rb +14 -0
  123. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  124. data/lib/active_admin/arbre/document.rb +42 -0
  125. data/lib/active_admin/arbre/element.rb +151 -0
  126. data/lib/active_admin/arbre/html.rb +84 -0
  127. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  128. data/lib/active_admin/arbre/tag.rb +137 -0
  129. data/lib/active_admin/arbre/text_node.rb +35 -0
  130. data/lib/active_admin/asset_registration.rb +34 -0
  131. data/lib/active_admin/callbacks.rb +89 -0
  132. data/lib/active_admin/comments.rb +88 -0
  133. data/lib/active_admin/comments/comment.rb +21 -0
  134. data/lib/active_admin/comments/configuration.rb +18 -0
  135. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  136. data/lib/active_admin/comments/resource_helper.rb +17 -0
  137. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  138. data/lib/active_admin/comments/views.rb +3 -0
  139. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  140. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  141. data/lib/active_admin/component.rb +22 -0
  142. data/lib/active_admin/controller_action.rb +12 -0
  143. data/lib/active_admin/csv_builder.rb +45 -0
  144. data/lib/active_admin/dashboards.rb +48 -0
  145. data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
  146. data/lib/active_admin/dashboards/section.rb +34 -0
  147. data/lib/active_admin/deprecation.rb +36 -0
  148. data/lib/active_admin/devise.rb +43 -0
  149. data/lib/active_admin/dsl.rb +224 -0
  150. data/lib/active_admin/engine.rb +4 -0
  151. data/lib/active_admin/event.rb +31 -0
  152. data/lib/active_admin/form_builder.rb +109 -0
  153. data/lib/active_admin/helpers/optional_display.rb +34 -0
  154. data/lib/active_admin/helpers/settings.rb +63 -0
  155. data/lib/active_admin/iconic.rb +51 -0
  156. data/lib/active_admin/iconic/icons.rb +142 -0
  157. data/lib/active_admin/locales/da.yml +28 -0
  158. data/lib/active_admin/locales/en.yml +40 -0
  159. data/lib/active_admin/locales/es.yml +39 -0
  160. data/lib/active_admin/locales/it.yml +39 -0
  161. data/lib/active_admin/locales/pt-BR.yml +36 -0
  162. data/lib/active_admin/locales/ru.yml +40 -0
  163. data/lib/active_admin/locales/zh_cn.yml +40 -0
  164. data/lib/active_admin/menu.rb +42 -0
  165. data/lib/active_admin/menu_item.rb +73 -0
  166. data/lib/active_admin/namespace.rb +206 -0
  167. data/lib/active_admin/page_config.rb +15 -0
  168. data/lib/active_admin/reloader.rb +30 -0
  169. data/lib/active_admin/renderer.rb +87 -0
  170. data/lib/active_admin/resource.rb +151 -0
  171. data/lib/active_admin/resource/action_items.rb +88 -0
  172. data/lib/active_admin/resource/belongs_to.rb +31 -0
  173. data/lib/active_admin/resource/menu.rb +45 -0
  174. data/lib/active_admin/resource/naming.rb +36 -0
  175. data/lib/active_admin/resource/scopes.rb +33 -0
  176. data/lib/active_admin/resource/sidebars.rb +36 -0
  177. data/lib/active_admin/resource_controller.rb +103 -0
  178. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  179. data/lib/active_admin/resource_controller/actions.rb +79 -0
  180. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  181. data/lib/active_admin/resource_controller/collection.rb +144 -0
  182. data/lib/active_admin/resource_controller/filters.rb +58 -0
  183. data/lib/active_admin/resource_controller/form.rb +42 -0
  184. data/lib/active_admin/resource_controller/menu.rb +29 -0
  185. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  186. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  187. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  188. data/lib/active_admin/router.rb +85 -0
  189. data/lib/active_admin/sass/active_admin.scss +3 -0
  190. data/lib/active_admin/sass/css_loader.rb +16 -0
  191. data/lib/active_admin/sass/helpers.rb +40 -0
  192. data/lib/active_admin/scope.rb +17 -0
  193. data/lib/active_admin/sidebar_section.rb +41 -0
  194. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  195. data/lib/active_admin/version.rb +3 -0
  196. data/lib/active_admin/view_factory.rb +23 -0
  197. data/lib/active_admin/view_helpers.rb +22 -0
  198. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  199. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  200. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  201. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  202. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  203. data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
  204. data/lib/active_admin/view_helpers/form_helper.rb +13 -0
  205. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  206. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  207. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  208. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  209. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  210. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  211. data/lib/active_admin/views.rb +8 -0
  212. data/lib/active_admin/views/action_items.rb +17 -0
  213. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  214. data/lib/active_admin/views/components/blank_slate.rb +33 -0
  215. data/lib/active_admin/views/components/columns.rb +47 -0
  216. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  217. data/lib/active_admin/views/components/panel.rb +26 -0
  218. data/lib/active_admin/views/components/scopes.rb +70 -0
  219. data/lib/active_admin/views/components/sidebar_section.rb +28 -0
  220. data/lib/active_admin/views/components/status_tag.rb +55 -0
  221. data/lib/active_admin/views/components/table_for.rb +193 -0
  222. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  223. data/lib/active_admin/views/header_renderer.rb +53 -0
  224. data/lib/active_admin/views/index_as_block.rb +29 -0
  225. data/lib/active_admin/views/index_as_blog.rb +129 -0
  226. data/lib/active_admin/views/index_as_grid.rb +70 -0
  227. data/lib/active_admin/views/index_as_table.rb +148 -0
  228. data/lib/active_admin/views/pages/base.rb +155 -0
  229. data/lib/active_admin/views/pages/dashboard.rb +62 -0
  230. data/lib/active_admin/views/pages/edit.rb +28 -0
  231. data/lib/active_admin/views/pages/index.rb +74 -0
  232. data/lib/active_admin/views/pages/layout.rb +26 -0
  233. data/lib/active_admin/views/pages/new.rb +28 -0
  234. data/lib/active_admin/views/pages/show.rb +56 -0
  235. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  236. data/lib/activeadmin.rb +1 -0
  237. data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
  238. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
  239. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
  240. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
  241. data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
  242. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  243. data/lib/generators/active_admin/install/install_generator.rb +44 -0
  244. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +93 -0
  245. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  246. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  247. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  248. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  249. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  250. data/script/local +44 -0
  251. data/script/use_rails +45 -0
  252. data/spec/integration/belongs_to_spec.rb +42 -0
  253. data/spec/integration/default_namespace.rb +77 -0
  254. data/spec/integration/javascript_spec.rb +20 -0
  255. data/spec/integration/stylesheets_spec.rb +41 -0
  256. data/spec/spec_helper.rb +157 -0
  257. data/spec/support/detect_rails_version.rb +11 -0
  258. data/spec/support/integration_example_group.rb +33 -0
  259. data/spec/support/jslint.yml +80 -0
  260. data/spec/support/rails_template.rb +32 -0
  261. data/spec/support/rails_template_with_data.rb +33 -0
  262. data/spec/support/templates/cucumber.rb +24 -0
  263. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  264. data/spec/unit/action_builder_spec.rb +88 -0
  265. data/spec/unit/application_spec.rb +78 -0
  266. data/spec/unit/arbre/html/context_spec.rb +22 -0
  267. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  268. data/spec/unit/arbre/html/element_spec.rb +224 -0
  269. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  270. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  271. data/spec/unit/arbre/html_spec.rb +210 -0
  272. data/spec/unit/asset_registration_spec.rb +37 -0
  273. data/spec/unit/auto_link_spec.rb +39 -0
  274. data/spec/unit/belongs_to_spec.rb +45 -0
  275. data/spec/unit/breadcrumbs_spec.rb +110 -0
  276. data/spec/unit/comments_spec.rb +57 -0
  277. data/spec/unit/component_spec.rb +18 -0
  278. data/spec/unit/controller_filters_spec.rb +34 -0
  279. data/spec/unit/csv_builder_spec.rb +83 -0
  280. data/spec/unit/dashboard_controller_spec.rb +26 -0
  281. data/spec/unit/dashboard_section_spec.rb +56 -0
  282. data/spec/unit/dashboards_spec.rb +59 -0
  283. data/spec/unit/display_name_spec.rb +29 -0
  284. data/spec/unit/event_spec.rb +41 -0
  285. data/spec/unit/filter_form_builder_spec.rb +182 -0
  286. data/spec/unit/form_builder_spec.rb +239 -0
  287. data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
  288. data/spec/unit/helpers/settings_spec.rb +30 -0
  289. data/spec/unit/menu_item_spec.rb +143 -0
  290. data/spec/unit/menu_spec.rb +53 -0
  291. data/spec/unit/namespace_spec.rb +214 -0
  292. data/spec/unit/pretty_format_spec.rb +35 -0
  293. data/spec/unit/rails_spec.rb +43 -0
  294. data/spec/unit/registration_spec.rb +76 -0
  295. data/spec/unit/reloader_spec.rb +28 -0
  296. data/spec/unit/renderer_spec.rb +108 -0
  297. data/spec/unit/resource/action_items_spec.rb +62 -0
  298. data/spec/unit/resource/menu_spec.rb +80 -0
  299. data/spec/unit/resource/naming_spec.rb +56 -0
  300. data/spec/unit/resource/scopes_spec.rb +30 -0
  301. data/spec/unit/resource/sidebars_spec.rb +50 -0
  302. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  303. data/spec/unit/resource_controller_spec.rb +152 -0
  304. data/spec/unit/resource_spec.rb +260 -0
  305. data/spec/unit/routing_spec.rb +88 -0
  306. data/spec/unit/sass/helpers_spec.rb +47 -0
  307. data/spec/unit/scope_spec.rb +31 -0
  308. data/spec/unit/tabs_renderer_spec.rb +85 -0
  309. data/spec/unit/view_factory_spec.rb +19 -0
  310. data/spec/unit/views/components/attributes_table_spec.rb +100 -0
  311. data/spec/unit/views/components/blank_slate_spec.rb +31 -0
  312. data/spec/unit/views/components/columns_spec.rb +75 -0
  313. data/spec/unit/views/components/panel_spec.rb +31 -0
  314. data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
  315. data/spec/unit/views/components/status_tag_spec.rb +81 -0
  316. data/spec/unit/views/components/table_for_spec.rb +130 -0
  317. data/spec/unit/views/pages/layout_spec.rb +22 -0
  318. data/tasks/docs.rake +39 -0
  319. data/tasks/test.rake +49 -0
  320. data/tasks/yard.rake +6 -0
  321. metadata +510 -0
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe "display names" do
4
+
5
+ include ActiveAdmin::ViewHelpers
6
+
7
+ [:display_name, :full_name, :name, :username, :login, :title, :email, :to_s].each do |m|
8
+ it "should return #{m} if defined" do
9
+ r = Class.new do
10
+ define_method m do
11
+ m.to_s
12
+ end
13
+ end.new
14
+ display_name(r).should == m.to_s
15
+ end
16
+ end
17
+
18
+ it "should memeoize the result for the class" do
19
+ c = Class.new do
20
+ def name
21
+ "My Name"
22
+ end
23
+ end
24
+ display_name(c.new).should == "My Name"
25
+ ActiveAdmin.application.should_not_receive(:display_name_methods)
26
+ display_name(c.new).should == "My Name"
27
+ end
28
+
29
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'active_admin/event'
3
+
4
+ describe ActiveAdmin::EventDispatcher do
5
+
6
+ let(:test_event){ 'active_admin.test_event' }
7
+ let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
8
+
9
+ it "should add a subscriber for an event" do
10
+ dispatcher.subscribers(test_event).size.should == 0
11
+ dispatcher.subscribe(test_event){ true }
12
+ dispatcher.subscribers(test_event).size.should == 1
13
+ end
14
+
15
+ it "should call the dispatch block with no arguments" do
16
+ dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
17
+ lambda {
18
+ dispatcher.dispatch(test_event)
19
+ }.should raise_error(StandardError, "From Event Handler")
20
+ end
21
+
22
+ it "should call the dispatch block with one argument" do
23
+ arg = nil
24
+ dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
25
+ dispatcher.dispatch(test_event, "My Arg")
26
+ arg.should == "My Arg"
27
+ end
28
+
29
+ it "should clear all subscribers" do
30
+ dispatcher.subscribe(test_event){ false }
31
+ dispatcher.subscribe(test_event + "_2"){ false }
32
+ dispatcher.clear_all_subscribers!
33
+ dispatcher.subscribers(test_event).size.should == 0
34
+ dispatcher.subscribers(test_event + "_2").size.should == 0
35
+ end
36
+
37
+ it "should have a dispatcher available from ActiveAdmin::Event" do
38
+ ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
39
+ end
40
+
41
+ end
@@ -0,0 +1,182 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe ActiveAdmin::ViewHelpers::FilterFormHelper do
5
+ include Arbre::HTML
6
+ let(:assigns){ {} }
7
+
8
+ # Setup an ActionView::Base object which can be used for
9
+ # generating the form for.
10
+ let(:helpers) do
11
+ view = action_view
12
+ def view.collection_path
13
+ "/posts"
14
+ end
15
+
16
+ def view.protect_against_forgery?
17
+ false
18
+ end
19
+
20
+ view
21
+ end
22
+
23
+ def filter(name, options = {})
24
+ search = Post.search
25
+ active_admin_filters_form_for(search, [options.merge(:attribute => name)])
26
+ end
27
+
28
+ describe "the form in general" do
29
+ let(:body) { filter :title }
30
+
31
+ it "should generate a form which submits via get" do
32
+ body.should have_tag("form", :attributes => { :method => 'get', :class => 'filter_form' })
33
+ end
34
+
35
+ it "should generate a filter button" do
36
+ body.should have_tag("input", :attributes => { :type => "submit",
37
+ :value => "Filter" })
38
+ end
39
+
40
+ it "should only generate the form once" do
41
+ body.scan(/q\[title_contains\]/).size.should == 1
42
+ end
43
+
44
+ it "should generate a clear filters link" do
45
+ body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
46
+ end
47
+ end
48
+
49
+ describe "string attribute" do
50
+ let(:body) { filter :title }
51
+
52
+ it "should generate a search field for a string attribute" do
53
+ body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
54
+ end
55
+
56
+ it "should label a text field with search" do
57
+ body.should have_tag('label', 'Search Title')
58
+ end
59
+ end
60
+
61
+ describe "text attribute" do
62
+ let(:body) { filter :body }
63
+
64
+ it "should generate a search field for a text attribute" do
65
+ body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
66
+ end
67
+
68
+ it "should label a text field with search" do
69
+ body.should have_tag('label', 'Search Body')
70
+ end
71
+ end
72
+
73
+ describe "datetime attribute" do
74
+ let(:body) { filter :created_at }
75
+
76
+ it "should generate a date greater than" do
77
+ body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
78
+ end
79
+ it "should generate a seperator" do
80
+ body.should have_tag("span", :attributes => { :class => "seperator"})
81
+ end
82
+ it "should generate a date less than" do
83
+ body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
84
+ end
85
+ end
86
+
87
+ describe "integer attribute" do
88
+ let(:body) { filter :id }
89
+
90
+ it "should generate a select option for equal to" do
91
+ body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
92
+ end
93
+ it "should generate a select option for greater than" do
94
+ body.should have_tag("option", "Greater Than")
95
+ end
96
+ it "should generate a select option for less than" do
97
+ body.should have_tag("option", "Less Than")
98
+ end
99
+ it "should generate a text field for input" do
100
+ body.should have_tag("input", :attributes => {
101
+ :name => /q\[(id_eq|id_equals)\]/ })
102
+ end
103
+ it "should select the option which is currently being filtered"
104
+ end
105
+
106
+ describe "belong to" do
107
+ before do
108
+ @john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
109
+ @jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
110
+ end
111
+
112
+ context "when given as the _id attribute name" do
113
+ let(:body) { filter :author_id }
114
+
115
+ it "should not render as an integer" do
116
+ body.should_not have_tag("input", :attributes => {
117
+ :name => "q[author_id_eq]"})
118
+ end
119
+ it "should render as belongs to select" do
120
+ body.should have_tag("select", :attributes => {
121
+ :name => "q[author_id_eq]"})
122
+ body.should have_tag("option", "jane_doe", :attributes => {
123
+ :value => @jane.id })
124
+ end
125
+ end
126
+
127
+ context "when given as the name of the relationship" do
128
+ let(:body) { filter :author }
129
+
130
+ it "should generate a select" do
131
+ body.should have_tag("select", :attributes => {
132
+ :name => "q[author_id_eq]"})
133
+ end
134
+ it "should set the default text to 'Any'" do
135
+ body.should have_tag("option", "Any", :attributes => {
136
+ :value => "" })
137
+ end
138
+ it "should create an option for each related object" do
139
+ body.should have_tag("option", "john_doe", :attributes => {
140
+ :value => @john.id })
141
+ body.should have_tag("option", "jane_doe", :attributes => {
142
+ :value => @jane.id })
143
+ end
144
+
145
+ context "with a proc" do
146
+ let :body do
147
+ filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
148
+ end
149
+
150
+ it "should use call the proc as the collection" do
151
+ body.should have_tag("option", "Title One")
152
+ body.should have_tag("option", "Title Two")
153
+ end
154
+ end
155
+ end
156
+
157
+ context "as check boxes" do
158
+ let(:body) { filter :author, :as => :check_boxes }
159
+
160
+ it "should create a check box for each related object" do
161
+ body.should have_tag("input", :attributes => {
162
+ :name => "q[author_id_in][]",
163
+ :type => "checkbox",
164
+ :value => @john.id })
165
+ body.should have_tag("input", :attributes => {
166
+ :name => "q[author_id_in][]",
167
+ :type => "checkbox",
168
+ :value => @jane.id })
169
+ end
170
+ end
171
+
172
+ context "when polymorphic relationship" do
173
+ let(:body) do
174
+ search = ActiveAdmin::Comment.search
175
+ active_admin_filters_form_for(search, [{ :attribute => :resource}])
176
+ end
177
+ it "should not generate any field" do
178
+ body.should have_tag("form", :attributes => { :method => 'get' })
179
+ end
180
+ end
181
+ end # belongs to
182
+ end
@@ -0,0 +1,239 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::FormBuilder do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ # Setup an ActionView::Base object which can be used for
8
+ # generating the form for.
9
+ let(:helpers) do
10
+ view = action_view
11
+ def view.posts_path
12
+ "/posts"
13
+ end
14
+
15
+ def view.protect_against_forgery?
16
+ false
17
+ end
18
+
19
+ def view.url_for(*args)
20
+ if args.first == {:action => "index"}
21
+ posts_path
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ view
28
+ end
29
+
30
+ def build_form(options = {}, &block)
31
+ options.merge!({:url => posts_path})
32
+ active_admin_form_for Post.new, options, &block
33
+ end
34
+
35
+ context "in general" do
36
+ let :body do
37
+ build_form do |f|
38
+ f.inputs do
39
+ f.input :title
40
+ f.input :body
41
+ end
42
+ f.buttons do
43
+ f.commit_button "Submit Me"
44
+ f.commit_button "Another Button"
45
+ end
46
+ end
47
+ end
48
+
49
+ it "should generate a text input" do
50
+ body.should have_tag("input", :attributes => { :type => "text",
51
+ :name => "post[title]" })
52
+ end
53
+ it "should generate a textarea" do
54
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
55
+ end
56
+ it "should only generate the form once" do
57
+ body.scan(/Title/).size.should == 1
58
+ end
59
+ it "should generate buttons" do
60
+ body.should have_tag("input", :attributes => { :type => "submit",
61
+ :value => "Submit Me" })
62
+ body.should have_tag("input", :attributes => { :type => "submit",
63
+ :value => "Another Button" })
64
+ end
65
+ end
66
+
67
+ describe "passing in options" do
68
+ let :body do
69
+ build_form :html => { :multipart => true } do |f|
70
+ f.inputs :title
71
+ f.buttons
72
+ end
73
+ end
74
+ it "should pass the options on to the form" do
75
+ body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
76
+ end
77
+ end
78
+
79
+ context "with buttons" do
80
+ it "should generate the form once" do
81
+ body = build_form do |f|
82
+ f.inputs do
83
+ f.input :title
84
+ end
85
+ f.buttons
86
+ end
87
+ body.scan(/id=\"post_title\"/).size.should == 1
88
+ end
89
+ it "should generate one button and a cancel link" do
90
+ body = build_form do |f|
91
+ f.buttons
92
+ end
93
+ body.scan(/type=\"submit\"/).size.should == 1
94
+ body.scan(/class=\"cancel\"/).size.should == 1
95
+ end
96
+ it "should generate multiple buttons" do
97
+ body = build_form do |f|
98
+ f.buttons do
99
+ f.commit_button "Create & Continue"
100
+ f.commit_button "Create & Edit"
101
+ end
102
+ end
103
+ body.scan(/type=\"submit\"/).size.should == 2
104
+ body.scan(/class=\"cancel\"/).size.should == 0
105
+ end
106
+
107
+ end
108
+
109
+ context "without passing a block to inputs" do
110
+ let :body do
111
+ build_form do |f|
112
+ f.inputs :title, :body
113
+ end
114
+ end
115
+ it "should have a title input" do
116
+ body.should have_tag("input", :attributes => { :type => "text",
117
+ :name => "post[title]" })
118
+ end
119
+ it "should have a body textarea" do
120
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
121
+ end
122
+ end
123
+
124
+ context "with semantic fields for" do
125
+ let :body do
126
+ build_form do |f|
127
+ f.inputs do
128
+ f.input :title
129
+ f.input :body
130
+ end
131
+ f.instance_eval do
132
+ @object.author = User.new
133
+ end
134
+ f.semantic_fields_for :author do |author|
135
+ author.inputs :first_name, :last_name
136
+ end
137
+ end
138
+ end
139
+ it "should generate a nested text input once" do
140
+ body.scan("post_author_attributes_first_name_input").size.should == 1
141
+ end
142
+ end
143
+
144
+ context "with collection inputs" do
145
+ before do
146
+ User.create :first_name => "John", :last_name => "Doe"
147
+ User.create :first_name => "Jane", :last_name => "Doe"
148
+ end
149
+
150
+ describe "as select" do
151
+ let :body do
152
+ build_form do |f|
153
+ f.input :author
154
+ end
155
+ end
156
+ it "should create 2 options" do
157
+ body.scan(/\<option/).size.should == 3
158
+ end
159
+ end
160
+
161
+ describe "as radio buttons" do
162
+ let :body do
163
+ build_form do |f|
164
+ f.input :author, :as => :radio
165
+ end
166
+ end
167
+ it "should create 2 radio buttons" do
168
+ body.scan(/type=\"radio\"/).size.should == 2
169
+ end
170
+ end
171
+ end
172
+
173
+ context "with inputs 'for'" do
174
+ let :body do
175
+ build_form do |f|
176
+ f.inputs do
177
+ f.input :title
178
+ f.input :body
179
+ end
180
+ f.instance_eval do
181
+ @object.author = User.new
182
+ end
183
+ f.inputs :name => 'Author', :for => :author do |author|
184
+ author.inputs :first_name, :last_name
185
+ end
186
+ end
187
+ end
188
+ it "should generate a nested text input once" do
189
+ body.scan("post_author_attributes_first_name_input").size.should == 1
190
+ end
191
+ it "should add an author first name field" do
192
+ body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
193
+ end
194
+ end
195
+
196
+ context "with wrapper html" do
197
+ it "should set a class" do
198
+ body = build_form do |f|
199
+ f.input :title, :wrapper_html => { :class => "important" }
200
+ end
201
+ body.should have_tag("li", :attributes => {:class => "string optional important"})
202
+ end
203
+ end
204
+
205
+
206
+ {
207
+ "input :title, :as => :string" => /id\=\"post_title\"/,
208
+ "input :title, :as => :text" => /id\=\"post_title\"/,
209
+ "input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
210
+ "input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
211
+ "input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
212
+ }.each do |source, regex|
213
+ it "should properly buffer #{source}" do
214
+ body = build_form do |f|
215
+ f.inputs do
216
+ f.instance_eval(source)
217
+ f.instance_eval(source)
218
+ end
219
+ end
220
+ body.scan(regex).size.should == 2
221
+ end
222
+ end
223
+
224
+ describe "datepicker input" do
225
+ let :body do
226
+ build_form do |f|
227
+ f.inputs do
228
+ f.input :created_at, :as => :datepicker
229
+ end
230
+ end
231
+ end
232
+ it "should generate a text input with the class of datepicker" do
233
+ body.should have_tag("input", :attributes => { :type => "text",
234
+ :class => "datepicker",
235
+ :name => "post[created_at]" })
236
+ end
237
+ end
238
+
239
+ end