forked from maxazan/angular-multiple-selection
-
Notifications
You must be signed in to change notification settings - Fork 0
/
multiple-selection.min.js
2 lines (2 loc) · 3.12 KB
/
multiple-selection.min.js
1
2
/*! angular-multiple-selection 0.0.3 */
function getSelectableElements(a){for(var b=[],c=a.children(),d=0;d<c.length;d++){var e=angular.element(c[d]);e.scope().isSelectable?b.push(e):e.scope().$id!=a.scope().$id&&e.scope().isSelectableZone===!0||(b=b.concat(getSelectableElements(e)))}return b}function offset(a){var b,c={top:0,left:0},d=a&&a.ownerDocument;return b=d.documentElement,void 0!==typeof a.getBoundingClientRect&&(c=a.getBoundingClientRect()),{top:c.top+(window.pageYOffset||b.scrollTop)-(b.clientTop||0),left:c.left+(window.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}}angular.module("multipleSelection",[]).directive("multipleSelectionItem",[function(){return{scope:!0,restrict:"A",link:function(a,b){a.isSelectable=!0,a.isSelecting=!1,a.isSelected=!1,b.on("mousedown",function(a){if(b.scope().isSelected)a.ctrlKey&&(b.scope().isSelected=!1,b.scope().$apply());else{if(!a.ctrlKey)for(var c=getSelectableElements(b.parent()),d=0;d<c.length;d++)c[d].scope().isSelectable&&(c[d].scope().isSelecting===!0||c[d].scope().isSelected===!0)&&(c[d].scope().isSelecting=!1,c[d].scope().isSelected=!1,c[d].scope().$apply());b.scope().isSelected=!0,b.scope().$apply()}a.stopPropagation()})}}}]).directive("multipleSelectionZone",["$document",function(a){return{scope:!0,restrict:"A",link:function(b,c){function d(a,b){return(b.beginX<=a.beginX&&a.beginX<=b.endX||a.beginX<=b.beginX&&b.beginX<=a.endX)&&(b.beginY<=a.beginY&&a.beginY<=b.endY||a.beginY<=b.beginY&&b.beginY<=a.endY)}function e(a,b,c,d){var e={};return a>c?(e.beginX=c,e.endX=a):(e.beginX=a,e.endX=c),b>d?(e.beginY=d,e.endY=b):(e.beginY=b,e.endY=d),e}function f(a,b,c,d,f){var g=e(b,c,d,f);i.css({top:g.beginY+"px",left:g.beginX+"px",width:g.endX-g.beginX+"px",height:g.endY-g.beginY+"px"})}function g(a){a.preventDefault(),f(i,j,k,a.pageX,a.pageY);for(var b=getSelectableElements(c),g=0;g<b.length;g++)d(e(offset(b[g][0]).left,offset(b[g][0]).top,offset(b[g][0]).left+b[g].prop("offsetWidth"),offset(b[g][0]).top+b[g].prop("offsetHeight")),e(j,k,a.pageX,a.pageY))?b[g].scope().isSelecting===!1&&(b[g].scope().isSelecting=!0,b[g].scope().$apply()):b[g].scope().isSelecting===!0&&(b[g].scope().isSelecting=!1,b[g].scope().$apply())}function h(b){b.preventDefault(),i.remove();for(var f=getSelectableElements(c),j=0;j<f.length;j++)f[j].scope().isSelecting===!0?(f[j].scope().isSelecting=!1,f[j].scope().isSelected=b.ctrlKey?!f[j].scope().isSelected:!0,f[j].scope().$apply()):d(e(f[j].prop("offsetLeft"),f[j].prop("offsetTop"),f[j].prop("offsetLeft")+f[j].prop("offsetWidth"),f[j].prop("offsetTop")+f[j].prop("offsetHeight")),e(b.pageX,b.pageY,b.pageX,b.pageY))&&f[j].scope().isSelected===!1&&(f[j].scope().isSelected=!0,f[j].scope().$apply());a.off("mousemove",g),a.off("mouseup",h)}b.isSelectableZone=!0;var i,j=0,k=0;c.on("mousedown",function(b){if(b.preventDefault(),!b.ctrlKey)for(var d=getSelectableElements(c),e=0;e<d.length;e++)(d[e].scope().isSelecting===!0||d[e].scope().isSelected===!0)&&(d[e].scope().isSelecting=!1,d[e].scope().isSelected=!1,d[e].scope().$apply());j=b.pageX,k=b.pageY,i=angular.element("<div></div>").addClass("select-helper"),a.find("body").eq(0).append(i),a.on("mousemove",g),a.on("mouseup",h)})}}}]);