upstream-rails_admin 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (556) hide show
  1. data/Gemfile +74 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +162 -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 +543 -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 +129 -0
  53. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +280 -0
  54. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +181 -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 +152 -0
  57. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +135 -0
  58. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +27 -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 +65 -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 +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 +78 -0
  77. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +180 -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 +85 -0
  81. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  82. data/app/assets/stylesheets/rails_admin/themes/cerulean/mixins.css.scss +0 -0
  83. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.css.scss +97 -0
  84. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.css.scss +168 -0
  85. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
  86. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
  87. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
  88. data/app/controllers/rails_admin/application_controller.rb +82 -0
  89. data/app/controllers/rails_admin/main_controller.rb +155 -0
  90. data/app/helpers/rails_admin/application_helper.rb +125 -0
  91. data/app/helpers/rails_admin/form_builder.rb +113 -0
  92. data/app/helpers/rails_admin/main_helper.rb +36 -0
  93. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  94. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  95. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  96. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  97. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  98. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +12 -0
  99. data/app/views/layouts/rails_admin/application.html.haml +26 -0
  100. data/app/views/layouts/rails_admin/pjax.html.haml +20 -0
  101. data/app/views/rails_admin/main/_dashboard_history.html.haml +10 -0
  102. data/app/views/rails_admin/main/_delete_notice.html.haml +18 -0
  103. data/app/views/rails_admin/main/_form_colorpicker.html.haml +1 -0
  104. data/app/views/rails_admin/main/_form_datetime.html.haml +1 -0
  105. data/app/views/rails_admin/main/_form_enumeration.html.haml +1 -0
  106. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  107. data/app/views/rails_admin/main/_form_file_upload.html.haml +13 -0
  108. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +47 -0
  109. data/app/views/rails_admin/main/_form_filtering_select.html.haml +37 -0
  110. data/app/views/rails_admin/main/_form_nested_many.html.haml +14 -0
  111. data/app/views/rails_admin/main/_form_nested_one.html.haml +10 -0
  112. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +10 -0
  113. data/app/views/rails_admin/main/_form_text.html.haml +15 -0
  114. data/app/views/rails_admin/main/_submit_buttons.html.haml +15 -0
  115. data/app/views/rails_admin/main/bulk_delete.html.haml +11 -0
  116. data/app/views/rails_admin/main/dashboard.html.haml +31 -0
  117. data/app/views/rails_admin/main/delete.html.haml +18 -0
  118. data/app/views/rails_admin/main/edit.html.haml +2 -0
  119. data/app/views/rails_admin/main/export.html.haml +75 -0
  120. data/app/views/rails_admin/main/history.html.haml +42 -0
  121. data/app/views/rails_admin/main/index.html.haml +140 -0
  122. data/app/views/rails_admin/main/new.html.haml +2 -0
  123. data/app/views/rails_admin/main/show.html.haml +14 -0
  124. data/config/initializers/active_record_extensions.rb +19 -0
  125. data/config/initializers/devise_patch.rb +9 -0
  126. data/config/initializers/haml.rb +2 -0
  127. data/config/initializers/mongoid_extensions.rb +5 -0
  128. data/config/locales/fr.yml +24 -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 +84 -0
  132. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  133. data/lib/generators/rails_admin/templates/initializer.erb +101 -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 +108 -0
  139. data/lib/rails_admin/adapters/active_record.rb +255 -0
  140. data/lib/rails_admin/adapters/active_record/abstract_object.rb +32 -0
  141. data/lib/rails_admin/adapters/mongoid.rb +390 -0
  142. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +48 -0
  143. data/lib/rails_admin/adapters/mongoid/extension.rb +48 -0
  144. data/lib/rails_admin/config.rb +323 -0
  145. data/lib/rails_admin/config/actions.rb +121 -0
  146. data/lib/rails_admin/config/actions/base.rb +117 -0
  147. data/lib/rails_admin/config/actions/bulk_delete.rb +55 -0
  148. data/lib/rails_admin/config/actions/dashboard.rb +46 -0
  149. data/lib/rails_admin/config/actions/delete.rb +53 -0
  150. data/lib/rails_admin/config/actions/edit.rb +60 -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 +64 -0
  156. data/lib/rails_admin/config/actions/show.rb +32 -0
  157. data/lib/rails_admin/config/actions/show_in_app.rb +28 -0
  158. data/lib/rails_admin/config/configurable.rb +92 -0
  159. data/lib/rails_admin/config/fields.rb +88 -0
  160. data/lib/rails_admin/config/fields/association.rb +108 -0
  161. data/lib/rails_admin/config/fields/base.rb +298 -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/factories/serialized.rb +17 -0
  170. data/lib/rails_admin/config/fields/group.rb +78 -0
  171. data/lib/rails_admin/config/fields/types.rb +27 -0
  172. data/lib/rails_admin/config/fields/types/all.rb +25 -0
  173. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +41 -0
  174. data/lib/rails_admin/config/fields/types/boolean.rb +31 -0
  175. data/lib/rails_admin/config/fields/types/bson_object_id.rb +42 -0
  176. data/lib/rails_admin/config/fields/types/carrierwave.rb +31 -0
  177. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  178. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  179. data/lib/rails_admin/config/fields/types/datetime.rb +163 -0
  180. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  181. data/lib/rails_admin/config/fields/types/dragonfly.rb +41 -0
  182. data/lib/rails_admin/config/fields/types/enum.rb +35 -0
  183. data/lib/rails_admin/config/fields/types/file_upload.rb +61 -0
  184. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  185. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  186. data/lib/rails_admin/config/fields/types/has_many_association.rb +32 -0
  187. data/lib/rails_admin/config/fields/types/has_one_association.rb +39 -0
  188. data/lib/rails_admin/config/fields/types/hidden.rb +21 -0
  189. data/lib/rails_admin/config/fields/types/integer.rb +22 -0
  190. data/lib/rails_admin/config/fields/types/paperclip.rb +28 -0
  191. data/lib/rails_admin/config/fields/types/password.rb +39 -0
  192. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +76 -0
  193. data/lib/rails_admin/config/fields/types/serialized.rb +22 -0
  194. data/lib/rails_admin/config/fields/types/string.rb +41 -0
  195. data/lib/rails_admin/config/fields/types/text.rb +36 -0
  196. data/lib/rails_admin/config/fields/types/time.rb +36 -0
  197. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  198. data/lib/rails_admin/config/groupable.rb +18 -0
  199. data/lib/rails_admin/config/has_fields.rb +135 -0
  200. data/lib/rails_admin/config/has_groups.rb +23 -0
  201. data/lib/rails_admin/config/hideable.rb +28 -0
  202. data/lib/rails_admin/config/model.rb +88 -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 +29 -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 +22 -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 +70 -0
  222. data/lib/rails_admin/extensions/paper_trail.rb +5 -0
  223. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +92 -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 +109 -0
  227. data/lib/rails_admin/version.rb +3 -0
  228. data/lib/tasks/prepare_ci_env.rake +27 -0
  229. data/lib/tasks/rails_admin.rake +18 -0
  230. data/spec/ci.sh +2 -0
  231. data/spec/controllers/application_controller_spec.rb +30 -0
  232. data/spec/controllers/main_controller_spec.rb +179 -0
  233. data/spec/dummy_app/Gemfile +71 -0
  234. data/spec/dummy_app/Gemfile.lock +205 -0
  235. data/spec/dummy_app/Rakefile +7 -0
  236. data/spec/dummy_app/app/active_record/abstract.rb +5 -0
  237. data/spec/dummy_app/app/active_record/ball.rb +9 -0
  238. data/spec/dummy_app/app/active_record/carrierwave_uploader.rb +53 -0
  239. data/spec/dummy_app/app/active_record/category.rb +5 -0
  240. data/spec/dummy_app/app/active_record/cms.rb +5 -0
  241. data/spec/dummy_app/app/active_record/cms/basic_page.rb +9 -0
  242. data/spec/dummy_app/app/active_record/cms/unscoped_page.rb +3 -0
  243. data/spec/dummy_app/app/active_record/comment.rb +5 -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 +20 -0
  248. data/spec/dummy_app/app/active_record/hardball.rb +2 -0
  249. data/spec/dummy_app/app/active_record/league.rb +12 -0
  250. data/spec/dummy_app/app/active_record/nested_field_test.rb +7 -0
  251. data/spec/dummy_app/app/active_record/player.rb +23 -0
  252. data/spec/dummy_app/app/active_record/team.rb +27 -0
  253. data/spec/dummy_app/app/active_record/user.rb +21 -0
  254. data/spec/dummy_app/app/assets/images/rails.png +0 -0
  255. data/spec/dummy_app/app/assets/javascripts/application.js +15 -0
  256. data/spec/dummy_app/app/assets/stylesheets/application.css +13 -0
  257. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  258. data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
  259. data/spec/dummy_app/app/locales/models.en.yml +20 -0
  260. data/spec/dummy_app/app/mongoid/ball.rb +14 -0
  261. data/spec/dummy_app/app/mongoid/carrierwave_uploader.rb +53 -0
  262. data/spec/dummy_app/app/mongoid/category.rb +7 -0
  263. data/spec/dummy_app/app/mongoid/cms.rb +5 -0
  264. data/spec/dummy_app/app/mongoid/cms/basic_page.rb +12 -0
  265. data/spec/dummy_app/app/mongoid/cms/unscoped_page.rb +5 -0
  266. data/spec/dummy_app/app/mongoid/comment.rb +9 -0
  267. data/spec/dummy_app/app/mongoid/division.rb +14 -0
  268. data/spec/dummy_app/app/mongoid/draft.rb +22 -0
  269. data/spec/dummy_app/app/mongoid/embed.rb +6 -0
  270. data/spec/dummy_app/app/mongoid/fan.rb +12 -0
  271. data/spec/dummy_app/app/mongoid/field_test.rb +56 -0
  272. data/spec/dummy_app/app/mongoid/hardball.rb +2 -0
  273. data/spec/dummy_app/app/mongoid/league.rb +16 -0
  274. data/spec/dummy_app/app/mongoid/nested_field_test.rb +12 -0
  275. data/spec/dummy_app/app/mongoid/player.rb +37 -0
  276. data/spec/dummy_app/app/mongoid/team.rb +47 -0
  277. data/spec/dummy_app/app/mongoid/user.rb +61 -0
  278. data/spec/dummy_app/app/views/layouts/application.html.erb +14 -0
  279. data/spec/dummy_app/app/views/players/show.html.haml +1 -0
  280. data/spec/dummy_app/config.ru +4 -0
  281. data/spec/dummy_app/config/application.rb +69 -0
  282. data/spec/dummy_app/config/boot.rb +9 -0
  283. data/spec/dummy_app/config/database.yml +25 -0
  284. data/spec/dummy_app/config/environment.rb +5 -0
  285. data/spec/dummy_app/config/environments/development.rb +37 -0
  286. data/spec/dummy_app/config/environments/production.rb +67 -0
  287. data/spec/dummy_app/config/environments/test.rb +37 -0
  288. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  289. data/spec/dummy_app/config/initializers/devise.rb +223 -0
  290. data/spec/dummy_app/config/initializers/dragonfly.rb +14 -0
  291. data/spec/dummy_app/config/initializers/inflections.rb +15 -0
  292. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  293. data/spec/dummy_app/config/initializers/rails_admin.rb +8 -0
  294. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  295. data/spec/dummy_app/config/initializers/session_patch.rb +16 -0
  296. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  297. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  298. data/spec/dummy_app/config/mongoid.yml +11 -0
  299. data/spec/dummy_app/config/routes.rb +10 -0
  300. data/spec/dummy_app/db/development.sqlite3 +0 -0
  301. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  302. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  303. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  304. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  305. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  306. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +49 -0
  307. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  308. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  309. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  310. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  311. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  312. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  313. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  314. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  315. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  316. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  317. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  318. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  319. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  320. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  321. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  322. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  323. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  324. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  325. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  326. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  327. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  328. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  329. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  330. data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
  331. data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
  332. data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
  333. data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
  334. data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
  335. data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
  336. data/spec/dummy_app/db/migrate/20120319041705_drop_rel_tests.rb +15 -0
  337. data/spec/dummy_app/db/schema.rb +188 -0
  338. data/spec/dummy_app/db/seeds.rb +29 -0
  339. data/spec/dummy_app/db/test.sqlite3 +0 -0
  340. data/spec/dummy_app/doc/README_FOR_APP +2 -0
  341. data/spec/dummy_app/log/development.log +865 -0
  342. data/spec/dummy_app/log/test.log +36651 -0
  343. data/spec/dummy_app/public/404.html +26 -0
  344. data/spec/dummy_app/public/422.html +26 -0
  345. data/spec/dummy_app/public/500.html +25 -0
  346. data/spec/dummy_app/public/favicon.ico +0 -0
  347. data/spec/dummy_app/public/robots.txt +5 -0
  348. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
  349. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
  350. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
  351. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
  352. data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
  353. data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
  354. data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
  355. data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
  356. data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
  357. data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
  358. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
  359. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
  360. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
  361. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
  362. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
  363. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
  364. data/spec/dummy_app/script/rails +6 -0
  365. data/spec/dummy_app/tmp/cache/assets/BE5/B00/sprockets%2F47892969925432da563a88e366309859 +1833 -0
  366. data/spec/dummy_app/tmp/cache/assets/C1C/C90/sprockets%2F4c1f0504074864b8b21792c77391e206 +0 -0
  367. data/spec/dummy_app/tmp/cache/assets/C29/F50/sprockets%2F6d087f33314fd5091b1270969287268b +0 -0
  368. data/spec/dummy_app/tmp/cache/assets/C2C/130/sprockets%2F2d09a75917207f5a55929639226b4b48 +26 -0
  369. data/spec/dummy_app/tmp/cache/assets/C49/FD0/sprockets%2F07901b5391110eea9648d5c25d481327 +0 -0
  370. data/spec/dummy_app/tmp/cache/assets/C63/BF0/sprockets%2F600472e1a4718315162a7cb0f285a02b +547 -0
  371. data/spec/dummy_app/tmp/cache/assets/C66/0B0/sprockets%2F2560ef2871b489690ff209e164d86665 +635 -0
  372. data/spec/dummy_app/tmp/cache/assets/C68/560/sprockets%2F5996692771c33962a9a2c72790ddd754 +0 -0
  373. data/spec/dummy_app/tmp/cache/assets/C83/F90/sprockets%2Fa580b424c36c26dd59f660078d541755 +0 -0
  374. data/spec/dummy_app/tmp/cache/assets/C86/C30/sprockets%2F23ca33803f8248991f3fa8d2104e9961 +0 -0
  375. data/spec/dummy_app/tmp/cache/assets/C88/790/sprockets%2F538d9562b05167d03d26b0e5e9f78830 +5 -0
  376. data/spec/dummy_app/tmp/cache/assets/C89/3B0/sprockets%2F503f729e1bc985e17b730122c7176f97 +0 -0
  377. data/spec/dummy_app/tmp/cache/assets/C95/A00/sprockets%2F458c72992a558902c05a9d6d99339af2 +4 -0
  378. data/spec/dummy_app/tmp/cache/assets/C97/4C0/sprockets%2F97a81a953151b41a100165fb83dfa023 +133 -0
  379. data/spec/dummy_app/tmp/cache/assets/C9A/C90/sprockets%2F400271d29a3bb9124a286ba761c3f254 +0 -0
  380. data/spec/dummy_app/tmp/cache/assets/C9D/BA0/sprockets%2F1bfd091b2034980851caa077c0892c40 +490 -0
  381. data/spec/dummy_app/tmp/cache/assets/CA2/FA0/sprockets%2F0c3f1c8708606aa0440c866138d1e9a2 +0 -0
  382. data/spec/dummy_app/tmp/cache/assets/CA7/480/sprockets%2F23a375f496616605e4144a21fb4dc83a +4 -0
  383. data/spec/dummy_app/tmp/cache/assets/CB1/8A0/sprockets%2F25c2eb1d72087ed5e863f217109b6069 +0 -0
  384. data/spec/dummy_app/tmp/cache/assets/CB3/B50/sprockets%2F03a7c1f7144eb79946ceb8e151772127 +0 -0
  385. data/spec/dummy_app/tmp/cache/assets/CC4/220/sprockets%2F8d947b008798f16134b7d576fa456ce4 +285 -0
  386. data/spec/dummy_app/tmp/cache/assets/CC7/F70/sprockets%2F1a1af5b2c6473f104b2f0b252a729338 +0 -0
  387. data/spec/dummy_app/tmp/cache/assets/CD1/C70/sprockets%2F75b65e7751a3f030d43c1cf6827cc100 +133 -0
  388. data/spec/dummy_app/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
  389. data/spec/dummy_app/tmp/cache/assets/CD8/430/sprockets%2Fc89f860631079a34d3c0d662aac0d256 +635 -0
  390. data/spec/dummy_app/tmp/cache/assets/CD8/AF0/sprockets%2Ffa2b25b3f4c05f51086482175c970ca7 +0 -0
  391. data/spec/dummy_app/tmp/cache/assets/CD9/590/sprockets%2F6882cdc2e05726d5172e2b9b334ec007 +0 -0
  392. data/spec/dummy_app/tmp/cache/assets/CD9/E00/sprockets%2F233f366461a5722d7dfb7a0ecd064087 +0 -0
  393. data/spec/dummy_app/tmp/cache/assets/CDA/880/sprockets%2Fa1e3e4ae81b451c8b4b798061148a358 +275 -0
  394. data/spec/dummy_app/tmp/cache/assets/CE2/490/sprockets%2Fab26cd4524240da60a93659780f9ae78 +0 -0
  395. data/spec/dummy_app/tmp/cache/assets/CEC/270/sprockets%2Fb531a7fa499c7953ab753fa911a61799 +328 -0
  396. data/spec/dummy_app/tmp/cache/assets/CFD/D70/sprockets%2F79acf34495d5196bd47278685b4ee68b +237 -0
  397. data/spec/dummy_app/tmp/cache/assets/CFE/060/sprockets%2Fd97e1e070419bcfe35c7000d1a70427b +303 -0
  398. data/spec/dummy_app/tmp/cache/assets/D02/8B0/sprockets%2F0c493e35ea651c55155b2a383bf2d34d +0 -0
  399. data/spec/dummy_app/tmp/cache/assets/D04/A20/sprockets%2Fa264585296de2351212f1063ebcccd9b +1092 -0
  400. data/spec/dummy_app/tmp/cache/assets/D0F/EA0/sprockets%2F4a754f04f5d1c8995a01927bbd074fa4 +0 -0
  401. data/spec/dummy_app/tmp/cache/assets/D11/470/sprockets%2F67d64aa5490686515e07cdb8ae05b4c6 +9 -0
  402. data/spec/dummy_app/tmp/cache/assets/D12/F60/sprockets%2F6ac89a4a48bf0e3bb6364925661da565 +0 -0
  403. data/spec/dummy_app/tmp/cache/assets/D15/3D0/sprockets%2F7ef98ea43116410c4c50ffff444428c8 +1376 -0
  404. data/spec/dummy_app/tmp/cache/assets/D17/9B0/sprockets%2F3154059ed98209719dc1a7c493cb0fff +381 -0
  405. data/spec/dummy_app/tmp/cache/assets/D20/9E0/sprockets%2F9e5560466ce41eac747392c97eef4c51 +0 -0
  406. data/spec/dummy_app/tmp/cache/assets/D24/B30/sprockets%2F69d62273002dffc74f5368f55dfb97f3 +0 -0
  407. data/spec/dummy_app/tmp/cache/assets/D2D/840/sprockets%2F6f3b681ef8ba260acc705e3b262425a0 +0 -0
  408. data/spec/dummy_app/tmp/cache/assets/D2F/7C0/sprockets%2F99f6619fe89012fb9908a47ebb9b92a8 +7 -0
  409. data/spec/dummy_app/tmp/cache/assets/D2F/D60/sprockets%2Fa0cb0b3d7d775c4707c42a58fb0d2615 +9409 -0
  410. data/spec/dummy_app/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
  411. data/spec/dummy_app/tmp/cache/assets/D3A/260/sprockets%2F35a5b51d1927651a39e3edca8c483dd1 +0 -0
  412. data/spec/dummy_app/tmp/cache/assets/D3B/F80/sprockets%2F304efb1d2d219915606f3fd96b3bf5c2 +9409 -0
  413. data/spec/dummy_app/tmp/cache/assets/D3C/7C0/sprockets%2F6a50cb4a5d265838f510fc8e6178bae1 +0 -0
  414. data/spec/dummy_app/tmp/cache/assets/D3D/0A0/sprockets%2Fa92066280edcd6b188dc38e35361dd3b +0 -0
  415. data/spec/dummy_app/tmp/cache/assets/D40/9B0/sprockets%2F704cfd791b468a6fba4fb820ec128941 +237 -0
  416. data/spec/dummy_app/tmp/cache/assets/D40/E10/sprockets%2F97d56619e64ca8c9c514a3aa2a4b339c +0 -0
  417. data/spec/dummy_app/tmp/cache/assets/D42/1F0/sprockets%2Fcaf59e1c6d22bae908a06e476b752791 +0 -0
  418. data/spec/dummy_app/tmp/cache/assets/D43/E30/sprockets%2Fece324b9d4dc935a92333fd0149bf773 +0 -0
  419. data/spec/dummy_app/tmp/cache/assets/D47/520/sprockets%2Ff142cf9478904f9e3ebb31ecc8c50913 +0 -0
  420. data/spec/dummy_app/tmp/cache/assets/D4B/390/sprockets%2Feb90dbdd2a6275f48086881f7b74ee32 +0 -0
  421. data/spec/dummy_app/tmp/cache/assets/D4B/6D0/sprockets%2F760ec9c344d334cfe919a55cf7f6a165 +0 -0
  422. data/spec/dummy_app/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
  423. data/spec/dummy_app/tmp/cache/assets/D53/5C0/sprockets%2Fa93098db097c86d1e33dc86dece09991 +1092 -0
  424. data/spec/dummy_app/tmp/cache/assets/D56/F00/sprockets%2F48f6039e6745b557cbe83957abc8df2d +303 -0
  425. data/spec/dummy_app/tmp/cache/assets/D58/940/sprockets%2F0c3d05522ea3be49ba23372222fdcde7 +328 -0
  426. data/spec/dummy_app/tmp/cache/assets/D58/950/sprockets%2F6ade11e1b9d3ac4736b05aaf039c0804 +0 -0
  427. data/spec/dummy_app/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
  428. data/spec/dummy_app/tmp/cache/assets/D5C/D10/sprockets%2F3fddf4c16115fad562082a5d4f1bd520 +0 -0
  429. data/spec/dummy_app/tmp/cache/assets/D5D/950/sprockets%2F9ed4c3b788618998fefb569a0a58da80 +0 -0
  430. data/spec/dummy_app/tmp/cache/assets/D5F/F30/sprockets%2Fc93672decbf5fb650336d1a67001fba0 +547 -0
  431. data/spec/dummy_app/tmp/cache/assets/D62/4A0/sprockets%2F47b7cb361e1f2e2ce081ea52fe32f640 +0 -0
  432. data/spec/dummy_app/tmp/cache/assets/D65/140/sprockets%2F5cc4a9317d68e31bb0c5b8d3f517a0e4 +0 -0
  433. data/spec/dummy_app/tmp/cache/assets/D6C/170/sprockets%2Fdc1a668e0c34eb1206fc67cf526249cf +0 -0
  434. data/spec/dummy_app/tmp/cache/assets/D71/9B0/sprockets%2Fc98bb1ca9b745d615b0f2f0d963c44d8 +5 -0
  435. data/spec/dummy_app/tmp/cache/assets/D74/020/sprockets%2Fd99999af4693dfa5998fdaf5b68276e6 +0 -0
  436. data/spec/dummy_app/tmp/cache/assets/D74/050/sprockets%2Fab9217b6ce5c3c8969791adc819b2a2b +0 -0
  437. data/spec/dummy_app/tmp/cache/assets/D7A/410/sprockets%2Fd1decdae4824f395df114687f262e78a +381 -0
  438. data/spec/dummy_app/tmp/cache/assets/D7C/630/sprockets%2Fff49f6b45a167453dabfa743e588dd16 +0 -0
  439. data/spec/dummy_app/tmp/cache/assets/D85/CC0/sprockets%2F09f7b34bbc050700a3bcbf6c6c5c1b45 +0 -0
  440. data/spec/dummy_app/tmp/cache/assets/D8F/DD0/sprockets%2F7bd51d74d575ec0bfad624acc81a6040 +0 -0
  441. data/spec/dummy_app/tmp/cache/assets/D93/C20/sprockets%2F2f48ab1ea8216fd918beb173c2a4f04d +0 -0
  442. data/spec/dummy_app/tmp/cache/assets/D9B/920/sprockets%2F4a02c68d7d2e9a072b8cdd5f715ab7c4 +26 -0
  443. data/spec/dummy_app/tmp/cache/assets/D9D/720/sprockets%2Fc7c311fcebe12a3cf86631a4a47f849f +490 -0
  444. data/spec/dummy_app/tmp/cache/assets/D9F/F20/sprockets%2F32f6c0bcea62f9ab09385db3217ee7e8 +0 -0
  445. data/spec/dummy_app/tmp/cache/assets/DA0/8A0/sprockets%2F9aff0ec8777da07337a51280eacd3f4e +768 -0
  446. data/spec/dummy_app/tmp/cache/assets/DA2/DB0/sprockets%2Fa6cfbef08a491ac3397e006bed885b38 +275 -0
  447. data/spec/dummy_app/tmp/cache/assets/DA4/010/sprockets%2F9663c5eebc07fdb49dd221cf84804c6b +0 -0
  448. data/spec/dummy_app/tmp/cache/assets/DA5/FE0/sprockets%2Fc5d487522471a6ab39cac1bf8e7e9b9b +0 -0
  449. data/spec/dummy_app/tmp/cache/assets/DA6/0A0/sprockets%2Fae11a6ff426fe2d094a5cde67159f94d +0 -0
  450. data/spec/dummy_app/tmp/cache/assets/DA9/170/sprockets%2F88a844719bb0fc081d9cfafc0e76ca96 +0 -0
  451. data/spec/dummy_app/tmp/cache/assets/DC2/720/sprockets%2F6a32e6f352ddd183d19dcac10cfc456b +0 -0
  452. data/spec/dummy_app/tmp/cache/assets/DCA/070/sprockets%2F8ec1ae13cf7ba342507cbb8f877a6dd1 +768 -0
  453. data/spec/dummy_app/tmp/cache/assets/DCB/120/sprockets%2Fc29be206ce74d90a4ad1f9a3d9d20f7d +0 -0
  454. data/spec/dummy_app/tmp/cache/assets/DD6/9B0/sprockets%2Fb92fb5cec0493bfdbe8248cd5673f71b +0 -0
  455. data/spec/dummy_app/tmp/cache/assets/DD7/5C0/sprockets%2Fe0912ed75a6ed23afdf293deed66871c +1376 -0
  456. data/spec/dummy_app/tmp/cache/assets/DD8/110/sprockets%2F8dfc7ac2667a017ee469f4cd443cfa8c +0 -0
  457. data/spec/dummy_app/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +21 -0
  458. data/spec/dummy_app/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +21 -0
  459. data/spec/dummy_app/tmp/cache/assets/E05/140/sprockets%2F41bf6f07f45b76cd2eef60ed2ffbb908 +0 -0
  460. data/spec/dummy_app/tmp/cache/assets/E09/FE0/sprockets%2Fc5df928b0e066c9e19ee3f2be8f6dbd0 +0 -0
  461. data/spec/dummy_app/tmp/cache/assets/E30/BF0/sprockets%2Fd35aca629e1763dd5a9deeb6caa78b6c +285 -0
  462. data/spec/dummy_app/tmp/cache/assets/E42/8C0/sprockets%2Faff1c93e2a43b887cbdebf8f9df9087b +0 -0
  463. data/spec/dummy_app/tmp/cache/assets/E61/F10/sprockets%2Fe616dbbacda8602fc9c589aefaf4c34f +1833 -0
  464. data/spec/dummy_app/tmp/cache/assets/E87/8F0/sprockets%2Ff90a7f08fcd06d0faf133fed3edbfa6a +0 -0
  465. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/mixins.css.scssc +0 -0
  466. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/theming.css.scssc +0 -0
  467. data/spec/dummy_app/tmp/cache/sass/0591c977016a0bb372763f6f1cfb8002d44de3b2/variables.css.scssc +0 -0
  468. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/mixins.css.scssc +0 -0
  469. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/theming.css.scssc +0 -0
  470. data/spec/dummy_app/tmp/cache/sass/10238403c134661921596d094764445b02e815fe/variables.css.scssc +0 -0
  471. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/imports.css.scss.erbc +0 -0
  472. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/jquery.colorpicker.css.scssc +0 -0
  473. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/jquery.ui.timepicker.css.scssc +0 -0
  474. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/ra.calendar-additions.css.scssc +0 -0
  475. data/spec/dummy_app/tmp/cache/sass/59e0a00e930df996e5ae01d3215f486bd084d24f/ra.filtering-multiselect.css.scssc +0 -0
  476. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_accordion.scssc +0 -0
  477. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_alerts.scssc +0 -0
  478. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_breadcrumbs.scssc +0 -0
  479. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_button-groups.scssc +0 -0
  480. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_buttons.scssc +0 -0
  481. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_carousel.scssc +0 -0
  482. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_close.scssc +0 -0
  483. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_code.scssc +0 -0
  484. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_component-animations.scssc +0 -0
  485. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_dropdowns.scssc +0 -0
  486. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_forms.scssc +0 -0
  487. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_grid.scssc +0 -0
  488. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_hero-unit.scssc +0 -0
  489. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_labels.scssc +0 -0
  490. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_layouts.scssc +0 -0
  491. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_mixins.scssc +0 -0
  492. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_modals.scssc +0 -0
  493. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_navbar.scssc +0 -0
  494. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_navs.scssc +0 -0
  495. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_pager.scssc +0 -0
  496. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_pagination.scssc +0 -0
  497. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_popovers.scssc +0 -0
  498. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_progress-bars.scssc +0 -0
  499. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_reset.scssc +0 -0
  500. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_scaffolding.scssc +0 -0
  501. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_sprites.scssc +0 -0
  502. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_tables.scssc +0 -0
  503. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_thumbnails.scssc +0 -0
  504. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_tooltip.scssc +0 -0
  505. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_type.scssc +0 -0
  506. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_utilities.scssc +0 -0
  507. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_variables.scssc +0 -0
  508. data/spec/dummy_app/tmp/cache/sass/e49dad041ec24255ebe09b15ccd7ea91f1ab56bd/_wells.scssc +0 -0
  509. data/spec/dummy_app/tmp/cache/sass/ea17b334a44bfc0f3681b2e3e4202c941da9ee82/jquery-ui-1.8.7.custom.css.scssc +0 -0
  510. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/mixins.css.scssc +0 -0
  511. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/theming.css.scssc +0 -0
  512. data/spec/dummy_app/tmp/cache/sass/fb68f840f6ad0344d3dcaecafd4b6ac4e35ca8fe/variables.css.scssc +0 -0
  513. data/spec/dummy_app/tmp/dragonfly/cache/body/67/c49ea211b51fee9c0ccde26af73f27446aa071 +1 -0
  514. data/spec/dummy_app/tmp/dragonfly/cache/body/da/39a3ee5e6b4b0d3255bfef95601890afd80709 +0 -0
  515. data/spec/dummy_app/tmp/dragonfly/cache/body/e7/536a0250f5395f318c24bee30dbbb0a2a28714 +24 -0
  516. data/spec/dummy_app/tmp/dragonfly/cache/body/f0/76846cb5891d588ad63ea7f6451e26b4f48c3d +19 -0
  517. data/spec/dummy_app/tmp/dragonfly/cache/meta/26/1464d915347774c08b1ddf6d305783e3acfadb +0 -0
  518. data/spec/dummy_app/tmp/dragonfly/cache/meta/7f/29e62b90d2b255e74d7e1a8ee8ed509c3f0406 +0 -0
  519. data/spec/dummy_app/tmp/dragonfly/cache/meta/c1/0f5c4fe64b3d3cffe2793ad7a8e51aeb4f3eec +0 -0
  520. data/spec/dummy_app/tmp/dragonfly/cache/meta/fe/97fd48b64023fee9cc7d8a12f0f1e9097058da +0 -0
  521. data/spec/factories.rb +71 -0
  522. data/spec/helpers/application_helper_spec.rb +277 -0
  523. data/spec/integration/authorization/cancan_spec.rb +358 -0
  524. data/spec/integration/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  525. data/spec/integration/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +42 -0
  526. data/spec/integration/basic/create/rails_admin_basic_create_spec.rb +141 -0
  527. data/spec/integration/basic/create/rails_admin_namespaced_model_create_spec.rb +23 -0
  528. data/spec/integration/basic/delete/rails_admin_basic_delete_spec.rb +27 -0
  529. data/spec/integration/basic/destroy/rails_admin_basic_destroy_spec.rb +56 -0
  530. data/spec/integration/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
  531. data/spec/integration/basic/export/rails_admin_basic_export_spec.rb +106 -0
  532. data/spec/integration/basic/list/rails_admin_basic_list_spec.rb +400 -0
  533. data/spec/integration/basic/new/rails_admin_basic_new_spec.rb +74 -0
  534. data/spec/integration/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  535. data/spec/integration/basic/show/rails_admin_basic_show_spec.rb +91 -0
  536. data/spec/integration/basic/update/rails_admin_basic_update_spec.rb +223 -0
  537. data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +1043 -0
  538. data/spec/integration/config/list/rails_admin_config_list_spec.rb +521 -0
  539. data/spec/integration/config/show/rails_admin_config_show_spec.rb +312 -0
  540. data/spec/integration/history/rails_admin_history_spec.rb +65 -0
  541. data/spec/integration/rails_admin_spec.rb +113 -0
  542. data/spec/integration/relation_spec.rb +35 -0
  543. data/spec/orm/active_record.rb +42 -0
  544. data/spec/orm/mongoid.rb +19 -0
  545. data/spec/spec_helper.rb +79 -0
  546. data/spec/unit/abstract_model_spec.rb +45 -0
  547. data/spec/unit/adapters/active_record/abstract_object_spec.rb +132 -0
  548. data/spec/unit/adapters/active_record_spec.rb +373 -0
  549. data/spec/unit/adapters/mongoid/abstract_object_spec.rb +31 -0
  550. data/spec/unit/adapters/mongoid_spec.rb +686 -0
  551. data/spec/unit/config/actions_spec.rb +181 -0
  552. data/spec/unit/config/fields/base_spec.rb +339 -0
  553. data/spec/unit/config/model_spec.rb +75 -0
  554. data/spec/unit/config/sections_spec.rb +123 -0
  555. data/spec/unit/config_spec.rb +278 -0
  556. metadata +1317 -0
@@ -0,0 +1,237 @@
1
+ o: ActiveSupport::Cache::Entry :@expires_in0:@compressedF: @value"�'{"content_type"application/javascript"
2
+ class"ProcessedAsset"dependency_digest"%7f6f61ce59398ccfcd0bb43dd7435d54"
3
+ mtime"2012-04-28T19:31:44-05:00"
4
+ mtime"2012-04-28T19:31:44-05:00" digest"%f45753f40f0237b53b1b80f35094cb33" path"f/Library/Ruby/Gems/1.8/gems/remotipart-1.0.2/vendor/assets/javascripts/jquery.iframe-transport.js" digest"%f45753f40f0237b53b1b80f35094cb33"required_paths["f/Library/Ruby/Gems/1.8/gems/remotipart-1.0.2/vendor/assets/javascripts/jquery.iframe-transport.js"
5
+ // [transport](http://api.jquery.com/extending-ajax/#Transports) so that
6
+ // `$.ajax()` calls support the uploading of files using standard HTML file
7
+ // input fields. This is done by switching the exchange from `XMLHttpRequest` to
8
+ // a hidden `iframe` element containing a form that is submitted.
9
+
10
+ // The [source for the plugin](http://github.com/cmlenz/jquery-iframe-transport)
11
+ // is available on [Github](http://github.com/) and dual licensed under the MIT
12
+ // or GPL Version 2 licenses.
13
+
14
+ // ## Usage
15
+
16
+ // To use this plugin, you simply add a `iframe` option with the value `true`
17
+ // to the Ajax settings an `$.ajax()` call, and specify the file fields to
18
+ // include in the submssion using the `files` option, which can be a selector,
19
+ // jQuery object, or a list of DOM elements containing one or more
20
+ // `<input type="file">` elements:
21
+
22
+ // $("#myform").submit(function() {
23
+ // $.ajax(this.action, {
24
+ // files: $(":file", this),
25
+ // iframe: true
26
+ // }).complete(function(data) {
27
+ // console.log(data);
28
+ // });
29
+ // });
30
+
31
+ // The plugin will construct a hidden `<iframe>` element containing a copy of
32
+ // the form the file field belongs to, will disable any form fields not
33
+ // explicitly included, submit that form, and process the response.
34
+
35
+ // If you want to include other form fields in the form submission, include them
36
+ // in the `data` option, and set the `processData` option to `false`:
37
+
38
+ // $("#myform").submit(function() {
39
+ // $.ajax(this.action, {
40
+ // data: $(":text", this).serializeArray(),
41
+ // files: $(":file", this),
42
+ // iframe: true,
43
+ // processData: false
44
+ // }).complete(function(data) {
45
+ // console.log(data);
46
+ // });
47
+ // });
48
+
49
+ // ### The Server Side
50
+
51
+ // If the response is not HTML or XML, you (unfortunately) need to apply some
52
+ // trickery on the server side. To send back a JSON payload, send back an HTML
53
+ // `<textarea>` element with a `data-type` attribute that contains the MIME
54
+ // type, and put the actual payload in the textarea:
55
+
56
+ // <textarea data-type="application/json">
57
+ // {"ok": true, "message": "Thanks so much"}
58
+ // </textarea>
59
+
60
+ // The iframe transport plugin will detect this and attempt to apply the same
61
+ // conversions that jQuery applies to regular responses. That means for the
62
+ // example above you should get a Javascript object as the `data` parameter of
63
+ // the `complete` callback, with the properties `ok: true` and
64
+ // `message: "Thanks so much"`.
65
+
66
+ // ### Compatibility
67
+
68
+ // This plugin has primarily been tested on Safari 5, Firefox 4, and Internet
69
+ // Explorer all the way back to version 6. While I haven't found any issues with
70
+ // it so far, I'm fairly sure it still doesn't work around all the quirks in all
71
+ // different browsers. But the code is still pretty simple overall, so you
72
+ // should be able to fix it and contribute a patch :)
73
+
74
+ // ## Annotated Source
75
+
76
+ (function($, undefined) {
77
+
78
+ // Register a prefilter that checks whether the `iframe` option is set, and
79
+ // switches to the iframe transport if it is `true`.
80
+ $.ajaxPrefilter(function(options, origOptions, jqXHR) {
81
+ if (options.iframe) {
82
+ return "iframe";
83
+ }
84
+ });
85
+
86
+ // Register an iframe transport, independent of requested data type. It will
87
+ // only activate when the "files" option has been set to a non-empty list of
88
+ // enabled file inputs.
89
+ $.ajaxTransport("iframe", function(options, origOptions, jqXHR) {
90
+ var form = null,
91
+ iframe = null,
92
+ origAction = null,
93
+ origTarget = null,
94
+ origEnctype = null,
95
+ addedFields = [],
96
+ disabledFields = [],
97
+ files = $(options.files).filter(":file:enabled");
98
+
99
+ // This function gets called after a successful submission or an abortion
100
+ // and should revert all changes made to the page to enable the
101
+ // submission via this transport.
102
+ function cleanUp() {
103
+ $(addedFields).each(function() {
104
+ this.remove();
105
+ });
106
+ $(disabledFields).each(function() {
107
+ this.disabled = false;
108
+ });
109
+ form.attr("action", origAction || "")
110
+ .attr("target", origTarget || "")
111
+ .attr("enctype", origEnctype || "");
112
+ iframe.attr("src", "javascript:false;").remove();
113
+ }
114
+
115
+ // Remove "iframe" from the data types list so that further processing is
116
+ // based on the content type returned by the server, without attempting an
117
+ // (unsupported) conversion from "iframe" to the actual type.
118
+ options.dataTypes.shift();
119
+
120
+ if (files.length) {
121
+ // Determine the form the file fields belong to, and make sure they all
122
+ // actually belong to the same form.
123
+ files.each(function() {
124
+ if (form !== null && this.form !== form) {
125
+ jQuery.error("All file fields must belong to the same form");
126
+ }
127
+ form = this.form;
128
+ });
129
+ form = $(form);
130
+
131
+ // Store the original form attributes that we'll be replacing temporarily.
132
+ origAction = form.attr("action");
133
+ origTarget = form.attr("target");
134
+ origEnctype = form.attr("enctype");
135
+
136
+ // We need to disable all other inputs in the form so that they don't get
137
+ // included in the submitted data unexpectedly.
138
+ form.find(":input:not(:submit)").each(function() {
139
+ if (!this.disabled && (this.type != "file" || files.index(this) < 0)) {
140
+ this.disabled = true;
141
+ disabledFields.push(this);
142
+ }
143
+ });
144
+
145
+ // If there is any additional data specified via the `data` option,
146
+ // we add it as hidden fields to the form. This (currently) requires
147
+ // the `processData` option to be set to false so that the data doesn't
148
+ // get serialized to a string.
149
+ if (typeof(options.data) === "string" && options.data.length > 0) {
150
+ jQuery.error("data must not be serialized");
151
+ }
152
+ $.each(options.data || {}, function(name, value) {
153
+ if ($.isPlainObject(value)) {
154
+ name = value.name;
155
+ value = value.value;
156
+ }
157
+ addedFields.push($("<input type='hidden'>").attr("name", name)
158
+ .attr("value", value).appendTo(form));
159
+ });
160
+
161
+ // Add a hidden `X-Requested-With` field with the value `IFrame` to the
162
+ // field, to help server-side code to determine that the upload happened
163
+ // through this transport.
164
+ addedFields.push($("<input type='hidden' name='X-Requested-With'>")
165
+ .attr("value", "IFrame").appendTo(form));
166
+
167
+ // Borrowed straight from the JQuery source
168
+ // Provides a way of specifying the accepted data type similar to HTTP_ACCEPTS
169
+ accepts = options.dataTypes[ 0 ] && options.accepts[ options.dataTypes[0] ] ?
170
+ options.accepts[ options.dataTypes[0] ] + ( options.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
171
+ options.accepts[ "*" ]
172
+
173
+ addedFields.push($("<input type='hidden' name='X-Http-Accept'>")
174
+ .attr("value", accepts).appendTo(form));
175
+
176
+ return {
177
+
178
+ // The `send` function is called by jQuery when the request should be
179
+ // sent.
180
+ send: function(headers, completeCallback) {
181
+ iframe = $("<iframe src='javascript:false;' name='iframe-" + $.now()
182
+ + "' style='display:none'></iframe>");
183
+
184
+ // The first load event gets fired after the iframe has been injected
185
+ // into the DOM, and is used to prepare the actual submission.
186
+ iframe.bind("load", function() {
187
+
188
+ // The second load event gets fired when the response to the form
189
+ // submission is received. The implementation detects whether the
190
+ // actual payload is embedded in a `<textarea>` element, and
191
+ // prepares the required conversions to be made in that case.
192
+ iframe.unbind("load").bind("load", function() {
193
+
194
+ var doc = this.contentWindow ? this.contentWindow.document :
195
+ (this.contentDocument ? this.contentDocument : this.document),
196
+ root = doc.documentElement ? doc.documentElement : doc.body,
197
+ textarea = root.getElementsByTagName("textarea")[0],
198
+ type = textarea ? textarea.getAttribute("data-type") : null;
199
+
200
+ var status = textarea ? parseInt(textarea.getAttribute("response-code")) : 200,
201
+ statusText = "OK",
202
+ responses = { text: type ? textarea.value : root ? root.innerHTML : null },
203
+ headers = "Content-Type: " + (type || "text/html")
204
+
205
+ completeCallback(status, statusText, responses, headers);
206
+
207
+ setTimeout(cleanUp, 50);
208
+ });
209
+
210
+ // Now that the load handler has been set up, reconfigure and
211
+ // submit the form.
212
+ form.attr("action", options.url)
213
+ .attr("target", iframe.attr("name"))
214
+ .attr("enctype", "multipart/form-data")
215
+ .get(0).submit();
216
+ });
217
+
218
+ // After everything has been set up correctly, the iframe gets
219
+ // injected into the DOM so that the submission can be initiated.
220
+ iframe.insertAfter(form);
221
+ },
222
+
223
+ // The `abort` function is called by jQuery when the request should be
224
+ // aborted.
225
+ abort: function() {
226
+ if (iframe !== null) {
227
+ iframe.unbind("load").attr("src", "javascript:false;");
228
+ cleanUp();
229
+ }
230
+ }
231
+
232
+ };
233
+ }
234
+ });
235
+
236
+ })(jQuery);
237
+ :@created_atf1335716315.2567511n�
@@ -0,0 +1,1092 @@
1
+ o: ActiveSupport::Cache::Entry :@expires_in0:@compressedF: @value"��{"content_type"application/javascript"
2
+ class"ProcessedAsset"dependency_digest"%0196b7795698446df49f49bf4c583c0d"
3
+ mtime"2012-04-20T18:49:51-05:00"
4
+ {"
5
+ mtime"2012-04-20T18:49:51-05:00" digest"%a5d1de85c8bf668b09833c6f9d7f193b" path"c/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.mouse.js{@"2012-04-28T19:31:29-05:00@"%33830d8b45ce2f9b31ccd9bdf5f3fc6e@"W/Library/Ruby/Gems/1.8/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery.js{@"2012-04-20T18:49:51-05:00@"%c1751dc898908a3b4c26592ef446387a@"d/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.widget.js{@"2012-04-20T18:49:51-05:00@"%40afad9738de38653841af508b418d17@"f/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.sortable.js{@"2012-04-20T18:49:51-05:00@"%7672653a2f5e4eab1758536a65296684@"b/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.core.js" digest"%64e6729b75057f64620c565816e759f9"required_paths[
6
+ "W/Library/Ruby/Gems/1.8/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery.js"b/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.core.js"d/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.widget.js"c/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.mouse.js"f/Library/Ruby/Gems/1.8/gems/jquery-ui-rails-0.2.2/vendor/assets/javascripts/jquery.ui.sortable.js"
7
+
8
+
9
+
10
+ /*!
11
+ * jQuery UI Sortable 1.8.18
12
+ *
13
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
14
+ * Dual licensed under the MIT or GPL Version 2 licenses.
15
+ * http://jquery.org/license
16
+ *
17
+ * http://docs.jquery.com/UI/Sortables
18
+ *
19
+ * Depends:
20
+ * jquery.ui.core.js
21
+ * jquery.ui.mouse.js
22
+ * jquery.ui.widget.js
23
+ */
24
+
25
+ (function( $, undefined ) {
26
+
27
+ $.widget("ui.sortable", $.ui.mouse, {
28
+ widgetEventPrefix: "sort",
29
+ ready: false,
30
+ options: {
31
+ appendTo: "parent",
32
+ axis: false,
33
+ connectWith: false,
34
+ containment: false,
35
+ cursor: 'auto',
36
+ cursorAt: false,
37
+ dropOnEmpty: true,
38
+ forcePlaceholderSize: false,
39
+ forceHelperSize: false,
40
+ grid: false,
41
+ handle: false,
42
+ helper: "original",
43
+ items: '> *',
44
+ opacity: false,
45
+ placeholder: false,
46
+ revert: false,
47
+ scroll: true,
48
+ scrollSensitivity: 20,
49
+ scrollSpeed: 20,
50
+ scope: "default",
51
+ tolerance: "intersect",
52
+ zIndex: 1000
53
+ },
54
+ _create: function() {
55
+
56
+ var o = this.options;
57
+ this.containerCache = {};
58
+ this.element.addClass("ui-sortable");
59
+
60
+ //Get the items
61
+ this.refresh();
62
+
63
+ //Let's determine if the items are being displayed horizontally
64
+ this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
65
+
66
+ //Let's determine the parent's offset
67
+ this.offset = this.element.offset();
68
+
69
+ //Initialize mouse events for interaction
70
+ this._mouseInit();
71
+
72
+ //We're ready to go
73
+ this.ready = true
74
+
75
+ },
76
+
77
+ destroy: function() {
78
+ $.Widget.prototype.destroy.call( this );
79
+ this.element
80
+ .removeClass("ui-sortable ui-sortable-disabled");
81
+ this._mouseDestroy();
82
+
83
+ for ( var i = this.items.length - 1; i >= 0; i-- )
84
+ this.items[i].item.removeData(this.widgetName + "-item");
85
+
86
+ return this;
87
+ },
88
+
89
+ _setOption: function(key, value){
90
+ if ( key === "disabled" ) {
91
+ this.options[ key ] = value;
92
+
93
+ this.widget()
94
+ [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
95
+ } else {
96
+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class
97
+ $.Widget.prototype._setOption.apply(this, arguments);
98
+ }
99
+ },
100
+
101
+ _mouseCapture: function(event, overrideHandle) {
102
+ var that = this;
103
+
104
+ if (this.reverting) {
105
+ return false;
106
+ }
107
+
108
+ if(this.options.disabled || this.options.type == 'static') return false;
109
+
110
+ //We have to refresh the items data once first
111
+ this._refreshItems(event);
112
+
113
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
114
+ var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
115
+ if($.data(this, that.widgetName + '-item') == self) {
116
+ currentItem = $(this);
117
+ return false;
118
+ }
119
+ });
120
+ if($.data(event.target, that.widgetName + '-item') == self) currentItem = $(event.target);
121
+
122
+ if(!currentItem) return false;
123
+ if(this.options.handle && !overrideHandle) {
124
+ var validHandle = false;
125
+
126
+ $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
127
+ if(!validHandle) return false;
128
+ }
129
+
130
+ this.currentItem = currentItem;
131
+ this._removeCurrentsFromItems();
132
+ return true;
133
+
134
+ },
135
+
136
+ _mouseStart: function(event, overrideHandle, noActivation) {
137
+
138
+ var o = this.options, self = this;
139
+ this.currentContainer = this;
140
+
141
+ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
142
+ this.refreshPositions();
143
+
144
+ //Create and append the visible helper
145
+ this.helper = this._createHelper(event);
146
+
147
+ //Cache the helper size
148
+ this._cacheHelperProportions();
149
+
150
+ /*
151
+ * - Position generation -
152
+ * This block generates everything position related - it's the core of draggables.
153
+ */
154
+
155
+ //Cache the margins of the original element
156
+ this._cacheMargins();
157
+
158
+ //Get the next scrolling parent
159
+ this.scrollParent = this.helper.scrollParent();
160
+
161
+ //The element's absolute position on the page minus margins
162
+ this.offset = this.currentItem.offset();
163
+ this.offset = {
164
+ top: this.offset.top - this.margins.top,
165
+ left: this.offset.left - this.margins.left
166
+ };
167
+
168
+ // Only after we got the offset, we can change the helper's position to absolute
169
+ // TODO: Still need to figure out a way to make relative sorting possible
170
+ this.helper.css("position", "absolute");
171
+ this.cssPosition = this.helper.css("position");
172
+
173
+ $.extend(this.offset, {
174
+ click: { //Where the click happened, relative to the element
175
+ left: event.pageX - this.offset.left,
176
+ top: event.pageY - this.offset.top
177
+ },
178
+ parent: this._getParentOffset(),
179
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
180
+ });
181
+
182
+ //Generate the original position
183
+ this.originalPosition = this._generatePosition(event);
184
+ this.originalPageX = event.pageX;
185
+ this.originalPageY = event.pageY;
186
+
187
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
188
+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
189
+
190
+ //Cache the former DOM position
191
+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
192
+
193
+ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
194
+ if(this.helper[0] != this.currentItem[0]) {
195
+ this.currentItem.hide();
196
+ }
197
+
198
+ //Create the placeholder
199
+ this._createPlaceholder();
200
+
201
+ //Set a containment if given in the options
202
+ if(o.containment)
203
+ this._setContainment();
204
+
205
+ if(o.cursor) { // cursor option
206
+ if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
207
+ $('body').css("cursor", o.cursor);
208
+ }
209
+
210
+ if(o.opacity) { // opacity option
211
+ if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
212
+ this.helper.css("opacity", o.opacity);
213
+ }
214
+
215
+ if(o.zIndex) { // zIndex option
216
+ if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
217
+ this.helper.css("zIndex", o.zIndex);
218
+ }
219
+
220
+ //Prepare scrolling
221
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
222
+ this.overflowOffset = this.scrollParent.offset();
223
+
224
+ //Call callbacks
225
+ this._trigger("start", event, this._uiHash());
226
+
227
+ //Recache the helper size
228
+ if(!this._preserveHelperProportions)
229
+ this._cacheHelperProportions();
230
+
231
+
232
+ //Post 'activate' events to possible containers
233
+ if(!noActivation) {
234
+ for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
235
+ }
236
+
237
+ //Prepare possible droppables
238
+ if($.ui.ddmanager)
239
+ $.ui.ddmanager.current = this;
240
+
241
+ if ($.ui.ddmanager && !o.dropBehaviour)
242
+ $.ui.ddmanager.prepareOffsets(this, event);
243
+
244
+ this.dragging = true;
245
+
246
+ this.helper.addClass("ui-sortable-helper");
247
+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
248
+ return true;
249
+
250
+ },
251
+
252
+ _mouseDrag: function(event) {
253
+
254
+ //Compute the helpers position
255
+ this.position = this._generatePosition(event);
256
+ this.positionAbs = this._convertPositionTo("absolute");
257
+
258
+ if (!this.lastPositionAbs) {
259
+ this.lastPositionAbs = this.positionAbs;
260
+ }
261
+
262
+ //Do scrolling
263
+ if(this.options.scroll) {
264
+ var o = this.options, scrolled = false;
265
+ if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
266
+
267
+ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
268
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
269
+ else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
270
+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
271
+
272
+ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
273
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
274
+ else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
275
+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
276
+
277
+ } else {
278
+
279
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
280
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
281
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
282
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
283
+
284
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
285
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
286
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
287
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
288
+
289
+ }
290
+
291
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
292
+ $.ui.ddmanager.prepareOffsets(this, event);
293
+ }
294
+
295
+ //Regenerate the absolute position used for position checks
296
+ this.positionAbs = this._convertPositionTo("absolute");
297
+
298
+ //Set the helper position
299
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
300
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
301
+
302
+ //Rearrange
303
+ for (var i = this.items.length - 1; i >= 0; i--) {
304
+
305
+ //Cache variables and intersection, continue if no intersection
306
+ var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
307
+ if (!intersection) continue;
308
+
309
+ if(itemElement != this.currentItem[0] //cannot intersect with itself
310
+ && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
311
+ && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
312
+ && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
313
+ //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
314
+ ) {
315
+
316
+ this.direction = intersection == 1 ? "down" : "up";
317
+
318
+ if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
319
+ this._rearrange(event, item);
320
+ } else {
321
+ break;
322
+ }
323
+
324
+ this._trigger("change", event, this._uiHash());
325
+ break;
326
+ }
327
+ }
328
+
329
+ //Post events to containers
330
+ this._contactContainers(event);
331
+
332
+ //Interconnect with droppables
333
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
334
+
335
+ //Call callbacks
336
+ this._trigger('sort', event, this._uiHash());
337
+
338
+ this.lastPositionAbs = this.positionAbs;
339
+ return false;
340
+
341
+ },
342
+
343
+ _mouseStop: function(event, noPropagation) {
344
+
345
+ if(!event) return;
346
+
347
+ //If we are using droppables, inform the manager about the drop
348
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
349
+ $.ui.ddmanager.drop(this, event);
350
+
351
+ if(this.options.revert) {
352
+ var self = this;
353
+ var cur = self.placeholder.offset();
354
+
355
+ self.reverting = true;
356
+
357
+ $(this.helper).animate({
358
+ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
359
+ top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
360
+ }, parseInt(this.options.revert, 10) || 500, function() {
361
+ self._clear(event);
362
+ });
363
+ } else {
364
+ this._clear(event, noPropagation);
365
+ }
366
+
367
+ return false;
368
+
369
+ },
370
+
371
+ cancel: function() {
372
+
373
+ var self = this;
374
+
375
+ if(this.dragging) {
376
+
377
+ this._mouseUp({ target: null });
378
+
379
+ if(this.options.helper == "original")
380
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
381
+ else
382
+ this.currentItem.show();
383
+
384
+ //Post deactivating events to containers
385
+ for (var i = this.containers.length - 1; i >= 0; i--){
386
+ this.containers[i]._trigger("deactivate", null, self._uiHash(this));
387
+ if(this.containers[i].containerCache.over) {
388
+ this.containers[i]._trigger("out", null, self._uiHash(this));
389
+ this.containers[i].containerCache.over = 0;
390
+ }
391
+ }
392
+
393
+ }
394
+
395
+ if (this.placeholder) {
396
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
397
+ if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
398
+ if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
399
+
400
+ $.extend(this, {
401
+ helper: null,
402
+ dragging: false,
403
+ reverting: false,
404
+ _noFinalSort: null
405
+ });
406
+
407
+ if(this.domPosition.prev) {
408
+ $(this.domPosition.prev).after(this.currentItem);
409
+ } else {
410
+ $(this.domPosition.parent).prepend(this.currentItem);
411
+ }
412
+ }
413
+
414
+ return this;
415
+
416
+ },
417
+
418
+ serialize: function(o) {
419
+
420
+ var items = this._getItemsAsjQuery(o && o.connected);
421
+ var str = []; o = o || {};
422
+
423
+ $(items).each(function() {
424
+ var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
425
+ if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
426
+ });
427
+
428
+ if(!str.length && o.key) {
429
+ str.push(o.key + '=');
430
+ }
431
+
432
+ return str.join('&');
433
+
434
+ },
435
+
436
+ toArray: function(o) {
437
+
438
+ var items = this._getItemsAsjQuery(o && o.connected);
439
+ var ret = []; o = o || {};
440
+
441
+ items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
442
+ return ret;
443
+
444
+ },
445
+
446
+ /* Be careful with the following core functions */
447
+ _intersectsWith: function(item) {
448
+
449
+ var x1 = this.positionAbs.left,
450
+ x2 = x1 + this.helperProportions.width,
451
+ y1 = this.positionAbs.top,
452
+ y2 = y1 + this.helperProportions.height;
453
+
454
+ var l = item.left,
455
+ r = l + item.width,
456
+ t = item.top,
457
+ b = t + item.height;
458
+
459
+ var dyClick = this.offset.click.top,
460
+ dxClick = this.offset.click.left;
461
+
462
+ var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
463
+
464
+ if( this.options.tolerance == "pointer"
465
+ || this.options.forcePointerForContainers
466
+ || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
467
+ ) {
468
+ return isOverElement;
469
+ } else {
470
+
471
+ return (l < x1 + (this.helperProportions.width / 2) // Right Half
472
+ && x2 - (this.helperProportions.width / 2) < r // Left Half
473
+ && t < y1 + (this.helperProportions.height / 2) // Bottom Half
474
+ && y2 - (this.helperProportions.height / 2) < b ); // Top Half
475
+
476
+ }
477
+ },
478
+
479
+ _intersectsWithPointer: function(item) {
480
+
481
+ var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
482
+ isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
483
+ isOverElement = isOverElementHeight && isOverElementWidth,
484
+ verticalDirection = this._getDragVerticalDirection(),
485
+ horizontalDirection = this._getDragHorizontalDirection();
486
+
487
+ if (!isOverElement)
488
+ return false;
489
+
490
+ return this.floating ?
491
+ ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
492
+ : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
493
+
494
+ },
495
+
496
+ _intersectsWithSides: function(item) {
497
+
498
+ var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
499
+ isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
500
+ verticalDirection = this._getDragVerticalDirection(),
501
+ horizontalDirection = this._getDragHorizontalDirection();
502
+
503
+ if (this.floating && horizontalDirection) {
504
+ return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
505
+ } else {
506
+ return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
507
+ }
508
+
509
+ },
510
+
511
+ _getDragVerticalDirection: function() {
512
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
513
+ return delta != 0 && (delta > 0 ? "down" : "up");
514
+ },
515
+
516
+ _getDragHorizontalDirection: function() {
517
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
518
+ return delta != 0 && (delta > 0 ? "right" : "left");
519
+ },
520
+
521
+ refresh: function(event) {
522
+ this._refreshItems(event);
523
+ this.refreshPositions();
524
+ return this;
525
+ },
526
+
527
+ _connectWith: function() {
528
+ var options = this.options;
529
+ return options.connectWith.constructor == String
530
+ ? [options.connectWith]
531
+ : options.connectWith;
532
+ },
533
+
534
+ _getItemsAsjQuery: function(connected) {
535
+
536
+ var self = this;
537
+ var items = [];
538
+ var queries = [];
539
+ var connectWith = this._connectWith();
540
+
541
+ if(connectWith && connected) {
542
+ for (var i = connectWith.length - 1; i >= 0; i--){
543
+ var cur = $(connectWith[i]);
544
+ for (var j = cur.length - 1; j >= 0; j--){
545
+ var inst = $.data(cur[j], this.widgetName);
546
+ if(inst && inst != this && !inst.options.disabled) {
547
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
548
+ }
549
+ };
550
+ };
551
+ }
552
+
553
+ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
554
+
555
+ for (var i = queries.length - 1; i >= 0; i--){
556
+ queries[i][0].each(function() {
557
+ items.push(this);
558
+ });
559
+ };
560
+
561
+ return $(items);
562
+
563
+ },
564
+
565
+ _removeCurrentsFromItems: function() {
566
+
567
+ var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
568
+
569
+ for (var i=0; i < this.items.length; i++) {
570
+
571
+ for (var j=0; j < list.length; j++) {
572
+ if(list[j] == this.items[i].item[0])
573
+ this.items.splice(i,1);
574
+ };
575
+
576
+ };
577
+
578
+ },
579
+
580
+ _refreshItems: function(event) {
581
+
582
+ this.items = [];
583
+ this.containers = [this];
584
+ var items = this.items;
585
+ var self = this;
586
+ var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
587
+ var connectWith = this._connectWith();
588
+
589
+ if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
590
+ for (var i = connectWith.length - 1; i >= 0; i--){
591
+ var cur = $(connectWith[i]);
592
+ for (var j = cur.length - 1; j >= 0; j--){
593
+ var inst = $.data(cur[j], this.widgetName);
594
+ if(inst && inst != this && !inst.options.disabled) {
595
+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
596
+ this.containers.push(inst);
597
+ }
598
+ };
599
+ };
600
+ }
601
+
602
+ for (var i = queries.length - 1; i >= 0; i--) {
603
+ var targetData = queries[i][1];
604
+ var _queries = queries[i][0];
605
+
606
+ for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
607
+ var item = $(_queries[j]);
608
+
609
+ item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
610
+
611
+ items.push({
612
+ item: item,
613
+ instance: targetData,
614
+ width: 0, height: 0,
615
+ left: 0, top: 0
616
+ });
617
+ };
618
+ };
619
+
620
+ },
621
+
622
+ refreshPositions: function(fast) {
623
+
624
+ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
625
+ if(this.offsetParent && this.helper) {
626
+ this.offset.parent = this._getParentOffset();
627
+ }
628
+
629
+ for (var i = this.items.length - 1; i >= 0; i--){
630
+ var item = this.items[i];
631
+
632
+ //We ignore calculating positions of all connected containers when we're not over them
633
+ if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
634
+ continue;
635
+
636
+ var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
637
+
638
+ if (!fast) {
639
+ item.width = t.outerWidth();
640
+ item.height = t.outerHeight();
641
+ }
642
+
643
+ var p = t.offset();
644
+ item.left = p.left;
645
+ item.top = p.top;
646
+ };
647
+
648
+ if(this.options.custom && this.options.custom.refreshContainers) {
649
+ this.options.custom.refreshContainers.call(this);
650
+ } else {
651
+ for (var i = this.containers.length - 1; i >= 0; i--){
652
+ var p = this.containers[i].element.offset();
653
+ this.containers[i].containerCache.left = p.left;
654
+ this.containers[i].containerCache.top = p.top;
655
+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();
656
+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
657
+ };
658
+ }
659
+
660
+ return this;
661
+ },
662
+
663
+ _createPlaceholder: function(that) {
664
+
665
+ var self = that || this, o = self.options;
666
+
667
+ if(!o.placeholder || o.placeholder.constructor == String) {
668
+ var className = o.placeholder;
669
+ o.placeholder = {
670
+ element: function() {
671
+
672
+ var el = $(document.createElement(self.currentItem[0].nodeName))
673
+ .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
674
+ .removeClass("ui-sortable-helper")[0];
675
+
676
+ if(!className)
677
+ el.style.visibility = "hidden";
678
+
679
+ return el;
680
+ },
681
+ update: function(container, p) {
682
+
683
+ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
684
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
685
+ if(className && !o.forcePlaceholderSize) return;
686
+
687
+ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
688
+ if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
689
+ if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
690
+ }
691
+ };
692
+ }
693
+
694
+ //Create the placeholder
695
+ self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));
696
+
697
+ //Append it after the actual current item
698
+ self.currentItem.after(self.placeholder);
699
+
700
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
701
+ o.placeholder.update(self, self.placeholder);
702
+
703
+ },
704
+
705
+ _contactContainers: function(event) {
706
+
707
+ // get innermost container that intersects with item
708
+ var innermostContainer = null, innermostIndex = null;
709
+
710
+
711
+ for (var i = this.containers.length - 1; i >= 0; i--){
712
+
713
+ // never consider a container that's located within the item itself
714
+ if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
715
+ continue;
716
+
717
+ if(this._intersectsWith(this.containers[i].containerCache)) {
718
+
719
+ // if we've already found a container and it's more "inner" than this, then continue
720
+ if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
721
+ continue;
722
+
723
+ innermostContainer = this.containers[i];
724
+ innermostIndex = i;
725
+
726
+ } else {
727
+ // container doesn't intersect. trigger "out" event if necessary
728
+ if(this.containers[i].containerCache.over) {
729
+ this.containers[i]._trigger("out", event, this._uiHash(this));
730
+ this.containers[i].containerCache.over = 0;
731
+ }
732
+ }
733
+
734
+ }
735
+
736
+ // if no intersecting containers found, return
737
+ if(!innermostContainer) return;
738
+
739
+ // move the item into the container if it's not there already
740
+ if(this.containers.length === 1) {
741
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
742
+ this.containers[innermostIndex].containerCache.over = 1;
743
+ } else if(this.currentContainer != this.containers[innermostIndex]) {
744
+
745
+ //When entering a new container, we will find the item with the least distance and append our item near it
746
+ var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
747
+ for (var j = this.items.length - 1; j >= 0; j--) {
748
+ if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
749
+ var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
750
+ if(Math.abs(cur - base) < dist) {
751
+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
752
+ }
753
+ }
754
+
755
+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
756
+ return;
757
+
758
+ this.currentContainer = this.containers[innermostIndex];
759
+ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
760
+ this._trigger("change", event, this._uiHash());
761
+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
762
+
763
+ //Update the placeholder
764
+ this.options.placeholder.update(this.currentContainer, this.placeholder);
765
+
766
+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
767
+ this.containers[innermostIndex].containerCache.over = 1;
768
+ }
769
+
770
+
771
+ },
772
+
773
+ _createHelper: function(event) {
774
+
775
+ var o = this.options;
776
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
777
+
778
+ if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
779
+ $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
780
+
781
+ if(helper[0] == this.currentItem[0])
782
+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
783
+
784
+ if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
785
+ if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
786
+
787
+ return helper;
788
+
789
+ },
790
+
791
+ _adjustOffsetFromHelper: function(obj) {
792
+ if (typeof obj == 'string') {
793
+ obj = obj.split(' ');
794
+ }
795
+ if ($.isArray(obj)) {
796
+ obj = {left: +obj[0], top: +obj[1] || 0};
797
+ }
798
+ if ('left' in obj) {
799
+ this.offset.click.left = obj.left + this.margins.left;
800
+ }
801
+ if ('right' in obj) {
802
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
803
+ }
804
+ if ('top' in obj) {
805
+ this.offset.click.top = obj.top + this.margins.top;
806
+ }
807
+ if ('bottom' in obj) {
808
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
809
+ }
810
+ },
811
+
812
+ _getParentOffset: function() {
813
+
814
+
815
+ //Get the offsetParent and cache its position
816
+ this.offsetParent = this.helper.offsetParent();
817
+ var po = this.offsetParent.offset();
818
+
819
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
820
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
821
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
822
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
823
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
824
+ po.left += this.scrollParent.scrollLeft();
825
+ po.top += this.scrollParent.scrollTop();
826
+ }
827
+
828
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
829
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
830
+ po = { top: 0, left: 0 };
831
+
832
+ return {
833
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
834
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
835
+ };
836
+
837
+ },
838
+
839
+ _getRelativeOffset: function() {
840
+
841
+ if(this.cssPosition == "relative") {
842
+ var p = this.currentItem.position();
843
+ return {
844
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
845
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
846
+ };
847
+ } else {
848
+ return { top: 0, left: 0 };
849
+ }
850
+
851
+ },
852
+
853
+ _cacheMargins: function() {
854
+ this.margins = {
855
+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
856
+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
857
+ };
858
+ },
859
+
860
+ _cacheHelperProportions: function() {
861
+ this.helperProportions = {
862
+ width: this.helper.outerWidth(),
863
+ height: this.helper.outerHeight()
864
+ };
865
+ },
866
+
867
+ _setContainment: function() {
868
+
869
+ var o = this.options;
870
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
871
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
872
+ 0 - this.offset.relative.left - this.offset.parent.left,
873
+ 0 - this.offset.relative.top - this.offset.parent.top,
874
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
875
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
876
+ ];
877
+
878
+ if(!(/^(document|window|parent)$/).test(o.containment)) {
879
+ var ce = $(o.containment)[0];
880
+ var co = $(o.containment).offset();
881
+ var over = ($(ce).css("overflow") != 'hidden');
882
+
883
+ this.containment = [
884
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
885
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
886
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
887
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
888
+ ];
889
+ }
890
+
891
+ },
892
+
893
+ _convertPositionTo: function(d, pos) {
894
+
895
+ if(!pos) pos = this.position;
896
+ var mod = d == "absolute" ? 1 : -1;
897
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
898
+
899
+ return {
900
+ top: (
901
+ pos.top // The absolute mouse position
902
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
903
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
904
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
905
+ ),
906
+ left: (
907
+ pos.left // The absolute mouse position
908
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
909
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
910
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
911
+ )
912
+ };
913
+
914
+ },
915
+
916
+ _generatePosition: function(event) {
917
+
918
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
919
+
920
+ // This is another very weird special case that only happens for relative elements:
921
+ // 1. If the css position is relative
922
+ // 2. and the scroll parent is the document or similar to the offset parent
923
+ // we have to refresh the relative offset during the scroll so there are no jumps
924
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
925
+ this.offset.relative = this._getRelativeOffset();
926
+ }
927
+
928
+ var pageX = event.pageX;
929
+ var pageY = event.pageY;
930
+
931
+ /*
932
+ * - Position constraining -
933
+ * Constrain the position to a mix of grid, containment.
934
+ */
935
+
936
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
937
+
938
+ if(this.containment) {
939
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
940
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
941
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
942
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
943
+ }
944
+
945
+ if(o.grid) {
946
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
947
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
948
+
949
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
950
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
951
+ }
952
+
953
+ }
954
+
955
+ return {
956
+ top: (
957
+ pageY // The absolute mouse position
958
+ - this.offset.click.top // Click offset (relative to the element)
959
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
960
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
961
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
962
+ ),
963
+ left: (
964
+ pageX // The absolute mouse position
965
+ - this.offset.click.left // Click offset (relative to the element)
966
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
967
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
968
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
969
+ )
970
+ };
971
+
972
+ },
973
+
974
+ _rearrange: function(event, i, a, hardRefresh) {
975
+
976
+ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
977
+
978
+ //Various things done here to improve the performance:
979
+ // 1. we create a setTimeout, that calls refreshPositions
980
+ // 2. on the instance, we have a counter variable, that get's higher after every append
981
+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
982
+ // 4. this lets only the last addition to the timeout stack through
983
+ this.counter = this.counter ? ++this.counter : 1;
984
+ var self = this, counter = this.counter;
985
+
986
+ window.setTimeout(function() {
987
+ if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
988
+ },0);
989
+
990
+ },
991
+
992
+ _clear: function(event, noPropagation) {
993
+
994
+ this.reverting = false;
995
+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and
996
+ // everything else normalized again
997
+ var delayedTriggers = [], self = this;
998
+
999
+ // We first have to update the dom position of the actual currentItem
1000
+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
1001
+ if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
1002
+ this._noFinalSort = null;
1003
+
1004
+ if(this.helper[0] == this.currentItem[0]) {
1005
+ for(var i in this._storedCSS) {
1006
+ if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
1007
+ }
1008
+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
1009
+ } else {
1010
+ this.currentItem.show();
1011
+ }
1012
+
1013
+ if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
1014
+ if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
1015
+ if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
1016
+ if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
1017
+ for (var i = this.containers.length - 1; i >= 0; i--){
1018
+ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
1019
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1020
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1021
+ }
1022
+ };
1023
+ };
1024
+
1025
+ //Post events to containers
1026
+ for (var i = this.containers.length - 1; i >= 0; i--){
1027
+ if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1028
+ if(this.containers[i].containerCache.over) {
1029
+ delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));
1030
+ this.containers[i].containerCache.over = 0;
1031
+ }
1032
+ }
1033
+
1034
+ //Do what was originally in plugins
1035
+ if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
1036
+ if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
1037
+ if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
1038
+
1039
+ this.dragging = false;
1040
+ if(this.cancelHelperRemoval) {
1041
+ if(!noPropagation) {
1042
+ this._trigger("beforeStop", event, this._uiHash());
1043
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
1044
+ this._trigger("stop", event, this._uiHash());
1045
+ }
1046
+ return false;
1047
+ }
1048
+
1049
+ if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
1050
+
1051
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
1052
+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
1053
+
1054
+ if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
1055
+
1056
+ if(!noPropagation) {
1057
+ for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
1058
+ this._trigger("stop", event, this._uiHash());
1059
+ }
1060
+
1061
+ this.fromOutside = false;
1062
+ return true;
1063
+
1064
+ },
1065
+
1066
+ _trigger: function() {
1067
+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
1068
+ this.cancel();
1069
+ }
1070
+ },
1071
+
1072
+ _uiHash: function(inst) {
1073
+ var self = inst || this;
1074
+ return {
1075
+ helper: self.helper,
1076
+ placeholder: self.placeholder || $([]),
1077
+ position: self.position,
1078
+ originalPosition: self.originalPosition,
1079
+ offset: self.positionAbs,
1080
+ item: self.currentItem,
1081
+ sender: inst ? inst.element : null
1082
+ };
1083
+ }
1084
+
1085
+ });
1086
+
1087
+ $.extend($.ui.sortable, {
1088
+ version: "1.8.18"
1089
+ });
1090
+
1091
+ })(jQuery);
1092
+ :@created_atf1335716315.507509{