rails_admin-lbgraham 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (416) hide show
  1. data/Gemfile +51 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +175 -0
  4. data/Rakefile +19 -0
  5. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  6. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  7. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  8. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  9. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  10. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  11. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  12. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  13. data/app/assets/images/rails_admin/calendar.png +0 -0
  14. data/app/assets/images/rails_admin/clock.png +0 -0
  15. data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  16. data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  17. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  18. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  19. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  20. data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  21. data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  22. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  23. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  24. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  25. data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  26. data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  27. data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  28. data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  29. data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  30. data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  31. data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  32. data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  33. data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  34. data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  35. data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  36. data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  37. data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
  38. data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
  39. data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
  40. data/app/assets/images/rails_admin/logo.png +0 -0
  41. data/app/assets/images/rails_admin/magnifier.png +0 -0
  42. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  43. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  44. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  45. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  46. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  47. data/app/assets/javascripts/rails_admin/custom/ui.js +12 -0
  48. data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
  49. data/app/assets/javascripts/rails_admin/jquery.pjax.js +743 -0
  50. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1371 -0
  51. data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
  52. data/app/assets/javascripts/rails_admin/ra.filter-box.js +142 -0
  53. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +292 -0
  54. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +190 -0
  55. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +41 -0
  56. data/app/assets/javascripts/rails_admin/ra.remote-form.js +151 -0
  57. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +210 -0
  58. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +28 -0
  59. data/app/assets/javascripts/rails_admin/themes/cerulean/ui.js +0 -0
  60. data/app/assets/javascripts/rails_admin/themes/default/ui.js +12 -0
  61. data/app/assets/javascripts/rails_admin/ui.js.coffee +66 -0
  62. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  63. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  64. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  65. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  66. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  67. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  68. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
  69. data/app/assets/stylesheets/rails_admin/base/README.txt +2 -0
  70. data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
  71. data/app/assets/stylesheets/rails_admin/base/theming.css.scss +270 -0
  72. data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
  73. data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +12 -0
  74. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
  75. data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +15 -0
  76. data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +82 -0
  77. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +182 -0
  78. data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +69 -0
  79. data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
  80. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +90 -0
  81. data/app/assets/stylesheets/rails_admin/ra.widgets.css.scss +8 -0
  82. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  83. data/app/assets/stylesheets/rails_admin/themes/cerulean/mixins.css.scss +0 -0
  84. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.css.scss +97 -0
  85. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.css.scss +168 -0
  86. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
  87. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
  88. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
  89. data/app/controllers/rails_admin/application_controller.rb +84 -0
  90. data/app/controllers/rails_admin/main_controller.rb +153 -0
  91. data/app/helpers/rails_admin/application_helper.rb +147 -0
  92. data/app/helpers/rails_admin/form_builder.rb +117 -0
  93. data/app/helpers/rails_admin/main_helper.rb +36 -0
  94. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  95. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  96. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  97. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  98. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  99. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +12 -0
  100. data/app/views/layouts/rails_admin/application.html.haml +27 -0
  101. data/app/views/layouts/rails_admin/pjax.html.haml +16 -0
  102. data/app/views/rails_admin/main/_dashboard_history.html.haml +20 -0
  103. data/app/views/rails_admin/main/_delete_notice.html.haml +19 -0
  104. data/app/views/rails_admin/main/_form_colorpicker.html.haml +1 -0
  105. data/app/views/rails_admin/main/_form_datetime.html.haml +1 -0
  106. data/app/views/rails_admin/main/_form_enumeration.html.haml +18 -0
  107. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  108. data/app/views/rails_admin/main/_form_file_upload.html.haml +13 -0
  109. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +47 -0
  110. data/app/views/rails_admin/main/_form_filtering_select.html.haml +37 -0
  111. data/app/views/rails_admin/main/_form_nested_many.html.haml +14 -0
  112. data/app/views/rails_admin/main/_form_nested_one.html.haml +10 -0
  113. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +10 -0
  114. data/app/views/rails_admin/main/_form_text.html.haml +31 -0
  115. data/app/views/rails_admin/main/_submit_buttons.html.haml +15 -0
  116. data/app/views/rails_admin/main/bulk_delete.html.haml +11 -0
  117. data/app/views/rails_admin/main/dashboard.html.haml +35 -0
  118. data/app/views/rails_admin/main/delete.html.haml +18 -0
  119. data/app/views/rails_admin/main/edit.html.haml +2 -0
  120. data/app/views/rails_admin/main/export.html.haml +75 -0
  121. data/app/views/rails_admin/main/history.html.haml +49 -0
  122. data/app/views/rails_admin/main/index.html.haml +140 -0
  123. data/app/views/rails_admin/main/new.html.haml +2 -0
  124. data/app/views/rails_admin/main/show.html.haml +16 -0
  125. data/config/initializers/active_record_extensions.rb +19 -0
  126. data/config/initializers/devise_patch.rb +9 -0
  127. data/config/initializers/haml.rb +2 -0
  128. data/config/initializers/mongoid_extensions.rb +4 -0
  129. data/config/locales/rails_admin.en.yml +130 -0
  130. data/config/routes.rb +12 -0
  131. data/lib/generators/rails_admin/install_generator.rb +85 -0
  132. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  133. data/lib/generators/rails_admin/templates/initializer.erb +100 -0
  134. data/lib/generators/rails_admin/templates/migration.rb +18 -0
  135. data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
  136. data/lib/generators/rails_admin/utils.rb +30 -0
  137. data/lib/rails_admin.rb +34 -0
  138. data/lib/rails_admin/abstract_model.rb +128 -0
  139. data/lib/rails_admin/adapters/active_record.rb +296 -0
  140. data/lib/rails_admin/adapters/active_record/abstract_object.rb +32 -0
  141. data/lib/rails_admin/adapters/mongoid.rb +430 -0
  142. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +43 -0
  143. data/lib/rails_admin/adapters/mongoid/extension.rb +45 -0
  144. data/lib/rails_admin/config.rb +333 -0
  145. data/lib/rails_admin/config/actions.rb +121 -0
  146. data/lib/rails_admin/config/actions/base.rb +132 -0
  147. data/lib/rails_admin/config/actions/bulk_delete.rb +55 -0
  148. data/lib/rails_admin/config/actions/dashboard.rb +52 -0
  149. data/lib/rails_admin/config/actions/delete.rb +56 -0
  150. data/lib/rails_admin/config/actions/edit.rb +55 -0
  151. data/lib/rails_admin/config/actions/export.rb +40 -0
  152. data/lib/rails_admin/config/actions/history_index.rb +38 -0
  153. data/lib/rails_admin/config/actions/history_show.rb +38 -0
  154. data/lib/rails_admin/config/actions/index.rb +85 -0
  155. data/lib/rails_admin/config/actions/new.rb +65 -0
  156. data/lib/rails_admin/config/actions/show.rb +34 -0
  157. data/lib/rails_admin/config/actions/show_in_app.rb +27 -0
  158. data/lib/rails_admin/config/configurable.rb +92 -0
  159. data/lib/rails_admin/config/fields.rb +87 -0
  160. data/lib/rails_admin/config/fields/association.rb +107 -0
  161. data/lib/rails_admin/config/fields/base.rb +320 -0
  162. data/lib/rails_admin/config/fields/factories/association.rb +32 -0
  163. data/lib/rails_admin/config/fields/factories/carrierwave.rb +31 -0
  164. data/lib/rails_admin/config/fields/factories/devise.rb +27 -0
  165. data/lib/rails_admin/config/fields/factories/dragonfly.rb +27 -0
  166. data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
  167. data/lib/rails_admin/config/fields/factories/paperclip.rb +26 -0
  168. data/lib/rails_admin/config/fields/factories/password.rb +17 -0
  169. data/lib/rails_admin/config/fields/group.rb +78 -0
  170. data/lib/rails_admin/config/fields/types.rb +27 -0
  171. data/lib/rails_admin/config/fields/types/all.rb +25 -0
  172. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +41 -0
  173. data/lib/rails_admin/config/fields/types/boolean.rb +38 -0
  174. data/lib/rails_admin/config/fields/types/bson_object_id.rb +45 -0
  175. data/lib/rails_admin/config/fields/types/carrierwave.rb +31 -0
  176. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  177. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  178. data/lib/rails_admin/config/fields/types/datetime.rb +164 -0
  179. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  180. data/lib/rails_admin/config/fields/types/dragonfly.rb +41 -0
  181. data/lib/rails_admin/config/fields/types/enum.rb +39 -0
  182. data/lib/rails_admin/config/fields/types/file_upload.rb +65 -0
  183. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  184. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  185. data/lib/rails_admin/config/fields/types/has_many_association.rb +32 -0
  186. data/lib/rails_admin/config/fields/types/has_one_association.rb +39 -0
  187. data/lib/rails_admin/config/fields/types/hidden.rb +27 -0
  188. data/lib/rails_admin/config/fields/types/integer.rb +22 -0
  189. data/lib/rails_admin/config/fields/types/paperclip.rb +28 -0
  190. data/lib/rails_admin/config/fields/types/password.rb +39 -0
  191. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +80 -0
  192. data/lib/rails_admin/config/fields/types/serialized.rb +22 -0
  193. data/lib/rails_admin/config/fields/types/string.rb +43 -0
  194. data/lib/rails_admin/config/fields/types/text.rb +97 -0
  195. data/lib/rails_admin/config/fields/types/time.rb +36 -0
  196. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  197. data/lib/rails_admin/config/groupable.rb +18 -0
  198. data/lib/rails_admin/config/has_fields.rb +136 -0
  199. data/lib/rails_admin/config/has_groups.rb +23 -0
  200. data/lib/rails_admin/config/hideable.rb +28 -0
  201. data/lib/rails_admin/config/lazy_model.rb +21 -0
  202. data/lib/rails_admin/config/model.rb +109 -0
  203. data/lib/rails_admin/config/proxyable.rb +12 -0
  204. data/lib/rails_admin/config/proxyable/proxy.rb +43 -0
  205. data/lib/rails_admin/config/sections.rb +39 -0
  206. data/lib/rails_admin/config/sections/base.rb +46 -0
  207. data/lib/rails_admin/config/sections/create.rb +11 -0
  208. data/lib/rails_admin/config/sections/edit.rb +11 -0
  209. data/lib/rails_admin/config/sections/export.rb +11 -0
  210. data/lib/rails_admin/config/sections/list.rb +27 -0
  211. data/lib/rails_admin/config/sections/modal.rb +10 -0
  212. data/lib/rails_admin/config/sections/nested.rb +10 -0
  213. data/lib/rails_admin/config/sections/show.rb +10 -0
  214. data/lib/rails_admin/config/sections/update.rb +10 -0
  215. data/lib/rails_admin/engine.rb +27 -0
  216. data/lib/rails_admin/extension.rb +29 -0
  217. data/lib/rails_admin/extensions/cancan.rb +5 -0
  218. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +59 -0
  219. data/lib/rails_admin/extensions/history.rb +5 -0
  220. data/lib/rails_admin/extensions/history/auditing_adapter.rb +37 -0
  221. data/lib/rails_admin/extensions/history/history.rb +36 -0
  222. data/lib/rails_admin/extensions/paper_trail.rb +5 -0
  223. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +93 -0
  224. data/lib/rails_admin/i18n_support.rb +43 -0
  225. data/lib/rails_admin/support/core_extensions.rb +44 -0
  226. data/lib/rails_admin/support/csv_converter.rb +105 -0
  227. data/lib/rails_admin/version.rb +18 -0
  228. data/lib/tasks/rails_admin.rake +48 -0
  229. data/spec/ci.sh +2 -0
  230. data/spec/controllers/rails_admin/application_controller_spec.rb +30 -0
  231. data/spec/controllers/rails_admin/main_controller_spec.rb +337 -0
  232. data/spec/dummy_app/Gemfile +48 -0
  233. data/spec/dummy_app/Rakefile +7 -0
  234. data/spec/dummy_app/app/active_record/abstract.rb +5 -0
  235. data/spec/dummy_app/app/active_record/another_field_test.rb +4 -0
  236. data/spec/dummy_app/app/active_record/ball.rb +9 -0
  237. data/spec/dummy_app/app/active_record/carrierwave_uploader.rb +53 -0
  238. data/spec/dummy_app/app/active_record/category.rb +5 -0
  239. data/spec/dummy_app/app/active_record/cms.rb +5 -0
  240. data/spec/dummy_app/app/active_record/cms/basic_page.rb +9 -0
  241. data/spec/dummy_app/app/active_record/cms/unscoped_page.rb +3 -0
  242. data/spec/dummy_app/app/active_record/comment.rb +5 -0
  243. data/spec/dummy_app/app/active_record/comment/confirmed.rb +3 -0
  244. data/spec/dummy_app/app/active_record/division.rb +15 -0
  245. data/spec/dummy_app/app/active_record/draft.rb +13 -0
  246. data/spec/dummy_app/app/active_record/fan.rb +7 -0
  247. data/spec/dummy_app/app/active_record/field_test.rb +19 -0
  248. data/spec/dummy_app/app/active_record/hardball.rb +2 -0
  249. data/spec/dummy_app/app/active_record/image.rb +6 -0
  250. data/spec/dummy_app/app/active_record/league.rb +12 -0
  251. data/spec/dummy_app/app/active_record/nested_field_test.rb +8 -0
  252. data/spec/dummy_app/app/active_record/player.rb +27 -0
  253. data/spec/dummy_app/app/active_record/team.rb +28 -0
  254. data/spec/dummy_app/app/active_record/user.rb +25 -0
  255. data/spec/dummy_app/app/assets/images/rails.png +0 -0
  256. data/spec/dummy_app/app/assets/javascripts/application.js +15 -0
  257. data/spec/dummy_app/app/assets/stylesheets/application.css +13 -0
  258. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  259. data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
  260. data/spec/dummy_app/app/locales/models.en.yml +20 -0
  261. data/spec/dummy_app/app/mongoid/another_field_test.rb +6 -0
  262. data/spec/dummy_app/app/mongoid/ball.rb +14 -0
  263. data/spec/dummy_app/app/mongoid/carrierwave_uploader.rb +53 -0
  264. data/spec/dummy_app/app/mongoid/category.rb +7 -0
  265. data/spec/dummy_app/app/mongoid/cms.rb +5 -0
  266. data/spec/dummy_app/app/mongoid/cms/basic_page.rb +12 -0
  267. data/spec/dummy_app/app/mongoid/cms/unscoped_page.rb +5 -0
  268. data/spec/dummy_app/app/mongoid/comment.rb +9 -0
  269. data/spec/dummy_app/app/mongoid/comment/confirmed.rb +3 -0
  270. data/spec/dummy_app/app/mongoid/division.rb +14 -0
  271. data/spec/dummy_app/app/mongoid/draft.rb +22 -0
  272. data/spec/dummy_app/app/mongoid/embed.rb +6 -0
  273. data/spec/dummy_app/app/mongoid/fan.rb +12 -0
  274. data/spec/dummy_app/app/mongoid/field_test.rb +57 -0
  275. data/spec/dummy_app/app/mongoid/hardball.rb +2 -0
  276. data/spec/dummy_app/app/mongoid/image.rb +9 -0
  277. data/spec/dummy_app/app/mongoid/league.rb +16 -0
  278. data/spec/dummy_app/app/mongoid/nested_field_test.rb +13 -0
  279. data/spec/dummy_app/app/mongoid/player.rb +41 -0
  280. data/spec/dummy_app/app/mongoid/team.rb +47 -0
  281. data/spec/dummy_app/app/mongoid/user.rb +61 -0
  282. data/spec/dummy_app/app/views/layouts/application.html.erb +14 -0
  283. data/spec/dummy_app/app/views/players/show.html.haml +1 -0
  284. data/spec/dummy_app/config.ru +4 -0
  285. data/spec/dummy_app/config/application.rb +69 -0
  286. data/spec/dummy_app/config/boot.rb +9 -0
  287. data/spec/dummy_app/config/database.yml +25 -0
  288. data/spec/dummy_app/config/environment.rb +5 -0
  289. data/spec/dummy_app/config/environments/development.rb +37 -0
  290. data/spec/dummy_app/config/environments/production.rb +67 -0
  291. data/spec/dummy_app/config/environments/test.rb +37 -0
  292. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  293. data/spec/dummy_app/config/initializers/devise.rb +216 -0
  294. data/spec/dummy_app/config/initializers/dragonfly.rb +11 -0
  295. data/spec/dummy_app/config/initializers/inflections.rb +15 -0
  296. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  297. data/spec/dummy_app/config/initializers/rails_admin.rb +8 -0
  298. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  299. data/spec/dummy_app/config/initializers/session_patch.rb +16 -0
  300. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  301. data/spec/dummy_app/config/initializers/strong_parameters.rb +2 -0
  302. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  303. data/spec/dummy_app/config/locales/fr.yml +24 -0
  304. data/spec/dummy_app/config/mongoid.yml +22 -0
  305. data/spec/dummy_app/config/routes.rb +10 -0
  306. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  307. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  308. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  309. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  310. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  311. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +49 -0
  312. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  313. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  314. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  315. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  316. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  317. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  318. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  319. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  320. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  321. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  322. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  323. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  324. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  325. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  326. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  327. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  328. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  329. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  330. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  331. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  332. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  333. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  334. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  335. data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
  336. data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
  337. data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
  338. data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
  339. data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
  340. data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
  341. data/spec/dummy_app/db/migrate/20120319041705_drop_rel_tests.rb +15 -0
  342. data/spec/dummy_app/db/migrate/20120720075608_create_another_field_tests.rb +8 -0
  343. data/spec/dummy_app/db/migrate/20120928075608_create_images.rb +8 -0
  344. data/spec/dummy_app/db/seeds.rb +29 -0
  345. data/spec/dummy_app/doc/README_FOR_APP +2 -0
  346. data/spec/dummy_app/public/404.html +26 -0
  347. data/spec/dummy_app/public/422.html +26 -0
  348. data/spec/dummy_app/public/500.html +25 -0
  349. data/spec/dummy_app/public/favicon.ico +0 -0
  350. data/spec/dummy_app/public/robots.txt +5 -0
  351. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
  352. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
  353. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
  354. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
  355. data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
  356. data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
  357. data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
  358. data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
  359. data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
  360. data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
  361. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
  362. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
  363. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
  364. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
  365. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
  366. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
  367. data/spec/dummy_app/script/rails +6 -0
  368. data/spec/factories.rb +75 -0
  369. data/spec/helpers/rails_admin/application_helper_spec.rb +353 -0
  370. data/spec/helpers/rails_admin/form_builder_spec.rb +17 -0
  371. data/spec/integration/authorization/cancan_spec.rb +366 -0
  372. data/spec/integration/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  373. data/spec/integration/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +53 -0
  374. data/spec/integration/basic/create/rails_admin_basic_create_spec.rb +140 -0
  375. data/spec/integration/basic/create/rails_admin_namespaced_model_create_spec.rb +16 -0
  376. data/spec/integration/basic/delete/rails_admin_basic_delete_spec.rb +64 -0
  377. data/spec/integration/basic/destroy/rails_admin_basic_destroy_spec.rb +84 -0
  378. data/spec/integration/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
  379. data/spec/integration/basic/export/rails_admin_basic_export_spec.rb +106 -0
  380. data/spec/integration/basic/list/rails_admin_basic_list_spec.rb +444 -0
  381. data/spec/integration/basic/new/rails_admin_basic_new_spec.rb +73 -0
  382. data/spec/integration/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  383. data/spec/integration/basic/show/rails_admin_basic_show_spec.rb +82 -0
  384. data/spec/integration/basic/update/rails_admin_basic_update_spec.rb +229 -0
  385. data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +1026 -0
  386. data/spec/integration/config/list/rails_admin_config_list_spec.rb +441 -0
  387. data/spec/integration/config/show/rails_admin_config_show_spec.rb +331 -0
  388. data/spec/integration/history/rails_admin_history_spec.rb +88 -0
  389. data/spec/integration/rails_admin_spec.rb +150 -0
  390. data/spec/integration/relation_spec.rb +35 -0
  391. data/spec/orm/active_record.rb +42 -0
  392. data/spec/orm/mongoid.rb +21 -0
  393. data/spec/rails_admin/abstract_model_spec.rb +75 -0
  394. data/spec/rails_admin/active_record_extension_spec.rb +16 -0
  395. data/spec/rails_admin/adapters/active_record/abstract_object_spec.rb +132 -0
  396. data/spec/rails_admin/adapters/active_record_spec.rb +409 -0
  397. data/spec/rails_admin/adapters/mongoid/abstract_object_spec.rb +31 -0
  398. data/spec/rails_admin/adapters/mongoid_spec.rb +776 -0
  399. data/spec/rails_admin/config/actions/base_spec.rb +32 -0
  400. data/spec/rails_admin/config/actions_spec.rb +180 -0
  401. data/spec/rails_admin/config/fields/base_spec.rb +421 -0
  402. data/spec/rails_admin/config/fields/date_spec.rb +74 -0
  403. data/spec/rails_admin/config/fields/datetime_spec.rb +55 -0
  404. data/spec/rails_admin/config/fields/file_upload_spec.rb +21 -0
  405. data/spec/rails_admin/config/fields/time_spec.rb +39 -0
  406. data/spec/rails_admin/config/fields/timestamp_spec.rb +20 -0
  407. data/spec/rails_admin/config/fields/types/datetime_spec.rb +18 -0
  408. data/spec/rails_admin/config/fields_spec.rb +15 -0
  409. data/spec/rails_admin/config/has_fields_spec.rb +30 -0
  410. data/spec/rails_admin/config/lazy_model_spec.rb +29 -0
  411. data/spec/rails_admin/config/model_spec.rb +75 -0
  412. data/spec/rails_admin/config/sections_spec.rb +123 -0
  413. data/spec/rails_admin/config_spec.rb +277 -0
  414. data/spec/rails_admin/support/csv_converter_spec.rb +16 -0
  415. data/spec/spec_helper.rb +84 -0
  416. metadata +868 -0
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic New" do
4
+
5
+ subject { page }
6
+
7
+ describe "GET /admin/player/new" do
8
+ before(:each) do
9
+ visit new_path(:model_name => "player")
10
+ end
11
+
12
+ it "shows \"New Model\"" do
13
+ should have_content("New Player")
14
+ end
15
+
16
+ it "shows required fields as \"Required\"" do
17
+ should have_selector("div", :text => /Name\s*Required/)
18
+ should have_selector("div", :text => /Number\s*Required/)
19
+ end
20
+
21
+ it "shows non-required fields as \"Optional\"" do
22
+ should have_selector("#player_position_field .help-block", :text => "Optional")
23
+ should have_selector("#player_born_on_field .help-block", :text => "Optional")
24
+ should have_selector("#player_notes_field .help-block", :text => "Optional")
25
+ end
26
+
27
+ # https://github.com/sferik/rails_admin/issues/362
28
+ # test that no link uses the "wildcard route" with the main
29
+ # controller and new method
30
+ it "does not use the 'wildcard route'" do
31
+ should have_no_selector("a[href^='/rails_admin/main/new']")
32
+ end
33
+ end
34
+
35
+ describe "GET /admin/player/new with has-one/belongs_to/has_many association" do
36
+ before(:each) do
37
+ FactoryGirl.create :draft
38
+ visit new_path(:model_name => "player")
39
+ end
40
+
41
+ it "shows selects" do
42
+ should have_selector("select#player_draft_id")
43
+ should have_selector("select#player_team_id")
44
+ should have_selector("select#player_comment_ids")
45
+ end
46
+ end
47
+
48
+ describe "GET /admin/player/new with missing label" do
49
+ before(:each) do
50
+ FactoryGirl.create :team, :name => ""
51
+ visit new_path(:model_name => "player")
52
+ end
53
+ end
54
+
55
+ describe "GET /admin/player/new with parameters for pre-population" do
56
+ it "populates form field when corresponding parameters are passed in" do
57
+ visit new_path(:model_name => 'player', :player => {:name => 'Sam'})
58
+ expect(page).to have_css('input[value=Sam]')
59
+ end
60
+
61
+ it "prepropulates belongs to relationships" do
62
+ @team = FactoryGirl.create :team, :name => "belongs_to association prepopulated"
63
+ visit new_path(:model_name => 'player', :associations => { :team => @team.id } )
64
+ expect(page).to have_css("select#player_team_id option[selected='selected'][value='#{@team.id}']")
65
+ end
66
+
67
+ it "prepropulates has_many relationships" do
68
+ @player = FactoryGirl.create :player, :name => "has_many association prepopulated"
69
+ visit new_path(:model_name => 'team', :associations => { :players => @player.id } )
70
+ expect(page).to have_css("select#team_player_ids option[selected='selected'][value='#{@player.id}']")
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Namespaced Model New" do
4
+
5
+ subject { page }
6
+
7
+ describe "AbstractModel#to_param" do
8
+ it "turns namespaces into prefixes with ~" do
9
+ expect(RailsAdmin::AbstractModel.new("Cms::BasicPage").to_param).to eq('cms~basic_page')
10
+ end
11
+ end
12
+
13
+ describe "ApplicationController#to_model_name" do
14
+ it "turns cms~basic_page into Cms::BasicPage" do
15
+ expect(RailsAdmin::ApplicationController.new.to_model_name('cms~basic_page')).to eq('Cms::BasicPage')
16
+ end
17
+ end
18
+
19
+ describe "GET /admin/cms_basic_page/new" do
20
+ before(:each) do
21
+ visit new_path(:model_name => "cms~basic_page")
22
+ end
23
+
24
+ it "has correct input field names" do
25
+ should have_selector("label[for=cms_basic_page_title]")
26
+ should have_selector("input#cms_basic_page_title[name='cms_basic_page[title]']")
27
+ should have_selector("label[for=cms_basic_page_content]")
28
+ should have_selector("textarea#cms_basic_page_content[name='cms_basic_page[content]']")
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,82 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Show" do
4
+ subject { page }
5
+
6
+ describe "show" do
7
+ it "has History, Edit, Delete, Details and attributes" do
8
+ @player = FactoryGirl.create :player
9
+ visit show_path(:model_name => "player", :id => @player.id)
10
+
11
+ should have_selector("a", :text => "History")
12
+ should have_selector("a", :text => "Edit")
13
+ should have_selector("a", :text => "Delete")
14
+ should have_content("Details")
15
+ should have_content("Name")
16
+ should have_content(@player.name)
17
+ should have_content("Number")
18
+ should have_content(@player.number)
19
+ end
20
+ end
21
+
22
+ describe "GET /admin/players/123this-id-doesnt-exist" do
23
+ it "raises NotFound" do
24
+ visit '/admin/players/123this-id-doesnt-exist'
25
+ expect(page.driver.status_code).to eq(404)
26
+ end
27
+ end
28
+
29
+ describe "show with belongs_to association" do
30
+ before(:each) do
31
+ @player = FactoryGirl.create :player
32
+ @team = FactoryGirl.create :team
33
+ @player.update_attributes(:team_id => @team.id)
34
+ visit show_path(:model_name => "player", :id => @player.id)
35
+ end
36
+
37
+ it "shows associated objects" do
38
+ should have_css("a[href='/admin/team/#{@team.id}']")
39
+ end
40
+ end
41
+
42
+ describe "show with has-one association" do
43
+ before(:each) do
44
+ @player = FactoryGirl.create :player
45
+ @draft = FactoryGirl.create :draft, :player => @player
46
+ visit show_path(:model_name => "player", :id => @player.id)
47
+ end
48
+
49
+ it "shows associated objects" do
50
+ should have_css("a[href='/admin/draft/#{@draft.id}']")
51
+ end
52
+ end
53
+
54
+ describe "show with has-and-belongs-to-many association" do
55
+ before(:each) do
56
+ @player = FactoryGirl.create :player
57
+ @comment1 = FactoryGirl.create :comment, :commentable => @player
58
+ @comment2 = FactoryGirl.create :comment, :commentable => @player
59
+ @comment3 = FactoryGirl.create :comment, :commentable => FactoryGirl.create(:player)
60
+
61
+ visit show_path(:model_name => "player", :id => @player.id)
62
+ end
63
+
64
+ it "shows associated objects" do
65
+ should have_css("a[href='/admin/comment/#{@comment1.id}']")
66
+ should have_css("a[href='/admin/comment/#{@comment2.id}']")
67
+ should_not have_css("a[href='/admin/comment/#{@comment3.id}']")
68
+ end
69
+ end
70
+
71
+ describe "show for polymorphic objects" do
72
+ before(:each) do
73
+ @player = FactoryGirl.create :player
74
+ @comment = FactoryGirl.create :comment, :commentable => @player
75
+ visit show_path(:model_name => "comment", :id => @comment.id)
76
+ end
77
+
78
+ it "shows associated object" do
79
+ should have_css("a[href='/admin/player/#{@player.id}']")
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,229 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Update" do
4
+
5
+ subject { page }
6
+
7
+ describe "update with errors" do
8
+ before(:each) do
9
+ @player = FactoryGirl.create :player
10
+ visit edit_path(:model_name => "player", :id => @player.id)
11
+ end
12
+
13
+ it "returns to edit page" do
14
+ fill_in "player[name]", :with => ""
15
+ click_button "Save" # first(:button, "Save").click
16
+ expect(page.driver.status_code).to eq(406)
17
+ should have_selector "form[action='#{edit_path(:model_name => "player", :id => @player.id)}']"
18
+ end
19
+ end
20
+
21
+ describe "update and add another" do
22
+ before(:each) do
23
+ @player = FactoryGirl.create :player
24
+
25
+ visit edit_path(:model_name => "player", :id => @player.id)
26
+
27
+ fill_in "player[name]", :with => "Jackie Robinson"
28
+ fill_in "player[number]", :with => "42"
29
+ fill_in "player[position]", :with => "Second baseman"
30
+ click_button "Save" # first(:button, "Save").click
31
+
32
+ @player = RailsAdmin::AbstractModel.new("Player").first
33
+ end
34
+
35
+ it "updates an object with correct attributes" do
36
+ expect(@player.name).to eq("Jackie Robinson")
37
+ expect(@player.number).to eq(42)
38
+ expect(@player.position).to eq("Second baseman")
39
+ end
40
+ end
41
+
42
+ describe "update and edit" do
43
+ before(:each) do
44
+ @player = FactoryGirl.create :player
45
+
46
+ visit edit_path(:model_name => "player", :id => @player.id)
47
+
48
+ fill_in "player[name]", :with => "Jackie Robinson"
49
+ fill_in "player[number]", :with => "42"
50
+ fill_in "player[position]", :with => "Second baseman"
51
+ click_button "Save and edit"
52
+
53
+ @player.reload
54
+ end
55
+
56
+ it "updates an object with correct attributes" do
57
+ expect(@player.name).to eq("Jackie Robinson")
58
+ expect(@player.number).to eq(42)
59
+ expect(@player.position).to eq("Second baseman")
60
+ end
61
+ end
62
+
63
+ describe "update with has-one association" do
64
+ before(:each) do
65
+ @player = FactoryGirl.create :player
66
+ @draft = FactoryGirl.create :draft
67
+ @number = @draft.player.number + 1 # to avoid collision
68
+ put edit_path(:model_name => "player", :id => @player.id, :player => {:name => "Jackie Robinson", :draft_id => @draft.id, :number => @number, :position => "Second baseman"})
69
+ @player.reload
70
+ end
71
+
72
+ it "updates an object with correct attributes" do
73
+ expect(@player.name).to eq("Jackie Robinson")
74
+ expect(@player.number).to eq(@number)
75
+ expect(@player.position).to eq("Second baseman")
76
+ end
77
+
78
+ it "updates an object with correct associations" do
79
+ @draft.reload
80
+ expect(@player.draft).to eq(@draft)
81
+ end
82
+ end
83
+
84
+ describe "update with has-many association" do
85
+ it "is fillable and emptyable", :active_record => true do
86
+ RailsAdmin.config do |c|
87
+ c.audit_with :history
88
+ end
89
+
90
+ @league = FactoryGirl.create :league
91
+ @divisions = 3.times.map { Division.create!(:name => "div #{Time.now.to_f}", :league => League.create!(:name => "league #{Time.now.to_f}")) }
92
+
93
+ put edit_path(:model_name => "league", :id => @league.id, :league => {:name => "National League", :division_ids => [@divisions[0].id] })
94
+
95
+ old_name = @league.name
96
+ @league.reload
97
+ expect(@league.name).to eq("National League")
98
+ @divisions[0].reload
99
+ expect(@league.divisions).to include(@divisions[0])
100
+ expect(@league.divisions).not_to include(@divisions[1])
101
+ expect(@league.divisions).not_to include(@divisions[2])
102
+
103
+ expect(RailsAdmin::History.where(:item => @league.id).collect(&:message)).to include("name: \"#{old_name}\" -> \"National League\"")
104
+
105
+ put edit_path(:model_name => "league", :id => @league.id, :league => {:division_ids => [""]})
106
+
107
+ @league.reload
108
+ expect(@league.divisions).to be_empty
109
+ end
110
+ end
111
+
112
+ describe "update with missing object" do
113
+ before(:each) do
114
+ put edit_path(:model_name => "player", :id => 1), :params => {:player => {:name => "Jackie Robinson", :number => 42, :position => "Second baseman"}}
115
+ end
116
+
117
+ it "raises NotFound" do
118
+ expect(response.code).to eq("404")
119
+ end
120
+ end
121
+
122
+ describe "update with invalid object" do
123
+ before(:each) do
124
+ @player = FactoryGirl.create :player
125
+
126
+ visit edit_path(:model_name => "player", :id => @player.id)
127
+
128
+ fill_in "player[name]", :with => "Jackie Robinson"
129
+ fill_in "player[number]", :with => "a"
130
+ fill_in "player[position]", :with => "Second baseman"
131
+ click_button "Save" # first(:button, "Save").click
132
+
133
+ @player.reload
134
+ end
135
+
136
+ it "shows an error message" do
137
+ # TODO: Mongoid 3.0.0 lacks ability of numericality validation on Integer field.
138
+ # This is caused by change in https://github.com/mongoid/mongoid/pull/1698
139
+ # I believe this should be a bug in Mongoid.
140
+ expect(Capybara.string(body)).to have_content("Player failed to be updated") unless CI_ORM == :mongoid && Mongoid::VERSION >= '3.0.0'
141
+ end
142
+ end
143
+
144
+ describe "update with serialized objects" do
145
+ before(:each) do
146
+ RailsAdmin.config do |c|
147
+ c.model User do
148
+ configure :roles, :serialized
149
+ end
150
+ end
151
+
152
+ @user = FactoryGirl.create :user
153
+
154
+ visit edit_path(:model_name => "user", :id => @user.id)
155
+
156
+ fill_in "user[roles]", :with => %{['admin', 'user']}
157
+ click_button "Save" # first(:button, "Save").click
158
+
159
+ @user.reload
160
+ end
161
+
162
+ it "saves the serialized data" do
163
+ expect(@user.roles).to eq(['admin','user'])
164
+ end
165
+ end
166
+
167
+ describe "update with serialized objects of Mongoid", :mongoid => true do
168
+ before(:each) do
169
+ @field_test = FactoryGirl.create :field_test
170
+
171
+ visit edit_path(:model_name => "field_test", :id => @field_test.id)
172
+ end
173
+
174
+ it "saves the serialized data" do
175
+ fill_in "field_test[array_field]", :with => "[4, 2]"
176
+ fill_in "field_test[hash_field]", :with => "{ a: 6, b: 2 }"
177
+ click_button "Save" # first(:button, "Save").click
178
+
179
+ @field_test.reload
180
+ expect(@field_test.array_field).to eq([4, 2])
181
+ expect(@field_test.hash_field).to eq({ "a" => 6, "b" => 2 })
182
+ end
183
+
184
+ it "clears data when empty string is passed" do
185
+ fill_in "field_test[array_field]", :with => ""
186
+ fill_in "field_test[hash_field]", :with => ""
187
+ click_button "Save" # first(:button, "Save").click
188
+
189
+ @field_test.reload
190
+ expect(@field_test.array_field).to eq(nil)
191
+ expect(@field_test.hash_field).to eq(nil)
192
+ end
193
+ end
194
+
195
+ describe "update with overridden to_param" do
196
+ before(:each) do
197
+ @ball = FactoryGirl.create :ball
198
+
199
+ visit edit_path(:model_name => "ball", :id => @ball.id)
200
+
201
+ fill_in "ball[color]", :with => "gray"
202
+ click_button "Save and edit"
203
+
204
+ @ball.reload
205
+ end
206
+
207
+ it "updates an object with correct attributes" do
208
+ expect(@ball.color).to eq("gray")
209
+ end
210
+ end
211
+
212
+ describe "update of STI subclass on superclass view" do
213
+ before(:each) do
214
+ @hardball = FactoryGirl.create :hardball
215
+
216
+ visit edit_path(:model_name => "ball", :id => @hardball.id)
217
+
218
+ fill_in "ball[color]", :with => "cyan"
219
+ click_button "Save and edit"
220
+
221
+ @hardball.reload
222
+ end
223
+
224
+ it "updates an object with correct attributes" do
225
+ expect(@hardball.color).to eq("cyan")
226
+ end
227
+ end
228
+
229
+ end
@@ -0,0 +1,1026 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "RailsAdmin Config DSL Edit Section" do
6
+
7
+ subject { page }
8
+
9
+ describe " a field with 'format' as a name (Kernel function)" do
10
+
11
+ it "is updatable without any error" do
12
+ RailsAdmin.config FieldTest do
13
+ edit do
14
+ field :format
15
+ end
16
+ end
17
+ visit new_path(:model_name => "field_test")
18
+ fill_in "field_test[format]", :with => "test for format"
19
+ click_button "Save" # first(:button, "Save").click
20
+ @record = RailsAdmin::AbstractModel.new("FieldTest").first
21
+ expect(@record.format).to eq("test for format")
22
+ end
23
+ end
24
+
25
+ describe "default_value" do
26
+
27
+ it "is set for all types of input fields" do
28
+ RailsAdmin.config do |config|
29
+ config.excluded_models = []
30
+ config.model(FieldTest) do
31
+
32
+ field :string_field do
33
+ default_value 'string_field default_value'
34
+ end
35
+ field :text_field do
36
+ default_value 'string_field text_field'
37
+ end
38
+ field :boolean_field do
39
+ default_value true
40
+ end
41
+ field :date_field do
42
+ default_value Date.today
43
+ end
44
+ end
45
+ end
46
+
47
+ visit new_path(:model_name => "field_test")
48
+ # In Rails 3.2.3 behavior of textarea has changed to insert newline after the opening tag,
49
+ # but Capybara's RackTest driver is not up to this behavior change.
50
+ # (https://github.com/jnicklas/capybara/issues/677)
51
+ # So we manually cut off first newline character as a workaround here.
52
+ expect(find_field('field_test[string_field]').value.gsub(/^\n/, '')).to eq('string_field default_value')
53
+ expect(find_field('field_test[text_field]').value.gsub(/^\n/, '')).to eq('string_field text_field')
54
+ expect(find_field('field_test[date_field]').value).to eq(Date.today.to_s)
55
+ expect(has_checked_field?('field_test[boolean_field]')).to be_true
56
+ end
57
+
58
+ it "sets default value for selects" do
59
+ RailsAdmin.config(Team) do
60
+ field :color, :enum do
61
+ default_value 'black'
62
+ enum do
63
+ ['black', 'white']
64
+ end
65
+ end
66
+ end
67
+ visit new_path(:model_name => "team")
68
+ expect(find_field('team[color]').value).to eq('black')
69
+ end
70
+ end
71
+
72
+ describe "attr_accessible" do
73
+
74
+
75
+ it "is configurable in the controller scope" do
76
+
77
+ RailsAdmin.config do |config|
78
+ config.excluded_models = []
79
+ config.attr_accessible_role do
80
+ _current_user.attr_accessible_role # sould be :custom_role
81
+ end
82
+
83
+ config.model FieldTest do
84
+ edit do
85
+ field :string_field
86
+ field :restricted_field
87
+ field :protected_field
88
+ end
89
+ end
90
+ end
91
+
92
+ visit new_path(:model_name => "field_test")
93
+ fill_in "field_test[string_field]", :with => "No problem here"
94
+ fill_in "field_test[restricted_field]", :with => "I'm allowed to do that as :custom_role only"
95
+ should have_no_selector "field_test[protected_field]"
96
+ click_button "Save" # first(:button, "Save").click
97
+ @field_test = FieldTest.first
98
+ expect(@field_test.string_field).to eq("No problem here")
99
+ expect(@field_test.restricted_field).to eq("I'm allowed to do that as :custom_role only")
100
+ end
101
+ end
102
+
103
+ describe "css hooks" do
104
+ it "is present" do
105
+ visit new_path(:model_name => "team")
106
+ should have_selector("#team_division_id_field.belongs_to_association_type.division_field")
107
+ end
108
+ end
109
+
110
+ describe "field groupings" do
111
+
112
+ it "is hideable" do
113
+ RailsAdmin.config Team do
114
+ edit do
115
+ group :default do
116
+ label "Hidden group"
117
+ hide
118
+ end
119
+ end
120
+ end
121
+ visit new_path(:model_name => "team")
122
+ # Should not have the group header
123
+ should have_no_selector("legend", :text => "Hidden Group")
124
+ # Should not have any of the group's fields either
125
+ should have_no_selector("select#team_division")
126
+ should have_no_selector("input#team_name")
127
+ should have_no_selector("input#team_logo_url")
128
+ should have_no_selector("input#team_manager")
129
+ should have_no_selector("input#team_ballpark")
130
+ should have_no_selector("input#team_mascot")
131
+ should have_no_selector("input#team_founded")
132
+ should have_no_selector("input#team_wins")
133
+ should have_no_selector("input#team_losses")
134
+ should have_no_selector("input#team_win_percentage")
135
+ should have_no_selector("input#team_revenue")
136
+ end
137
+
138
+ it "hides association groupings" do
139
+ RailsAdmin.config Team do
140
+ edit do
141
+ group :players do
142
+ label "Players"
143
+ field :players
144
+ hide
145
+ end
146
+ end
147
+ end
148
+ visit new_path(:model_name => "team")
149
+ # Should not have the group header
150
+ should have_no_selector("legend", :text => "Players")
151
+ # Should not have any of the group's fields either
152
+ should have_no_selector("select#team_player_ids")
153
+ end
154
+
155
+ it "is renameable" do
156
+ RailsAdmin.config Team do
157
+ edit do
158
+ group :default do
159
+ label "Renamed group"
160
+ end
161
+ end
162
+ end
163
+ visit new_path(:model_name => "team")
164
+ # NOTE: capybara 2.0 is exceedingly reluctant to reveal the text of invisible elements. This was
165
+ # the least terrible option I was able to find. It would probably be better to refactor the test
166
+ # so the label we're looking for is displayed.
167
+ expect(find("legend", :visible => false).native.text).to include("Renamed group")
168
+ end
169
+
170
+ describe "help" do
171
+ before(:each) do
172
+ class HelpTest < Tableless
173
+ column :name, 'string(50)'
174
+ column :division, :string
175
+ end
176
+ RailsAdmin.config.included_models = [HelpTest, Team]
177
+ end
178
+
179
+ after(:each) do
180
+ # restore validation setting
181
+ HelpTest._validators[:name] = []
182
+ HelpTest.reset_callbacks(:validate)
183
+ end
184
+
185
+ context "using mongoid", :skip_active_record => true do
186
+ it "uses the db column size for the maximum length" do
187
+ visit new_path(:model_name => "help_test")
188
+ expect(find("#help_test_name_field .help-block")).to have_content("Length up to 255.")
189
+ end
190
+
191
+ it "returns nil for the maximum length" do
192
+ visit new_path(:model_name => "team")
193
+ expect(find("#team_custom_field_field .help-block")).not_to have_content("Length")
194
+ end
195
+ end
196
+
197
+ context "using active_record", :skip_mongoid => true do
198
+ it "uses the db column size for the maximum length" do
199
+ visit new_path(:model_name => "help_test")
200
+ expect(find("#help_test_name_field .help-block")).to have_content("Length up to 50.")
201
+ end
202
+
203
+ it "uses the :minimum setting from the validation" do
204
+ HelpTest.class_eval do
205
+ validates_length_of :name, :minimum => 1
206
+ end
207
+ visit new_path(:model_name => "help_test")
208
+ expect(find("#help_test_name_field .help-block")).to have_content("Length of 1-50.")
209
+ end
210
+
211
+ it "uses the minimum of db column size or :maximum setting from the validation" do
212
+ HelpTest.class_eval do
213
+ validates_length_of :name, :maximum => 51
214
+ end
215
+ visit new_path(:model_name => "help_test")
216
+ expect(find("#help_test_name_field .help-block")).to have_content("Length up to 50.")
217
+ end
218
+ end
219
+
220
+ it "shows help section if present" do
221
+ RailsAdmin.config HelpTest do
222
+ edit do
223
+ group :default do
224
+ help "help paragraph to display"
225
+ end
226
+ end
227
+ end
228
+ visit new_path(:model_name => "help_test")
229
+ should have_selector('fieldset>p', :text => "help paragraph to display")
230
+ end
231
+
232
+ it "does not show help if not present" do
233
+ RailsAdmin.config HelpTest do
234
+ edit do
235
+ group :default do
236
+ label 'no help'
237
+ end
238
+ end
239
+ end
240
+ visit new_path(:model_name => "help_test")
241
+ should_not have_selector('fieldset>p')
242
+ end
243
+
244
+ it "is able to display multiple help if there are multiple sections" do
245
+ RailsAdmin.config HelpTest do
246
+ edit do
247
+ group :default do
248
+ field :name
249
+ help 'help for default'
250
+ end
251
+ group :other_section do
252
+ label "Other Section"
253
+ field :division
254
+ help 'help for other section'
255
+ end
256
+ end
257
+ end
258
+ visit new_path(:model_name => "help_test")
259
+ should have_selector("fieldset>p", :text => 'help for default')
260
+ should have_selector("fieldset>p", :text => 'help for other section')
261
+ should have_selector("fieldset>p", :count => 2)
262
+ end
263
+
264
+ it "uses the :is setting from the validation" do
265
+ HelpTest.class_eval do
266
+ validates_length_of :name, :is => 3
267
+ end
268
+ visit new_path(:model_name => "help_test")
269
+ expect(find("#help_test_name_field .help-block")).to have_content("Length of 3.")
270
+ end
271
+
272
+ it "uses the :maximum setting from the validation" do
273
+ HelpTest.class_eval do
274
+ validates_length_of :name, :maximum => 49
275
+ end
276
+ visit new_path(:model_name => "help_test")
277
+ expect(find("#help_test_name_field .help-block")).to have_content("Length up to 49.")
278
+ end
279
+
280
+ it "uses the :minimum and :maximum from the validation" do
281
+ HelpTest.class_eval do
282
+ validates_length_of :name, :minimum => 1, :maximum => 49
283
+ end
284
+ visit new_path(:model_name => "help_test")
285
+ expect(find("#help_test_name_field .help-block")).to have_content("Length of 1-49.")
286
+ end
287
+
288
+ it "uses the range from the validation" do
289
+ HelpTest.class_eval do
290
+ validates_length_of :name, :in => 1..49
291
+ end
292
+ visit new_path(:model_name => "help_test")
293
+ expect(find("#help_test_name_field .help-block")).to have_content("Length of 1-49.")
294
+ end
295
+
296
+ end
297
+
298
+ it "has accessor for its fields" do
299
+ RailsAdmin.config Team do
300
+ edit do
301
+ group :default do
302
+ field :name
303
+ field :logo_url
304
+ end
305
+ group :belongs_to_associations do
306
+ label "Belong's to associations"
307
+ field :division
308
+ end
309
+ group :basic_info do
310
+ field :manager
311
+ end
312
+ end
313
+ end
314
+ visit new_path(:model_name => "team")
315
+ should have_selector("legend", :text => "Basic info", :visible => false)
316
+ should have_selector("legend", :text => "Basic info", :visible => true)
317
+ should have_selector("legend", :text => "Belong's to associations")
318
+ should have_selector("label", :text => "Name")
319
+ should have_selector("label", :text => "Logo url")
320
+ should have_selector("label", :text => "Division")
321
+ should have_selector(".control-group", :count => 4)
322
+ end
323
+
324
+ it "has accessor for its fields by type" do
325
+ RailsAdmin.config Team do
326
+ edit do
327
+ group :default do
328
+ field :name
329
+ field :logo_url
330
+ end
331
+ group :other do
332
+ field :division_id
333
+ field :manager
334
+ field :ballpark
335
+ fields_of_type :string do
336
+ label { "#{label} (STRING)" }
337
+ end
338
+ end
339
+ end
340
+ end
341
+ visit new_path(:model_name => "team")
342
+ should have_selector("label", :text => "Name")
343
+ should have_selector("label", :text => "Logo url")
344
+ should have_selector("label", :text => "Division")
345
+ should have_selector("label", :text => "Manager (STRING)")
346
+ should have_selector("label", :text => "Ballpark (STRING)")
347
+ end
348
+ end
349
+
350
+ describe "items' fields" do
351
+
352
+ it "shows all by default" do
353
+ visit new_path(:model_name => "team")
354
+ should have_selector("select#team_division_id")
355
+ should have_selector("input#team_name")
356
+ should have_selector("input#team_logo_url")
357
+ should have_selector("input#team_manager")
358
+ should have_selector("input#team_ballpark")
359
+ should have_selector("input#team_mascot")
360
+ should have_selector("input#team_founded")
361
+ should have_selector("input#team_wins")
362
+ should have_selector("input#team_losses")
363
+ should have_selector("input#team_win_percentage")
364
+ should have_selector("input#team_revenue")
365
+ should have_selector("select#team_player_ids")
366
+ should have_selector("select#team_fan_ids")
367
+ end
368
+
369
+ it "appears in order defined" do
370
+ RailsAdmin.config Team do
371
+ edit do
372
+ field :manager
373
+ field :division
374
+ field :name
375
+ end
376
+ end
377
+ visit new_path(:model_name => "team")
378
+ should have_selector(:xpath, "//*[contains(@class, 'field')][1]//*[@id='team_manager']")
379
+ should have_selector(:xpath, "//*[contains(@class, 'field')][2]//*[@id='team_division_id']")
380
+ should have_selector(:xpath, "//*[contains(@class, 'field')][3]//*[@id='team_name']")
381
+ end
382
+
383
+ it "only shows the defined fields if some fields are defined" do
384
+ RailsAdmin.config Team do
385
+ edit do
386
+ field :division
387
+ field :name
388
+ end
389
+ end
390
+ visit new_path(:model_name => "team")
391
+ should have_selector("label", :text => "Division")
392
+ should have_selector("label", :text => "Name")
393
+ should have_selector(".control-group", :count => 2)
394
+ end
395
+
396
+ describe "I18n awarly" do
397
+ after :each do
398
+ I18n.locale = :en
399
+ end
400
+
401
+ it "delegates the label option to the ActiveModel API and memoizes it" do
402
+ RailsAdmin.config Team do
403
+ edit do
404
+ field :manager
405
+ field :fans
406
+ end
407
+ end
408
+ visit new_path(:model_name => "team")
409
+ should have_selector("label", :text => "Team Manager")
410
+ should have_selector("label", :text => "Some Fans")
411
+ I18n.locale = :fr
412
+ visit new_path(:model_name => "team")
413
+ should have_selector("label", :text => "Manager de l'équipe")
414
+ should have_selector("label", :text => "Quelques fans")
415
+ end
416
+ end
417
+
418
+ it "is renameable" do
419
+ RailsAdmin.config Team do
420
+ edit do
421
+ field :manager do
422
+ label "Renamed field"
423
+ end
424
+ field :division
425
+ field :name
426
+ end
427
+ end
428
+ visit new_path(:model_name => "team")
429
+ should have_selector("label", :text => "Renamed field")
430
+ should have_selector("label", :text => "Division")
431
+ should have_selector("label", :text => "Name")
432
+ end
433
+
434
+ it "is renameable by type" do
435
+ RailsAdmin.config Team do
436
+ edit do
437
+ fields_of_type :string do
438
+ label { "#{label} (STRING)" }
439
+ end
440
+ end
441
+ end
442
+ visit new_path(:model_name => "team")
443
+ should have_selector("label", :text => "Division")
444
+ should have_selector("label", :text => "Name (STRING)")
445
+ should have_selector("label", :text => "Logo url (STRING)")
446
+ should have_selector("label", :text => "Manager (STRING)")
447
+ should have_selector("label", :text => "Ballpark (STRING)")
448
+ should have_selector("label", :text => "Mascot (STRING)")
449
+ should have_selector("label", :text => "Founded")
450
+ should have_selector("label", :text => "Wins")
451
+ should have_selector("label", :text => "Losses")
452
+ should have_selector("label", :text => "Win percentage")
453
+ should have_selector("label", :text => "Revenue")
454
+ should have_selector("label", :text => "Players")
455
+ should have_selector("label", :text => "Fans")
456
+ end
457
+
458
+ it "is globally renameable by type" do
459
+ RailsAdmin.config Team do
460
+ edit do
461
+ fields_of_type :string do
462
+ label { "#{label} (STRING)" }
463
+ end
464
+ end
465
+ end
466
+ visit new_path(:model_name => "team")
467
+ should have_selector("label", :text => "Division")
468
+ should have_selector("label", :text => "Name (STRING)")
469
+ should have_selector("label", :text => "Logo url (STRING)")
470
+ should have_selector("label", :text => "Manager (STRING)")
471
+ should have_selector("label", :text => "Ballpark (STRING)")
472
+ should have_selector("label", :text => "Mascot (STRING)")
473
+ should have_selector("label", :text => "Founded")
474
+ should have_selector("label", :text => "Wins")
475
+ should have_selector("label", :text => "Losses")
476
+ should have_selector("label", :text => "Win percentage")
477
+ should have_selector("label", :text => "Revenue")
478
+ should have_selector("label", :text => "Players")
479
+ should have_selector("label", :text => "Fans")
480
+ end
481
+
482
+ it "is flaggable as read only and be configurable with formatted_value" do
483
+ RailsAdmin.config Team do
484
+ edit do
485
+ field :name do
486
+ read_only true
487
+ formatted_value do
488
+ "I'm outputed in the form"
489
+ end
490
+ end
491
+ end
492
+ end
493
+ visit new_path(:model_name => "team")
494
+ should have_content("I'm outputed in the form")
495
+ end
496
+
497
+ it "is hideable" do
498
+ RailsAdmin.config Team do
499
+ edit do
500
+ field :manager do
501
+ hide
502
+ end
503
+ field :division
504
+ field :name
505
+ end
506
+ end
507
+ visit new_path(:model_name => "team")
508
+ should have_no_selector("#team_manager")
509
+ should have_selector("#team_division_id")
510
+ should have_selector("#team_name")
511
+ end
512
+
513
+ it "is hideable by type" do
514
+ RailsAdmin.config Team do
515
+ edit do
516
+ fields_of_type :string do
517
+ hide
518
+ end
519
+ end
520
+ end
521
+ visit new_path(:model_name => "team")
522
+ should have_selector("label", :text => "Division")
523
+ should have_no_selector("label", :text => "Name")
524
+ should have_no_selector("label", :text => "Logo url")
525
+ should have_no_selector("label", :text => "Manager")
526
+ should have_no_selector("label", :text => "Ballpark")
527
+ should have_no_selector("label", :text => "Mascot")
528
+ should have_selector("label", :text => "Founded")
529
+ should have_selector("label", :text => "Wins")
530
+ should have_selector("label", :text => "Losses")
531
+ should have_selector("label", :text => "Win percentage")
532
+ should have_selector("label", :text => "Revenue")
533
+ should have_selector("label", :text => "Players")
534
+ should have_selector("label", :text => "Fans")
535
+ end
536
+
537
+ it "is globally hideable by type" do
538
+ RailsAdmin.config Team do
539
+ edit do
540
+ fields_of_type :string do
541
+ hide
542
+ end
543
+ end
544
+ end
545
+ visit new_path(:model_name => "team")
546
+ should have_selector("label", :text => "Division")
547
+ should have_no_selector("label", :text => "Name")
548
+ should have_no_selector("label", :text => "Logo url")
549
+ should have_no_selector("label", :text => "Manager")
550
+ should have_no_selector("label", :text => "Ballpark")
551
+ should have_no_selector("label", :text => "Mascot")
552
+ should have_selector("label", :text => "Founded")
553
+ should have_selector("label", :text => "Wins")
554
+ should have_selector("label", :text => "Losses")
555
+ should have_selector("label", :text => "Win percentage")
556
+ should have_selector("label", :text => "Revenue")
557
+ should have_selector("label", :text => "Players")
558
+ should have_selector("label", :text => "Fans")
559
+ end
560
+
561
+ it "has option to customize the help text" do
562
+ RailsAdmin.config Team do
563
+ edit do
564
+ field :manager do
565
+ help "#{help} Additional help text for manager field."
566
+ end
567
+ field :division
568
+ field :name
569
+ end
570
+ end
571
+ visit new_path(:model_name => "team")
572
+ expect(find("#team_manager_field .help-block")).to have_content("Required. Length up to 100. Additional help text for manager field.")
573
+ expect(find("#team_division_id_field .help-block")).to have_content("Required")
574
+ expect(find("#team_name_field .help-block")).not_to have_content("Additional help text")
575
+ end
576
+
577
+ it "has option to override required status" do
578
+ RailsAdmin.config Team do
579
+ edit do
580
+ field :manager do
581
+ optional true
582
+ end
583
+ field :division do
584
+ optional true
585
+ end
586
+ field :name do
587
+ required true
588
+ end
589
+ end
590
+ end
591
+ visit new_path(:model_name => "team")
592
+ expect(find("#team_manager_field .help-block")).to have_content("Optional")
593
+ expect(find("#team_division_id_field .help-block")).to have_content("Optional")
594
+ expect(find("#team_name_field .help-block")).to have_content("Required")
595
+ end
596
+ end
597
+
598
+ describe "bindings" do
599
+ it "is present at creation time" do
600
+ RailsAdmin.config do |config|
601
+ config.excluded_models = []
602
+ end
603
+ RailsAdmin.config Category do
604
+ field :parent_category do
605
+ visible do
606
+ !bindings[:object].new_record?
607
+ end
608
+ end
609
+ end
610
+
611
+ visit new_path(:model_name => 'category')
612
+ should have_no_css('#category_parent_category_id')
613
+ click_button "Save" # first(:button, "Save").click
614
+ visit edit_path(:model_name => 'category', :id => Category.first)
615
+ should have_css('#category_parent_category_id')
616
+ click_button "Save" # first(:button, "Save").click
617
+ should have_content('Category successfully updated')
618
+ end
619
+ end
620
+
621
+ describe "nested form" do
622
+ it "works" do
623
+ @record = FactoryGirl.create :field_test
624
+ @record.nested_field_tests = [NestedFieldTest.create!(:title => 'title 1'), NestedFieldTest.create!(:title => 'title 2')]
625
+ visit edit_path(:model_name => "field_test", :id => @record.id)
626
+ fill_in "field_test_comment_attributes_content", :with => 'nested comment content'
627
+ fill_in "field_test_nested_field_tests_attributes_0_title", :with => 'nested field test title 1 edited'
628
+ page.find('#field_test_nested_field_tests_attributes_1__destroy').set('true')
629
+ click_button "Save" # first(:button, "Save").click
630
+ @record.reload
631
+ expect(@record.comment.content).to eq('nested comment content')
632
+ expect(@record.nested_field_tests.length).to eq(1)
633
+ expect(@record.nested_field_tests[0].title).to eq('nested field test title 1 edited')
634
+ end
635
+
636
+ it "sets bindings[:object] to nested object" do
637
+ RailsAdmin.config(NestedFieldTest) do
638
+ nested do
639
+ field :title do
640
+ label do
641
+ bindings[:object].class.name
642
+ end
643
+ end
644
+ end
645
+ end
646
+ @record = FieldTest.create
647
+ @record.nested_field_tests << NestedFieldTest.create!(:title => 'title 1')
648
+ visit edit_path(:model_name => "field_test", :id => @record.id)
649
+ expect(find('#field_test_nested_field_tests_attributes_0_title_field')).to have_content('NestedFieldTest')
650
+ end
651
+
652
+ it "is desactivable" do
653
+ visit new_path(:model_name => "field_test")
654
+ should have_selector('#field_test_nested_field_tests_attributes_field .add_nested_fields')
655
+ RailsAdmin.config(FieldTest) do
656
+ configure :nested_field_tests do
657
+ nested_form false
658
+ end
659
+ end
660
+ visit new_path(:model_name => "field_test")
661
+ should have_no_selector('#field_test_nested_field_tests_attributes_field .add_nested_fields')
662
+ end
663
+
664
+ describe "with nested_attributes_options given" do
665
+ before do
666
+ FieldTest.nested_attributes_options.stub(:[]).with(any_args()).
667
+ and_return({:allow_destroy=>true, :update_only=>false})
668
+ end
669
+
670
+ it "does not show add button when :update_only is true" do
671
+ FieldTest.nested_attributes_options.stub(:[]).with(:nested_field_tests).
672
+ and_return({:allow_destroy=>true, :update_only=>true})
673
+ visit new_path(:model_name => "field_test")
674
+ should have_selector('.toggler')
675
+ should_not have_selector('#field_test_nested_field_tests_attributes_field .add_nested_fields')
676
+ end
677
+
678
+ it "does not show destroy button except for newly created when :allow_destroy is false" do
679
+ @record = FieldTest.create
680
+ @record.nested_field_tests << NestedFieldTest.create!(:title => 'nested title 1')
681
+ FieldTest.nested_attributes_options.stub(:[]).with(:nested_field_tests).
682
+ and_return({:allow_destroy=>false, :update_only=>false})
683
+ visit edit_path(:model_name => "field_test", :id => @record.id)
684
+ expect(find('#field_test_nested_field_tests_attributes_0_title').value).to eq('nested title 1')
685
+ should_not have_selector('form .remove_nested_fields')
686
+ expect(find('div#nested_field_tests_fields_blueprint')[:'data-blueprint']).to match(
687
+ /<a[^>]* class="remove_nested_fields"[^>]*>/)
688
+ end
689
+ end
690
+
691
+ describe "when a field which have the same name of nested_in field's" do
692
+ it "does not hide fields which are not associated with nesting parent field's model" do
693
+ visit new_path(:model_name => "field_test")
694
+ should_not have_selector('select#field_test_nested_field_tests_attributes_new_nested_field_tests_field_test_id')
695
+ expect(find('div#nested_field_tests_fields_blueprint')[:'data-blueprint']).to match(
696
+ /<select[^>]* id="field_test_nested_field_tests_attributes_new_nested_field_tests_another_field_test_id"[^>]*>/)
697
+ end
698
+ end
699
+ end
700
+
701
+ describe "embedded model", :mongoid => true do
702
+ it "works" do
703
+ @record = FactoryGirl.create :field_test
704
+ 2.times.each{|i| @record.embeds.create :name => "embed #{i}"}
705
+ visit edit_path(:model_name => "field_test", :id => @record.id)
706
+ fill_in "field_test_embeds_attributes_0_name", :with => 'embed 1 edited'
707
+ page.find('#field_test_embeds_attributes_1__destroy').set('true')
708
+ click_button "Save" # first(:button, "Save").click
709
+ @record.reload
710
+ expect(@record.embeds.length).to eq(1)
711
+ expect(@record.embeds[0].name).to eq('embed 1 edited')
712
+ end
713
+ end
714
+
715
+
716
+ describe "fields which are nullable and have AR validations", :active_record => true do
717
+
718
+ it "is required" do
719
+ # draft.notes is nullable and has no validation
720
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :notes}
721
+ expect(field.properties[:nullable?]).to be_true
722
+ expect(field.required?).to be_false
723
+
724
+ # draft.date is nullable in the schema but has an AR
725
+ # validates_presence_of validation that makes it required
726
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :date}
727
+ expect(field.properties[:nullable?]).to be_true
728
+ expect(field.required?).to be_true
729
+
730
+ # draft.round is nullable in the schema but has an AR
731
+ # validates_numericality_of validation that makes it required
732
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :round}
733
+ expect(field.properties[:nullable?]).to be_true
734
+ expect(field.required?).to be_true
735
+
736
+ # team.revenue is nullable in the schema but has an AR
737
+ # validates_numericality_of validation that allows nil
738
+ field = RailsAdmin::config("Team").edit.fields.find{|f| f.name == :revenue}
739
+ expect(field.properties[:nullable?]).to be_true
740
+ expect(field.required?).to be_false
741
+ end
742
+ end
743
+
744
+ describe "CKEditor Support" do
745
+
746
+ it "starts with CKEditor disabled" do
747
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :notes}
748
+ expect(field.ckeditor).to be_false
749
+ end
750
+
751
+ it "adds Javascript to enable CKEditor" do
752
+ RailsAdmin.config Draft do
753
+ edit do
754
+ field :notes do
755
+ ckeditor true
756
+ end
757
+ end
758
+ end
759
+ visit new_path(:model_name => "draft")
760
+ should have_selector('textarea#draft_notes[data-richtext="ckeditor"]')
761
+ end
762
+ end
763
+
764
+ describe "CodeMirror Support" do
765
+
766
+ it "starts with CodeMirror disabled" do
767
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :notes}
768
+ expect(field.codemirror).to be_false
769
+ end
770
+
771
+ it "adds Javascript to enable CodeMirror" do
772
+ RailsAdmin.config Draft do
773
+ edit do
774
+ field :notes do
775
+ codemirror true
776
+ end
777
+ end
778
+ end
779
+ visit new_path(:model_name => "draft")
780
+ should have_selector('textarea#draft_notes[data-richtext="codemirror"]')
781
+ end
782
+ end
783
+
784
+ describe "bootstrap_wysihtml5 Support" do
785
+
786
+ it "starts with bootstrap_wysihtml5 disabled" do
787
+ field = RailsAdmin::config("Draft").edit.fields.find{|f| f.name == :notes}
788
+ expect(field.bootstrap_wysihtml5).to be_false
789
+ end
790
+
791
+ it "adds Javascript to enable bootstrap_wysihtml5" do
792
+ RailsAdmin.config Draft do
793
+ edit do
794
+ field :notes do
795
+ bootstrap_wysihtml5 true
796
+ end
797
+ end
798
+ end
799
+ visit new_path(:model_name => "draft")
800
+ should have_selector('textarea#draft_notes[data-richtext="bootstrap-wysihtml5"]')
801
+ end
802
+
803
+ it "should include custom wysihtml5 configuration" do
804
+ RailsAdmin.config Draft do
805
+ edit do
806
+ field :notes do
807
+ bootstrap_wysihtml5 true
808
+ bootstrap_wysihtml5_config_options :image => false
809
+ bootstrap_wysihtml5_css_location 'stub_css.css'
810
+ bootstrap_wysihtml5_js_location 'stub_js.js'
811
+ end
812
+ end
813
+ end
814
+
815
+ visit new_path(:model_name => "draft")
816
+ should have_selector("textarea#draft_notes[data-richtext=\"bootstrap-wysihtml5\"][data-options]")
817
+ end
818
+ end
819
+
820
+ describe "Paperclip Support" do
821
+
822
+ it "shows a file upload field" do
823
+ RailsAdmin.config User do
824
+ edit do
825
+ field :avatar
826
+ end
827
+ end
828
+ visit new_path(:model_name => "user")
829
+ should have_selector("input#user_avatar")
830
+ end
831
+ end
832
+
833
+ describe "Enum field support" do
834
+ describe "when object responds to '\#{method}_enum'" do
835
+ before do
836
+ Team.class_eval do
837
+ def color_enum
838
+ ["blue", "green", "red"]
839
+ end
840
+ end
841
+ RailsAdmin.config Team do
842
+ edit do
843
+ field :color
844
+ end
845
+ end
846
+ visit new_path(:model_name => "team")
847
+ end
848
+
849
+ after do
850
+ Team.send(:remove_method, :color_enum)
851
+ end
852
+
853
+ it "auto-detects enumeration" do
854
+ should have_selector(".enum_type select")
855
+ should_not have_selector(".enum_type select[multiple]")
856
+ should have_content("green")
857
+ end
858
+ end
859
+
860
+ describe "when class responds to '\#{method}_enum'" do
861
+ before do
862
+ Team.instance_eval do
863
+ def color_enum
864
+ ["blue", "green", "red"]
865
+ end
866
+ end
867
+ RailsAdmin.config Team do
868
+ edit do
869
+ field :color
870
+ end
871
+ end
872
+ visit new_path(:model_name => "team")
873
+ end
874
+
875
+ after do
876
+ Team.instance_eval { undef :color_enum }
877
+ end
878
+
879
+ it "auto-detects enumeration" do
880
+ should have_selector(".enum_type select")
881
+ should have_content("green")
882
+ end
883
+ end
884
+
885
+ describe "the enum instance method" do
886
+ before do
887
+ Team.class_eval do
888
+ def color_list
889
+ ["blue", "green", "red"]
890
+ end
891
+ end
892
+ RailsAdmin.config Team do
893
+ edit do
894
+ field :color, :enum do
895
+ enum_method :color_list
896
+ end
897
+ end
898
+ end
899
+ visit new_path(:model_name => "team")
900
+ end
901
+
902
+ after do
903
+ Team.send(:remove_method, :color_list)
904
+ end
905
+
906
+ it "allows configuration" do
907
+ should have_selector(".enum_type select")
908
+ should have_content("green")
909
+ end
910
+ end
911
+
912
+ describe "the enum class method" do
913
+ before do
914
+ Team.instance_eval do
915
+ def color_list
916
+ ["blue", "green", "red"]
917
+ end
918
+ end
919
+ RailsAdmin.config Team do
920
+ edit do
921
+ field :color, :enum do
922
+ enum_method :color_list
923
+ end
924
+ end
925
+ end
926
+ visit new_path(:model_name => "team")
927
+ end
928
+
929
+ after do
930
+ Team.instance_eval { undef :color_list }
931
+ end
932
+
933
+ it "allows configuration" do
934
+ should have_selector(".enum_type select")
935
+ should have_content("green")
936
+ end
937
+ end
938
+
939
+ describe "when overriding enum configuration" do
940
+ before do
941
+ Team.class_eval do
942
+ def color_list
943
+ ["blue", "green", "red"]
944
+ end
945
+ end
946
+ RailsAdmin.config Team do
947
+ edit do
948
+ field :color, :enum do
949
+ enum_method :color_list
950
+ enum do
951
+ ["yellow", "black"]
952
+ end
953
+ end
954
+ end
955
+ end
956
+ visit new_path(:model_name => "team")
957
+ end
958
+
959
+ after do
960
+ Team.send(:remove_method, :color_list)
961
+ end
962
+
963
+ it "allows direct listing of enumeration options and override enum method" do
964
+ should have_selector(".enum_type select")
965
+ should have_no_content("green")
966
+ should have_content("yellow")
967
+ end
968
+ end
969
+
970
+ describe "when serialize is enabled in ActiveRecord model", :active_record => true do
971
+ before do
972
+ Team.instance_eval do
973
+ serialize :color
974
+ def color_enum
975
+ ["blue", "green", "red"]
976
+ end
977
+ end
978
+ visit new_path(:model_name => "team")
979
+ end
980
+
981
+ after do
982
+ Team.serialized_attributes.clear
983
+ Team.instance_eval { undef :color_enum }
984
+ end
985
+
986
+ it "makes enumeration multi-selectable" do
987
+ should have_selector(".enum_type select[multiple]")
988
+ end
989
+ end
990
+
991
+ describe "when serialize is enabled in Mongoid model", :mongoid => true do
992
+ before do
993
+ Team.instance_eval do
994
+ field :color, :type => Array
995
+ def color_enum
996
+ ["blue", "green", "red"]
997
+ end
998
+ end
999
+ visit new_path(:model_name => "team")
1000
+ end
1001
+
1002
+ after do
1003
+ Team.instance_eval do
1004
+ field :color, :type => String
1005
+ undef :color_enum
1006
+ end
1007
+ end
1008
+
1009
+ it "makes enumeration multi-selectable" do
1010
+ should have_selector(".enum_type select[multiple]")
1011
+ end
1012
+ end
1013
+ end
1014
+
1015
+ describe "ColorPicker Support" do
1016
+ it "shows input with class color" do
1017
+ RailsAdmin.config Team do
1018
+ edit do
1019
+ field :color, :color
1020
+ end
1021
+ end
1022
+ visit new_path(:model_name => "team")
1023
+ should have_selector(".color_type input")
1024
+ end
1025
+ end
1026
+ end