activeadmin-rb 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (614) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +64 -0
  3. data/.github/ISSUE_TEMPLATE.md +20 -0
  4. data/.gitignore +21 -0
  5. data/.mdlrc +1 -0
  6. data/.rubocop.yml +84 -0
  7. data/.simplecov +13 -0
  8. data/.travis.yml +49 -0
  9. data/.yardopts +7 -0
  10. data/CHANGELOG.md +389 -0
  11. data/CODE_OF_CONDUCT.md +22 -0
  12. data/CONTRIBUTING.md +184 -0
  13. data/Gemfile +58 -0
  14. data/LICENSE +20 -0
  15. data/README.md +75 -0
  16. data/Rakefile +54 -0
  17. data/activeadmin-rb.gemspec +32 -0
  18. data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
  19. data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
  20. data/app/assets/images/active_admin/orderable.png +0 -0
  21. data/app/assets/javascripts/active_admin/base.js.coffee +13 -0
  22. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  23. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  24. data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +11 -0
  25. data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +14 -0
  26. data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +26 -0
  27. data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +7 -0
  28. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +42 -0
  29. data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +46 -0
  30. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +104 -0
  31. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  32. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  33. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
  34. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +46 -0
  35. data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +22 -0
  36. data/app/assets/stylesheets/active_admin/_base.scss +41 -0
  37. data/app/assets/stylesheets/active_admin/_forms.scss +338 -0
  38. data/app/assets/stylesheets/active_admin/_header.scss +156 -0
  39. data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
  40. data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
  41. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +6 -0
  42. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
  43. data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
  44. data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
  45. data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
  46. data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
  47. data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
  48. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
  49. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  50. data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
  51. data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
  52. data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
  53. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  54. data/app/assets/stylesheets/active_admin/components/_pagination.scss +55 -0
  55. data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
  56. data/app/assets/stylesheets/active_admin/components/_scopes.scss +13 -0
  57. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +17 -0
  58. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  59. data/app/assets/stylesheets/active_admin/components/_tables.scss +113 -0
  60. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  61. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  62. data/app/assets/stylesheets/active_admin/mixins/_all.scss +8 -0
  63. data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
  64. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  65. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  66. data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
  67. data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
  68. data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
  69. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
  70. data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
  71. data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
  72. data/app/assets/stylesheets/active_admin/print.scss +287 -0
  73. data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
  74. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
  75. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
  76. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  77. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  78. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  79. data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
  80. data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
  81. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  82. data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
  83. data/app/views/active_admin/devise/shared/_links.erb +33 -0
  84. data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
  85. data/app/views/active_admin/page/index.html.arb +1 -0
  86. data/app/views/active_admin/resource/edit.html.arb +1 -0
  87. data/app/views/active_admin/resource/index.html.arb +1 -0
  88. data/app/views/active_admin/resource/new.html.arb +1 -0
  89. data/app/views/active_admin/resource/show.html.arb +1 -0
  90. data/app/views/kaminari/active_admin/_first_page.html.erb +11 -0
  91. data/app/views/kaminari/active_admin/_gap.html.erb +8 -0
  92. data/app/views/kaminari/active_admin/_last_page.html.erb +11 -0
  93. data/app/views/kaminari/active_admin/_next_page.html.erb +11 -0
  94. data/app/views/kaminari/active_admin/_page.html.erb +12 -0
  95. data/app/views/kaminari/active_admin/_paginator.html.erb +25 -0
  96. data/app/views/kaminari/active_admin/_prev_page.html.erb +11 -0
  97. data/app/views/layouts/active_admin.html.arb +1 -0
  98. data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
  99. data/codecov.yml +25 -0
  100. data/config/i18n-tasks.yml +26 -0
  101. data/config/locales/ar.yml +134 -0
  102. data/config/locales/bg.yml +119 -0
  103. data/config/locales/bs.yml +120 -0
  104. data/config/locales/ca.yml +105 -0
  105. data/config/locales/cs.yml +108 -0
  106. data/config/locales/da.yml +136 -0
  107. data/config/locales/de-CH.yml +100 -0
  108. data/config/locales/de.yml +143 -0
  109. data/config/locales/el.yml +125 -0
  110. data/config/locales/en-CA.yml +138 -0
  111. data/config/locales/en-GB.yml +138 -0
  112. data/config/locales/en.yml +161 -0
  113. data/config/locales/eo.yml +144 -0
  114. data/config/locales/es-MX.yml +95 -0
  115. data/config/locales/es.yml +161 -0
  116. data/config/locales/fa.yml +118 -0
  117. data/config/locales/fi.yml +111 -0
  118. data/config/locales/fr.yml +140 -0
  119. data/config/locales/he.yml +141 -0
  120. data/config/locales/hr.yml +122 -0
  121. data/config/locales/hu.yml +97 -0
  122. data/config/locales/id.yml +134 -0
  123. data/config/locales/it.yml +143 -0
  124. data/config/locales/ja.yml +140 -0
  125. data/config/locales/ko.yml +119 -0
  126. data/config/locales/lt.yml +141 -0
  127. data/config/locales/lv.yml +91 -0
  128. data/config/locales/nb.yml +129 -0
  129. data/config/locales/nl.yml +143 -0
  130. data/config/locales/pl.yml +167 -0
  131. data/config/locales/pt-BR.yml +142 -0
  132. data/config/locales/pt-PT.yml +91 -0
  133. data/config/locales/ro.yml +95 -0
  134. data/config/locales/ru.yml +140 -0
  135. data/config/locales/sk.yml +108 -0
  136. data/config/locales/sv-SE.yml +134 -0
  137. data/config/locales/tr.yml +143 -0
  138. data/config/locales/uk.yml +135 -0
  139. data/config/locales/vi.yml +133 -0
  140. data/config/locales/zh-CN.yml +142 -0
  141. data/config/locales/zh-TW.yml +134 -0
  142. data/config/mdl_style.rb +9 -0
  143. data/cucumber.yml +6 -0
  144. data/docs/0-installation.md +118 -0
  145. data/docs/1-general-configuration.md +204 -0
  146. data/docs/10-custom-pages.md +150 -0
  147. data/docs/11-decorators.md +59 -0
  148. data/docs/12-arbre-components.md +203 -0
  149. data/docs/13-authorization-adapter.md +285 -0
  150. data/docs/14-gotchas.md +138 -0
  151. data/docs/2-resource-customization.md +466 -0
  152. data/docs/3-index-pages.md +328 -0
  153. data/docs/3-index-pages/custom-index.md +35 -0
  154. data/docs/3-index-pages/index-as-block.md +19 -0
  155. data/docs/3-index-pages/index-as-blog.md +69 -0
  156. data/docs/3-index-pages/index-as-grid.md +27 -0
  157. data/docs/3-index-pages/index-as-table.md +225 -0
  158. data/docs/4-csv-format.md +74 -0
  159. data/docs/5-forms.md +231 -0
  160. data/docs/6-show-pages.md +81 -0
  161. data/docs/7-sidebars.md +75 -0
  162. data/docs/8-custom-actions.md +177 -0
  163. data/docs/9-batch-actions.md +237 -0
  164. data/docs/CNAME +1 -0
  165. data/docs/Gemfile +2 -0
  166. data/docs/README.md +24 -0
  167. data/docs/_config.yml +2 -0
  168. data/docs/_includes/footer.html +8 -0
  169. data/docs/_includes/google-analytics.html +16 -0
  170. data/docs/_includes/head.html +7 -0
  171. data/docs/_includes/toc.html +98 -0
  172. data/docs/_includes/top-menu.html +9 -0
  173. data/docs/_layouts/default.html +21 -0
  174. data/docs/documentation.md +60 -0
  175. data/docs/images/activeadmin.png +0 -0
  176. data/docs/images/code-header.png +0 -0
  177. data/docs/images/divider.png +0 -0
  178. data/docs/images/features.png +0 -0
  179. data/docs/index.html +125 -0
  180. data/docs/stylesheets/main.css +1152 -0
  181. data/features/action_item.feature +73 -0
  182. data/features/authorization.feature +64 -0
  183. data/features/authorization_cancan.feature +52 -0
  184. data/features/authorization_pundit.feature +37 -0
  185. data/features/belongs_to.feature +124 -0
  186. data/features/breadcrumb.feature +76 -0
  187. data/features/comments/commenting.feature +178 -0
  188. data/features/comments/viewing_index.feature +19 -0
  189. data/features/create_another.feature +55 -0
  190. data/features/dashboard.feature +16 -0
  191. data/features/decorators.feature +43 -0
  192. data/features/development_reloading.feature +28 -0
  193. data/features/edit_page.feature +116 -0
  194. data/features/favicon.feature +20 -0
  195. data/features/first_boot.feature +16 -0
  196. data/features/footer.feature +29 -0
  197. data/features/global_navigation.feature +29 -0
  198. data/features/i18n.feature +55 -0
  199. data/features/index/batch_actions.feature +218 -0
  200. data/features/index/filters.feature +251 -0
  201. data/features/index/format_as_csv.feature +227 -0
  202. data/features/index/formats.feature +88 -0
  203. data/features/index/index_as_block.feature +15 -0
  204. data/features/index/index_as_blog.feature +69 -0
  205. data/features/index/index_as_grid.feature +45 -0
  206. data/features/index/index_as_table.feature +291 -0
  207. data/features/index/index_blank_slate.feature +83 -0
  208. data/features/index/index_parameters.feature +75 -0
  209. data/features/index/index_scope_to.feature +56 -0
  210. data/features/index/index_scopes.feature +325 -0
  211. data/features/index/page_title.feature +41 -0
  212. data/features/index/pagination.feature +63 -0
  213. data/features/index/switch_index_view.feature +73 -0
  214. data/features/menu.feature +85 -0
  215. data/features/meta_tags.feature +21 -0
  216. data/features/new_page.feature +136 -0
  217. data/features/registering_assets.feature +38 -0
  218. data/features/registering_pages.feature +237 -0
  219. data/features/registering_resources.feature +33 -0
  220. data/features/renamed_resource.feature +30 -0
  221. data/features/root_to.feature +18 -0
  222. data/features/show/attributes_table_title.feature +54 -0
  223. data/features/show/columns.feature +40 -0
  224. data/features/show/default_content.feature +44 -0
  225. data/features/show/page_title.feature +58 -0
  226. data/features/show/tabs.feature +33 -0
  227. data/features/sidebar_sections.feature +210 -0
  228. data/features/site_title.feature +47 -0
  229. data/features/specifying_actions.feature +118 -0
  230. data/features/step_definitions/action_item_steps.rb +7 -0
  231. data/features/step_definitions/action_link_steps.rb +19 -0
  232. data/features/step_definitions/additional_web_steps.rb +81 -0
  233. data/features/step_definitions/asset_steps.rb +15 -0
  234. data/features/step_definitions/attribute_steps.rb +18 -0
  235. data/features/step_definitions/attributes_table_title_steps.rb +11 -0
  236. data/features/step_definitions/batch_action_steps.rb +81 -0
  237. data/features/step_definitions/blog_steps.rb +3 -0
  238. data/features/step_definitions/breadcrumb_steps.rb +13 -0
  239. data/features/step_definitions/column_steps.rb +8 -0
  240. data/features/step_definitions/comment_steps.rb +32 -0
  241. data/features/step_definitions/configuration_steps.rb +100 -0
  242. data/features/step_definitions/dashboard_steps.rb +15 -0
  243. data/features/step_definitions/factory_steps.rb +35 -0
  244. data/features/step_definitions/filter_steps.rb +57 -0
  245. data/features/step_definitions/flash_steps.rb +11 -0
  246. data/features/step_definitions/footer_steps.rb +21 -0
  247. data/features/step_definitions/format_steps.rb +58 -0
  248. data/features/step_definitions/i18n_steps.rb +11 -0
  249. data/features/step_definitions/index_scope_steps.rb +42 -0
  250. data/features/step_definitions/index_views_steps.rb +3 -0
  251. data/features/step_definitions/layout_steps.rb +3 -0
  252. data/features/step_definitions/member_link_steps.rb +7 -0
  253. data/features/step_definitions/menu_steps.rb +11 -0
  254. data/features/step_definitions/meta_tag_steps.rb +3 -0
  255. data/features/step_definitions/pagination_steps.rb +15 -0
  256. data/features/step_definitions/root_steps.rb +9 -0
  257. data/features/step_definitions/sidebar_steps.rb +11 -0
  258. data/features/step_definitions/site_title_steps.rb +31 -0
  259. data/features/step_definitions/tab_steps.rb +8 -0
  260. data/features/step_definitions/table_steps.rb +116 -0
  261. data/features/step_definitions/user_steps.rb +52 -0
  262. data/features/step_definitions/web_steps.rb +86 -0
  263. data/features/sti_resource.feature +65 -0
  264. data/features/strong_parameters.feature +69 -0
  265. data/features/support/env.rb +121 -0
  266. data/features/support/paths.rb +73 -0
  267. data/features/support/regular_env.rb +7 -0
  268. data/features/support/reload_env.rb +7 -0
  269. data/features/support/selectors.rb +45 -0
  270. data/features/users/logging_in.feature +32 -0
  271. data/features/users/logging_out.feature +29 -0
  272. data/features/users/resetting_password.feature +30 -0
  273. data/gemfiles/rails_42.gemfile +11 -0
  274. data/gemfiles/rails_50.gemfile +11 -0
  275. data/gemfiles/rails_51.gemfile +11 -0
  276. data/gemfiles/rails_52.gemfile +12 -0
  277. data/lib/active_admin.rb +128 -0
  278. data/lib/active_admin/abstract_view_factory.rb +47 -0
  279. data/lib/active_admin/application.rb +241 -0
  280. data/lib/active_admin/application_settings.rb +39 -0
  281. data/lib/active_admin/asset_registration.rb +37 -0
  282. data/lib/active_admin/authorization_adapter.rb +129 -0
  283. data/lib/active_admin/base_controller.rb +81 -0
  284. data/lib/active_admin/base_controller/authorization.rb +128 -0
  285. data/lib/active_admin/base_controller/menu.rb +34 -0
  286. data/lib/active_admin/batch_actions.rb +16 -0
  287. data/lib/active_admin/batch_actions/controller.rb +40 -0
  288. data/lib/active_admin/batch_actions/resource_extension.rb +151 -0
  289. data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
  290. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
  291. data/lib/active_admin/batch_actions/views/selection_cells.rb +38 -0
  292. data/lib/active_admin/callbacks.rb +88 -0
  293. data/lib/active_admin/cancan_adapter.rb +36 -0
  294. data/lib/active_admin/component.rb +5 -0
  295. data/lib/active_admin/controller_action.rb +12 -0
  296. data/lib/active_admin/csv_builder.rb +131 -0
  297. data/lib/active_admin/dependency.rb +172 -0
  298. data/lib/active_admin/deprecation.rb +10 -0
  299. data/lib/active_admin/devise.rb +80 -0
  300. data/lib/active_admin/dsl.rb +167 -0
  301. data/lib/active_admin/dynamic_setting.rb +38 -0
  302. data/lib/active_admin/dynamic_settings_node.rb +28 -0
  303. data/lib/active_admin/engine.rb +21 -0
  304. data/lib/active_admin/error.rb +62 -0
  305. data/lib/active_admin/event.rb +24 -0
  306. data/lib/active_admin/filters.rb +11 -0
  307. data/lib/active_admin/filters/active.rb +29 -0
  308. data/lib/active_admin/filters/active_filter.rb +123 -0
  309. data/lib/active_admin/filters/active_sidebar.rb +50 -0
  310. data/lib/active_admin/filters/dsl.rb +21 -0
  311. data/lib/active_admin/filters/forms.rb +85 -0
  312. data/lib/active_admin/filters/formtastic_addons.rb +79 -0
  313. data/lib/active_admin/filters/resource_extension.rb +155 -0
  314. data/lib/active_admin/form_builder.rb +182 -0
  315. data/lib/active_admin/generators/boilerplate.rb +45 -0
  316. data/lib/active_admin/helpers/collection.rb +19 -0
  317. data/lib/active_admin/helpers/i18n.rb +7 -0
  318. data/lib/active_admin/helpers/optional_display.rb +38 -0
  319. data/lib/active_admin/helpers/output_safety_helper.rb +35 -0
  320. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  321. data/lib/active_admin/helpers/scope_chain.rb +23 -0
  322. data/lib/active_admin/inputs.rb +21 -0
  323. data/lib/active_admin/inputs/datepicker_input.rb +27 -0
  324. data/lib/active_admin/inputs/filters/base.rb +44 -0
  325. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  326. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  327. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  328. data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
  329. data/lib/active_admin/inputs/filters/date_range_input.rb +49 -0
  330. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  331. data/lib/active_admin/inputs/filters/select_input.rb +58 -0
  332. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  333. data/lib/active_admin/inputs/filters/text_input.rb +25 -0
  334. data/lib/active_admin/localizers.rb +11 -0
  335. data/lib/active_admin/localizers/resource_localizer.rb +35 -0
  336. data/lib/active_admin/menu.rb +102 -0
  337. data/lib/active_admin/menu_collection.rb +91 -0
  338. data/lib/active_admin/menu_item.rb +69 -0
  339. data/lib/active_admin/namespace.rb +266 -0
  340. data/lib/active_admin/namespace_settings.rb +107 -0
  341. data/lib/active_admin/order_clause.rb +48 -0
  342. data/lib/active_admin/orm/active_record.rb +5 -0
  343. data/lib/active_admin/orm/active_record/comments.rb +101 -0
  344. data/lib/active_admin/orm/active_record/comments/comment.rb +31 -0
  345. data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
  346. data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
  347. data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
  348. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  349. data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +95 -0
  350. data/lib/active_admin/orm/mongoid.rb +1 -0
  351. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  352. data/lib/active_admin/page.rb +111 -0
  353. data/lib/active_admin/page_controller.rb +29 -0
  354. data/lib/active_admin/page_dsl.rb +32 -0
  355. data/lib/active_admin/page_presenter.rb +32 -0
  356. data/lib/active_admin/pundit_adapter.rb +68 -0
  357. data/lib/active_admin/reloader.rb +25 -0
  358. data/lib/active_admin/resource.rb +206 -0
  359. data/lib/active_admin/resource/action_items.rb +120 -0
  360. data/lib/active_admin/resource/attributes.rb +44 -0
  361. data/lib/active_admin/resource/belongs_to.rb +48 -0
  362. data/lib/active_admin/resource/controllers.rb +19 -0
  363. data/lib/active_admin/resource/includes.rb +12 -0
  364. data/lib/active_admin/resource/menu.rb +67 -0
  365. data/lib/active_admin/resource/naming.rb +62 -0
  366. data/lib/active_admin/resource/ordering.rb +11 -0
  367. data/lib/active_admin/resource/page_presenters.rb +82 -0
  368. data/lib/active_admin/resource/pagination.rb +23 -0
  369. data/lib/active_admin/resource/routes.rb +134 -0
  370. data/lib/active_admin/resource/scope_to.rb +74 -0
  371. data/lib/active_admin/resource/scopes.rb +52 -0
  372. data/lib/active_admin/resource/sidebars.rb +28 -0
  373. data/lib/active_admin/resource_collection.rb +72 -0
  374. data/lib/active_admin/resource_controller.rb +64 -0
  375. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  376. data/lib/active_admin/resource_controller/data_access.rb +322 -0
  377. data/lib/active_admin/resource_controller/decorators.rb +102 -0
  378. data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
  379. data/lib/active_admin/resource_controller/scoping.rb +31 -0
  380. data/lib/active_admin/resource_controller/sidebars.rb +18 -0
  381. data/lib/active_admin/resource_controller/streaming.rb +43 -0
  382. data/lib/active_admin/resource_dsl.rb +222 -0
  383. data/lib/active_admin/router.rb +113 -0
  384. data/lib/active_admin/scope.rb +60 -0
  385. data/lib/active_admin/settings_node.rb +19 -0
  386. data/lib/active_admin/sidebar_section.rb +37 -0
  387. data/lib/active_admin/version.rb +3 -0
  388. data/lib/active_admin/view_factory.rb +27 -0
  389. data/lib/active_admin/view_helpers.rb +20 -0
  390. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  391. data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
  392. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
  393. data/lib/active_admin/view_helpers/display_helper.rb +95 -0
  394. data/lib/active_admin/view_helpers/download_format_links_helper.rb +58 -0
  395. data/lib/active_admin/view_helpers/fields_for.rb +50 -0
  396. data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
  397. data/lib/active_admin/view_helpers/form_helper.rb +20 -0
  398. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
  399. data/lib/active_admin/view_helpers/scope_name_helper.rb +16 -0
  400. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  401. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  402. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  403. data/lib/active_admin/views.rb +8 -0
  404. data/lib/active_admin/views/action_items.rb +17 -0
  405. data/lib/active_admin/views/components/active_admin_form.rb +149 -0
  406. data/lib/active_admin/views/components/attributes_table.rb +94 -0
  407. data/lib/active_admin/views/components/blank_slate.rb +17 -0
  408. data/lib/active_admin/views/components/columns.rb +161 -0
  409. data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
  410. data/lib/active_admin/views/components/index_list.rb +69 -0
  411. data/lib/active_admin/views/components/menu.rb +32 -0
  412. data/lib/active_admin/views/components/menu_item.rb +58 -0
  413. data/lib/active_admin/views/components/paginated_collection.rb +159 -0
  414. data/lib/active_admin/views/components/panel.rb +38 -0
  415. data/lib/active_admin/views/components/scopes.rb +72 -0
  416. data/lib/active_admin/views/components/sidebar.rb +13 -0
  417. data/lib/active_admin/views/components/sidebar_section.rb +37 -0
  418. data/lib/active_admin/views/components/site_title.rb +54 -0
  419. data/lib/active_admin/views/components/status_tag.rb +88 -0
  420. data/lib/active_admin/views/components/table_for.rb +209 -0
  421. data/lib/active_admin/views/components/tabs.rb +31 -0
  422. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  423. data/lib/active_admin/views/footer.rb +30 -0
  424. data/lib/active_admin/views/header.rb +19 -0
  425. data/lib/active_admin/views/index_as_block.rb +36 -0
  426. data/lib/active_admin/views/index_as_blog.rb +155 -0
  427. data/lib/active_admin/views/index_as_grid.rb +80 -0
  428. data/lib/active_admin/views/index_as_table.rb +389 -0
  429. data/lib/active_admin/views/pages/base.rb +123 -0
  430. data/lib/active_admin/views/pages/form.rb +64 -0
  431. data/lib/active_admin/views/pages/index.rb +163 -0
  432. data/lib/active_admin/views/pages/layout.rb +26 -0
  433. data/lib/active_admin/views/pages/page.rb +30 -0
  434. data/lib/active_admin/views/pages/show.rb +65 -0
  435. data/lib/active_admin/views/tabbed_navigation.rb +11 -0
  436. data/lib/active_admin/views/title_bar.rb +55 -0
  437. data/lib/activeadmin-rb.rb +1 -0
  438. data/lib/bug_report_templates/active_admin_master.rb +112 -0
  439. data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
  440. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  441. data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
  442. data/lib/generators/active_admin/devise/devise_generator.rb +68 -0
  443. data/lib/generators/active_admin/install/install_generator.rb +45 -0
  444. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +293 -0
  445. data/lib/generators/active_admin/install/templates/admin_users.rb.erb +28 -0
  446. data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
  447. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb.erb +30 -0
  448. data/lib/generators/active_admin/page/USAGE +8 -0
  449. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  450. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  451. data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
  452. data/lib/generators/active_admin/resource/templates/admin.rb.erb +43 -0
  453. data/lib/ransack_ext.rb +20 -0
  454. data/spec/bug_report_templates_spec.rb +26 -0
  455. data/spec/changelog_spec.rb +15 -0
  456. data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
  457. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  458. data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
  459. data/spec/javascripts/fixtures/checkboxes.html +9 -0
  460. data/spec/javascripts/fixtures/flashes.html +2 -0
  461. data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
  462. data/spec/javascripts/helpers/SpecHelper.js +3 -0
  463. data/spec/javascripts/support/jasmine.yml +74 -0
  464. data/spec/javascripts/support/jasmine_runner.rb +19 -0
  465. data/spec/rails_helper.rb +60 -0
  466. data/spec/requests/default_namespace_spec.rb +81 -0
  467. data/spec/requests/memory_spec.rb +25 -0
  468. data/spec/requests/stylesheets_spec.rb +18 -0
  469. data/spec/spec_helper.rb +1 -0
  470. data/spec/support/active_admin_integration_spec_helper.rb +73 -0
  471. data/spec/support/active_admin_request_helpers.rb +39 -0
  472. data/spec/support/rails_template.rb +156 -0
  473. data/spec/support/rails_template_with_data.rb +327 -0
  474. data/spec/support/templates/admin/stores.rb +7 -0
  475. data/spec/support/templates/en.yml +8 -0
  476. data/spec/support/templates/manifest.js +3 -0
  477. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  478. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  479. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  480. data/spec/support/templates/policies/application_policy.rb +44 -0
  481. data/spec/support/templates/policies/category_policy.rb +7 -0
  482. data/spec/support/templates/policies/post_policy.rb +15 -0
  483. data/spec/support/templates/policies/store_policy.rb +11 -0
  484. data/spec/support/templates/policies/user_policy.rb +11 -0
  485. data/spec/support/templates/post_decorator.rb +24 -0
  486. data/spec/unit/abstract_view_factory_spec.rb +78 -0
  487. data/spec/unit/action_builder_spec.rb +158 -0
  488. data/spec/unit/active_admin_spec.rb +11 -0
  489. data/spec/unit/application_spec.rb +180 -0
  490. data/spec/unit/asset_registration_spec.rb +81 -0
  491. data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
  492. data/spec/unit/authorization/controller_authorization_spec.rb +43 -0
  493. data/spec/unit/authorization/index_overriding_spec.rb +23 -0
  494. data/spec/unit/auto_link_spec.rb +93 -0
  495. data/spec/unit/batch_actions/resource_spec.rb +84 -0
  496. data/spec/unit/batch_actions/settings_spec.rb +61 -0
  497. data/spec/unit/belongs_to_spec.rb +76 -0
  498. data/spec/unit/cancan_adapter_spec.rb +43 -0
  499. data/spec/unit/comments_spec.rb +189 -0
  500. data/spec/unit/component_spec.rb +18 -0
  501. data/spec/unit/config_shared_examples.rb +59 -0
  502. data/spec/unit/controller_filters_spec.rb +41 -0
  503. data/spec/unit/csv_builder_spec.rb +313 -0
  504. data/spec/unit/dependency_spec.rb +135 -0
  505. data/spec/unit/devise_spec.rb +110 -0
  506. data/spec/unit/dsl_spec.rb +120 -0
  507. data/spec/unit/dynamic_settings_spec.rb +28 -0
  508. data/spec/unit/filters/active_filter_spec.rb +218 -0
  509. data/spec/unit/filters/active_spec.rb +24 -0
  510. data/spec/unit/filters/filter_form_builder_spec.rb +524 -0
  511. data/spec/unit/filters/resource_spec.rb +128 -0
  512. data/spec/unit/form_builder_spec.rb +1012 -0
  513. data/spec/unit/generators/install_spec.rb +31 -0
  514. data/spec/unit/helpers/collection_spec.rb +68 -0
  515. data/spec/unit/helpers/output_safety_helper_spec.rb +79 -0
  516. data/spec/unit/helpers/scope_chain_spec.rb +35 -0
  517. data/spec/unit/i18n_spec.rb +29 -0
  518. data/spec/unit/localizers/resource_localizer_spec.rb +36 -0
  519. data/spec/unit/menu_collection_spec.rb +62 -0
  520. data/spec/unit/menu_item_spec.rb +82 -0
  521. data/spec/unit/menu_spec.rb +60 -0
  522. data/spec/unit/namespace/authorization_spec.rb +27 -0
  523. data/spec/unit/namespace/register_page_spec.rb +99 -0
  524. data/spec/unit/namespace/register_resource_spec.rb +162 -0
  525. data/spec/unit/namespace_spec.rb +126 -0
  526. data/spec/unit/order_clause_spec.rb +81 -0
  527. data/spec/unit/page_controller_spec.rb +5 -0
  528. data/spec/unit/page_spec.rb +128 -0
  529. data/spec/unit/pretty_format_spec.rb +82 -0
  530. data/spec/unit/pundit_adapter_spec.rb +98 -0
  531. data/spec/unit/resource/action_items_spec.rb +83 -0
  532. data/spec/unit/resource/attributes_spec.rb +49 -0
  533. data/spec/unit/resource/includes_spec.rb +21 -0
  534. data/spec/unit/resource/menu_spec.rb +18 -0
  535. data/spec/unit/resource/naming_spec.rb +120 -0
  536. data/spec/unit/resource/ordering_spec.rb +35 -0
  537. data/spec/unit/resource/page_presenters_spec.rb +44 -0
  538. data/spec/unit/resource/pagination_spec.rb +38 -0
  539. data/spec/unit/resource/routes_spec.rb +125 -0
  540. data/spec/unit/resource/scopes_spec.rb +50 -0
  541. data/spec/unit/resource/sidebars_spec.rb +43 -0
  542. data/spec/unit/resource_collection_spec.rb +175 -0
  543. data/spec/unit/resource_controller/data_access_spec.rb +234 -0
  544. data/spec/unit/resource_controller/decorators_spec.rb +94 -0
  545. data/spec/unit/resource_controller/sidebars_spec.rb +37 -0
  546. data/spec/unit/resource_controller_spec.rb +273 -0
  547. data/spec/unit/resource_registration_spec.rb +61 -0
  548. data/spec/unit/resource_spec.rb +320 -0
  549. data/spec/unit/routing_spec.rb +211 -0
  550. data/spec/unit/scope_spec.rb +225 -0
  551. data/spec/unit/settings_node_spec.rb +26 -0
  552. data/spec/unit/view_factory_spec.rb +19 -0
  553. data/spec/unit/view_helpers/breadcrumbs_spec.rb +253 -0
  554. data/spec/unit/view_helpers/display_helper_spec.rb +203 -0
  555. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
  556. data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
  557. data/spec/unit/view_helpers/flash_helper_spec.rb +24 -0
  558. data/spec/unit/view_helpers/form_helper_spec.rb +42 -0
  559. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +138 -0
  560. data/spec/unit/views/components/attributes_table_spec.rb +271 -0
  561. data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
  562. data/spec/unit/views/components/blank_slate_spec.rb +27 -0
  563. data/spec/unit/views/components/columns_spec.rb +187 -0
  564. data/spec/unit/views/components/index_list_spec.rb +49 -0
  565. data/spec/unit/views/components/index_table_for_spec.rb +127 -0
  566. data/spec/unit/views/components/menu_item_spec.rb +29 -0
  567. data/spec/unit/views/components/menu_spec.rb +168 -0
  568. data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
  569. data/spec/unit/views/components/panel_spec.rb +58 -0
  570. data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
  571. data/spec/unit/views/components/sidebar_spec.rb +24 -0
  572. data/spec/unit/views/components/site_title_spec.rb +82 -0
  573. data/spec/unit/views/components/status_tag_spec.rb +265 -0
  574. data/spec/unit/views/components/table_for_spec.rb +441 -0
  575. data/spec/unit/views/components/tabs_spec.rb +71 -0
  576. data/spec/unit/views/components/unsupported_browser_spec.rb +39 -0
  577. data/spec/unit/views/index_as_blog_spec.rb +76 -0
  578. data/spec/unit/views/pages/base_spec.rb +14 -0
  579. data/spec/unit/views/pages/form_spec.rb +54 -0
  580. data/spec/unit/views/pages/index_spec.rb +60 -0
  581. data/spec/unit/views/pages/layout_spec.rb +59 -0
  582. data/spec/unit/views/pages/show_spec.rb +32 -0
  583. data/tasks/docs.rake +64 -0
  584. data/tasks/lint.rake +21 -0
  585. data/tasks/local.rake +25 -0
  586. data/tasks/parallel_tests.rake +66 -0
  587. data/tasks/test.rake +24 -0
  588. data/vendor/assets/javascripts/jquery-ui/data.js +41 -0
  589. data/vendor/assets/javascripts/jquery-ui/disable-selection.js +48 -0
  590. data/vendor/assets/javascripts/jquery-ui/escape-selector.js +23 -0
  591. data/vendor/assets/javascripts/jquery-ui/focusable.js +86 -0
  592. data/vendor/assets/javascripts/jquery-ui/ie.js +17 -0
  593. data/vendor/assets/javascripts/jquery-ui/keycode.js +47 -0
  594. data/vendor/assets/javascripts/jquery-ui/plugin.js +46 -0
  595. data/vendor/assets/javascripts/jquery-ui/position.js +500 -0
  596. data/vendor/assets/javascripts/jquery-ui/safe-active-element.js +42 -0
  597. data/vendor/assets/javascripts/jquery-ui/safe-blur.js +23 -0
  598. data/vendor/assets/javascripts/jquery-ui/scroll-parent.js +47 -0
  599. data/vendor/assets/javascripts/jquery-ui/tabbable.js +38 -0
  600. data/vendor/assets/javascripts/jquery-ui/unique-id.js +51 -0
  601. data/vendor/assets/javascripts/jquery-ui/version.js +17 -0
  602. data/vendor/assets/javascripts/jquery-ui/widget.js +735 -0
  603. data/vendor/assets/javascripts/jquery-ui/widgets/button.js +391 -0
  604. data/vendor/assets/javascripts/jquery-ui/widgets/checkboxradio.js +300 -0
  605. data/vendor/assets/javascripts/jquery-ui/widgets/controlgroup.js +300 -0
  606. data/vendor/assets/javascripts/jquery-ui/widgets/datepicker.js +2123 -0
  607. data/vendor/assets/javascripts/jquery-ui/widgets/dialog.js +954 -0
  608. data/vendor/assets/javascripts/jquery-ui/widgets/draggable.js +1259 -0
  609. data/vendor/assets/javascripts/jquery-ui/widgets/mouse.js +230 -0
  610. data/vendor/assets/javascripts/jquery-ui/widgets/resizable.js +1207 -0
  611. data/vendor/assets/javascripts/jquery-ui/widgets/sortable.js +1561 -0
  612. data/vendor/assets/javascripts/jquery-ui/widgets/tabs.js +931 -0
  613. data/vendor/assets/stylesheets/active_admin/_normalize.scss +447 -0
  614. metadata +1037 -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
+ } ) );