rails_admin-lbgraham 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Namespaced Model Create" do
4
+
5
+ subject { page }
6
+
7
+ it "creates object with correct attributes" do
8
+ visit new_path(:model_name => "cms~basic_page")
9
+
10
+ fill_in "cms_basic_page[title]", :with => "Hello"
11
+ fill_in "cms_basic_page[content]", :with => "World"
12
+ expect {
13
+ click_button "Save" # first(:button, "Save").click
14
+ }.to change(Cms::BasicPage, :count).by(1)
15
+ end
16
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Delete" do
4
+
5
+ subject { page }
6
+
7
+ describe "delete" do
8
+ it "shows \"Delete model\"" do
9
+ @draft = FactoryGirl.create :draft
10
+ @player = @draft.player
11
+ @comment = @player.comments.create
12
+ visit delete_path(:model_name => "player", :id => @player.id)
13
+ should have_content("delete this player")
14
+ should have_link(@player.name, :href => "/admin/player/#{@player.id}")
15
+ should have_link("Draft ##{@draft.id}", :href => "/admin/draft/#{@draft.id}")
16
+ should have_link("Comment ##{@comment.id}", :href => "/admin/comment/#{@comment.id}")
17
+ end
18
+ end
19
+
20
+ describe "delete with missing object" do
21
+ before(:each) do
22
+ visit delete_path(:model_name => "player", :id => 1)
23
+ end
24
+
25
+ it "raises NotFound" do
26
+ expect(page.driver.status_code).to eq(404)
27
+ end
28
+ end
29
+
30
+ describe "with show action disabled" do
31
+ before(:each) do
32
+ RailsAdmin.config.actions do
33
+ dashboard
34
+ index
35
+ delete
36
+ end
37
+ @draft = FactoryGirl.create :draft
38
+ @player = @draft.player
39
+ @comment = @player.comments.create
40
+ visit delete_path(:model_name => "player", :id => @player.id)
41
+ end
42
+
43
+ it "shows \"Delete model\"" do
44
+ should have_content("delete this player")
45
+ should_not have_selector("a[href=\"/admin/player/#{@player.id}\"]")
46
+ should_not have_selector("a[href=\"/admin/draft/#{@draft.id}\"]")
47
+ should_not have_selector("a[href=\"/admin/comment/#{@comment.id}\"]")
48
+ end
49
+ end
50
+
51
+ describe "delete of an object which has an associated item without id" do
52
+ before(:each) do
53
+ @player = FactoryGirl.create :player
54
+ Player.any_instance.stub(:draft).and_return(Draft.new)
55
+ visit delete_path(:model_name => "player", :id => @player.id)
56
+ end
57
+
58
+ it "shows \"Delete model\"" do
59
+ should_not have_content("Routing Error")
60
+ should have_content("delete this player")
61
+ should have_link(@player.name, :href => "/admin/player/#{@player.id}")
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Destroy" do
4
+
5
+ subject { page }
6
+
7
+ describe "destroy" do
8
+ before(:each) do
9
+ @player = FactoryGirl.create :player
10
+ visit delete_path(:model_name => "player", :id => @player.id)
11
+ click_button "Yes, I'm sure"
12
+ @player = RailsAdmin::AbstractModel.new("Player").first
13
+ end
14
+
15
+ it "destroys an object" do
16
+ expect(@player).to be_nil
17
+ end
18
+
19
+ it "shows success message" do
20
+ should have_content('Player successfully deleted')
21
+ end
22
+ end
23
+
24
+ describe "handle destroy errors" do
25
+ before(:each) do
26
+ Player.any_instance.stub(:destroy_hook).and_return false
27
+ @player = FactoryGirl.create :player
28
+ visit delete_path(:model_name => "player", :id => @player.id)
29
+ click_button "Yes, I'm sure"
30
+ end
31
+
32
+ it "does not destroy an object" do
33
+ expect(@player.reload).to be
34
+ end
35
+
36
+ it "shows error message" do
37
+ should have_content('Player failed to be deleted')
38
+ end
39
+ end
40
+
41
+ describe "destroy" do
42
+ before(:each) do
43
+ @player = FactoryGirl.create :player
44
+ visit delete_path(:model_name => "player", :id => @player.id)
45
+ click_button "Cancel"
46
+ @player = RailsAdmin::AbstractModel.new("Player").first
47
+ end
48
+
49
+ it "does not destroy an object" do
50
+ expect(@player).to be
51
+ end
52
+ end
53
+
54
+ describe "destroy with missing object" do
55
+ before(:each) do
56
+ delete delete_path(:model_name => "player", :id => 1)
57
+ end
58
+
59
+ it "raises NotFound" do
60
+ expect(response.code).to eq("404")
61
+ end
62
+ end
63
+
64
+ describe "destroy from show page" do
65
+ it "redirects to the index instead of trying to show the deleted object" do
66
+ @player = FactoryGirl.create :player
67
+ visit show_path(:model_name => 'player', :id => @player.id)
68
+ click_link "Delete"
69
+ click_button "Yes, I'm sure"
70
+
71
+ expect(URI.parse(page.current_url).path).to eq(index_path(:model_name => 'player'))
72
+ end
73
+
74
+ it "redirects back to the object on error" do
75
+ Player.any_instance.stub(:destroy_hook).and_return false
76
+ @player = FactoryGirl.create :player
77
+ visit show_path(:model_name => 'player', :id => @player.id)
78
+ click_link "Delete"
79
+ click_button "Yes, I'm sure"
80
+
81
+ expect(URI.parse(page.current_url).path).to eq(show_path(:model_name => 'player', :id => @player.id))
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Edit" do
4
+
5
+ subject { page }
6
+
7
+ describe "edit" 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 "shows \"Edit model\"" do
14
+ should have_content("Edit Player")
15
+ end
16
+
17
+ it "shows required fields as \"Required\"" do
18
+ should have_selector("div", :text => /Name\s*Required/)
19
+ should have_selector("div", :text => /Number\s*Required/)
20
+ end
21
+
22
+ it "shows non-required fields as \"Optional\"" do
23
+ expect(find("#player_position_field .help-block")).to have_content("Optional")
24
+ expect(find("#player_born_on_field .help-block")).to have_content("Optional")
25
+ expect(find("#player_notes_field .help-block")).to have_content("Optional")
26
+ end
27
+ end
28
+
29
+ describe "association with inverse_of option" do
30
+ it "adds a related id to the belongs_to create team link" do
31
+ @player = FactoryGirl.create :player
32
+ visit edit_path(:model_name => "player", :id => @player.id)
33
+ should have_selector("a[data-link='/admin/team/new?associations%5Bplayers%5D=#{@player.id.to_s}&modal=true']")
34
+ end
35
+
36
+ it "adds a related id to the has_many create team link" do
37
+ @team = FactoryGirl.create :team
38
+ visit edit_path(:model_name => "team", :id => @team.id)
39
+ should have_selector("a[data-link='/admin/player/new?associations%5Bteam%5D=#{@team.id.to_s}&modal=true']")
40
+ end
41
+ end
42
+
43
+ describe "readonly associations" do
44
+
45
+ it "is not editable" do
46
+ @league = FactoryGirl.create :league
47
+ visit edit_path(:model_name => "league", :id => @league.id)
48
+ should_not have_selector('select#league_team_ids')
49
+ should have_selector('select#league_division_ids') # decoy, fails if naming scheme changes
50
+ end
51
+ end
52
+
53
+ describe "edit with has-and-belongs-to-many association" do
54
+ before(:each) do
55
+ @teams = 3.times.map { FactoryGirl.create :team }
56
+ @fan = FactoryGirl.create :fan, :teams => [@teams[0]]
57
+ visit edit_path(:model_name => "fan", :id => @fan.id)
58
+ end
59
+
60
+ it "shows associated objects" do
61
+ should have_selector "#fan_team_ids" do |select|
62
+ expect(select[0]).to have_selector 'option[selected="selected"]'
63
+ expect(select[1]).not_to have_selector 'option[selected="selected"]'
64
+ expect(select[2]).not_to have_selector 'option[selected="selected"]'
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "edit with missing object" do
70
+ before(:each) do
71
+ visit edit_path(:model_name => "player", :id => 1)
72
+ end
73
+
74
+ it "raises NotFound" do
75
+ expect(page.driver.status_code).to eq(404)
76
+ end
77
+ end
78
+
79
+ describe "edit with missing label", :given => ["a player exists", "three teams with no name exist"] do
80
+ before(:each) do
81
+ @player = FactoryGirl.create :player
82
+ @teams = 3.times.map { FactoryGirl.create :team, :name => "" }
83
+ visit edit_path(:model_name => "player", :id => @player.id)
84
+ end
85
+ end
86
+
87
+ describe "edit object with overridden to_param" do
88
+ before(:each) do
89
+ @ball = FactoryGirl.create :ball
90
+ visit edit_path(:model_name => "ball", :id => @ball.id)
91
+ end
92
+
93
+ it "displays a link to the delete page" do
94
+ should have_selector "a[href='/admin/ball/#{@ball.id}/delete']"
95
+ end
96
+
97
+ end
98
+
99
+ describe "clicking cancel when editing an object" do
100
+
101
+ it "sends back to previous URL" do
102
+ @ball = FactoryGirl.create :ball
103
+ visit '/admin/ball?sort=color'
104
+ click_link 'Edit'
105
+ click_button 'Cancel'
106
+ expect(page.current_url).to eq('http://www.example.com/admin/ball?sort=color')
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+ require 'csv'
3
+
4
+ describe "RailsAdmin Export" do
5
+
6
+ subject { page }
7
+
8
+ before(:each) do
9
+ Comment.all.map &:destroy # rspec bug => doesn't get destroyed with transaction
10
+
11
+ @players = 4.times.map { FactoryGirl.create :player }
12
+ @player = @players.first
13
+ @player.team = FactoryGirl.create :team
14
+ @player.draft = FactoryGirl.create :draft
15
+ @player.comments = (@comments = 2.times.map { FactoryGirl.create(:comment) })
16
+ @player.save
17
+
18
+ @abstract_model = RailsAdmin::AbstractModel.new(Player)
19
+
20
+ # removed schema=>only=>created_at
21
+ @non_default_schema = {
22
+ "only"=>[PK_COLUMN.to_s, "updated_at", "deleted_at", "name", "position", "number", "retired", "injured", "born_on", "notes", "suspended"],
23
+ "include"=>{
24
+ "team"=>{"only"=>[PK_COLUMN.to_s, "created_at", "updated_at", "name", "logo_url", "manager", "ballpark", "mascot", "founded", "wins", "losses", "win_percentage", "revenue", "color"]},
25
+ "draft"=>{"only"=>[PK_COLUMN.to_s, "created_at", "updated_at", "date", "round", "pick", "overall", "college", "notes"]},
26
+ "comments"=>{"only"=>[PK_COLUMN.to_s, "content", "created_at", "updated_at"]}
27
+ }
28
+ }
29
+ end
30
+
31
+ describe "POST /admin/players/export (prompt)" do
32
+
33
+ it "allows to export to CSV with associations and default schema, containing properly translated header and follow configuration" do
34
+ RailsAdmin.config do |c|
35
+ c.model Player do
36
+ include_all_fields
37
+ field :name do
38
+ export_value do
39
+ "#{value} exported"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ visit export_path(:model_name => 'player')
46
+ should have_content 'Select fields to export'
47
+ select "<comma> ','", :from => "csv_options_generator_col_sep"
48
+ click_button 'Export to csv'
49
+ csv = CSV.parse page.driver.response.body.force_encoding("utf-8") # comes through as us-ascii on some platforms
50
+ expect(csv[0]).to match_array ["Id", "Created at", "Updated at", "Deleted at", "Name", "Position",
51
+ "Number", "Retired", "Injured", "Born on", "Notes", "Suspended", "Id [Team]", "Created at [Team]",
52
+ "Updated at [Team]", "Name [Team]", "Logo url [Team]", "Team Manager [Team]", "Ballpark [Team]",
53
+ "Mascot [Team]", "Founded [Team]", "Wins [Team]", "Losses [Team]", "Win percentage [Team]",
54
+ "Revenue [Team]", "Color [Team]", "Custom field [Team]", "Id [Draft]", "Created at [Draft]",
55
+ "Updated at [Draft]", "Date [Draft]", "Round [Draft]", "Pick [Draft]", "Overall [Draft]",
56
+ "College [Draft]", "Notes [Draft]", "Id [Comments]", "Content [Comments]", "Created at [Comments]",
57
+ "Updated at [Comments]"]
58
+ expect(csv.flatten).to include(@player.name + " exported")
59
+ expect(csv.flatten).to include(@player.team.name)
60
+ expect(csv.flatten).to include(@player.draft.college)
61
+
62
+ expect(csv.flatten.join(' ')).to include(@player.comments.first.content.split("\n").first.strip)
63
+ expect(csv.flatten.join(' ')).to include(@player.comments.second.content.split("\n").first.strip)
64
+ end
65
+
66
+ it "allows to export to JSON" do
67
+ visit export_path(:model_name => 'player')
68
+ click_button 'Export to json'
69
+ should have_content @player.team.name
70
+ end
71
+
72
+ it "allows to export to XML" do
73
+ visit export_path(:model_name => 'player')
74
+ click_button 'Export to xml'
75
+
76
+ # spec fails on non 1.9 mri rubies because of this https://github.com/rails/rails/pull/2076
77
+ # waiting for fix (rails-3.1.4?)
78
+ # and Mongoid with ActiveModel 3.1 does not support to_xml's :include options
79
+ # (due change of implementation in ActiveModel::Serializers between 3.1 and 3.2)
80
+ if RUBY_VERSION =~ /1\.9/ &&
81
+ (CI_ORM != :mongoid || (CI_ORM == :mongoid && ActiveModel::VERSION::STRING >= "3.2"))
82
+ should have_content @player.team.name
83
+ end
84
+ end
85
+
86
+ it "exports polymorphic fields the easy way for now" do
87
+ visit export_path(:model_name => 'comment')
88
+ select "<comma> ','", :from => "csv_options_generator_col_sep"
89
+ click_button 'Export to csv'
90
+ csv = CSV.parse page.driver.response.body
91
+ expect(csv[0]).to match_array ["Id", "Commentable", "Commentable type", "Content", "Created at", "Updated at"]
92
+ csv[1..-1].each do |line|
93
+ expect(line[csv[0].index('Commentable')]).to eq(@player.id.to_s)
94
+ expect(line[csv[0].index('Commentable type')]).to eq(@player.class.to_s)
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "POST /admin/players/export :format => :csv" do
100
+ it "exports with modified schema" do
101
+ page.driver.post(export_path(:model_name => 'player', :schema => @non_default_schema, :csv => true, :all => true, :csv_options => { :generator => { :col_sep => "," } }))
102
+ csv = CSV.parse find('body').text
103
+ expect(csv[0]).not_to include('Created at')
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,444 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "RailsAdmin Basic List" do
6
+
7
+ subject { page }
8
+
9
+ describe "GET /admin" do
10
+ it "responds successfully" do
11
+ visit dashboard_path
12
+ end
13
+ end
14
+
15
+ describe "GET /admin/typo" do
16
+ it "redirects to dashboard and inform the user the model wasn't found" do
17
+ visit '/admin/whatever'
18
+ expect(page.driver.status_code).to eq(404)
19
+ expect(find('.alert-error')).to have_content("Model 'Whatever' could not be found")
20
+ end
21
+ end
22
+
23
+ describe "GET /admin/balls/545-typo" do
24
+ it "redirects to balls index and inform the user the id wasn't found" do
25
+ visit '/admin/ball/545-typo'
26
+ expect(page.driver.status_code).to eq(404)
27
+ expect(find('.alert-error')).to have_content("Ball with id '545-typo' could not be found")
28
+ end
29
+ end
30
+
31
+ describe "GET /admin/player as list" do
32
+ it "shows \"List of Models\", should show filters and should show column headers" do
33
+ RailsAdmin.config.default_items_per_page = 1
34
+ 2.times { FactoryGirl.create :player } # two pages of players
35
+ visit index_path(:model_name => "player")
36
+ should have_content("List of Players")
37
+ should have_content("Created at")
38
+ should have_content("Updated at")
39
+
40
+ # it "shows the show, edit and delete links" do
41
+ should have_selector("li[title='Show'] a")
42
+ should have_selector("li[title='Edit'] a")
43
+ should have_selector("li[title='Delete'] a")
44
+
45
+ # it "has the search box with some prompt text" do
46
+ should have_selector("input[placeholder='Filter']")
47
+
48
+ # https://github.com/sferik/rails_admin/issues/362
49
+ # test that no link uses the "wildcard route" with the main
50
+ # controller and list method
51
+ # it "does not use the 'wildcard route'" do
52
+ should have_selector("a[href*='all=true']") # make sure we're fully testing pagination
53
+ should have_no_selector("a[href^='/rails_admin/main/list']")
54
+ end
55
+ end
56
+
57
+ describe "GET /admin/player" do
58
+ before do
59
+ @teams = 2.times.map do
60
+ FactoryGirl.create(:team)
61
+ end
62
+ @players = [
63
+ FactoryGirl.create(:player, :retired => true, :injured => true, :team => @teams[0]),
64
+ FactoryGirl.create(:player, :retired => true, :injured => false, :team => @teams[0]),
65
+ FactoryGirl.create(:player, :retired => false, :injured => true, :team => @teams[1]),
66
+ FactoryGirl.create(:player, :retired => false, :injured => false, :team => @teams[1]),
67
+ ]
68
+ end
69
+
70
+ it "allows to query on any attribute" do
71
+ RailsAdmin.config Player do
72
+ list do
73
+ field :name
74
+ field :team
75
+ field :injured
76
+ field :retired
77
+ end
78
+ end
79
+
80
+ visit index_path(:model_name => "player", :query => @players[0].name)
81
+ should have_content(@players[0].name)
82
+ (1..3).each do |i|
83
+ should have_no_content(@players[i].name)
84
+ end
85
+ end
86
+
87
+ it "allows to filter on one attribute" do
88
+ RailsAdmin.config Player do
89
+ list do
90
+ field :name
91
+ field :team
92
+ field :injured
93
+ field :retired
94
+ end
95
+ end
96
+
97
+ visit index_path(:model_name => "player", :f => {:injured => {"1" => {:v => "true"}}})
98
+ should have_content(@players[0].name)
99
+ should have_no_content(@players[1].name)
100
+ should have_content(@players[2].name)
101
+ should have_no_content(@players[3].name)
102
+ end
103
+
104
+ it "allows to combine filters on two different attributes" do
105
+ RailsAdmin.config Player do
106
+ list do
107
+ field :name
108
+ field :team
109
+ field :injured
110
+ field :retired
111
+ end
112
+ end
113
+
114
+ visit index_path(:model_name => "player", :f => {:retired => {"1" => {:v => "true"}}, :injured => {"1" => {:v => "true"}}})
115
+ should have_content(@players[0].name)
116
+ (1..3).each do |i|
117
+ should have_no_content(@players[i].name)
118
+ end
119
+ end
120
+
121
+ it "allows to filter on belongs_to relationships" do
122
+ RailsAdmin.config Player do
123
+ list do
124
+ field :name
125
+ field :team
126
+ field :injured
127
+ field :retired
128
+ end
129
+ end
130
+
131
+ visit index_path(:model_name => "player", :f => {:team => {"1" => { :v => @teams[0].name }}})
132
+ should have_content(@players[0].name)
133
+ should have_content(@players[1].name)
134
+ should have_no_content(@players[2].name)
135
+ should have_no_content(@players[3].name)
136
+ end
137
+
138
+ it "allows to disable search on attributes" do
139
+ RailsAdmin.config Player do
140
+ list do
141
+ field :position
142
+ field :name do
143
+ searchable false
144
+ end
145
+ end
146
+ end
147
+ visit index_path(:model_name => "player", :query => @players[0].name)
148
+ should have_no_content(@players[0].name)
149
+ end
150
+
151
+ it "allows to search a belongs_to attribute over the base table" do
152
+ RailsAdmin.config Player do
153
+ list do
154
+ field PK_COLUMN
155
+ field :name
156
+ field :team do
157
+ searchable Player => :team_id
158
+ end
159
+ end
160
+ end
161
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.id}}})
162
+ should have_content(@players[0].name)
163
+ should have_content(@players[1].name)
164
+ should have_no_content(@players[2].name)
165
+ should have_no_content(@players[3].name)
166
+ end
167
+
168
+
169
+ it "allows to search a belongs_to attribute over the target table" do
170
+ RailsAdmin.config Player do
171
+ list do
172
+ field PK_COLUMN
173
+ field :name
174
+ field :team do
175
+ searchable Team => :name
176
+ end
177
+ end
178
+ end
179
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
180
+ should have_content(@players[0].name)
181
+ should have_content(@players[1].name)
182
+ should have_no_content(@players[2].name)
183
+ should have_no_content(@players[3].name)
184
+ end
185
+
186
+ it "allows to search a belongs_to attribute over the target table with a table name specified as a hash" do
187
+ RailsAdmin.config Player do
188
+ list do
189
+ field PK_COLUMN
190
+ field :name
191
+ field :team do
192
+ searchable :teams => :name
193
+ end
194
+ end
195
+ end
196
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
197
+ should have_content(@players[0].name)
198
+ should have_content(@players[1].name)
199
+ should have_no_content(@players[2].name)
200
+ should have_no_content(@players[3].name)
201
+ end
202
+
203
+ it "allows to search a belongs_to attribute over the target table with a table name specified as a string" do
204
+ RailsAdmin.config Player do
205
+ list do
206
+ field PK_COLUMN
207
+ field :name
208
+ field :team do
209
+ searchable 'teams.name'
210
+ end
211
+ end
212
+ end
213
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
214
+ should have_content(@players[0].name)
215
+ should have_content(@players[1].name)
216
+ should have_no_content(@players[2].name)
217
+ should have_no_content(@players[3].name)
218
+ end
219
+
220
+ it "allows to search a belongs_to attribute over the label method by default" do
221
+ RailsAdmin.config Player do
222
+ list do
223
+ field PK_COLUMN
224
+ field :name
225
+ field :team
226
+ end
227
+ end
228
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
229
+ should have_content(@players[0].name)
230
+ should have_content(@players[1].name)
231
+ should have_no_content(@players[2].name)
232
+ should have_no_content(@players[3].name)
233
+ end
234
+
235
+ it "allows to search a belongs_to attribute over the target table when an attribute is specified" do
236
+ RailsAdmin.config Player do
237
+ list do
238
+ field PK_COLUMN
239
+ field :name
240
+ field :team do
241
+ searchable :name
242
+ end
243
+ end
244
+ end
245
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
246
+ should have_content(@players[0].name)
247
+ should have_content(@players[1].name)
248
+ should have_no_content(@players[2].name)
249
+ should have_no_content(@players[3].name)
250
+ end
251
+
252
+ it "allows to search over more than one attribute" do
253
+ RailsAdmin.config Player do
254
+ list do
255
+ field PK_COLUMN
256
+ field :name
257
+ field :team do
258
+ searchable [:name, {Player => :team_id}]
259
+ end
260
+ end
261
+ end
262
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.first.id, :o => 'is'}}})
263
+ should have_content(@players[0].name)
264
+ should have_content(@players[1].name)
265
+ should have_no_content(@players[2].name)
266
+ should have_no_content(@players[3].name)
267
+ # same with a different id
268
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.last.id, :o => 'is'}}})
269
+ should have_no_content(@players[0].name)
270
+ should have_no_content(@players[1].name)
271
+ should have_no_content(@players[2].name)
272
+ should have_no_content(@players[3].name)
273
+ end
274
+
275
+ it "displays base filters when no filters are present in the params" do
276
+ RailsAdmin.config Player do
277
+ list do
278
+ filters [:name, :team]
279
+ end
280
+ end
281
+
282
+ get index_path(:model_name => "player")
283
+ expect(response.body).to include(%{$.filters.append("Name", "name", "string", "", null, "", 1);})
284
+ expect(response.body).to include(%{$.filters.append("Team", "team", "belongs_to_association", "", null, "", 2);})
285
+ end
286
+ end
287
+
288
+ describe "GET /admin/player with 2 objects" do
289
+ before(:each) do
290
+ @players = 2.times.map { FactoryGirl.create :player }
291
+ visit index_path(:model_name => "player")
292
+ end
293
+
294
+ it "shows \"2 results\"" do
295
+ should have_content("2 players")
296
+ end
297
+ end
298
+
299
+ describe "GET /admin/player with 2 objects" do
300
+ before(:each) do
301
+ @players = 2.times.map { FactoryGirl.create :player }
302
+ visit index_path(:model_name => "player")
303
+ end
304
+
305
+ it "shows \"2 results\"" do
306
+ should have_content("2 players")
307
+ end
308
+ end
309
+
310
+ describe "GET /admin/player with 3 pages, page 2" do
311
+ before do
312
+ RailsAdmin.config.default_items_per_page = 1
313
+ items_per_page = RailsAdmin.config.default_items_per_page
314
+ (items_per_page * 3).times { FactoryGirl.create(:player) }
315
+ visit index_path(:model_name => "player", :page => 2)
316
+ end
317
+
318
+ it "paginates correctly" do
319
+ expect(find('.pagination ul li:first')).to have_content("« Prev")
320
+ expect(find('.pagination ul li:last')).to have_content("Next »")
321
+ expect(find('.pagination ul li.active')).to have_content("2")
322
+ end
323
+ end
324
+
325
+ describe "list with 3 pages, page 3" do
326
+ before(:each) do
327
+ items_per_page = RailsAdmin.config.default_items_per_page
328
+ @players = (items_per_page * 3).times.map { FactoryGirl.create(:player) }
329
+ visit index_path(:model_name => "player", :page => 3)
330
+ end
331
+
332
+ it "paginates correctly and contain the right item" do
333
+ expect(find('.pagination ul li:first')).to have_content("« Prev")
334
+ expect(find('.pagination ul li:last')).to have_content("Next »")
335
+ expect(find('.pagination ul li.active')).to have_content("3")
336
+ end
337
+ end
338
+
339
+ describe "GET /admin/player show all" do
340
+ it "responds successfully with a single model" do
341
+ FactoryGirl.create :player
342
+ visit index_path(:model_name => "player", :all => true)
343
+ expect(find('div.total-count')).to have_content("1 player")
344
+ expect(find('div.total-count')).not_to have_content("1 players")
345
+ end
346
+
347
+ it "responds successfully with multiple models" do
348
+ 2.times.map { FactoryGirl.create :player }
349
+ visit index_path(:model_name => "player", :all => true)
350
+ expect(find('div.total-count')).to have_content("2 players")
351
+ end
352
+ end
353
+
354
+ describe "GET /admin/player show with pagination disabled by :associated_collection" do
355
+ it "responds successfully" do
356
+ @team = FactoryGirl.create :team
357
+ 2.times.map { FactoryGirl.create :player, :team => @team }
358
+ visit index_path(:model_name => "player", :associated_collection => "players", :compact => true, :current_action => 'update', :source_abstract_model => 'team', :source_object_id => @team.id)
359
+ expect(find('div.total-count')).to have_content("2 players")
360
+ end
361
+ end
362
+
363
+ describe "list as compact json" do
364
+ it "has_content an array with 2 elements and contain an array of elements with keys id and label" do
365
+ 2.times.map { FactoryGirl.create :player }
366
+ get index_path(:model_name => "player", :compact => true, :format => :json)
367
+ expect(ActiveSupport::JSON.decode(response.body).length).to eq(2)
368
+ ActiveSupport::JSON.decode(response.body).each do |object|
369
+ expect(object).to have_key("id")
370
+ expect(object).to have_key("label")
371
+ end
372
+ end
373
+ end
374
+
375
+ describe "search operator" do
376
+ let(:player) { FactoryGirl.create :player }
377
+
378
+ before do
379
+ expect(Player.count).to eq(0)
380
+ end
381
+
382
+ it "finds the player if the query matches the default search opeartor" do
383
+ RailsAdmin.config do |config|
384
+ config.default_search_operator = 'ends_with'
385
+ config.model Player do
386
+ list { field :name }
387
+ end
388
+ end
389
+ visit index_path(:model_name => "player", :query => player.name[2, -1])
390
+ should have_content(player.name)
391
+ end
392
+
393
+ it "does not find the player if the query does not match the default search opeartor" do
394
+ RailsAdmin.config do |config|
395
+ config.default_search_operator = 'ends_with'
396
+ config.model Player do
397
+ list { field :name }
398
+ end
399
+ end
400
+ visit index_path(:model_name => "player", :query => player.name[0, 2])
401
+ should have_no_content(player.name)
402
+ end
403
+
404
+ it "finds the player if the query matches the specified search operator" do
405
+ RailsAdmin.config Player do
406
+ list do
407
+ field :name do
408
+ search_operator 'starts_with'
409
+ end
410
+ end
411
+ end
412
+ visit index_path(:model_name => "player", :query => player.name[0, 2])
413
+ should have_content(player.name)
414
+ end
415
+
416
+ it "does not find the player if the query does not match the specified search operator" do
417
+ RailsAdmin.config Player do
418
+ list do
419
+ field :name do
420
+ search_operator 'starts_with'
421
+ end
422
+ end
423
+ end
424
+ visit index_path(:model_name => "player", :query => player.name[1..-1])
425
+ should have_no_content(player.name)
426
+ end
427
+ end
428
+
429
+ describe "list for objects with overridden to_param" do
430
+ before(:each) do
431
+ @ball = FactoryGirl.create :ball
432
+
433
+ visit index_path(:model_name => "ball")
434
+ end
435
+
436
+ it "shows the show, edit and delete links with valid url" do
437
+ should have_selector("td a[href='/admin/ball/#{@ball.id}']")
438
+ should have_selector("td a[href='/admin/ball/#{@ball.id}/edit']")
439
+ should have_selector("td a[href='/admin/ball/#{@ball.id}/delete']")
440
+ end
441
+
442
+ end
443
+
444
+ end