cartodb/lib/assets/javascripts/builder/data/query-column-model.js

102 lines
2.3 KiB
JavaScript
Raw Normal View History

2020-06-15 10:58:47 +08:00
var _ = require('underscore');
var Backbone = require('backbone');
var DEACTIVATE_MATRIX = {
'number': ['date'],
'boolean': ['date'],
'date': ['boolean']
};
var DESTRUCTIVE_MATRIX = {
'string': {
'string': false,
'number': true,
'date': true,
'boolean': true
},
'number': {
'string': false,
'number': false,
'date': true,
'boolean': true
},
'date': {
'string': false,
'number': true,
'date': false,
'boolean': true
},
'boolean': {
'string': false,
'number': false,
'date': true,
'boolean': false
}
};
var NON_EDITABLE_ATTRIBUTES = [
'the_geom_webmercator',
'cartodb_id',
'the_geom'
];
module.exports = Backbone.Model.extend({
url: function () {
if (this._tableName) {
var baseUrl = this._configModel.get('base_url');
var version = this._configModel.urlVersion('column');
var url = baseUrl + '/api/' + version + '/tables/' + this._tableName + '/columns/';
if (!this.isNew()) {
// If name changes, we should point to the "old" name
// in order to make the correct call
url += this.previous('name') || this.get('name');
}
return url;
}
return false;
},
parse: function (attrs) {
return {
name: attrs.name,
type: attrs.cartodb_type || attrs.type,
isNew: false
};
},
initialize: function (models, opts) {
if (!opts.configModel) throw new Error('configModel is required');
this._tableName = opts.tableName;
this._configModel = opts.configModel;
},
isNew: function () {
return this.get('isNew');
},
isEditable: function () {
return !_.contains(NON_EDITABLE_ATTRIBUTES, this.get('name'));
},
// This is relative becuase we could set any value to cartodb_id
isCartoDBIDColumn: function () {
return this.get('name') === 'cartodb_id' && this.get('type') === 'number';
},
isGeometryColumn: function () {
return this.get('type') === 'geometry';
}
}, {
isTypeChangeDestructive: function (type, newType) {
return DESTRUCTIVE_MATRIX[type][newType];
},
isTypeChangeAllowed: function (type, newType) {
var deactivated = DEACTIVATE_MATRIX[type] || [];
deactivated = deactivated.concat([type]);
return !_.contains(deactivated, newType);
}
});