CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/modals/add-basemap/add-basemap-view.js

Summary

Maintainability
B
5 hrs
Test Coverage
var CoreView = require('backbone/core-view');
var template = require('./add-basemap.tpl');
var TabPaneView = require('builder/components/tab-pane/tab-pane-view');
var TabPaneCollection = require('builder/components/tab-pane/tab-pane-collection');
var ViewFactory = require('builder/components/view-factory');
var renderLoading = require('builder/components/loading/render-loading');
var ErrorView = require('builder/components/error/error-view');
var _ = require('underscore');
var TabsView = require('./tabs-view');

/**
 * Add basemap dialog
 */
module.exports = CoreView.extend({

  className: 'Dialog-content Dialog-content--expanded',

  events: {
    'click .js-ok': 'ok'
  },

  initialize: function (opts) {
    if (!opts.modalModel) throw new TypeError('modalModel is required');
    if (!opts.createModel) throw new TypeError('createModel is required');

    this._modalModel = opts.modalModel;
    this._createModel = opts.createModel;
    this._initBinds();
  },

  render: function () {
    this.clearSubViews();
    this.$el.html(template());
    this._initViews();
  },

  _initBinds: function () {
    this._createModel.bind('saveBasemapDone', this._modalModel.destroy.bind(this._modalModel), this);
    this._createModel.bind('change:contentPane', this._onChangeContentView, this);
    this.add_related_model(this._createModel);
  },

  _onChangeContentView: function () {
    var context = this._createModel.get('contentPane');
    var paneModel = _.first(this._tabPaneCollection.where({ name: context }));
    paneModel.set('selected', true);
  },

  _initViews: function () {
    var self = this;

    this._submitButtom = this.$('.js-ok');
    this._modalFooter = this.$('.js-Modal-footer');

    this._tabPaneCollection = new TabPaneCollection([
      {
        name: 'tabs',
        selected: this._createModel.get('contentPane') === 'tabs',
        createContentView: function () {
          return new TabsView({
            model: self._createModel,
            submitButton: self._submitButtom,
            modalFooter: self._modalFooter
          });
        }
      }, {
        name: 'addingBasemap',
        selected: this._createModel.get('contentPane') === 'addingBasemap',
        createContentView: function () {
          self._disableModalFooter(true);

          return ViewFactory.createByHTML(
            renderLoading({
              title: _t('components.modals.add-basemap.adding-basemap')
            })
          );
        }
      }, {
        name: 'addBasemapFailed',
        selected: this._createModel.get('contentPane') === 'addBasemapFailed',
        createContentView: function () {
          return new ErrorView({
            title: _t('components.modals.add-basemap.add-basemap-error')
          });
        }
      }
    ]);

    var tabPaneView = new TabPaneView({
      collection: this._tabPaneCollection
    });
    this.addView(tabPaneView);
    this.$('.js-content-container').append(tabPaneView.render().el);
  },

  _disableModalFooter: function (disable) {
    this._modalFooter.toggleClass('is-disabled', disable);
  },

  ok: function () {
    if (this._createModel.canSaveBasemap()) {
      this._createModel.saveBasemap();
    }
  }

});