CartoDB/cartodb20

View on GitHub
lib/assets/javascripts/builder/data/query-columns-collection.js

Summary

Maintainability
A
1 hr
Test Coverage
var Backbone = require('backbone');
var _ = require('underscore');
var QueryColumnModel = require('./query-column-model');

module.exports = Backbone.Collection.extend({

  model: function (attrs, opts) {
    var self = opts.collection;
    return new QueryColumnModel(attrs, {
      configModel: self._configModel,
      tableName: self._tableName
    });
  },

  url: function () {
    if (this._tableName) {
      var baseUrl = this._configModel.get('base_url');
      var version = this._configModel.urlVersion('column');
      return baseUrl + '/api/' + version + '/tables/' + this._tableName + '/columns';
    }

    return false;
  },

  initialize: function (models, opts) {
    if (!opts.configModel) throw new Error('configModel is required');
    if (!opts.querySchemaModel) throw new Error('querySchemaModel is required');

    this._tableName = opts.tableName;
    this._querySchemaModel = opts.querySchemaModel;
    this._configModel = opts.configModel;
    this._initBinds();
  },

  _initBinds: function () {
    this.bind('add remove change:type change:name', function () {
      this.reset();
      this._querySchemaModel.set('status', 'unfetched');
      this._querySchemaModel.fetch();
    }, this);
    this._querySchemaModel.bind('change:status', function (mdl, status) {
      if (status === 'fetched') {
        this.reset(this._querySchemaModel.columnsCollection.toJSON());
      }
    }, this);
  },

  setTableName: function (name) {
    if (!name) return;

    if (this._tableName) {
      this._tableName = name;

      this.each(function (columnModel) {
        columnModel._tableName = name;
      });
    }
  },

  addColumn: function (opts) {
    opts = opts || {};
    this.create(
      {
        name: 'column_' + new Date().getTime(),
        type: 'string',
        isNew: true
      },
      _.extend(
        opts,
        {
          wait: true,
          parse: false
        }
      )
    );
  }

});