Created
March 20, 2014 12:08
-
-
Save aantipov/9662369 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
angular.module('ccApp') | |
.factory('Popover', | |
function ($compile, $templateCache, $timeout, $http) { | |
var popoverEnabled = true, openTimeout, $popover, $layer, popoverTarget; | |
function isPopoverVisible() { | |
return $popover.is(':visible'); | |
} | |
function close() { | |
if (popoverTarget) { | |
popoverTarget.removeClass('popover-set'); | |
} | |
if ($popover && $popover.length) { | |
$popover.remove(); | |
} | |
if ($layer && $layer.length) { | |
$layer.remove(); | |
} | |
} | |
function open(template, scope, delay) { | |
// Do not open, if popover is already open or it is forbidden. | |
if (!popoverEnabled || ($popover && isPopoverVisible())) { | |
return; | |
} | |
// Compile popup and link with scope data. | |
$popover = $(template); | |
// $popover.appendTo(popoverTarget.offsetParent()); | |
$popover.appendTo('body'); | |
$compile($popover)(scope); | |
// Add layer. | |
$layer = $('<div id="cc-popover-layer"></div>').appendTo('body'); | |
// Destroy popover on outer click. | |
$layer.on('click', function () { | |
close(); | |
}); | |
// Show popup. | |
var targetPos = popoverTarget.addClass('popover-set').offset(); | |
$popover.show().css('top', targetPos.top - 60).css('left', targetPos.left - 210); | |
} | |
return { | |
open: function ($targetEl, templateId, scope, delay) { | |
if (!popoverEnabled) { | |
return this; | |
} | |
popoverTarget = $targetEl; | |
var template = $templateCache.get(templateId); | |
if (!template) { | |
$http.get(templateId) | |
.success(function (data) { | |
template = data; | |
$templateCache.put(templateId, template); | |
}) | |
.error(function (data, status) { | |
throw 'HTTP Error: status' + status + '\n' + data; | |
}); | |
} | |
openTimeout = $timeout(function () { | |
open(template, scope, delay); | |
}, delay); | |
return this; | |
}, | |
close: function () { | |
close(); | |
return this; | |
}, | |
cancelOpening: function () { | |
$timeout.cancel(openTimeout); | |
return this; | |
}, | |
forbid: function () { | |
popoverEnabled = false; | |
return this; | |
}, | |
enable: function () { | |
popoverEnabled = true; | |
return this; | |
} | |
}; | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment