diff --git a/assets/src/modules/Action.js b/assets/src/modules/Action.js index c5e6b3016b..1174c15cc1 100644 --- a/assets/src/modules/Action.js +++ b/assets/src/modules/Action.js @@ -6,7 +6,7 @@ * @license MPL-2.0 */ -import { mainLizmap } from '../modules/Globals.js'; +import SelectionTool from './SelectionTool.js'; import { Vector as VectorSource } from 'ol/source.js'; import { Vector as VectorLayer } from 'ol/layer.js'; import GeoJSON from 'ol/format/GeoJSON.js'; @@ -56,8 +56,17 @@ export default class Action { /** * Build the lizmap Action instance + * @param {Map} map - OpenLayers map + * @param {SelectionTool} selectionTool - The lizmap selection tool + * @param {Digitizing} digitizing - The Lizmap digitizing instance + * @param {object} lizmap3 - The old lizmap object */ - constructor() { + constructor(map, selectionTool, digitizing, lizmap3) { + + this._map = map; + this._selectionTool = selectionTool; + this._digitizing = digitizing; + this._lizmap3 = lizmap3; this.hasActions = true; if (typeof actionConfig === 'undefined') { @@ -97,8 +106,9 @@ export default class Action { }); } + const self = this; // React on the main Lizmap events - mainLizmap.lizmap3.events.on({ + this._lizmap3.events.on({ // The popup has been displayed // We need to add the buttons for the action with a 'feature' scope @@ -117,7 +127,7 @@ export default class Action { const layerId = element.dataset.layerId; // Get layer lizmap config - let getLayerConfig = mainLizmap.lizmap3.getLayerConfigById(layerId); + let getLayerConfig = lizmap3.getLayerConfigById(layerId); if (!getLayerConfig) { return true; } @@ -128,13 +138,13 @@ export default class Action { let action = actionConfig[i]; // Only add action in Popup for the scope "feature" - if (!('scope' in action) || action['scope'] != mainLizmap.action.Scopes.Feature) { + if (!('scope' in action) || action['scope'] != self.Scopes.Feature) { continue; } // Only add action if the layer is in the list if (action['layers'].includes(layerId)) { - mainLizmap.action.addPopupActionButton(action, layerId, featureId, popupContainerId); + self.addPopupActionButton(action, layerId, featureId, popupContainerId); } } @@ -142,10 +152,10 @@ export default class Action { } }); } - mainLizmap.lizmap3.events.on({ + this._lizmap3.events.on({ minidockclosed: (event) => { if (event.id === 'action'){ - mainLizmap.digitizing.toolSelected = 'deactivate'; + this._digitizing.toolSelected = 'deactivate'; } } }); @@ -179,7 +189,7 @@ export default class Action { }); // Add the layer inside Lizmap objects - mainLizmap.map.addToolLayer(this.actionLayer); + this._map.addToolLayer(this.actionLayer); } /** @@ -274,14 +284,15 @@ export default class Action { if (callback['method'] == this.CallbackMethods.Zoom && features.length) { // Zoom to the returned features - mainLizmap.extent = this.actionLayer.getSource().getExtent(); + const bounds = this.actionLayer.getSource().getExtent(); + this._map.getView().fit(bounds, {nearest: true}); } // Check the given layerId is a valid Lizmap layer // Only for the methods which gives a layerId in their configuration if (callback['method'] == this.CallbackMethods.Redraw || callback['method'] == this.CallbackMethods.Select) { - let getLayerConfig = mainLizmap.lizmap3.getLayerConfigById(callback['layerId']); + let getLayerConfig = this._lizmap3.getLayerConfigById(callback['layerId']); if (!getLayerConfig) { continue; } @@ -289,7 +300,7 @@ export default class Action { let layerConfig = getLayerConfig[1]; // Get the corresponding OpenLayers layer instance - const layer = lizMap.mainLizmap.map.getLayerByName(layerConfig.name); + const layer = this._map.getLayerByName(layerConfig.name); if(!layer){ continue; @@ -306,7 +317,7 @@ export default class Action { // Select features in the given layer let feat = features[0]; let f = feat.clone(); - mainLizmap.selectionTool.selectLayerFeaturesFromSelectionFeature(featureType, f); + this._selectionTool.selectLayerFeaturesFromSelectionFeature(featureType, f); } } } @@ -384,7 +395,7 @@ export default class Action { const WKTformat = new WKT(); const projOptions = { - featureProjection: mainLizmap.projection, + featureProjection: this._lizmap3.map.getProjection(), dataProjection: 'EPSG:4326' }; @@ -394,8 +405,8 @@ export default class Action { this.resetLizmapAction(true, true, true, false); // Take drawn geometry if any and if none exists as a parameter - if (!wkt && mainLizmap.digitizing.context === "action" && mainLizmap.digitizing.featureDrawn) { - wkt = WKTformat.writeFeatures(mainLizmap.digitizing.featureDrawn, projOptions); + if (!wkt && this._digitizing.context === "action" && this._digitizing.featureDrawn) { + wkt = WKTformat.writeFeatures(this._digitizing.featureDrawn, projOptions); } // Set the request parameters @@ -406,10 +417,13 @@ export default class Action { "wkt": wkt }; + const viewExtent = this._map.getView().calculateExtent(); + const viewCenter = this._map.getView().getCenter(); + // We add the map extent and center // as WKT geometries - options['mapExtent'] = WKTformat.writeGeometry(fromExtent(mainLizmap.extent), projOptions); - options['mapCenter'] = WKTformat.writeGeometry(new Point(mainLizmap.center), projOptions); + options['mapExtent'] = WKTformat.writeGeometry(fromExtent(viewExtent), projOptions); + options['mapCenter'] = WKTformat.writeGeometry(new Point(viewCenter), projOptions); // Request action and get data let url = actionConfigData.url; @@ -431,7 +445,7 @@ export default class Action { this.resetLizmapAction(true, true, true, true); // Display the errors - mainLizmap.lizmap3.addMessage(data.errors.title + '\n' + data.errors.detail, 'danger', true).attr('id', 'lizmap-action-message'); + this._lizmap3.addMessage(data.errors.title + '\n' + data.errors.detail, 'danger', true).attr('id', 'lizmap-action-message'); console.warn(data.errors); return false; @@ -454,7 +468,7 @@ export default class Action { // Display the message if given const message = featureProperties[message_field].trim(); if (message) { - mainLizmap.lizmap3.addMessage(message, 'info', true).attr('id', 'lizmap-action-message'); + this._lizmap3.addMessage(message, 'info', true).attr('id', 'lizmap-action-message'); } // Display the HTML message if given @@ -554,7 +568,7 @@ export default class Action { // Convert the action GeoJSON data into OpenLayers features const features = (new GeoJSON()).readFeatures(data, { - featureProjection: mainLizmap.projection + featureProjection: this._lizmap3.map.getProjection() }); // Add them to the action layer @@ -580,10 +594,10 @@ export default class Action { // Get the layerId, featureId and action for this button let val = button.value; - let [actionName, layerId, featureId] = mainLizmap.action.explodeActionInstanceUniqueId(val); + let [actionName, layerId, featureId] = this.explodeActionInstanceUniqueId(val); // Get the action item data - let popupAction = mainLizmap.action.getActionItemByName(actionName, mainLizmap.action.Scopes.Feature, layerId); + let popupAction = this.getActionItemByName(actionName, this.Scopes.Feature, layerId); if (!popupAction) { console.warn('No corresponding action found in the configuration !'); @@ -593,11 +607,11 @@ export default class Action { // We allow only one active action at a time. // If the action is already active for the clicked button // we need to deactivate it completely - if (mainLizmap.action.ACTIVE_LIZMAP_ACTION) { - let actionUniqueId = mainLizmap.action.buildActionInstanceUniqueId(actionName, mainLizmap.action.Scopes.Feature, layerId, featureId); - if (mainLizmap.action.ACTIVE_LIZMAP_ACTION == actionUniqueId) { + if (this.ACTIVE_LIZMAP_ACTION) { + let actionUniqueId = this.buildActionInstanceUniqueId(actionName, this.Scopes.Feature, layerId, featureId); + if (this.ACTIVE_LIZMAP_ACTION == actionUniqueId) { // Reset the action - mainLizmap.action.resetLizmapAction(true, true, true, true); + this.resetLizmapAction(true, true, true, true); // Return return true; @@ -607,7 +621,7 @@ export default class Action { // The action was not active, we can run it // This will override the previous actions and replace them // with this one - mainLizmap.action.ACTIVE_LIZMAP_ACTION = null; + this.ACTIVE_LIZMAP_ACTION = null; // Display a confirm question if needed if ('confirm' in popupAction && popupAction.confirm.trim() != '') { @@ -619,14 +633,14 @@ export default class Action { } // Reset - mainLizmap.action.resetLizmapAction(true, true, true, true); + this.resetLizmapAction(true, true, true, true); // Add the button btn-primary class button.classList.add('btn-primary'); // Run the Lizmap action for this feature // It will set the global variable ACTIVE_LIZMAP_ACTION - mainLizmap.action.runLizmapAction(actionName, mainLizmap.action.Scopes.Feature, layerId, featureId); + this.runLizmapAction(actionName, this.Scopes.Feature, layerId, featureId); return false; } @@ -688,7 +702,7 @@ export default class Action { } // Trigger the action when clicking on button - actionButton.addEventListener('click', mainLizmap.action.popupActionButtonClickHandler); + actionButton.addEventListener('click', this.popupActionButtonClickHandler.bind(this)); } }; diff --git a/assets/src/modules/Lizmap.js b/assets/src/modules/Lizmap.js index cdd880d483..b189d3fde3 100644 --- a/assets/src/modules/Lizmap.js +++ b/assets/src/modules/Lizmap.js @@ -161,7 +161,7 @@ export default class Lizmap { this.proxyEvents = new ProxyEvents(); this.wfs = new WFS(); this.wms = new WMS(); - this.action = new Action(); + this.action = new Action(this.map, this.selectionTool, this.digitizing, this.lizmap3); this.featureStorage = new FeatureStorage(); this.popup = new Popup(this.initialConfig, this.state, this.map, this.digitizing); this.legend = new Legend(this.state.layerTree);