define([ 'angular', 'jquery', 'lodash', ], function (angular, $, _) { 'use strict'; angular .module('grafana.directives') .directive('panelMenu', function($compile, linkSrv) { var linkTemplate = '' + '{{panel.title | interpolateTemplateVars:this}}' + '' + ' {{panelMeta.timeInfo}}' + ''; function createMenuTemplate($scope) { var template = '
'; return template; } function getExtendedMenu($scope) { var menu = angular.copy($scope.panelMeta.extendedMenu); if ($scope.panel.links) { _.each($scope.panel.links, function(link) { var info = linkSrv.getPanelLinkAnchorInfo(link, $scope.panel.scopedVars); menu.push({text: info.title, href: info.href, target: info.target }); }); } return menu; } return { restrict: 'A', link: function($scope, elem) { var $link = $(linkTemplate); var $panelContainer = elem.parents(".panel-container"); var menuScope = null; var timeout = null; var $menu = null; elem.append($link); $scope.$watchCollection('panel.links', function(newValue) { var showIcon = (newValue ? newValue.length > 0 : false) && $scope.panel.title !== ''; $link.toggleClass('has-panel-links', showIcon); }); function dismiss(time, force) { clearTimeout(timeout); timeout = null; if (time) { timeout = setTimeout(dismiss, time); return; } // if hovering or draging pospone close if (force !== true) { if ($menu.is(':hover') || $scope.dashboard.$$panelDragging) { dismiss(2200); return; } } if (menuScope) { $menu.unbind(); $menu.remove(); menuScope.$destroy(); menuScope = null; $menu = null; $panelContainer.removeClass('panel-highlight'); } } var showMenu = function(e) { // if menu item is clicked and menu was just removed from dom ignore this event if (!$.contains(document, e.target)) { return; } if ($menu) { dismiss(); return; } var menuTemplate = createMenuTemplate($scope); $menu = $(menuTemplate); $menu.mouseleave(function() { dismiss(1000); }); menuScope = $scope.$new(); menuScope.extendedMenu = getExtendedMenu($scope); menuScope.dismiss = function() { dismiss(null, true); }; $(".panel-container").removeClass('panel-highlight'); $panelContainer.toggleClass('panel-highlight'); $('.panel-menu').remove(); elem.append($menu); $scope.$apply(function() { $compile($menu.contents())(menuScope); var menuWidth = $menu[0].offsetWidth; var menuHeight = $menu[0].offsetHeight; var windowWidth = $(window).width(); var panelLeftPos = $(elem).offset().left; var panelWidth = $(elem).width(); var menuLeftPos = (panelWidth / 2) - (menuWidth/2); var stickingOut = panelLeftPos + menuLeftPos + menuWidth - windowWidth; if (stickingOut > 0) { menuLeftPos -= stickingOut + 10; } if (panelLeftPos + menuLeftPos < 0) { menuLeftPos = 0; } if ($scope.fullscreen) { menuHeight = -(menuHeight/2); } $menu.css({'left': menuLeftPos, top: -menuHeight}); }); dismiss(2200); }; elem.click(showMenu); $compile(elem.contents())($scope); } }; }); });