Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Header.js 5.13 KiB
"use strict";

/* exported logger */

var AbstractGuiElement = require('./AbstractGuiElement');
var PanelControlElementType = require('./PanelControlElementType');
var Functions = require('../Functions');
var OptionsMenu = require('./OptionsMenu');

var Promise = require("bluebird");

var logger = require('../logger');
var xss = require('xss');

/**
 *
 * @param {Object} params
 * @param {HTMLElement} params.element
 * @param {CustomMap} params.customMap
 * @param {boolean} [params.optionsMenu=false]
 * @param {Configuration} params.configuration
 * @param {Project} [params.project]
 * @param {ServerConnector} [params.serverConnector]
 *
 * @constructor
 *
 * @extends AbstractGuiElement
 */
function Header(params) {
  AbstractGuiElement.call(this, params);
  var self = this;

  var guiParams = {
    optionsMenu: params.optionsMenu
  };

  self._createHeaderGui(guiParams);
}

Header.prototype = Object.create(AbstractGuiElement.prototype);
Header.prototype.constructor = Header;

/**
 *
 * @param {Object} guiParams
 * @param {boolean} guiParams.optionsMenu
 * @private
 */
Header.prototype._createHeaderGui = function (guiParams) {
  var self = this;
  self.getElement().className = "minerva-header";

  var projectId = self.getProject().getProjectId();
  var projectName = xss(self.getProject().getName());

  var loadingDiv = Functions.createElement({
    type: "div",
    className: "minerva-loading-div"
  });

  var loadingImg = Functions.createElement({
    type: "img",
    src: 'resources/images/icons/ajax-loader.gif'
  });
  loadingDiv.appendChild(loadingImg);
  this.setControlElement(PanelControlElementType.FOOTER_LOADING_DIV, loadingDiv);

  var link = Functions.createElement({
    type: "a",
    style: "padding-right:15px; float:right",
    content: '<i class="fa fa-lock" style="font-size:17px"></i>&nbsp;',
    xss: false
  });
  link.href = self.getServerConnector().getServerBaseUrl() + "admin.xhtml?id=" + projectId;
  self.getElement().appendChild(link);

  if (guiParams.optionsMenu) {
    var optionsElement = Functions.createElement({type: "ul"});
    document.body.appendChild(optionsElement);
    self._optionsMenu = new OptionsMenu({
      customMap: self.getMap(),
      element: optionsElement,
      configuration: self.getConfiguration()
    });

    var menuLink = Functions.createElement({
      type: "a",
      className: "minerva-menu-link",
      content: '<i class="fa fa-bars" style="font-size:17px"></i>&nbsp;',
      href: "#",
      onclick: function () {
        var link = $(menuLink);
        var offset = link.offset();

        var top = offset.top;
        var left = offset.left;

        var bottom = top + link.outerHeight();

        return self._optionsMenu.open(left, bottom, new Date().getTime());
      },
      xss: false
    });
    self.getElement().appendChild(menuLink);
  }

  self.getElement().appendChild(loadingDiv);

  var homeLink = Functions.createElement({
    type: "a",
    content: '<i class="fa fa-home" style="font-size:17px"></i> ' + projectName,
    xss: false
  });
  homeLink.href = self.getServerConnector().getServerBaseUrl() + "?id=" + projectId;
  self.getElement().appendChild(homeLink);
};

/**
 *
 * @param {string} message
 */
Header.prototype.addLoadMessage = function (message) {
  var self = this;
  self._loadMessages.push(message);
};

/**
 *
 * @param {string} message
 */
Header.prototype.removeLoadMessage = function (message) {
  var self = this;
  var index = self._loadMessages.indexOf(message);
  if (index > -1) {
    self._loadMessages.splice(index, 1);
  } else {
    logger.debug("Removing message that is not there: " + message);
  }
};
/**
 * return {Promise}
 */
Header.prototype.init = function () {
  var self = this;
  return new Promise(function (resolve) {
    var div = self.getControlElement(PanelControlElementType.FOOTER_LOADING_DIV);

    self._loadMessages = [];
    self._onDataLoadStart = function (e) {
      self.addLoadMessage(e.arg);
      $(div).show();
      div.title = e.arg;
    };

    self._onDataLoadStop = function (e) {
      self.removeLoadMessage(e.arg);
      if (self._loadMessages.length > 0) {
        div.title = self._loadMessages[0];
      } else {
        $(div).hide();
      }
    };
    self.getServerConnector().addListener("onDataLoadStart", self._onDataLoadStart);
    self.getServerConnector().addListener("onDataLoadStop", self._onDataLoadStop);
    resolve();
  });
};

/**
 *
 */
Header.prototype.destroy = function () {
  var self = this;
  if (self._onDataLoadStart) {
    self.getServerConnector().removeListener("onDataLoadStart", self._onDataLoadStart);
    self.getServerConnector().removeListener("onDataLoadStop", self._onDataLoadStop);
  }
  if (self._optionsMenu !== undefined) {
    document.body.removeChild(self._optionsMenu.getElement());
  }
};

/**
 *
 * @param {PluginManager} pluginManager
 */
Header.prototype.setPluginManager = function (pluginManager) {
  var self = this;
  self._pluginManager = pluginManager;
  if (self._optionsMenu !== undefined) {
    self._optionsMenu.setPluginManager(pluginManager);
  }
};

/**
 *
 * @returns {PluginManager}
 */
Header.prototype.getPluginManager = function () {
  return this._pluginManager;
};

module.exports = Header;