CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/cartodb/common/dialogs/delete_items_view.js

Summary

Maintainability
B
4 hrs
Test Coverage
var cdb = require('cartodb.js-v3');
var BaseDialog = require('../views/base_dialog/view');
var pluralizeString = require('../view_helpers/pluralize_string');
var randomQuote = require('../view_helpers/random_quote');
var MapCardPreview = require('../views/mapcard_preview');
var $ = require('jquery-cdb-v3');
var moment = require('moment-v3');

var AFFECTED_ENTITIES_SAMPLE_COUNT = 3;
var AFFECTED_VIS_COUNT = 3;

/**
 * Delete items dialog
 */
module.exports = BaseDialog.extend({

  initialize: function() {
    this.elder('initialize');
    if (!this.options.viewModel) {
      throw new TypeError('viewModel is required');
    }
    if (!this.options.user) {
      throw new TypeError('user is required');
    }

    this._viewModel = this.options.viewModel;
    this._viewModel.loadPrerequisites();
    this._viewModel.bind('change', function() {
      if (this._viewModel.state() === 'DeleteItemsDone') {
        this.close();
      } else {
        this.render();
      }
    }, this);
    this.add_related_model(this._viewModel);
  },

  render: function() {
    BaseDialog.prototype.render.call(this);
    this._loadMapPreviews();
    return this;
  },

  /**
   * @implements cdb.ui.common.Dialog.prototype.render_content
   */
  render_content: function() {
    return this['_render' + this._viewModel.state()]();
  },

  _renderLoadingPrerequisites: function() {
    return cdb.templates.getTemplate('common/templates/loading')({
      title: 'Checking what consequences deleting the selected ' + this._pluralizedContentType() + ' would have...',
      quote: randomQuote()
    });
  },

  _renderLoadPrerequisitesFail: function() {
    return cdb.templates.getTemplate('common/templates/fail')({
      msg: 'Failed to check consequences of deleting the selected ' + this._pluralizedContentType()
    });
  },

  _renderConfirmDeletion: function() {
    // An entity can be an User or Organization
    var affectedEntities = this._viewModel.affectedEntities();
    var affectedVisData = this._viewModel.affectedVisData();

    return cdb.templates.getTemplate('common/dialogs/delete_items_view_template')({
      firstItemName: this._getFirstItemName(),
      selectedCount: this._viewModel.length,
      isDatasets: this._viewModel.isDeletingDatasets(),
      pluralizedContentType: this._pluralizedContentType(),
      affectedEntitiesCount: affectedEntities.length,
      affectedEntitiesSample: affectedEntities.slice(0, AFFECTED_ENTITIES_SAMPLE_COUNT),
      affectedEntitiesSampleCount: AFFECTED_ENTITIES_SAMPLE_COUNT,
      affectedVisCount: affectedVisData.length,
      pluralizedMaps: pluralizeString('map', affectedVisData.length),
      affectedVisVisibleCount: AFFECTED_VIS_COUNT,
      visibleAffectedVis: this._prepareVisibleAffectedVisForTemplate(affectedVisData.slice(0, AFFECTED_VIS_COUNT))
    });
  },

  _prepareVisibleAffectedVisForTemplate: function(visibleAffectedVisData) {
    return visibleAffectedVisData.map(function(visData) {
      var vis = new cdb.admin.Visualization(visData);
      var owner = vis.permission.owner;
      return {
        visId: vis.get('id'),
        name: vis.get('name'),
        url: vis.viewUrl(this.options.user).edit(),
        owner: owner,
        ownerName: owner.get('username'),
        isOwner: vis.permission.isOwner(this.options.user),
        showPermissionIndicator: !vis.permission.hasWriteAccess(this.options.user),
        timeDiff: moment(vis.get('updated_at')).fromNow(),
        authTokens: vis.get('auth_tokens').join(';')
      };
    }, this);
  },

  /**
   * @overrides BaseDialog.prototype.ok
   */
  ok: function() {
    this._viewModel.deleteItems();
    this.render();
  },

  _loadMapPreviews: function() {
    var self = this;

    this.$el.find('.MapCard').each(function() {
      var username = $(this).data('visOwnerName');
      var mapCardPreview = new MapCardPreview({
        el: $(this).find('.js-header'),
        width: 298,
        height: 130,
        mapsApiResource: cdb.config.getMapsResourceName(username),
        visId: $(this).data('visId'),
        username: username,
        authTokens: $(this).data('visAuthTokens').split(';')
      }).load();

      self.addView(mapCardPreview);
    });
  },

  _renderDeletingItems: function() {
    return cdb.templates.getTemplate('common/templates/loading')({
      title: 'Deleting the selected ' + this._pluralizedContentType() + '...',
      quote: randomQuote()
    });
  },

  _renderDeleteItemsFail: function() {
    var message = this._viewModel.errorMessage().replace(/\n/g, '<br>');
    if (message === 'something failed') {
      message = '';
    }
    return cdb.templates.getTemplate('common/templates/fail')({
      msg: 'Failed to delete the selected ' + this._pluralizedContentType() + '. ' + message
    });
  },

  _pluralizedContentType: function() {
    return pluralizeString(
      this._viewModel.isDeletingDatasets() ? 'dataset' : 'map',
      this._viewModel.length
    );
  },

  _getFirstItemName: function() {
    if (!this.options.viewModel) return;

    var firstItem = this.options.viewModel.at(0);

    if (firstItem) {
      return firstItem.get("name");
    }
  }

});