goog.provide('M.control.LayerSwitcher'); goog.require('M.Control'); goog.require('M.utils'); goog.require('M.exception'); (function() { /** * @classdesc * Main constructor of the class. Creates a GetFeatureInfo * control to provides a popup with information about the place * where the user has clicked inside the map. * * @constructor * @param {String} format format response * @extends {M.Control} * @api stable */ M.control.LayerSwitcher = (function() { if (M.utils.isUndefined(M.impl.control.LayerSwitcher)) { M.exception('La implementación usada no puede crear controles LayerSwitcher'); } // implementation of this control var impl = new M.impl.control.LayerSwitcher(); // calls the super constructor goog.base(this, impl, M.control.LayerSwitcher.NAME); }); goog.inherits(M.control.LayerSwitcher, M.Control); /** * This function creates the view to the specified map * * @public * @function * @param {M.Map} map map to add the control * @returns {Promise} html response * @api stable */ M.control.LayerSwitcher.prototype.createView = function(map) { return M.control.LayerSwitcher.getTemplateVariables_(map).then(templateVars => M.template.compile(M.control.LayerSwitcher.TEMPLATE, { 'jsonp': true, 'vars': templateVars })); }; /** * This function checks if an object is equals * to this control * * @function * @api stable */ M.control.LayerSwitcher.prototype.equals = function(obj) { var equals = (obj instanceof M.control.LayerSwitcher); return equals; }; /** * This function registers events on map and layers to render * the layerswitcher * * @function * @api stable */ M.control.LayerSwitcher.prototype.render = function() { this.getImpl().renderPanel(); }; /** * This function registers events on map and layers to render * the layerswitcher * * @function * @api stable */ M.control.LayerSwitcher.prototype.registerEvents = function() { this.getImpl().registerEvents(); }; /** * Unegisters events for map and layers from the layerswitcher * * @function * @api stable */ M.control.LayerSwitcher.prototype.unregisterEvents = function() { this.getImpl().unregisterEvents(); }; /** * Gets the variables of the template to compile */ M.control.LayerSwitcher.getTemplateVariables_ = function(map) { return new Promise(function(success, fail) { // gets base layers and overlay layers let baseLayers = map.getBaseLayers(); let overlayLayers = map.getLayers().filter(function(layer) { let isTransparent = (layer.transparent === true); let displayInLayerSwitcher = (layer.displayInLayerSwitcher === true); let isNotWMC = (layer.type !== M.layer.type.WMC); let isNotWMSFull = !((layer.type === M.layer.type.WMS) && M.utils.isNullOrEmpty(layer.name)); return (isTransparent && isNotWMC && isNotWMSFull && displayInLayerSwitcher); }).reverse(); let baseLayersPromise = Promise.all(baseLayers.map(M.control.LayerSwitcher.parseLayerForTemplate_)); let overlayLayersPromise = Promise.all(overlayLayers.map(M.control.LayerSwitcher.parseLayerForTemplate_)); baseLayersPromise.then(parsedBaseLayers => { overlayLayersPromise.then(parsedOverlayLayers => success({ 'baseLayers': parsedBaseLayers, 'overlayLayers': parsedOverlayLayers })); }); // success({ // 'baseLayers': baseLayers.map(M.control.LayerSwitcher.parseLayerForTemplate_), // 'overlayLayers': overlayLayers.map(M.control.LayerSwitcher.parseLayerForTemplate_) // }); }); }; /** * This function checks if an object is equals * to this control * * @private * @function */ M.control.LayerSwitcher.parseLayerForTemplate_ = function(layer) { var layerTitle = layer.legend; if (M.utils.isNullOrEmpty(layerTitle)) { layerTitle = layer.name; } if (M.utils.isNullOrEmpty(layerTitle)) { layerTitle = 'Servicio WMS'; } // return new Promise((success, fail) => success({ // 'base': (layer.transparent === false), // 'visible': (layer.isVisible() === true), // 'id': layer.name, // 'title': layerTitle, // 'legend': layer.getLegendURL(), // 'outOfRange': !layer.inRange(), // 'opacity': layer.getOpacity() // })); return new Promise((success, fail) => { let layerVarTemplate = { 'base': (layer.transparent === false), 'visible': (layer.isVisible() === true), 'id': layer.name, 'title': layerTitle, 'outOfRange': !layer.inRange(), 'opacity': layer.getOpacity() }; let legendUrl = layer.getLegendURL(); if (legendUrl instanceof Promise) { legendUrl.then(url => { layerVarTemplate['legend'] = url; success(layerVarTemplate); }); } else { layerVarTemplate['legend'] = legendUrl; success(layerVarTemplate); } }); }; /** * Template for this controls - button * @const * @type {string} * @public * @api stable */ M.control.LayerSwitcher.NAME = 'layerswitcher'; /** * Template for this controls - button * @const * @type {string} * @public * @api stable */ M.control.LayerSwitcher.TEMPLATE = 'layerswitcher.html'; })();