panelMenu.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. define([
  2. 'angular',
  3. 'jquery',
  4. 'lodash',
  5. ],
  6. function (angular, $, _) {
  7. 'use strict';
  8. angular
  9. .module('grafana.directives')
  10. .directive('panelMenu', function($compile) {
  11. var linkTemplate = '<a class="pointer panel-title">{{panel.title || interpolateTemplateVars}}</a>';
  12. var moveAttributes = ' data-drag=true data-jqyoui-options="kbnJqUiDraggableOptions"'+
  13. ' jqyoui-draggable="{'+
  14. 'animate:false,'+
  15. 'mutate:false,'+
  16. 'index:{{$index}},'+
  17. 'onStart:\'panelMoveStart\','+
  18. 'onStop:\'panelMoveStop\''+
  19. '}" ng-model="panel" ';
  20. function createMenuTemplate($scope) {
  21. var template = '<div class="panel-menu small">';
  22. template += '<div class="panel-menu-inner">';
  23. template += '<div class="panel-menu-row">';
  24. template += '<a class="panel-menu-icon pull-left" ng-click="updateColumnSpan(-1)"><i class="icon-minus"></i></a>';
  25. template += '<a class="panel-menu-icon pull-left" ng-click="updateColumnSpan(1)"><i class="icon-plus"></i></a>';
  26. template += '<a class="panel-menu-icon pull-right" ng-click="remove_panel_from_row(row, panel)"><i class="icon-remove"></i></a>';
  27. template += '<a class="panel-menu-icon pull-right" ' + moveAttributes + '><i class="icon-move"></i></a>';
  28. template += '<div class="clearfix"></div>';
  29. template += '</div>';
  30. template += '<div class="panel-menu-row">';
  31. _.each($scope.panelMeta.menu, function(item) {
  32. template += '<a class="panel-menu-link" ';
  33. if (item.click) { template += ' ng-click="' + item.click + '"'; }
  34. if (item.editorLink) { template += ' dash-editor-link="' + item.editorLink + '"'; }
  35. template += '>';
  36. template += item.text + '</a>';
  37. });
  38. template += '<a class="panel-menu-link">share</a>';
  39. template += '</div>';
  40. template += '</div>';
  41. template += '</div>';
  42. return template;
  43. }
  44. return {
  45. restrict: 'A',
  46. link: function($scope, elem) {
  47. var $link = $(linkTemplate);
  48. var $panelContainer = elem.parents(".panel-container");
  49. var menuWidth = 246;
  50. var menuScope = null;
  51. var timeout = null;
  52. var $menu = null;
  53. elem.append($link);
  54. function dismiss(time) {
  55. clearTimeout(timeout);
  56. timeout = null;
  57. console.log('dismiss', time);
  58. if (time) {
  59. timeout = setTimeout(dismiss, time);
  60. return;
  61. }
  62. // if hovering or draging pospone close
  63. if ($menu.is(':hover') || $scope.dashboard.$$panelDragging) {
  64. dismiss(2500);
  65. return;
  66. }
  67. if (menuScope) {
  68. $menu.unbind();
  69. $menu.remove();
  70. menuScope.$destroy();
  71. menuScope = null;
  72. $menu = null;
  73. $panelContainer.removeClass('panel-highlight');
  74. }
  75. }
  76. var showMenu = function() {
  77. if ($menu) {
  78. dismiss();
  79. return;
  80. }
  81. var windowWidth = $(window).width();
  82. var panelLeftPos = $(elem).offset().left;
  83. var panelWidth = $(elem).width();
  84. var menuLeftPos = (panelWidth / 2) - (menuWidth/2);
  85. var stickingOut = panelLeftPos + menuLeftPos + menuWidth - windowWidth;
  86. if (stickingOut > 0) {
  87. menuLeftPos -= stickingOut + 10;
  88. }
  89. if (panelLeftPos + menuLeftPos < 0) {
  90. menuLeftPos = 0;
  91. }
  92. var menuTemplate = createMenuTemplate($scope);
  93. $menu = $(menuTemplate);
  94. $menu.css('left', menuLeftPos);
  95. $menu.mouseleave(function() {
  96. dismiss(1000);
  97. });
  98. menuScope = $scope.$new();
  99. $('.panel-menu').remove();
  100. elem.append($menu);
  101. $scope.$apply(function() {
  102. $compile($menu.contents())(menuScope);
  103. });
  104. $(".panel-container").removeClass('panel-highlight');
  105. $panelContainer.toggleClass('panel-highlight');
  106. dismiss(2000);
  107. };
  108. $link.click(showMenu);
  109. $compile(elem.contents())($scope);
  110. }
  111. };
  112. });
  113. });