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

/* exported logger */

var Promise = require("bluebird");

var AbstractGuiElement = require('./AbstractGuiElement');
var Alias = require('../map/data/Alias');
var Reaction = require('../map/data/Reaction');
var logger = require('../logger');
var Functions = require('../Functions');

function CommentDialog(params) {
  AbstractGuiElement.call(this, params);
  var self = this;
  self._createGui();
  $(self.getElement()).dialog({
    autoOpen : false,
    resizable : false,
    width : window.innerWidth / 2,
    height : window.innerHeight / 2,
  });
}

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

CommentDialog.GENERAL = "<General>";

function createRow(elements) {
  var row = document.createElement('tr');
  for (var i = 0; i < elements.length; i++) {
    var container = document.createElement('td');
    container.appendChild(elements[i]);
    row.appendChild(container);
  }
  return row;
}

CommentDialog.prototype.open = function(types) {
  var self = this;
  self.setTypes([ CommentDialog.GENERAL ]);

  var promises = [ CommentDialog.GENERAL ];
  for (var i = 0; i < types.length; i++) {
    var ie = types[i];
    if (ie.getType() === "ALIAS") {
      promises.push(self.getMap().getSubmapById(ie.getModelId()).getModel().getAliasById(ie.getId(), true));
    } else if (ie.getType() === "REACTION") {
      promises.push(self.getMap().getSubmapById(ie.getModelId()).getModel().getReactionById(ie.getId(), true));
    } else {
      throw new Error("Unknown element type: " + ie.getType());
    }
  }
  return Promise.all(promises).then(function(elements) {
    self.setTypes(elements);
    return ServerConnector.getLoggedUser();
  }).then(function(user) {
    if (user.getLogin() !== "anonymous") {
      self.setEmail(user.getEmail());
      self.setName(user.getName() + " " + user.getSurname());
    }

    $(self.getElement()).dialog("open");
  });
};

CommentDialog.prototype._createGui = function() {
  var self = this;
  var table = document.createElement('table');

  var typeLabel = document.createElement('label');
  typeLabel.innerHTML = "Type";
  var typeOptions = document.createElement("select");
  this.setTypeOptions(typeOptions);

  table.appendChild(createRow([ typeLabel, typeOptions ]));

  var detailDiv = document.createElement('div');

  table.appendChild(createRow([ document.createElement('div'), detailDiv ]));

  var pinnedLabel = document.createElement('label');
  pinnedLabel.innerHTML = "Pinned";
  var pinnedCheckbox = document.createElement('input');
  pinnedCheckbox.type = "checkbox";

  table.appendChild(createRow([ pinnedLabel, pinnedCheckbox ]));
  this.setPinnedCheckbox(pinnedCheckbox);

  var nameLabel = document.createElement('label');
  nameLabel.innerHTML = "Name:<br/>(Visible to moderators only)";
  var nameInput = document.createElement('input');
  nameInput.type = "text";

  table.appendChild(createRow([ nameLabel, nameInput ]));
  this.setNameInput(nameInput);

  var emailLabel = document.createElement('label');
  emailLabel.innerHTML = "Email:<br/>(Visible to moderators only)";
  var emailInput = document.createElement('input');
  emailInput.type = "text";

  table.appendChild(createRow([ emailLabel, emailInput ]));
  this.setEmailInput(emailInput);

  var contentLabel = document.createElement('label');
  contentLabel.innerHTML = "Content:";
  var contentInput = document.createElement('textarea');
  contentInput.cols = "80";
  contentInput.rows = "3";

  table.appendChild(createRow([ contentLabel, contentInput ]));
  this.setContentInput(contentInput);

  var sendButton = document.createElement('button');
  sendButton.innerHTML = "Send";
  sendButton.onclick = function() {
    return self.addComment().then(function() {
      $(self.getElement()).dialog("close");
    });
  };

  table.appendChild(createRow([ sendButton ]));

  self.getElement().appendChild(table);

  typeOptions.onchange = function() {
    var option = self.getSelectedType();
    var text = "";
    if (option instanceof Alias) {
      if (option.getFullName() !== undefined) {
        text = option.getFullName();
      }
    } else if (option instanceof Reaction) {
      text = "Reactants: ";
      var reactants = option.getReactants();
      var i;
      for (i = 0; i < reactants.length; i++) {
        text += reactants[i].getName() + ",";
      }
      text += "<br/>";
      text += "Modifiers: ";
      var modifiers = option.getModifiers();
      for (i = 0; i < modifiers.length; i++) {
        text += modifiers[i].getName() + ",";
      }
      text += "<br/>";
      text += "Products: ";
      var products = option.getProducts();
      for (i = 0; i < products.length; i++) {
        text += products[i].getName() + ",";
      }
      text += "<br/>";
    }
    detailDiv.innerHTML = text;
  };
};
CommentDialog.prototype.setTypes = function(types) {
  var typeOptions = this.getTypeOptions();
  while (typeOptions.firstChild) {
    typeOptions.removeChild(typeOptions.firstChild);
  }

  for (var i = 0; i < types.length; i++) {
    var option = document.createElement("option");
    option.value = i;
    var element = types[i];
    var text = element;
    if (element instanceof Alias) {
      text = element.getType() + ": " + element.getName();
    } else if (element instanceof Reaction) {
      text = "Reaction: " + element.getReactionId();
    }
    option.text = text;
    typeOptions.appendChild(option);
  }
  typeOptions.value = 0;

  this._types = types;
};

CommentDialog.prototype.getTypes = function() {
  return this._types;
};

CommentDialog.prototype.getSelectedType = function() {
  return this._types[this.getTypeOptions().value];
};

CommentDialog.prototype.setSelectedType = function(value) {
  if (Functions.isInt(value)) {
    this.getTypeOptions().value = value;
    this.getTypeOptions().onchange();
  } else {
    throw new Error("Unknown value type: " + value);
  }
};

CommentDialog.prototype.getTypeOptions = function() {
  return this._typeOptions;
};
CommentDialog.prototype.setTypeOptions = function(typeOptions) {
  this._typeOptions = typeOptions;
};
CommentDialog.prototype.setContentInput = function(contentInput) {
  this._contentInput = contentInput;
};
CommentDialog.prototype.getContentInput = function() {
  return this._contentInput;
};
CommentDialog.prototype.setNameInput = function(nameInput) {
  this._nameInput = nameInput;
};
CommentDialog.prototype.getNameInput = function() {
  return this._nameInput;
};
CommentDialog.prototype.setEmailInput = function(emailInput) {
  this._emailInput = emailInput;
};
CommentDialog.prototype.getEmailInput = function() {
  return this._emailInput;
};
CommentDialog.prototype.setPinnedCheckbox = function(pinnedCheckbox) {
  this._pinnedCheckbox = pinnedCheckbox;
};

CommentDialog.prototype.getPinnedCheckbox = function() {
  return this._pinnedCheckbox;
};

CommentDialog.prototype.getTypes = function() {
  return this._types;
};

CommentDialog.prototype.setName = function(name) {
  this.getNameInput().value = name;
};

CommentDialog.prototype.getName = function() {
  return this.getNameInput().value;
};

CommentDialog.prototype.getEmail = function() {
  return this.getEmailInput().value;
};

CommentDialog.prototype.setEmail = function(email) {
  this.getEmailInput().value = email;
};

CommentDialog.prototype.getContent = function() {
  return this.getContentInput().value;
};

CommentDialog.prototype.isPinned = function() {
  return this.getPinnedCheckbox().checked;
};
CommentDialog.prototype.getSelectedTypeId = function() {
  var selected = this.getSelectedType();
  if (selected instanceof Alias) {
    return selected.getId();
  } else if (selected instanceof Reaction) {
    return selected.getId();
  } else {
    return "";
  }
};

CommentDialog.prototype.getSelectedTypeClass = function() {
  var selected = this.getSelectedType();
  if (selected instanceof Alias) {
    return "ALIAS";
  } else if (selected instanceof Reaction) {
    return "REACTION";
  } else {
    return "POINT";
  }
};

CommentDialog.prototype.addComment = function() {
  var self = this;
  var name = self.getName();
  return ServerConnector.addComment({
    modelId : self.getMap().getActiveSubmapId(),
    coordinates : self.getMap().getActiveSubmapClickCoordinates(),
    name : name,
    email : self.getEmail(),
    content : self.getContent(),
    pinned : self.isPinned(),
    elementId : self.getSelectedTypeId(),
    elementType : self.getSelectedTypeClass()

  }).then(function(comment){
    return self.getMap().getOverlayByName("comment").addComment(comment);
  });
};

CommentDialog.prototype.destroy = function() {
  $(this.getElement()).dialog("destroy");
};

module.exports = CommentDialog;