From a7057b1733424d64409c3430822b99f600ccac60 Mon Sep 17 00:00:00 2001 From: Niels Dequeker Date: Sun, 20 Dec 2015 21:49:27 +0100 Subject: [PATCH] New build --- dist/angular-ui-tree.js | 189 ++++++++++++++++++++++++------------ dist/angular-ui-tree.min.js | 4 +- 2 files changed, 127 insertions(+), 66 deletions(-) diff --git a/dist/angular-ui-tree.js b/dist/angular-ui-tree.js index 18f4e998..14513333 100644 --- a/dist/angular-ui-tree.js +++ b/dist/angular-ui-tree.js @@ -1,5 +1,5 @@ /** - * @license Angular UI Tree v2.11.0 + * @license Angular UI Tree v2.12.0 * (c) 2010-2015. https://github.com/angular-ui-tree/angular-ui-tree * License: MIT */ @@ -55,7 +55,7 @@ $scope.$treeScope = null; // uiTree scope $scope.$handleScope = null; // it's handle scope $scope.$type = 'uiTreeNode'; - $scope.$$apply = false; + $scope.$$allowNodeDrop = false; $scope.collapsed = false; $scope.init = function (controllersArr) { @@ -451,12 +451,20 @@ } }); - // check if the dest node can accept the dragging node - // by default, we check the 'data-nodrop-enabled' attribute in `ui-tree-nodes` - // and the 'max-depth' attribute in `ui-tree` or `ui-tree-nodes`. - // the method can be overrided + /** + * Callback checks if the destination node can accept the dragged node. + * By default, ui-tree will check that 'data-nodrop-enabled' is not set for the + * destination ui-tree-nodes, and that the 'max-depth' attribute will not be exceeded + * if it is set on the ui-tree or ui-tree-nodes. + * This callback can be overridden, but callers must manually enforce nodrop and max-depth + * themselves if they need those to be enforced. + * @param sourceNodeScope Scope of the ui-tree-node being dragged + * @param destNodesScope Scope of the ui-tree-nodes where the node is hovering + * @param destIndex Index in the destination nodes array where the source node will drop + * @returns {boolean} True if the node is permitted to be dropped here + */ callbacks.accept = function (sourceNodeScope, destNodesScope, destIndex) { - return !(destNodesScope.nodropEnabled || destNodesScope.outOfDepth(sourceNodeScope)); + return !(destNodesScope.nodropEnabled || destNodesScope.$treeScope.nodropEnabled || destNodesScope.outOfDepth(sourceNodeScope)); }; callbacks.beforeDrag = function (sourceNodeScope) { @@ -467,22 +475,47 @@ }; + /** + * Callback is fired when a node is successfully dropped in a new location + * @param event + */ callbacks.dropped = function (event) { }; + /** + * Callback is fired each time the user starts dragging a node + * @param event + */ callbacks.dragStart = function (event) { }; + /** + * Callback is fired each time a dragged node is moved with the mouse/touch. + * @param event + */ callbacks.dragMove = function (event) { }; + /** + * Callback is fired when the tree exits drag mode. If the user dropped a node, the drop may have been + * accepted or reverted. + * @param event + */ callbacks.dragStop = function (event) { }; + /** + * Callback is fired when a user drops a node (but prior to processing the drop action) + * beforeDrop can return a Promise, truthy, or falsy (returning nothing is falsy). + * If it returns falsy, or a resolve Promise, the node move is accepted + * If it returns truthy, or a rejected Promise, the node move is reverted + * @param event + * @returns {Boolean|Promise} Truthy (or rejected Promise) to cancel node move; falsy (or resolved promise) + */ callbacks.beforeDrop = function (event) { }; @@ -539,8 +572,8 @@ angular.module('ui.tree') - .directive('uiTreeNode', ['treeConfig', 'UiTreeHelper', '$window', '$document', '$timeout', '$rootElement', - function (treeConfig, UiTreeHelper, $window, $document, $timeout, $rootElement) { + .directive('uiTreeNode', ['treeConfig', 'UiTreeHelper', '$window', '$document', '$timeout', '$q', '$rootElement', + function (treeConfig, UiTreeHelper, $window, $document, $timeout, $q, $rootElement) { return { require: ['^uiTreeNodes', '^uiTree'], restrict: 'A', @@ -569,7 +602,9 @@ dragEndEvent, dragCancelEvent, dragDelay, - bindDrag, + bindDragStartEvents, + bindDragMoveEvents, + unbindDragMoveEvents, keydownHandler, outOfBounds; angular.extend(config, treeConfig); @@ -592,6 +627,10 @@ attrs.$set('collapsed', val); }); + /** + * Called when the user has grabbed a node and started dragging it + * @param e + */ dragStart = function (e) { if (!hasTouch && (e.button == 2 || e.which == 3)) { // disable right click @@ -601,7 +640,7 @@ return; } - // the element which is clicked. + // the node being dragged var eventElm = angular.element(e.target), eventScope = eventElm.scope(), cloneElm = element.clone(), @@ -703,18 +742,12 @@ dragging: dragElm }; + bindDragMoveEvents(); // Fire dragStart callback scope.$apply(function () { scope.$treeScope.$callbacks.dragStart(dragInfo.eventArgs(elements, pos)); }); - angular.element($document).bind('touchend', dragEndEvent); - angular.element($document).bind('touchcancel', dragEndEvent); - angular.element($document).bind('touchmove', dragMoveEvent); - angular.element($document).bind('mouseup', dragEndEvent); - angular.element($document).bind('mousemove', dragMoveEvent); - angular.element($document).bind('mouseleave', dragCancelEvent); - document_height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); document_width = Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth); }; @@ -943,47 +976,46 @@ }; dragEnd = function (e) { - + var dragEventArgs = dragInfo.eventArgs(elements, pos); e.preventDefault(); - - if (dragElm) { - scope.$treeScope.$apply(function () { - scope.$treeScope.$callbacks.beforeDrop(dragInfo.eventArgs(elements, pos)); - }); - // roll back elements changed - hiddenPlaceElm.replaceWith(element); - placeElm.remove(); - - dragElm.remove(); - dragElm = null; - if (scope.$$apply && !outOfBounds) { - scope.$treeScope.$apply(function () { - dragInfo.apply(); - scope.$treeScope.$callbacks.dropped(dragInfo.eventArgs(elements, pos)); - }); - } else { - bindDrag(); - } - scope.$treeScope.$apply(function () { - scope.$treeScope.$callbacks.dragStop(dragInfo.eventArgs(elements, pos)); - }); - scope.$$apply = false; - dragInfo = null; - } - - // Restore cursor in Opera 12.16 and IE - var oldCur = document.body.getAttribute('ui-tree-cursor'); - if (oldCur !== null) { - $document.find('body').css({'cursor': oldCur}); - document.body.removeAttribute('ui-tree-cursor'); - } - - angular.element($document).unbind('touchend', dragEndEvent); // Mobile - angular.element($document).unbind('touchcancel', dragEndEvent); // Mobile - angular.element($document).unbind('touchmove', dragMoveEvent); // Mobile - angular.element($document).unbind('mouseup', dragEndEvent); - angular.element($document).unbind('mousemove', dragMoveEvent); - angular.element($window.document.body).unbind('mouseleave', dragCancelEvent); + unbindDragMoveEvents(); + + scope.$treeScope.$apply(function () { + $q.when(scope.$treeScope.$callbacks.beforeDrop(dragEventArgs)) + // promise resolved (or callback returned truthy) + .then(function (allowDrop) { + if (allowDrop && scope.$$allowNodeDrop && !outOfBounds) { // node drop accepted) + dragInfo.apply(); + // fire the dropped callback only if the move was successful + scope.$treeScope.$callbacks.dropped(dragEventArgs); + } else { // drop canceled - revert the node to its original position + bindDragStartEvents(); + } + }) + // promise rejected - revert the node to its original position + .catch(function () { + bindDragStartEvents(); + }) + .finally(function () { + hiddenPlaceElm.replaceWith(scope.$element); + placeElm.remove(); + + if (dragElm) { // drag element is attached to the mouse pointer + dragElm.remove(); + dragElm = null; + } + scope.$treeScope.$callbacks.dragStop(dragEventArgs); + scope.$$allowNodeDrop = false; + dragInfo = null; + + // Restore cursor in Opera 12.16 and IE + var oldCur = document.body.getAttribute('ui-tree-cursor'); + if (oldCur !== null) { + $document.find('body').css({'cursor': oldCur}); + document.body.removeAttribute('ui-tree-cursor'); + } + }); + }); }; dragStartEvent = function (e) { @@ -997,7 +1029,7 @@ }; dragEndEvent = function (e) { - scope.$$apply = true; + scope.$$allowNodeDrop = true; dragEnd(e); }; @@ -1022,7 +1054,10 @@ }; })(); - bindDrag = function () { + /** + * Binds the mouse/touch events to enable drag start for this node + */ + bindDragStartEvents = function () { element.bind('touchstart mousedown', function (e) { dragDelay.exec(function () { dragStartEvent(e); @@ -1032,11 +1067,35 @@ dragDelay.cancel(); }); }; - bindDrag(); + bindDragStartEvents(); + + /** + * Binds mouse/touch events that handle moving/dropping this dragged node + */ + bindDragMoveEvents = function () { + angular.element($document).bind('touchend', dragEndEvent); + angular.element($document).bind('touchcancel', dragEndEvent); + angular.element($document).bind('touchmove', dragMoveEvent); + angular.element($document).bind('mouseup', dragEndEvent); + angular.element($document).bind('mousemove', dragMoveEvent); + angular.element($document).bind('mouseleave', dragCancelEvent); + }; + + /** + * Unbinds mouse/touch events that handle moving/dropping this dragged node + */ + unbindDragMoveEvents = function () { + angular.element($document).unbind('touchend', dragEndEvent); + angular.element($document).unbind('touchcancel', dragEndEvent); + angular.element($document).unbind('touchmove', dragMoveEvent); + angular.element($document).unbind('mouseup', dragEndEvent); + angular.element($document).unbind('mousemove', dragMoveEvent); + angular.element($document).unbind('mouseleave', dragCancelEvent); + }; keydownHandler = function (e) { if (e.keyCode == 27) { - scope.$$apply = false; + scope.$$allowNodeDrop = false; dragEnd(e); } }; @@ -1092,7 +1151,9 @@ }; } - scope.$watch(attrs.maxDepth, function (val) { + scope.$watch(function () { + return attrs.maxDepth; + }, function (val) { if ((typeof val) == 'number') { scope.maxDepth = val; } @@ -1287,7 +1348,7 @@ // cloneEnabled and cross-tree so copy and do not remove from source if (this.isClone() && this.isForeign()) { - this.parent.insertNode(this.index, angular.copy(nodeData)); + this.parent.insertNode(this.index, this.sourceInfo.cloneModel); } else { // Any other case, remove and reinsert this.source.remove(); this.parent.insertNode(this.index, nodeData); diff --git a/dist/angular-ui-tree.min.js b/dist/angular-ui-tree.min.js index ade7115e..43155e8a 100644 --- a/dist/angular-ui-tree.min.js +++ b/dist/angular-ui-tree.min.js @@ -1,6 +1,6 @@ /** - * @license Angular UI Tree v2.11.0 + * @license Angular UI Tree v2.12.0 * (c) 2010-2015. https://github.com/angular-ui-tree/angular-ui-tree * License: MIT */ -!function(){"use strict";angular.module("ui.tree",[]).constant("treeConfig",{treeClass:"angular-ui-tree",emptyTreeClass:"angular-ui-tree-empty",hiddenClass:"angular-ui-tree-hidden",nodesClass:"angular-ui-tree-nodes",nodeClass:"angular-ui-tree-node",handleClass:"angular-ui-tree-handle",placeholderClass:"angular-ui-tree-placeholder",dragClass:"angular-ui-tree-drag",dragThreshold:3,levelThreshold:30})}(),function(){"use strict";angular.module("ui.tree").controller("TreeHandleController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodeScope=null,e.$type="uiTreeHandle"}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodeController",["$scope","$element",function(e,n){function t(e){var n,o,l,r=0,i=e.childNodes();if(!i||0===i.length)return 0;for(l=i.length-1;l>=0;l--)n=i[l],o=1+t(n),r=Math.max(r,o);return r}this.scope=e,e.$element=n,e.$modelValue=null,e.$parentNodeScope=null,e.$childNodesScope=null,e.$parentNodesScope=null,e.$treeScope=null,e.$handleScope=null,e.$type="uiTreeNode",e.$$apply=!1,e.collapsed=!1,e.init=function(t){var o=t[0];e.$treeScope=t[1]?t[1].scope:null,e.$parentNodeScope=o.scope.$nodeScope,e.$modelValue=o.scope.$modelValue[e.$index],e.$parentNodesScope=o.scope,o.scope.initSubNode(e),n.on("$destroy",function(){o.scope.destroySubNode(e)})},e.index=function(){return e.$parentNodesScope.$modelValue.indexOf(e.$modelValue)},e.dragEnabled=function(){return!(e.$treeScope&&!e.$treeScope.dragEnabled)},e.isSibling=function(n){return e.$parentNodesScope==n.$parentNodesScope},e.isChild=function(n){var t=e.childNodes();return t&&t.indexOf(n)>-1},e.prev=function(){var n=e.index();return n>0?e.siblings()[n-1]:null},e.siblings=function(){return e.$parentNodesScope.childNodes()},e.childNodesCount=function(){return e.childNodes()?e.childNodes().length:0},e.hasChild=function(){return e.childNodesCount()>0},e.childNodes=function(){return e.$childNodesScope&&e.$childNodesScope.$modelValue?e.$childNodesScope.childNodes():null},e.accept=function(n,t){return e.$childNodesScope&&e.$childNodesScope.$modelValue&&e.$childNodesScope.accept(n,t)},e.removeNode=function(){var n=e.remove();return e.$callbacks.removed(n),n},e.remove=function(){return e.$parentNodesScope.removeNode(e)},e.toggle=function(){e.collapsed=!e.collapsed},e.collapse=function(){e.collapsed=!0},e.expand=function(){e.collapsed=!1},e.depth=function(){var n=e.$parentNodeScope;return n?n.depth()+1:1},e.maxSubDepth=function(){return e.$childNodesScope?t(e.$childNodesScope):0}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodesController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$modelValue=null,e.$nodeScope=null,e.$treeScope=null,e.$type="uiTreeNodes",e.$nodesMap={},e.nodropEnabled=!1,e.maxDepth=0,e.cloneEnabled=!1,e.initSubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=n):null},e.destroySubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=null):null},e.accept=function(n,t){return e.$treeScope.$callbacks.accept(n,e,t)},e.beforeDrag=function(n){return e.$treeScope.$callbacks.beforeDrag(n)},e.isParent=function(n){return n.$parentNodesScope==e},e.hasChild=function(){return e.$modelValue.length>0},e.safeApply=function(e){var n=this.$root.$$phase;"$apply"==n||"$digest"==n?e&&"function"==typeof e&&e():this.$apply(e)},e.removeNode=function(n){var t=e.$modelValue.indexOf(n.$modelValue);return t>-1?(e.safeApply(function(){e.$modelValue.splice(t,1)[0]}),n):null},e.insertNode=function(n,t){e.safeApply(function(){e.$modelValue.splice(n,0,t)})},e.childNodes=function(){var n,t=[];if(e.$modelValue)for(n=0;n0?e.depth()+n.maxSubDepth()+1>t:!1}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodesScope=null,e.$type="uiTree",e.$emptyElm=null,e.$callbacks=null,e.dragEnabled=!0,e.emptyPlaceholderEnabled=!0,e.maxDepth=0,e.dragDelay=0,e.cloneEnabled=!1,e.nodropEnabled=!1,e.isEmpty=function(){return e.$nodesScope&&e.$nodesScope.$modelValue&&0===e.$nodesScope.$modelValue.length},e.place=function(n){e.$nodesScope.$element.append(n),e.$emptyElm.remove()},this.resetEmptyElement=function(){e.$nodesScope.$modelValue&&0!==e.$nodesScope.$modelValue.length||!e.emptyPlaceholderEnabled?e.$emptyElm.remove():n.append(e.$emptyElm)},e.resetEmptyElement=this.resetEmptyElement;var t=function(e,n){var o,l,r=e.childNodes();for(o=0;o0?angular.element(a).children().length:1e6,i=angular.element(n.document.createElement("td")).attr("colspan",d),t.$emptyElm.append(i)):t.$emptyElm=angular.element(n.document.createElement("div")),s.emptyTreeClass&&t.$emptyElm.addClass(s.emptyTreeClass),t.$watch("$nodesScope.$modelValue.length",function(e){angular.isNumber(e)&&r.resetEmptyElement()},!0),t.$watch(l.dragEnabled,function(e){"boolean"==typeof e&&(t.dragEnabled=e)}),t.$watch(l.emptyPlaceholderEnabled,function(e){"boolean"==typeof e&&(t.emptyPlaceholderEnabled=e,r.resetEmptyElement())}),t.$watch(l.nodropEnabled,function(e){"boolean"==typeof e&&(t.nodropEnabled=e)}),t.$watch(l.cloneEnabled,function(e){"boolean"==typeof e&&(t.cloneEnabled=e)}),t.$watch(l.maxDepth,function(e){"number"==typeof e&&(t.maxDepth=e)}),t.$watch(l.dragDelay,function(e){"number"==typeof e&&(t.dragDelay=e)}),c.accept=function(e,n,t){return!(n.nodropEnabled||n.outOfDepth(e))},c.beforeDrag=function(e){return!0},c.removed=function(e){},c.dropped=function(e){},c.dragStart=function(e){},c.dragMove=function(e){},c.dragStop=function(e){},c.beforeDrop=function(e){},t.$watch(l.uiTree,function(e,n){angular.forEach(e,function(e,n){c[n]&&"function"==typeof e&&(c[n]=e)}),t.$callbacks=c},!0)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeHandle",["treeConfig",function(e){return{require:"^uiTreeNode",restrict:"A",scope:!0,controller:"TreeHandleController",link:function(n,t,o,l){var r={};angular.extend(r,e),r.handleClass&&t.addClass(r.handleClass),n!=l.scope&&(n.$nodeScope=l.scope,l.scope.$handleScope=n)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNode",["treeConfig","UiTreeHelper","$window","$document","$timeout","$rootElement",function(e,n,t,o,l,r){return{require:["^uiTreeNodes","^uiTree"],restrict:"A",controller:"TreeNodeController",link:function(i,a,d,c){var s,u,p,f,h,m,$,g,b,y,v,S,N,E,x,C,T,w,X,D,Y={},A="ontouchstart"in window,V=null,H=document.body,k=document.documentElement;angular.extend(Y,e),Y.nodeClass&&a.addClass(Y.nodeClass),i.init(c),i.collapsed=!!n.getNodeAttribute(i,"collapsed"),i.sourceOnly=i.nodropEnabled||i.$treeScope.nodropEnabled,i.$watch(d.collapsed,function(e){"boolean"==typeof e&&(i.collapsed=e)}),i.$watch("collapsed",function(e){n.setNodeAttribute(i,"collapsed",e),d.$set("collapsed",e)}),y=function(e){if((A||2!=e.button&&3!=e.which)&&!(e.uiTreeDragging||e.originalEvent&&e.originalEvent.uiTreeDragging)){var l,d,c,y,v,S=angular.element(e.target),N=S.scope(),T=a.clone();if(N&&N.$type&&!("uiTreeNode"!=N.$type&&"uiTreeHandle"!=N.$type||"uiTreeNode"==N.$type&&N.$handleScope||(l=S.prop("tagName").toLowerCase(),"input"==l||"textarea"==l||"button"==l||"select"==l))){for(;S&&S[0]&&S[0]!=a;){if(n.nodrag(S))return;S=S.parent()}i.beforeDrag(i)&&(e.uiTreeDragging=!0,e.originalEvent&&(e.originalEvent.uiTreeDragging=!0),e.preventDefault(),c=n.eventObj(e),s=!0,u=n.dragInfo(i),d=a.prop("tagName"),"tr"===d.toLowerCase()?(f=angular.element(t.document.createElement(d)),y=angular.element(t.document.createElement("td")).addClass(Y.placeholderClass).attr("colspan",a[0].children.length),f.append(y)):f=angular.element(t.document.createElement(d)).addClass(Y.placeholderClass),h=angular.element(t.document.createElement(d)),Y.hiddenClass&&h.addClass(Y.hiddenClass),p=n.positionStarted(c,a),f.css("height",n.height(a)+"px"),m=angular.element(t.document.createElement(i.$parentNodesScope.$element.prop("tagName"))).addClass(i.$parentNodesScope.$element.attr("class")).addClass(Y.dragClass),m.css("width",n.width(a)+"px"),m.css("z-index",9999),v=(a[0].querySelector(".angular-ui-tree-handle")||a[0]).currentStyle,v&&(document.body.setAttribute("ui-tree-cursor",o.find("body").css("cursor")||""),o.find("body").css({cursor:v.cursor+"!important"})),i.sourceOnly&&f.css("display","none"),a.after(f),a.after(h),u.isClone()&&i.sourceOnly?m.append(T):m.append(a),r.append(m),m.css({left:c.pageX-p.offsetX+"px",top:c.pageY-p.offsetY+"px"}),$={placeholder:f,dragging:m},i.$apply(function(){i.$treeScope.$callbacks.dragStart(u.eventArgs($,p))}),angular.element(o).bind("touchend",x),angular.element(o).bind("touchcancel",x),angular.element(o).bind("touchmove",E),angular.element(o).bind("mouseup",x),angular.element(o).bind("mousemove",E),angular.element(o).bind("mouseleave",C),g=Math.max(H.scrollHeight,H.offsetHeight,k.clientHeight,k.scrollHeight,k.offsetHeight),b=Math.max(H.scrollWidth,H.offsetWidth,k.clientWidth,k.scrollWidth,k.offsetWidth))}}},v=function(e){var o,l,r,a,d,c,h,y,v,S,N,E,x,C,T,w,X=n.eventObj(e);if(m){if(e.preventDefault(),t.getSelection?t.getSelection().removeAllRanges():t.document.selection&&t.document.selection.empty(),r=X.pageX-p.offsetX,a=X.pageY-p.offsetY,0>r&&(r=0),0>a&&(a=0),a+10>g&&(a=g-10),r+10>b&&(r=b-10),m.css({left:r+"px",top:a+"px"}),d=window.pageYOffset||t.document.documentElement.scrollTop,c=d+(window.innerHeight||t.document.clientHeight||t.document.clientHeight),c=c&&window.scrollBy(0,10),d>X.pageY&&window.scrollBy(0,-10),n.positionMoved(e,p,s),s)return void(s=!1);if(y=n.offset(m).left-n.offset(f).left>=Y.threshold,v=X.pageX-(t.pageXOffset||t.document.body.scrollLeft||t.document.documentElement.scrollLeft)-(t.document.documentElement.clientLeft||0),S=X.pageY-(t.pageYOffset||t.document.body.scrollTop||t.document.documentElement.scrollTop)-(t.document.documentElement.clientTop||0),angular.isFunction(m.hide)?m.hide():(N=m[0].style.display,m[0].style.display="none"),t.document.elementFromPoint(v,S),x=angular.element(t.document.elementFromPoint(v,S)),angular.isFunction(m.show)?m.show():m[0].style.display=N,D=!x.scope()||!x.scope().$type,D&&(f.remove(),V&&(V.resetEmptyElement(),V=null)),p.dirAx&&p.distAxX>=Y.levelThreshold&&(p.distAxX=0,p.distX>0&&(o=u.prev(),o&&!o.collapsed&&o.accept(i,o.childNodesCount())&&(o.$childNodesScope.$element.append(f),u.moveTo(o.$childNodesScope,o.childNodes(),o.childNodesCount()))),p.distX<0&&(l=u.next(),l||(h=u.parentNode(),h&&h.$parentNodesScope.accept(i,h.index()+1)&&(h.$element.after(f),u.moveTo(h.$parentNodesScope,h.siblings(),h.index()+1))))),!p.dirAx){if(E=x.scope(),C=!1,!E)return;if(!E.$treeScope||E.$parent.nodropEnabled||E.$treeScope.nodropEnabled||f.css("display",""),"uiTree"==E.$type&&E.dragEnabled&&(C=E.isEmpty()),"uiTreeHandle"==E.$type&&(E=E.$nodeScope),"uiTreeNode"!=E.$type&&!C)return;V&&f.parent()[0]!=V.$element[0]&&(V.resetEmptyElement(),V=null),C?(V=E,E.$nodesScope.accept(i,0)&&(E.place(f),u.moveTo(E.$nodesScope,E.$nodesScope.childNodes(),0))):E.dragEnabled()&&(x=E.$element,T=n.offset(x),w=E.horizontal?X.pageX-1&&(this.siblings.splice(o,1),this.source.index()0?this.siblings[this.index-1]:null},next:function(){return this.index0&&(o=e.originalEvent.touches[0].pageX,l=e.originalEvent.touches[0].pageY),t.offsetX=o-this.offset(n).left,t.offsetY=l-this.offset(n).top,t.startX=t.lastX=o,t.startY=t.lastY=l,t.nowX=t.nowY=t.distX=t.distY=t.dirAx=0,t.dirX=t.dirY=t.lastDirX=t.lastDirY=t.distAxX=t.distAxY=0,t},positionMoved:function(e,n,t){var o,l=e.pageX,r=e.pageY;return e.originalEvent&&e.originalEvent.touches&&e.originalEvent.touches.length>0&&(l=e.originalEvent.touches[0].pageX,r=e.originalEvent.touches[0].pageY),n.lastX=n.nowX,n.lastY=n.nowY,n.nowX=l,n.nowY=r,n.distX=n.nowX-n.lastX,n.distY=n.nowY-n.lastY,n.lastDirX=n.dirX,n.lastDirY=n.dirY,n.dirX=0===n.distX?0:n.distX>0?1:-1,n.dirY=0===n.distY?0:n.distY>0?1:-1,o=Math.abs(n.distX)>Math.abs(n.distY)?1:0,t?(n.dirAx=o,void(n.moving=!0)):(n.dirAx!==o?(n.distAxX=0,n.distAxY=0):(n.distAxX+=Math.abs(n.distX),0!==n.dirX&&n.dirX!==n.lastDirX&&(n.distAxX=0),n.distAxY+=Math.abs(n.distY),0!==n.dirY&&n.dirY!==n.lastDirY&&(n.distAxY=0)),void(n.dirAx=o))}}}])}(); \ No newline at end of file +!function(){"use strict";angular.module("ui.tree",[]).constant("treeConfig",{treeClass:"angular-ui-tree",emptyTreeClass:"angular-ui-tree-empty",hiddenClass:"angular-ui-tree-hidden",nodesClass:"angular-ui-tree-nodes",nodeClass:"angular-ui-tree-node",handleClass:"angular-ui-tree-handle",placeholderClass:"angular-ui-tree-placeholder",dragClass:"angular-ui-tree-drag",dragThreshold:3,levelThreshold:30})}(),function(){"use strict";angular.module("ui.tree").controller("TreeHandleController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodeScope=null,e.$type="uiTreeHandle"}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodeController",["$scope","$element",function(e,n){function t(e){var n,o,l,r=0,i=e.childNodes();if(!i||0===i.length)return 0;for(l=i.length-1;l>=0;l--)n=i[l],o=1+t(n),r=Math.max(r,o);return r}this.scope=e,e.$element=n,e.$modelValue=null,e.$parentNodeScope=null,e.$childNodesScope=null,e.$parentNodesScope=null,e.$treeScope=null,e.$handleScope=null,e.$type="uiTreeNode",e.$$allowNodeDrop=!1,e.collapsed=!1,e.init=function(t){var o=t[0];e.$treeScope=t[1]?t[1].scope:null,e.$parentNodeScope=o.scope.$nodeScope,e.$modelValue=o.scope.$modelValue[e.$index],e.$parentNodesScope=o.scope,o.scope.initSubNode(e),n.on("$destroy",function(){o.scope.destroySubNode(e)})},e.index=function(){return e.$parentNodesScope.$modelValue.indexOf(e.$modelValue)},e.dragEnabled=function(){return!(e.$treeScope&&!e.$treeScope.dragEnabled)},e.isSibling=function(n){return e.$parentNodesScope==n.$parentNodesScope},e.isChild=function(n){var t=e.childNodes();return t&&t.indexOf(n)>-1},e.prev=function(){var n=e.index();return n>0?e.siblings()[n-1]:null},e.siblings=function(){return e.$parentNodesScope.childNodes()},e.childNodesCount=function(){return e.childNodes()?e.childNodes().length:0},e.hasChild=function(){return e.childNodesCount()>0},e.childNodes=function(){return e.$childNodesScope&&e.$childNodesScope.$modelValue?e.$childNodesScope.childNodes():null},e.accept=function(n,t){return e.$childNodesScope&&e.$childNodesScope.$modelValue&&e.$childNodesScope.accept(n,t)},e.removeNode=function(){var n=e.remove();return e.$callbacks.removed(n),n},e.remove=function(){return e.$parentNodesScope.removeNode(e)},e.toggle=function(){e.collapsed=!e.collapsed},e.collapse=function(){e.collapsed=!0},e.expand=function(){e.collapsed=!1},e.depth=function(){var n=e.$parentNodeScope;return n?n.depth()+1:1},e.maxSubDepth=function(){return e.$childNodesScope?t(e.$childNodesScope):0}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeNodesController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$modelValue=null,e.$nodeScope=null,e.$treeScope=null,e.$type="uiTreeNodes",e.$nodesMap={},e.nodropEnabled=!1,e.maxDepth=0,e.cloneEnabled=!1,e.initSubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=n):null},e.destroySubNode=function(n){return n.$modelValue?void(e.$nodesMap[n.$modelValue.$$hashKey]=null):null},e.accept=function(n,t){return e.$treeScope.$callbacks.accept(n,e,t)},e.beforeDrag=function(n){return e.$treeScope.$callbacks.beforeDrag(n)},e.isParent=function(n){return n.$parentNodesScope==e},e.hasChild=function(){return e.$modelValue.length>0},e.safeApply=function(e){var n=this.$root.$$phase;"$apply"==n||"$digest"==n?e&&"function"==typeof e&&e():this.$apply(e)},e.removeNode=function(n){var t=e.$modelValue.indexOf(n.$modelValue);return t>-1?(e.safeApply(function(){e.$modelValue.splice(t,1)[0]}),n):null},e.insertNode=function(n,t){e.safeApply(function(){e.$modelValue.splice(n,0,t)})},e.childNodes=function(){var n,t=[];if(e.$modelValue)for(n=0;n0?e.depth()+n.maxSubDepth()+1>t:!1}}])}(),function(){"use strict";angular.module("ui.tree").controller("TreeController",["$scope","$element",function(e,n){this.scope=e,e.$element=n,e.$nodesScope=null,e.$type="uiTree",e.$emptyElm=null,e.$callbacks=null,e.dragEnabled=!0,e.emptyPlaceholderEnabled=!0,e.maxDepth=0,e.dragDelay=0,e.cloneEnabled=!1,e.nodropEnabled=!1,e.isEmpty=function(){return e.$nodesScope&&e.$nodesScope.$modelValue&&0===e.$nodesScope.$modelValue.length},e.place=function(n){e.$nodesScope.$element.append(n),e.$emptyElm.remove()},this.resetEmptyElement=function(){e.$nodesScope.$modelValue&&0!==e.$nodesScope.$modelValue.length||!e.emptyPlaceholderEnabled?e.$emptyElm.remove():n.append(e.$emptyElm)},e.resetEmptyElement=this.resetEmptyElement;var t=function(e,n){var o,l,r=e.childNodes();for(o=0;o0?angular.element(a).children().length:1e6,i=angular.element(n.document.createElement("td")).attr("colspan",d),t.$emptyElm.append(i)):t.$emptyElm=angular.element(n.document.createElement("div")),s.emptyTreeClass&&t.$emptyElm.addClass(s.emptyTreeClass),t.$watch("$nodesScope.$modelValue.length",function(e){angular.isNumber(e)&&r.resetEmptyElement()},!0),t.$watch(l.dragEnabled,function(e){"boolean"==typeof e&&(t.dragEnabled=e)}),t.$watch(l.emptyPlaceholderEnabled,function(e){"boolean"==typeof e&&(t.emptyPlaceholderEnabled=e,r.resetEmptyElement())}),t.$watch(l.nodropEnabled,function(e){"boolean"==typeof e&&(t.nodropEnabled=e)}),t.$watch(l.cloneEnabled,function(e){"boolean"==typeof e&&(t.cloneEnabled=e)}),t.$watch(l.maxDepth,function(e){"number"==typeof e&&(t.maxDepth=e)}),t.$watch(l.dragDelay,function(e){"number"==typeof e&&(t.dragDelay=e)}),c.accept=function(e,n,t){return!(n.nodropEnabled||n.$treeScope.nodropEnabled||n.outOfDepth(e))},c.beforeDrag=function(e){return!0},c.removed=function(e){},c.dropped=function(e){},c.dragStart=function(e){},c.dragMove=function(e){},c.dragStop=function(e){},c.beforeDrop=function(e){},t.$watch(l.uiTree,function(e,n){angular.forEach(e,function(e,n){c[n]&&"function"==typeof e&&(c[n]=e)}),t.$callbacks=c},!0)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeHandle",["treeConfig",function(e){return{require:"^uiTreeNode",restrict:"A",scope:!0,controller:"TreeHandleController",link:function(n,t,o,l){var r={};angular.extend(r,e),r.handleClass&&t.addClass(r.handleClass),n!=l.scope&&(n.$nodeScope=l.scope,l.scope.$handleScope=n)}}}])}(),function(){"use strict";angular.module("ui.tree").directive("uiTreeNode",["treeConfig","UiTreeHelper","$window","$document","$timeout","$q","$rootElement",function(e,n,t,o,l,r,i){return{require:["^uiTreeNodes","^uiTree"],restrict:"A",controller:"TreeNodeController",link:function(a,d,c,s){var u,p,f,h,m,$,g,b,y,v,S,N,E,x,C,w,T,D,X,Y,A,V,H={},M="ontouchstart"in window,k=null,O=document.body,L=document.documentElement;angular.extend(H,e),H.nodeClass&&d.addClass(H.nodeClass),a.init(s),a.collapsed=!!n.getNodeAttribute(a,"collapsed"),a.sourceOnly=a.nodropEnabled||a.$treeScope.nodropEnabled,a.$watch(c.collapsed,function(e){"boolean"==typeof e&&(a.collapsed=e)}),a.$watch("collapsed",function(e){n.setNodeAttribute(a,"collapsed",e),c.$set("collapsed",e)}),v=function(e){if((M||2!=e.button&&3!=e.which)&&!(e.uiTreeDragging||e.originalEvent&&e.originalEvent.uiTreeDragging)){var l,r,c,s,v,S=angular.element(e.target),N=S.scope(),E=d.clone();if(N&&N.$type&&!("uiTreeNode"!=N.$type&&"uiTreeHandle"!=N.$type||"uiTreeNode"==N.$type&&N.$handleScope||(l=S.prop("tagName").toLowerCase(),"input"==l||"textarea"==l||"button"==l||"select"==l))){for(;S&&S[0]&&S[0]!=d;){if(n.nodrag(S))return;S=S.parent()}a.beforeDrag(a)&&(e.uiTreeDragging=!0,e.originalEvent&&(e.originalEvent.uiTreeDragging=!0),e.preventDefault(),c=n.eventObj(e),u=!0,p=n.dragInfo(a),r=d.prop("tagName"),"tr"===r.toLowerCase()?(h=angular.element(t.document.createElement(r)),s=angular.element(t.document.createElement("td")).addClass(H.placeholderClass).attr("colspan",d[0].children.length),h.append(s)):h=angular.element(t.document.createElement(r)).addClass(H.placeholderClass),m=angular.element(t.document.createElement(r)),H.hiddenClass&&m.addClass(H.hiddenClass),f=n.positionStarted(c,d),h.css("height",n.height(d)+"px"),$=angular.element(t.document.createElement(a.$parentNodesScope.$element.prop("tagName"))).addClass(a.$parentNodesScope.$element.attr("class")).addClass(H.dragClass),$.css("width",n.width(d)+"px"),$.css("z-index",9999),v=(d[0].querySelector(".angular-ui-tree-handle")||d[0]).currentStyle,v&&(document.body.setAttribute("ui-tree-cursor",o.find("body").css("cursor")||""),o.find("body").css({cursor:v.cursor+"!important"})),a.sourceOnly&&h.css("display","none"),d.after(h),d.after(m),p.isClone()&&a.sourceOnly?$.append(E):$.append(d),i.append($),$.css({left:c.pageX-f.offsetX+"px",top:c.pageY-f.offsetY+"px"}),g={placeholder:h,dragging:$},X(),a.$apply(function(){a.$treeScope.$callbacks.dragStart(p.eventArgs(g,f))}),b=Math.max(O.scrollHeight,O.offsetHeight,L.clientHeight,L.scrollHeight,L.offsetHeight),y=Math.max(O.scrollWidth,O.offsetWidth,L.clientWidth,L.scrollWidth,L.offsetWidth))}}},S=function(e){var o,l,r,i,d,c,s,m,v,S,N,E,x,C,w,T,D=n.eventObj(e);if($){if(e.preventDefault(),t.getSelection?t.getSelection().removeAllRanges():t.document.selection&&t.document.selection.empty(),r=D.pageX-f.offsetX,i=D.pageY-f.offsetY,0>r&&(r=0),0>i&&(i=0),i+10>b&&(i=b-10),r+10>y&&(r=y-10),$.css({left:r+"px",top:i+"px"}),d=window.pageYOffset||t.document.documentElement.scrollTop,c=d+(window.innerHeight||t.document.clientHeight||t.document.clientHeight),c=c&&window.scrollBy(0,10),d>D.pageY&&window.scrollBy(0,-10),n.positionMoved(e,f,u),u)return void(u=!1);if(m=n.offset($).left-n.offset(h).left>=H.threshold,v=D.pageX-(t.pageXOffset||t.document.body.scrollLeft||t.document.documentElement.scrollLeft)-(t.document.documentElement.clientLeft||0),S=D.pageY-(t.pageYOffset||t.document.body.scrollTop||t.document.documentElement.scrollTop)-(t.document.documentElement.clientTop||0),angular.isFunction($.hide)?$.hide():(N=$[0].style.display,$[0].style.display="none"),t.document.elementFromPoint(v,S),x=angular.element(t.document.elementFromPoint(v,S)),angular.isFunction($.show)?$.show():$[0].style.display=N,V=!x.scope()||!x.scope().$type,V&&(h.remove(),k&&(k.resetEmptyElement(),k=null)),f.dirAx&&f.distAxX>=H.levelThreshold&&(f.distAxX=0,f.distX>0&&(o=p.prev(),o&&!o.collapsed&&o.accept(a,o.childNodesCount())&&(o.$childNodesScope.$element.append(h),p.moveTo(o.$childNodesScope,o.childNodes(),o.childNodesCount()))),f.distX<0&&(l=p.next(),l||(s=p.parentNode(),s&&s.$parentNodesScope.accept(a,s.index()+1)&&(s.$element.after(h),p.moveTo(s.$parentNodesScope,s.siblings(),s.index()+1))))),!f.dirAx){if(E=x.scope(),C=!1,!E)return;if(!E.$treeScope||E.$parent.nodropEnabled||E.$treeScope.nodropEnabled||h.css("display",""),"uiTree"==E.$type&&E.dragEnabled&&(C=E.isEmpty()),"uiTreeHandle"==E.$type&&(E=E.$nodeScope),"uiTreeNode"!=E.$type&&!C)return;k&&h.parent()[0]!=k.$element[0]&&(k.resetEmptyElement(),k=null),C?(k=E,E.$nodesScope.accept(a,0)&&(E.place(h),p.moveTo(E.$nodesScope,E.$nodesScope.childNodes(),0))):E.dragEnabled()&&(x=E.$element,w=n.offset(x),T=E.horizontal?D.pageX-1&&(this.siblings.splice(o,1),this.source.index()0?this.siblings[this.index-1]:null},next:function(){return this.index0&&(o=e.originalEvent.touches[0].pageX,l=e.originalEvent.touches[0].pageY),t.offsetX=o-this.offset(n).left,t.offsetY=l-this.offset(n).top,t.startX=t.lastX=o,t.startY=t.lastY=l,t.nowX=t.nowY=t.distX=t.distY=t.dirAx=0,t.dirX=t.dirY=t.lastDirX=t.lastDirY=t.distAxX=t.distAxY=0,t},positionMoved:function(e,n,t){var o,l=e.pageX,r=e.pageY;return e.originalEvent&&e.originalEvent.touches&&e.originalEvent.touches.length>0&&(l=e.originalEvent.touches[0].pageX,r=e.originalEvent.touches[0].pageY),n.lastX=n.nowX,n.lastY=n.nowY,n.nowX=l,n.nowY=r,n.distX=n.nowX-n.lastX,n.distY=n.nowY-n.lastY,n.lastDirX=n.dirX,n.lastDirY=n.dirY,n.dirX=0===n.distX?0:n.distX>0?1:-1,n.dirY=0===n.distY?0:n.distY>0?1:-1,o=Math.abs(n.distX)>Math.abs(n.distY)?1:0,t?(n.dirAx=o,void(n.moving=!0)):(n.dirAx!==o?(n.distAxX=0,n.distAxY=0):(n.distAxX+=Math.abs(n.distX),0!==n.dirX&&n.dirX!==n.lastDirX&&(n.distAxX=0),n.distAxY+=Math.abs(n.distY),0!==n.dirY&&n.dirY!==n.lastDirY&&(n.distAxY=0)),void(n.dirAx=o))}}}])}(); \ No newline at end of file