panel_menu.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. define([
  2. 'angular',
  3. 'jquery',
  4. 'lodash',
  5. 'tether',
  6. ],
  7. function (angular, $, _, Tether) {
  8. 'use strict';
  9. angular
  10. .module('grafana.directives')
  11. .directive('panelMenu', function($compile) {
  12. var linkTemplate =
  13. '<span class="panel-title drag-handle pointer dropdown">' +
  14. '<span class="icon-gf panel-alert-icon"></span>' +
  15. '<span class="panel-title-text drag-handle">{{ctrl.panel.title | interpolateTemplateVars:this}}</span>' +
  16. '<span class="fa fa-caret-down panel-title-caret" data-toggle="dropdown"></span>' +
  17. '<span class="panel-time-info" ng-show="ctrl.timeInfo"><i class="fa fa-clock-o"></i> {{ctrl.timeInfo}}</span>' +
  18. '<ul class="dropdown-menu panel-dropdown-menu" role="menu">' +
  19. '<li><a ng-click="ctrl.addDataQuery(datasource);"><i class="fa fa-cog"></i> Edit <span class="dropdown-menu-item-shortcut">e</span></a></li>' +
  20. '<li><a ng-click="ctrl.addDataQuery(datasource);"><i class="fa fa-eye"></i> View</a></li>' +
  21. '<li><a ng-click="ctrl.addDataQuery(datasource);"><i class="fa fa-share-square-o"></i> Share</a></li>' +
  22. '<li><a ng-click="ctrl.addDataQuery(datasource);"><i class="fa fa-trash"></i> Remove</a></li>' +
  23. '</ul>' +
  24. '</span>';
  25. function createMenuTemplate(ctrl) {
  26. var template = '<div class="panel-menu small">';
  27. if (ctrl.dashboard.meta.canEdit) {
  28. template += '<div class="panel-menu-inner">';
  29. template += '<div class="panel-menu-row">';
  30. if (!ctrl.dashboard.meta.fullscreen) {
  31. template += '<a class="panel-menu-icon pull-left" ng-click="ctrl.updateColumnSpan(-1)"><i class="fa fa-minus"></i></a>';
  32. template += '<a class="panel-menu-icon pull-left" ng-click="ctrl.updateColumnSpan(1)"><i class="fa fa-plus"></i></a>';
  33. }
  34. template += '<a class="panel-menu-icon pull-right" ng-click="ctrl.removePanel()"><i class="fa fa-trash"></i></a>';
  35. template += '<div class="clearfix"></div>';
  36. template += '</div>';
  37. }
  38. template += '<div class="panel-menu-row">';
  39. template += '<a class="panel-menu-link" gf-dropdown="extendedMenu"><i class="fa fa-bars"></i></a>';
  40. _.each(ctrl.getMenu(), function(item) {
  41. // skip edit actions if not editor
  42. if (item.role === 'Editor' && !ctrl.dashboard.meta.canEdit) {
  43. return;
  44. }
  45. template += '<a class="panel-menu-link" ';
  46. if (item.click) { template += ' ng-click="' + item.click + '"'; }
  47. if (item.href) { template += ' href="' + item.href + '"'; }
  48. template += '>';
  49. template += item.text + '</a>';
  50. });
  51. template += '</div>';
  52. template += '</div>';
  53. template += '</div>';
  54. return template;
  55. }
  56. function getExtendedMenu(ctrl) {
  57. return ctrl.getExtendedMenu();
  58. }
  59. return {
  60. restrict: 'A',
  61. link: function($scope, elem) {
  62. var $link = $(linkTemplate);
  63. var $panelContainer = elem.parents(".panel-container");
  64. var menuScope = null;
  65. var ctrl = $scope.ctrl;
  66. var timeout = null;
  67. var $menu = null;
  68. var teather;
  69. elem.append($link);
  70. function dismiss(time, force) {
  71. clearTimeout(timeout);
  72. timeout = null;
  73. if (time) {
  74. timeout = setTimeout(dismiss, time);
  75. return;
  76. }
  77. // if hovering or draging pospone close
  78. if (force !== true) {
  79. if ($menu.is(':hover') || $scope.ctrl.dashboard.$$panelDragging) {
  80. dismiss(2200);
  81. return;
  82. }
  83. }
  84. if (menuScope) {
  85. teather.destroy();
  86. $menu.unbind();
  87. $menu.remove();
  88. menuScope.$destroy();
  89. menuScope = null;
  90. $menu = null;
  91. $panelContainer.removeClass('panel-highlight');
  92. }
  93. }
  94. var showMenu = function(e) {
  95. if (true) {
  96. return;
  97. }
  98. // if menu item is clicked and menu was just removed from dom ignore this event
  99. if (!$.contains(document, e.target)) {
  100. return;
  101. }
  102. if ($menu) {
  103. dismiss();
  104. return;
  105. }
  106. var menuTemplate;
  107. menuTemplate = createMenuTemplate(ctrl);
  108. $menu = $(menuTemplate);
  109. $menu.mouseleave(function() {
  110. dismiss(1000);
  111. });
  112. menuScope = $scope.$new();
  113. menuScope.extendedMenu = getExtendedMenu(ctrl);
  114. menuScope.dismiss = function() {
  115. dismiss(null, true);
  116. };
  117. $(".panel-container").removeClass('panel-highlight');
  118. $panelContainer.toggleClass('panel-highlight');
  119. $('.panel-menu').remove();
  120. elem.append($menu);
  121. $scope.$apply(function() {
  122. $compile($menu.contents())(menuScope);
  123. teather = new Tether({
  124. element: $menu,
  125. target: $panelContainer,
  126. attachment: 'bottom center',
  127. targetAttachment: 'top center',
  128. constraints: [
  129. {
  130. to: 'window',
  131. attachment: 'together',
  132. pin: true
  133. }
  134. ]
  135. });
  136. });
  137. dismiss(2200);
  138. };
  139. elem.click(showMenu);
  140. $compile(elem.contents())($scope);
  141. }
  142. };
  143. });
  144. });