jquery-ui_ui_widgets_draggable__js.js 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  1. // node_modules/jquery-ui/ui/widgets/draggable.js
  2. (function(factory) {
  3. "use strict";
  4. if (typeof define === "function" && define.amd) {
  5. define([
  6. "jquery",
  7. "./mouse",
  8. "../data",
  9. "../plugin",
  10. "../scroll-parent",
  11. "../version",
  12. "../widget"
  13. ], factory);
  14. } else {
  15. factory(jQuery);
  16. }
  17. })(function($) {
  18. "use strict";
  19. $.widget("ui.draggable", $.ui.mouse, {
  20. version: "1.14.1",
  21. widgetEventPrefix: "drag",
  22. options: {
  23. addClasses: true,
  24. appendTo: "parent",
  25. axis: false,
  26. connectToSortable: false,
  27. containment: false,
  28. cursor: "auto",
  29. cursorAt: false,
  30. grid: false,
  31. handle: false,
  32. helper: "original",
  33. iframeFix: false,
  34. opacity: false,
  35. refreshPositions: false,
  36. revert: false,
  37. revertDuration: 500,
  38. scope: "default",
  39. scroll: true,
  40. scrollSensitivity: 20,
  41. scrollSpeed: 20,
  42. snap: false,
  43. snapMode: "both",
  44. snapTolerance: 20,
  45. stack: false,
  46. zIndex: false,
  47. // Callbacks
  48. drag: null,
  49. start: null,
  50. stop: null
  51. },
  52. _create: function() {
  53. if (this.options.helper === "original") {
  54. this._setPositionRelative();
  55. }
  56. if (this.options.addClasses) {
  57. this._addClass("ui-draggable");
  58. }
  59. this._setHandleClassName();
  60. this._mouseInit();
  61. },
  62. _setOption: function(key, value) {
  63. this._super(key, value);
  64. if (key === "handle") {
  65. this._removeHandleClassName();
  66. this._setHandleClassName();
  67. }
  68. },
  69. _destroy: function() {
  70. if ((this.helper || this.element).is(".ui-draggable-dragging")) {
  71. this.destroyOnClear = true;
  72. return;
  73. }
  74. this._removeHandleClassName();
  75. this._mouseDestroy();
  76. },
  77. _mouseCapture: function(event) {
  78. var o = this.options;
  79. if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) {
  80. return false;
  81. }
  82. this.handle = this._getHandle(event);
  83. if (!this.handle) {
  84. return false;
  85. }
  86. this._blurActiveElement(event);
  87. this._blockFrames(o.iframeFix === true ? "iframe" : o.iframeFix);
  88. return true;
  89. },
  90. _blockFrames: function(selector) {
  91. this.iframeBlocks = this.document.find(selector).map(function() {
  92. var iframe = $(this);
  93. return $("<div>").css("position", "absolute").appendTo(iframe.parent()).outerWidth(iframe.outerWidth()).outerHeight(iframe.outerHeight()).offset(iframe.offset())[0];
  94. });
  95. },
  96. _unblockFrames: function() {
  97. if (this.iframeBlocks) {
  98. this.iframeBlocks.remove();
  99. delete this.iframeBlocks;
  100. }
  101. },
  102. _blurActiveElement: function(event) {
  103. var activeElement = this.document[0].activeElement, target = $(event.target);
  104. if (target.closest(activeElement).length) {
  105. return;
  106. }
  107. $(activeElement).trigger("blur");
  108. },
  109. _mouseStart: function(event) {
  110. var o = this.options;
  111. this.helper = this._createHelper(event);
  112. this._addClass(this.helper, "ui-draggable-dragging");
  113. this._cacheHelperProportions();
  114. if ($.ui.ddmanager) {
  115. $.ui.ddmanager.current = this;
  116. }
  117. this._cacheMargins();
  118. this.cssPosition = this.helper.css("position");
  119. this.scrollParent = this.helper.scrollParent(true);
  120. this.offsetParent = this.helper.offsetParent();
  121. this.hasFixedAncestor = this.helper.parents().filter(function() {
  122. return $(this).css("position") === "fixed";
  123. }).length > 0;
  124. this.positionAbs = this.element.offset();
  125. this._refreshOffsets(event);
  126. this.originalPosition = this.position = this._generatePosition(event, false);
  127. this.originalPageX = event.pageX;
  128. this.originalPageY = event.pageY;
  129. if (o.cursorAt) {
  130. this._adjustOffsetFromHelper(o.cursorAt);
  131. }
  132. this._setContainment();
  133. if (this._trigger("start", event) === false) {
  134. this._clear();
  135. return false;
  136. }
  137. this._cacheHelperProportions();
  138. if ($.ui.ddmanager && !o.dropBehaviour) {
  139. $.ui.ddmanager.prepareOffsets(this, event);
  140. }
  141. this._mouseDrag(event, true);
  142. if ($.ui.ddmanager) {
  143. $.ui.ddmanager.dragStart(this, event);
  144. }
  145. return true;
  146. },
  147. _refreshOffsets: function(event) {
  148. this.offset = {
  149. top: this.positionAbs.top - this.margins.top,
  150. left: this.positionAbs.left - this.margins.left,
  151. scroll: false,
  152. parent: this._getParentOffset(),
  153. relative: this._getRelativeOffset()
  154. };
  155. this.offset.click = {
  156. left: event.pageX - this.offset.left,
  157. top: event.pageY - this.offset.top
  158. };
  159. },
  160. _mouseDrag: function(event, noPropagation) {
  161. if (this.hasFixedAncestor) {
  162. this.offset.parent = this._getParentOffset();
  163. }
  164. this.position = this._generatePosition(event, true);
  165. this.positionAbs = this._convertPositionTo("absolute");
  166. if (!noPropagation) {
  167. var ui = this._uiHash();
  168. if (this._trigger("drag", event, ui) === false) {
  169. this._mouseUp(new $.Event("mouseup", event));
  170. return false;
  171. }
  172. this.position = ui.position;
  173. }
  174. this.helper[0].style.left = this.position.left + "px";
  175. this.helper[0].style.top = this.position.top + "px";
  176. if ($.ui.ddmanager) {
  177. $.ui.ddmanager.drag(this, event);
  178. }
  179. return false;
  180. },
  181. _mouseStop: function(event) {
  182. var that = this, dropped = false;
  183. if ($.ui.ddmanager && !this.options.dropBehaviour) {
  184. dropped = $.ui.ddmanager.drop(this, event);
  185. }
  186. if (this.dropped) {
  187. dropped = this.dropped;
  188. this.dropped = false;
  189. }
  190. if (this.options.revert === "invalid" && !dropped || this.options.revert === "valid" && dropped || this.options.revert === true || typeof this.options.revert === "function" && this.options.revert.call(this.element, dropped)) {
  191. $(this.helper).animate(
  192. this.originalPosition,
  193. parseInt(this.options.revertDuration, 10),
  194. function() {
  195. if (that._trigger("stop", event) !== false) {
  196. that._clear();
  197. }
  198. }
  199. );
  200. } else {
  201. if (this._trigger("stop", event) !== false) {
  202. this._clear();
  203. }
  204. }
  205. return false;
  206. },
  207. _mouseUp: function(event) {
  208. this._unblockFrames();
  209. if ($.ui.ddmanager) {
  210. $.ui.ddmanager.dragStop(this, event);
  211. }
  212. if (this.handleElement.is(event.target)) {
  213. this.element.trigger("focus");
  214. }
  215. return $.ui.mouse.prototype._mouseUp.call(this, event);
  216. },
  217. cancel: function() {
  218. if (this.helper.is(".ui-draggable-dragging")) {
  219. this._mouseUp(new $.Event("mouseup", { target: this.element[0] }));
  220. } else {
  221. this._clear();
  222. }
  223. return this;
  224. },
  225. _getHandle: function(event) {
  226. return this.options.handle ? !!$(event.target).closest(this.element.find(this.options.handle)).length : true;
  227. },
  228. _setHandleClassName: function() {
  229. this.handleElement = this.options.handle ? this.element.find(this.options.handle) : this.element;
  230. this._addClass(this.handleElement, "ui-draggable-handle");
  231. },
  232. _removeHandleClassName: function() {
  233. this._removeClass(this.handleElement, "ui-draggable-handle");
  234. },
  235. _createHelper: function(event) {
  236. var o = this.options, helperIsFunction = typeof o.helper === "function", helper = helperIsFunction ? $(o.helper.apply(this.element[0], [event])) : o.helper === "clone" ? this.element.clone().removeAttr("id") : this.element;
  237. if (!helper.parents("body").length) {
  238. helper.appendTo(o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo);
  239. }
  240. if (helperIsFunction && helper[0] === this.element[0]) {
  241. this._setPositionRelative();
  242. }
  243. if (helper[0] !== this.element[0] && !/(fixed|absolute)/.test(helper.css("position"))) {
  244. helper.css("position", "absolute");
  245. }
  246. return helper;
  247. },
  248. _setPositionRelative: function() {
  249. if (!/^(?:r|a|f)/.test(this.element.css("position"))) {
  250. this.element[0].style.position = "relative";
  251. }
  252. },
  253. _adjustOffsetFromHelper: function(obj) {
  254. if (typeof obj === "string") {
  255. obj = obj.split(" ");
  256. }
  257. if (Array.isArray(obj)) {
  258. obj = { left: +obj[0], top: +obj[1] || 0 };
  259. }
  260. if ("left" in obj) {
  261. this.offset.click.left = obj.left + this.margins.left;
  262. }
  263. if ("right" in obj) {
  264. this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
  265. }
  266. if ("top" in obj) {
  267. this.offset.click.top = obj.top + this.margins.top;
  268. }
  269. if ("bottom" in obj) {
  270. this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
  271. }
  272. },
  273. _isRootNode: function(element) {
  274. return /(html|body)/i.test(element.tagName) || element === this.document[0];
  275. },
  276. _getParentOffset: function() {
  277. var po = this.offsetParent.offset(), document = this.document[0];
  278. if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
  279. po.left += this.scrollParent.scrollLeft();
  280. po.top += this.scrollParent.scrollTop();
  281. }
  282. if (this._isRootNode(this.offsetParent[0])) {
  283. po = { top: 0, left: 0 };
  284. }
  285. return {
  286. top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0),
  287. left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0)
  288. };
  289. },
  290. _getRelativeOffset: function() {
  291. if (this.cssPosition !== "relative") {
  292. return { top: 0, left: 0 };
  293. }
  294. var p = this.element.position(), scrollIsRootNode = this._isRootNode(this.scrollParent[0]);
  295. return {
  296. top: p.top - (parseInt(this.helper.css("top"), 10) || 0) + (!scrollIsRootNode ? this.scrollParent.scrollTop() : 0),
  297. left: p.left - (parseInt(this.helper.css("left"), 10) || 0) + (!scrollIsRootNode ? this.scrollParent.scrollLeft() : 0)
  298. };
  299. },
  300. _cacheMargins: function() {
  301. this.margins = {
  302. left: parseInt(this.element.css("marginLeft"), 10) || 0,
  303. top: parseInt(this.element.css("marginTop"), 10) || 0,
  304. right: parseInt(this.element.css("marginRight"), 10) || 0,
  305. bottom: parseInt(this.element.css("marginBottom"), 10) || 0
  306. };
  307. },
  308. _cacheHelperProportions: function() {
  309. this.helperProportions = {
  310. width: this.helper.outerWidth(),
  311. height: this.helper.outerHeight()
  312. };
  313. },
  314. _setContainment: function() {
  315. var isUserScrollable, c, ce, o = this.options, document = this.document[0];
  316. this.relativeContainer = null;
  317. if (!o.containment) {
  318. this.containment = null;
  319. return;
  320. }
  321. if (o.containment === "window") {
  322. this.containment = [
  323. $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
  324. $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
  325. $(window).scrollLeft() + $(window).width() - this.helperProportions.width - this.margins.left,
  326. $(window).scrollTop() + ($(window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
  327. ];
  328. return;
  329. }
  330. if (o.containment === "document") {
  331. this.containment = [
  332. 0,
  333. 0,
  334. $(document).width() - this.helperProportions.width - this.margins.left,
  335. ($(document).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
  336. ];
  337. return;
  338. }
  339. if (o.containment.constructor === Array) {
  340. this.containment = o.containment;
  341. return;
  342. }
  343. if (o.containment === "parent") {
  344. o.containment = this.helper[0].parentNode;
  345. }
  346. c = $(o.containment);
  347. ce = c[0];
  348. if (!ce) {
  349. return;
  350. }
  351. isUserScrollable = /(scroll|auto)/.test(c.css("overflow"));
  352. this.containment = [
  353. (parseInt(c.css("borderLeftWidth"), 10) || 0) + (parseInt(c.css("paddingLeft"), 10) || 0),
  354. (parseInt(c.css("borderTopWidth"), 10) || 0) + (parseInt(c.css("paddingTop"), 10) || 0),
  355. (isUserScrollable ? Math.max(ce.scrollWidth, ce.offsetWidth) : ce.offsetWidth) - (parseInt(c.css("borderRightWidth"), 10) || 0) - (parseInt(c.css("paddingRight"), 10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
  356. (isUserScrollable ? Math.max(ce.scrollHeight, ce.offsetHeight) : ce.offsetHeight) - (parseInt(c.css("borderBottomWidth"), 10) || 0) - (parseInt(c.css("paddingBottom"), 10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom
  357. ];
  358. this.relativeContainer = c;
  359. },
  360. _convertPositionTo: function(d, pos) {
  361. if (!pos) {
  362. pos = this.position;
  363. }
  364. var mod = d === "absolute" ? 1 : -1, scrollIsRootNode = this._isRootNode(this.scrollParent[0]);
  365. return {
  366. top: (
  367. // The absolute mouse position
  368. pos.top + // Only for relative positioned nodes: Relative offset from element to offset parent
  369. this.offset.relative.top * mod + // The offsetParent's offset without borders (offset + border)
  370. this.offset.parent.top * mod - (this.cssPosition === "fixed" ? -this.offset.scroll.top : scrollIsRootNode ? 0 : this.offset.scroll.top) * mod
  371. ),
  372. left: (
  373. // The absolute mouse position
  374. pos.left + // Only for relative positioned nodes: Relative offset from element to offset parent
  375. this.offset.relative.left * mod + // The offsetParent's offset without borders (offset + border)
  376. this.offset.parent.left * mod - (this.cssPosition === "fixed" ? -this.offset.scroll.left : scrollIsRootNode ? 0 : this.offset.scroll.left) * mod
  377. )
  378. };
  379. },
  380. _generatePosition: function(event, constrainPosition) {
  381. var containment, co, top, left, o = this.options, scrollIsRootNode = this._isRootNode(this.scrollParent[0]), pageX = event.pageX, pageY = event.pageY;
  382. if (!scrollIsRootNode || !this.offset.scroll) {
  383. this.offset.scroll = {
  384. top: this.scrollParent.scrollTop(),
  385. left: this.scrollParent.scrollLeft()
  386. };
  387. }
  388. if (constrainPosition) {
  389. if (this.containment) {
  390. if (this.relativeContainer) {
  391. co = this.relativeContainer.offset();
  392. containment = [
  393. this.containment[0] + co.left,
  394. this.containment[1] + co.top,
  395. this.containment[2] + co.left,
  396. this.containment[3] + co.top
  397. ];
  398. } else {
  399. containment = this.containment;
  400. }
  401. if (event.pageX - this.offset.click.left < containment[0]) {
  402. pageX = containment[0] + this.offset.click.left;
  403. }
  404. if (event.pageY - this.offset.click.top < containment[1]) {
  405. pageY = containment[1] + this.offset.click.top;
  406. }
  407. if (event.pageX - this.offset.click.left > containment[2]) {
  408. pageX = containment[2] + this.offset.click.left;
  409. }
  410. if (event.pageY - this.offset.click.top > containment[3]) {
  411. pageY = containment[3] + this.offset.click.top;
  412. }
  413. }
  414. if (o.grid) {
  415. top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
  416. pageY = containment ? top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3] ? top : top - this.offset.click.top >= containment[1] ? top - o.grid[1] : top + o.grid[1] : top;
  417. left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
  418. pageX = containment ? left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2] ? left : left - this.offset.click.left >= containment[0] ? left - o.grid[0] : left + o.grid[0] : left;
  419. }
  420. if (o.axis === "y") {
  421. pageX = this.originalPageX;
  422. }
  423. if (o.axis === "x") {
  424. pageY = this.originalPageY;
  425. }
  426. }
  427. return {
  428. top: (
  429. // The absolute mouse position
  430. pageY - // Click offset (relative to the element)
  431. this.offset.click.top - // Only for relative positioned nodes: Relative offset from element to offset parent
  432. this.offset.relative.top - // The offsetParent's offset without borders (offset + border)
  433. this.offset.parent.top + (this.cssPosition === "fixed" ? -this.offset.scroll.top : scrollIsRootNode ? 0 : this.offset.scroll.top)
  434. ),
  435. left: (
  436. // The absolute mouse position
  437. pageX - // Click offset (relative to the element)
  438. this.offset.click.left - // Only for relative positioned nodes: Relative offset from element to offset parent
  439. this.offset.relative.left - // The offsetParent's offset without borders (offset + border)
  440. this.offset.parent.left + (this.cssPosition === "fixed" ? -this.offset.scroll.left : scrollIsRootNode ? 0 : this.offset.scroll.left)
  441. )
  442. };
  443. },
  444. _clear: function() {
  445. this._removeClass(this.helper, "ui-draggable-dragging");
  446. if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {
  447. this.helper.remove();
  448. }
  449. this.helper = null;
  450. this.cancelHelperRemoval = false;
  451. if (this.destroyOnClear) {
  452. this.destroy();
  453. }
  454. },
  455. // From now on bulk stuff - mainly helpers
  456. _trigger: function(type, event, ui) {
  457. ui = ui || this._uiHash();
  458. $.ui.plugin.call(this, type, [event, ui, this], true);
  459. if (/^(drag|start|stop)/.test(type)) {
  460. this.positionAbs = this._convertPositionTo("absolute");
  461. ui.offset = this.positionAbs;
  462. }
  463. return $.Widget.prototype._trigger.call(this, type, event, ui);
  464. },
  465. plugins: {},
  466. _uiHash: function() {
  467. return {
  468. helper: this.helper,
  469. position: this.position,
  470. originalPosition: this.originalPosition,
  471. offset: this.positionAbs
  472. };
  473. }
  474. });
  475. $.ui.plugin.add("draggable", "connectToSortable", {
  476. start: function(event, ui, draggable) {
  477. var uiSortable = $.extend({}, ui, {
  478. item: draggable.element
  479. });
  480. draggable.sortables = [];
  481. $(draggable.options.connectToSortable).each(function() {
  482. var sortable = $(this).sortable("instance");
  483. if (sortable && !sortable.options.disabled) {
  484. draggable.sortables.push(sortable);
  485. sortable.refreshPositions();
  486. sortable._trigger("activate", event, uiSortable);
  487. }
  488. });
  489. },
  490. stop: function(event, ui, draggable) {
  491. var uiSortable = $.extend({}, ui, {
  492. item: draggable.element
  493. });
  494. draggable.cancelHelperRemoval = false;
  495. $.each(draggable.sortables, function() {
  496. var sortable = this;
  497. if (sortable.isOver) {
  498. sortable.isOver = 0;
  499. draggable.cancelHelperRemoval = true;
  500. sortable.cancelHelperRemoval = false;
  501. sortable._storedCSS = {
  502. position: sortable.placeholder.css("position"),
  503. top: sortable.placeholder.css("top"),
  504. left: sortable.placeholder.css("left")
  505. };
  506. sortable._mouseStop(event);
  507. sortable.options.helper = sortable.options._helper;
  508. } else {
  509. sortable.cancelHelperRemoval = true;
  510. sortable._trigger("deactivate", event, uiSortable);
  511. }
  512. });
  513. },
  514. drag: function(event, ui, draggable) {
  515. $.each(draggable.sortables, function() {
  516. var innermostIntersecting = false, sortable = this;
  517. sortable.positionAbs = draggable.positionAbs;
  518. sortable.helperProportions = draggable.helperProportions;
  519. sortable.offset.click = draggable.offset.click;
  520. if (sortable._intersectsWith(sortable.containerCache)) {
  521. innermostIntersecting = true;
  522. $.each(draggable.sortables, function() {
  523. this.positionAbs = draggable.positionAbs;
  524. this.helperProportions = draggable.helperProportions;
  525. this.offset.click = draggable.offset.click;
  526. if (this !== sortable && this._intersectsWith(this.containerCache) && $.contains(sortable.element[0], this.element[0])) {
  527. innermostIntersecting = false;
  528. }
  529. return innermostIntersecting;
  530. });
  531. }
  532. if (innermostIntersecting) {
  533. if (!sortable.isOver) {
  534. sortable.isOver = 1;
  535. draggable._parent = ui.helper.parent();
  536. sortable.currentItem = ui.helper.appendTo(sortable.element).data("ui-sortable-item", true);
  537. sortable.options._helper = sortable.options.helper;
  538. sortable.options.helper = function() {
  539. return ui.helper[0];
  540. };
  541. event.target = sortable.currentItem[0];
  542. sortable._mouseCapture(event, true);
  543. sortable._mouseStart(event, true, true);
  544. sortable.offset.click.top = draggable.offset.click.top;
  545. sortable.offset.click.left = draggable.offset.click.left;
  546. sortable.offset.parent.left -= draggable.offset.parent.left - sortable.offset.parent.left;
  547. sortable.offset.parent.top -= draggable.offset.parent.top - sortable.offset.parent.top;
  548. draggable._trigger("toSortable", event);
  549. draggable.dropped = sortable.element;
  550. $.each(draggable.sortables, function() {
  551. this.refreshPositions();
  552. });
  553. draggable.currentItem = draggable.element;
  554. sortable.fromOutside = draggable;
  555. }
  556. if (sortable.currentItem) {
  557. sortable._mouseDrag(event);
  558. ui.position = sortable.position;
  559. }
  560. } else {
  561. if (sortable.isOver) {
  562. sortable.isOver = 0;
  563. sortable.cancelHelperRemoval = true;
  564. sortable.options._revert = sortable.options.revert;
  565. sortable.options.revert = false;
  566. sortable._trigger("out", event, sortable._uiHash(sortable));
  567. sortable._mouseStop(event, true);
  568. sortable.options.revert = sortable.options._revert;
  569. sortable.options.helper = sortable.options._helper;
  570. if (sortable.placeholder) {
  571. sortable.placeholder.remove();
  572. }
  573. ui.helper.appendTo(draggable._parent);
  574. draggable._refreshOffsets(event);
  575. ui.position = draggable._generatePosition(event, true);
  576. draggable._trigger("fromSortable", event);
  577. draggable.dropped = false;
  578. $.each(draggable.sortables, function() {
  579. this.refreshPositions();
  580. });
  581. }
  582. }
  583. });
  584. }
  585. });
  586. $.ui.plugin.add("draggable", "cursor", {
  587. start: function(event, ui, instance) {
  588. var t = $("body"), o = instance.options;
  589. if (t.css("cursor")) {
  590. o._cursor = t.css("cursor");
  591. }
  592. t.css("cursor", o.cursor);
  593. },
  594. stop: function(event, ui, instance) {
  595. var o = instance.options;
  596. if (o._cursor) {
  597. $("body").css("cursor", o._cursor);
  598. }
  599. }
  600. });
  601. $.ui.plugin.add("draggable", "opacity", {
  602. start: function(event, ui, instance) {
  603. var t = $(ui.helper), o = instance.options;
  604. if (t.css("opacity")) {
  605. o._opacity = t.css("opacity");
  606. }
  607. t.css("opacity", o.opacity);
  608. },
  609. stop: function(event, ui, instance) {
  610. var o = instance.options;
  611. if (o._opacity) {
  612. $(ui.helper).css("opacity", o._opacity);
  613. }
  614. }
  615. });
  616. $.ui.plugin.add("draggable", "scroll", {
  617. start: function(event, ui, i) {
  618. if (!i.scrollParentNotHidden) {
  619. i.scrollParentNotHidden = i.helper.scrollParent(false);
  620. }
  621. if (i.scrollParentNotHidden[0] !== i.document[0] && i.scrollParentNotHidden[0].tagName !== "HTML") {
  622. i.overflowOffset = i.scrollParentNotHidden.offset();
  623. }
  624. },
  625. drag: function(event, ui, i) {
  626. var o = i.options, scrolled = false, scrollParent = i.scrollParentNotHidden[0], document = i.document[0];
  627. if (scrollParent !== document && scrollParent.tagName !== "HTML") {
  628. if (!o.axis || o.axis !== "x") {
  629. if (i.overflowOffset.top + scrollParent.offsetHeight - event.pageY < o.scrollSensitivity) {
  630. scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
  631. } else if (event.pageY - i.overflowOffset.top < o.scrollSensitivity) {
  632. scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
  633. }
  634. }
  635. if (!o.axis || o.axis !== "y") {
  636. if (i.overflowOffset.left + scrollParent.offsetWidth - event.pageX < o.scrollSensitivity) {
  637. scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
  638. } else if (event.pageX - i.overflowOffset.left < o.scrollSensitivity) {
  639. scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
  640. }
  641. }
  642. } else {
  643. if (!o.axis || o.axis !== "x") {
  644. if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {
  645. scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
  646. } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {
  647. scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
  648. }
  649. }
  650. if (!o.axis || o.axis !== "y") {
  651. if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {
  652. scrolled = $(document).scrollLeft(
  653. $(document).scrollLeft() - o.scrollSpeed
  654. );
  655. } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {
  656. scrolled = $(document).scrollLeft(
  657. $(document).scrollLeft() + o.scrollSpeed
  658. );
  659. }
  660. }
  661. }
  662. if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {
  663. $.ui.ddmanager.prepareOffsets(i, event);
  664. }
  665. }
  666. });
  667. $.ui.plugin.add("draggable", "snap", {
  668. start: function(event, ui, i) {
  669. var o = i.options;
  670. i.snapElements = [];
  671. $(o.snap.constructor !== String ? o.snap.items || ":data(ui-draggable)" : o.snap).each(function() {
  672. var $t = $(this), $o = $t.offset();
  673. if (this !== i.element[0]) {
  674. i.snapElements.push({
  675. item: this,
  676. width: $t.outerWidth(),
  677. height: $t.outerHeight(),
  678. top: $o.top,
  679. left: $o.left
  680. });
  681. }
  682. });
  683. },
  684. drag: function(event, ui, inst) {
  685. var ts, bs, ls, rs, l, r, t, b, i, first, o = inst.options, d = o.snapTolerance, x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
  686. for (i = inst.snapElements.length - 1; i >= 0; i--) {
  687. l = inst.snapElements[i].left - inst.margins.left;
  688. r = l + inst.snapElements[i].width;
  689. t = inst.snapElements[i].top - inst.margins.top;
  690. b = t + inst.snapElements[i].height;
  691. if (x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains(
  692. inst.snapElements[i].item.ownerDocument,
  693. inst.snapElements[i].item
  694. )) {
  695. if (inst.snapElements[i].snapping) {
  696. if (inst.options.snap.release) {
  697. inst.options.snap.release.call(
  698. inst.element,
  699. event,
  700. $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })
  701. );
  702. }
  703. }
  704. inst.snapElements[i].snapping = false;
  705. continue;
  706. }
  707. if (o.snapMode !== "inner") {
  708. ts = Math.abs(t - y2) <= d;
  709. bs = Math.abs(b - y1) <= d;
  710. ls = Math.abs(l - x2) <= d;
  711. rs = Math.abs(r - x1) <= d;
  712. if (ts) {
  713. ui.position.top = inst._convertPositionTo("relative", {
  714. top: t - inst.helperProportions.height,
  715. left: 0
  716. }).top;
  717. }
  718. if (bs) {
  719. ui.position.top = inst._convertPositionTo("relative", {
  720. top: b,
  721. left: 0
  722. }).top;
  723. }
  724. if (ls) {
  725. ui.position.left = inst._convertPositionTo("relative", {
  726. top: 0,
  727. left: l - inst.helperProportions.width
  728. }).left;
  729. }
  730. if (rs) {
  731. ui.position.left = inst._convertPositionTo("relative", {
  732. top: 0,
  733. left: r
  734. }).left;
  735. }
  736. }
  737. first = ts || bs || ls || rs;
  738. if (o.snapMode !== "outer") {
  739. ts = Math.abs(t - y1) <= d;
  740. bs = Math.abs(b - y2) <= d;
  741. ls = Math.abs(l - x1) <= d;
  742. rs = Math.abs(r - x2) <= d;
  743. if (ts) {
  744. ui.position.top = inst._convertPositionTo("relative", {
  745. top: t,
  746. left: 0
  747. }).top;
  748. }
  749. if (bs) {
  750. ui.position.top = inst._convertPositionTo("relative", {
  751. top: b - inst.helperProportions.height,
  752. left: 0
  753. }).top;
  754. }
  755. if (ls) {
  756. ui.position.left = inst._convertPositionTo("relative", {
  757. top: 0,
  758. left: l
  759. }).left;
  760. }
  761. if (rs) {
  762. ui.position.left = inst._convertPositionTo("relative", {
  763. top: 0,
  764. left: r - inst.helperProportions.width
  765. }).left;
  766. }
  767. }
  768. if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {
  769. if (inst.options.snap.snap) {
  770. inst.options.snap.snap.call(
  771. inst.element,
  772. event,
  773. $.extend(inst._uiHash(), {
  774. snapItem: inst.snapElements[i].item
  775. })
  776. );
  777. }
  778. }
  779. inst.snapElements[i].snapping = ts || bs || ls || rs || first;
  780. }
  781. }
  782. });
  783. $.ui.plugin.add("draggable", "stack", {
  784. start: function(event, ui, instance) {
  785. var min, o = instance.options, group = $.makeArray($(o.stack)).sort(function(a, b) {
  786. return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0);
  787. });
  788. if (!group.length) {
  789. return;
  790. }
  791. min = parseInt($(group[0]).css("zIndex"), 10) || 0;
  792. $(group).each(function(i) {
  793. $(this).css("zIndex", min + i);
  794. });
  795. this.css("zIndex", min + group.length);
  796. }
  797. });
  798. $.ui.plugin.add("draggable", "zIndex", {
  799. start: function(event, ui, instance) {
  800. var t = $(ui.helper), o = instance.options;
  801. if (t.css("zIndex")) {
  802. o._zIndex = t.css("zIndex");
  803. }
  804. t.css("zIndex", o.zIndex);
  805. },
  806. stop: function(event, ui, instance) {
  807. var o = instance.options;
  808. if (o._zIndex) {
  809. $(ui.helper).css("zIndex", o._zIndex);
  810. }
  811. }
  812. });
  813. return $.ui.draggable;
  814. });
  815. /*! Bundled license information:
  816. jquery-ui/ui/widgets/draggable.js:
  817. (*!
  818. * jQuery UI Draggable 1.14.1
  819. * https://jqueryui.com
  820. *
  821. * Copyright OpenJS Foundation and other contributors
  822. * Released under the MIT license.
  823. * https://jquery.org/license
  824. *)
  825. */
  826. //# sourceMappingURL=jquery-ui_ui_widgets_draggable__js.js.map