CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/modals/dataset-metadata/dataset-metadata-view.js

Summary

Maintainability
D
1 day
Test Coverage
var Backbone = require('backbone');
var CoreView = require('backbone/core-view');
var _ = require('underscore');
var VisMetadataModel = require('builder/data/vis-metadata-model');
var template = require('./dataset-metadata.tpl');
var FooterView = require('./footer/footer-view');
var templateError = require('./dataset-metadata-error.tpl');
var templateLoading = require('builder/components/loading/render-loading');
var FormView = require('./form/form-view');
var saveMetadata = require('./save-metadata-dataset');
var errorParser = require('builder/helpers/error-parser');
var Notifier = require('builder/components/notifier/notifier');
var utils = require('builder/helpers/utils');

module.exports = CoreView.extend({
  events: {
    'click .js-back': '_onBackFromError'
  },

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

  initialize: function (opts) {
    if (!opts.modalModel) throw new TypeError('modalModel is required');
    if (!opts.visDefinitionModel) throw new TypeError('visDefinitionModel is required');
    if (!opts.configModel) throw new TypeError('configModel is required');
    if (opts.isLocked === undefined) throw new TypeError('isLocked is required');

    this._modalModel = opts.modalModel;
    this._visDefinitionModel = opts.visDefinitionModel;
    this._configModel = opts.configModel;
    this._isLocked = opts.isLocked;

    this._visMetadataModel = new VisMetadataModel({
      name: this._visDefinitionModel.get('name'),
      description: this._visDefinitionModel.get('description'),
      license: this._visDefinitionModel.get('license'),
      source: this._visDefinitionModel.get('source'),
      attributions: this._visDefinitionModel.get('attributions'),
      tags: this._visDefinitionModel.get('tags')
    });

    this._stateModel = new Backbone.Model({
      status: 'show'
    });

    this._initBinds();
  },

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

    if (this._hasError()) {
      this._renderError();
    } else if (this._isLoading()) {
      this._renderLoading();
    } else {
      this.$el.html(template());
      this._initViews();
    }
    return this;
  },

  _initViews: function () {
    var formView = new FormView({
      visDefinitionModel: this._visDefinitionModel,
      visMetadataModel: this._visMetadataModel,
      configModel: this._configModel,
      isLocked: this._isLocked
    });

    this.$('.js-content').append(formView.render().el);
    this.addView(formView);

    var footerView = new FooterView({
      visMetadataModel: this._visMetadataModel,
      onSaveAction: this._onSave.bind(this),
      onCloseAction: this._onClose.bind(this)
    });

    this.$('.js-footer').append(footerView.render().el);
    this.addView(footerView);
  },

  _renderError: function () {
    var error = this._stateModel.get('error');
    this.$el.html(templateError({
      error: _t('components.modals.dataset-metadata.error.subtitle', {error: error})
    }));
  },

  _renderLoading: function () {
    this.$el.html(
      templateLoading({
        title: _t('components.modals.dataset-metadata.loading')
      })
    );
  },

  _initBinds: function () {
    this._stateModel.on('change:status', this.render, this);
    this.add_related_model(this._stateModel);
  },

  _hasError: function () {
    return this._stateModel.get('status') === 'error';
  },

  _isLoading: function () {
    return this._stateModel.get('status') === 'loading';
  },

  _onSave: function () {
    this._stateModel.set({status: 'loading'});

    saveMetadata({
      onSuccess: this._onSuccessSave.bind(this),
      onError: this._onErrorSave.bind(this),
      visDefinitionModel: this._visDefinitionModel,
      name: this._getMetadataName(),
      description: this._getMetadataDescription(),
      tags: this._getMetadataTags(),
      source: this._visMetadataModel.get('source'),
      attributions: this._visMetadataModel.get('attributions'),
      license: this._visMetadataModel.get('license')
    });
  },

  _onSuccessSave: function () {
    var self = this;
    Notifier.addNotification({
      status: 'success',
      info: _t('components.modals.dataset-metadata.success', {
        name: self._getMetadataName()
      }),
      closable: true,
      delay: Notifier.DEFAULT_DELAY
    });

    this._modalModel.destroy();
  },

  _onClose: function () {
    this._modalModel.destroy();
  },

  _onErrorSave: function (e) {
    this._stateModel.set({
      status: 'error',
      error: errorParser(e)
    });
  },

  _onBackFromError: function () {
    this._stateModel.set({status: 'show'});
  },

  _getMetadataName: function () {
    return utils.sanitizeHtml(this._visMetadataModel.get('name'));
  },

  _getMetadataDescription: function () {
    return utils.sanitizeHtml(this._visMetadataModel.get('description'));
  },

  _getMetadataTags: function () {
    return _.map(this._visMetadataModel.get('tags'), function (tag) {
      return utils.sanitizeHtml(tag);
    });
  }
});