andrewroth_activeadmin 0.3.4

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 (338) hide show
  1. data/.document +5 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +4 -0
  4. data/.yardopts +8 -0
  5. data/CHANGELOG.md +301 -0
  6. data/Gemfile +40 -0
  7. data/Guardfile +8 -0
  8. data/LICENSE +25 -0
  9. data/README.rdoc +113 -0
  10. data/Rakefile +18 -0
  11. data/activeadmin.gemspec +28 -0
  12. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  13. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  14. data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
  15. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  16. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  17. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  18. data/app/assets/images/active_admin/loading.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  20. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  21. data/app/assets/images/active_admin/orderable.png +0 -0
  22. data/app/assets/javascripts/active_admin/base.js +12 -0
  23. data/app/assets/javascripts/active_admin/vendor.js +382 -0
  24. data/app/assets/stylesheets/active_admin/_base.css.scss +363 -0
  25. data/app/assets/stylesheets/active_admin/_forms.css.scss +259 -0
  26. data/app/assets/stylesheets/active_admin/_header.css.scss +121 -0
  27. data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
  28. data/app/assets/stylesheets/active_admin/_typography.css.scss +102 -0
  29. data/app/assets/stylesheets/active_admin/components/_comments.css.scss +43 -0
  30. data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +125 -0
  31. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -0
  32. data/app/assets/stylesheets/active_admin/components/_tables.css.scss +68 -0
  33. data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +10 -0
  34. data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +27 -0
  35. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +29 -0
  36. data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +20 -0
  37. data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
  38. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
  39. data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +34 -0
  40. data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +21 -0
  41. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  42. data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +21 -0
  43. data/app/views/active_admin/dashboard/index.html.arb +1 -0
  44. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  45. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  46. data/app/views/active_admin/devise/passwords/edit.html.erb +16 -0
  47. data/app/views/active_admin/devise/passwords/new.html.erb +14 -0
  48. data/app/views/active_admin/devise/sessions/new.html.erb +18 -0
  49. data/app/views/active_admin/devise/shared/_links.erb +20 -0
  50. data/app/views/active_admin/devise/unlocks/new.html.erb +12 -0
  51. data/app/views/active_admin/resource/edit.html.arb +1 -0
  52. data/app/views/active_admin/resource/index.csv.erb +20 -0
  53. data/app/views/active_admin/resource/index.html.arb +1 -0
  54. data/app/views/active_admin/resource/new.html.arb +1 -0
  55. data/app/views/active_admin/resource/show.html.arb +1 -0
  56. data/app/views/layouts/active_admin.html.arb +1 -0
  57. data/app/views/layouts/active_admin_logged_out.html.erb +35 -0
  58. data/cucumber.yml +2 -0
  59. data/docs/0-installation.md +50 -0
  60. data/docs/1-general-configuration.md +43 -0
  61. data/docs/2-resource-customization.md +114 -0
  62. data/docs/3-index-pages.md +55 -0
  63. data/docs/3-index-pages/index-as-block.md +16 -0
  64. data/docs/3-index-pages/index-as-blog.md +61 -0
  65. data/docs/3-index-pages/index-as-grid.md +21 -0
  66. data/docs/3-index-pages/index-as-table.md +90 -0
  67. data/docs/4-csv-format.md +14 -0
  68. data/docs/5-forms.md +39 -0
  69. data/docs/6-show-screens.md +36 -0
  70. data/docs/7-sidebars.md +35 -0
  71. data/docs/8-custom-actions.md +123 -0
  72. data/features/comments/commenting.feature +112 -0
  73. data/features/comments/viewing_index.feature +19 -0
  74. data/features/dashboard.feature +26 -0
  75. data/features/edit_page.feature +106 -0
  76. data/features/first_boot.feature +16 -0
  77. data/features/global_navigation.feature +30 -0
  78. data/features/index/filters.feature +35 -0
  79. data/features/index/format_as_csv.feature +46 -0
  80. data/features/index/formats.feature +12 -0
  81. data/features/index/index_as_block.feature +15 -0
  82. data/features/index/index_as_blog.feature +50 -0
  83. data/features/index/index_as_grid.feature +45 -0
  84. data/features/index/index_as_table.feature +81 -0
  85. data/features/index/index_blank_slate.feature +56 -0
  86. data/features/index/index_scopes.feature +52 -0
  87. data/features/index/pagination.feature +17 -0
  88. data/features/menu.feature +37 -0
  89. data/features/new_page.feature +75 -0
  90. data/features/registering_assets.feature +35 -0
  91. data/features/registering_resources.feature +33 -0
  92. data/features/show/default_content.feature +43 -0
  93. data/features/show/page_title.feature +33 -0
  94. data/features/sidebar_sections.feature +127 -0
  95. data/features/specifying_actions.feature +87 -0
  96. data/features/step_definitions/action_item_steps.rb +7 -0
  97. data/features/step_definitions/additional_web_steps.rb +77 -0
  98. data/features/step_definitions/asset_steps.rb +7 -0
  99. data/features/step_definitions/attribute_steps.rb +13 -0
  100. data/features/step_definitions/comment_steps.rb +8 -0
  101. data/features/step_definitions/configuration_steps.rb +31 -0
  102. data/features/step_definitions/dashboard_steps.rb +11 -0
  103. data/features/step_definitions/factory_steps.rb +29 -0
  104. data/features/step_definitions/flash_steps.rb +3 -0
  105. data/features/step_definitions/format_steps.rb +35 -0
  106. data/features/step_definitions/index_scope_steps.rb +20 -0
  107. data/features/step_definitions/layout_steps.rb +3 -0
  108. data/features/step_definitions/menu_steps.rb +7 -0
  109. data/features/step_definitions/pagination_steps.rb +8 -0
  110. data/features/step_definitions/sidebar_steps.rb +7 -0
  111. data/features/step_definitions/tab_steps.rb +3 -0
  112. data/features/step_definitions/user_steps.rb +26 -0
  113. data/features/step_definitions/web_steps.rb +211 -0
  114. data/features/sti_resource.feature +61 -0
  115. data/features/support/env.rb +96 -0
  116. data/features/support/paths.rb +50 -0
  117. data/features/support/selectors.rb +45 -0
  118. data/features/users/logging_in.feature +34 -0
  119. data/features/users/logging_out.feature +13 -0
  120. data/lib/active_admin.rb +82 -0
  121. data/lib/active_admin/abstract_view_factory.rb +95 -0
  122. data/lib/active_admin/application.rb +231 -0
  123. data/lib/active_admin/arbre.rb +23 -0
  124. data/lib/active_admin/arbre/builder.rb +111 -0
  125. data/lib/active_admin/arbre/context.rb +45 -0
  126. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  127. data/lib/active_admin/arbre/html/attributes.rb +20 -0
  128. data/lib/active_admin/arbre/html/class_list.rb +28 -0
  129. data/lib/active_admin/arbre/html/collection.rb +27 -0
  130. data/lib/active_admin/arbre/html/document.rb +42 -0
  131. data/lib/active_admin/arbre/html/element.rb +151 -0
  132. data/lib/active_admin/arbre/html/html5_elements.rb +47 -0
  133. data/lib/active_admin/arbre/html/tag.rb +137 -0
  134. data/lib/active_admin/arbre/html/text_node.rb +35 -0
  135. data/lib/active_admin/asset_registration.rb +34 -0
  136. data/lib/active_admin/callbacks.rb +89 -0
  137. data/lib/active_admin/comments.rb +88 -0
  138. data/lib/active_admin/comments/comment.rb +21 -0
  139. data/lib/active_admin/comments/configuration.rb +18 -0
  140. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  141. data/lib/active_admin/comments/resource_helper.rb +17 -0
  142. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  143. data/lib/active_admin/comments/views.rb +3 -0
  144. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  145. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  146. data/lib/active_admin/component.rb +22 -0
  147. data/lib/active_admin/controller_action.rb +12 -0
  148. data/lib/active_admin/csv_builder.rb +45 -0
  149. data/lib/active_admin/dashboards.rb +48 -0
  150. data/lib/active_admin/dashboards/dashboard_controller.rb +38 -0
  151. data/lib/active_admin/dashboards/section.rb +34 -0
  152. data/lib/active_admin/dependency_checker.rb +30 -0
  153. data/lib/active_admin/deprecation.rb +36 -0
  154. data/lib/active_admin/devise.rb +54 -0
  155. data/lib/active_admin/dsl.rb +224 -0
  156. data/lib/active_admin/engine.rb +4 -0
  157. data/lib/active_admin/event.rb +31 -0
  158. data/lib/active_admin/form_builder.rb +118 -0
  159. data/lib/active_admin/helpers/optional_display.rb +34 -0
  160. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  161. data/lib/active_admin/helpers/settings.rb +70 -0
  162. data/lib/active_admin/iconic.rb +51 -0
  163. data/lib/active_admin/iconic/icons.rb +142 -0
  164. data/lib/active_admin/locales/bg.yml +40 -0
  165. data/lib/active_admin/locales/cs.yml +34 -0
  166. data/lib/active_admin/locales/da.yml +28 -0
  167. data/lib/active_admin/locales/en.yml +40 -0
  168. data/lib/active_admin/locales/es.yml +40 -0
  169. data/lib/active_admin/locales/fr.yml +40 -0
  170. data/lib/active_admin/locales/it.yml +40 -0
  171. data/lib/active_admin/locales/ja.yml +40 -0
  172. data/lib/active_admin/locales/pl.yml +34 -0
  173. data/lib/active_admin/locales/pt-BR.yml +41 -0
  174. data/lib/active_admin/locales/ru.yml +40 -0
  175. data/lib/active_admin/locales/sv-SE.yml +40 -0
  176. data/lib/active_admin/locales/zh_cn.yml +40 -0
  177. data/lib/active_admin/menu.rb +42 -0
  178. data/lib/active_admin/menu_item.rb +73 -0
  179. data/lib/active_admin/namespace.rb +206 -0
  180. data/lib/active_admin/page_config.rb +15 -0
  181. data/lib/active_admin/reloader.rb +64 -0
  182. data/lib/active_admin/renderer.rb +87 -0
  183. data/lib/active_admin/resource.rb +159 -0
  184. data/lib/active_admin/resource/action_items.rb +88 -0
  185. data/lib/active_admin/resource/belongs_to.rb +31 -0
  186. data/lib/active_admin/resource/menu.rb +45 -0
  187. data/lib/active_admin/resource/naming.rb +50 -0
  188. data/lib/active_admin/resource/scopes.rb +33 -0
  189. data/lib/active_admin/resource/sidebars.rb +36 -0
  190. data/lib/active_admin/resource_controller.rb +105 -0
  191. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  192. data/lib/active_admin/resource_controller/actions.rb +79 -0
  193. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  194. data/lib/active_admin/resource_controller/collection.rb +138 -0
  195. data/lib/active_admin/resource_controller/filters.rb +58 -0
  196. data/lib/active_admin/resource_controller/form.rb +42 -0
  197. data/lib/active_admin/resource_controller/menu.rb +29 -0
  198. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  199. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  200. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  201. data/lib/active_admin/router.rb +85 -0
  202. data/lib/active_admin/sass/active_admin.scss +3 -0
  203. data/lib/active_admin/sass/css_loader.rb +16 -0
  204. data/lib/active_admin/sass/helpers.rb +45 -0
  205. data/lib/active_admin/scope.rb +31 -0
  206. data/lib/active_admin/sidebar_section.rb +41 -0
  207. data/lib/active_admin/stylesheets/active_admin/mixins/_utilities.scss +0 -0
  208. data/lib/active_admin/version.rb +3 -0
  209. data/lib/active_admin/view_factory.rb +23 -0
  210. data/lib/active_admin/view_helpers.rb +22 -0
  211. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  212. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  213. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  214. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  215. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  216. data/lib/active_admin/view_helpers/filter_form_helper.rb +186 -0
  217. data/lib/active_admin/view_helpers/form_helper.rb +13 -0
  218. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  219. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  220. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  221. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  222. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  223. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  224. data/lib/active_admin/views.rb +8 -0
  225. data/lib/active_admin/views/action_items.rb +17 -0
  226. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  227. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  228. data/lib/active_admin/views/components/columns.rb +47 -0
  229. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  230. data/lib/active_admin/views/components/panel.rb +26 -0
  231. data/lib/active_admin/views/components/scopes.rb +69 -0
  232. data/lib/active_admin/views/components/sidebar_section.rb +28 -0
  233. data/lib/active_admin/views/components/status_tag.rb +55 -0
  234. data/lib/active_admin/views/components/table_for.rb +193 -0
  235. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  236. data/lib/active_admin/views/header_renderer.rb +57 -0
  237. data/lib/active_admin/views/index_as_block.rb +29 -0
  238. data/lib/active_admin/views/index_as_blog.rb +129 -0
  239. data/lib/active_admin/views/index_as_grid.rb +70 -0
  240. data/lib/active_admin/views/index_as_table.rb +164 -0
  241. data/lib/active_admin/views/pages/base.rb +167 -0
  242. data/lib/active_admin/views/pages/dashboard.rb +62 -0
  243. data/lib/active_admin/views/pages/edit.rb +28 -0
  244. data/lib/active_admin/views/pages/index.rb +91 -0
  245. data/lib/active_admin/views/pages/layout.rb +26 -0
  246. data/lib/active_admin/views/pages/new.rb +28 -0
  247. data/lib/active_admin/views/pages/show.rb +56 -0
  248. data/lib/active_admin/views/tabbed_navigation.rb +94 -0
  249. data/lib/activeadmin.rb +1 -0
  250. data/lib/generators/active_admin/assets/assets_generator.rb +21 -0
  251. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +427 -0
  252. data/lib/generators/active_admin/assets/templates/3.1/active_admin.css.scss +6 -0
  253. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +1 -0
  254. data/lib/generators/active_admin/assets/templates/dashboards.rb +36 -0
  255. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  256. data/lib/generators/active_admin/install/install_generator.rb +44 -0
  257. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +103 -0
  258. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  259. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  260. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  261. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  262. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  263. data/script/local +44 -0
  264. data/script/use_rails +46 -0
  265. data/spec/integration/belongs_to_spec.rb +42 -0
  266. data/spec/integration/default_namespace.rb +77 -0
  267. data/spec/integration/javascript_spec.rb +20 -0
  268. data/spec/integration/memory_spec.rb +38 -0
  269. data/spec/integration/stylesheets_spec.rb +41 -0
  270. data/spec/spec_helper.rb +167 -0
  271. data/spec/support/detect_rails_version.rb +10 -0
  272. data/spec/support/integration_example_group.rb +33 -0
  273. data/spec/support/jslint.yml +80 -0
  274. data/spec/support/rails_template.rb +32 -0
  275. data/spec/support/rails_template_with_data.rb +33 -0
  276. data/spec/support/templates/cucumber.rb +24 -0
  277. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  278. data/spec/unit/action_builder_spec.rb +88 -0
  279. data/spec/unit/active_admin_spec.rb +17 -0
  280. data/spec/unit/application_spec.rb +87 -0
  281. data/spec/unit/arbre/context_spec.rb +35 -0
  282. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  283. data/spec/unit/arbre/html/element_spec.rb +223 -0
  284. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  285. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  286. data/spec/unit/arbre/html_spec.rb +209 -0
  287. data/spec/unit/asset_registration_spec.rb +37 -0
  288. data/spec/unit/auto_link_spec.rb +39 -0
  289. data/spec/unit/belongs_to_spec.rb +45 -0
  290. data/spec/unit/breadcrumbs_spec.rb +110 -0
  291. data/spec/unit/comments_spec.rb +57 -0
  292. data/spec/unit/component_spec.rb +18 -0
  293. data/spec/unit/controller_filters_spec.rb +34 -0
  294. data/spec/unit/csv_builder_spec.rb +83 -0
  295. data/spec/unit/dashboard_controller_spec.rb +26 -0
  296. data/spec/unit/dashboard_section_spec.rb +56 -0
  297. data/spec/unit/dashboards_spec.rb +59 -0
  298. data/spec/unit/devise_spec.rb +66 -0
  299. data/spec/unit/display_name_spec.rb +29 -0
  300. data/spec/unit/event_spec.rb +41 -0
  301. data/spec/unit/filter_form_builder_spec.rb +182 -0
  302. data/spec/unit/form_builder_spec.rb +256 -0
  303. data/spec/unit/generators/install_rails_3_1_spec.rb +16 -0
  304. data/spec/unit/helpers/scope_chain_spec.rb +36 -0
  305. data/spec/unit/helpers/settings_spec.rb +30 -0
  306. data/spec/unit/menu_item_spec.rb +143 -0
  307. data/spec/unit/menu_spec.rb +53 -0
  308. data/spec/unit/namespace_spec.rb +214 -0
  309. data/spec/unit/pretty_format_spec.rb +35 -0
  310. data/spec/unit/rails_spec.rb +43 -0
  311. data/spec/unit/registration_spec.rb +76 -0
  312. data/spec/unit/reloader_spec.rb +80 -0
  313. data/spec/unit/renderer_spec.rb +108 -0
  314. data/spec/unit/resource/action_items_spec.rb +62 -0
  315. data/spec/unit/resource/menu_spec.rb +80 -0
  316. data/spec/unit/resource/naming_spec.rb +75 -0
  317. data/spec/unit/resource/scopes_spec.rb +30 -0
  318. data/spec/unit/resource/sidebars_spec.rb +50 -0
  319. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  320. data/spec/unit/resource_controller_spec.rb +152 -0
  321. data/spec/unit/resource_spec.rb +269 -0
  322. data/spec/unit/routing_spec.rb +88 -0
  323. data/spec/unit/sass/helpers_spec.rb +47 -0
  324. data/spec/unit/scope_spec.rb +41 -0
  325. data/spec/unit/view_factory_spec.rb +19 -0
  326. data/spec/unit/views/components/attributes_table_spec.rb +100 -0
  327. data/spec/unit/views/components/blank_slate_spec.rb +15 -0
  328. data/spec/unit/views/components/columns_spec.rb +75 -0
  329. data/spec/unit/views/components/panel_spec.rb +29 -0
  330. data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
  331. data/spec/unit/views/components/status_tag_spec.rb +79 -0
  332. data/spec/unit/views/components/table_for_spec.rb +131 -0
  333. data/spec/unit/views/pages/layout_spec.rb +22 -0
  334. data/spec/unit/views/tabbed_navigation_spec.rb +125 -0
  335. data/tasks/docs.rake +39 -0
  336. data/tasks/test.rake +57 -0
  337. data/tasks/yard.rake +6 -0
  338. metadata +646 -0
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Dashboards::Section do
4
+
5
+ def section(options = {})
6
+ name = options.delete(:name) || "Recent Posts"
7
+ ActiveAdmin::Dashboards::Section.new(:admin, name, options){ }
8
+ end
9
+
10
+ describe "accessors" do
11
+ it "should have a namespace" do
12
+ section.namespace.should == :admin
13
+ end
14
+
15
+ it "should have a block" do
16
+ section.block.class.should == Proc
17
+ end
18
+
19
+ it "should have a name" do
20
+ section.name.should == 'Recent Posts'
21
+ end
22
+ end
23
+
24
+ describe "priority" do
25
+ context "when not set" do
26
+ subject{ section.priority }
27
+ it { should == ActiveAdmin::Dashboards::Section::DEFAULT_PRIORITY }
28
+ end
29
+
30
+ context "when set" do
31
+ subject{ section(:priority => 1).priority }
32
+ it { should == 1 }
33
+ end
34
+ end
35
+
36
+ describe "icon" do
37
+ it "should set the icon" do
38
+ s = section(:icon => :my_icon)
39
+ s.icon.should == :my_icon
40
+ end
41
+ it "should be nil by default" do
42
+ section.icon.should be_nil
43
+ end
44
+ end
45
+
46
+ describe "sorting sections" do
47
+ it "should sort by priority then alpha" do
48
+ s1 = section :name => "Woot"
49
+ s2 = section :name => :Alpha
50
+ s3 = section :name => "Zulu", :priority => 1
51
+ s4 = section :name => "Beta", :priority => 100
52
+ [s1,s2,s3,s4].sort.should == [s3, s2, s1, s4]
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Dashboards do
4
+
5
+ after(:each) do
6
+ ActiveAdmin::Dashboards.clear_all_sections!
7
+ end
8
+
9
+ describe "adding sections" do
10
+ before do
11
+ ActiveAdmin::Dashboards.clear_all_sections!
12
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
13
+ end
14
+ it "should add a new section namespaced" do
15
+ ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
16
+ end
17
+ end
18
+
19
+ describe "adding sections using the build syntax" do
20
+ before do
21
+ ActiveAdmin::Dashboards.clear_all_sections!
22
+ ActiveAdmin::Dashboards.build do
23
+ section "Recent Posts" do
24
+ end
25
+ end
26
+ end
27
+
28
+ it "should add a new section" do
29
+ ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
30
+ end
31
+ end
32
+
33
+ describe "clearing all sections" do
34
+ before do
35
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
36
+ end
37
+ it "should clear all sections" do
38
+ ActiveAdmin::Dashboards.clear_all_sections!
39
+ ActiveAdmin::Dashboards.sections.keys.should be_empty
40
+ end
41
+ end
42
+
43
+ describe "finding namespaced sections" do
44
+ context "when the namespace exists" do
45
+ before do
46
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
47
+ end
48
+ it "should return an array of sections" do
49
+ ActiveAdmin::Dashboards.sections_for_namespace(:admin).should_not be_empty
50
+ end
51
+ end
52
+
53
+ context "when the namespace does not exists" do
54
+ it "should return an empty array" do
55
+ ActiveAdmin::Dashboards.sections_for_namespace(:not_a_namespace).should be_empty
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,66 @@
1
+ require 'spec_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
+ it "should set the root path to the default namespace" do
17
+ controller.root_path.should == "/admin"
18
+ end
19
+
20
+ it "should set the root path to '/' when no default namespace" do
21
+ ActiveAdmin.application.stub!(:default_namespace => false)
22
+ controller.root_path.should == "/"
23
+ end
24
+
25
+ describe "#config" do
26
+ let(:config) { ActiveAdmin::Devise.config }
27
+
28
+ describe ":sign_out_via option" do
29
+
30
+ subject { config[:sign_out_via] }
31
+
32
+ context "when Devise does not implement sign_out_via (version < 1.2)" do
33
+ before do
34
+ ::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(false)
35
+ end
36
+
37
+ it "should not contain any customization for sign_out_via" do
38
+ config.should_not have_key(:sign_out_via)
39
+ end
40
+ end
41
+
42
+ context "when Devise implements sign_out_via (version >= 1.2)" do
43
+ before do
44
+ ::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(true)
45
+ ::Devise.stub!(:sign_out_via) { :delete }
46
+ end
47
+
48
+ it "should contain the application.logout_link_method" do
49
+ ::Devise.should_receive(:sign_out_via).and_return(:delete)
50
+ ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
51
+
52
+ config[:sign_out_via].should include(:get)
53
+ end
54
+
55
+ it "should contain Devise's logout_via_method(s)" do
56
+ ::Devise.should_receive(:sign_out_via).and_return([:delete, :post])
57
+ ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
58
+
59
+ config[:sign_out_via].should == [:delete, :post, :get]
60
+ end
61
+ end
62
+
63
+ end # describe ":sign_out_via option"
64
+ end # describe "#config"
65
+
66
+ end
@@ -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
+
6
+ setup_arbre_context!
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,256 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::FormBuilder do
4
+
5
+ setup_arbre_context!
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
+ context "when polymorphic relationship" do
68
+
69
+ let(:body) do
70
+ comment = ActiveAdmin::Comment.new
71
+
72
+ active_admin_form_for comment, :url => "admins/comments" do |f|
73
+ f.inputs :resource
74
+ end
75
+
76
+ end
77
+
78
+ it "should not generate any field" do
79
+ body.should have_tag("form", :attributes => { :method => 'post' })
80
+ body.should_not have_tag("select")
81
+ end
82
+ end
83
+
84
+ describe "passing in options" do
85
+ let :body do
86
+ build_form :html => { :multipart => true } do |f|
87
+ f.inputs :title
88
+ f.buttons
89
+ end
90
+ end
91
+ it "should pass the options on to the form" do
92
+ body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
93
+ end
94
+ end
95
+
96
+ context "with buttons" do
97
+ it "should generate the form once" do
98
+ body = build_form do |f|
99
+ f.inputs do
100
+ f.input :title
101
+ end
102
+ f.buttons
103
+ end
104
+ body.scan(/id=\"post_title\"/).size.should == 1
105
+ end
106
+ it "should generate one button and a cancel link" do
107
+ body = build_form do |f|
108
+ f.buttons
109
+ end
110
+ body.scan(/type=\"submit\"/).size.should == 1
111
+ body.scan(/class=\"cancel\"/).size.should == 1
112
+ end
113
+ it "should generate multiple buttons" do
114
+ body = build_form do |f|
115
+ f.buttons do
116
+ f.commit_button "Create & Continue"
117
+ f.commit_button "Create & Edit"
118
+ end
119
+ end
120
+ body.scan(/type=\"submit\"/).size.should == 2
121
+ body.scan(/class=\"cancel\"/).size.should == 0
122
+ end
123
+
124
+ end
125
+
126
+ context "without passing a block to inputs" do
127
+ let :body do
128
+ build_form do |f|
129
+ f.inputs :title, :body
130
+ end
131
+ end
132
+ it "should have a title input" do
133
+ body.should have_tag("input", :attributes => { :type => "text",
134
+ :name => "post[title]" })
135
+ end
136
+ it "should have a body textarea" do
137
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
138
+ end
139
+ end
140
+
141
+ context "with semantic fields for" do
142
+ let :body do
143
+ build_form do |f|
144
+ f.inputs do
145
+ f.input :title
146
+ f.input :body
147
+ end
148
+ f.instance_eval do
149
+ @object.author = User.new
150
+ end
151
+ f.semantic_fields_for :author do |author|
152
+ author.inputs :first_name, :last_name
153
+ end
154
+ end
155
+ end
156
+ it "should generate a nested text input once" do
157
+ body.scan("post_author_attributes_first_name_input").size.should == 1
158
+ end
159
+ end
160
+
161
+ context "with collection inputs" do
162
+ before do
163
+ User.create :first_name => "John", :last_name => "Doe"
164
+ User.create :first_name => "Jane", :last_name => "Doe"
165
+ end
166
+
167
+ describe "as select" do
168
+ let :body do
169
+ build_form do |f|
170
+ f.input :author
171
+ end
172
+ end
173
+ it "should create 2 options" do
174
+ body.scan(/\<option/).size.should == 3
175
+ end
176
+ end
177
+
178
+ describe "as radio buttons" do
179
+ let :body do
180
+ build_form do |f|
181
+ f.input :author, :as => :radio
182
+ end
183
+ end
184
+ it "should create 2 radio buttons" do
185
+ body.scan(/type=\"radio\"/).size.should == 2
186
+ end
187
+ end
188
+ end
189
+
190
+ context "with inputs 'for'" do
191
+ let :body do
192
+ build_form do |f|
193
+ f.inputs do
194
+ f.input :title
195
+ f.input :body
196
+ end
197
+ f.instance_eval do
198
+ @object.author = User.new
199
+ end
200
+ f.inputs :name => 'Author', :for => :author do |author|
201
+ author.inputs :first_name, :last_name
202
+ end
203
+ end
204
+ end
205
+ it "should generate a nested text input once" do
206
+ body.scan("post_author_attributes_first_name_input").size.should == 1
207
+ end
208
+ it "should add an author first name field" do
209
+ body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
210
+ end
211
+ end
212
+
213
+ context "with wrapper html" do
214
+ it "should set a class" do
215
+ body = build_form do |f|
216
+ f.input :title, :wrapper_html => { :class => "important" }
217
+ end
218
+ body.should have_tag("li", :attributes => {:class => "string optional important"})
219
+ end
220
+ end
221
+
222
+
223
+ {
224
+ "input :title, :as => :string" => /id\=\"post_title\"/,
225
+ "input :title, :as => :text" => /id\=\"post_title\"/,
226
+ "input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
227
+ "input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
228
+ "input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
229
+ }.each do |source, regex|
230
+ it "should properly buffer #{source}" do
231
+ body = build_form do |f|
232
+ f.inputs do
233
+ f.instance_eval(source)
234
+ f.instance_eval(source)
235
+ end
236
+ end
237
+ body.scan(regex).size.should == 2
238
+ end
239
+ end
240
+
241
+ describe "datepicker input" do
242
+ let :body do
243
+ build_form do |f|
244
+ f.inputs do
245
+ f.input :created_at, :as => :datepicker
246
+ end
247
+ end
248
+ end
249
+ it "should generate a text input with the class of datepicker" do
250
+ body.should have_tag("input", :attributes => { :type => "text",
251
+ :class => "datepicker",
252
+ :name => "post[created_at]" })
253
+ end
254
+ end
255
+
256
+ end