forked from marceljuenemann/angular-drag-and-drop-lists
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathangular-drag-and-drop-lists.min.js
1 lines (1 loc) · 5.78 KB
/
angular-drag-and-drop-lists.min.js
1
angular.module("dndLists",[]).directive("dndDraggable",["$parse","$timeout","dndDropEffectWorkaround","dndDragTypeWorkaround",function(e,r,n,t){return function(a,d,o){d.attr("draggable","true"),o.dndDisableIf&&a.$watch(o.dndDisableIf,function(e){d.attr("draggable",!e)}),d.on("dragstart",function(i){i=i.originalEvent||i,i.dataTransfer.setData("Text",angular.toJson(a.$eval(o.dndDraggable))),i.dataTransfer.effectAllowed=o.dndEffectAllowed||"move",d.addClass("dndDragging"),r(function(){d.addClass("dndDraggingSource")},0),n.dropEffect="none",t.isDragging=!0,t.dragType=o.dndType?a.$eval(o.dndType):void 0,e(o.dndDragstart)(a,{event:i}),i.stopPropagation()}),d.on("dragend",function(i){i=i.originalEvent||i;var f=n.dropEffect;a.$apply(function(){switch(f){case"move":e(o.dndMoved)(a,{event:i});break;case"copy":e(o.dndCopied)(a,{event:i});break;case"none":e(o.dndCanceled)(a,{event:i})}e(o.dndDragend)(a,{event:i,dropEffect:f})}),d.removeClass("dndDragging"),r(function(){d.removeClass("dndDraggingSource")},0),t.isDragging=!1,i.stopPropagation()}),d.on("click",function(r){o.dndSelected&&(r=r.originalEvent||r,a.$apply(function(){e(o.dndSelected)(a,{event:r})}),r.stopPropagation())}),d.on("selectstart",function(){this.dragDrop&&this.dragDrop()})}}]).directive("dndList",["$parse","$timeout","dndDropEffectWorkaround","dndDragTypeWorkaround",function(e,r,n,t){return function(a,d,o){function i(e,r,n){var t=y?e.offsetX||e.layerX:e.offsetY||e.layerY,a=y?r.offsetWidth:r.offsetHeight,d=y?r.offsetLeft:r.offsetTop;return d=n?d:0,d+a/2>t}function f(){var e;return angular.forEach(d.children(),function(r){var n=angular.element(r);n.hasClass("dndPlaceholder")&&(e=n)}),e||angular.element("<li class='dndPlaceholder'></li>")}function l(){return Array.prototype.indexOf.call(D.children,v)}function g(e){if(!t.isDragging&&!E)return!1;if(!p(e.dataTransfer.types))return!1;if(o.dndAllowedTypes&&t.isDragging){var r=a.$eval(o.dndAllowedTypes);if(angular.isArray(r)&&-1===r.indexOf(t.dragType))return!1}return o.dndDisableIf&&a.$eval(o.dndDisableIf)?!1:!0}function s(){return c.remove(),d.removeClass("dndDragover"),!0}function u(r,n,d,o){return e(r)(a,{event:n,index:d,item:o||void 0,external:!t.isDragging,type:t.isDragging?t.dragType:void 0})}function p(e){if(!e)return!0;for(var r=0;r<e.length;r++)if("Text"===e[r]||"text/plain"===e[r])return!0;return!1}var c=f(),v=c[0],D=d[0];c.remove();var y=o.dndHorizontalList&&a.$eval(o.dndHorizontalList),E=o.dndExternalSources&&a.$eval(o.dndExternalSources);d.on("dragover",function(e){if(e=e.originalEvent||e,!g(e))return!0;if(v.parentNode!=D&&d.append(c),e.target!==D){for(var r=e.target;r.parentNode!==D&&r.parentNode;)r=r.parentNode;r.parentNode===D&&r!==v&&(i(e,r)?D.insertBefore(v,r):D.insertBefore(v,r.nextSibling))}else if(i(e,v,!0))for(;v.previousElementSibling&&(i(e,v.previousElementSibling,!0)||0===v.previousElementSibling.offsetHeight);)D.insertBefore(v,v.previousElementSibling);else for(;v.nextElementSibling&&!i(e,v.nextElementSibling,!0);)D.insertBefore(v,v.nextElementSibling.nextElementSibling);return o.dndDragover&&!u(o.dndDragover,e,l())?s():(d.addClass("dndDragover"),e.preventDefault(),e.stopPropagation(),!1)}),d.on("drop",function(e){if(e=e.originalEvent||e,!g(e))return!0;e.preventDefault();var r,t=e.dataTransfer.getData("Text")||e.dataTransfer.getData("text/plain");try{r=JSON.parse(t)}catch(d){return s()}var i=l();if(o.dndDrop&&(r=u(o.dndDrop,e,i,r),!r))return s();var f=a.$eval(o.dndList);return a.$apply(function(){f.splice(i,0,r)}),u(o.dndInserted,e,i,r),"none"===e.dataTransfer.dropEffect?"copy"===e.dataTransfer.effectAllowed||"move"===e.dataTransfer.effectAllowed?n.dropEffect=e.dataTransfer.effectAllowed:n.dropEffect=e.ctrlKey?"copy":"move":n.dropEffect=e.dataTransfer.dropEffect,s(),e.stopPropagation(),!1}),d.on("dragleave",function(e){e=e.originalEvent||e,d.removeClass("dndDragover"),r(function(){d.hasClass("dndDragover")||c.remove()},100)})}}]).directive("dropArea",["$parse","dndDropEffectWorkaround","dndDragTypeWorkaround",function(e,r,n){return function(t,a,d){function o(e){if(!n.isDragging&&!g)return!1;if(!l(e.dataTransfer.types))return!1;if(d.dndAllowedTypes&&n.isDragging){var r=t.$eval(d.dndAllowedTypes);if(angular.isArray(r)&&-1===r.indexOf(n.dragType))return!1}return d.dndDisableIf&&t.$eval(d.dndDisableIf)?!1:!0}function i(){return a.removeClass("dndAreaDragOver"),!0}function f(r,a,d){return e(r)(t,{event:a,item:d||void 0,external:!n.isDragging,type:n.isDragging?n.dragType:void 0})}function l(e){if(!e)return!0;for(var r=0;r<e.length;r++)if("Text"===e[r]||"text/plain"===e[r])return!0;return!1}var g=d.dndExternalSources&&t.$eval(d.dndExternalSources);a.on("dragover",function(e){return e=e.originalEvent||e,o(e)?d.dndDragover&&!f(d.dndDragover,e)?i():(a.addClass("dndAreaDragOver"),e.preventDefault(),e.stopPropagation(),!1):!0}),a.on("drop",function(e){if(e=e.originalEvent||e,!o(e))return!0;e.preventDefault();var n,a=e.dataTransfer.getData("Text")||e.dataTransfer.getData("text/plain");try{n=JSON.parse(a)}catch(l){return i()}if(d.dndDrop&&(n=f(d.dndDrop,e,n),!n))return i();var g=t.$eval(d.dropArea);return t.$apply(function(){g.push(n)}),f(d.dndInserted,e,n),"none"===e.dataTransfer.dropEffect?"copy"===e.dataTransfer.effectAllowed||"move"===e.dataTransfer.effectAllowed?r.dropEffect=e.dataTransfer.effectAllowed:r.dropEffect=e.ctrlKey?"copy":"move":r.dropEffect=e.dataTransfer.dropEffect,i(),e.stopPropagation(),!1}),a.on("dragleave",function(e){e=e.originalEvent||e,a.removeClass("dndAreaDragOver")})}}]).directive("dndNodrag",function(){return function(e,r,n){r.attr("draggable","true"),r.on("dragstart",function(e){e=e.originalEvent||e,e.dataTransfer.types&&e.dataTransfer.types.length||e.preventDefault(),e.stopPropagation()}),r.on("dragend",function(e){e=e.originalEvent||e,e.stopPropagation()})}}).factory("dndDragTypeWorkaround",function(){return{}}).factory("dndDropEffectWorkaround",function(){return{}});