jquery.fileupload-rails 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
data/Readme.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
//= require jquery.iframe-transport
|
3
3
|
|
4
4
|
/*
|
5
|
-
* jQuery File Upload Plugin 5.
|
5
|
+
* jQuery File Upload Plugin 5.26
|
6
6
|
* https://github.com/blueimp/jQuery-File-Upload
|
7
7
|
*
|
8
8
|
* Copyright 2010, Sebastian Tschan
|
@@ -36,21 +36,6 @@
|
|
36
36
|
$.support.xhrFileUpload = !!(window.XMLHttpRequestUpload && window.FileReader);
|
37
37
|
$.support.xhrFormDataFileUpload = !!window.FormData;
|
38
38
|
|
39
|
-
// The form.elements propHook is added to filter serialized elements
|
40
|
-
// to not include file inputs in jQuery 1.9.0.
|
41
|
-
// This hooks directly into jQuery.fn.serializeArray.
|
42
|
-
// For more info, see http://bugs.jquery.com/ticket/13306
|
43
|
-
$.propHooks.elements = {
|
44
|
-
get: function (form) {
|
45
|
-
if ($.nodeName(form, 'form')) {
|
46
|
-
return $.grep(form.elements, function (elem) {
|
47
|
-
return !$.nodeName(elem, 'input') || elem.type !== 'file';
|
48
|
-
});
|
49
|
-
}
|
50
|
-
return null;
|
51
|
-
}
|
52
|
-
};
|
53
|
-
|
54
39
|
// The fileupload widget listens for change events on file input fields defined
|
55
40
|
// via fileInput setting and paste or drop events of the given dropZone.
|
56
41
|
// In addition to the default jQuery Widget methods, the fileupload widget
|
@@ -130,6 +115,8 @@
|
|
130
115
|
progressInterval: 100,
|
131
116
|
// Interval in milliseconds to calculate progress bitrate:
|
132
117
|
bitrateInterval: 500,
|
118
|
+
// By default, uploads are started automatically when adding files:
|
119
|
+
autoUpload: true,
|
133
120
|
|
134
121
|
// Additional form data to be sent along with the file uploads can be set
|
135
122
|
// using this option, which accepts an array of objects with name and
|
@@ -154,7 +141,11 @@
|
|
154
141
|
// handlers using jQuery's Deferred callbacks:
|
155
142
|
// data.submit().done(func).fail(func).always(func);
|
156
143
|
add: function (e, data) {
|
157
|
-
data.
|
144
|
+
if (data.autoUpload || (data.autoUpload !== false &&
|
145
|
+
($(this).data('blueimp-fileupload') ||
|
146
|
+
$(this).data('fileupload')).options.autoUpload)) {
|
147
|
+
data.submit();
|
148
|
+
}
|
158
149
|
},
|
159
150
|
|
160
151
|
// Other callbacks:
|
@@ -273,10 +264,17 @@
|
|
273
264
|
return total;
|
274
265
|
},
|
275
266
|
|
267
|
+
_initProgressObject: function (obj) {
|
268
|
+
obj._progress = {
|
269
|
+
loaded: 0,
|
270
|
+
total: 0,
|
271
|
+
bitrate: 0
|
272
|
+
};
|
273
|
+
},
|
274
|
+
|
276
275
|
_onProgress: function (e, data) {
|
277
276
|
if (e.lengthComputable) {
|
278
277
|
var now = +(new Date()),
|
279
|
-
total,
|
280
278
|
loaded;
|
281
279
|
if (data._time && data.progressInterval &&
|
282
280
|
(now - data._time < data.progressInterval) &&
|
@@ -284,16 +282,19 @@
|
|
284
282
|
return;
|
285
283
|
}
|
286
284
|
data._time = now;
|
287
|
-
|
288
|
-
|
289
|
-
e.loaded / e.total * (data.chunkSize || total),
|
290
|
-
10
|
285
|
+
loaded = Math.floor(
|
286
|
+
e.loaded / e.total * (data.chunkSize || data._progress.total)
|
291
287
|
) + (data.uploadedBytes || 0);
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
288
|
+
// Add the difference from the previously loaded state
|
289
|
+
// to the global loaded counter:
|
290
|
+
this._progress.loaded += (loaded - data._progress.loaded);
|
291
|
+
this._progress.bitrate = this._bitrateTimer.getBitrate(
|
292
|
+
now,
|
293
|
+
this._progress.loaded,
|
294
|
+
data.bitrateInterval
|
295
|
+
);
|
296
|
+
data._progress.loaded = data.loaded = loaded;
|
297
|
+
data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
|
297
298
|
now,
|
298
299
|
loaded,
|
299
300
|
data.bitrateInterval
|
@@ -304,16 +305,7 @@
|
|
304
305
|
this._trigger('progress', e, data);
|
305
306
|
// Trigger a global progress event for all current file uploads,
|
306
307
|
// including ajax calls queued for sequential file uploads:
|
307
|
-
this._trigger('progressall', e,
|
308
|
-
lengthComputable: true,
|
309
|
-
loaded: this._loaded,
|
310
|
-
total: this._total,
|
311
|
-
bitrate: this._bitrateTimer.getBitrate(
|
312
|
-
now,
|
313
|
-
this._loaded,
|
314
|
-
data.bitrateInterval
|
315
|
-
)
|
316
|
-
});
|
308
|
+
this._trigger('progressall', e, this._progress);
|
317
309
|
}
|
318
310
|
},
|
319
311
|
|
@@ -498,6 +490,21 @@
|
|
498
490
|
return options;
|
499
491
|
},
|
500
492
|
|
493
|
+
// jQuery 1.6 doesn't provide .state(),
|
494
|
+
// while jQuery 1.8+ removed .isRejected() and .isResolved():
|
495
|
+
_getDeferredState: function (deferred) {
|
496
|
+
if (deferred.state) {
|
497
|
+
return deferred.state();
|
498
|
+
}
|
499
|
+
if (deferred.isResolved()) {
|
500
|
+
return 'resolved';
|
501
|
+
}
|
502
|
+
if (deferred.isRejected()) {
|
503
|
+
return 'rejected';
|
504
|
+
}
|
505
|
+
return 'pending';
|
506
|
+
},
|
507
|
+
|
501
508
|
// Maps jqXHR callbacks to the equivalent
|
502
509
|
// methods of the given Promise object:
|
503
510
|
_enhancePromise: function (promise) {
|
@@ -522,6 +529,33 @@
|
|
522
529
|
return this._enhancePromise(promise);
|
523
530
|
},
|
524
531
|
|
532
|
+
// Adds convenience methods to the callback arguments:
|
533
|
+
_addConvenienceMethods: function (e, data) {
|
534
|
+
var that = this;
|
535
|
+
data.submit = function () {
|
536
|
+
if (this.state() !== 'pending') {
|
537
|
+
data.jqXHR = this.jqXHR =
|
538
|
+
(that._trigger('submit', e, this) !== false) &&
|
539
|
+
that._onSend(e, this);
|
540
|
+
}
|
541
|
+
return this.jqXHR || that._getXHRPromise();
|
542
|
+
};
|
543
|
+
data.abort = function () {
|
544
|
+
if (this.jqXHR) {
|
545
|
+
return this.jqXHR.abort();
|
546
|
+
}
|
547
|
+
return this._getXHRPromise();
|
548
|
+
};
|
549
|
+
data.state = function () {
|
550
|
+
if (this.jqXHR) {
|
551
|
+
return that._getDeferredState(this.jqXHR);
|
552
|
+
}
|
553
|
+
};
|
554
|
+
data.progress = function () {
|
555
|
+
return this._progress;
|
556
|
+
};
|
557
|
+
},
|
558
|
+
|
525
559
|
// Parses the Range header from the server response
|
526
560
|
// and returns the uploaded bytes:
|
527
561
|
_getUploadedBytes: function (jqXHR) {
|
@@ -566,7 +600,8 @@
|
|
566
600
|
// The chunk upload method:
|
567
601
|
upload = function () {
|
568
602
|
// Clone the options object for each chunk upload:
|
569
|
-
var o = $.extend({}, options)
|
603
|
+
var o = $.extend({}, options),
|
604
|
+
currentLoaded = o._progress.loaded;
|
570
605
|
o.blob = slice.call(
|
571
606
|
file,
|
572
607
|
ub,
|
@@ -588,10 +623,10 @@
|
|
588
623
|
.done(function (result, textStatus, jqXHR) {
|
589
624
|
ub = that._getUploadedBytes(jqXHR) ||
|
590
625
|
(ub + o.chunkSize);
|
591
|
-
// Create a progress event if
|
592
|
-
//
|
593
|
-
//
|
594
|
-
if (
|
626
|
+
// Create a progress event if no final progress event
|
627
|
+
// with loaded equaling total has been triggered
|
628
|
+
// for this chunk:
|
629
|
+
if (o._progress.loaded === currentLoaded) {
|
595
630
|
that._onProgress($.Event('progress', {
|
596
631
|
lengthComputable: true,
|
597
632
|
loaded: ub - o.uploadedBytes,
|
@@ -643,20 +678,27 @@
|
|
643
678
|
this._trigger('start');
|
644
679
|
// Set timer for global bitrate progress calculation:
|
645
680
|
this._bitrateTimer = new this._BitrateTimer();
|
681
|
+
// Reset the global progress values:
|
682
|
+
this._progress.loaded = this._progress.total = 0;
|
683
|
+
this._progress.bitrate = 0;
|
646
684
|
}
|
685
|
+
if (!data._progress) {
|
686
|
+
data._progress = {};
|
687
|
+
}
|
688
|
+
data._progress.loaded = data.loaded = data.uploadedBytes || 0;
|
689
|
+
data._progress.total = data.total = this._getTotal(data.files) || 1;
|
690
|
+
data._progress.bitrate = data.bitrate = 0;
|
647
691
|
this._active += 1;
|
648
692
|
// Initialize the global progress values:
|
649
|
-
this.
|
650
|
-
this.
|
693
|
+
this._progress.loaded += data.loaded;
|
694
|
+
this._progress.total += data.total;
|
651
695
|
},
|
652
696
|
|
653
697
|
_onDone: function (result, textStatus, jqXHR, options) {
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
//
|
658
|
-
// or if there has been no progress event with
|
659
|
-
// loaded equaling total for XHR uploads:
|
698
|
+
var total = options._progress.total;
|
699
|
+
if (options._progress.loaded < total) {
|
700
|
+
// Create a progress event if no final progress event
|
701
|
+
// with loaded equaling total has been triggered:
|
660
702
|
this._onProgress($.Event('progress', {
|
661
703
|
lengthComputable: true,
|
662
704
|
loaded: total,
|
@@ -677,8 +719,8 @@
|
|
677
719
|
if (options.recalculateProgress) {
|
678
720
|
// Remove the failed (error or abort) file upload from
|
679
721
|
// the global progress calculation:
|
680
|
-
this.
|
681
|
-
this.
|
722
|
+
this._progress.loaded -= options._progress.loaded;
|
723
|
+
this._progress.total -= options._progress.total;
|
682
724
|
}
|
683
725
|
},
|
684
726
|
|
@@ -691,13 +733,13 @@
|
|
691
733
|
// The stop callback is triggered when all uploads have
|
692
734
|
// been completed, equivalent to the global ajaxStop event:
|
693
735
|
this._trigger('stop');
|
694
|
-
// Reset the global progress values:
|
695
|
-
this._loaded = this._total = 0;
|
696
|
-
this._bitrateTimer = null;
|
697
736
|
}
|
698
737
|
},
|
699
738
|
|
700
739
|
_onSend: function (e, data) {
|
740
|
+
if (!data.submit) {
|
741
|
+
this._addConvenienceMethods(e, data);
|
742
|
+
}
|
701
743
|
var that = this,
|
702
744
|
jqXHR,
|
703
745
|
aborted,
|
@@ -728,15 +770,9 @@
|
|
728
770
|
options.limitConcurrentUploads > that._sending) {
|
729
771
|
// Start the next queued upload,
|
730
772
|
// that has not been aborted:
|
731
|
-
var nextSlot = that._slots.shift()
|
732
|
-
isPending;
|
773
|
+
var nextSlot = that._slots.shift();
|
733
774
|
while (nextSlot) {
|
734
|
-
|
735
|
-
// while jQuery 1.8+ removed .isRejected():
|
736
|
-
isPending = nextSlot.state ?
|
737
|
-
nextSlot.state() === 'pending' :
|
738
|
-
!nextSlot.isRejected();
|
739
|
-
if (isPending) {
|
775
|
+
if (that._getDeferredState(nextSlot) === 'pending') {
|
740
776
|
nextSlot.resolve();
|
741
777
|
break;
|
742
778
|
}
|
@@ -808,12 +844,8 @@
|
|
808
844
|
var newData = $.extend({}, data);
|
809
845
|
newData.files = fileSet ? element : [element];
|
810
846
|
newData.paramName = paramNameSet[index];
|
811
|
-
|
812
|
-
|
813
|
-
(that._trigger('submit', e, this) !== false) &&
|
814
|
-
that._onSend(e, this);
|
815
|
-
return this.jqXHR;
|
816
|
-
};
|
847
|
+
that._initProgressObject(newData);
|
848
|
+
that._addConvenienceMethods(e, newData);
|
817
849
|
result = that._trigger('add', e, newData);
|
818
850
|
return result;
|
819
851
|
});
|
@@ -1087,12 +1119,17 @@
|
|
1087
1119
|
this._initSpecialOptions();
|
1088
1120
|
this._slots = [];
|
1089
1121
|
this._sequence = this._getXHRPromise(true);
|
1090
|
-
this._sending = this._active =
|
1122
|
+
this._sending = this._active = 0;
|
1123
|
+
this._initProgressObject(this);
|
1091
1124
|
this._initEventHandlers();
|
1092
1125
|
},
|
1093
1126
|
|
1094
|
-
|
1095
|
-
|
1127
|
+
// This method is exposed to the widget API and allows to query
|
1128
|
+
// the widget upload progress.
|
1129
|
+
// It returns an object with loaded, total and bitrate properties
|
1130
|
+
// for the running uploads:
|
1131
|
+
progress: function () {
|
1132
|
+
return this._progress;
|
1096
1133
|
},
|
1097
1134
|
|
1098
1135
|
// This method is exposed to the widget API and allows adding files
|
metadata
CHANGED
@@ -1,48 +1,48 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jquery.fileupload-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0
|
5
4
|
prerelease:
|
5
|
+
version: 1.3.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Semyon Perepelitsa
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
12
|
+
date: 2013-03-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.1'
|
20
|
+
none: false
|
21
|
+
name: railties
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
|
25
|
-
none: false
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
26
25
|
requirements:
|
27
26
|
- - ! '>='
|
28
27
|
- !ruby/object:Gem::Version
|
29
28
|
version: '3.1'
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: jquery-ui-rails
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
29
|
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
34
32
|
requirements:
|
35
33
|
- - ~>
|
36
34
|
- !ruby/object:Gem::Version
|
37
35
|
version: '3.0'
|
36
|
+
none: false
|
37
|
+
name: jquery-ui-rails
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
|
-
|
41
|
-
none: false
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
42
41
|
requirements:
|
43
42
|
- - ~>
|
44
43
|
- !ruby/object:Gem::Version
|
45
44
|
version: '3.0'
|
45
|
+
none: false
|
46
46
|
description: This gem packages jQuery File Upload plugin and it's dependencies for
|
47
47
|
Rails asset pipeline.
|
48
48
|
email: sema@sema.in
|
@@ -90,20 +90,20 @@ rdoc_options: []
|
|
90
90
|
require_paths:
|
91
91
|
- lib
|
92
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
-
none: false
|
94
93
|
requirements:
|
95
94
|
- - ! '>='
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: '0'
|
98
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
97
|
none: false
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
99
|
requirements:
|
101
100
|
- - ! '>='
|
102
101
|
- !ruby/object:Gem::Version
|
103
102
|
version: '0'
|
103
|
+
none: false
|
104
104
|
requirements: []
|
105
105
|
rubyforge_project:
|
106
|
-
rubygems_version: 1.8.
|
106
|
+
rubygems_version: 1.8.23
|
107
107
|
signing_key:
|
108
108
|
specification_version: 3
|
109
109
|
summary: Use jQuery File Upload plugin with Rails 3
|