CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/editor/layers/layer-view-factory.js

Summary

Maintainability
C
1 day
Test Coverage
var _ = require('underscore');
var layerTypesAndKinds = require('builder/data/layer-types-and-kinds');
var BaseTiledLayerView = require('./layer-views/base-tiled-layer-view');
var PlainColorLayerView = require('./layer-views/plain-color-layer-view');
var BackgroundImageLayerView = require('./layer-views/background-image-layer-view');
var GoogleMapsBaseLayerView = require('./layer-views/google-maps-base-layer-view');
var DataLayerView = require('./layer-views/data-layer-view');
var ErroredDataLayerView = require('./layer-views/errored-data-layer-view');
var LabelsLayerView = require('./layer-views/labels-layer-view');
var LayerAnalysesView = require('./layer-analyses-view');
var LayerAnalysisViewFactory = require('./layer-analysis-view-factory');
var checkAndBuildOpts = require('builder/helpers/required-opts');

var REQUIRED_OPTS = [
  'userActions',
  'layerDefinitionsCollection',
  'analysisDefinitionNodesCollection',
  'modals',
  'configModel',
  'sortableSelector',
  'stateDefinitionModel',
  'visDefinitionModel',
  'widgetDefinitionsCollection'
];

var LayerViewFactory = function (opts) {
  opts = opts || {};
  checkAndBuildOpts(opts, REQUIRED_OPTS, this);
};

LayerViewFactory.prototype.createLayerView = function (layerDefinitionModel) {
  var layerViewOptions = {
    model: layerDefinitionModel,
    modals: this._modals,
    stateDefinitionModel: this._stateDefinitionModel,
    configModel: this._configModel
  };

  if (layerDefinitionModel.isDataLayer()) {
    layerViewOptions = _.extend(layerViewOptions, {
      userActions: this._userActions,
      layerDefinitionsCollection: this._layerDefinitionsCollection,
      newAnalysesView: this._newAnalysesView.bind(this),
      widgetDefinitionsCollection: this._widgetDefinitionsCollection,
      visDefinitionModel: this._visDefinitionModel,
      analysisDefinitionNodesCollection: this._analysisDefinitionNodesCollection
    });
  }

  var LayerViewClass = this._getLayerViewClass(layerDefinitionModel);
  return new LayerViewClass(layerViewOptions);
};

LayerViewFactory.prototype._getLayerViewClass = function (layerDefinitionModel) {
  // Base layers
  if (this._isTiledBaseLayer(layerDefinitionModel)) {
    return BaseTiledLayerView;
  }
  if (this._isPlainColorBaseLayer(layerDefinitionModel)) {
    return PlainColorLayerView;
  }
  if (this._isBackgroundImageBaseLayer(layerDefinitionModel)) {
    return BackgroundImageLayerView;
  }
  if (this._isGoogleMapsBaseLayer(layerDefinitionModel)) {
    return GoogleMapsBaseLayerView;
  }

  // Data layers
  if (layerDefinitionModel.isDataLayer()) {
    var nodeDefModel = layerDefinitionModel.getAnalysisDefinitionNodeModel();
    if (nodeDefModel) {
      return DataLayerView;
    } else {
      // Ghost node layer (😱)
      return ErroredDataLayerView;
    }
  }

  // Labels layer
  if (this.isLabelsLayer(layerDefinitionModel)) {
    return LabelsLayerView;
  }

  throw new Error('No layer view for type "' + layerDefinitionModel.get('type') + '" just yet.');
};

LayerViewFactory.prototype._isBaseLayer = function (layerDefinitionModel) {
  return layerDefinitionModel.get('order') === 0;
};

LayerViewFactory.prototype._isTiledBaseLayer = function (layerDefinitionModel) {
  var layerType = layerDefinitionModel.get('type');
  return layerTypesAndKinds.isTiledType(layerType) &&
    this._isBaseLayer(layerDefinitionModel);
};

LayerViewFactory.prototype._isPlainColorBaseLayer = function (layerDefinitionModel) {
  var layerType = layerDefinitionModel.get('type');
  return layerTypesAndKinds.isPlainType(layerType) &&
    this._isBaseLayer(layerDefinitionModel) &&
      layerDefinitionModel.get('color');
};

LayerViewFactory.prototype._isBackgroundImageBaseLayer = function (layerDefinitionModel) {
  var layerType = layerDefinitionModel.get('type');
  return layerTypesAndKinds.isPlainType(layerType) &&
    this._isBaseLayer(layerDefinitionModel) &&
      layerDefinitionModel.get('image');
};

LayerViewFactory.prototype._isGoogleMapsBaseLayer = function (layerDefinitionModel) {
  var layerType = layerDefinitionModel.get('type');
  return layerTypesAndKinds.isGMapsBase(layerType) &&
    this._isBaseLayer(layerDefinitionModel);
};

LayerViewFactory.prototype.isLabelsLayer = function (layerDefinitionModel) {
  var layerType = layerDefinitionModel.get('type');
  return layerTypesAndKinds.isTiledType(layerType) &&
    !this._isBaseLayer(layerDefinitionModel);
};

LayerViewFactory.prototype.isBasemapLayer = function (layerDefinitionModel) {
  return this._isBaseLayer(layerDefinitionModel);
};

LayerViewFactory.prototype._newAnalysesView = function (el, layerDefinitionModel) {
  var layerAnalysisViewFactory = new LayerAnalysisViewFactory(this._analysisDefinitionNodesCollection);
  return new LayerAnalysesView({
    el: el,
    model: layerDefinitionModel,
    layerAnalysisViewFactory: layerAnalysisViewFactory,
    sortableSelector: this._sortableSelector
  });
};

module.exports = LayerViewFactory;