Created
March 20, 2014 12:08
-
-
Save aantipov/9662369 to your computer and use it in GitHub Desktop.
Revisions
-
aantipov created this gist
Mar 20, 2014 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,90 @@ '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; } }; } );