CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/components/modals/publish/share/share-view.js

Summary

Maintainability
A
2 hrs
Test Coverage
var _ = require('underscore');
var CoreView = require('backbone/core-view');
var template = require('./share.tpl');
var GrantableCollection = require('builder/data/grantables-collection');
var SearchPaginationView = require('builder/components/pagination-search/pagination-search-view');
var ListView = require('./share-list-view');

var REQUIRED_OPTS = [
  'configModel',
  'currentUserId',
  'organization',
  'visDefinitionModel'
];

module.exports = CoreView.extend({
  initialize: function (opts) {
    _.each(REQUIRED_OPTS, function (item) {
      if (!opts[item]) throw new Error(item + ' is required');
      this['_' + item] = opts[item];
    }, this);

    this._grantablesCollection = new GrantableCollection([], {
      currentUserId: this._currentUserId,
      organization: this._organization,
      configModel: this._configModel
    });

    this._sharePermissionModel = this._visDefinitionModel.getPermissionModel().clone();
    this._initBinds();
  },

  render: function () {
    this.clearSubViews();
    this.$el.html(template({
      name: this._visDefinitionModel.get('name')
    }));
    this._initViews();
    return this;
  },

  _initBinds: function () {
    this._sharePermissionModel.acl.on('add remove reset change', this._onSave, this);
    this.add_related_model(this._sharePermissionModel.acl);
  },

  _initViews: function () {
    var self = this;

    this._searchPaginationView = new SearchPaginationView({
      className: 'u-inner',
      listCollection: this._grantablesCollection,
      createContentView: function (opts) {
        return new ListView(_.extend({}, opts, {
          collection: self._grantablesCollection,
          currentUserId: self._currentUserId,
          sharePermissionModel: self._sharePermissionModel,
          organization: self._organization,
          isVisualization: self._visDefinitionModel.isVisualization()
        }));
      }
    });
    this.addView(this._searchPaginationView);
    this.$('.js-body').html(this._searchPaginationView.render().el);
  },

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

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

  _onSave: function () {
    var permission = this._visDefinitionModel.getPermissionModel();
    permission.overwriteAcl(this._sharePermissionModel);
    // Show loading here
    permission.save()
      .fail(this._searchPaginationView.showError.bind(this._searchPaginationView));
  }
});