diff --git a/frontend-js/src/main/js/ObjectWithListeners.js b/frontend-js/src/main/js/ObjectWithListeners.js index 41b332c6d21c8e2259321b4ec0eab7d23f199d24..219b102584047cffa147a2700984cd134a2cb59b 100644 --- a/frontend-js/src/main/js/ObjectWithListeners.js +++ b/frontend-js/src/main/js/ObjectWithListeners.js @@ -144,7 +144,7 @@ ObjectWithListeners.prototype.removePropertyListener = function (name, fun) { * * @param {string} type * type of the listener (string) - * @param arg + * @param {Object} [arg] * argument data passed to the handler * * @returns {PromiseLike} diff --git a/frontend-js/src/main/js/map/Submap.js b/frontend-js/src/main/js/map/Submap.js index 37979fe92a2dd4e454daced37f806fb7441fec97..26dcb67cd97e4cf3bbb982d3c02115bf74e304c1 100644 --- a/frontend-js/src/main/js/map/Submap.js +++ b/frontend-js/src/main/js/map/Submap.js @@ -19,9 +19,10 @@ var CustomMapOptions = require('./CustomMapOptions'); * @extends AbstractCustomMap */ function Submap(customMap, model) { + var self = this; this.setCustomMap(customMap); - AbstractCustomMap.call(this, model, new CustomMapOptions({ + AbstractCustomMap.call(self, model, new CustomMapOptions({ element: customMap.getElement(), bigLogo: customMap.isBigLogo(), project: customMap.getProject(), @@ -31,7 +32,17 @@ function Submap(customMap, model) { serverConnector: customMap.getServerConnector() })); - this.initialized = false; + self.registerListenerType("onOpen"); + self.registerListenerType("onClose"); + self.registerListenerType("onDrag"); + self.registerListenerType("onDragStart"); + self.registerListenerType("onDragStop"); + self.registerListenerType("onResize"); + self.registerListenerType("onResizeStart"); + self.registerListenerType("onResizeStop"); + self.registerListenerType("onFocus"); + + self.initialized = false; } // implementation of object inheritance @@ -62,6 +73,7 @@ Submap.prototype.open = function (htmlTag) { mapDiv.style.height = "100%"; contentDiv.appendChild(mapDiv); + // noinspection JSUnusedGlobalSymbols $(self.getElement()).dialog({ title: self.getModel().getName(), width: Math.floor(window.innerWidth * 2 / 3), @@ -72,7 +84,33 @@ Submap.prototype.open = function (htmlTag) { of: $(self.getTopMap().getElement()) }, resize: function () { - self.getMapCanvas().triggerListeners('resize'); + return self.getMapCanvas().triggerListeners('resize').then(function () { + return self.callListeners('onResize'); + }); + }, + resizeStart: function () { + return self.callListeners('onResizeStart'); + }, + resizeStop: function () { + return self.callListeners('onResizeStop'); + }, + open: function () { + return self.callListeners('onOpen'); + }, + close: function () { + return self.callListeners('onClose'); + }, + focus: function () { + return self.callListeners('onFocus'); + }, + dragStop: function () { + return self.callListeners('onDragStop'); + }, + dragStart: function () { + return self.callListeners('onDragStart'); + }, + drag: function () { + return self.callListeners('onDrag'); } }); @@ -89,9 +127,16 @@ Submap.prototype.open = function (htmlTag) { } else { $(self.getElement()).dialog("open"); } +}; +Submap.prototype.close = function () { + var self = this; + if (self.isInitialized()) { + $(self.getElement()).dialog("close"); + } }; + /** * * @param {number} identifier diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js index 7e75d0e1d5eba0034b7002142b8d8e0cef042e1b..0586050a26ec45b08cf8ad0c2ae677cf777a330a 100644 --- a/frontend-js/src/main/js/map/data/MapModel.js +++ b/frontend-js/src/main/js/map/data/MapModel.js @@ -90,9 +90,9 @@ function MapModel(configuration) { * Return list of all aliases that were added to the model. * * @param {Object} params - * @param {string} params.type - * @param {number[]} params.includedCompartmentIds - * @param {number[]} params.excludedCompartmentIds + * @param {string|string[]} params.type + * @param {number[]} [params.includedCompartmentIds] + * @param {number[]} [params.excludedCompartmentIds] * @param {boolean} params.complete * @returns {Promise} */ diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js index 594cd2fb9452cb8b902654d337b6ee8492e1790a..036c4e9e78a00d450eb634c5d348aa4c732541a1 100644 --- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js +++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js @@ -8,6 +8,7 @@ var Configuration = require('../Configuration'); var Bounds = require('../map/canvas/Bounds'); var Point = require('../map/canvas/Point'); +// noinspection JSUnusedLocalSymbols var logger = require('../logger'); var Promise = require("bluebird"); @@ -279,6 +280,32 @@ function createMarkerElements(options) { return markerElements; } +/** + * + * @param {Object} param + * @returns {function(*): *} + */ +function createWrapperFunctionForDialogGuiUpdate(param) { + /** + * + * @param {AbstractCustomMap} e.object + * @returns {Promise} + */ + return function (e) { + var submap = e.object; + var div = $("[name^='submap-div-']", submap.getElement())[0]; + var x = div.getBoundingClientRect().left - document.body.getBoundingClientRect().left; + var y = div.getBoundingClientRect().top - document.body.getBoundingClientRect().top; + var width = div.getBoundingClientRect().width; + var height = div.getBoundingClientRect().height; + return param.callback({ + modelId: submap.getId(), + position: new Point(x, y), + size: {width: width, height: height} + }); + } +} + /** * * @param {Object} options @@ -341,6 +368,25 @@ function createProjectMap(options) { throw new Error("Unknown listener type: " + param.type); } objects = objects.concat(map.getSubmaps()); + } else if (param.object === "map-dialog") { + objects = objects.concat(map.getSubmaps()); + if (param.type === "onDrag" || param.type === "onDragStart" || param.type === "onDragStop" || + param.type === "onResize" || param.type === "onResizeStart" || param.type === "onResizeStop" || + param.type === "onOpen") { + listenerWrapper = createWrapperFunctionForDialogGuiUpdate(param); + } else if (param.type === "onFocus") { + listenerWrapper = function (e) { + var submap = e.object; + return param.callback({modelId: submap.getId()}); + }; + } else if (param.type === "onClose") { + listenerWrapper = function (e) { + var submap = e.object; + return param.callback({modelId: submap.getId()}); + }; + } else { + throw new Error("Unknown listener type: " + param.type); + } } else { throw new Error("Invalid argument"); } diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js index 010051e604d0db1bf76b3c749bbeb57d593512d3..098fb45f4e64005468fa0c3f2a6b059a477da773 100644 --- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js +++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js @@ -429,10 +429,10 @@ describe('MinervaPluginProxy', function () { center = map.getCenter(); return proxy.project.map.fitBounds({ modelId: 15781, - x1:10, - x2:10, - y1:20, - y2:30 + x1: 10, + x2: 10, + y1: 20, + y2: 30 }); }).then(function () { var center2 = map.getCenter(); @@ -622,7 +622,7 @@ describe('MinervaPluginProxy', function () { type: "onCenterChanged", callback: function (data) { assert.equal(map.getId(), data.modelId); - var center = data.center; + var center = data.center; assert.ok(center instanceof Point); assert.closeTo(parseFloat(center.x), 10, helper.EPSILON); assert.closeTo(parseFloat(center.y), 20, helper.EPSILON); @@ -639,7 +639,83 @@ describe('MinervaPluginProxy', function () { return map.destroy(); }); }); - }); + describe('map-dialog', function () { + it('onOpen', function () { + helper.setUrl("http://test/?id=complex_model_with_submaps"); + var callbackOk = false; + var map, submap; + return ServerConnector.getProject().then(function (project) { + map = helper.createCustomMap(project); + submap = map.getSubmaps()[0]; + var proxy = createProxy(map); + + proxy.project.map.addListener({ + object: "map-dialog", + type: "onOpen", + callback: function (data) { + assert.equal(submap.getId(), data.modelId); + assert.ok(data.position); + assert.ok(data.size); + callbackOk = true; + } + }); + return submap.open(testDiv); + }).then(function () { + assert.ok(callbackOk); + return map.destroy(); + }); + }); + + it('onClose', function () { + helper.setUrl("http://test/?id=complex_model_with_submaps"); + var callbackOk = false; + var map, submap; + return ServerConnector.getProject().then(function (project) { + map = helper.createCustomMap(project); + submap = map.getSubmaps()[0]; + var proxy = createProxy(map); + + proxy.project.map.addListener({ + object: "map-dialog", + type: "onClose", + callback: function (data) { + assert.equal(submap.getId(), data.modelId); + callbackOk = true; + } + }); + return submap.open(testDiv); + }).then(function () { + return submap.close(); + }).then(function () { + assert.ok(callbackOk); + return map.destroy(); + }); + }); + }); + + it('onFocus', function () { + helper.setUrl("http://test/?id=complex_model_with_submaps"); + var callbackOk = false; + var map, submap; + return ServerConnector.getProject().then(function (project) { + map = helper.createCustomMap(project); + submap = map.getSubmaps()[0]; + var proxy = createProxy(map); + proxy.project.map.addListener({ + object: "map-dialog", + type: "onFocus", + callback: function (data) { + assert.equal(submap.getId(), data.modelId); + callbackOk = true; + } + }); + return submap.open(testDiv); + }).then(function () { + assert.ok(callbackOk); + return map.destroy(); + }); + }); + }); });