file_upload.js 6.94 KiB
/*
 * Copyright (C) 2015 IRSTEA
 * All rights reserved.
 */
(function($) {
    var formatFileSize = function(size, precision) {
            if(typeof(precision) === "undefined") {
                precision = 2;
            if(size > 1000000000) {
                return (size/1000000000).toFixed(precision) + ' Gio';
            if(size > 1000000) {
                return (size/1000000).toFixed(precision) + ' Mio';
            if(size > 1000) {
                return (size/1000).toFixed(precision)+ ' Kio';
            return size + ' o';
        formatBitrate = function(rate) {
            return formatFileSize(rate) + '/s';
    $.blueimp.fileupload.prototype._formatFileSize = formatFileSize;
    $.blueimp.fileupload.prototype._formatBitrate = formatBitrate;
    /** Plugin irsteaFileUpload.
    $.fn.irsteaFileUpload = function(options) {
        var $this             = $(this),
            $button           = $this.find('.fileinput-button'),
            $entries          = $this.find('.fileinput-entries'),
            createUrl         = options.createUrl,
            uploadPrototype   = options.uploadPrototype,
            downloadPrototype = options.downloadPrototype,
            csrfQuery         = '?token=' + options.csrfToken;
        delete options.createUrl;
        delete options.uploadPrototype;
        delete options.downloadPrototype;
        delete options.csrfToken;
        if(options.acceptFileTypes) {
            options.acceptFileTypes = new RegExp('^' + options.acceptFileTypes + '$');
        var updateDisplay = function() {
            var hasEntry = false;
            $entries.find('.fileinput-entry').each(function() {
                var data = $(this).data('data'),
                    inError = !!(data && data.files.error);
                $(this).toggleClass('alert alert-danger', inError);
                $(this).find('.error').toggle(inError);
                hasEntry = true;
            });
            $button.toggle(options.multiple || !hasEntry);
        $this.find('.size').each(function() {
            $(this).text(formatFileSize($(this).text(), $(this).data('size-precision')));
        });
        updateDisplay();
        // Activation
        $button.fileupload($.extend(
            options,
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
{ type: 'PUT', autoUpload: true, formData: {}, multipart: false, uploadTemplateId: null, downloadTemplateId: null, filesContainer: $this.find('.fileinput-entries'), uploadTemplate: function(data) { var rows = $(); $.each(data.files, function (index, file) { var row = $(uploadPrototype); row.find('.name').text(file.name); row.find('.size').text(formatFileSize(file.size)); if (file.error) { row.find('.error').text(file.error); } rows = rows.add(row); }); return rows; }, downloadTemplate: function(data) { var rows = $(); $.each(data.files, function (index, file) { var row = $(downloadPrototype); row.find('.size').text(formatFileSize(file.size)); if (file.error) { row.find('.name').text(file.name); row.find('.error').text(file.error); } else { row.find('.name a') .text(file.name) .prop('href', file.url + csrfQuery); row.find('.delete') .attr('data-type', file.delete_type) .attr('data-url', file.delete_url + csrfQuery); row.find('input:hidden') .val(file.id); if(file.icon && file.icon !== 'file') { row.find('.icon') .removeClass('fa-file-o') .addClass('fa-file-'+file.icon+'-o'); } } rows = rows.add(row); }); return rows; }, submit: function (e, data) { var $this = $(this), file = data.files[0]; $.post( createUrl, { file: { name: file.name, size: file.size, type: file.type, lastModified: file.lastModified } }, function(response) { if(response.status == 201) { file.icon = response.icon; data.url = response.put_url + csrfQuery; data.delete_url = response.delete_url; data.delete_type = response.delete_type; data.jqXHR = $this.fileupload('send', data); } else { file.error = response.message || ('Error #' + response.status); data.files.error = true; data.context.find('.error').text(file.error); } } ); return false; },
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
progress: function (e, data) { if(!data.context || e.isDefaultPrevented()) { return; } var percent = data.loaded / data.total * 100, percentText = percent.toFixed(1); data.context.each(function () { var $this = $(data.context); $this.find('.progress').show(); $this.find('.progress-bar').css('width', percent + '%').attr('aria-valuenow', percentText); $this.find('.progress-text').show().html(percentText + '% ('+formatBitrate(data.bitrate)+')'); }); } } )).bind({ fileuploadfailed: function (e, data) { if(data.delete_url) { $.ajax(data.delete_url + csrfQuery, { type: data.delete_type }); } }, fileuploadadded: updateDisplay, fileuploadfinished: updateDisplay, fileuploaddestroyed: updateDisplay, fileuploadprocessalways: updateDisplay }); if(options.disabled || options.readonly) { $button.fileupload('disable'); } }; })(jQuery);