Skip to content
Snippets Groups Projects
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;