jquery-fileupload-rails 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
-
}));
|