Files
edx-platform/cms/static/js/models/uploads.js
2023-05-09 13:53:54 +05:00

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()