CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/editor/layers/layer-content-views/analyses/analyses-service.js

Summary

Maintainability
A
2 hrs
Test Coverage
// Make common analyses actions available whin editor context
var _ = require('underscore');
var checkAndBuildOpts = require('builder/helpers/required-opts');
var AddAnalysisView = require('builder/components/modals/add-analysis/add-analysis-view');
var nodeIds = require('builder/value-objects/analysis-node-ids');

var REQUIRED_OPTS = [
  'onboardings',
  'layerDefinitionsCollection',
  'modals',
  'userModel',
  'configModel'
];

module.exports = (function () {
  return {
    init: function (opts) {
      checkAndBuildOpts(opts, REQUIRED_OPTS, this);

      this._notAppliedAnalysis = null;
    },

    setLayerId: function (layerId) {
      var layerDefinitionModel = this._layerDefinitionsCollection.get(layerId);
      if (!layerDefinitionModel) {
        throw new Error('no layer-definition found for id' + layerId + ', available layer ids are: ' + this._layerDefinitionsCollection.pluck('id') + ')');
      }

      this._layerId = layerId;
    },

    setStackLayoutView: function (stackLayoutView) {
      if (!stackLayoutView) {
        throw new Error('stackLayoutView is required');
      }

      this._stackLayoutView = stackLayoutView;
    },

    generateGeoreferenceAnalysis: function () {
      var layerDefinitionModel = this._layerDefinitionsCollection.get(this._layerId);

      var letter = layerDefinitionModel.get('letter');
      var sourceId = layerDefinitionModel.get('source');

      return {
        source: sourceId,
        id: letter === nodeIds.letter(sourceId)
          ? nodeIds.next(sourceId)
          : letter + '1',
        type: 'georeference-long-lat'
      };
    },

    addAnalysis: function () {
      this._onboardings.destroy();

      var layerDefinitionModel = this._layerDefinitionsCollection.get(this._layerId);

      this._modals.create(function (modalModel) {
        return new AddAnalysisView({
          userModel: this._userModel,
          configModel: this._configModel,
          modalModel: modalModel,
          layerDefinitionModel: layerDefinitionModel
        });
      }.bind(this), {
        breadcrumbsEnabled: true
      });

      this._modals.onDestroyOnce(function (analysisFormAttrs) {
        if (analysisFormAttrs) {
          // A analysis option was seleted, redirect to layer-content view with new attrs
          this._stackLayoutView.model.goToStep(1, layerDefinitionModel, 'layer-content', 'analyses', analysisFormAttrs);
        }
      }, this);
    },

    saveNotAppliedAnalysis: function (analysis) {
      this._notAppliedAnalysis = _.extend({ persisted: false }, analysis);
    },

    getNotAppliedAnalysis: function () {
      return this._notAppliedAnalysis;
    },

    clearNotAppliedAnalysis: function () {
      this._notAppliedAnalysis = null;
    }
  };
})();