activeadmin 2.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (372) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +546 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/CONTRIBUTING.md +217 -0
  5. data/LICENSE +20 -0
  6. data/README.md +110 -0
  7. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  8. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  9. data/app/assets/images/active_admin/orderable.png +0 -0
  10. data/app/assets/javascripts/active_admin/base.es6 +23 -0
  11. data/app/assets/javascripts/active_admin/ext/jquery-ui.es6 +7 -0
  12. data/app/assets/javascripts/active_admin/ext/jquery.es6 +9 -0
  13. data/app/assets/javascripts/active_admin/initializers/datepicker.es6 +16 -0
  14. data/app/assets/javascripts/active_admin/initializers/filters.es6 +45 -0
  15. data/app/assets/javascripts/active_admin/initializers/tabs.es6 +6 -0
  16. data/app/assets/javascripts/active_admin/lib/active_admin.es6 +41 -0
  17. data/app/assets/javascripts/active_admin/lib/batch_actions.es6 +55 -0
  18. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.es6 +49 -0
  19. data/app/assets/javascripts/active_admin/lib/dropdown-menu.es6 +123 -0
  20. data/app/assets/javascripts/active_admin/lib/has_many.es6 +95 -0
  21. data/app/assets/javascripts/active_admin/lib/modal_dialog.es6 +61 -0
  22. data/app/assets/javascripts/active_admin/lib/per_page.es6 +47 -0
  23. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.es6 +36 -0
  24. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  25. data/app/assets/stylesheets/active_admin/_forms.scss +326 -0
  26. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  27. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  28. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  29. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  30. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  31. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  32. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  33. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  34. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  35. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  36. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  37. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  38. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  39. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  40. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  41. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  42. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  43. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  44. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  45. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
  46. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  47. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  48. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  49. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  50. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  51. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  52. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  53. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  54. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  55. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  56. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  57. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  58. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  59. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  60. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  61. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  62. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  63. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  64. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  65. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  66. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  67. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  68. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  69. data/app/views/active_admin/devise/registrations/new.html.erb +21 -0
  70. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  71. data/app/views/active_admin/devise/shared/_error_messages.html.erb +15 -0
  72. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  73. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  74. data/app/views/active_admin/page/index.html.arb +1 -0
  75. data/app/views/active_admin/resource/edit.html.arb +1 -0
  76. data/app/views/active_admin/resource/index.html.arb +1 -0
  77. data/app/views/active_admin/resource/new.html.arb +1 -0
  78. data/app/views/active_admin/resource/show.html.arb +1 -0
  79. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  80. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  81. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  82. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  83. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  84. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  85. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  86. data/app/views/layouts/active_admin.html.arb +1 -0
  87. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  88. data/config/locales/ar.yml +135 -0
  89. data/config/locales/bg.yml +119 -0
  90. data/config/locales/bs.yml +121 -0
  91. data/config/locales/ca.yml +106 -0
  92. data/config/locales/cs.yml +109 -0
  93. data/config/locales/da.yml +137 -0
  94. data/config/locales/de-CH.yml +101 -0
  95. data/config/locales/de.yml +144 -0
  96. data/config/locales/el.yml +126 -0
  97. data/config/locales/en-CA.yml +139 -0
  98. data/config/locales/en-GB.yml +139 -0
  99. data/config/locales/en.yml +162 -0
  100. data/config/locales/eo.yml +145 -0
  101. data/config/locales/es-MX.yml +96 -0
  102. data/config/locales/es.yml +162 -0
  103. data/config/locales/fa.yml +119 -0
  104. data/config/locales/fi.yml +112 -0
  105. data/config/locales/fr.yml +141 -0
  106. data/config/locales/he.yml +141 -0
  107. data/config/locales/hr.yml +123 -0
  108. data/config/locales/hu.yml +102 -0
  109. data/config/locales/id.yml +135 -0
  110. data/config/locales/it.yml +144 -0
  111. data/config/locales/ja.yml +141 -0
  112. data/config/locales/ko.yml +120 -0
  113. data/config/locales/lt.yml +142 -0
  114. data/config/locales/lv.yml +92 -0
  115. data/config/locales/mk.yml +134 -0
  116. data/config/locales/nb.yml +130 -0
  117. data/config/locales/nl.yml +144 -0
  118. data/config/locales/pl.yml +168 -0
  119. data/config/locales/pt-BR.yml +143 -0
  120. data/config/locales/pt-PT.yml +92 -0
  121. data/config/locales/ro.yml +96 -0
  122. data/config/locales/ru.yml +141 -0
  123. data/config/locales/sk.yml +109 -0
  124. data/config/locales/sv-SE.yml +135 -0
  125. data/config/locales/tr.yml +144 -0
  126. data/config/locales/uk.yml +138 -0
  127. data/config/locales/vi.yml +134 -0
  128. data/config/locales/zh-CN.yml +143 -0
  129. data/config/locales/zh-TW.yml +135 -0
  130. data/docs/.gitignore +1 -0
  131. data/docs/0-installation.md +118 -0
  132. data/docs/1-general-configuration.md +204 -0
  133. data/docs/10-custom-pages.md +150 -0
  134. data/docs/11-decorators.md +59 -0
  135. data/docs/12-arbre-components.md +214 -0
  136. data/docs/13-authorization-adapter.md +285 -0
  137. data/docs/14-gotchas.md +138 -0
  138. data/docs/2-resource-customization.md +466 -0
  139. data/docs/3-index-pages.md +328 -0
  140. data/docs/3-index-pages/custom-index.md +35 -0
  141. data/docs/3-index-pages/index-as-block.md +19 -0
  142. data/docs/3-index-pages/index-as-blog.md +69 -0
  143. data/docs/3-index-pages/index-as-grid.md +27 -0
  144. data/docs/3-index-pages/index-as-table.md +227 -0
  145. data/docs/4-csv-format.md +74 -0
  146. data/docs/5-forms.md +232 -0
  147. data/docs/6-show-pages.md +81 -0
  148. data/docs/7-sidebars.md +75 -0
  149. data/docs/8-custom-actions.md +177 -0
  150. data/docs/9-batch-actions.md +237 -0
  151. data/docs/CNAME +1 -0
  152. data/docs/Gemfile +4 -0
  153. data/docs/Gemfile.lock +249 -0
  154. data/docs/README.md +24 -0
  155. data/docs/_config.yml +2 -0
  156. data/docs/_includes/footer.html +8 -0
  157. data/docs/_includes/google-analytics.html +16 -0
  158. data/docs/_includes/head.html +7 -0
  159. data/docs/_includes/toc.html +98 -0
  160. data/docs/_includes/top-menu.html +17 -0
  161. data/docs/_layouts/default.html +21 -0
  162. data/docs/documentation.md +60 -0
  163. data/docs/images/activeadmin.png +0 -0
  164. data/docs/images/code-header.png +0 -0
  165. data/docs/images/divider.png +0 -0
  166. data/docs/images/features.png +0 -0
  167. data/docs/images/tidelift.svg +14 -0
  168. data/docs/index.html +125 -0
  169. data/docs/stylesheets/main.css +1176 -0
  170. data/lib/active_admin.rb +134 -0
  171. data/lib/active_admin/abstract_view_factory.rb +47 -0
  172. data/lib/active_admin/application.rb +234 -0
  173. data/lib/active_admin/application_settings.rb +42 -0
  174. data/lib/active_admin/asset_registration.rb +29 -0
  175. data/lib/active_admin/authorization_adapter.rb +129 -0
  176. data/lib/active_admin/base_controller.rb +81 -0
  177. data/lib/active_admin/base_controller/authorization.rb +127 -0
  178. data/lib/active_admin/base_controller/menu.rb +34 -0
  179. data/lib/active_admin/batch_actions.rb +16 -0
  180. data/lib/active_admin/batch_actions/controller.rb +40 -0
  181. data/lib/active_admin/batch_actions/resource_extension.rb +155 -0
  182. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  183. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  184. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  185. data/lib/active_admin/callbacks.rb +88 -0
  186. data/lib/active_admin/cancan_adapter.rb +36 -0
  187. data/lib/active_admin/component.rb +5 -0
  188. data/lib/active_admin/controller_action.rb +13 -0
  189. data/lib/active_admin/csv_builder.rb +133 -0
  190. data/lib/active_admin/dependency.rb +100 -0
  191. data/lib/active_admin/deprecation.rb +10 -0
  192. data/lib/active_admin/devise.rb +80 -0
  193. data/lib/active_admin/dsl.rb +160 -0
  194. data/lib/active_admin/dynamic_setting.rb +38 -0
  195. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  196. data/lib/active_admin/engine.rb +21 -0
  197. data/lib/active_admin/error.rb +64 -0
  198. data/lib/active_admin/filters.rb +11 -0
  199. data/lib/active_admin/filters/active.rb +29 -0
  200. data/lib/active_admin/filters/active_filter.rb +124 -0
  201. data/lib/active_admin/filters/active_sidebar.rb +54 -0
  202. data/lib/active_admin/filters/dsl.rb +21 -0
  203. data/lib/active_admin/filters/forms.rb +85 -0
  204. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  205. data/lib/active_admin/filters/resource_extension.rb +155 -0
  206. data/lib/active_admin/form_builder.rb +182 -0
  207. data/lib/active_admin/generators/boilerplate.rb +45 -0
  208. data/lib/active_admin/helpers/collection.rb +19 -0
  209. data/lib/active_admin/helpers/i18n.rb +7 -0
  210. data/lib/active_admin/helpers/optional_display.rb +38 -0
  211. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  212. data/lib/active_admin/helpers/scope_chain.rb +24 -0
  213. data/lib/active_admin/inputs.rb +21 -0
  214. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  215. data/lib/active_admin/inputs/filters/base.rb +44 -0
  216. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  217. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  218. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  219. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  220. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  221. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  222. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  223. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  224. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  225. data/lib/active_admin/localizers.rb +11 -0
  226. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  227. data/lib/active_admin/menu.rb +102 -0
  228. data/lib/active_admin/menu_collection.rb +91 -0
  229. data/lib/active_admin/menu_item.rb +69 -0
  230. data/lib/active_admin/namespace.rb +266 -0
  231. data/lib/active_admin/namespace_settings.rb +110 -0
  232. data/lib/active_admin/order_clause.rb +48 -0
  233. data/lib/active_admin/orm/active_record.rb +5 -0
  234. data/lib/active_admin/orm/active_record/comments.rb +101 -0
  235. data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
  236. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  237. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  238. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  239. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  240. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +100 -0
  241. data/lib/active_admin/orm/mongoid.rb +1 -0
  242. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  243. data/lib/active_admin/page.rb +111 -0
  244. data/lib/active_admin/page_controller.rb +29 -0
  245. data/lib/active_admin/page_dsl.rb +32 -0
  246. data/lib/active_admin/page_presenter.rb +33 -0
  247. data/lib/active_admin/pundit_adapter.rb +81 -0
  248. data/lib/active_admin/resource.rb +207 -0
  249. data/lib/active_admin/resource/action_items.rb +120 -0
  250. data/lib/active_admin/resource/attributes.rb +47 -0
  251. data/lib/active_admin/resource/belongs_to.rb +50 -0
  252. data/lib/active_admin/resource/controllers.rb +19 -0
  253. data/lib/active_admin/resource/includes.rb +12 -0
  254. data/lib/active_admin/resource/menu.rb +67 -0
  255. data/lib/active_admin/resource/naming.rb +62 -0
  256. data/lib/active_admin/resource/ordering.rb +11 -0
  257. data/lib/active_admin/resource/page_presenters.rb +82 -0
  258. data/lib/active_admin/resource/pagination.rb +23 -0
  259. data/lib/active_admin/resource/routes.rb +139 -0
  260. data/lib/active_admin/resource/scope_to.rb +74 -0
  261. data/lib/active_admin/resource/scopes.rb +52 -0
  262. data/lib/active_admin/resource/sidebars.rb +28 -0
  263. data/lib/active_admin/resource_collection.rb +72 -0
  264. data/lib/active_admin/resource_controller.rb +64 -0
  265. data/lib/active_admin/resource_controller/action_builder.rb +31 -0
  266. data/lib/active_admin/resource_controller/data_access.rb +322 -0
  267. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  268. data/lib/active_admin/resource_controller/resource_class_methods.rb +26 -0
  269. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  270. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  271. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  272. data/lib/active_admin/resource_dsl.rb +224 -0
  273. data/lib/active_admin/router.rb +114 -0
  274. data/lib/active_admin/scope.rb +64 -0
  275. data/lib/active_admin/settings_node.rb +19 -0
  276. data/lib/active_admin/sidebar_section.rb +39 -0
  277. data/lib/active_admin/version.rb +3 -0
  278. data/lib/active_admin/view_factory.rb +27 -0
  279. data/lib/active_admin/view_helpers.rb +20 -0
  280. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  281. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  282. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  283. data/lib/active_admin/view_helpers/display_helper.rb +104 -0
  284. data/lib/active_admin/view_helpers/download_format_links_helper.rb +59 -0
  285. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  286. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  287. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  288. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +100 -0
  289. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  290. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  291. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  292. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  293. data/lib/active_admin/views.rb +8 -0
  294. data/lib/active_admin/views/action_items.rb +17 -0
  295. data/lib/active_admin/views/components/active_admin_form.rb +155 -0
  296. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  297. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  298. data/lib/active_admin/views/components/columns.rb +161 -0
  299. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  300. data/lib/active_admin/views/components/index_list.rb +69 -0
  301. data/lib/active_admin/views/components/menu.rb +32 -0
  302. data/lib/active_admin/views/components/menu_item.rb +58 -0
  303. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  304. data/lib/active_admin/views/components/panel.rb +38 -0
  305. data/lib/active_admin/views/components/scopes.rb +72 -0
  306. data/lib/active_admin/views/components/sidebar.rb +13 -0
  307. data/lib/active_admin/views/components/sidebar_section.rb +34 -0
  308. data/lib/active_admin/views/components/site_title.rb +54 -0
  309. data/lib/active_admin/views/components/status_tag.rb +75 -0
  310. data/lib/active_admin/views/components/table_for.rb +209 -0
  311. data/lib/active_admin/views/components/tabs.rb +40 -0
  312. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  313. data/lib/active_admin/views/footer.rb +30 -0
  314. data/lib/active_admin/views/header.rb +19 -0
  315. data/lib/active_admin/views/index_as_block.rb +36 -0
  316. data/lib/active_admin/views/index_as_blog.rb +155 -0
  317. data/lib/active_admin/views/index_as_grid.rb +80 -0
  318. data/lib/active_admin/views/index_as_table.rb +392 -0
  319. data/lib/active_admin/views/pages/base.rb +126 -0
  320. data/lib/active_admin/views/pages/form.rb +64 -0
  321. data/lib/active_admin/views/pages/index.rb +163 -0
  322. data/lib/active_admin/views/pages/layout.rb +26 -0
  323. data/lib/active_admin/views/pages/page.rb +30 -0
  324. data/lib/active_admin/views/pages/show.rb +65 -0
  325. data/lib/active_admin/views/tabbed_navigation.rb +11 -0
  326. data/lib/active_admin/views/title_bar.rb +55 -0
  327. data/lib/activeadmin.rb +1 -0
  328. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  329. data/lib/generators/active_admin/assets/templates/active_admin.js +1 -0
  330. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  331. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  332. data/lib/generators/active_admin/install/install_generator.rb +49 -0
  333. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +315 -0
  334. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  335. data/lib/generators/active_admin/install/templates/dashboard.rb +32 -0
  336. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +16 -0
  337. data/lib/generators/active_admin/page/USAGE +8 -0
  338. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  339. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  340. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  341. data/lib/generators/active_admin/resource/templates/admin.rb.erb +44 -0
  342. data/lib/ransack_ext.rb +20 -0
  343. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  344. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  345. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  346. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  347. data/vendor/assets/javascripts/jquery-ui/form-reset-mixin.js +80 -0
  348. data/vendor/assets/javascripts/jquery-ui/form.js +22 -0
  349. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  350. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  351. data/vendor/assets/javascripts/jquery-ui/labels.js +65 -0
  352. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  353. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  354. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  355. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  356. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  357. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  358. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  359. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  360. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  361. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  362. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +291 -0
  363. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  364. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  365. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  366. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  367. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  368. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  369. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  370. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  371. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  372. metadata +616 -0
@@ -0,0 +1,1561 @@
1
+ //= require jquery-ui/widgets/mouse
2
+ //= require jquery-ui/data
3
+ //= require jquery-ui/ie
4
+ //= require jquery-ui/scroll-parent
5
+ //= require jquery-ui/version
6
+ //= require 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
+ } ) );