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

/* exported logger */

var AbstractGuiElement = require('./AbstractGuiElement');
var SubMenu = require('./SubMenu');

var Functions = require('../Functions');

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

function ContextMenu(params) {
  AbstractGuiElement.call(this, params);
  var self = this;

  var element = self.getElement();
  element.className = "dropdown-menu";
  element.setAttribute("role", "menu");
  element.style.display = "none";

  $('body').click(function() {
    self.hide();
  });
}

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

ContextMenu.prototype.addOption = function(name, handler) {
  var self = this;
  if (name instanceof SubMenu) {
    self.getElement().appendChild(name.getElement());
  } else {
    var option = Functions.createElement({
      type : "li",
    });
    var link = Functions.createElement({
      type : "a",
      href : "#",
      content : name,
    });
    $(link).data("handler", handler);
    option.appendChild(link);
    self.getElement().appendChild(option);
  }
};

ContextMenu.prototype.open = function(x, y) {
  var self = this;
  var $menu = $(self.getElement()).show().css({
    position : "absolute",
    left : x,
    top : y
  }).off('click').on('click', 'a', function() {
    $menu.hide();
    if ($(this).data("handler") !== undefined) {
      $(this).data("handler")();
    } else {
      logger.debug("Nothing to do");
    }
  });
};

ContextMenu.prototype.getMenuPosition = function(mouse, direction, scrollDir) {
  var win = $(window)[direction]();
  var scroll = $(window)[scrollDir]();
  var menu = $(this.getElement())[direction]();
  var position = mouse + scroll;

  // opening menu would pass the side of the page
  if (mouse + menu > win && menu < mouse) {
    position -= menu;
  }

  return position;
};

ContextMenu.prototype.hide = function() {
  $(this.getElement()).hide();
};

function extractDataOverlayIds(dataOverlays) {
  var ids = [];
  for (var i = 0; i < dataOverlays.length; i++) {
    ids.push(dataOverlays[i].getId());
  }
  return ids;
}

ContextMenu.prototype.createExportAsImageSubmenu = function() {
  var self = this;
  return ServerConnector.getImageConverters().then(function(converters) {
    var li = Functions.createElement({
      type : "li"
    });
    var submenu = new SubMenu({
      element : li,
      name : "Export as image",
      customMap : self.getMap()
    });

    var map = self.getMap();
    converters.forEach(function(converter) {
      submenu.addOption(converter.name, function() {
        return map.getVisibleDataOverlays().then(function(visibleDataOverlays) {

          return ServerConnector.getImageDownloadUrl({
            polygonString : map.getSelectedPolygon(),
            modelId : map.getActiveSubmapId(),
            handlerClass : converter.handler,
            backgroundOverlayId : map.getGoogleMap().getMapTypeId(),
            zoomLevel : map.getGoogleMap().getZoom(),
            overlayIds : extractDataOverlayIds(visibleDataOverlays),
          });
        }).then(function(url) {
          return self.downloadFile(url);
        }).then(null, GuiConnector.alert);
      });
    });
    return submenu;
  });
};

ContextMenu.prototype.createExportAsModelSubmenu = function() {
  var self = this;
  return ServerConnector.getModelConverters().then(function(converters) {
    var li = Functions.createElement({
      type : "li"
    });
    var submenu = new SubMenu({
      element : li,
      name : "Export as map",
      customMap : self.getMap()
    });

    var map = self.getMap();
    converters.forEach(function(converter) {
      submenu.addOption(converter.name, function() {
        return map.getVisibleDataOverlays().then(function(visibleDataOverlays) {
          return ServerConnector.getModelDownloadUrl({
            polygonString : map.getSelectedPolygon(),
            modelId : map.getActiveSubmapId(),
            handlerClass : converter.handler,
            backgroundOverlayId : map.getGoogleMap().getMapTypeId(),
            zoomLevel : map.getGoogleMap().getZoom(),
            overlayIds : extractDataOverlayIds(visibleDataOverlays),
          });
        }).then(function(url) {
          return self.downloadFile(url);
        }).then(null, GuiConnector.alert);
      });
    });
    return submenu;
  });
};

module.exports = ContextMenu;