forked from marceljuenemann/angular-drag-and-drop-lists
-
Notifications
You must be signed in to change notification settings - Fork 0
/
angular-drag-and-drop-lists.min.js
54 lines (54 loc) · 5.63 KB
/
angular-drag-and-drop-lists.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* angular-drag-and-drop-lists v2.1.0-mysw.4
*
* Copyright (c) 2014 Marcel Juenemann [email protected]
* Copyright (c) 2014-2017 Google Inc.
* https://github.com/marceljuenemann/angular-drag-and-drop-lists
*
* License: MIT
*/
!function(e){function n(e,n){return"all"==n?e:e.filter(function(e){return-1!=n.toLowerCase().indexOf(e)})}var a="application/x-dnd",r="application/json",t="Text",d=["move","copy","link"]
e.directive("dndDraggable",["$parse","$timeout",function(e,i){return function(l,f,s){f.attr("draggable","true"),s.dndDisableIf&&l.$watch(s.dndDisableIf,function(e){f.attr("draggable",!e)}),f.on("dragstart",function(c){if(c=c.originalEvent||c,"false"==f.attr("draggable"))return!0
o.isDragging=!0,o.itemType=s.dndType&&l.$eval(s.dndType).toLowerCase(),o.dropEffect="none",o.effectAllowed=s.dndEffectAllowed||d[0],c.dataTransfer.effectAllowed=o.effectAllowed
var g=l.$eval(s.dndDraggable),u=a+(o.itemType?"-"+o.itemType:"")
try{c.dataTransfer.setData(u,angular.toJson(g))}catch(e){var p=angular.toJson({item:g,type:o.itemType})
try{c.dataTransfer.setData(r,p)}catch(e){var v=n(d,o.effectAllowed)
c.dataTransfer.effectAllowed=v[0],c.dataTransfer.setData(t,p)}}if(f.addClass("dndDragging"),i(function(){f.addClass("dndDraggingSource")},0),c._dndHandle&&c.dataTransfer.setDragImage){var D=c.srcElement||c.target,y=angular.element(D)[0]
c.dataTransfer.setDragImage(f[0],0,0)
var h=angular.element(f)[0],T=h.offsetWidth-y.offsetWidth/2,m=y.offsetHeight/2
c.dataTransfer.setDragImage(f[0],T,m)}if(e(s.dndDragstart)(l,{event:c}),s.dndCallback){var E=e(s.dndCallback)
o.callback=function(e){return E(l,e||{})}}c.stopPropagation()}),f.on("dragend",function(n){n=n.originalEvent||n,l.$apply(function(){var a=o.dropEffect
e(s[{copy:"dndCopied",link:"dndLinked",move:"dndMoved",none:"dndCanceled"}[a]])(l,{event:n}),e(s.dndDragend)(l,{event:n,dropEffect:a})}),o.isDragging=!1,o.callback=void 0,f.removeClass("dndDragging"),f.removeClass("dndDraggingSource"),n.stopPropagation(),i(function(){f.removeClass("dndDraggingSource")},0)}),f.on("click",function(n){s.dndSelected&&(n=n.originalEvent||n,l.$apply(function(){e(s.dndSelected)(l,{event:n})}),n.stopPropagation())}),f.on("selectstart",function(){this.dragDrop&&this.dragDrop()})}}]),e.directive("dndList",["$parse",function(e){return function(i,l,f){function s(e){if(!e)return t
for(var n=0;n<e.length;n++)if(e[n]==t||e[n]==r||e[n].substr(0,a.length)==a)return e[n]
return null}function c(e){return o.isDragging?o.itemType||void 0:e==t||e==r?null:e&&e.substr(a.length+1)||void 0}function g(e){return!m.disabled&&(!(!m.externalSources&&!o.isDragging)&&(!m.allowedTypes||null===e||e&&-1!=m.allowedTypes.indexOf(e)))}function u(e,a){var r=d
return a||(r=n(r,e.dataTransfer.effectAllowed)),o.isDragging&&(r=n(r,o.effectAllowed)),f.dndEffectAllowed&&(r=n(r,f.dndEffectAllowed)),r.length?e.ctrlKey&&-1!=r.indexOf("copy")?"copy":e.altKey&&-1!=r.indexOf("link")?"link":r[0]:"none"}function p(){return y.remove(),l.removeClass("dndDragover"),!0}function v(n,a,r,t,d,l){return e(n)(i,{callback:o.callback,dropEffect:r,event:a,external:!o.isDragging,index:void 0!==d?d:D(),item:l||void 0,type:t})}function D(){for(var e=[],n=0;n<T.children.length;n++)null!==T.children[n].offsetParent&&e.push(T.children[n])
return Array.prototype.indexOf.call(e,h)}var y=function(){var e
return angular.forEach(l.children(),function(n){var a=angular.element(n)
a.hasClass("dndPlaceholder")&&(e=a)}),e||angular.element("<li class='dndPlaceholder'></li>")}()
y.remove()
var h=y[0],T=l[0],m={}
l.on("dragenter",function(e){e=e.originalEvent||e
var n=f.dndAllowedTypes&&i.$eval(f.dndAllowedTypes)
m={allowedTypes:angular.isArray(n)&&n.join("|").toLowerCase().split("|"),disabled:f.dndDisableIf&&i.$eval(f.dndDisableIf),externalSources:f.dndExternalSources&&i.$eval(f.dndExternalSources),horizontal:f.dndHorizontalList&&i.$eval(f.dndHorizontalList)}
var a=s(e.dataTransfer.types)
if(!a||!g(c(a)))return!0
e.preventDefault()}),l.on("dragover",function(e){e=e.originalEvent||e
var n=s(e.dataTransfer.types),a=c(n)
if(!n||!g(a))return!0
if(h.parentNode!=T&&l.append(y),e.target!=T){for(var r=e.target;r.parentNode!=T&&r.parentNode;)r=r.parentNode
if(r.parentNode==T&&r!=h){var d=r.getBoundingClientRect()
if(m.horizontal)var o=e.clientX<d.left+d.width/2
else var o=e.clientY<d.top+d.height/2
T.insertBefore(h,o?r:r.nextSibling)}}var i=n==t,D=u(e,i)
return"none"==D?p():f.dndDragover&&!v(f.dndDragover,e,D,a)?p():(e.preventDefault(),i||(e.dataTransfer.dropEffect=D),l.addClass("dndDragover"),e.stopPropagation(),!1)}),l.on("drop",function(e){e=e.originalEvent||e
var n=s(e.dataTransfer.types),a=c(n)
if(!n||!g(a))return!0
e.preventDefault()
try{var d=JSON.parse(e.dataTransfer.getData(n))}catch(e){return p()}if((n==t||n==r)&&(a=d.type||void 0,d=d.item,!g(a)))return p()
var l=n==t,y=u(e,l)
if("none"==y)return p()
var h=D()
return f.dndDrop&&!(d=v(f.dndDrop,e,y,a,h,d))?p():(o.dropEffect=y,l||(e.dataTransfer.dropEffect=y),!0!==d&&i.$apply(function(){i.$eval(f.dndList).splice(h,0,d)}),v(f.dndInserted,e,y,a,h,d),p(),e.stopPropagation(),!1)}),l.on("dragleave",function(e){e=e.originalEvent||e
var n=document.elementFromPoint(e.clientX,e.clientY)
T.contains(n)&&!e._dndPhShown?e._dndPhShown=!0:p()})}}]),e.directive("dndNodrag",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart",function(e){e=e.originalEvent||e,e._dndHandle||(e.dataTransfer.types&&e.dataTransfer.types.length||e.preventDefault(),e.stopPropagation())}),n.on("dragend",function(e){e=e.originalEvent||e,e._dndHandle||e.stopPropagation()})}}),e.directive("dndHandle",function(){return function(e,n,a){n.attr("draggable","true"),n.on("dragstart dragend",function(e){e=e.originalEvent||e,e._dndHandle=!0})}})
var o={}}(angular.module("dndLists",[]))