import $ from 'jquery'; import { coreModule } from 'app/core/core'; var template = ` {{ctrl.panel.title | interpolateTemplateVars:this}} {{ctrl.timeInfo}} `; function renderMenuItem(item, ctrl) { let html = ''; let listItemClass = ''; if (item.divider) { return '
  • '; } if (item.submenu) { listItemClass = 'dropdown-submenu'; } html += `
  • `; html += `${item.text}`; if (item.shortcut) { html += `${item.shortcut}`; } html += ``; if (item.submenu) { html += ''; } html += `
  • `; return html; } function createMenuTemplate(ctrl) { let html = ''; for (const item of ctrl.getMenu()) { html += renderMenuItem(item, ctrl); } return html; } /** @ngInject **/ function panelHeader($compile) { return { restrict: 'E', template: template, link: function(scope, elem, attrs) { const menuElem = elem.find('.panel-menu'); let menuScope; let isDragged; elem.click(function(evt) { const targetClass = evt.target.className; // remove existing scope if (menuScope) { menuScope.$destroy(); } menuScope = scope.$new(); const menuHtml = createMenuTemplate(scope.ctrl); menuElem.html(menuHtml); $compile(menuElem)(menuScope); if (targetClass.indexOf('panel-title-text') >= 0 || targetClass.indexOf('panel-title') >= 0) { togglePanelMenu(evt); } }); elem.find('.panel-menu-toggle').click(() => { togglePanelStackPosition(); }); function togglePanelMenu(e) { if (!isDragged) { e.stopPropagation(); togglePanelStackPosition(); elem.find('[data-toggle=dropdown]').dropdown('toggle'); } } /** * Hack for adding special class 'dropdown-menu-open' to the panel. * This class sets z-index for panel and prevents menu overlapping. */ function togglePanelStackPosition() { const menuOpenClass = 'dropdown-menu-open'; const panelGridClass = '.react-grid-item.panel'; let panelElem = elem .find('[data-toggle=dropdown]') .parentsUntil('.panel') .parent(); const menuElem = elem.find('[data-toggle=dropdown]').parent(); panelElem = panelElem && panelElem.length ? panelElem[0] : undefined; if (panelElem) { panelElem = $(panelElem); $(panelGridClass).removeClass(menuOpenClass); const state = !menuElem.hasClass('open'); panelElem.toggleClass(menuOpenClass, state); } } let mouseX, mouseY; elem.mousedown(e => { mouseX = e.pageX; mouseY = e.pageY; }); elem.mouseup(e => { if (mouseX === e.pageX && mouseY === e.pageY) { isDragged = false; } else { isDragged = true; } }); }, }; } coreModule.directive('panelHeader', panelHeader);