/// 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 (let item of ctrl.getMenu()) { html += renderMenuItem(item, ctrl); } return html; } /** @ngInject **/ function panelHeader($compile) { return { restrict: "E", template: template, link: function(scope, elem, attrs) { let 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(); let 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(); let menuElem = elem.find("[data-toggle=dropdown]").parent(); panelElem = panelElem && panelElem.length ? panelElem[0] : undefined; if (panelElem) { panelElem = $(panelElem); $(panelGridClass).removeClass(menuOpenClass); let 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);