diff --git a/README.md b/README.md index cc2d0e6..1a531c1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The snippet above will add the following js files to the mainfest file. //=require jquery-fileupload/vendor/jquery.ui.widget //=require jquery-fileupload/jquery.iframe-transport //=require jquery-fileupload/jquery.fileupload - //=require jquery-fileupload/jquery.fileupload-ip + //=require jquery-fileupload/jquery.fileupload-fp //=require jquery-fileupload/jquery.fileupload-ui //=require jquery-fileupload/locale diff --git a/vendor/assets/javascripts/jquery-fileupload/index.js b/vendor/assets/javascripts/jquery-fileupload/index.js index 50fff8f..0cda385 100644 --- a/vendor/assets/javascripts/jquery-fileupload/index.js +++ b/vendor/assets/javascripts/jquery-fileupload/index.js @@ -4,6 +4,6 @@ //=require jquery-fileupload/vendor/tmpl //=require jquery-fileupload/jquery.iframe-transport //=require jquery-fileupload/jquery.fileupload -//=require jquery-fileupload/jquery.fileupload-ip +//=require jquery-fileupload/jquery.fileupload-fp //=require jquery-fileupload/jquery.fileupload-ui //=require jquery-fileupload/locale diff --git a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js new file mode 100644 index 0000000..634fb5e --- /dev/null +++ b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js @@ -0,0 +1,219 @@ +/* + * jQuery File Upload File Processing Plugin 1.0 + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * http://www.opensource.org/licenses/MIT + */ + +/*jslint nomen: true, unparam: true, regexp: true */ +/*global define, window, document */ + +(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'canvas-to-blob', + './jquery.fileupload' + ], factory); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // The File Upload IP version extends the basic fileupload widget + // with file processing functionality: + $.widget('blueimpFP.fileupload', $.blueimp.fileupload, { + + options: { + // The list of file processing actions: + process: [ + /* + { + action: 'load', + fileTypes: /^image\/(gif|jpeg|png)$/, + maxFileSize: 20000000 // 20MB + }, + { + action: 'resize', + maxWidth: 1920, + maxHeight: 1200, + minWidth: 800, + minHeight: 600 + }, + { + action: 'save' + } + */ + ], + + // The add callback is invoked as soon as files are added to the + // fileupload widget (via file input selection, drag & drop or add + // API call). See the basic file upload widget for more information: + add: function (e, data) { + $(this).fileupload('process', data).done(function () { + data.submit(); + }); + } + }, + + processActions: { + // Loads the image given via data.files and data.index + // as canvas element. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + load: function (data, options) { + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (window.HTMLCanvasElement && + window.HTMLCanvasElement.prototype.toBlob && + ($.type(options.maxFileSize) !== 'number' || + file.size < options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + loadImage( + file, + function (canvas) { + data.canvas = canvas; + dfd.resolveWith(that, [data]); + }, + {canvas: true} + ); + } else { + dfd.rejectWith(that, [data]); + } + return dfd.promise(); + }, + // Resizes the image given as data.canvas and updates + // data.canvas with the resized image. + // Accepts the options maxWidth, maxHeight, minWidth and + // minHeight to scale the given image: + resize: function (data, options) { + if (data.canvas) { + var canvas = loadImage.scale(data.canvas, options); + if (canvas.width !== data.canvas.width || + canvas.height !== data.canvas.height) { + data.canvas = canvas; + data.processed = true; + } + } + return data; + }, + // Saves the processed image given as data.canvas + // inplace at data.index of data.files: + save: function (data, options) { + // Do nothing if no processing has happened: + if (!data.canvas || !data.processed) { + return data; + } + var that = this, + file = data.files[data.index], + name = file.name, + dfd = $.Deferred(), + callback = function (blob) { + if (!blob.name) { + if (file.type === blob.type) { + blob.name = file.name; + } else if (file.name) { + blob.name = file.name.replace( + /\..+$/, + '.' + blob.type.substr(6) + ); + } + } + // Store the created blob at the position + // of the original file in the files list: + data.files[data.index] = blob; + dfd.resolveWith(that, [data]); + }; + // Use canvas.mozGetAsFile directly, to retain the filename, as + // Gecko doesn't support the filename option for FormData.append: + if (data.canvas.mozGetAsFile) { + callback(data.canvas.mozGetAsFile( + (/^image\/(jpeg|png)$/.test(file.type) && name) || + ((name && name.replace(/\..+$/, '')) || + 'blob') + '.png', + file.type + )); + } else { + data.canvas.toBlob(callback, file.type); + } + return dfd.promise(); + } + }, + + // Resizes the file at the given index and stores the created blob at + // the original position of the files list, returns a Promise object: + _processFile: function (files, index, options) { + var that = this, + dfd = $.Deferred().resolveWith(that, [{ + files: files, + index: index + }]), + chain = dfd.promise(); + that._processing += 1; + $.each(options.process, function (i, settings) { + chain = chain.pipe(function (data) { + return that.processActions[settings.action] + .call(this, data, settings); + }); + }); + chain.always(function () { + that._processing -= 1; + if (that._processing === 0) { + that.element + .removeClass('fileupload-processing'); + } + }); + if (that._processing === 1) { + that.element.addClass('fileupload-processing'); + } + return chain; + }, + + // Processes the files given as files property of the data parameter, + // returns a Promise object that allows to bind a done handler, which + // will be invoked after processing all files (inplace) is done: + process: function (data) { + var that = this, + options = $.extend({}, this.options, data); + if (options.process && options.process.length && + this._isXHRUpload(options)) { + $.each(data.files, function (index, file) { + that._processingQueue = that._processingQueue.pipe( + function () { + var dfd = $.Deferred(); + that._processFile(data.files, index, options) + .always(function () { + dfd.resolveWith(that); + }); + return dfd.promise(); + } + ); + }); + } + return this._processingQueue; + }, + + _create: function () { + $.blueimp.fileupload.prototype._create.call(this); + this._processing = 0; + this._processingQueue = $.Deferred().resolveWith(this) + .promise(); + } + + }); + +})); diff --git a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ip.js b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ip.js deleted file mode 100644 index 4f71b62..0000000 --- a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ip.js +++ /dev/null @@ -1,160 +0,0 @@ -/* - * jQuery File Upload Image Processing Plugin 1.0.6 - * https://github.com/blueimp/jQuery-File-Upload - * - * Copyright 2012, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * http://www.opensource.org/licenses/MIT - */ - -/*jslint nomen: true, unparam: true, regexp: true */ -/*global define, window, document */ - -(function (factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // Register as an anonymous AMD module: - define([ - 'jquery', - 'load-image', - 'canvas-to-blob', - './jquery.fileupload' - ], factory); - } else { - // Browser globals: - factory( - window.jQuery, - window.loadImage, - window.canvasToBlob - ); - } -}(function ($, loadImage, canvasToBlob) { - 'use strict'; - - // The File Upload IP version extends the basic fileupload widget - // with image processing functionality: - $.widget('blueimpIP.fileupload', $.blueimp.fileupload, { - - options: { - // The regular expression to define which image files are to be - // resized, given that the browser supports the operation: - resizeSourceFileTypes: /^image\/(gif|jpeg|png)$/, - // The maximum file size of images that are to be resized: - resizeSourceMaxFileSize: 20000000, // 20MB - // The maximum width of the resized images: - resizeMaxWidth: undefined, - // The maximum height of the resized images: - resizeMaxHeight: undefined, - // The minimum width of the resized images: - resizeMinWidth: undefined, - // The minimum height of the resized images: - resizeMinHeight: undefined, - - // The add callback is invoked as soon as files are added to the fileupload - // widget (via file input selection, drag & drop or add API call). - // See the basic file upload widget for more information: - add: function (e, data) { - $(this).fileupload('resize', data).done(function () { - data.submit(); - }); - } - }, - - // Resizes the image file at the given index and stores the created blob - // at the original position of the files list, returns a Promise object: - _resizeImage: function (files, index, options) { - var that = this, - file = files[index], - deferred = $.Deferred(), - canvas, - blob; - options = options || this.options; - loadImage( - file, - function (img) { - var width = img.width, - height = img.height; - canvas = loadImage.scale(img, { - maxWidth: options.resizeMaxWidth, - maxHeight: options.resizeMaxHeight, - minWidth: options.resizeMinWidth, - minHeight: options.resizeMinHeight, - canvas: true - }); - if (width !== canvas.width || height !== canvas.height) { - canvasToBlob(canvas, function (blob) { - if (!blob.name) { - if (file.type === blob.type) { - blob.name = file.name; - } else if (file.name) { - blob.name = file.name.replace( - /\..+$/, - '.' + blob.type.substr(6) - ); - } - } - files[index] = blob; - deferred.resolveWith(that); - }, file); - } else { - deferred.resolveWith(that); - } - } - ); - return deferred.promise(); - }, - - // Resizes the images given as files property of the data parameter, - // returns a Promise object that allows to bind a done handler, which - // will be invoked after processing all images is done: - resize: function (data) { - var that = this, - options = $.extend({}, this.options, data), - resizeAll = $.type(options.resizeSourceMaxFileSize) !== 'number', - isXHRUpload = this._isXHRUpload(options); - $.each(data.files, function (index, file) { - if (isXHRUpload && that._resizeSupport && - (options.resizeMaxWidth || options.resizeMaxHeight || - options.resizeMinWidth || options.resizeMinHeight) && - (resizeAll || file.size < options.resizeSourceMaxFileSize) && - options.resizeSourceFileTypes.test(file.type)) { - that._processing += 1; - if (that._processing === 1) { - that.element.addClass('fileupload-processing'); - } - that._processingQueue = that._processingQueue.pipe(function () { - var deferred = $.Deferred(); - that._resizeImage( - data.files, - index, - options - ).done(function () { - that._processing -= 1; - if (that._processing === 0) { - that.element - .removeClass('fileupload-processing'); - } - deferred.resolveWith(that); - }); - return deferred.promise(); - }); - } - }); - return this._processingQueue; - }, - - _create: function () { - $.blueimp.fileupload.prototype._create.call(this); - this._processing = 0; - this._processingQueue = $.Deferred().resolveWith(this).promise(); - this._resizeSupport = canvasToBlob && canvasToBlob( - document.createElement('canvas'), - $.noop - ); - } - - }); - -})); diff --git a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js index 1489787..db5db5a 100644 --- a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js +++ b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js @@ -1,5 +1,5 @@ /* - * jQuery File Upload User Interface Plugin 6.6.3 + * jQuery File Upload User Interface Plugin 6.7 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2010, Sebastian Tschan @@ -20,7 +20,7 @@ 'jquery', 'tmpl', 'load-image', - './jquery.fileupload-ip' + './jquery.fileupload-fp' ], factory); } else { // Browser globals: @@ -33,9 +33,9 @@ }(function ($, tmpl, loadImage) { 'use strict'; - // The UI version extends the IP (image processing) version or the basic + // The UI version extends the FP (file processing) version or the basic // file upload widget and adds complete user interface interaction: - var parentWidget = ($.blueimpIP || $.blueimp).fileupload; + var parentWidget = ($.blueimpFP || $.blueimp).fileupload; $.widget('blueimpUI.fileupload', parentWidget, { options: { @@ -70,6 +70,12 @@ uploadTemplateId: 'template-upload', // The ID of the download template: downloadTemplateId: 'template-download', + // The container for the list of files. If undefined, it is set to + // an element with class "files" inside of the widget element: + filesContainer: undefined, + // By default, files are appended to the files container. + // Set the following option to true, to prepend files instead: + prependFiles: false, // The expected data type of the upload response, sets the dataType // option of the $.ajax upload requests: dataType: 'json', @@ -81,13 +87,14 @@ var that = $(this).data('fileupload'), options = that.options, files = data.files; - $(this).fileupload('resize', data).done(data, function () { + $(this).fileupload('process', data).done(function () { that._adjustMaxNumberOfFiles(-files.length); data.isAdjusted = true; data.files.valid = data.isValidated = that._validate(files); - data.context = that._renderUpload(files) - .appendTo(options.filesContainer) - .data('data', data); + data.context = that._renderUpload(files).data('data', data); + options.filesContainer[ + options.prependFiles ? 'prepend' : 'append' + ](data.context); that._renderPreviews(files, data.context); that._forceReflow(data.context); that._transition(data.context).done( @@ -368,22 +375,28 @@ _renderPreview: function (file, node) { var that = this, options = this.options, - deferred = $.Deferred(); + dfd = $.Deferred(); return ((loadImage && loadImage( file, function (img) { node.append(img); that._forceReflow(node); that._transition(node).done(function () { - deferred.resolveWith(node); + dfd.resolveWith(node); }); + if (!$.contains(document.body, node[0])) { + // If the element is not part of the DOM, + // transition events are not triggered, + // so we have to resolve manually: + dfd.resolveWith(node); + } }, { maxWidth: options.previewMaxWidth, maxHeight: options.previewMaxHeight, canvas: options.previewAsCanvas } - )) || deferred.resolveWith(node)) && deferred; + )) || dfd.resolveWith(node)) && dfd; }, _renderPreviews: function (files, nodes) { @@ -395,13 +408,13 @@ ($.type(options.previewSourceMaxFileSize) !== 'number' || file.size < options.previewSourceMaxFileSize)) { that._processingQueue = that._processingQueue.pipe(function () { - var deferred = $.Deferred(); + var dfd = $.Deferred(); that._renderPreview(file, $(element)).done( function () { - deferred.resolveWith(that); + dfd.resolveWith(that); } ); - return deferred.promise(); + return dfd.promise(); }); } }); @@ -462,7 +475,7 @@ _transition: function (node) { var that = this, - deferred = $.Deferred(); + dfd = $.Deferred(); if ($.support.transition && node.hasClass('fade')) { node.bind( $.support.transition.end, @@ -471,15 +484,15 @@ // in the container element, e.g. from button elements: if (e.target === node[0]) { node.unbind($.support.transition.end); - deferred.resolveWith(node); + dfd.resolveWith(node); } } ).toggleClass('in'); } else { node.toggleClass('in'); - deferred.resolveWith(node); + dfd.resolveWith(node); } - return deferred; + return dfd; }, _initButtonBarEventHandlers: function () { @@ -604,9 +617,9 @@ 'uploadTemplateId', 'downloadTemplateId' ); - if (!$.blueimpIP) { + if (!$.blueimpFP) { this._processingQueue = $.Deferred().resolveWith(this).promise(); - this.resize = function () { + this.process = function () { return this._processingQueue; }; } diff --git a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js index 8fb8562..bc379e3 100644 --- a/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js +++ b/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js @@ -1,5 +1,5 @@ /* - * jQuery File Upload Plugin 5.10.0 + * jQuery File Upload Plugin 5.10.1 * https://github.com/blueimp/jQuery-File-Upload * * Copyright 2010, Sebastian Tschan @@ -846,10 +846,9 @@ }, _create: function () { - var options = this.options, - dataOpts = $.extend({}, this.element.data()); - dataOpts[this.widgetName] = undefined; - $.extend(options, dataOpts); + var options = this.options; + // Initialize options set via HTML5 data-attributes: + $.extend(options, $(this.element[0].cloneNode(false)).data()); options.namespace = options.namespace || this.widgetName; this._initSpecialOptions(); this._slots = [];