rails_admin 2.2.1 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (328) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +9 -11
  3. data/README.md +37 -31
  4. data/Rakefile +2 -2
  5. data/app/assets/javascripts/rails_admin.js +21 -0
  6. data/app/assets/stylesheets/rails_admin/custom/mixins.scss +1 -1
  7. data/app/assets/stylesheets/rails_admin/custom/variables.scss +1 -1
  8. data/app/assets/stylesheets/rails_admin.scss.erb +76 -0
  9. data/app/controllers/rails_admin/application_controller.rb +4 -3
  10. data/app/controllers/rails_admin/main_controller.rb +43 -24
  11. data/app/helpers/rails_admin/application_helper.rb +69 -52
  12. data/app/helpers/rails_admin/form_builder.rb +5 -4
  13. data/app/helpers/rails_admin/main_helper.rb +27 -43
  14. data/app/views/kaminari/ra-twitter-bootstrap/_gap.html.erb +5 -0
  15. data/app/views/kaminari/ra-twitter-bootstrap/_next_page.html.erb +9 -0
  16. data/app/views/kaminari/ra-twitter-bootstrap/_page.html.erb +9 -0
  17. data/app/views/kaminari/ra-twitter-bootstrap/_paginator.html.erb +13 -0
  18. data/app/views/kaminari/ra-twitter-bootstrap/_prev_page.html.erb +9 -0
  19. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.erb +9 -0
  20. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.erb +6 -0
  21. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.erb +9 -0
  22. data/app/views/layouts/rails_admin/_head.html.erb +17 -0
  23. data/app/views/layouts/rails_admin/_navigation.html.erb +21 -0
  24. data/app/views/layouts/rails_admin/_secondary_navigation.html.erb +24 -0
  25. data/app/views/layouts/rails_admin/_sidebar_navigation.html.erb +9 -0
  26. data/app/views/layouts/rails_admin/application.html.erb +27 -0
  27. data/app/views/layouts/rails_admin/modal.js.erb +7 -0
  28. data/app/views/layouts/rails_admin/pjax.html.erb +20 -0
  29. data/app/views/rails_admin/main/_dashboard_history.html.erb +45 -0
  30. data/app/views/rails_admin/main/_delete_notice.html.erb +35 -0
  31. data/app/views/rails_admin/main/_form_action_text.html.erb +7 -0
  32. data/app/views/rails_admin/main/_form_boolean.html.erb +16 -0
  33. data/app/views/rails_admin/main/{_form_ck_editor.html.haml → _form_ck_editor.html.erb} +3 -3
  34. data/app/views/rails_admin/main/_form_code_mirror.html.erb +9 -0
  35. data/app/views/rails_admin/main/_form_colorpicker.html.erb +1 -0
  36. data/app/views/rails_admin/main/_form_datetime.html.erb +9 -0
  37. data/app/views/rails_admin/main/_form_enumeration.html.erb +21 -0
  38. data/app/views/rails_admin/main/_form_field.html.erb +1 -0
  39. data/app/views/rails_admin/main/_form_file_upload.html.erb +17 -0
  40. data/app/views/rails_admin/main/{_form_filtering_multiselect.html.haml → _form_filtering_multiselect.html.erb} +11 -11
  41. data/app/views/rails_admin/main/{_form_filtering_select.html.haml → _form_filtering_select.html.erb} +13 -12
  42. data/app/views/rails_admin/main/_form_froala.html.erb +8 -0
  43. data/app/views/rails_admin/main/_form_multiple_file_upload.html.erb +20 -0
  44. data/app/views/rails_admin/main/_form_nested_many.html.erb +21 -0
  45. data/app/views/rails_admin/main/_form_nested_one.html.erb +21 -0
  46. data/app/views/rails_admin/main/_form_polymorphic_association.html.erb +27 -0
  47. data/app/views/rails_admin/main/_form_simple_mde.html.erb +8 -0
  48. data/app/views/rails_admin/main/_form_text.html.erb +1 -0
  49. data/app/views/rails_admin/main/_form_wysihtml5.html.erb +8 -0
  50. data/app/views/rails_admin/main/_submit_buttons.html.erb +25 -0
  51. data/app/views/rails_admin/main/bulk_delete.html.erb +19 -0
  52. data/app/views/rails_admin/main/dashboard.html.erb +64 -0
  53. data/app/views/rails_admin/main/delete.html.erb +21 -0
  54. data/app/views/rails_admin/main/edit.html.erb +3 -0
  55. data/app/views/rails_admin/main/export.html.erb +146 -0
  56. data/app/views/rails_admin/main/history.html.erb +78 -0
  57. data/app/views/rails_admin/main/index.html.erb +193 -0
  58. data/app/views/rails_admin/main/new.html.erb +3 -0
  59. data/app/views/rails_admin/main/show.html.erb +28 -0
  60. data/config/initializers/active_record_extensions.rb +3 -1
  61. data/config/initializers/mongoid_extensions.rb +1 -1
  62. data/config/locales/rails_admin.en.yml +6 -1
  63. data/lib/generators/rails_admin/install_generator.rb +51 -3
  64. data/lib/generators/rails_admin/templates/environment.js +6 -0
  65. data/lib/generators/rails_admin/templates/initializer.erb +2 -1
  66. data/lib/generators/rails_admin/templates/rails_admin.js.erb +2 -0
  67. data/lib/generators/rails_admin/templates/rails_admin.scss +1 -0
  68. data/lib/generators/rails_admin/templates/webpack.config.js +32 -0
  69. data/lib/rails_admin/abstract_model.rb +24 -10
  70. data/lib/rails_admin/adapters/active_record/association.rb +20 -1
  71. data/lib/rails_admin/adapters/active_record/object_extension.rb +29 -0
  72. data/lib/rails_admin/adapters/active_record/property.rb +1 -1
  73. data/lib/rails_admin/adapters/active_record.rb +27 -23
  74. data/lib/rails_admin/adapters/mongoid/association.rb +38 -9
  75. data/lib/rails_admin/adapters/mongoid/bson.rb +4 -5
  76. data/lib/rails_admin/adapters/mongoid/extension.rb +3 -1
  77. data/lib/rails_admin/adapters/mongoid/object_extension.rb +32 -0
  78. data/lib/rails_admin/adapters/mongoid/property.rb +2 -2
  79. data/lib/rails_admin/adapters/mongoid.rb +27 -19
  80. data/lib/rails_admin/config/actions/base.rb +7 -2
  81. data/lib/rails_admin/config/actions/bulk_delete.rb +2 -2
  82. data/lib/rails_admin/config/actions/dashboard.rb +4 -3
  83. data/lib/rails_admin/config/actions/delete.rb +5 -9
  84. data/lib/rails_admin/config/actions/edit.rb +7 -7
  85. data/lib/rails_admin/config/actions/export.rb +2 -2
  86. data/lib/rails_admin/config/actions/history_index.rb +2 -2
  87. data/lib/rails_admin/config/actions/history_show.rb +2 -2
  88. data/lib/rails_admin/config/actions/index.rb +5 -7
  89. data/lib/rails_admin/config/actions/new.rb +9 -9
  90. data/lib/rails_admin/config/actions/show.rb +1 -1
  91. data/lib/rails_admin/config/actions/show_in_app.rb +6 -2
  92. data/lib/rails_admin/config/actions.rb +4 -4
  93. data/lib/rails_admin/config/configurable.rb +2 -2
  94. data/lib/rails_admin/config/fields/association.rb +15 -12
  95. data/lib/rails_admin/config/fields/base.rb +44 -24
  96. data/lib/rails_admin/config/fields/factories/active_storage.rb +1 -0
  97. data/lib/rails_admin/config/fields/factories/association.rb +6 -8
  98. data/lib/rails_admin/config/fields/factories/carrierwave.rb +2 -1
  99. data/lib/rails_admin/config/fields/factories/devise.rb +2 -1
  100. data/lib/rails_admin/config/fields/factories/dragonfly.rb +2 -1
  101. data/lib/rails_admin/config/fields/factories/paperclip.rb +2 -1
  102. data/lib/rails_admin/config/fields/factories/shrine.rb +1 -1
  103. data/lib/rails_admin/config/fields/group.rb +1 -2
  104. data/lib/rails_admin/config/fields/types/active_record_enum.rb +2 -0
  105. data/lib/rails_admin/config/fields/types/active_storage.rb +9 -7
  106. data/lib/rails_admin/config/fields/types/all.rb +1 -0
  107. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +4 -12
  108. data/lib/rails_admin/config/fields/types/boolean.rb +32 -8
  109. data/lib/rails_admin/config/fields/types/carrierwave.rb +1 -0
  110. data/lib/rails_admin/config/fields/types/citext.rb +13 -0
  111. data/lib/rails_admin/config/fields/types/color.rb +6 -2
  112. data/lib/rails_admin/config/fields/types/date.rb +5 -8
  113. data/lib/rails_admin/config/fields/types/datetime.rb +18 -21
  114. data/lib/rails_admin/config/fields/types/decimal.rb +9 -2
  115. data/lib/rails_admin/config/fields/types/dragonfly.rb +3 -1
  116. data/lib/rails_admin/config/fields/types/enum.rb +1 -1
  117. data/lib/rails_admin/config/fields/types/file_upload.rb +4 -3
  118. data/lib/rails_admin/config/fields/types/float.rb +9 -2
  119. data/lib/rails_admin/config/fields/types/has_many_association.rb +1 -5
  120. data/lib/rails_admin/config/fields/types/has_one_association.rb +1 -13
  121. data/lib/rails_admin/config/fields/types/integer.rb +2 -6
  122. data/lib/rails_admin/config/fields/types/multiple_active_storage.rb +8 -6
  123. data/lib/rails_admin/config/fields/types/multiple_carrierwave.rb +1 -0
  124. data/lib/rails_admin/config/fields/types/multiple_file_upload.rb +4 -3
  125. data/lib/rails_admin/config/fields/types/numeric.rb +18 -0
  126. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +3 -2
  127. data/lib/rails_admin/config/fields/types/string.rb +1 -1
  128. data/lib/rails_admin/config/fields/types/time.rb +1 -4
  129. data/lib/rails_admin/config/fields/types/timestamp.rb +0 -4
  130. data/lib/rails_admin/config/fields/types.rb +1 -1
  131. data/lib/rails_admin/config/fields.rb +3 -1
  132. data/lib/rails_admin/config/has_fields.rb +5 -6
  133. data/lib/rails_admin/config/hideable.rb +1 -1
  134. data/lib/rails_admin/config/inspectable.rb +1 -3
  135. data/lib/rails_admin/config/model.rb +10 -10
  136. data/lib/rails_admin/config/sections/base.rb +2 -3
  137. data/lib/rails_admin/config/sections/list.rb +4 -15
  138. data/lib/rails_admin/config/sections.rb +1 -1
  139. data/lib/rails_admin/config.rb +73 -38
  140. data/lib/rails_admin/engine.rb +36 -23
  141. data/lib/rails_admin/extension.rb +6 -14
  142. data/lib/rails_admin/extensions/cancancan/authorization_adapter.rb +4 -2
  143. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +12 -7
  144. data/lib/rails_admin/extensions/pundit/authorization_adapter.rb +6 -7
  145. data/lib/rails_admin/support/csv_converter.rb +12 -13
  146. data/lib/rails_admin/support/datetime.rb +40 -74
  147. data/lib/rails_admin/support/esmodule_preprocessor.rb +32 -0
  148. data/lib/rails_admin/support/hash_helper.rb +6 -5
  149. data/lib/rails_admin/version.rb +8 -4
  150. data/lib/rails_admin.rb +1 -4
  151. data/lib/tasks/rails_admin.rake +3 -3
  152. data/package.json +28 -0
  153. data/src/rails_admin/base.js +21 -0
  154. data/src/rails_admin/filter-box.js +405 -0
  155. data/src/rails_admin/filtering-multiselect.js +394 -0
  156. data/src/rails_admin/filtering-select.js +302 -0
  157. data/src/rails_admin/i18n.js +19 -0
  158. data/src/rails_admin/nested-form-hooks.js +100 -0
  159. data/src/rails_admin/remote-form.js +190 -0
  160. data/src/rails_admin/sidescroll.js +20 -0
  161. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/README.txt +0 -0
  162. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/mixins.scss +0 -0
  163. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/theming.scss +93 -34
  164. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/base/variables.scss +0 -0
  165. data/src/rails_admin/styles/base.scss +64 -0
  166. data/src/rails_admin/styles/filtering-multiselect.scss +53 -0
  167. data/src/rails_admin/styles/filtering-select.scss +70 -0
  168. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/cerulean/mixins.scss +0 -0
  169. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/cerulean/theming.scss +23 -21
  170. data/src/rails_admin/styles/themes/cerulean/variables.scss +830 -0
  171. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/mixins.scss +1 -1
  172. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/theming.scss +0 -0
  173. data/{app/assets/stylesheets/rails_admin → src/rails_admin/styles}/themes/default/variables.scss +1 -1
  174. data/src/rails_admin/styles/widgets.scss +35 -0
  175. data/src/rails_admin/ui.js +172 -0
  176. data/src/rails_admin/vendor/jquery.pjax.js +899 -0
  177. data/src/rails_admin/vendor/jquery_nested_form.js +122 -0
  178. data/src/rails_admin/widgets.js +512 -0
  179. data/vendor/assets/fonts/rails_admin/fa-solid-900.eot +0 -0
  180. data/vendor/assets/fonts/rails_admin/fa-solid-900.svg +5034 -0
  181. data/vendor/assets/fonts/rails_admin/fa-solid-900.ttf +0 -0
  182. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff +0 -0
  183. data/vendor/assets/fonts/rails_admin/fa-solid-900.woff2 +0 -0
  184. data/vendor/assets/javascripts/rails_admin/jquery-ui/data.js +41 -0
  185. data/vendor/assets/javascripts/rails_admin/jquery-ui/effect.js +1637 -0
  186. data/vendor/assets/javascripts/rails_admin/jquery-ui/ie.js +17 -0
  187. data/vendor/assets/javascripts/rails_admin/jquery-ui/keycode.js +47 -0
  188. data/vendor/assets/javascripts/rails_admin/jquery-ui/position.js +500 -0
  189. data/vendor/assets/javascripts/rails_admin/jquery-ui/safe-active-element.js +42 -0
  190. data/vendor/assets/javascripts/rails_admin/jquery-ui/scroll-parent.js +47 -0
  191. data/vendor/assets/javascripts/rails_admin/jquery-ui/unique-id.js +51 -0
  192. data/vendor/assets/javascripts/rails_admin/jquery-ui/version.js +17 -0
  193. data/vendor/assets/javascripts/rails_admin/jquery-ui/widget.js +735 -0
  194. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/autocomplete.js +689 -0
  195. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/menu.js +680 -0
  196. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/mouse.js +230 -0
  197. data/vendor/assets/javascripts/rails_admin/jquery-ui/widgets/sortable.js +1561 -0
  198. data/vendor/assets/javascripts/rails_admin/jquery3.js +10872 -0
  199. data/vendor/assets/stylesheets/rails_admin/font-awesome.scss +4476 -2216
  200. metadata +118 -262
  201. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  202. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  203. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  204. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  205. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  206. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  207. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  208. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  209. data/app/assets/images/rails_admin/calendar.png +0 -0
  210. data/app/assets/images/rails_admin/clock.png +0 -0
  211. data/app/assets/images/rails_admin/logo.png +0 -0
  212. data/app/assets/images/rails_admin/magnifier.png +0 -0
  213. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  214. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  215. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  216. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  217. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  218. data/app/assets/javascripts/rails_admin/jquery-ui.js.erb +0 -8
  219. data/app/assets/javascripts/rails_admin/jquery.migrate.js +0 -3
  220. data/app/assets/javascripts/rails_admin/ra.filter-box.js +0 -246
  221. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +0 -331
  222. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +0 -294
  223. data/app/assets/javascripts/rails_admin/ra.i18n.js +0 -28
  224. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.js +0 -59
  225. data/app/assets/javascripts/rails_admin/ra.remote-form.js +0 -155
  226. data/app/assets/javascripts/rails_admin/ra.sidescroll.js +0 -31
  227. data/app/assets/javascripts/rails_admin/ra.widgets.js +0 -379
  228. data/app/assets/javascripts/rails_admin/rails_admin.js +0 -21
  229. data/app/assets/javascripts/rails_admin/ui.js +0 -135
  230. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  231. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  232. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  233. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  234. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  235. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  236. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss +0 -733
  237. data/app/assets/stylesheets/rails_admin/base/font-awesome-4-compability.scss +0 -153
  238. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.scss +0 -88
  239. data/app/assets/stylesheets/rails_admin/ra.sidescroll.scss +0 -29
  240. data/app/assets/stylesheets/rails_admin/ra.widgets.scss +0 -17
  241. data/app/assets/stylesheets/rails_admin/rails_admin.scss.erb +0 -110
  242. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.scss +0 -857
  243. data/app/views/kaminari/ra-twitter-bootstrap/_gap.html.haml +0 -2
  244. data/app/views/kaminari/ra-twitter-bootstrap/_next_page.html.haml +0 -4
  245. data/app/views/kaminari/ra-twitter-bootstrap/_page.html.haml +0 -4
  246. data/app/views/kaminari/ra-twitter-bootstrap/_paginator.html.haml +0 -9
  247. data/app/views/kaminari/ra-twitter-bootstrap/_prev_page.html.haml +0 -4
  248. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_next_page.html.haml +0 -4
  249. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_paginator.html.haml +0 -4
  250. data/app/views/kaminari/ra-twitter-bootstrap/without_count/_prev_page.html.haml +0 -4
  251. data/app/views/layouts/rails_admin/_head.html.haml +0 -7
  252. data/app/views/layouts/rails_admin/_navigation.html.haml +0 -12
  253. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +0 -10
  254. data/app/views/layouts/rails_admin/_sidebar_navigation.html.haml +0 -3
  255. data/app/views/layouts/rails_admin/application.html.haml +0 -16
  256. data/app/views/layouts/rails_admin/pjax.html.haml +0 -12
  257. data/app/views/rails_admin/main/_dashboard_history.html.haml +0 -21
  258. data/app/views/rails_admin/main/_delete_notice.html.haml +0 -24
  259. data/app/views/rails_admin/main/_form_action_text.html.haml +0 -7
  260. data/app/views/rails_admin/main/_form_boolean.html.haml +0 -3
  261. data/app/views/rails_admin/main/_form_code_mirror.html.haml +0 -9
  262. data/app/views/rails_admin/main/_form_colorpicker.html.haml +0 -1
  263. data/app/views/rails_admin/main/_form_datetime.html.haml +0 -5
  264. data/app/views/rails_admin/main/_form_enumeration.html.haml +0 -19
  265. data/app/views/rails_admin/main/_form_field.html.haml +0 -1
  266. data/app/views/rails_admin/main/_form_file_upload.html.haml +0 -17
  267. data/app/views/rails_admin/main/_form_froala.html.haml +0 -8
  268. data/app/views/rails_admin/main/_form_multiple_file_upload.html.haml +0 -16
  269. data/app/views/rails_admin/main/_form_nested_many.html.haml +0 -15
  270. data/app/views/rails_admin/main/_form_nested_one.html.haml +0 -17
  271. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +0 -26
  272. data/app/views/rails_admin/main/_form_simple_mde.haml +0 -8
  273. data/app/views/rails_admin/main/_form_text.html.haml +0 -1
  274. data/app/views/rails_admin/main/_form_wysihtml5.html.haml +0 -8
  275. data/app/views/rails_admin/main/_submit_buttons.html.haml +0 -16
  276. data/app/views/rails_admin/main/bulk_delete.html.haml +0 -11
  277. data/app/views/rails_admin/main/dashboard.html.haml +0 -34
  278. data/app/views/rails_admin/main/delete.html.haml +0 -18
  279. data/app/views/rails_admin/main/edit.html.haml +0 -2
  280. data/app/views/rails_admin/main/export.html.haml +0 -92
  281. data/app/views/rails_admin/main/history.html.haml +0 -51
  282. data/app/views/rails_admin/main/index.html.haml +0 -126
  283. data/app/views/rails_admin/main/new.html.haml +0 -2
  284. data/app/views/rails_admin/main/show.html.haml +0 -15
  285. data/config/initializers/haml.rb +0 -5
  286. data/lib/rails_admin/adapters/active_record/abstract_object.rb +0 -38
  287. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +0 -42
  288. data/lib/rails_admin/bootstrap-sass/compass_functions.rb +0 -28
  289. data/lib/rails_admin/bootstrap-sass/sass_functions.rb +0 -16
  290. data/lib/rails_admin/bootstrap-sass.rb +0 -49
  291. data/lib/rails_admin/config/lazy_model.rb +0 -68
  292. data/lib/rails_admin/extensions/history/auditing_adapter.rb +0 -37
  293. data/lib/rails_admin/extensions/history/history.rb +0 -44
  294. data/lib/rails_admin/extensions/history.rb +0 -3
  295. data/lib/rails_admin/support/i18n.rb +0 -43
  296. data/vendor/assets/fonts/rails_admin/FontAwesome.otf +0 -0
  297. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.eot +0 -0
  298. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.svg +0 -2671
  299. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.ttf +0 -0
  300. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff +0 -0
  301. data/vendor/assets/fonts/rails_admin/fontawesome-webfont.woff2 +0 -0
  302. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  303. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  304. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  305. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  306. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  307. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  308. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  309. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  310. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  311. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  312. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  313. data/vendor/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  314. data/vendor/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  315. data/vendor/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  316. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  317. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  318. data/vendor/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  319. data/vendor/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  320. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  321. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  322. data/vendor/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  323. data/vendor/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  324. data/vendor/assets/images/rails_admin/colorpicker/select.png +0 -0
  325. data/vendor/assets/images/rails_admin/colorpicker/select2.png +0 -0
  326. data/vendor/assets/images/rails_admin/colorpicker/slider.png +0 -0
  327. data/vendor/assets/javascripts/rails_admin/jquery.colorpicker.js +0 -484
  328. data/vendor/assets/stylesheets/rails_admin/jquery.colorpicker.scss +0 -182
@@ -0,0 +1,1561 @@
1
+ //= require rails_admin/jquery-ui/widgets/mouse
2
+ //= require rails_admin/jquery-ui/data
3
+ //= require rails_admin/jquery-ui/ie
4
+ //= require rails_admin/jquery-ui/scroll-parent
5
+ //= require rails_admin/jquery-ui/version
6
+ //= require rails_admin/jquery-ui/widget
7
+
8
+ /*!
9
+ * jQuery UI Sortable 1.12.1
10
+ * http://jqueryui.com
11
+ *
12
+ * Copyright jQuery Foundation and other contributors
13
+ * Released under the MIT license.
14
+ * http://jquery.org/license
15
+ */
16
+
17
+ //>>label: Sortable
18
+ //>>group: Interactions
19
+ //>>description: Enables items in a list to be sorted using the mouse.
20
+ //>>docs: http://api.jqueryui.com/sortable/
21
+ //>>demos: http://jqueryui.com/sortable/
22
+ //>>css.structure: ../../themes/base/sortable.css
23
+
24
+ ( function( factory ) {
25
+ if ( typeof define === "function" && define.amd ) {
26
+
27
+ // AMD. Register as an anonymous module.
28
+ define( [
29
+ "jquery",
30
+ "./mouse",
31
+ "../data",
32
+ "../ie",
33
+ "../scroll-parent",
34
+ "../version",
35
+ "../widget"
36
+ ], factory );
37
+ } else {
38
+
39
+ // Browser globals
40
+ factory( jQuery );
41
+ }
42
+ }( function( $ ) {
43
+
44
+ return $.widget( "ui.sortable", $.ui.mouse, {
45
+ version: "1.12.1",
46
+ widgetEventPrefix: "sort",
47
+ ready: false,
48
+ options: {
49
+ appendTo: "parent",
50
+ axis: false,
51
+ connectWith: false,
52
+ containment: false,
53
+ cursor: "auto",
54
+ cursorAt: false,
55
+ dropOnEmpty: true,
56
+ forcePlaceholderSize: false,
57
+ forceHelperSize: false,
58
+ grid: false,
59
+ handle: false,
60
+ helper: "original",
61
+ items: "> *",
62
+ opacity: false,
63
+ placeholder: false,
64
+ revert: false,
65
+ scroll: true,
66
+ scrollSensitivity: 20,
67
+ scrollSpeed: 20,
68
+ scope: "default",
69
+ tolerance: "intersect",
70
+ zIndex: 1000,
71
+
72
+ // Callbacks
73
+ activate: null,
74
+ beforeStop: null,
75
+ change: null,
76
+ deactivate: null,
77
+ out: null,
78
+ over: null,
79
+ receive: null,
80
+ remove: null,
81
+ sort: null,
82
+ start: null,
83
+ stop: null,
84
+ update: null
85
+ },
86
+
87
+ _isOverAxis: function( x, reference, size ) {
88
+ return ( x >= reference ) && ( x < ( reference + size ) );
89
+ },
90
+
91
+ _isFloating: function( item ) {
92
+ return ( /left|right/ ).test( item.css( "float" ) ) ||
93
+ ( /inline|table-cell/ ).test( item.css( "display" ) );
94
+ },
95
+
96
+ _create: function() {
97
+ this.containerCache = {};
98
+ this._addClass( "ui-sortable" );
99
+
100
+ //Get the items
101
+ this.refresh();
102
+
103
+ //Let's determine the parent's offset
104
+ this.offset = this.element.offset();
105
+
106
+ //Initialize mouse events for interaction
107
+ this._mouseInit();
108
+
109
+ this._setHandleClassName();
110
+
111
+ //We're ready to go
112
+ this.ready = true;
113
+
114
+ },
115
+
116
+ _setOption: function( key, value ) {
117
+ this._super( key, value );
118
+
119
+ if ( key === "handle" ) {
120
+ this._setHandleClassName();
121
+ }
122
+ },
123
+
124
+ _setHandleClassName: function() {
125
+ var that = this;
126
+ this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" );
127
+ $.each( this.items, function() {
128
+ that._addClass(
129
+ this.instance.options.handle ?
130
+ this.item.find( this.instance.options.handle ) :
131
+ this.item,
132
+ "ui-sortable-handle"
133
+ );
134
+ } );
135
+ },
136
+
137
+ _destroy: function() {
138
+ this._mouseDestroy();
139
+
140
+ for ( var i = this.items.length - 1; i >= 0; i-- ) {
141
+ this.items[ i ].item.removeData( this.widgetName + "-item" );
142
+ }
143
+
144
+ return this;
145
+ },
146
+
147
+ _mouseCapture: function( event, overrideHandle ) {
148
+ var currentItem = null,
149
+ validHandle = false,
150
+ that = this;
151
+
152
+ if ( this.reverting ) {
153
+ return false;
154
+ }
155
+
156
+ if ( this.options.disabled || this.options.type === "static" ) {
157
+ return false;
158
+ }
159
+
160
+ //We have to refresh the items data once first
161
+ this._refreshItems( event );
162
+
163
+ //Find out if the clicked node (or one of its parents) is a actual item in this.items
164
+ $( event.target ).parents().each( function() {
165
+ if ( $.data( this, that.widgetName + "-item" ) === that ) {
166
+ currentItem = $( this );
167
+ return false;
168
+ }
169
+ } );
170
+ if ( $.data( event.target, that.widgetName + "-item" ) === that ) {
171
+ currentItem = $( event.target );
172
+ }
173
+
174
+ if ( !currentItem ) {
175
+ return false;
176
+ }
177
+ if ( this.options.handle && !overrideHandle ) {
178
+ $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() {
179
+ if ( this === event.target ) {
180
+ validHandle = true;
181
+ }
182
+ } );
183
+ if ( !validHandle ) {
184
+ return false;
185
+ }
186
+ }
187
+
188
+ this.currentItem = currentItem;
189
+ this._removeCurrentsFromItems();
190
+ return true;
191
+
192
+ },
193
+
194
+ _mouseStart: function( event, overrideHandle, noActivation ) {
195
+
196
+ var i, body,
197
+ o = this.options;
198
+
199
+ this.currentContainer = this;
200
+
201
+ //We only need to call refreshPositions, because the refreshItems call has been moved to
202
+ // mouseCapture
203
+ this.refreshPositions();
204
+
205
+ //Create and append the visible helper
206
+ this.helper = this._createHelper( event );
207
+
208
+ //Cache the helper size
209
+ this._cacheHelperProportions();
210
+
211
+ /*
212
+ * - Position generation -
213
+ * This block generates everything position related - it's the core of draggables.
214
+ */
215
+
216
+ //Cache the margins of the original element
217
+ this._cacheMargins();
218
+
219
+ //Get the next scrolling parent
220
+ this.scrollParent = this.helper.scrollParent();
221
+
222
+ //The element's absolute position on the page minus margins
223
+ this.offset = this.currentItem.offset();
224
+ this.offset = {
225
+ top: this.offset.top - this.margins.top,
226
+ left: this.offset.left - this.margins.left
227
+ };
228
+
229
+ $.extend( this.offset, {
230
+ click: { //Where the click happened, relative to the element
231
+ left: event.pageX - this.offset.left,
232
+ top: event.pageY - this.offset.top
233
+ },
234
+ parent: this._getParentOffset(),
235
+
236
+ // This is a relative to absolute position minus the actual position calculation -
237
+ // only used for relative positioned helper
238
+ relative: this._getRelativeOffset()
239
+ } );
240
+
241
+ // Only after we got the offset, we can change the helper's position to absolute
242
+ // TODO: Still need to figure out a way to make relative sorting possible
243
+ this.helper.css( "position", "absolute" );
244
+ this.cssPosition = this.helper.css( "position" );
245
+
246
+ //Generate the original position
247
+ this.originalPosition = this._generatePosition( event );
248
+ this.originalPageX = event.pageX;
249
+ this.originalPageY = event.pageY;
250
+
251
+ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied
252
+ ( o.cursorAt && this._adjustOffsetFromHelper( o.cursorAt ) );
253
+
254
+ //Cache the former DOM position
255
+ this.domPosition = {
256
+ prev: this.currentItem.prev()[ 0 ],
257
+ parent: this.currentItem.parent()[ 0 ]
258
+ };
259
+
260
+ // If the helper is not the original, hide the original so it's not playing any role during
261
+ // the drag, won't cause anything bad this way
262
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
263
+ this.currentItem.hide();
264
+ }
265
+
266
+ //Create the placeholder
267
+ this._createPlaceholder();
268
+
269
+ //Set a containment if given in the options
270
+ if ( o.containment ) {
271
+ this._setContainment();
272
+ }
273
+
274
+ if ( o.cursor && o.cursor !== "auto" ) { // cursor option
275
+ body = this.document.find( "body" );
276
+
277
+ // Support: IE
278
+ this.storedCursor = body.css( "cursor" );
279
+ body.css( "cursor", o.cursor );
280
+
281
+ this.storedStylesheet =
282
+ $( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body );
283
+ }
284
+
285
+ if ( o.opacity ) { // opacity option
286
+ if ( this.helper.css( "opacity" ) ) {
287
+ this._storedOpacity = this.helper.css( "opacity" );
288
+ }
289
+ this.helper.css( "opacity", o.opacity );
290
+ }
291
+
292
+ if ( o.zIndex ) { // zIndex option
293
+ if ( this.helper.css( "zIndex" ) ) {
294
+ this._storedZIndex = this.helper.css( "zIndex" );
295
+ }
296
+ this.helper.css( "zIndex", o.zIndex );
297
+ }
298
+
299
+ //Prepare scrolling
300
+ if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
301
+ this.scrollParent[ 0 ].tagName !== "HTML" ) {
302
+ this.overflowOffset = this.scrollParent.offset();
303
+ }
304
+
305
+ //Call callbacks
306
+ this._trigger( "start", event, this._uiHash() );
307
+
308
+ //Recache the helper size
309
+ if ( !this._preserveHelperProportions ) {
310
+ this._cacheHelperProportions();
311
+ }
312
+
313
+ //Post "activate" events to possible containers
314
+ if ( !noActivation ) {
315
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
316
+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );
317
+ }
318
+ }
319
+
320
+ //Prepare possible droppables
321
+ if ( $.ui.ddmanager ) {
322
+ $.ui.ddmanager.current = this;
323
+ }
324
+
325
+ if ( $.ui.ddmanager && !o.dropBehaviour ) {
326
+ $.ui.ddmanager.prepareOffsets( this, event );
327
+ }
328
+
329
+ this.dragging = true;
330
+
331
+ this._addClass( this.helper, "ui-sortable-helper" );
332
+
333
+ // Execute the drag once - this causes the helper not to be visiblebefore getting its
334
+ // correct position
335
+ this._mouseDrag( event );
336
+ return true;
337
+
338
+ },
339
+
340
+ _mouseDrag: function( event ) {
341
+ var i, item, itemElement, intersection,
342
+ o = this.options,
343
+ scrolled = false;
344
+
345
+ //Compute the helpers position
346
+ this.position = this._generatePosition( event );
347
+ this.positionAbs = this._convertPositionTo( "absolute" );
348
+
349
+ if ( !this.lastPositionAbs ) {
350
+ this.lastPositionAbs = this.positionAbs;
351
+ }
352
+
353
+ //Do scrolling
354
+ if ( this.options.scroll ) {
355
+ if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
356
+ this.scrollParent[ 0 ].tagName !== "HTML" ) {
357
+
358
+ if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
359
+ event.pageY < o.scrollSensitivity ) {
360
+ this.scrollParent[ 0 ].scrollTop =
361
+ scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
362
+ } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
363
+ this.scrollParent[ 0 ].scrollTop =
364
+ scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;
365
+ }
366
+
367
+ if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
368
+ event.pageX < o.scrollSensitivity ) {
369
+ this.scrollParent[ 0 ].scrollLeft = scrolled =
370
+ this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
371
+ } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
372
+ this.scrollParent[ 0 ].scrollLeft = scrolled =
373
+ this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;
374
+ }
375
+
376
+ } else {
377
+
378
+ if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
379
+ scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
380
+ } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
381
+ o.scrollSensitivity ) {
382
+ scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
383
+ }
384
+
385
+ if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {
386
+ scrolled = this.document.scrollLeft(
387
+ this.document.scrollLeft() - o.scrollSpeed
388
+ );
389
+ } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
390
+ o.scrollSensitivity ) {
391
+ scrolled = this.document.scrollLeft(
392
+ this.document.scrollLeft() + o.scrollSpeed
393
+ );
394
+ }
395
+
396
+ }
397
+
398
+ if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {
399
+ $.ui.ddmanager.prepareOffsets( this, event );
400
+ }
401
+ }
402
+
403
+ //Regenerate the absolute position used for position checks
404
+ this.positionAbs = this._convertPositionTo( "absolute" );
405
+
406
+ //Set the helper position
407
+ if ( !this.options.axis || this.options.axis !== "y" ) {
408
+ this.helper[ 0 ].style.left = this.position.left + "px";
409
+ }
410
+ if ( !this.options.axis || this.options.axis !== "x" ) {
411
+ this.helper[ 0 ].style.top = this.position.top + "px";
412
+ }
413
+
414
+ //Rearrange
415
+ for ( i = this.items.length - 1; i >= 0; i-- ) {
416
+
417
+ //Cache variables and intersection, continue if no intersection
418
+ item = this.items[ i ];
419
+ itemElement = item.item[ 0 ];
420
+ intersection = this._intersectsWithPointer( item );
421
+ if ( !intersection ) {
422
+ continue;
423
+ }
424
+
425
+ // Only put the placeholder inside the current Container, skip all
426
+ // items from other containers. This works because when moving
427
+ // an item from one container to another the
428
+ // currentContainer is switched before the placeholder is moved.
429
+ //
430
+ // Without this, moving items in "sub-sortables" can cause
431
+ // the placeholder to jitter between the outer and inner container.
432
+ if ( item.instance !== this.currentContainer ) {
433
+ continue;
434
+ }
435
+
436
+ // Cannot intersect with itself
437
+ // no useless actions that have been done before
438
+ // no action if the item moved is the parent of the item checked
439
+ if ( itemElement !== this.currentItem[ 0 ] &&
440
+ this.placeholder[ intersection === 1 ? "next" : "prev" ]()[ 0 ] !== itemElement &&
441
+ !$.contains( this.placeholder[ 0 ], itemElement ) &&
442
+ ( this.options.type === "semi-dynamic" ?
443
+ !$.contains( this.element[ 0 ], itemElement ) :
444
+ true
445
+ )
446
+ ) {
447
+
448
+ this.direction = intersection === 1 ? "down" : "up";
449
+
450
+ if ( this.options.tolerance === "pointer" || this._intersectsWithSides( item ) ) {
451
+ this._rearrange( event, item );
452
+ } else {
453
+ break;
454
+ }
455
+
456
+ this._trigger( "change", event, this._uiHash() );
457
+ break;
458
+ }
459
+ }
460
+
461
+ //Post events to containers
462
+ this._contactContainers( event );
463
+
464
+ //Interconnect with droppables
465
+ if ( $.ui.ddmanager ) {
466
+ $.ui.ddmanager.drag( this, event );
467
+ }
468
+
469
+ //Call callbacks
470
+ this._trigger( "sort", event, this._uiHash() );
471
+
472
+ this.lastPositionAbs = this.positionAbs;
473
+ return false;
474
+
475
+ },
476
+
477
+ _mouseStop: function( event, noPropagation ) {
478
+
479
+ if ( !event ) {
480
+ return;
481
+ }
482
+
483
+ //If we are using droppables, inform the manager about the drop
484
+ if ( $.ui.ddmanager && !this.options.dropBehaviour ) {
485
+ $.ui.ddmanager.drop( this, event );
486
+ }
487
+
488
+ if ( this.options.revert ) {
489
+ var that = this,
490
+ cur = this.placeholder.offset(),
491
+ axis = this.options.axis,
492
+ animation = {};
493
+
494
+ if ( !axis || axis === "x" ) {
495
+ animation.left = cur.left - this.offset.parent.left - this.margins.left +
496
+ ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
497
+ 0 :
498
+ this.offsetParent[ 0 ].scrollLeft
499
+ );
500
+ }
501
+ if ( !axis || axis === "y" ) {
502
+ animation.top = cur.top - this.offset.parent.top - this.margins.top +
503
+ ( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
504
+ 0 :
505
+ this.offsetParent[ 0 ].scrollTop
506
+ );
507
+ }
508
+ this.reverting = true;
509
+ $( this.helper ).animate(
510
+ animation,
511
+ parseInt( this.options.revert, 10 ) || 500,
512
+ function() {
513
+ that._clear( event );
514
+ }
515
+ );
516
+ } else {
517
+ this._clear( event, noPropagation );
518
+ }
519
+
520
+ return false;
521
+
522
+ },
523
+
524
+ cancel: function() {
525
+
526
+ if ( this.dragging ) {
527
+
528
+ this._mouseUp( new $.Event( "mouseup", { target: null } ) );
529
+
530
+ if ( this.options.helper === "original" ) {
531
+ this.currentItem.css( this._storedCSS );
532
+ this._removeClass( this.currentItem, "ui-sortable-helper" );
533
+ } else {
534
+ this.currentItem.show();
535
+ }
536
+
537
+ //Post deactivating events to containers
538
+ for ( var i = this.containers.length - 1; i >= 0; i-- ) {
539
+ this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) );
540
+ if ( this.containers[ i ].containerCache.over ) {
541
+ this.containers[ i ]._trigger( "out", null, this._uiHash( this ) );
542
+ this.containers[ i ].containerCache.over = 0;
543
+ }
544
+ }
545
+
546
+ }
547
+
548
+ if ( this.placeholder ) {
549
+
550
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
551
+ // it unbinds ALL events from the original node!
552
+ if ( this.placeholder[ 0 ].parentNode ) {
553
+ this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
554
+ }
555
+ if ( this.options.helper !== "original" && this.helper &&
556
+ this.helper[ 0 ].parentNode ) {
557
+ this.helper.remove();
558
+ }
559
+
560
+ $.extend( this, {
561
+ helper: null,
562
+ dragging: false,
563
+ reverting: false,
564
+ _noFinalSort: null
565
+ } );
566
+
567
+ if ( this.domPosition.prev ) {
568
+ $( this.domPosition.prev ).after( this.currentItem );
569
+ } else {
570
+ $( this.domPosition.parent ).prepend( this.currentItem );
571
+ }
572
+ }
573
+
574
+ return this;
575
+
576
+ },
577
+
578
+ serialize: function( o ) {
579
+
580
+ var items = this._getItemsAsjQuery( o && o.connected ),
581
+ str = [];
582
+ o = o || {};
583
+
584
+ $( items ).each( function() {
585
+ var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" )
586
+ .match( o.expression || ( /(.+)[\-=_](.+)/ ) );
587
+ if ( res ) {
588
+ str.push(
589
+ ( o.key || res[ 1 ] + "[]" ) +
590
+ "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );
591
+ }
592
+ } );
593
+
594
+ if ( !str.length && o.key ) {
595
+ str.push( o.key + "=" );
596
+ }
597
+
598
+ return str.join( "&" );
599
+
600
+ },
601
+
602
+ toArray: function( o ) {
603
+
604
+ var items = this._getItemsAsjQuery( o && o.connected ),
605
+ ret = [];
606
+
607
+ o = o || {};
608
+
609
+ items.each( function() {
610
+ ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" );
611
+ } );
612
+ return ret;
613
+
614
+ },
615
+
616
+ /* Be careful with the following core functions */
617
+ _intersectsWith: function( item ) {
618
+
619
+ var x1 = this.positionAbs.left,
620
+ x2 = x1 + this.helperProportions.width,
621
+ y1 = this.positionAbs.top,
622
+ y2 = y1 + this.helperProportions.height,
623
+ l = item.left,
624
+ r = l + item.width,
625
+ t = item.top,
626
+ b = t + item.height,
627
+ dyClick = this.offset.click.top,
628
+ dxClick = this.offset.click.left,
629
+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t &&
630
+ ( y1 + dyClick ) < b ),
631
+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l &&
632
+ ( x1 + dxClick ) < r ),
633
+ isOverElement = isOverElementHeight && isOverElementWidth;
634
+
635
+ if ( this.options.tolerance === "pointer" ||
636
+ this.options.forcePointerForContainers ||
637
+ ( this.options.tolerance !== "pointer" &&
638
+ this.helperProportions[ this.floating ? "width" : "height" ] >
639
+ item[ this.floating ? "width" : "height" ] )
640
+ ) {
641
+ return isOverElement;
642
+ } else {
643
+
644
+ return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half
645
+ x2 - ( this.helperProportions.width / 2 ) < r && // Left Half
646
+ t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half
647
+ y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half
648
+
649
+ }
650
+ },
651
+
652
+ _intersectsWithPointer: function( item ) {
653
+ var verticalDirection, horizontalDirection,
654
+ isOverElementHeight = ( this.options.axis === "x" ) ||
655
+ this._isOverAxis(
656
+ this.positionAbs.top + this.offset.click.top, item.top, item.height ),
657
+ isOverElementWidth = ( this.options.axis === "y" ) ||
658
+ this._isOverAxis(
659
+ this.positionAbs.left + this.offset.click.left, item.left, item.width ),
660
+ isOverElement = isOverElementHeight && isOverElementWidth;
661
+
662
+ if ( !isOverElement ) {
663
+ return false;
664
+ }
665
+
666
+ verticalDirection = this._getDragVerticalDirection();
667
+ horizontalDirection = this._getDragHorizontalDirection();
668
+
669
+ return this.floating ?
670
+ ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 )
671
+ : ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) );
672
+
673
+ },
674
+
675
+ _intersectsWithSides: function( item ) {
676
+
677
+ var isOverBottomHalf = this._isOverAxis( this.positionAbs.top +
678
+ this.offset.click.top, item.top + ( item.height / 2 ), item.height ),
679
+ isOverRightHalf = this._isOverAxis( this.positionAbs.left +
680
+ this.offset.click.left, item.left + ( item.width / 2 ), item.width ),
681
+ verticalDirection = this._getDragVerticalDirection(),
682
+ horizontalDirection = this._getDragHorizontalDirection();
683
+
684
+ if ( this.floating && horizontalDirection ) {
685
+ return ( ( horizontalDirection === "right" && isOverRightHalf ) ||
686
+ ( horizontalDirection === "left" && !isOverRightHalf ) );
687
+ } else {
688
+ return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) ||
689
+ ( verticalDirection === "up" && !isOverBottomHalf ) );
690
+ }
691
+
692
+ },
693
+
694
+ _getDragVerticalDirection: function() {
695
+ var delta = this.positionAbs.top - this.lastPositionAbs.top;
696
+ return delta !== 0 && ( delta > 0 ? "down" : "up" );
697
+ },
698
+
699
+ _getDragHorizontalDirection: function() {
700
+ var delta = this.positionAbs.left - this.lastPositionAbs.left;
701
+ return delta !== 0 && ( delta > 0 ? "right" : "left" );
702
+ },
703
+
704
+ refresh: function( event ) {
705
+ this._refreshItems( event );
706
+ this._setHandleClassName();
707
+ this.refreshPositions();
708
+ return this;
709
+ },
710
+
711
+ _connectWith: function() {
712
+ var options = this.options;
713
+ return options.connectWith.constructor === String ?
714
+ [ options.connectWith ] :
715
+ options.connectWith;
716
+ },
717
+
718
+ _getItemsAsjQuery: function( connected ) {
719
+
720
+ var i, j, cur, inst,
721
+ items = [],
722
+ queries = [],
723
+ connectWith = this._connectWith();
724
+
725
+ if ( connectWith && connected ) {
726
+ for ( i = connectWith.length - 1; i >= 0; i-- ) {
727
+ cur = $( connectWith[ i ], this.document[ 0 ] );
728
+ for ( j = cur.length - 1; j >= 0; j-- ) {
729
+ inst = $.data( cur[ j ], this.widgetFullName );
730
+ if ( inst && inst !== this && !inst.options.disabled ) {
731
+ queries.push( [ $.isFunction( inst.options.items ) ?
732
+ inst.options.items.call( inst.element ) :
733
+ $( inst.options.items, inst.element )
734
+ .not( ".ui-sortable-helper" )
735
+ .not( ".ui-sortable-placeholder" ), inst ] );
736
+ }
737
+ }
738
+ }
739
+ }
740
+
741
+ queries.push( [ $.isFunction( this.options.items ) ?
742
+ this.options.items
743
+ .call( this.element, null, { options: this.options, item: this.currentItem } ) :
744
+ $( this.options.items, this.element )
745
+ .not( ".ui-sortable-helper" )
746
+ .not( ".ui-sortable-placeholder" ), this ] );
747
+
748
+ function addItems() {
749
+ items.push( this );
750
+ }
751
+ for ( i = queries.length - 1; i >= 0; i-- ) {
752
+ queries[ i ][ 0 ].each( addItems );
753
+ }
754
+
755
+ return $( items );
756
+
757
+ },
758
+
759
+ _removeCurrentsFromItems: function() {
760
+
761
+ var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" );
762
+
763
+ this.items = $.grep( this.items, function( item ) {
764
+ for ( var j = 0; j < list.length; j++ ) {
765
+ if ( list[ j ] === item.item[ 0 ] ) {
766
+ return false;
767
+ }
768
+ }
769
+ return true;
770
+ } );
771
+
772
+ },
773
+
774
+ _refreshItems: function( event ) {
775
+
776
+ this.items = [];
777
+ this.containers = [ this ];
778
+
779
+ var i, j, cur, inst, targetData, _queries, item, queriesLength,
780
+ items = this.items,
781
+ queries = [ [ $.isFunction( this.options.items ) ?
782
+ this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :
783
+ $( this.options.items, this.element ), this ] ],
784
+ connectWith = this._connectWith();
785
+
786
+ //Shouldn't be run the first time through due to massive slow-down
787
+ if ( connectWith && this.ready ) {
788
+ for ( i = connectWith.length - 1; i >= 0; i-- ) {
789
+ cur = $( connectWith[ i ], this.document[ 0 ] );
790
+ for ( j = cur.length - 1; j >= 0; j-- ) {
791
+ inst = $.data( cur[ j ], this.widgetFullName );
792
+ if ( inst && inst !== this && !inst.options.disabled ) {
793
+ queries.push( [ $.isFunction( inst.options.items ) ?
794
+ inst.options.items
795
+ .call( inst.element[ 0 ], event, { item: this.currentItem } ) :
796
+ $( inst.options.items, inst.element ), inst ] );
797
+ this.containers.push( inst );
798
+ }
799
+ }
800
+ }
801
+ }
802
+
803
+ for ( i = queries.length - 1; i >= 0; i-- ) {
804
+ targetData = queries[ i ][ 1 ];
805
+ _queries = queries[ i ][ 0 ];
806
+
807
+ for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {
808
+ item = $( _queries[ j ] );
809
+
810
+ // Data for target checking (mouse manager)
811
+ item.data( this.widgetName + "-item", targetData );
812
+
813
+ items.push( {
814
+ item: item,
815
+ instance: targetData,
816
+ width: 0, height: 0,
817
+ left: 0, top: 0
818
+ } );
819
+ }
820
+ }
821
+
822
+ },
823
+
824
+ refreshPositions: function( fast ) {
825
+
826
+ // Determine whether items are being displayed horizontally
827
+ this.floating = this.items.length ?
828
+ this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
829
+ false;
830
+
831
+ //This has to be redone because due to the item being moved out/into the offsetParent,
832
+ // the offsetParent's position will change
833
+ if ( this.offsetParent && this.helper ) {
834
+ this.offset.parent = this._getParentOffset();
835
+ }
836
+
837
+ var i, item, t, p;
838
+
839
+ for ( i = this.items.length - 1; i >= 0; i-- ) {
840
+ item = this.items[ i ];
841
+
842
+ //We ignore calculating positions of all connected containers when we're not over them
843
+ if ( item.instance !== this.currentContainer && this.currentContainer &&
844
+ item.item[ 0 ] !== this.currentItem[ 0 ] ) {
845
+ continue;
846
+ }
847
+
848
+ t = this.options.toleranceElement ?
849
+ $( this.options.toleranceElement, item.item ) :
850
+ item.item;
851
+
852
+ if ( !fast ) {
853
+ item.width = t.outerWidth();
854
+ item.height = t.outerHeight();
855
+ }
856
+
857
+ p = t.offset();
858
+ item.left = p.left;
859
+ item.top = p.top;
860
+ }
861
+
862
+ if ( this.options.custom && this.options.custom.refreshContainers ) {
863
+ this.options.custom.refreshContainers.call( this );
864
+ } else {
865
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
866
+ p = this.containers[ i ].element.offset();
867
+ this.containers[ i ].containerCache.left = p.left;
868
+ this.containers[ i ].containerCache.top = p.top;
869
+ this.containers[ i ].containerCache.width =
870
+ this.containers[ i ].element.outerWidth();
871
+ this.containers[ i ].containerCache.height =
872
+ this.containers[ i ].element.outerHeight();
873
+ }
874
+ }
875
+
876
+ return this;
877
+ },
878
+
879
+ _createPlaceholder: function( that ) {
880
+ that = that || this;
881
+ var className,
882
+ o = that.options;
883
+
884
+ if ( !o.placeholder || o.placeholder.constructor === String ) {
885
+ className = o.placeholder;
886
+ o.placeholder = {
887
+ element: function() {
888
+
889
+ var nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(),
890
+ element = $( "<" + nodeName + ">", that.document[ 0 ] );
891
+
892
+ that._addClass( element, "ui-sortable-placeholder",
893
+ className || that.currentItem[ 0 ].className )
894
+ ._removeClass( element, "ui-sortable-helper" );
895
+
896
+ if ( nodeName === "tbody" ) {
897
+ that._createTrPlaceholder(
898
+ that.currentItem.find( "tr" ).eq( 0 ),
899
+ $( "<tr>", that.document[ 0 ] ).appendTo( element )
900
+ );
901
+ } else if ( nodeName === "tr" ) {
902
+ that._createTrPlaceholder( that.currentItem, element );
903
+ } else if ( nodeName === "img" ) {
904
+ element.attr( "src", that.currentItem.attr( "src" ) );
905
+ }
906
+
907
+ if ( !className ) {
908
+ element.css( "visibility", "hidden" );
909
+ }
910
+
911
+ return element;
912
+ },
913
+ update: function( container, p ) {
914
+
915
+ // 1. If a className is set as 'placeholder option, we don't force sizes -
916
+ // the class is responsible for that
917
+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a
918
+ // class name is specified
919
+ if ( className && !o.forcePlaceholderSize ) {
920
+ return;
921
+ }
922
+
923
+ //If the element doesn't have a actual height by itself (without styles coming
924
+ // from a stylesheet), it receives the inline height from the dragged item
925
+ if ( !p.height() ) {
926
+ p.height(
927
+ that.currentItem.innerHeight() -
928
+ parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
929
+ parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) );
930
+ }
931
+ if ( !p.width() ) {
932
+ p.width(
933
+ that.currentItem.innerWidth() -
934
+ parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) -
935
+ parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) );
936
+ }
937
+ }
938
+ };
939
+ }
940
+
941
+ //Create the placeholder
942
+ that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );
943
+
944
+ //Append it after the actual current item
945
+ that.currentItem.after( that.placeholder );
946
+
947
+ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
948
+ o.placeholder.update( that, that.placeholder );
949
+
950
+ },
951
+
952
+ _createTrPlaceholder: function( sourceTr, targetTr ) {
953
+ var that = this;
954
+
955
+ sourceTr.children().each( function() {
956
+ $( "<td>&#160;</td>", that.document[ 0 ] )
957
+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )
958
+ .appendTo( targetTr );
959
+ } );
960
+ },
961
+
962
+ _contactContainers: function( event ) {
963
+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,
964
+ floating, axis,
965
+ innermostContainer = null,
966
+ innermostIndex = null;
967
+
968
+ // Get innermost container that intersects with item
969
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
970
+
971
+ // Never consider a container that's located within the item itself
972
+ if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {
973
+ continue;
974
+ }
975
+
976
+ if ( this._intersectsWith( this.containers[ i ].containerCache ) ) {
977
+
978
+ // If we've already found a container and it's more "inner" than this, then continue
979
+ if ( innermostContainer &&
980
+ $.contains(
981
+ this.containers[ i ].element[ 0 ],
982
+ innermostContainer.element[ 0 ] ) ) {
983
+ continue;
984
+ }
985
+
986
+ innermostContainer = this.containers[ i ];
987
+ innermostIndex = i;
988
+
989
+ } else {
990
+
991
+ // container doesn't intersect. trigger "out" event if necessary
992
+ if ( this.containers[ i ].containerCache.over ) {
993
+ this.containers[ i ]._trigger( "out", event, this._uiHash( this ) );
994
+ this.containers[ i ].containerCache.over = 0;
995
+ }
996
+ }
997
+
998
+ }
999
+
1000
+ // If no intersecting containers found, return
1001
+ if ( !innermostContainer ) {
1002
+ return;
1003
+ }
1004
+
1005
+ // Move the item into the container if it's not there already
1006
+ if ( this.containers.length === 1 ) {
1007
+ if ( !this.containers[ innermostIndex ].containerCache.over ) {
1008
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
1009
+ this.containers[ innermostIndex ].containerCache.over = 1;
1010
+ }
1011
+ } else {
1012
+
1013
+ // When entering a new container, we will find the item with the least distance and
1014
+ // append our item near it
1015
+ dist = 10000;
1016
+ itemWithLeastDistance = null;
1017
+ floating = innermostContainer.floating || this._isFloating( this.currentItem );
1018
+ posProperty = floating ? "left" : "top";
1019
+ sizeProperty = floating ? "width" : "height";
1020
+ axis = floating ? "pageX" : "pageY";
1021
+
1022
+ for ( j = this.items.length - 1; j >= 0; j-- ) {
1023
+ if ( !$.contains(
1024
+ this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
1025
+ ) {
1026
+ continue;
1027
+ }
1028
+ if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {
1029
+ continue;
1030
+ }
1031
+
1032
+ cur = this.items[ j ].item.offset()[ posProperty ];
1033
+ nearBottom = false;
1034
+ if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {
1035
+ nearBottom = true;
1036
+ }
1037
+
1038
+ if ( Math.abs( event[ axis ] - cur ) < dist ) {
1039
+ dist = Math.abs( event[ axis ] - cur );
1040
+ itemWithLeastDistance = this.items[ j ];
1041
+ this.direction = nearBottom ? "up" : "down";
1042
+ }
1043
+ }
1044
+
1045
+ //Check if dropOnEmpty is enabled
1046
+ if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {
1047
+ return;
1048
+ }
1049
+
1050
+ if ( this.currentContainer === this.containers[ innermostIndex ] ) {
1051
+ if ( !this.currentContainer.containerCache.over ) {
1052
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() );
1053
+ this.currentContainer.containerCache.over = 1;
1054
+ }
1055
+ return;
1056
+ }
1057
+
1058
+ itemWithLeastDistance ?
1059
+ this._rearrange( event, itemWithLeastDistance, null, true ) :
1060
+ this._rearrange( event, null, this.containers[ innermostIndex ].element, true );
1061
+ this._trigger( "change", event, this._uiHash() );
1062
+ this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) );
1063
+ this.currentContainer = this.containers[ innermostIndex ];
1064
+
1065
+ //Update the placeholder
1066
+ this.options.placeholder.update( this.currentContainer, this.placeholder );
1067
+
1068
+ this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) );
1069
+ this.containers[ innermostIndex ].containerCache.over = 1;
1070
+ }
1071
+
1072
+ },
1073
+
1074
+ _createHelper: function( event ) {
1075
+
1076
+ var o = this.options,
1077
+ helper = $.isFunction( o.helper ) ?
1078
+ $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :
1079
+ ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem );
1080
+
1081
+ //Add the helper to the DOM if that didn't happen already
1082
+ if ( !helper.parents( "body" ).length ) {
1083
+ $( o.appendTo !== "parent" ?
1084
+ o.appendTo :
1085
+ this.currentItem[ 0 ].parentNode )[ 0 ].appendChild( helper[ 0 ] );
1086
+ }
1087
+
1088
+ if ( helper[ 0 ] === this.currentItem[ 0 ] ) {
1089
+ this._storedCSS = {
1090
+ width: this.currentItem[ 0 ].style.width,
1091
+ height: this.currentItem[ 0 ].style.height,
1092
+ position: this.currentItem.css( "position" ),
1093
+ top: this.currentItem.css( "top" ),
1094
+ left: this.currentItem.css( "left" )
1095
+ };
1096
+ }
1097
+
1098
+ if ( !helper[ 0 ].style.width || o.forceHelperSize ) {
1099
+ helper.width( this.currentItem.width() );
1100
+ }
1101
+ if ( !helper[ 0 ].style.height || o.forceHelperSize ) {
1102
+ helper.height( this.currentItem.height() );
1103
+ }
1104
+
1105
+ return helper;
1106
+
1107
+ },
1108
+
1109
+ _adjustOffsetFromHelper: function( obj ) {
1110
+ if ( typeof obj === "string" ) {
1111
+ obj = obj.split( " " );
1112
+ }
1113
+ if ( $.isArray( obj ) ) {
1114
+ obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };
1115
+ }
1116
+ if ( "left" in obj ) {
1117
+ this.offset.click.left = obj.left + this.margins.left;
1118
+ }
1119
+ if ( "right" in obj ) {
1120
+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
1121
+ }
1122
+ if ( "top" in obj ) {
1123
+ this.offset.click.top = obj.top + this.margins.top;
1124
+ }
1125
+ if ( "bottom" in obj ) {
1126
+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
1127
+ }
1128
+ },
1129
+
1130
+ _getParentOffset: function() {
1131
+
1132
+ //Get the offsetParent and cache its position
1133
+ this.offsetParent = this.helper.offsetParent();
1134
+ var po = this.offsetParent.offset();
1135
+
1136
+ // This is a special case where we need to modify a offset calculated on start, since the
1137
+ // following happened:
1138
+ // 1. The position of the helper is absolute, so it's position is calculated based on the
1139
+ // next positioned parent
1140
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't
1141
+ // the document, which means that the scroll is included in the initial calculation of the
1142
+ // offset of the parent, and never recalculated upon drag
1143
+ if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
1144
+ $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
1145
+ po.left += this.scrollParent.scrollLeft();
1146
+ po.top += this.scrollParent.scrollTop();
1147
+ }
1148
+
1149
+ // This needs to be actually done for all browsers, since pageX/pageY includes this
1150
+ // information with an ugly IE fix
1151
+ if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
1152
+ ( this.offsetParent[ 0 ].tagName &&
1153
+ this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
1154
+ po = { top: 0, left: 0 };
1155
+ }
1156
+
1157
+ return {
1158
+ top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ),
1159
+ left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 )
1160
+ };
1161
+
1162
+ },
1163
+
1164
+ _getRelativeOffset: function() {
1165
+
1166
+ if ( this.cssPosition === "relative" ) {
1167
+ var p = this.currentItem.position();
1168
+ return {
1169
+ top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) +
1170
+ this.scrollParent.scrollTop(),
1171
+ left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) +
1172
+ this.scrollParent.scrollLeft()
1173
+ };
1174
+ } else {
1175
+ return { top: 0, left: 0 };
1176
+ }
1177
+
1178
+ },
1179
+
1180
+ _cacheMargins: function() {
1181
+ this.margins = {
1182
+ left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ),
1183
+ top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 )
1184
+ };
1185
+ },
1186
+
1187
+ _cacheHelperProportions: function() {
1188
+ this.helperProportions = {
1189
+ width: this.helper.outerWidth(),
1190
+ height: this.helper.outerHeight()
1191
+ };
1192
+ },
1193
+
1194
+ _setContainment: function() {
1195
+
1196
+ var ce, co, over,
1197
+ o = this.options;
1198
+ if ( o.containment === "parent" ) {
1199
+ o.containment = this.helper[ 0 ].parentNode;
1200
+ }
1201
+ if ( o.containment === "document" || o.containment === "window" ) {
1202
+ this.containment = [
1203
+ 0 - this.offset.relative.left - this.offset.parent.left,
1204
+ 0 - this.offset.relative.top - this.offset.parent.top,
1205
+ o.containment === "document" ?
1206
+ this.document.width() :
1207
+ this.window.width() - this.helperProportions.width - this.margins.left,
1208
+ ( o.containment === "document" ?
1209
+ ( this.document.height() || document.body.parentNode.scrollHeight ) :
1210
+ this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
1211
+ ) - this.helperProportions.height - this.margins.top
1212
+ ];
1213
+ }
1214
+
1215
+ if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {
1216
+ ce = $( o.containment )[ 0 ];
1217
+ co = $( o.containment ).offset();
1218
+ over = ( $( ce ).css( "overflow" ) !== "hidden" );
1219
+
1220
+ this.containment = [
1221
+ co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
1222
+ ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
1223
+ co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
1224
+ ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
1225
+ co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
1226
+ ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
1227
+ ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
1228
+ this.helperProportions.width - this.margins.left,
1229
+ co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
1230
+ ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
1231
+ ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
1232
+ this.helperProportions.height - this.margins.top
1233
+ ];
1234
+ }
1235
+
1236
+ },
1237
+
1238
+ _convertPositionTo: function( d, pos ) {
1239
+
1240
+ if ( !pos ) {
1241
+ pos = this.position;
1242
+ }
1243
+ var mod = d === "absolute" ? 1 : -1,
1244
+ scroll = this.cssPosition === "absolute" &&
1245
+ !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
1246
+ $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
1247
+ this.offsetParent :
1248
+ this.scrollParent,
1249
+ scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
1250
+
1251
+ return {
1252
+ top: (
1253
+
1254
+ // The absolute mouse position
1255
+ pos.top +
1256
+
1257
+ // Only for relative positioned nodes: Relative offset from element to offset parent
1258
+ this.offset.relative.top * mod +
1259
+
1260
+ // The offsetParent's offset without borders (offset + border)
1261
+ this.offset.parent.top * mod -
1262
+ ( ( this.cssPosition === "fixed" ?
1263
+ -this.scrollParent.scrollTop() :
1264
+ ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )
1265
+ ),
1266
+ left: (
1267
+
1268
+ // The absolute mouse position
1269
+ pos.left +
1270
+
1271
+ // Only for relative positioned nodes: Relative offset from element to offset parent
1272
+ this.offset.relative.left * mod +
1273
+
1274
+ // The offsetParent's offset without borders (offset + border)
1275
+ this.offset.parent.left * mod -
1276
+ ( ( this.cssPosition === "fixed" ?
1277
+ -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
1278
+ scroll.scrollLeft() ) * mod )
1279
+ )
1280
+ };
1281
+
1282
+ },
1283
+
1284
+ _generatePosition: function( event ) {
1285
+
1286
+ var top, left,
1287
+ o = this.options,
1288
+ pageX = event.pageX,
1289
+ pageY = event.pageY,
1290
+ scroll = this.cssPosition === "absolute" &&
1291
+ !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
1292
+ $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
1293
+ this.offsetParent :
1294
+ this.scrollParent,
1295
+ scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
1296
+
1297
+ // This is another very weird special case that only happens for relative elements:
1298
+ // 1. If the css position is relative
1299
+ // 2. and the scroll parent is the document or similar to the offset parent
1300
+ // we have to refresh the relative offset during the scroll so there are no jumps
1301
+ if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
1302
+ this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
1303
+ this.offset.relative = this._getRelativeOffset();
1304
+ }
1305
+
1306
+ /*
1307
+ * - Position constraining -
1308
+ * Constrain the position to a mix of grid, containment.
1309
+ */
1310
+
1311
+ if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options
1312
+
1313
+ if ( this.containment ) {
1314
+ if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {
1315
+ pageX = this.containment[ 0 ] + this.offset.click.left;
1316
+ }
1317
+ if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {
1318
+ pageY = this.containment[ 1 ] + this.offset.click.top;
1319
+ }
1320
+ if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {
1321
+ pageX = this.containment[ 2 ] + this.offset.click.left;
1322
+ }
1323
+ if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {
1324
+ pageY = this.containment[ 3 ] + this.offset.click.top;
1325
+ }
1326
+ }
1327
+
1328
+ if ( o.grid ) {
1329
+ top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /
1330
+ o.grid[ 1 ] ) * o.grid[ 1 ];
1331
+ pageY = this.containment ?
1332
+ ( ( top - this.offset.click.top >= this.containment[ 1 ] &&
1333
+ top - this.offset.click.top <= this.containment[ 3 ] ) ?
1334
+ top :
1335
+ ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
1336
+ top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
1337
+ top;
1338
+
1339
+ left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
1340
+ o.grid[ 0 ] ) * o.grid[ 0 ];
1341
+ pageX = this.containment ?
1342
+ ( ( left - this.offset.click.left >= this.containment[ 0 ] &&
1343
+ left - this.offset.click.left <= this.containment[ 2 ] ) ?
1344
+ left :
1345
+ ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
1346
+ left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
1347
+ left;
1348
+ }
1349
+
1350
+ }
1351
+
1352
+ return {
1353
+ top: (
1354
+
1355
+ // The absolute mouse position
1356
+ pageY -
1357
+
1358
+ // Click offset (relative to the element)
1359
+ this.offset.click.top -
1360
+
1361
+ // Only for relative positioned nodes: Relative offset from element to offset parent
1362
+ this.offset.relative.top -
1363
+
1364
+ // The offsetParent's offset without borders (offset + border)
1365
+ this.offset.parent.top +
1366
+ ( ( this.cssPosition === "fixed" ?
1367
+ -this.scrollParent.scrollTop() :
1368
+ ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )
1369
+ ),
1370
+ left: (
1371
+
1372
+ // The absolute mouse position
1373
+ pageX -
1374
+
1375
+ // Click offset (relative to the element)
1376
+ this.offset.click.left -
1377
+
1378
+ // Only for relative positioned nodes: Relative offset from element to offset parent
1379
+ this.offset.relative.left -
1380
+
1381
+ // The offsetParent's offset without borders (offset + border)
1382
+ this.offset.parent.left +
1383
+ ( ( this.cssPosition === "fixed" ?
1384
+ -this.scrollParent.scrollLeft() :
1385
+ scrollIsRootNode ? 0 : scroll.scrollLeft() ) )
1386
+ )
1387
+ };
1388
+
1389
+ },
1390
+
1391
+ _rearrange: function( event, i, a, hardRefresh ) {
1392
+
1393
+ a ? a[ 0 ].appendChild( this.placeholder[ 0 ] ) :
1394
+ i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],
1395
+ ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );
1396
+
1397
+ //Various things done here to improve the performance:
1398
+ // 1. we create a setTimeout, that calls refreshPositions
1399
+ // 2. on the instance, we have a counter variable, that get's higher after every append
1400
+ // 3. on the local scope, we copy the counter variable, and check in the timeout,
1401
+ // if it's still the same
1402
+ // 4. this lets only the last addition to the timeout stack through
1403
+ this.counter = this.counter ? ++this.counter : 1;
1404
+ var counter = this.counter;
1405
+
1406
+ this._delay( function() {
1407
+ if ( counter === this.counter ) {
1408
+
1409
+ //Precompute after each DOM insertion, NOT on mousemove
1410
+ this.refreshPositions( !hardRefresh );
1411
+ }
1412
+ } );
1413
+
1414
+ },
1415
+
1416
+ _clear: function( event, noPropagation ) {
1417
+
1418
+ this.reverting = false;
1419
+
1420
+ // We delay all events that have to be triggered to after the point where the placeholder
1421
+ // has been removed and everything else normalized again
1422
+ var i,
1423
+ delayedTriggers = [];
1424
+
1425
+ // We first have to update the dom position of the actual currentItem
1426
+ // Note: don't do it if the current item is already removed (by a user), or it gets
1427
+ // reappended (see #4088)
1428
+ if ( !this._noFinalSort && this.currentItem.parent().length ) {
1429
+ this.placeholder.before( this.currentItem );
1430
+ }
1431
+ this._noFinalSort = null;
1432
+
1433
+ if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {
1434
+ for ( i in this._storedCSS ) {
1435
+ if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) {
1436
+ this._storedCSS[ i ] = "";
1437
+ }
1438
+ }
1439
+ this.currentItem.css( this._storedCSS );
1440
+ this._removeClass( this.currentItem, "ui-sortable-helper" );
1441
+ } else {
1442
+ this.currentItem.show();
1443
+ }
1444
+
1445
+ if ( this.fromOutside && !noPropagation ) {
1446
+ delayedTriggers.push( function( event ) {
1447
+ this._trigger( "receive", event, this._uiHash( this.fromOutside ) );
1448
+ } );
1449
+ }
1450
+ if ( ( this.fromOutside ||
1451
+ this.domPosition.prev !==
1452
+ this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
1453
+ this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
1454
+
1455
+ // Trigger update callback if the DOM position has changed
1456
+ delayedTriggers.push( function( event ) {
1457
+ this._trigger( "update", event, this._uiHash() );
1458
+ } );
1459
+ }
1460
+
1461
+ // Check if the items Container has Changed and trigger appropriate
1462
+ // events.
1463
+ if ( this !== this.currentContainer ) {
1464
+ if ( !noPropagation ) {
1465
+ delayedTriggers.push( function( event ) {
1466
+ this._trigger( "remove", event, this._uiHash() );
1467
+ } );
1468
+ delayedTriggers.push( ( function( c ) {
1469
+ return function( event ) {
1470
+ c._trigger( "receive", event, this._uiHash( this ) );
1471
+ };
1472
+ } ).call( this, this.currentContainer ) );
1473
+ delayedTriggers.push( ( function( c ) {
1474
+ return function( event ) {
1475
+ c._trigger( "update", event, this._uiHash( this ) );
1476
+ };
1477
+ } ).call( this, this.currentContainer ) );
1478
+ }
1479
+ }
1480
+
1481
+ //Post events to containers
1482
+ function delayEvent( type, instance, container ) {
1483
+ return function( event ) {
1484
+ container._trigger( type, event, instance._uiHash( instance ) );
1485
+ };
1486
+ }
1487
+ for ( i = this.containers.length - 1; i >= 0; i-- ) {
1488
+ if ( !noPropagation ) {
1489
+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );
1490
+ }
1491
+ if ( this.containers[ i ].containerCache.over ) {
1492
+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );
1493
+ this.containers[ i ].containerCache.over = 0;
1494
+ }
1495
+ }
1496
+
1497
+ //Do what was originally in plugins
1498
+ if ( this.storedCursor ) {
1499
+ this.document.find( "body" ).css( "cursor", this.storedCursor );
1500
+ this.storedStylesheet.remove();
1501
+ }
1502
+ if ( this._storedOpacity ) {
1503
+ this.helper.css( "opacity", this._storedOpacity );
1504
+ }
1505
+ if ( this._storedZIndex ) {
1506
+ this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex );
1507
+ }
1508
+
1509
+ this.dragging = false;
1510
+
1511
+ if ( !noPropagation ) {
1512
+ this._trigger( "beforeStop", event, this._uiHash() );
1513
+ }
1514
+
1515
+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,
1516
+ // it unbinds ALL events from the original node!
1517
+ this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
1518
+
1519
+ if ( !this.cancelHelperRemoval ) {
1520
+ if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {
1521
+ this.helper.remove();
1522
+ }
1523
+ this.helper = null;
1524
+ }
1525
+
1526
+ if ( !noPropagation ) {
1527
+ for ( i = 0; i < delayedTriggers.length; i++ ) {
1528
+
1529
+ // Trigger all delayed events
1530
+ delayedTriggers[ i ].call( this, event );
1531
+ }
1532
+ this._trigger( "stop", event, this._uiHash() );
1533
+ }
1534
+
1535
+ this.fromOutside = false;
1536
+ return !this.cancelHelperRemoval;
1537
+
1538
+ },
1539
+
1540
+ _trigger: function() {
1541
+ if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {
1542
+ this.cancel();
1543
+ }
1544
+ },
1545
+
1546
+ _uiHash: function( _inst ) {
1547
+ var inst = _inst || this;
1548
+ return {
1549
+ helper: inst.helper,
1550
+ placeholder: inst.placeholder || $( [] ),
1551
+ position: inst.position,
1552
+ originalPosition: inst.originalPosition,
1553
+ offset: inst.positionAbs,
1554
+ item: inst.currentItem,
1555
+ sender: _inst ? _inst.element : null
1556
+ };
1557
+ }
1558
+
1559
+ } );
1560
+
1561
+ } ) );