jquery-fileupload-rails 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +4 -4
- data/lib/jquery/fileupload/rails/version.rb +1 -1
- data/vendor/assets/javascripts/jquery-fileupload/index.js +1 -1
- data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js +219 -0
- data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js +133 -39
- data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js +90 -23
- data/vendor/assets/javascripts/jquery-fileupload/locale.js +3 -1
- data/vendor/assets/javascripts/jquery-fileupload/vendor/canvas-to-blob.js +46 -61
- data/vendor/assets/javascripts/jquery-fileupload/vendor/jquery.ui.widget.js +2 -2
- data/vendor/assets/javascripts/jquery-fileupload/vendor/load-image.js +32 -25
- data/vendor/assets/stylesheets/{jquery.fileupload-ui.css → jquery.fileupload-ui.css.erb} +2 -2
- metadata +4 -4
- data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ip.js +0 -160
data/README.md
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
[jQuery-File-Plugin](https://github.com/blueimp/jQuery-File-Upload) is a file upload plugin written by [Sebastian Tschan](https://github.com/blueimp). jQuery File Upload features multiple file selection, drag&drop support, progress bars and preview images for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing.
|
4
4
|
|
5
|
-
jquery-fileupload-rails is a library that integrates jQuery File Upload for Rails 3.1 Asset Pipeline.
|
5
|
+
jquery-fileupload-rails is a library that integrates jQuery File Upload for Rails 3.1 Asset Pipeline (Rails 3.2 supported).
|
6
6
|
|
7
|
-
jquery-fileupload-rails is currently using jQuery-File-Plugin version 6.
|
7
|
+
jquery-fileupload-rails is currently using jQuery-File-Plugin version 6.9.2.
|
8
8
|
|
9
9
|
## Installing Gem
|
10
10
|
|
@@ -24,7 +24,7 @@ The snippet above will add the following js files to the mainfest file.
|
|
24
24
|
//=require jquery-fileupload/vendor/tmpl
|
25
25
|
//=require jquery-fileupload/jquery.iframe-transport
|
26
26
|
//=require jquery-fileupload/jquery.fileupload
|
27
|
-
//=require jquery-fileupload/jquery.fileupload-
|
27
|
+
//=require jquery-fileupload/jquery.fileupload-fp
|
28
28
|
//=require jquery-fileupload/jquery.fileupload-ui
|
29
29
|
//=require jquery-fileupload/locale
|
30
30
|
|
@@ -39,7 +39,7 @@ The basic setup only includes the following files:
|
|
39
39
|
//=require jquery-fileupload/jquery.fileupload
|
40
40
|
|
41
41
|
## Using the stylesheet
|
42
|
-
|
42
|
+
|
43
43
|
Require the stylesheet file to app/assets/stylesheets/application.css
|
44
44
|
|
45
45
|
*= require jquery.fileupload-ui
|
@@ -4,6 +4,6 @@
|
|
4
4
|
//=require jquery-fileupload/vendor/tmpl
|
5
5
|
//=require jquery-fileupload/jquery.iframe-transport
|
6
6
|
//=require jquery-fileupload/jquery.fileupload
|
7
|
-
//=require jquery-fileupload/jquery.fileupload-
|
7
|
+
//=require jquery-fileupload/jquery.fileupload-fp
|
8
8
|
//=require jquery-fileupload/jquery.fileupload-ui
|
9
9
|
//=require jquery-fileupload/locale
|
@@ -0,0 +1,219 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery File Upload File Processing Plugin 1.0
|
3
|
+
* https://github.com/blueimp/jQuery-File-Upload
|
4
|
+
*
|
5
|
+
* Copyright 2012, Sebastian Tschan
|
6
|
+
* https://blueimp.net
|
7
|
+
*
|
8
|
+
* Licensed under the MIT license:
|
9
|
+
* http://www.opensource.org/licenses/MIT
|
10
|
+
*/
|
11
|
+
|
12
|
+
/*jslint nomen: true, unparam: true, regexp: true */
|
13
|
+
/*global define, window, document */
|
14
|
+
|
15
|
+
(function (factory) {
|
16
|
+
'use strict';
|
17
|
+
if (typeof define === 'function' && define.amd) {
|
18
|
+
// Register as an anonymous AMD module:
|
19
|
+
define([
|
20
|
+
'jquery',
|
21
|
+
'load-image',
|
22
|
+
'canvas-to-blob',
|
23
|
+
'./jquery.fileupload'
|
24
|
+
], factory);
|
25
|
+
} else {
|
26
|
+
// Browser globals:
|
27
|
+
factory(
|
28
|
+
window.jQuery,
|
29
|
+
window.loadImage
|
30
|
+
);
|
31
|
+
}
|
32
|
+
}(function ($, loadImage) {
|
33
|
+
'use strict';
|
34
|
+
|
35
|
+
// The File Upload IP version extends the basic fileupload widget
|
36
|
+
// with file processing functionality:
|
37
|
+
$.widget('blueimpFP.fileupload', $.blueimp.fileupload, {
|
38
|
+
|
39
|
+
options: {
|
40
|
+
// The list of file processing actions:
|
41
|
+
process: [
|
42
|
+
/*
|
43
|
+
{
|
44
|
+
action: 'load',
|
45
|
+
fileTypes: /^image\/(gif|jpeg|png)$/,
|
46
|
+
maxFileSize: 20000000 // 20MB
|
47
|
+
},
|
48
|
+
{
|
49
|
+
action: 'resize',
|
50
|
+
maxWidth: 1920,
|
51
|
+
maxHeight: 1200,
|
52
|
+
minWidth: 800,
|
53
|
+
minHeight: 600
|
54
|
+
},
|
55
|
+
{
|
56
|
+
action: 'save'
|
57
|
+
}
|
58
|
+
*/
|
59
|
+
],
|
60
|
+
|
61
|
+
// The add callback is invoked as soon as files are added to the
|
62
|
+
// fileupload widget (via file input selection, drag & drop or add
|
63
|
+
// API call). See the basic file upload widget for more information:
|
64
|
+
add: function (e, data) {
|
65
|
+
$(this).fileupload('process', data).done(function () {
|
66
|
+
data.submit();
|
67
|
+
});
|
68
|
+
}
|
69
|
+
},
|
70
|
+
|
71
|
+
processActions: {
|
72
|
+
// Loads the image given via data.files and data.index
|
73
|
+
// as canvas element.
|
74
|
+
// Accepts the options fileTypes (regular expression)
|
75
|
+
// and maxFileSize (integer) to limit the files to load:
|
76
|
+
load: function (data, options) {
|
77
|
+
var that = this,
|
78
|
+
file = data.files[data.index],
|
79
|
+
dfd = $.Deferred();
|
80
|
+
if (window.HTMLCanvasElement &&
|
81
|
+
window.HTMLCanvasElement.prototype.toBlob &&
|
82
|
+
($.type(options.maxFileSize) !== 'number' ||
|
83
|
+
file.size < options.maxFileSize) &&
|
84
|
+
(!options.fileTypes ||
|
85
|
+
options.fileTypes.test(file.type))) {
|
86
|
+
loadImage(
|
87
|
+
file,
|
88
|
+
function (canvas) {
|
89
|
+
data.canvas = canvas;
|
90
|
+
dfd.resolveWith(that, [data]);
|
91
|
+
},
|
92
|
+
{canvas: true}
|
93
|
+
);
|
94
|
+
} else {
|
95
|
+
dfd.rejectWith(that, [data]);
|
96
|
+
}
|
97
|
+
return dfd.promise();
|
98
|
+
},
|
99
|
+
// Resizes the image given as data.canvas and updates
|
100
|
+
// data.canvas with the resized image.
|
101
|
+
// Accepts the options maxWidth, maxHeight, minWidth and
|
102
|
+
// minHeight to scale the given image:
|
103
|
+
resize: function (data, options) {
|
104
|
+
if (data.canvas) {
|
105
|
+
var canvas = loadImage.scale(data.canvas, options);
|
106
|
+
if (canvas.width !== data.canvas.width ||
|
107
|
+
canvas.height !== data.canvas.height) {
|
108
|
+
data.canvas = canvas;
|
109
|
+
data.processed = true;
|
110
|
+
}
|
111
|
+
}
|
112
|
+
return data;
|
113
|
+
},
|
114
|
+
// Saves the processed image given as data.canvas
|
115
|
+
// inplace at data.index of data.files:
|
116
|
+
save: function (data, options) {
|
117
|
+
// Do nothing if no processing has happened:
|
118
|
+
if (!data.canvas || !data.processed) {
|
119
|
+
return data;
|
120
|
+
}
|
121
|
+
var that = this,
|
122
|
+
file = data.files[data.index],
|
123
|
+
name = file.name,
|
124
|
+
dfd = $.Deferred(),
|
125
|
+
callback = function (blob) {
|
126
|
+
if (!blob.name) {
|
127
|
+
if (file.type === blob.type) {
|
128
|
+
blob.name = file.name;
|
129
|
+
} else if (file.name) {
|
130
|
+
blob.name = file.name.replace(
|
131
|
+
/\..+$/,
|
132
|
+
'.' + blob.type.substr(6)
|
133
|
+
);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
// Store the created blob at the position
|
137
|
+
// of the original file in the files list:
|
138
|
+
data.files[data.index] = blob;
|
139
|
+
dfd.resolveWith(that, [data]);
|
140
|
+
};
|
141
|
+
// Use canvas.mozGetAsFile directly, to retain the filename, as
|
142
|
+
// Gecko doesn't support the filename option for FormData.append:
|
143
|
+
if (data.canvas.mozGetAsFile) {
|
144
|
+
callback(data.canvas.mozGetAsFile(
|
145
|
+
(/^image\/(jpeg|png)$/.test(file.type) && name) ||
|
146
|
+
((name && name.replace(/\..+$/, '')) ||
|
147
|
+
'blob') + '.png',
|
148
|
+
file.type
|
149
|
+
));
|
150
|
+
} else {
|
151
|
+
data.canvas.toBlob(callback, file.type);
|
152
|
+
}
|
153
|
+
return dfd.promise();
|
154
|
+
}
|
155
|
+
},
|
156
|
+
|
157
|
+
// Resizes the file at the given index and stores the created blob at
|
158
|
+
// the original position of the files list, returns a Promise object:
|
159
|
+
_processFile: function (files, index, options) {
|
160
|
+
var that = this,
|
161
|
+
dfd = $.Deferred().resolveWith(that, [{
|
162
|
+
files: files,
|
163
|
+
index: index
|
164
|
+
}]),
|
165
|
+
chain = dfd.promise();
|
166
|
+
that._processing += 1;
|
167
|
+
$.each(options.process, function (i, settings) {
|
168
|
+
chain = chain.pipe(function (data) {
|
169
|
+
return that.processActions[settings.action]
|
170
|
+
.call(this, data, settings);
|
171
|
+
});
|
172
|
+
});
|
173
|
+
chain.always(function () {
|
174
|
+
that._processing -= 1;
|
175
|
+
if (that._processing === 0) {
|
176
|
+
that.element
|
177
|
+
.removeClass('fileupload-processing');
|
178
|
+
}
|
179
|
+
});
|
180
|
+
if (that._processing === 1) {
|
181
|
+
that.element.addClass('fileupload-processing');
|
182
|
+
}
|
183
|
+
return chain;
|
184
|
+
},
|
185
|
+
|
186
|
+
// Processes the files given as files property of the data parameter,
|
187
|
+
// returns a Promise object that allows to bind a done handler, which
|
188
|
+
// will be invoked after processing all files (inplace) is done:
|
189
|
+
process: function (data) {
|
190
|
+
var that = this,
|
191
|
+
options = $.extend({}, this.options, data);
|
192
|
+
if (options.process && options.process.length &&
|
193
|
+
this._isXHRUpload(options)) {
|
194
|
+
$.each(data.files, function (index, file) {
|
195
|
+
that._processingQueue = that._processingQueue.pipe(
|
196
|
+
function () {
|
197
|
+
var dfd = $.Deferred();
|
198
|
+
that._processFile(data.files, index, options)
|
199
|
+
.always(function () {
|
200
|
+
dfd.resolveWith(that);
|
201
|
+
});
|
202
|
+
return dfd.promise();
|
203
|
+
}
|
204
|
+
);
|
205
|
+
});
|
206
|
+
}
|
207
|
+
return this._processingQueue;
|
208
|
+
},
|
209
|
+
|
210
|
+
_create: function () {
|
211
|
+
$.blueimp.fileupload.prototype._create.call(this);
|
212
|
+
this._processing = 0;
|
213
|
+
this._processingQueue = $.Deferred().resolveWith(this)
|
214
|
+
.promise();
|
215
|
+
}
|
216
|
+
|
217
|
+
});
|
218
|
+
|
219
|
+
}));
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery File Upload User Interface Plugin 6.
|
2
|
+
* jQuery File Upload User Interface Plugin 6.9.3
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2010, Sebastian Tschan
|
@@ -20,7 +20,7 @@
|
|
20
20
|
'jquery',
|
21
21
|
'tmpl',
|
22
22
|
'load-image',
|
23
|
-
'./jquery.fileupload-
|
23
|
+
'./jquery.fileupload-fp'
|
24
24
|
], factory);
|
25
25
|
} else {
|
26
26
|
// Browser globals:
|
@@ -33,9 +33,9 @@
|
|
33
33
|
}(function ($, tmpl, loadImage) {
|
34
34
|
'use strict';
|
35
35
|
|
36
|
-
// The UI version extends the
|
36
|
+
// The UI version extends the FP (file processing) version or the basic
|
37
37
|
// file upload widget and adds complete user interface interaction:
|
38
|
-
var parentWidget = ($.
|
38
|
+
var parentWidget = ($.blueimpFP || $.blueimp).fileupload;
|
39
39
|
$.widget('blueimpUI.fileupload', parentWidget, {
|
40
40
|
|
41
41
|
options: {
|
@@ -70,6 +70,12 @@
|
|
70
70
|
uploadTemplateId: 'template-upload',
|
71
71
|
// The ID of the download template:
|
72
72
|
downloadTemplateId: 'template-download',
|
73
|
+
// The container for the list of files. If undefined, it is set to
|
74
|
+
// an element with class "files" inside of the widget element:
|
75
|
+
filesContainer: undefined,
|
76
|
+
// By default, files are appended to the files container.
|
77
|
+
// Set the following option to true, to prepend files instead:
|
78
|
+
prependFiles: false,
|
73
79
|
// The expected data type of the upload response, sets the dataType
|
74
80
|
// option of the $.ajax upload requests:
|
75
81
|
dataType: 'json',
|
@@ -81,13 +87,14 @@
|
|
81
87
|
var that = $(this).data('fileupload'),
|
82
88
|
options = that.options,
|
83
89
|
files = data.files;
|
84
|
-
$(this).fileupload('
|
90
|
+
$(this).fileupload('process', data).done(function () {
|
85
91
|
that._adjustMaxNumberOfFiles(-files.length);
|
86
92
|
data.isAdjusted = true;
|
87
93
|
data.files.valid = data.isValidated = that._validate(files);
|
88
|
-
data.context = that._renderUpload(files)
|
89
|
-
|
90
|
-
.
|
94
|
+
data.context = that._renderUpload(files).data('data', data);
|
95
|
+
options.filesContainer[
|
96
|
+
options.prependFiles ? 'prepend' : 'append'
|
97
|
+
](data.context);
|
91
98
|
that._renderPreviews(files, data.context);
|
92
99
|
that._forceReflow(data.context);
|
93
100
|
that._transition(data.context).done(
|
@@ -121,9 +128,10 @@
|
|
121
128
|
.find('.progress').addClass(
|
122
129
|
!$.support.transition && 'progress-animated'
|
123
130
|
)
|
131
|
+
.attr('aria-valuenow', 100)
|
124
132
|
.find('.bar').css(
|
125
133
|
'width',
|
126
|
-
|
134
|
+
'100%'
|
127
135
|
);
|
128
136
|
}
|
129
137
|
return that._trigger('sent', e, data);
|
@@ -131,8 +139,7 @@
|
|
131
139
|
// Callback for successful uploads:
|
132
140
|
done: function (e, data) {
|
133
141
|
var that = $(this).data('fileupload'),
|
134
|
-
template
|
135
|
-
preview;
|
142
|
+
template;
|
136
143
|
if (data.context) {
|
137
144
|
data.context.each(function (index) {
|
138
145
|
var file = ($.isArray(data.result) &&
|
@@ -144,7 +151,6 @@
|
|
144
151
|
function () {
|
145
152
|
var node = $(this);
|
146
153
|
template = that._renderDownload([file])
|
147
|
-
.css('height', node.height())
|
148
154
|
.replaceAll(node);
|
149
155
|
that._forceReflow(template);
|
150
156
|
that._transition(template).done(
|
@@ -221,23 +227,39 @@
|
|
221
227
|
// Callback for upload progress events:
|
222
228
|
progress: function (e, data) {
|
223
229
|
if (data.context) {
|
224
|
-
data.
|
225
|
-
|
226
|
-
|
227
|
-
|
230
|
+
var progress = parseInt(data.loaded / data.total * 100, 10);
|
231
|
+
data.context.find('.progress')
|
232
|
+
.attr('aria-valuenow', progress)
|
233
|
+
.find('.bar').css(
|
234
|
+
'width',
|
235
|
+
progress + '%'
|
236
|
+
);
|
228
237
|
}
|
229
238
|
},
|
230
239
|
// Callback for global upload progress events:
|
231
240
|
progressall: function (e, data) {
|
232
|
-
$
|
233
|
-
|
234
|
-
|
235
|
-
|
241
|
+
var $this = $(this),
|
242
|
+
progress = parseInt(data.loaded / data.total * 100, 10),
|
243
|
+
globalProgressNode = $this.find('.fileupload-progress'),
|
244
|
+
extendedProgressNode = globalProgressNode
|
245
|
+
.find('.progress-extended');
|
246
|
+
if (extendedProgressNode.length) {
|
247
|
+
extendedProgressNode.html(
|
248
|
+
$this.data('fileupload')._renderExtendedProgress(data)
|
249
|
+
);
|
250
|
+
}
|
251
|
+
globalProgressNode
|
252
|
+
.find('.progress')
|
253
|
+
.attr('aria-valuenow', progress)
|
254
|
+
.find('.bar').css(
|
255
|
+
'width',
|
256
|
+
progress + '%'
|
257
|
+
);
|
236
258
|
},
|
237
259
|
// Callback for uploads start, equivalent to the global ajaxStart event:
|
238
260
|
start: function (e) {
|
239
261
|
var that = $(this).data('fileupload');
|
240
|
-
that._transition($(this).find('.fileupload-
|
262
|
+
that._transition($(this).find('.fileupload-progress')).done(
|
241
263
|
function () {
|
242
264
|
that._trigger('started', e);
|
243
265
|
}
|
@@ -246,9 +268,12 @@
|
|
246
268
|
// Callback for uploads stop, equivalent to the global ajaxStop event:
|
247
269
|
stop: function (e) {
|
248
270
|
var that = $(this).data('fileupload');
|
249
|
-
that._transition($(this).find('.fileupload-
|
271
|
+
that._transition($(this).find('.fileupload-progress')).done(
|
250
272
|
function () {
|
251
|
-
$(this).find('.
|
273
|
+
$(this).find('.progress')
|
274
|
+
.attr('aria-valuenow', '0')
|
275
|
+
.find('.bar').css('width', '0%');
|
276
|
+
$(this).find('.progress-extended').html(' ');
|
252
277
|
that._trigger('stopped', e);
|
253
278
|
}
|
254
279
|
);
|
@@ -258,8 +283,8 @@
|
|
258
283
|
var that = $(this).data('fileupload');
|
259
284
|
if (data.url) {
|
260
285
|
$.ajax(data);
|
286
|
+
that._adjustMaxNumberOfFiles(1);
|
261
287
|
}
|
262
|
-
that._adjustMaxNumberOfFiles(1);
|
263
288
|
that._transition(data.context).done(
|
264
289
|
function () {
|
265
290
|
$(this).remove();
|
@@ -310,6 +335,48 @@
|
|
310
335
|
return (bytes / 1000).toFixed(2) + ' KB';
|
311
336
|
},
|
312
337
|
|
338
|
+
_formatBitrate: function (bits) {
|
339
|
+
if (typeof bits !== 'number') {
|
340
|
+
return '';
|
341
|
+
}
|
342
|
+
if (bits >= 1000000000) {
|
343
|
+
return (bits / 1000000000).toFixed(2) + ' Gbit/s';
|
344
|
+
}
|
345
|
+
if (bits >= 1000000) {
|
346
|
+
return (bits / 1000000).toFixed(2) + ' Mbit/s';
|
347
|
+
}
|
348
|
+
if (bits >= 1000) {
|
349
|
+
return (bits / 1000).toFixed(2) + ' kbit/s';
|
350
|
+
}
|
351
|
+
return bits + ' bit/s';
|
352
|
+
},
|
353
|
+
|
354
|
+
_formatTime: function (seconds) {
|
355
|
+
var date = new Date(seconds * 1000),
|
356
|
+
days = parseInt(seconds / 86400, 10);
|
357
|
+
days = days ? days + 'd ' : '';
|
358
|
+
return days +
|
359
|
+
('0' + date.getUTCHours()).slice(-2) + ':' +
|
360
|
+
('0' + date.getUTCMinutes()).slice(-2) + ':' +
|
361
|
+
('0' + date.getUTCSeconds()).slice(-2);
|
362
|
+
},
|
363
|
+
|
364
|
+
_formatPercentage: function (floatValue) {
|
365
|
+
return (floatValue * 100).toFixed(2) + ' %';
|
366
|
+
},
|
367
|
+
|
368
|
+
_renderExtendedProgress: function (data) {
|
369
|
+
return this._formatBitrate(data.bitrate) + ' | ' +
|
370
|
+
this._formatTime(
|
371
|
+
(data.total - data.loaded) * 8 / data.bitrate
|
372
|
+
) + ' | ' +
|
373
|
+
this._formatPercentage(
|
374
|
+
data.loaded / data.total
|
375
|
+
) + ' | ' +
|
376
|
+
this._formatFileSize(data.loaded) + ' / ' +
|
377
|
+
this._formatFileSize(data.total);
|
378
|
+
},
|
379
|
+
|
313
380
|
_hasError: function (file) {
|
314
381
|
if (file.error) {
|
315
382
|
return file.error;
|
@@ -368,22 +435,28 @@
|
|
368
435
|
_renderPreview: function (file, node) {
|
369
436
|
var that = this,
|
370
437
|
options = this.options,
|
371
|
-
|
438
|
+
dfd = $.Deferred();
|
372
439
|
return ((loadImage && loadImage(
|
373
440
|
file,
|
374
441
|
function (img) {
|
375
442
|
node.append(img);
|
376
443
|
that._forceReflow(node);
|
377
444
|
that._transition(node).done(function () {
|
378
|
-
|
445
|
+
dfd.resolveWith(node);
|
379
446
|
});
|
447
|
+
if (!$.contains(document.body, node[0])) {
|
448
|
+
// If the element is not part of the DOM,
|
449
|
+
// transition events are not triggered,
|
450
|
+
// so we have to resolve manually:
|
451
|
+
dfd.resolveWith(node);
|
452
|
+
}
|
380
453
|
},
|
381
454
|
{
|
382
455
|
maxWidth: options.previewMaxWidth,
|
383
456
|
maxHeight: options.previewMaxHeight,
|
384
457
|
canvas: options.previewAsCanvas
|
385
458
|
}
|
386
|
-
)) ||
|
459
|
+
)) || dfd.resolveWith(node)) && dfd;
|
387
460
|
},
|
388
461
|
|
389
462
|
_renderPreviews: function (files, nodes) {
|
@@ -395,13 +468,13 @@
|
|
395
468
|
($.type(options.previewSourceMaxFileSize) !== 'number' ||
|
396
469
|
file.size < options.previewSourceMaxFileSize)) {
|
397
470
|
that._processingQueue = that._processingQueue.pipe(function () {
|
398
|
-
var
|
471
|
+
var dfd = $.Deferred();
|
399
472
|
that._renderPreview(file, $(element)).done(
|
400
473
|
function () {
|
401
|
-
|
474
|
+
dfd.resolveWith(that);
|
402
475
|
}
|
403
476
|
);
|
404
|
-
return
|
477
|
+
return dfd.promise();
|
405
478
|
});
|
406
479
|
}
|
407
480
|
});
|
@@ -456,13 +529,12 @@
|
|
456
529
|
},
|
457
530
|
|
458
531
|
_forceReflow: function (node) {
|
459
|
-
|
460
|
-
node
|
532
|
+
return $.support.transition && node.length &&
|
533
|
+
node[0].offsetWidth;
|
461
534
|
},
|
462
535
|
|
463
536
|
_transition: function (node) {
|
464
|
-
var
|
465
|
-
deferred = $.Deferred();
|
537
|
+
var dfd = $.Deferred();
|
466
538
|
if ($.support.transition && node.hasClass('fade')) {
|
467
539
|
node.bind(
|
468
540
|
$.support.transition.end,
|
@@ -471,15 +543,15 @@
|
|
471
543
|
// in the container element, e.g. from button elements:
|
472
544
|
if (e.target === node[0]) {
|
473
545
|
node.unbind($.support.transition.end);
|
474
|
-
|
546
|
+
dfd.resolveWith(node);
|
475
547
|
}
|
476
548
|
}
|
477
549
|
).toggleClass('in');
|
478
550
|
} else {
|
479
551
|
node.toggleClass('in');
|
480
|
-
|
552
|
+
dfd.resolveWith(node);
|
481
553
|
}
|
482
|
-
return
|
554
|
+
return dfd;
|
483
555
|
},
|
484
556
|
|
485
557
|
_initButtonBarEventHandlers: function () {
|
@@ -591,10 +663,32 @@
|
|
591
663
|
}
|
592
664
|
},
|
593
665
|
|
666
|
+
_stringToRegExp: function (str) {
|
667
|
+
var parts = str.split('/'),
|
668
|
+
modifiers = parts.pop();
|
669
|
+
parts.shift();
|
670
|
+
return new RegExp(parts.join('/'), modifiers);
|
671
|
+
},
|
672
|
+
|
673
|
+
_initRegExpOptions: function () {
|
674
|
+
var options = this.options;
|
675
|
+
if ($.type(options.acceptFileTypes) === 'string') {
|
676
|
+
options.acceptFileTypes = this._stringToRegExp(
|
677
|
+
options.acceptFileTypes
|
678
|
+
);
|
679
|
+
}
|
680
|
+
if ($.type(options.previewSourceFileTypes) === 'string') {
|
681
|
+
options.previewSourceFileTypes = this._stringToRegExp(
|
682
|
+
options.previewSourceFileTypes
|
683
|
+
);
|
684
|
+
}
|
685
|
+
},
|
686
|
+
|
594
687
|
_initSpecialOptions: function () {
|
595
688
|
parentWidget.prototype._initSpecialOptions.call(this);
|
596
689
|
this._initFilesContainer();
|
597
690
|
this._initTemplates();
|
691
|
+
this._initRegExpOptions();
|
598
692
|
},
|
599
693
|
|
600
694
|
_create: function () {
|
@@ -604,9 +698,9 @@
|
|
604
698
|
'uploadTemplateId',
|
605
699
|
'downloadTemplateId'
|
606
700
|
);
|
607
|
-
if (!$.
|
701
|
+
if (!$.blueimpFP) {
|
608
702
|
this._processingQueue = $.Deferred().resolveWith(this).promise();
|
609
|
-
this.
|
703
|
+
this.process = function () {
|
610
704
|
return this._processingQueue;
|
611
705
|
};
|
612
706
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery File Upload Plugin 5.
|
2
|
+
* jQuery File Upload Plugin 5.13
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2010, Sebastian Tschan
|
@@ -109,6 +109,10 @@
|
|
109
109
|
// global progress calculation. Set the following option to false to
|
110
110
|
// prevent recalculating the global progress data:
|
111
111
|
recalculateProgress: true,
|
112
|
+
// Interval in milliseconds to calculate and trigger progress events:
|
113
|
+
progressInterval: 100,
|
114
|
+
// Interval in milliseconds to calculate progress bitrate:
|
115
|
+
bitrateInterval: 500,
|
112
116
|
|
113
117
|
// Additional form data to be sent along with the file uploads can be set
|
114
118
|
// using this option, which accepts an array of objects with name and
|
@@ -180,6 +184,21 @@
|
|
180
184
|
'forceIframeTransport'
|
181
185
|
],
|
182
186
|
|
187
|
+
_BitrateTimer: function () {
|
188
|
+
this.timestamp = +(new Date());
|
189
|
+
this.loaded = 0;
|
190
|
+
this.bitrate = 0;
|
191
|
+
this.getBitrate = function (now, loaded, interval) {
|
192
|
+
var timeDiff = now - this.timestamp;
|
193
|
+
if (!this.bitrate || !interval || timeDiff > interval) {
|
194
|
+
this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
|
195
|
+
this.loaded = loaded;
|
196
|
+
this.timestamp = now;
|
197
|
+
}
|
198
|
+
return this.bitrate;
|
199
|
+
};
|
200
|
+
},
|
201
|
+
|
183
202
|
_isXHRUpload: function (options) {
|
184
203
|
return !options.forceIframeTransport &&
|
185
204
|
((!options.multipart && $.support.xhrFileUpload) ||
|
@@ -190,9 +209,11 @@
|
|
190
209
|
var formData;
|
191
210
|
if (typeof options.formData === 'function') {
|
192
211
|
return options.formData(options.form);
|
193
|
-
}
|
212
|
+
}
|
213
|
+
if ($.isArray(options.formData)) {
|
194
214
|
return options.formData;
|
195
|
-
}
|
215
|
+
}
|
216
|
+
if (options.formData) {
|
196
217
|
formData = [];
|
197
218
|
$.each(options.formData, function (name, value) {
|
198
219
|
formData.push({name: name, value: value});
|
@@ -212,15 +233,29 @@
|
|
212
233
|
|
213
234
|
_onProgress: function (e, data) {
|
214
235
|
if (e.lengthComputable) {
|
215
|
-
var
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
236
|
+
var now = +(new Date()),
|
237
|
+
total,
|
238
|
+
loaded;
|
239
|
+
if (data._time && data.progressInterval &&
|
240
|
+
(now - data._time < data.progressInterval) &&
|
241
|
+
e.loaded !== e.total) {
|
242
|
+
return;
|
243
|
+
}
|
244
|
+
data._time = now;
|
245
|
+
total = data.total || this._getTotal(data.files);
|
246
|
+
loaded = parseInt(
|
247
|
+
e.loaded / e.total * (data.chunkSize || total),
|
248
|
+
10
|
249
|
+
) + (data.uploadedBytes || 0);
|
220
250
|
this._loaded += loaded - (data.loaded || data.uploadedBytes || 0);
|
221
251
|
data.lengthComputable = true;
|
222
252
|
data.loaded = loaded;
|
223
253
|
data.total = total;
|
254
|
+
data.bitrate = data._bitrateTimer.getBitrate(
|
255
|
+
now,
|
256
|
+
loaded,
|
257
|
+
data.bitrateInterval
|
258
|
+
);
|
224
259
|
// Trigger a custom progress event with a total data property set
|
225
260
|
// to the file size(s) of the current upload and a loaded data
|
226
261
|
// property calculated accordingly:
|
@@ -230,7 +265,12 @@
|
|
230
265
|
this._trigger('progressall', e, {
|
231
266
|
lengthComputable: true,
|
232
267
|
loaded: this._loaded,
|
233
|
-
total: this._total
|
268
|
+
total: this._total,
|
269
|
+
bitrate: this._bitrateTimer.getBitrate(
|
270
|
+
now,
|
271
|
+
this._loaded,
|
272
|
+
data.bitrateInterval
|
273
|
+
)
|
234
274
|
});
|
235
275
|
}
|
236
276
|
},
|
@@ -490,6 +530,10 @@
|
|
490
530
|
ub + i * mcs,
|
491
531
|
ub + (i + 1) * mcs
|
492
532
|
);
|
533
|
+
// Expose the chunk index:
|
534
|
+
o.chunkIndex = i;
|
535
|
+
// Expose the number of chunks:
|
536
|
+
o.chunksNumber = n;
|
493
537
|
// Store the current chunk size, as the blob itself
|
494
538
|
// will be dereferenced after data processing:
|
495
539
|
o.chunkSize = o.blob.size;
|
@@ -530,6 +574,8 @@
|
|
530
574
|
// and no other uploads are currently running,
|
531
575
|
// equivalent to the global ajaxStart event:
|
532
576
|
this._trigger('start');
|
577
|
+
// Set timer for global bitrate progress calculation:
|
578
|
+
this._bitrateTimer = new this._BitrateTimer();
|
533
579
|
}
|
534
580
|
this._active += 1;
|
535
581
|
// Initialize the global progress values:
|
@@ -582,6 +628,7 @@
|
|
582
628
|
this._trigger('stop');
|
583
629
|
// Reset the global progress values:
|
584
630
|
this._loaded = this._total = 0;
|
631
|
+
this._bitrateTimer = null;
|
585
632
|
}
|
586
633
|
},
|
587
634
|
|
@@ -593,6 +640,8 @@
|
|
593
640
|
options = that._getAJAXSettings(data),
|
594
641
|
send = function (resolve, args) {
|
595
642
|
that._sending += 1;
|
643
|
+
// Set timer for bitrate progress calculation:
|
644
|
+
options._bitrateTimer = new that._BitrateTimer();
|
596
645
|
jqXHR = jqXHR || (
|
597
646
|
(resolve !== false &&
|
598
647
|
that._trigger('send', e, options) !== false &&
|
@@ -731,19 +780,30 @@
|
|
731
780
|
}
|
732
781
|
},
|
733
782
|
|
783
|
+
_getFileInputFiles: function (fileInput) {
|
784
|
+
fileInput = $(fileInput);
|
785
|
+
var files = $.each($.makeArray(fileInput.prop('files')), this._normalizeFile),
|
786
|
+
value;
|
787
|
+
if (!files.length) {
|
788
|
+
value = fileInput.prop('value');
|
789
|
+
if (!value) {
|
790
|
+
return [];
|
791
|
+
}
|
792
|
+
// If the files property is not available, the browser does not
|
793
|
+
// support the File API and we add a pseudo File object with
|
794
|
+
// the input value as name with path information removed:
|
795
|
+
files = [{name: value.replace(/^.*\\/, '')}];
|
796
|
+
}
|
797
|
+
return files;
|
798
|
+
},
|
799
|
+
|
734
800
|
_onChange: function (e) {
|
735
801
|
var that = e.data.fileupload,
|
736
802
|
data = {
|
737
|
-
files: $.each($.makeArray(e.target.files), that._normalizeFile),
|
738
803
|
fileInput: $(e.target),
|
739
804
|
form: $(e.target.form)
|
740
805
|
};
|
741
|
-
|
742
|
-
// If the files property is not available, the browser does not
|
743
|
-
// support the File API and we add a pseudo File object with
|
744
|
-
// the input value as name with path information removed:
|
745
|
-
data.files = [{name: e.target.value.replace(/^.*\\/, '')}];
|
746
|
-
}
|
806
|
+
data.files = that._getFileInputFiles(data.fileInput);
|
747
807
|
if (that.options.replaceFileInput) {
|
748
808
|
that._replaceFileInput(data.fileInput);
|
749
809
|
}
|
@@ -793,7 +853,7 @@
|
|
793
853
|
return false;
|
794
854
|
}
|
795
855
|
if (dataTransfer) {
|
796
|
-
dataTransfer.dropEffect =
|
856
|
+
dataTransfer.dropEffect = 'copy';
|
797
857
|
}
|
798
858
|
e.preventDefault();
|
799
859
|
},
|
@@ -846,10 +906,9 @@
|
|
846
906
|
},
|
847
907
|
|
848
908
|
_create: function () {
|
849
|
-
var options = this.options
|
850
|
-
|
851
|
-
|
852
|
-
$.extend(options, dataOpts);
|
909
|
+
var options = this.options;
|
910
|
+
// Initialize options set via HTML5 data-attributes:
|
911
|
+
$.extend(options, $(this.element[0].cloneNode(false)).data());
|
853
912
|
options.namespace = options.namespace || this.widgetName;
|
854
913
|
this._initSpecialOptions();
|
855
914
|
this._slots = [];
|
@@ -881,7 +940,11 @@
|
|
881
940
|
if (!data || this.options.disabled) {
|
882
941
|
return;
|
883
942
|
}
|
884
|
-
data.
|
943
|
+
if (data.fileInput && !data.files) {
|
944
|
+
data.files = this._getFileInputFiles(data.fileInput);
|
945
|
+
} else {
|
946
|
+
data.files = $.each($.makeArray(data.files), this._normalizeFile);
|
947
|
+
}
|
885
948
|
this._onAdd(null, data);
|
886
949
|
},
|
887
950
|
|
@@ -892,7 +955,11 @@
|
|
892
955
|
// The method returns a Promise object for the file upload call.
|
893
956
|
send: function (data) {
|
894
957
|
if (data && !this.options.disabled) {
|
895
|
-
data.
|
958
|
+
if (data.fileInput && !data.files) {
|
959
|
+
data.files = this._getFileInputFiles(data.fileInput);
|
960
|
+
} else {
|
961
|
+
data.files = $.each($.makeArray(data.files), this._normalizeFile);
|
962
|
+
}
|
896
963
|
if (data.files.length) {
|
897
964
|
return this._onSend(null, data);
|
898
965
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery File Upload Plugin Localization Example 6.5
|
2
|
+
* jQuery File Upload Plugin Localization Example 6.5.1
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
5
|
* Copyright 2012, Sebastian Tschan
|
@@ -9,6 +9,8 @@
|
|
9
9
|
* http://www.opensource.org/licenses/MIT
|
10
10
|
*/
|
11
11
|
|
12
|
+
/*global window */
|
13
|
+
|
12
14
|
window.locale = {
|
13
15
|
"fileupload": {
|
14
16
|
"errors": {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* JavaScript Canvas to Blob
|
2
|
+
* JavaScript Canvas to Blob 2.0.1
|
3
3
|
* https://github.com/blueimp/JavaScript-Canvas-to-Blob
|
4
4
|
*
|
5
5
|
* Copyright 2012, Sebastian Tschan
|
@@ -15,71 +15,56 @@
|
|
15
15
|
/*jslint nomen: true, regexp: true */
|
16
16
|
/*global window, atob, ArrayBuffer, Uint8Array, define */
|
17
17
|
|
18
|
-
(function (
|
18
|
+
(function (window) {
|
19
19
|
'use strict';
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
if (
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
// Convert base64/URLEncoded data component to raw binary data:
|
62
|
-
byteString = decodeURIComponent(dataURI.split(',')[1]);
|
20
|
+
var CanvasPrototype = window.HTMLCanvasElement &&
|
21
|
+
window.HTMLCanvasElement.prototype,
|
22
|
+
BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
|
23
|
+
window.MozBlobBuilder || window.MSBlobBuilder,
|
24
|
+
dataURLtoBlob = BlobBuilder && window.atob && window.ArrayBuffer &&
|
25
|
+
window.Uint8Array && function (dataURI) {
|
26
|
+
var byteString,
|
27
|
+
arrayBuffer,
|
28
|
+
intArray,
|
29
|
+
i,
|
30
|
+
bb,
|
31
|
+
mimeString;
|
32
|
+
if (dataURI.split(',')[0].indexOf('base64') >= 0) {
|
33
|
+
// Convert base64 to raw binary data held in a string:
|
34
|
+
byteString = atob(dataURI.split(',')[1]);
|
35
|
+
} else {
|
36
|
+
// Convert base64/URLEncoded data component to raw binary data:
|
37
|
+
byteString = decodeURIComponent(dataURI.split(',')[1]);
|
38
|
+
}
|
39
|
+
// Write the bytes of the string to an ArrayBuffer:
|
40
|
+
arrayBuffer = new ArrayBuffer(byteString.length);
|
41
|
+
intArray = new Uint8Array(arrayBuffer);
|
42
|
+
for (i = 0; i < byteString.length; i += 1) {
|
43
|
+
intArray[i] = byteString.charCodeAt(i);
|
44
|
+
}
|
45
|
+
// Write the ArrayBuffer to a blob:
|
46
|
+
bb = new BlobBuilder();
|
47
|
+
bb.append(arrayBuffer);
|
48
|
+
// Separate out the mime component:
|
49
|
+
mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
|
50
|
+
return bb.getBlob(mimeString);
|
51
|
+
};
|
52
|
+
if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
|
53
|
+
if (CanvasPrototype.mozGetAsFile) {
|
54
|
+
CanvasPrototype.toBlob = function (callback, type) {
|
55
|
+
callback(this.mozGetAsFile('blob', type));
|
56
|
+
};
|
57
|
+
} else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
|
58
|
+
CanvasPrototype.toBlob = function (callback, type) {
|
59
|
+
callback(dataURLtoBlob(this.toDataURL(type)));
|
60
|
+
};
|
63
61
|
}
|
64
|
-
|
65
|
-
arrayBuffer = new ArrayBuffer(byteString.length);
|
66
|
-
intArray = new Uint8Array(arrayBuffer);
|
67
|
-
for (i = 0; i < byteString.length; i += 1) {
|
68
|
-
intArray[i] = byteString.charCodeAt(i);
|
69
|
-
}
|
70
|
-
// Write the ArrayBuffer to a blob:
|
71
|
-
bb = new BlobBuilder();
|
72
|
-
bb.append(arrayBuffer);
|
73
|
-
// Separate out the mime component:
|
74
|
-
mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
|
75
|
-
return bb.getBlob(mimeString);
|
76
|
-
};
|
77
|
-
|
62
|
+
}
|
78
63
|
if (typeof define !== 'undefined' && define.amd) {
|
79
64
|
define(function () {
|
80
|
-
return
|
65
|
+
return dataURLtoBlob;
|
81
66
|
});
|
82
67
|
} else {
|
83
|
-
|
68
|
+
window.dataURLtoBlob = dataURLtoBlob;
|
84
69
|
}
|
85
70
|
}(this));
|
@@ -1,8 +1,8 @@
|
|
1
1
|
/*
|
2
|
-
* jQuery UI Widget 1.8.
|
2
|
+
* jQuery UI Widget 1.8.22+amd
|
3
3
|
* https://github.com/blueimp/jQuery-File-Upload
|
4
4
|
*
|
5
|
-
* Copyright
|
5
|
+
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
|
6
6
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
7
7
|
* http://jquery.org/license
|
8
8
|
*
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* JavaScript Load Image 1.1
|
2
|
+
* JavaScript Load Image 1.2.1
|
3
3
|
* https://github.com/blueimp/JavaScript-Load-Image
|
4
4
|
*
|
5
5
|
* Copyright 2011, Sebastian Tschan
|
@@ -24,7 +24,7 @@
|
|
24
24
|
oUrl;
|
25
25
|
img.onerror = callback;
|
26
26
|
img.onload = function () {
|
27
|
-
if (oUrl) {
|
27
|
+
if (oUrl && !(options && options.noRevoke)) {
|
28
28
|
loadImage.revokeObjectURL(oUrl);
|
29
29
|
}
|
30
30
|
callback(loadImage.scale(img, options));
|
@@ -40,46 +40,53 @@
|
|
40
40
|
if (url) {
|
41
41
|
img.src = url;
|
42
42
|
return img;
|
43
|
-
} else {
|
44
|
-
return loadImage.readFile(file, function (url) {
|
45
|
-
img.src = url;
|
46
|
-
});
|
47
43
|
}
|
44
|
+
return loadImage.readFile(file, function (url) {
|
45
|
+
img.src = url;
|
46
|
+
});
|
48
47
|
},
|
48
|
+
// The check for URL.revokeObjectURL fixes an issue with Opera 12,
|
49
|
+
// which provides URL.createObjectURL but doesn't properly implement it:
|
49
50
|
urlAPI = (window.createObjectURL && window) ||
|
50
|
-
(window.URL && URL
|
51
|
+
(window.URL && URL.revokeObjectURL && URL) ||
|
52
|
+
(window.webkitURL && webkitURL);
|
51
53
|
|
52
|
-
// Scales the given image (img HTML element)
|
54
|
+
// Scales the given image (img or canvas HTML element)
|
53
55
|
// using the given options.
|
54
|
-
// Returns a canvas object if the
|
55
|
-
// and the
|
56
|
+
// Returns a canvas object if the browser supports canvas
|
57
|
+
// and the canvas option is true or a canvas object is passed
|
58
|
+
// as image, else the scaled image:
|
56
59
|
loadImage.scale = function (img, options) {
|
57
60
|
options = options || {};
|
58
61
|
var canvas = document.createElement('canvas'),
|
62
|
+
width = img.width,
|
63
|
+
height = img.height,
|
59
64
|
scale = Math.max(
|
60
|
-
(options.minWidth ||
|
61
|
-
(options.minHeight ||
|
65
|
+
(options.minWidth || width) / width,
|
66
|
+
(options.minHeight || height) / height
|
62
67
|
);
|
63
68
|
if (scale > 1) {
|
64
|
-
|
65
|
-
|
69
|
+
width = parseInt(width * scale, 10);
|
70
|
+
height = parseInt(height * scale, 10);
|
66
71
|
}
|
67
72
|
scale = Math.min(
|
68
|
-
(options.maxWidth ||
|
69
|
-
(options.maxHeight ||
|
73
|
+
(options.maxWidth || width) / width,
|
74
|
+
(options.maxHeight || height) / height
|
70
75
|
);
|
71
76
|
if (scale < 1) {
|
72
|
-
|
73
|
-
|
77
|
+
width = parseInt(width * scale, 10);
|
78
|
+
height = parseInt(height * scale, 10);
|
74
79
|
}
|
75
|
-
if (
|
76
|
-
|
80
|
+
if (img.getContext || (options.canvas && canvas.getContext)) {
|
81
|
+
canvas.width = width;
|
82
|
+
canvas.height = height;
|
83
|
+
canvas.getContext('2d')
|
84
|
+
.drawImage(img, 0, 0, width, height);
|
85
|
+
return canvas;
|
77
86
|
}
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
.drawImage(img, 0, 0, img.width, img.height);
|
82
|
-
return canvas;
|
87
|
+
img.width = width;
|
88
|
+
img.height = height;
|
89
|
+
return img;
|
83
90
|
};
|
84
91
|
|
85
92
|
loadImage.createObjectURL = function (file) {
|
@@ -37,7 +37,7 @@
|
|
37
37
|
width: 200px;
|
38
38
|
}
|
39
39
|
.progress-animated .bar {
|
40
|
-
background: url(
|
40
|
+
background: url(<%= asset_path 'progressbar.gif' %>) !important;
|
41
41
|
filter: none;
|
42
42
|
}
|
43
43
|
.fileupload-loading {
|
@@ -45,7 +45,7 @@
|
|
45
45
|
left: 50%;
|
46
46
|
width: 128px;
|
47
47
|
height: 128px;
|
48
|
-
background: url(
|
48
|
+
background: url(<%= asset_path 'loading.gif' %>) center no-repeat;
|
49
49
|
display: none;
|
50
50
|
}
|
51
51
|
.fileupload-processing .fileupload-loading {
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jquery-fileupload-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -77,7 +77,7 @@ files:
|
|
77
77
|
- vendor/assets/javascripts/jquery-fileupload/cors/jquery.postmessage-transport.js
|
78
78
|
- vendor/assets/javascripts/jquery-fileupload/cors/jquery.xdr-transport.js
|
79
79
|
- vendor/assets/javascripts/jquery-fileupload/index.js
|
80
|
-
- vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-
|
80
|
+
- vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js
|
81
81
|
- vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js
|
82
82
|
- vendor/assets/javascripts/jquery-fileupload/jquery.fileupload.js
|
83
83
|
- vendor/assets/javascripts/jquery-fileupload/jquery.iframe-transport.js
|
@@ -86,7 +86,7 @@ files:
|
|
86
86
|
- vendor/assets/javascripts/jquery-fileupload/vendor/jquery.ui.widget.js
|
87
87
|
- vendor/assets/javascripts/jquery-fileupload/vendor/load-image.js
|
88
88
|
- vendor/assets/javascripts/jquery-fileupload/vendor/tmpl.js
|
89
|
-
- vendor/assets/stylesheets/jquery.fileupload-ui.css
|
89
|
+
- vendor/assets/stylesheets/jquery.fileupload-ui.css.erb
|
90
90
|
- Rakefile
|
91
91
|
- README.md
|
92
92
|
homepage: https://github.com/tors/jquery-fileupload-rails
|
@@ -1,160 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* jQuery File Upload Image Processing Plugin 1.0.6
|
3
|
-
* https://github.com/blueimp/jQuery-File-Upload
|
4
|
-
*
|
5
|
-
* Copyright 2012, Sebastian Tschan
|
6
|
-
* https://blueimp.net
|
7
|
-
*
|
8
|
-
* Licensed under the MIT license:
|
9
|
-
* http://www.opensource.org/licenses/MIT
|
10
|
-
*/
|
11
|
-
|
12
|
-
/*jslint nomen: true, unparam: true, regexp: true */
|
13
|
-
/*global define, window, document */
|
14
|
-
|
15
|
-
(function (factory) {
|
16
|
-
'use strict';
|
17
|
-
if (typeof define === 'function' && define.amd) {
|
18
|
-
// Register as an anonymous AMD module:
|
19
|
-
define([
|
20
|
-
'jquery',
|
21
|
-
'load-image',
|
22
|
-
'canvas-to-blob',
|
23
|
-
'./jquery.fileupload'
|
24
|
-
], factory);
|
25
|
-
} else {
|
26
|
-
// Browser globals:
|
27
|
-
factory(
|
28
|
-
window.jQuery,
|
29
|
-
window.loadImage,
|
30
|
-
window.canvasToBlob
|
31
|
-
);
|
32
|
-
}
|
33
|
-
}(function ($, loadImage, canvasToBlob) {
|
34
|
-
'use strict';
|
35
|
-
|
36
|
-
// The File Upload IP version extends the basic fileupload widget
|
37
|
-
// with image processing functionality:
|
38
|
-
$.widget('blueimpIP.fileupload', $.blueimp.fileupload, {
|
39
|
-
|
40
|
-
options: {
|
41
|
-
// The regular expression to define which image files are to be
|
42
|
-
// resized, given that the browser supports the operation:
|
43
|
-
resizeSourceFileTypes: /^image\/(gif|jpeg|png)$/,
|
44
|
-
// The maximum file size of images that are to be resized:
|
45
|
-
resizeSourceMaxFileSize: 20000000, // 20MB
|
46
|
-
// The maximum width of the resized images:
|
47
|
-
resizeMaxWidth: undefined,
|
48
|
-
// The maximum height of the resized images:
|
49
|
-
resizeMaxHeight: undefined,
|
50
|
-
// The minimum width of the resized images:
|
51
|
-
resizeMinWidth: undefined,
|
52
|
-
// The minimum height of the resized images:
|
53
|
-
resizeMinHeight: undefined,
|
54
|
-
|
55
|
-
// The add callback is invoked as soon as files are added to the fileupload
|
56
|
-
// widget (via file input selection, drag & drop or add API call).
|
57
|
-
// See the basic file upload widget for more information:
|
58
|
-
add: function (e, data) {
|
59
|
-
$(this).fileupload('resize', data).done(function () {
|
60
|
-
data.submit();
|
61
|
-
});
|
62
|
-
}
|
63
|
-
},
|
64
|
-
|
65
|
-
// Resizes the image file at the given index and stores the created blob
|
66
|
-
// at the original position of the files list, returns a Promise object:
|
67
|
-
_resizeImage: function (files, index, options) {
|
68
|
-
var that = this,
|
69
|
-
file = files[index],
|
70
|
-
deferred = $.Deferred(),
|
71
|
-
canvas,
|
72
|
-
blob;
|
73
|
-
options = options || this.options;
|
74
|
-
loadImage(
|
75
|
-
file,
|
76
|
-
function (img) {
|
77
|
-
var width = img.width,
|
78
|
-
height = img.height;
|
79
|
-
canvas = loadImage.scale(img, {
|
80
|
-
maxWidth: options.resizeMaxWidth,
|
81
|
-
maxHeight: options.resizeMaxHeight,
|
82
|
-
minWidth: options.resizeMinWidth,
|
83
|
-
minHeight: options.resizeMinHeight,
|
84
|
-
canvas: true
|
85
|
-
});
|
86
|
-
if (width !== canvas.width || height !== canvas.height) {
|
87
|
-
canvasToBlob(canvas, function (blob) {
|
88
|
-
if (!blob.name) {
|
89
|
-
if (file.type === blob.type) {
|
90
|
-
blob.name = file.name;
|
91
|
-
} else if (file.name) {
|
92
|
-
blob.name = file.name.replace(
|
93
|
-
/\..+$/,
|
94
|
-
'.' + blob.type.substr(6)
|
95
|
-
);
|
96
|
-
}
|
97
|
-
}
|
98
|
-
files[index] = blob;
|
99
|
-
deferred.resolveWith(that);
|
100
|
-
}, file);
|
101
|
-
} else {
|
102
|
-
deferred.resolveWith(that);
|
103
|
-
}
|
104
|
-
}
|
105
|
-
);
|
106
|
-
return deferred.promise();
|
107
|
-
},
|
108
|
-
|
109
|
-
// Resizes the images given as files property of the data parameter,
|
110
|
-
// returns a Promise object that allows to bind a done handler, which
|
111
|
-
// will be invoked after processing all images is done:
|
112
|
-
resize: function (data) {
|
113
|
-
var that = this,
|
114
|
-
options = $.extend({}, this.options, data),
|
115
|
-
resizeAll = $.type(options.resizeSourceMaxFileSize) !== 'number',
|
116
|
-
isXHRUpload = this._isXHRUpload(options);
|
117
|
-
$.each(data.files, function (index, file) {
|
118
|
-
if (isXHRUpload && that._resizeSupport &&
|
119
|
-
(options.resizeMaxWidth || options.resizeMaxHeight ||
|
120
|
-
options.resizeMinWidth || options.resizeMinHeight) &&
|
121
|
-
(resizeAll || file.size < options.resizeSourceMaxFileSize) &&
|
122
|
-
options.resizeSourceFileTypes.test(file.type)) {
|
123
|
-
that._processing += 1;
|
124
|
-
if (that._processing === 1) {
|
125
|
-
that.element.addClass('fileupload-processing');
|
126
|
-
}
|
127
|
-
that._processingQueue = that._processingQueue.pipe(function () {
|
128
|
-
var deferred = $.Deferred();
|
129
|
-
that._resizeImage(
|
130
|
-
data.files,
|
131
|
-
index,
|
132
|
-
options
|
133
|
-
).done(function () {
|
134
|
-
that._processing -= 1;
|
135
|
-
if (that._processing === 0) {
|
136
|
-
that.element
|
137
|
-
.removeClass('fileupload-processing');
|
138
|
-
}
|
139
|
-
deferred.resolveWith(that);
|
140
|
-
});
|
141
|
-
return deferred.promise();
|
142
|
-
});
|
143
|
-
}
|
144
|
-
});
|
145
|
-
return this._processingQueue;
|
146
|
-
},
|
147
|
-
|
148
|
-
_create: function () {
|
149
|
-
$.blueimp.fileupload.prototype._create.call(this);
|
150
|
-
this._processing = 0;
|
151
|
-
this._processingQueue = $.Deferred().resolveWith(this).promise();
|
152
|
-
this._resizeSupport = canvasToBlob && canvasToBlob(
|
153
|
-
document.createElement('canvas'),
|
154
|
-
$.noop
|
155
|
-
);
|
156
|
-
}
|
157
|
-
|
158
|
-
});
|
159
|
-
|
160
|
-
}));
|