From 50fab883f357958b67b2862ed502dc78e7a93ec7 Mon Sep 17 00:00:00 2001
From: Athanasios <ath.kouk.oid@gmail.com>
Date: Fri, 17 Jul 2020 20:03:04 +0200
Subject: [PATCH] add temporary layers

---
 index.html                        | 54 +++++++++++++++++++++++++---
 lib/helpers/RequestWrapper.js     |  4 +--
 lib/main.js                       | 24 ++++++++++---
 lib/state/BoundingBoxDefined.js   |  9 +++++
 lib/state/BoundingBoxDefining.js  |  9 +++++
 lib/state/BoundingBoxUndefined.js | 12 +++++--
 lib/state/ExceptionReturned.js    | 57 +++++++++++++++++++++++++++++
 lib/state/FreezeScene.js          | 16 +++++++--
 lib/state/LayerSelected.js        |  9 ++++-
 lib/state/NoLayerSelected.js      |  8 +++++
 lib/state/NothingSelected.js      | 57 +++++++++++++++++++++++++++++
 lib/state/Operations.js           | 35 ++++++++++++++++--
 lib/state/SceneRendered.js        |  9 +++++
 lib/state/State.js                | 11 +++++-
 lib/state/StateFactory.js         | 30 ++++++++++++++--
 lib/state/TemporaryLayerAdded.js  | 60 +++++++++++++++++++++++++++++++
 lib/state/UnfreezeScene.js        | 55 ++++++++++++++++++++++++++++
 lib/state/WaitingForPortrayal.js  |  8 +++++
 18 files changed, 446 insertions(+), 21 deletions(-)
 create mode 100644 lib/state/ExceptionReturned.js
 create mode 100644 lib/state/NothingSelected.js
 create mode 100644 lib/state/TemporaryLayerAdded.js
 create mode 100644 lib/state/UnfreezeScene.js

diff --git a/index.html b/index.html
index 07526ac..a2501e7 100644
--- a/index.html
+++ b/index.html
@@ -19,7 +19,7 @@
 
 <body>
   <div id="wrapper">
-    <div id="sidebar">
+    <div id="sidebar" class="overflow-hidden">
       <form>
         <div class="form-row">
 
@@ -43,10 +43,15 @@
             <select class="form-control" id="layersList" size="10"></select>
           </div>
 
-          <div class="form-group col-12">
+          <div class="form-group col-6">
             <button id="getLayers" class="btn btn-primary btn-block" type="button">Get Layers</button>
           </div>
 
+          <div class="form-group col-6">
+            <button id="showAddTempLayer" class="btn btn-primary btn-block" type="button" data-toggle="modal"
+              data-target="#exampleModalCenter">Add Layer</button>
+          </div>
+
           <div class="form-group col-12">
             <label>bounding box</label>
             <input id="boundingBoxInput" type="text" class="form-control" />
@@ -55,7 +60,7 @@
           <div class="form-group col-6">
             <button id="setBoundingBox" class="btn btn-primary btn-block" type="button">Set</button>
           </div>
-          
+
           <div class="form-group col-6">
             <button id="clearBoundingBox" class="btn btn-primary btn-block" type="button">Clear</button>
           </div>
@@ -84,6 +89,37 @@
       <div id="statusBarLoader" class="loader"></div>
     </div>
   </div>
+
+  <div class="modal" id="addTempLayerModal" tabindex="-1" role="dialog">
+    <div class="modal-dialog modal-dialog-centered" role="document">
+      <div class="modal-content">
+        <div class="modal-header">
+          <h5 class="modal-title" id="exampleModalLongTitle">Layer properties</h5>
+        </div>
+        <div class="modal-body">
+          <form>
+            <div class="form-group row">
+              <label class="col-2">Name</label>
+              <div class="col-10">
+                <input type="text" class="form-control" id="tempLayerName">
+              </div>
+            </div>
+            <div class="form-group row">
+              <label class="col-2">URL</label>
+              <div class="col-10">
+                <input type="text" class="form-control" id="tempLayerUrl">
+              </div>
+            </div>
+          </form>
+        </div>
+        <div class="modal-footer">
+          <button id="addTempLayer" type="button" class="btn btn-primary" data-dismiss="modal">Add</button>
+          <button id="cancelTempLayer" type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
+        </div>
+      </div>
+    </div>
+  </div>
+
 </body>
 <script src="lib/jquery/jquery-3.1.1.min.js"></script>
 <script src="lib/bootstrap/bootstrap.min.js"></script>
@@ -100,7 +136,17 @@
       { name: "mappers", location: "lib/mappers" },
       { name: "gui", location: "lib/gui" },
       { name: "style", location: "lib/style" }
-    ]
+    ],
+    app: {
+      host: "81.169.187.7",
+      port: "9001",
+      endpoint: "service/v1"
+    },
+    devel: {
+      host: "localhost",
+      port: "9000",
+      endpoint: "service/v1"
+    }
   };
 </script>
 <script src="http://ajax.googleapis.com/ajax/libs/dojo/1.12.2/dojo/dojo.js"></script>
diff --git a/lib/helpers/RequestWrapper.js b/lib/helpers/RequestWrapper.js
index 426c1a3..396b0b7 100644
--- a/lib/helpers/RequestWrapper.js
+++ b/lib/helpers/RequestWrapper.js
@@ -70,13 +70,13 @@ define([
           } catch (e) {
             NodeCache.clearAll();
             StatusBar.endProcess();
-            topic.publish("PortrayalResponseHandled", "BoundingBoxUndefined");
+            topic.publish("PortrayalResponseHandled", "ExceptionReturned");
           }
 
         }, function (err) {
           NodeCache.clearAll();
           StatusBar.endProcess();
-          topic.publish("PortrayalResponseHandled", "BoundingBoxUndefined");
+          topic.publish("PortrayalResponseHandled", "ExceptionReturned");
         });
 
     }
diff --git a/lib/main.js b/lib/main.js
index f920aa2..5cf6819 100644
--- a/lib/main.js
+++ b/lib/main.js
@@ -1,5 +1,6 @@
 require([
   "dojo/topic",
+  "dojo/_base/config",
   "CesiumAdaptor/CesiumViewer",
   "helpers/NodeCache",
   "style/NodeStyler",
@@ -10,7 +11,7 @@ require([
   "state/State",
   "state/Operations",
   "dojo/domReady!"
-], function (topic, CesiumViewer, NodeCache, NodeStyler, DefaultStyle, NodeLevelStyle, Legend, Timeout, State, Operations) {
+], function (topic, config, CesiumViewer, NodeCache, NodeStyler, DefaultStyle, NodeLevelStyle, Legend, Timeout, State, Operations) {
 
   Cesium.BingMapsApi.defaultKey = "AmdoJEIiP8BcA__QO9SjBAgv4h73-uiH4lGinmzwyfjK-Fjs8t7GbmfpFjmyj1cl";
   let osm = Cesium.createOpenStreetMapImageryProvider({
@@ -45,9 +46,9 @@ require([
   let operations = new Operations();
   let state = new State(operations);
 
-  $("#host").val("81.169.187.7");
-  $("#port").val("9001");
-  $("#endpoint").val("service/v1");
+  $("#host").val(config.app.host);
+  $("#port").val(config.app.port);
+  $("#endpoint").val(config.app.endpoint);
 
   $("#request").click(function (event) {
     event.preventDefault();
@@ -105,4 +106,17 @@ require([
     state.getLayers();
   });
 
-});
\ No newline at end of file
+  $("#showAddTempLayer").click(function (event) {
+    state.showAddTempLayer();
+  });
+
+  $("#addTempLayer").click(function (event) {
+    state.addTempLayer();
+  });
+
+  $("#cancelTempLayer").click(function (event) {
+    $("#tempLayerName").val("");
+    $("#tempLayerUrl").val("");
+  });
+
+});
diff --git a/lib/state/BoundingBoxDefined.js b/lib/state/BoundingBoxDefined.js
index fc604cd..29da00c 100644
--- a/lib/state/BoundingBoxDefined.js
+++ b/lib/state/BoundingBoxDefined.js
@@ -44,8 +44,17 @@ define([
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
     }
 
+
   });
 
 });
\ No newline at end of file
diff --git a/lib/state/BoundingBoxDefining.js b/lib/state/BoundingBoxDefining.js
index 6645a86..07caca7 100644
--- a/lib/state/BoundingBoxDefining.js
+++ b/lib/state/BoundingBoxDefining.js
@@ -37,8 +37,17 @@ define([
 
     gettingLayers: function (target) {
       // no-op
+    },
+
+    showAddTempLayer: function (target) {
+      // no-op
+    },
+
+    addTempLayer: function (target) {
+      // no-op
     }
 
+
   });
 
 });
\ No newline at end of file
diff --git a/lib/state/BoundingBoxUndefined.js b/lib/state/BoundingBoxUndefined.js
index 0078b33..9d2ef85 100644
--- a/lib/state/BoundingBoxUndefined.js
+++ b/lib/state/BoundingBoxUndefined.js
@@ -34,14 +34,22 @@ define([
     },
 
     selectingLayer: function (target, layer) {
+      target.operations.clear();
       target.operations.selectLayer(layer);
-      target.operations.invokeRequest({ layer: layer });
-      target.changeState("WaitingForPortrayal");
+      target.changeState("LayerSelected");
     },
 
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
     }
 
   });
diff --git a/lib/state/ExceptionReturned.js b/lib/state/ExceptionReturned.js
new file mode 100644
index 0000000..25463e2
--- /dev/null
+++ b/lib/state/ExceptionReturned.js
@@ -0,0 +1,57 @@
+define([
+  "dojo/_base/declare",
+  "helpers/NodeCache"
+], function (declare, NodeCache) {
+
+  return declare(null, {
+
+    constructor: function () {
+
+    },
+
+    init(target, bb) {
+      bb.clear();
+      NodeCache.clearAll();
+      $("#boundingBoxInput").val("");
+      $('#toggleFreezeScene').prop('checked', false);
+      $('#toggleFreezeScene').prop('disabled', true);
+    },
+
+    settingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    clearingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    makingRequest: function (target) {
+      // no-op
+    },
+
+    toggleFreezingScene: function (target) {
+      // no-op
+    },
+
+    selectingLayer: function (target, layer) {
+      target.operations.clear();
+      target.operations.selectLayer(layer);
+      target.changeState("LayerSelected");
+    },
+
+    gettingLayers: function (target) {
+      target.operations.getLayers();
+      target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
+    }
+
+  });
+
+});
\ No newline at end of file
diff --git a/lib/state/FreezeScene.js b/lib/state/FreezeScene.js
index 0933936..e5ccb01 100644
--- a/lib/state/FreezeScene.js
+++ b/lib/state/FreezeScene.js
@@ -20,7 +20,11 @@ define([
     },
 
     clearingBoundingBox: function (target, bb) {
-      // no-op
+      if (bb.isDefined()) {
+        target.operations.clearBoundingBox();
+        target.changeState("LayerSelected");
+        target.makeRequest();
+      }
     },
 
     makingRequest: function (target) {
@@ -28,7 +32,7 @@ define([
     },
 
     toggleFreezingScene: function (target) {
-      target.changeState("BoundingBoxDefined");
+      target.changeState("UnfreezeScene");
     },
 
     selectingLayer: function (target, layer) {
@@ -40,6 +44,14 @@ define([
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
     }
 
   });
diff --git a/lib/state/LayerSelected.js b/lib/state/LayerSelected.js
index 43ea040..627e7d2 100644
--- a/lib/state/LayerSelected.js
+++ b/lib/state/LayerSelected.js
@@ -35,13 +35,20 @@ define([
     },
 
     selectingLayer: function (target, layer) {
-      console.log("hihoho");
       target.operations.selectLayer(layer);
     },
 
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      // no-op
+    },
+
+    addTempLayer: function (target) {
+      // no-op
     }
 
   });
diff --git a/lib/state/NoLayerSelected.js b/lib/state/NoLayerSelected.js
index fa2945b..6686e20 100644
--- a/lib/state/NoLayerSelected.js
+++ b/lib/state/NoLayerSelected.js
@@ -43,6 +43,14 @@ define([
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
     }
 
   });
diff --git a/lib/state/NothingSelected.js b/lib/state/NothingSelected.js
new file mode 100644
index 0000000..8afa674
--- /dev/null
+++ b/lib/state/NothingSelected.js
@@ -0,0 +1,57 @@
+define([
+  "dojo/_base/declare",
+  "helpers/NodeCache"
+], function (declare, NodeCache) {
+
+  return declare(null, {
+
+    constructor: function () {
+
+    },
+
+    init(target, bb) {
+      bb.clear();
+      NodeCache.clearAll();
+      target.operations.clear();
+      $("#layersList").empty();
+      $("#boundingBoxInput").val("");
+      $('#toggleFreezeScene').prop('checked', false);
+      $('#toggleFreezeScene').prop('disabled', true);
+    },
+
+    settingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    clearingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    makingRequest: function (target) {
+      // no-op
+    },
+
+    toggleFreezingScene: function (target) {
+      // no-op
+    },
+
+    selectingLayer: function (target, layer) {
+      // no-op
+    },
+
+    gettingLayers: function (target) {
+      target.operations.getLayers();
+      target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
+    }
+
+  });
+
+});
\ No newline at end of file
diff --git a/lib/state/Operations.js b/lib/state/Operations.js
index 2959cb3..49ef1de 100644
--- a/lib/state/Operations.js
+++ b/lib/state/Operations.js
@@ -4,8 +4,9 @@ define([
   "helpers/UrlBuilder",
   "CesiumAdaptor/CesiumViewer",
   "helpers/Layers",
-  "helpers/RequestWrapper"
-], function (declare, request, UrlBuilder, CesiumViewer, Layers, RequestWrapper) {
+  "helpers/RequestWrapper",
+  "dojo/topic"
+], function (declare, request, UrlBuilder, CesiumViewer, Layers, RequestWrapper, topic) {
 
   return declare(null, {
 
@@ -84,6 +85,36 @@ define([
 
     clearBoundingBox: function () {
       this._bb = null;
+    },
+
+    showAddTempLayer: function () {
+      $('#addTempLayerModal').modal('show');
+    },
+
+    addTempLayer: function () {
+
+      let data = {
+        name: $("#tempLayerName").val(),
+        url: $("#tempLayerUrl").val()
+      };
+
+      $("#tempLayerName").val("");
+      $("#tempLayerUrl").val("");
+
+      let url = new UrlBuilder(location.protocol.slice(0, -1), $("#host").val())
+        .port($("#port").val())
+        .path("tempassets")
+        .build();
+
+      request.post(url, {
+        headers: {
+          "Content-Type": "application/json"
+        },
+        data: JSON.stringify(data),
+      }).then(function (message) {
+        topic.publish("TempLayerAdded", "TemporaryLayerAdded");
+      });
+
     }
 
   });
diff --git a/lib/state/SceneRendered.js b/lib/state/SceneRendered.js
index ed44a3c..014c91a 100644
--- a/lib/state/SceneRendered.js
+++ b/lib/state/SceneRendered.js
@@ -46,8 +46,17 @@ define([
     gettingLayers: function (target) {
       target.operations.getLayers();
       target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
     }
 
+
   });
 
 });
\ No newline at end of file
diff --git a/lib/state/State.js b/lib/state/State.js
index f38218d..1278569 100644
--- a/lib/state/State.js
+++ b/lib/state/State.js
@@ -10,10 +10,11 @@ define([
     constructor: function (operations) {
       this.operations = operations;
       this._stateFactory = new StateFactory();
-      this._current = this._stateFactory.createState("NoLayerSelected");
+      this._current = this._stateFactory.createState("NothingSelected");
       this._boundingBox = new BoundingBox();
       topic.subscribe("BoundingBoxCreated", this.changeState.bind(this));
       topic.subscribe("PortrayalResponseHandled", this.changeState.bind(this));
+      topic.subscribe("TempLayerAdded", this.changeState.bind(this));
     },
 
     setBoundingBox: function () {
@@ -49,6 +50,14 @@ define([
       this._current.gettingLayers(this);
     },
 
+    showAddTempLayer: function () {
+      this._current.showAddTempLayer(this);
+    },
+
+    addTempLayer: function () {
+      this._current.addTempLayer(this);
+    }
+
   });
 
 });
\ No newline at end of file
diff --git a/lib/state/StateFactory.js b/lib/state/StateFactory.js
index bc74637..ac3265f 100644
--- a/lib/state/StateFactory.js
+++ b/lib/state/StateFactory.js
@@ -1,5 +1,6 @@
 define([
   "dojo/_base/declare",
+  "state/NothingSelected",
   "state/NoLayerSelected",
   "state/LayerSelected",
   "state/BoundingBoxUndefined",
@@ -7,8 +8,25 @@ define([
   "state/BoundingBoxDefined",
   "state/WaitingForPortrayal",
   "state/FreezeScene",
-  "state/SceneRendered"
-], function (declare, NoLayerSelected, LayerSelected, BoundingBoxUndefined, BoundingBoxDefining, BoundingBoxDefined, WaitingForPortrayal, FreezeScene, SceneRendered) {
+  "state/UnfreezeScene",
+  "state/SceneRendered",
+  "state/ExceptionReturned",
+  "state/TemporaryLayerAdded"
+], function (
+  declare,
+  NothingSelected,
+  NoLayerSelected,
+  LayerSelected,
+  BoundingBoxUndefined,
+  BoundingBoxDefining,
+  BoundingBoxDefined,
+  WaitingForPortrayal,
+  FreezeScene,
+  UnfreezeScene,
+  SceneRendered,
+  ExceptionReturned,
+  TemporaryLayerAdded
+) {
 
   return declare(null, {
 
@@ -18,6 +36,8 @@ define([
 
     createState: function (stateName) {
       switch (stateName) {
+        case "NothingSelected":
+          return new NothingSelected();
         case "NoLayerSelected":
           return new NoLayerSelected();
         case "LayerSelected":
@@ -32,8 +52,14 @@ define([
           return new WaitingForPortrayal();
         case "FreezeScene":
           return new FreezeScene();
+        case "UnfreezeScene":
+          return new UnfreezeScene();
         case "SceneRendered":
           return new SceneRendered();
+        case "ExceptionReturned":
+          return new ExceptionReturned();
+        case "TemporaryLayerAdded":
+          return new TemporaryLayerAdded();
         default:
           return new NoLayerSelected();
       }
diff --git a/lib/state/TemporaryLayerAdded.js b/lib/state/TemporaryLayerAdded.js
new file mode 100644
index 0000000..f95f734
--- /dev/null
+++ b/lib/state/TemporaryLayerAdded.js
@@ -0,0 +1,60 @@
+define([
+  "dojo/_base/declare",
+  "helpers/NodeCache"
+], function (declare, NodeCache) {
+
+  return declare(null, {
+
+    constructor: function () {
+
+    },
+
+    init(target, bb) {
+      bb.clear();
+      NodeCache.clearAll();
+      target.operations.clear();
+      $("#layersList").empty();
+      $("#boundingBoxInput").val("");
+      $('#toggleFreezeScene').prop('checked', false);
+      $('#toggleFreezeScene').prop('disabled', true);
+      target.getLayers();
+    },
+
+    settingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    clearingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    makingRequest: function (target) {
+      // no-op
+    },
+
+    toggleFreezingScene: function (target) {
+      // no-op
+    },
+
+    selectingLayer: function (target, layer) {
+      target.operations.clear();
+      target.operations.selectLayer(layer);
+      target.changeState("LayerSelected");
+    },
+
+    gettingLayers: function (target) {
+      target.operations.getLayers();
+      target.changeState("NoLayerSelected");
+    },
+
+    showAddTempLayer: function (target) {
+      target.operations.showAddTempLayer();
+    },
+
+    addTempLayer: function (target) {
+      target.operations.addTempLayer();
+    }
+
+  });
+
+});
\ No newline at end of file
diff --git a/lib/state/UnfreezeScene.js b/lib/state/UnfreezeScene.js
new file mode 100644
index 0000000..341b91e
--- /dev/null
+++ b/lib/state/UnfreezeScene.js
@@ -0,0 +1,55 @@
+define([
+  "dojo/_base/declare",
+  "helpers/NodeCache"
+], function (declare, NodeCache) {
+
+  return declare(null, {
+
+    constructor: function () { },
+
+    init(target, bb) {
+      // bb.unregister();
+      NodeCache.clearAll();
+      // $("#boundingBoxInput").val(bb.toString());
+      $('#toggleFreezeScene').prop('checked', false);
+      $("#toggleFreezeScene").prop("disabled", false);
+      // target.operations.setBoundingBox(bb.toString());
+      target.makeRequest();
+    },
+
+    settingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    clearingBoundingBox: function (target, bb) {
+      // no-op
+    },
+
+    makingRequest: function (target) {
+      target.operations.invokeRequest();
+      target.changeState("WaitingForPortrayal");
+    },
+
+    toggleFreezingScene: function (target) {
+      target.changeState("FreezeScene");
+    },
+
+    selectingLayer: function (target, layer) {
+      // no-op
+    },
+
+    gettingLayers: function (target) {
+      // no-op
+    },
+
+    showAddTempLayer: function (target) {
+      // no-op
+    },
+
+    addTempLayer: function (target) {
+      // no-op
+    }
+
+  });
+
+});
\ No newline at end of file
diff --git a/lib/state/WaitingForPortrayal.js b/lib/state/WaitingForPortrayal.js
index 3068fe1..6e14c30 100644
--- a/lib/state/WaitingForPortrayal.js
+++ b/lib/state/WaitingForPortrayal.js
@@ -32,6 +32,14 @@ define([
 
     gettingLayers: function (target) {
       // no-op
+    },
+
+    showAddTempLayer: function (target) {
+      // no-op
+    },
+
+    addTempLayer: function (target) {
+      // no-op
     }
 
   });
-- 
GitLab