Skip to content

Instantly share code, notes, and snippets.

@aantipov
Created March 20, 2014 12:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aantipov/9662369 to your computer and use it in GitHub Desktop.
Save aantipov/9662369 to your computer and use it in GitHub Desktop.
'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