From 626ae33c6e2a325535af6e19d3ff54cf13ed8291 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Wed, 25 Jan 2017 18:19:34 +0100
Subject: [PATCH] basic dialog functionality

---
 frontend-js/package.json                    |  1 +
 frontend-js/src/main/js/ServerConnector.js  |  8 +--
 frontend-js/src/main/js/gui/OverlayPanel.js |  7 ++-
 frontend-js/src/main/js/gui/Panel.js        | 68 +++++++++++++++++++++
 frontend-js/src/test/js/gui/Panel-test.js   | 43 +++++++++++++
 frontend-js/src/test/js/mocha-config.js     |  9 ++-
 web/src/main/webapp/index.xhtml             |  1 +
 7 files changed, 129 insertions(+), 8 deletions(-)
 create mode 100644 frontend-js/src/test/js/gui/Panel-test.js

diff --git a/frontend-js/package.json b/frontend-js/package.json
index 8821f0bfc6..432f0545ae 100644
--- a/frontend-js/package.json
+++ b/frontend-js/package.json
@@ -19,6 +19,7 @@
     "exorcist": "^0.4.0",
     "file-url": "^2.0.0",
     "jquery": "3.1.1",
+    "jquery-ui-dist": "^1.12.1",
     "jsdom": "^9.9.1",
     "jsdom-global": "^2.1.1",
     "jshint": "^2.9.4",
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 3219feb125..2a23da7d1f 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -150,12 +150,12 @@ ServerConnector.createGetParams = function(params) {
   var sorted = [], key;
   
   for (key in params) {
-      if (params.hasOwnProperty(key)) {
-        sorted.push(key);
-      }
+    if (params.hasOwnProperty(key)) {
+      sorted.push(key);
+    }
   }
   sorted.sort();
-  
+
   var result = "";
   for (var i = 0; i < sorted.length; i++) {
     if (params[sorted[i]]!==undefined) {
diff --git a/frontend-js/src/main/js/gui/OverlayPanel.js b/frontend-js/src/main/js/gui/OverlayPanel.js
index c95826c775..b1b5b6b1f9 100644
--- a/frontend-js/src/main/js/gui/OverlayPanel.js
+++ b/frontend-js/src/main/js/gui/OverlayPanel.js
@@ -139,8 +139,13 @@ OverlayPanel.prototype.createOverlayRow = function(overlay, checked) {
     var editTd = document.createElement("td");
     var editButton = document.createElement("button");
     editButton.onclick = function() {
-      throw new Error("Not implemented");
+      var content = document.createElement("div");
+      content.innerHTML = "test";
+      self.openDialog(content, {
+        id : overlay.getId()
+      });
     };
+    editButton.innerHTML = "<span class='ui-icon ui-icon-document'></span>";
     editTd.appendChild(editButton);
     result.appendChild(editTd);
   }
diff --git a/frontend-js/src/main/js/gui/Panel.js b/frontend-js/src/main/js/gui/Panel.js
index a76b309a9e..7969add44f 100644
--- a/frontend-js/src/main/js/gui/Panel.js
+++ b/frontend-js/src/main/js/gui/Panel.js
@@ -6,6 +6,7 @@ var GuiConnector = require('../GuiConnector');
 var ObjectWithListeners = require('../ObjectWithListeners');
 
 var logger = require('../logger');
+var fun = require('../Functions');
 
 function Panel(params) {
   ObjectWithListeners.call(this, params);
@@ -276,4 +277,71 @@ Panel.prototype.getElementByName = function(element, name) {
   return undefined;
 };
 
+Panel.prototype.getDialogDiv = function(id) {
+  var dialogs = this.getElementByName(this.getElement(), "dialogs");
+  if (dialogs === undefined) {
+    dialogs = document.createElement("div");
+    dialogs.setAttribute("name", "dialogs");
+    this.getElement().appendChild(dialogs);
+    
+    this._dialogs = [];
+  }
+
+  var dialogDiv = this._dialogs[id];
+
+  if (dialogDiv === undefined) {
+    dialogDiv = document.createElement("div");
+    dialogDiv.className = "ui-widget";
+    dialogDiv.setAttribute("name", "dialog-" + id);
+
+    var contentDiv = document.createElement("div");
+    contentDiv.setAttribute("name", "content");
+    dialogDiv.appendChild(contentDiv);
+
+    dialogs.appendChild(dialogDiv);
+    
+    this._dialogs[id]=dialogDiv;
+  }
+  return dialogDiv;
+};
+
+Panel.prototype.assignDialogOptions = function(div, params) {
+  var dialog = $(div);
+  for ( var key in params) {
+    if (params.hasOwnProperty(key)) {
+      if (key === "id") {
+        div.setAttribute("name", "dialog-" + params[key]);
+      } else if (key === "modal") {
+        dialog.dialog('option', 'modal', params[key]);
+      } else {
+        throw new Error("Unknown dialog param: " + key + " - " + params[key]);
+      }
+    }
+  }
+};
+
+Panel.prototype.openDialog = function(content, options) {
+  if (options === undefined) {
+    options = {};
+  }
+
+  if (options.id === undefined) {
+    logger.warn("Id of dialog is not defined");
+  }
+
+  var div = this.getDialogDiv(options.id);
+
+  this.assignDialogOptions(div, options);
+
+  var contentDiv = this.getElementByName(div, "content");
+  while (contentDiv.hasChildNodes()) {
+    contentDiv.removeChild(contentDiv.lastChild);
+  }
+  contentDiv.appendChild(content);
+  
+
+  $(div).dialog();
+  $(div).dialog("open");
+};
+
 module.exports = Panel;
diff --git a/frontend-js/src/test/js/gui/Panel-test.js b/frontend-js/src/test/js/gui/Panel-test.js
new file mode 100644
index 0000000000..2579466646
--- /dev/null
+++ b/frontend-js/src/test/js/gui/Panel-test.js
@@ -0,0 +1,43 @@
+"use strict";
+
+var Helper = require('../helper');
+
+require("../mocha-config.js");
+
+var Alias = require('../../../main/js/map/data/Alias');
+var Panel = require('../../../main/js/gui/Panel');
+
+var chai = require('chai');
+var assert = chai.assert;
+var logger = require('../logger');
+
+describe('SearchPanel', function() {
+
+  var helper;
+  before(function() {
+    helper = new Helper();
+  });
+
+  it('openDialog', function() {
+    var div = helper.createSearchTab();
+
+    var map = helper.createCustomMap();
+
+    var panel = new Panel({
+      element : div,
+      customMap : map
+    });
+
+    var content = document.createElement("div");
+    content.innerHTML = "some content";
+
+    var id = 1;
+    panel.openDialog(content, {
+      id : id
+    });
+
+    assert.ok(panel.getDialogDiv(id).innerHTML.indexOf("some content") >= 0);
+
+  });
+
+});
diff --git a/frontend-js/src/test/js/mocha-config.js b/frontend-js/src/test/js/mocha-config.js
index e1537029e7..41279fa5d0 100644
--- a/frontend-js/src/test/js/mocha-config.js
+++ b/frontend-js/src/test/js/mocha-config.js
@@ -5,6 +5,10 @@ var Cookies = require('js-cookie');
 
 
 // GLOBAL configuration
+global.navigator = {
+    userAgent : 'node.js'
+  };
+
 var jsdom = require('jsdom');
 global.document = jsdom.jsdom(undefined);
 global.window = document.defaultView;
@@ -13,6 +17,8 @@ global.$ = require('jQuery');
 global.jQuery = $;
 global.window.$ = $;
 
+require('jquery-ui-dist/jquery-ui.js')
+
 require("bootstrap");
 
 
@@ -21,9 +27,6 @@ global.google = require('./google-map-mock');
 global.GuiConnector = require('./GuiConnector-mock');
 global.ServerConnector = require('./ServerConnector-mock');
 
-global.navigator = {
-  userAgent : 'node.js'
-};
 
 // -----------------------------
 
diff --git a/web/src/main/webapp/index.xhtml b/web/src/main/webapp/index.xhtml
index ea90c402fa..3abc35faa5 100644
--- a/web/src/main/webapp/index.xhtml
+++ b/web/src/main/webapp/index.xhtml
@@ -21,6 +21,7 @@
 	<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"/>
 	<script src="http://twitter.github.io/typeahead.js/releases/latest/typeahead.bundle.min.js" type="text/javascript"/>
 
+  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
 
 	
 	<link rel="shortcut icon" href="./resources/images/favicon.png" type="image/png" />
-- 
GitLab