85 lines
3.2 KiB
JavaScript
85 lines
3.2 KiB
JavaScript
define(['backbone', 'underscore', 'gettext'], function(Backbone, _, gettext) {
|
|
var FileUpload = Backbone.Model.extend({
|
|
defaults: {
|
|
title: '',
|
|
message: '',
|
|
selectedFile: null,
|
|
uploading: false,
|
|
uploadedBytes: 0,
|
|
totalBytes: 0,
|
|
finished: false,
|
|
mimeTypes: [],
|
|
fileFormats: []
|
|
},
|
|
validate: function(attrs, options) {
|
|
if (attrs.selectedFile && !this.checkTypeValidity(attrs.selectedFile)) {
|
|
return {
|
|
message: _.template(gettext('Only <%- fileTypes %> files can be uploaded. Please select a file ending in <%- (fileExtensions) %> to upload.'))( // eslint-disable-line max-len
|
|
this.formatValidTypes()
|
|
),
|
|
attributes: {selectedFile: true}
|
|
};
|
|
}
|
|
},
|
|
// Return a list of this uploader's valid file types
|
|
fileTypes: function() {
|
|
var mimeTypes = _.map(
|
|
this.attributes.mimeTypes,
|
|
function(type) {
|
|
return type.split('/')[1].toUpperCase();
|
|
}
|
|
),
|
|
fileFormats = _.map(
|
|
this.attributes.fileFormats,
|
|
function(type) {
|
|
return type.toUpperCase();
|
|
}
|
|
);
|
|
|
|
return mimeTypes.concat(fileFormats);
|
|
},
|
|
checkTypeValidity: function(file) {
|
|
var attrs = this.attributes,
|
|
getRegExp = function(formats) {
|
|
// Creates regular expression like: /(?:.+)\.(jpg|png|gif)$/i
|
|
return RegExp(('(?:.+)\\.(' + formats.join('|') + ')$'), 'i');
|
|
};
|
|
|
|
return (attrs.mimeTypes.length === 0 && attrs.fileFormats.length === 0)
|
|
|| _.contains(attrs.mimeTypes, file.type)
|
|
|| getRegExp(attrs.fileFormats).test(file.name);
|
|
},
|
|
// Return strings for the valid file types and extensions this
|
|
// uploader accepts, formatted as natural language
|
|
formatValidTypes: function() {
|
|
var attrs = this.attributes;
|
|
|
|
if (attrs.mimeTypes.concat(attrs.fileFormats).length === 1) {
|
|
return {
|
|
fileTypes: this.fileTypes()[0],
|
|
fileExtensions: '.' + this.fileTypes()[0].toLowerCase()
|
|
};
|
|
}
|
|
var or = gettext('or');
|
|
var formatTypes = function(types) {
|
|
return _.template('<%- initial %> <%- or %> <%- last %>')({
|
|
initial: _.initial(types).join(', '),
|
|
or: or,
|
|
last: _.last(types)
|
|
});
|
|
};
|
|
return {
|
|
fileTypes: formatTypes(this.fileTypes()),
|
|
fileExtensions: formatTypes(
|
|
_.map(this.fileTypes(),
|
|
function(type) {
|
|
return '.' + type.toLowerCase();
|
|
})
|
|
)
|
|
};
|
|
}
|
|
});
|
|
|
|
return FileUpload;
|
|
}); // end define()
|