Source: controls/layerswitcher.js

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';
})();