185 lines
4.7 KiB
JavaScript
185 lines
4.7 KiB
JavaScript
|
var Backbone = require('backbone');
|
||
|
var _ = require('underscore');
|
||
|
var $ = require('jquery');
|
||
|
|
||
|
module.exports = Backbone.Model.extend({
|
||
|
|
||
|
SYSTEM_COLUMNS: ['the_geom', 'the_geom_webmercator', 'created_at', 'updated_at', 'cartodb_id', 'cartodb_georef_status'],
|
||
|
|
||
|
TEMPLATES: {},
|
||
|
|
||
|
initialize: function (attrs, opts) {
|
||
|
if (!opts.configModel) throw new Error('configModel is required');
|
||
|
|
||
|
this._configModel = opts.configModel;
|
||
|
},
|
||
|
|
||
|
clearFields: function () {
|
||
|
this.set({ 'fields': [] });
|
||
|
},
|
||
|
|
||
|
saveFields: function (where) {
|
||
|
where = where || 'old_fields';
|
||
|
this.set(where, _.clone(this.get('fields')));
|
||
|
},
|
||
|
|
||
|
fieldCount: function () {
|
||
|
var fields = this.get('fields');
|
||
|
if (!fields) return 0;
|
||
|
return fields.length;
|
||
|
},
|
||
|
|
||
|
restoreFields: function (whiteList, from) {
|
||
|
from = from || 'old_fields';
|
||
|
var fields = this.get(from);
|
||
|
if (whiteList) {
|
||
|
fields = fields.filter(function (f) {
|
||
|
return _.contains(whiteList, f.name);
|
||
|
});
|
||
|
}
|
||
|
if (fields && fields.length) {
|
||
|
this._setFields(fields);
|
||
|
}
|
||
|
this.unset(from);
|
||
|
},
|
||
|
|
||
|
containsField: function (fieldName) {
|
||
|
var fields = this.get('fields') || [];
|
||
|
return _.contains(_(fields).pluck('name'), fieldName);
|
||
|
},
|
||
|
|
||
|
getFieldProperty: function (fieldName, k) {
|
||
|
if (this.containsField(fieldName)) {
|
||
|
var fields = this.get('fields') || [];
|
||
|
var idx = _.indexOf(_(fields).pluck('name'), fieldName);
|
||
|
return fields[idx][k];
|
||
|
}
|
||
|
return null;
|
||
|
},
|
||
|
|
||
|
setFieldProperty: function (fieldName, k, v) {
|
||
|
if (this.containsField(fieldName)) {
|
||
|
var fields = this._cloneFields() || [];
|
||
|
var idx = _.indexOf(_(fields).pluck('name'), fieldName);
|
||
|
fields[idx][k] = v;
|
||
|
this._setFields(fields);
|
||
|
}
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
_cloneFields: function () {
|
||
|
return _(this.get('fields')).map(function (v) {
|
||
|
return _.clone(v);
|
||
|
});
|
||
|
},
|
||
|
|
||
|
_setFields: function (f) {
|
||
|
f.sort(function (a, b) { return a.position - b.position; });
|
||
|
this.set({ 'fields': f });
|
||
|
},
|
||
|
|
||
|
sortFields: function () {
|
||
|
this.get('fields').sort(function (a, b) { return a.position - b.position; });
|
||
|
},
|
||
|
|
||
|
_addField: function (fieldName, at) {
|
||
|
var dfd = $.Deferred();
|
||
|
if (!this.containsField(fieldName)) {
|
||
|
var fields = this.get('fields');
|
||
|
|
||
|
if (fields) {
|
||
|
at = at === undefined ? fields.length : at;
|
||
|
fields.push({ name: fieldName, title: true, position: at });
|
||
|
} else {
|
||
|
at = at === undefined ? 0 : at;
|
||
|
this.set('fields', [{ name: fieldName, title: true, position: at }], { silent: true });
|
||
|
}
|
||
|
}
|
||
|
dfd.resolve();
|
||
|
return dfd.promise();
|
||
|
},
|
||
|
|
||
|
addField: function (fieldName, at) {
|
||
|
var self = this;
|
||
|
$.when(this._addField(fieldName, at)).then(function () {
|
||
|
self.sortFields();
|
||
|
self.trigger('add:fields');
|
||
|
self.trigger('change:fields', self, self.get('fields'));
|
||
|
self.trigger('change', self);
|
||
|
});
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
removeField: function (fieldName) {
|
||
|
if (this.containsField(fieldName)) {
|
||
|
var fields = this._cloneFields() || [];
|
||
|
var idx = _.indexOf(_(fields).pluck('name'), fieldName);
|
||
|
if (idx >= 0) {
|
||
|
fields.splice(idx, 1);
|
||
|
}
|
||
|
this._setFields(fields);
|
||
|
this.trigger('remove:fields');
|
||
|
}
|
||
|
return this;
|
||
|
},
|
||
|
|
||
|
getAlternativeName: function (fieldName) {
|
||
|
return this.get('alternative_names') && this.get('alternative_names')[fieldName];
|
||
|
},
|
||
|
|
||
|
setAlternativeName: function (fieldName, alternativeName) {
|
||
|
var alternativeNames = _.clone(this.get('alternative_names') || {});
|
||
|
|
||
|
alternativeNames[fieldName] = alternativeName;
|
||
|
this.set({ 'alternative_names': alternativeNames });
|
||
|
this.trigger('change:alternative_names');
|
||
|
},
|
||
|
|
||
|
getFieldPos: function (fieldName) {
|
||
|
var p = this.getFieldProperty(fieldName, 'position');
|
||
|
if (p === undefined) {
|
||
|
return Number.MAX_VALUE;
|
||
|
}
|
||
|
return p;
|
||
|
},
|
||
|
|
||
|
unsetTemplate: function () {
|
||
|
this.setTemplate('');
|
||
|
},
|
||
|
|
||
|
setTemplate: function (templateName) {
|
||
|
var template = (typeof (this.TEMPLATES[templateName]) === 'undefined') ? '' : this.TEMPLATES[templateName];
|
||
|
|
||
|
var attrs = {
|
||
|
'template_name': templateName,
|
||
|
'template': template,
|
||
|
'template_type': 'mustache'
|
||
|
};
|
||
|
|
||
|
if (templateName === '') {
|
||
|
attrs.fields = [];
|
||
|
}
|
||
|
|
||
|
this.set(attrs);
|
||
|
},
|
||
|
|
||
|
getTemplate: function () {
|
||
|
var template_name = this.get('template_name');
|
||
|
|
||
|
if (template_name !== '') {
|
||
|
return this.TEMPLATES['custom_' + template_name];
|
||
|
} else {
|
||
|
return this.get('template');
|
||
|
}
|
||
|
},
|
||
|
|
||
|
hasTemplate: function () {
|
||
|
return !!this.get('template_name') && this.TEMPLATES[this.get('template_name')];
|
||
|
},
|
||
|
|
||
|
isCustomTemplate: function () {
|
||
|
return this.get('template_name') === '' && this.get('template') !== '';
|
||
|
}
|
||
|
|
||
|
});
|