define([ 'angular', 'jquery', 'lodash', ], function (angular, $, _) { 'use strict'; angular .module('grafana.directives') .directive('panelMenu', function($compile, linkSrv) { var linkTemplate = '' + '{{ctrl.panel.title}}' + '' + ' {{ctrl.panelMeta.timeInfo}}' + ''; function createExternalLinkMenu(ctrl) { var template = '
'; template += '
'; if (ctrl.panel.links) { _.each(ctrl.panel.links, function(link) { var info = linkSrv.getPanelLinkAnchorInfo(link, ctrl.panel.scopedVars); template += '' + info.title + ''; }); } return template; } function createMenuTemplate(ctrl) { var template = '
'; if (ctrl.dashboard.meta.canEdit) { template += '
'; template += '
'; template += ''; template += ''; template += ''; template += '
'; template += '
'; } template += '
'; template += ''; _.each(ctrl.panelMeta.menu, function(item) { // skip edit actions if not editor if (item.role === 'Editor' && !ctrl.dashboard.meta.canEdit) { return; } template += ''; }); template += '
'; template += '
'; template += '
'; return template; } function getExtendedMenu(ctrl) { return angular.copy(ctrl.panelMeta.extendedMenu); } return { restrict: 'A', link: function($scope, elem) { var $link = $(linkTemplate); var $panelLinksBtn = $link.find(".panel-links-btn"); var $panelContainer = elem.parents(".panel-container"); var menuScope = null; var ctrl = $scope.ctrl; var timeout = null; var $menu = null; elem.append($link); $scope.$watchCollection('panel.links', function(newValue) { var showIcon = (newValue ? newValue.length > 0 : false) && ctrl.panel.title !== ''; $panelLinksBtn.toggle(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; if ($(e.target).hasClass('fa-external-link')) { menuTemplate = createExternalLinkMenu(ctrl); } else { menuTemplate = createMenuTemplate(ctrl); } $menu = $(menuTemplate); $menu.mouseleave(function() { dismiss(1000); }); menuScope = $scope.$new(); menuScope.extendedMenu = getExtendedMenu(ctrl); 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; } $menu.css({'left': menuLeftPos, top: -menuHeight}); }); dismiss(2200); }; elem.click(showMenu); $compile(elem.contents())($scope); } }; }); });