Files
Umbraco-CMS/src/Umbraco.Web.UI.Client/src/common/directives/components/events/events.directive.js
2017-07-26 15:21:30 +02:00

275 lines
7.9 KiB
JavaScript

/**
* @description Utillity directives for key and field events
**/
angular.module('umbraco.directives')
.directive('onKeyup', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onKeyup);
};
elm.on("keyup", f);
scope.$on("$destroy", function(){ elm.off("keyup", f);} );
}
};
})
.directive('onKeydown', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onKeydown);
};
elm.on("keydown", f);
scope.$on("$destroy", function(){ elm.off("keydown", f);} );
}
};
})
.directive('onBlur', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onBlur);
};
elm.on("blur", f);
scope.$on("$destroy", function(){ elm.off("blur", f);} );
}
};
})
.directive('onFocus', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onFocus);
};
elm.on("focus", f);
scope.$on("$destroy", function(){ elm.off("focus", f);} );
}
};
})
.directive('onDragEnter', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onDragEnter);
};
elm.on("dragenter", f);
scope.$on("$destroy", function(){ elm.off("dragenter", f);} );
}
};
})
.directive('onDragLeave', function () {
return function (scope, elm, attrs) {
var f = function (event) {
var rect = this.getBoundingClientRect();
var getXY = function getCursorPosition(event) {
var x, y;
if (typeof event.clientX === 'undefined') {
// try touch screen
x = event.pageX + document.documentElement.scrollLeft;
y = event.pageY + document.documentElement.scrollTop;
} else {
x = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
y = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}
return { x: x, y : y };
};
var e = getXY(event.originalEvent);
// Check the mouseEvent coordinates are outside of the rectangle
if (e.x > rect.left + rect.width - 1 || e.x < rect.left || e.y > rect.top + rect.height - 1 || e.y < rect.top) {
scope.$apply(attrs.onDragLeave);
}
};
elm.on("dragleave", f);
scope.$on("$destroy", function(){ elm.off("dragleave", f);} );
};
})
.directive('onDragOver', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onDragOver);
};
elm.on("dragover", f);
scope.$on("$destroy", function(){ elm.off("dragover", f);} );
}
};
})
.directive('onDragStart', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onDragStart);
};
elm.on("dragstart", f);
scope.$on("$destroy", function(){ elm.off("dragstart", f);} );
}
};
})
.directive('onDragEnd', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onDragEnd);
};
elm.on("dragend", f);
scope.$on("$destroy", function(){ elm.off("dragend", f);} );
}
};
})
.directive('onDrop', function () {
return {
link: function (scope, elm, attrs) {
var f = function () {
scope.$apply(attrs.onDrop);
};
elm.on("drop", f);
scope.$on("$destroy", function(){ elm.off("drop", f);} );
}
};
})
.directive('onOutsideClick', function ($timeout) {
return function (scope, element, attrs) {
var eventBindings = [];
function oneTimeClick(event) {
var el = event.target.nodeName;
//ignore link and button clicks
var els = ["INPUT","A","BUTTON"];
if(els.indexOf(el) >= 0){return;}
// ignore clicks on new overlay
var parents = $(event.target).parents("a,button,.umb-overlay");
if(parents.length > 0){
return;
}
// ignore clicks on dialog from old dialog service
var oldDialog = $(event.target).parents("#old-dialog-service");
if (oldDialog.length === 1) {
return;
}
// ignore clicks in tinyMCE dropdown(floatpanel)
var floatpanel = $(event.target).closest(".mce-floatpanel");
if (floatpanel.length === 1) {
return;
}
//ignore clicks inside this element
if( $(element).has( $(event.target) ).length > 0 ){
return;
}
scope.$apply(attrs.onOutsideClick);
}
$timeout(function(){
if ("bindClickOn" in attrs) {
eventBindings.push(scope.$watch(function() {
return attrs.bindClickOn;
}, function(newValue) {
if (newValue === "true") {
$(document).on("click", oneTimeClick);
} else {
$(document).off("click", oneTimeClick);
}
}));
} else {
$(document).on("click", oneTimeClick);
}
scope.$on("$destroy", function() {
$(document).off("click", oneTimeClick);
// unbind watchers
for (var e in eventBindings) {
eventBindings[e]();
}
});
}); // Temp removal of 1 sec timeout to prevent bug where overlay does not open. We need to find a better solution.
};
})
.directive('onRightClick',function(){
document.oncontextmenu = function (e) {
if(e.target.hasAttribute('on-right-click')) {
e.preventDefault();
e.stopPropagation();
return false;
}
};
return function(scope,el,attrs){
el.on('contextmenu',function(e){
e.preventDefault();
e.stopPropagation();
scope.$apply(attrs.onRightClick);
return false;
});
};
})
.directive('onDelayedMouseleave', function ($timeout, $parse) {
return {
restrict: 'A',
link: function (scope, element, attrs, ctrl) {
var active = false;
var fn = $parse(attrs.onDelayedMouseleave);
var leave_f = function(event) {
var callback = function() {
fn(scope, {$event:event});
};
active = false;
$timeout(function(){
if(active === false){
scope.$apply(callback);
}
}, 650);
};
var enter_f = function(event, args){
active = true;
};
element.on("mouseleave", leave_f);
element.on("mouseenter", enter_f);
//unsub events
scope.$on("$destroy", function(){
element.off("mouseleave", leave_f);
element.off("mouseenter", enter_f);
});
}
};
});