CartoDB/cartodb20

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

Summary

Maintainability
C
1 day
Test Coverage
var CoreView = require('backbone/core-view');
var _ = require('underscore');
var SelectLayerView = require('./select-layer-view');
var ViewFactory = require('builder/components/view-factory');
var ErrorView = require('builder/components/error/error-view');
var renderLoading = require('builder/components/loading/render-loading');
var enterUrl = require('./enter-url.tpl');
var $ = require('jquery');

/**
 * Represents the WMS/WMTS tab category.
 * Current state is defined by presence (or lack of) layers
 */
module.exports = CoreView.extend({

  events: {
    'keydown .js-search-input': '_onKeyDown',
    'submit .js-search-form': 'killEvent',
    'keydown .js-url': '_onKeydown',
    'paste .js-url': '_onPaste',
    'click .js-clean-search': '_onCleanSearchClick',
    'click .js-search-link': '_submitSearch'
  },

  initialize: function (opts) {
    if (!opts.customBaselayersCollection) throw new Error('customBaselayersCollection is required');
    if (!opts.submitButton) throw new Error('submitButton is required');
    if (!opts.modalFooter) throw new Error('modalFooter is required');

    this._customBaselayersCollection = opts.customBaselayersCollection;
    this._submitButton = opts.submitButton;
    this._modalFooter = opts.modalFooter;
    this._debouncedUpdate = _.debounce(this._update.bind(this), 150);
    this._onClickBinded = this._onClickOK.bind(this);

    this._bindSubmitButton();
    this._initBinds();
  },

  render: function () {
    this.clearSubViews();

    this._updateOkBtn();
    this._disableOkBtn(true);

    var view;

    switch (this.model.get('currentView')) {
      case 'savingLayer':
        this._disableModalFooter(true);

        view = ViewFactory.createByHTML(
          renderLoading({
            title: _t('components.modals.add-basemap.saving')
          })
        );
        break;
      case 'selectLayer':
        this._disableModalFooter(true);

        view = new SelectLayerView({
          model: this.model,
          customBaselayersCollection: this._customBaselayersCollection
        });
        break;
      case 'saveFail':
        this._disableModalFooter(true);

        view = new ErrorView({
          title: _t('components.modals.add-basemap.add-basemap-error')
        });
        break;
      case 'fetchingLayers':
        this._disableModalFooter(true);

        view = ViewFactory.createByHTML(
          renderLoading({
            title: _t('components.modals.add-basemap.fetching')
          })
        );
        break;
      case 'enterURL':
      default:
        this._disableModalFooter(false);

        view = ViewFactory.createByHTML(
          enterUrl({
            layersFetched: this.model.get('layersFetched'),
            layers: this.model.wmsLayersCollection
          })
        );
        break;
    }
    this.addView(view);
    this.$el.append(view.render().el);

    this.$('.js-search-input').focus();

    return this;
  },

  _showCleanSearchButton: function () {
    this.$('.js-clean-search').show();
  },

  _hideCleanSearchButton: function () {
    this.$('.js-clean-search').hide();
  },

  _initBinds: function () {
    this.model.bind('change', this.render, this);
    this.model.bind('change', this._onChangeSearchQuery, this);
    this.model.bind('layersFetched', this.render, this);
  },

  _onKeydown: function (e) {
    e.stopPropagation();

    this._debouncedUpdate();
  },

  _onPaste: function (e) {
    e.stopPropagation();

    this._debouncedUpdate();
  },

  _update: function (e) {
    this._disableOkBtn(!this.$('.js-url').val());
    this.$('.js-error').removeClass('is-visible'); // resets error state when changed
  },

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

  _onKeyDown: function (e) {
    var enterPressed = (e.keyCode === $.ui.keyCode.ENTER);

    if (enterPressed) {
      this.killEvent(e);

      this._submitSearch();
    }
  },

  _submitSearch: function (e) {
    this.killEvent(e);

    this.model.set('searchQuery', this.$('.js-search-input').val());
  },

  _onChangeSearchQuery: function () {
    var searchQuery = this.model.get('searchQuery');

    if (!searchQuery) {
      this._hideCleanSearchButton();
    }
  },

  _onCleanSearchClick: function (e) {
    this.killEvent(e);

    this.model.set('searchQuery', '');
  },

  _onClickOK: function (e) {
    this.killEvent(e);

    var url = this.$('.js-url').val();

    if (url) {
      this.model.fetchLayers(url);
    }
  },

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

  _updateOkBtn: function () {
    this._submitButton.find('span').text(_t('components.modals.add-basemap.get-layers'));
  },

  _bindSubmitButton: function () {
    this._submitButton.on('click', this._onClickBinded);
  },

  _unBindSubmitButton: function () {
    this._submitButton.off('click', this._onClickBinded);
  },

  clean: function () {
    this._unBindSubmitButton();
    CoreView.prototype.clean.call(this);
  }

});