cartodb/lib/assets/javascripts/builder/data/asset-model.js
2020-06-15 10:58:47 +08:00

133 lines
3.2 KiB
JavaScript
Executable File

var _ = require('underscore');
var Backbone = require('backbone');
var Utils = require('builder/helpers/utils');
require('backbone-model-file-upload');
module.exports = Backbone.Model.extend({
fileAttribute: 'filename',
defaults: {
type: '',
filename: '',
interval: 0,
progress: 0,
state: 'idle',
option: ''
},
_initBinds: function () {
this.bind('progress', function (progress) {
this.set({
progress: progress * 100,
state: 'uploading'
});
}, this);
this.bind('change:filename change:url', function () {
if (this.get('state') === 'error') {
this.set({ state: 'idle' });
this.unset('get_error_text', { silent: true });
}
}, this);
this.bind('error invalid', function (m, d) {
this.set({
state: 'error',
error_code: (d && d.error_code) || '',
get_error_text: {
title: _t('componentes.data.asset-model.invalid-import'),
what_about: (d && d.msg) || ''
}
}, { silent: true });
// We need this, if not validate will run again and again and again... :(
this.trigger('change');
}, this);
},
validate: function (attrs) {
if (!attrs) {
return;
}
if (attrs.type === 'filename') { // Number of files
if (attrs.filename && attrs.filename.length) {
return {
msg: _t('componentes.data.asset-model.one-file-per-upload')
};
}
// File extension
var name = attrs.filename.name;
var ext = name.substr(name.lastIndexOf('.') + 1);
if (ext) {
ext = ext.toLowerCase();
}
if (!_.contains(['jpg', 'png', 'gif', 'svg'], ext)) {
return {
msg: _t('componentes.data.asset-model.invalid-extension')
};
}
}
if (attrs.type === 'url') { // Valid URL?
if (!Utils.isURL(attrs.url)) {
return {
msg: _t('componentes.data.asset-model.invalid-url')
};
}
}
},
isValid: function () {
return (this.get('filename') || this.get('url')) && this.get('state') !== 'error';
},
upload: function () {
var self = this;
var options = {
kind: this.get('kind')
};
if (this.get('type') === 'file') {
options.filename = this.get('filename');
} else if (this.get('type') === 'url') {
options.filename = this.get('filename');
}
this.xhr = this.save(options, {
success: function (m) {
m.set('state', 'uploaded');
},
error: function (m, msg) {
var response;
var message = _t('componentes.data.asset-model.connection-error');
if (msg && msg.status === 429) {
response = JSON.parse(msg.responseText);
message = response.error;
} else if (msg && msg.status === 400) {
response = JSON.parse(msg.responseText);
message = response.error;
}
self.set({
state: 'error',
get_error_text: { title: _t('componentes.data.asset-model.error'), what_about: message }
});
},
complete: function () {
delete self.xhr;
}
});
},
stopUpload: function () {
if (this.xhr) this.xhr.abort();
}
});