-
Piotr Gawron authoredPiotr Gawron authored
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;