panel_header.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import { coreModule } from 'app/core/core';
  2. const template = `
  3. <span class="panel-title">
  4. <span class="icon-gf panel-alert-icon"></span>
  5. <span class="panel-title-text">{{ctrl.panel.title | interpolateTemplateVars:this}}</span>
  6. <span class="panel-menu-container dropdown">
  7. <span class="fa fa-caret-down panel-menu-toggle" data-toggle="dropdown"></span>
  8. <ul class="dropdown-menu dropdown-menu--menu panel-menu" role="menu">
  9. </ul>
  10. </span>
  11. <span class="panel-time-info" ng-if="ctrl.timeInfo"><i class="fa fa-clock-o"></i> {{ctrl.timeInfo}}</span>
  12. </span>`;
  13. function renderMenuItem(item, ctrl) {
  14. let html = '';
  15. let listItemClass = '';
  16. if (item.divider) {
  17. return '<li class="divider"></li>';
  18. }
  19. if (item.submenu) {
  20. listItemClass = 'dropdown-submenu';
  21. }
  22. html += `<li class="${listItemClass}"><a `;
  23. if (item.click) {
  24. html += ` ng-click="${item.click}"`;
  25. }
  26. if (item.href) {
  27. html += ` href="${item.href}"`;
  28. }
  29. html += `><i class="${item.icon}"></i>`;
  30. html += `<span class="dropdown-item-text">${item.text}</span>`;
  31. if (item.shortcut) {
  32. html += `<span class="dropdown-menu-item-shortcut">${item.shortcut}</span>`;
  33. }
  34. html += `</a>`;
  35. if (item.submenu) {
  36. html += '<ul class="dropdown-menu dropdown-menu--menu panel-menu">';
  37. for (const subitem of item.submenu) {
  38. html += renderMenuItem(subitem, ctrl);
  39. }
  40. html += '</ul>';
  41. }
  42. html += `</li>`;
  43. return html;
  44. }
  45. function createMenuTemplate(ctrl) {
  46. let html = '';
  47. for (const item of ctrl.getMenu()) {
  48. html += renderMenuItem(item, ctrl);
  49. }
  50. return html;
  51. }
  52. /** @ngInject */
  53. function panelHeader($compile) {
  54. return {
  55. restrict: 'E',
  56. template: template,
  57. link: (scope, elem, attrs) => {
  58. const menuElem = elem.find('.panel-menu');
  59. let menuScope;
  60. let isDragged;
  61. elem.click(evt => {
  62. const targetClass = evt.target.className;
  63. // remove existing scope
  64. if (menuScope) {
  65. menuScope.$destroy();
  66. }
  67. menuScope = scope.$new();
  68. const menuHtml = createMenuTemplate(scope.ctrl);
  69. menuElem.html(menuHtml);
  70. $compile(menuElem)(menuScope);
  71. if (targetClass.indexOf('panel-title-text') >= 0 || targetClass.indexOf('panel-title') >= 0) {
  72. togglePanelMenu(evt);
  73. }
  74. });
  75. function togglePanelMenu(e) {
  76. if (!isDragged) {
  77. e.stopPropagation();
  78. elem.find('[data-toggle=dropdown]').dropdown('toggle');
  79. }
  80. }
  81. let mouseX, mouseY;
  82. elem.mousedown(e => {
  83. mouseX = e.pageX;
  84. mouseY = e.pageY;
  85. });
  86. elem.mouseup(e => {
  87. if (mouseX === e.pageX && mouseY === e.pageY) {
  88. isDragged = false;
  89. } else {
  90. isDragged = true;
  91. }
  92. });
  93. },
  94. };
  95. }
  96. coreModule.directive('panelHeader', panelHeader);