diff --git a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js index 776ab7b925cd95794449185fdfc27e547a185994..b37f17313d83a32e6caad3fc7a97c8048d852c1e 100644 --- a/frontend-js/src/main/js/map/overlay/UserDbOverlay.js +++ b/frontend-js/src/main/js/map/overlay/UserDbOverlay.js @@ -39,6 +39,8 @@ UserDbOverlay.prototype.getDetailDataByIdentifiedElement = function(element) { UserDbOverlay.prototype.addMarker = function(params) { var self = this; + self.disableAddRemoveElements(); + var elements = []; if (params.length === undefined) { params = [ params ]; @@ -51,6 +53,7 @@ UserDbOverlay.prototype.addMarker = function(params) { element.setIcon(singleElementParam.icon); } if (self._markerIdentifiedElements[element.getType()][element.getId()] !== undefined) { + self.enableAddRemoveElements(); return Promise.reject(new Error("Element already highlighted: " + element.getId())); } elements.push(element); @@ -61,6 +64,7 @@ UserDbOverlay.prototype.addMarker = function(params) { } return self.getIdentifiedElements().then(function(elements) { + self.enableAddRemoveElements(); return self.callListeners("onSearch", { fitBounds : false, identifiedElements : elements, @@ -70,6 +74,7 @@ UserDbOverlay.prototype.addMarker = function(params) { UserDbOverlay.prototype.addSurface = function(params) { var self = this; + self.disableAddRemoveElements(); var elements = []; if (params.length === undefined) { @@ -84,6 +89,7 @@ UserDbOverlay.prototype.addSurface = function(params) { element.setOpacity(singleElementParam.options.opacity); } if (self._surfaceIdentifiedElements[element.getType()][element.getId()] !== undefined) { + self.enableAddRemoveElements(); return Promise.reject(new Error("Element already highlighted: " + element.getId())); } elements.push(element); @@ -94,6 +100,7 @@ UserDbOverlay.prototype.addSurface = function(params) { } return self.getIdentifiedElements().then(function(elements) { + self.enableAddRemoveElements(); return self.callListeners("onSearch", { fitBounds : false, identifiedElements : elements, @@ -103,69 +110,82 @@ UserDbOverlay.prototype.addSurface = function(params) { UserDbOverlay.prototype.removeMarker = function(params) { var self = this; + self.disableAddRemoveElements(); var elements = []; if (params.length === undefined) { params = [ params ]; } - if (params.length > 0) { - var i, element; - for (i = 0; i < params.length; i++) { - var singleElementParam = params[i]; - element = new IdentifiedElement(singleElementParam.element); - if (self._markerIdentifiedElements[element.getType()][element.getId()] === undefined) { - return Promise.reject(new Error("Element is not highlighted: " + element.getId())); - } - elements.push(element); - } - for (i = 0; i < elements.length; i++) { - element = elements[i]; - self._markerIdentifiedElements[element.getType()][element.getId()] = undefined; - delete self._markerIdentifiedElements[element.getType()][element.getId()]; + var i, element; + for (i = 0; i < params.length; i++) { + var singleElementParam = params[i]; + element = new IdentifiedElement(singleElementParam.element); + if (self._markerIdentifiedElements[element.getType()][element.getId()] === undefined) { + self.enableAddRemoveElements(); + return Promise.reject(new Error("Element is not highlighted: " + element.getId())); } + elements.push(element); + } + for (i = 0; i < elements.length; i++) { + element = elements[i]; + self._markerIdentifiedElements[element.getType()][element.getId()] = undefined; + delete self._markerIdentifiedElements[element.getType()][element.getId()]; + } - return self.getIdentifiedElements().then(function(elements) { - return self.callListeners("onSearch", { - fitBounds : false, - identifiedElements : elements, - }); + return self.getIdentifiedElements().then(function(elements) { + self.enableAddRemoveElements(); + return self.callListeners("onSearch", { + fitBounds : false, + identifiedElements : elements, }); - } else { - return Promise.resolve(); - } + }); }; UserDbOverlay.prototype.removeSurface = function(params) { var self = this; + self.disableAddRemoveElements(); var elements = []; if (params.length === undefined) { params = [ params ]; } - if (params.length > 0) { - var i, element; - for (i = 0; i < params.length; i++) { - var singleElementParam = params[i]; - element = new IdentifiedElement(singleElementParam.element); - if (self._surfaceIdentifiedElements[element.getType()][element.getId()] === undefined) { - return Promise.reject(new Error("Element is not highlighted: " + element.getId())); - } - elements.push(element); - } - for (i = 0; i < elements.length; i++) { - element = elements[i]; - self._surfaceIdentifiedElements[element.getType()][element.getId()] = undefined; - delete self._surfaceIdentifiedElements[element.getType()][element.getId()]; + var i, element; + for (i = 0; i < params.length; i++) { + var singleElementParam = params[i]; + element = new IdentifiedElement(singleElementParam.element); + if (self._surfaceIdentifiedElements[element.getType()][element.getId()] === undefined) { + self.enableAddRemoveElements(); + return Promise.reject(new Error("Element is not highlighted: " + element.getId())); } + elements.push(element); + } + for (i = 0; i < elements.length; i++) { + element = elements[i]; + self._surfaceIdentifiedElements[element.getType()][element.getId()] = undefined; + delete self._surfaceIdentifiedElements[element.getType()][element.getId()]; + } - return self.getIdentifiedElements().then(function(elements) { - return self.callListeners("onSearch", { - fitBounds : false, - identifiedElements : elements, - }); + return self.getIdentifiedElements().then(function(elements) { + self.enableAddRemoveElements(); + return self.callListeners("onSearch", { + fitBounds : false, + identifiedElements : elements, }); + }); +}; + +UserDbOverlay.prototype.disableAddRemoveElements = function() { + if (this._addRemoveElementsDisabled) { + throw new Error("wait until previous Promise for showBioEntity/hideBioEntity is resolved"); + } else { + this._addRemoveElementsDisabled = true; + } +}; +UserDbOverlay.prototype.enableAddRemoveElements = function() { + if (this._addRemoveElementsDisabled) { + this._addRemoveElementsDisabled = false; } else { - return Promise.resolve(); + logger.warn("showBioEntity/hideBioEntity is not disabled"); } }; diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js index 509f4ba3c18eb1089c9db508ed0b8ed495897550..a784b8635460b2ee4ef45da847210c66c76d4cfb 100644 --- a/frontend-js/src/test/js/minerva-test.js +++ b/frontend-js/src/test/js/minerva-test.js @@ -333,6 +333,45 @@ describe('minerva global', function() { }); }); + it("showElement twice", function() { + var options = { + projectId : "sample", + element : testDiv + }; + var globalResult; + var elementToShow = { + element : { + id : 329171, + modelId : 15781, + type : "ALIAS" + }, + type : "ICON", + }; + var elementToShow2 = { + element : { + id : 329171, + modelId : 15781, + type : "ALIAS" + }, + type : "SURFACE", + options : { + color : "#FF0000", + } + }; + + return minerva.create(options).then(function(result) { + globalResult = result; + globalResult.showBioEntity(elementToShow); + return globalResult.showBioEntity(elementToShow2); + }).then(function() { + globalResult.destroy(); + assert.ok(false, "Should be rejected due to fact that there is show in progress"); + }, function(error) { + assert.ok(error.message.indexOf("wait until previous Promise for showBioEntity/hideBioEntity is resolved") >= 0); + globalResult.destroy(); + }); + }); + it("setCenter", function() { var options = { projectId : "sample",