-
Piotr Gawron authoredPiotr Gawron authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AddOverlayDialog.js 7.53 KiB
"use strict";
/* exported logger */
var AbstractGuiElement = require('./AbstractGuiElement');
var Annotation = require('../map/data/Annotation');
var GuiConnector = require('../GuiConnector');
var GuiUtils = require('./leftPanel/GuiUtils');
var LayoutData = require('../map/data/LayoutData');
var NetworkError = require('../NetworkError');
var Functions = require('../Functions');
var logger = require('../logger');
var HttpStatus = require('http-status-codes');
var guiUtils = new (require('./leftPanel/GuiUtils'))();
function AddOverlayDialog(params) {
AbstractGuiElement.call(this, params);
var self = this;
self.registerListenerType("onAddOverlay");
self.createGui();
}
AddOverlayDialog.prototype = Object.create(AbstractGuiElement.prototype);
AddOverlayDialog.prototype.constructor = AddOverlayDialog;
AddOverlayDialog.prototype.createGui = function() {
var self = this;
var guiUtils = new GuiUtils();
var fileContent = null;
var content = document.createElement("div");
content.style.width = "100%";
content.style.height = "100%";
content.appendChild(guiUtils.createLabel("Name: "));
var nameInput = Functions.createElement({
type : "input",
inputType : "text",
name : "overlay-name",
});
content.appendChild(nameInput);
content.appendChild(guiUtils.createNewLine());
content.appendChild(guiUtils.createLabel("Description: "));
content.appendChild(guiUtils.createNewLine());
var descriptionInput = Functions.createElement({
type : "textarea",
name : "overlay-description",
});
content.appendChild(descriptionInput);
content.appendChild(guiUtils.createNewLine());
content.appendChild(guiUtils.createLabel("Upload file: "));
var fileInput = Functions.createElement({
type : "input",
inputType : "file",
name : "overlay-file",
});
fileInput.addEventListener("change", function() {
return self.processFile(fileInput.files[0]);
}, false);
content.appendChild(fileInput);
content.appendChild(guiUtils.createNewLine());
content.appendChild(guiUtils.createLabel("Or provide list of elements here (one per line): "));
content.appendChild(guiUtils.createNewLine());
var contentInput = Functions.createElement({
type : "textarea",
name : "overlay-content",
});
content.appendChild(contentInput);
content.appendChild(guiUtils.createNewLine());
self.getElement().appendChild(content);
};
AddOverlayDialog.prototype.processFile = function(file) {
var self = this;
self.setFileContent(null);
if (file) {
return new Promise(function(resolve, reject) {
var reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = function(evt) {
try {
self.setFileContent(evt.target.result);
var data = self.parseFile(evt.target.result);
var nameInput = $("[name='overlay-name']", self.getElement())[0];
var descriptionInput = $("[name='overlay-description']", self.getElement())[0];
if (data.name !== undefined) {
nameInput.value = data.name;
} else {
var filename = $("[name='overlay-file']", self.getElement())[0].value;
if (filename.indexOf(".") > 0) {
filename = filename.substr(0, filename.indexOf("."));
}
if (filename.lastIndexOf("\\") >= 0) {
filename = filename.substr(filename.lastIndexOf("\\") + 1);
}
nameInput.value = filename;
}
if (data.description !== undefined) {
descriptionInput.value = data.description;
}
resolve(self.getFileContent());
} catch (error) {
reject(error);
}
};
reader.onerror = function() {
reject(new Error("Problem reading file"));
};
});
} else {
return Promise.resolve(null);
}
};
AddOverlayDialog.prototype.setFileContent = function(fileContent) {
this._fileContent = fileContent;
};
AddOverlayDialog.prototype.getFileContent = function() {
var self = this;
var contentInput = $("[name='overlay-content']", self.getElement())[0];
if (contentInput.value !== undefined && contentInput.value !== null) {
contentInput.value = contentInput.value.trim();
if (contentInput.value !== "") {
self._fileContent = contentInput.value;
}
}
if (self._fileContent === undefined) {
return null;
} else {
return self._fileContent;
}
};
AddOverlayDialog.prototype.init = function() {
return Promise.resolve();
};
AddOverlayDialog.prototype.addOverlay = function() {
var self = this;
var nameInput = $("[name='overlay-name']", self.getElement())[0];
var descriptionInput = $("[name='overlay-description']", self.getElement())[0];
var filename = $("[name='overlay-file']", self.getElement())[0].value;
var overlay = new LayoutData({
name : nameInput.value,
description : descriptionInput.value,
content : self.getFileContent(),
filename : filename,
});
GuiConnector.showProcessing();
return ServerConnector.addOverlay(overlay).then(function(result) {
overlay = result;
GuiConnector.hideProcessing();
return self.callListeners("onAddOverlay", overlay);
});
};
AddOverlayDialog.prototype.destroy = function() {
$(this.getElement()).dialog("destroy");
};
AddOverlayDialog.prototype.open = function() {
var self = this;
var div = self.getElement();
if (!$(div).hasClass("ui-dialog-content")) {
var buttons = [ {
text : "UPLOAD",
click : function() {
var dialog = this;
var fileContent = self.getFileContent();
if (fileContent === null) {
GuiConnector.alert("Neither file was selected nor data was entered");
} else if (fileContent.length > 1024 * 256) {
GuiConnector.alert("File to big.<br>Please reduce file size or contact administrators.");
} else {
return self.addOverlay().then(function(result) {
$(dialog).dialog("close");
return result;
}, function(error) {
GuiConnector.hideProcessing();
if (error instanceof NetworkError && error.statusCode === HttpStatus.BAD_REQUEST) {
var errorMessage = JSON.parse(error.content);
GuiConnector.alert("Problematic input: <br/>" + errorMessage.reason);
} else {
GuiConnector.alert(error);
}
});
}
}
}, {
text : "CANCEL",
click : function() {
$(this).dialog("close");
}
} ];
$(div).dialog({
title : "Add overlay",
buttons : buttons,
modal : true,
});
}
$(div).dialog("open");
};
AddOverlayDialog.prototype.parseFile = function(fileContent) {
var result = {};
var lines = fileContent.split("\n");
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (line.startsWith("#")) {
if (line.indexOf("=") > 0) {
var name = line.substring(1, line.indexOf("=")).trim();
var value = line.substring(line.indexOf("=") + 1).trim();
if (name === "NAME") {
result.name = value;
} else if (name === "DESCRIPTION") {
result.description = value;
} else if (name === "TYPE") {
result.type = value;
}
} else {
logger.warn("Invalid overlay header line: " + line);
}
} else {
break;
}
}
return result;
};
module.exports = AddOverlayDialog;