jquery-fileupload-rails 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,7 +4,11 @@
4
4
 
5
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.9.2.
7
+ ## Plugin versions
8
+
9
+ * jQuery File Upload User Interface Plugin 6.9.4
10
+ * jQuery File Upload Plugin 5.16.1
11
+ * jQuery UI Widget 1.8.23+amd
8
12
 
9
13
  ## Installing Gem
10
14
 
@@ -44,6 +48,10 @@ Require the stylesheet file to app/assets/stylesheets/application.css
44
48
 
45
49
  *= require jquery.fileupload-ui
46
50
 
51
+ ## [Example app](https://github.com/tors/jquery-fileupload-rails-paperclip-example)
52
+ This app uses paperclip and twitter-bootstrap-rails
53
+
54
+
47
55
  ## Thanks
48
56
  Thanks to [Sebastian Tschan](https://github.com/blueimp) for writing an awesome file upload plugin.
49
57
 
@@ -1,7 +1,7 @@
1
1
  module JQuery
2
2
  module FileUpload
3
3
  module Rails
4
- VERSION = "0.3.1"
4
+ VERSION = "0.3.2"
5
5
  end
6
6
  end
7
7
  end
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jQuery File Upload User Interface Plugin 6.9.3
2
+ * jQuery File Upload User Interface Plugin 6.9.4
3
3
  * https://github.com/blueimp/jQuery-File-Upload
4
4
  *
5
5
  * Copyright 2010, Sebastian Tschan
@@ -89,7 +89,7 @@
89
89
  files = data.files;
90
90
  $(this).fileupload('process', data).done(function () {
91
91
  that._adjustMaxNumberOfFiles(-files.length);
92
- data.isAdjusted = true;
92
+ data.maxNumberOfFilesAdjusted = true;
93
93
  data.files.valid = data.isValidated = that._validate(files);
94
94
  data.context = that._renderUpload(files).data('data', data);
95
95
  options.filesContainer[
@@ -112,8 +112,9 @@
112
112
  send: function (e, data) {
113
113
  var that = $(this).data('fileupload');
114
114
  if (!data.isValidated) {
115
- if (!data.isAdjusted) {
115
+ if (!data.maxNumberOfFilesAdjusted) {
116
116
  that._adjustMaxNumberOfFiles(-data.files.length);
117
+ data.maxNumberOfFilesAdjusted = true;
117
118
  }
118
119
  if (!that._validate(data.files)) {
119
120
  return false;
@@ -163,6 +164,17 @@
163
164
  );
164
165
  });
165
166
  } else {
167
+ if ($.isArray(data.result)) {
168
+ $.each(data.result, function (index, file) {
169
+ if (data.maxNumberOfFilesAdjusted && file.error) {
170
+ that._adjustMaxNumberOfFiles(1);
171
+ } else if (!data.maxNumberOfFilesAdjusted &&
172
+ !file.error) {
173
+ that._adjustMaxNumberOfFiles(-1);
174
+ }
175
+ });
176
+ data.maxNumberOfFilesAdjusted = true;
177
+ }
166
178
  template = that._renderDownload(data.result)
167
179
  .appendTo(that.options.filesContainer);
168
180
  that._forceReflow(template);
@@ -178,7 +190,9 @@
178
190
  fail: function (e, data) {
179
191
  var that = $(this).data('fileupload'),
180
192
  template;
181
- that._adjustMaxNumberOfFiles(data.files.length);
193
+ if (data.maxNumberOfFilesAdjusted) {
194
+ that._adjustMaxNumberOfFiles(data.files.length);
195
+ }
182
196
  if (data.context) {
183
197
  data.context.each(function (index) {
184
198
  if (data.errorThrown !== 'abort') {
@@ -209,7 +223,6 @@
209
223
  }
210
224
  });
211
225
  } else if (data.errorThrown !== 'abort') {
212
- that._adjustMaxNumberOfFiles(-data.files.length);
213
226
  data.context = that._renderUpload(data.files)
214
227
  .appendTo(that.options.filesContainer)
215
228
  .data('data', data);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jQuery File Upload Plugin 5.13
2
+ * jQuery File Upload Plugin 5.16.1
3
3
  * https://github.com/blueimp/jQuery-File-Upload
4
4
  *
5
5
  * Copyright 2010, Sebastian Tschan
@@ -447,6 +447,9 @@
447
447
  if (options.type !== 'POST' && options.type !== 'PUT') {
448
448
  options.type = 'POST';
449
449
  }
450
+ if (!options.formAcceptCharset) {
451
+ options.formAcceptCharset = options.form.attr('accept-charset');
452
+ }
450
453
  },
451
454
 
452
455
  _getAJAXSettings: function (data) {
@@ -663,9 +666,15 @@
663
666
  options.limitConcurrentUploads > that._sending) {
664
667
  // Start the next queued upload,
665
668
  // that has not been aborted:
666
- var nextSlot = that._slots.shift();
669
+ var nextSlot = that._slots.shift(),
670
+ isPending;
667
671
  while (nextSlot) {
668
- if (!nextSlot.isRejected()) {
672
+ // jQuery 1.6 doesn't provide .state(),
673
+ // while jQuery 1.8+ removed .isRejected():
674
+ isPending = nextSlot.state ?
675
+ nextSlot.state() === 'pending' :
676
+ !nextSlot.isRejected();
677
+ if (isPending) {
669
678
  nextSlot.resolve();
670
679
  break;
671
680
  }
@@ -693,7 +702,7 @@
693
702
  var args = [undefined, 'abort', 'abort'];
694
703
  if (!jqXHR) {
695
704
  if (slot) {
696
- slot.rejectWith(args);
705
+ slot.rejectWith(pipe, args);
697
706
  }
698
707
  return send(false, args);
699
708
  }
@@ -748,14 +757,6 @@
748
757
  return result;
749
758
  },
750
759
 
751
- // File Normalization for Gecko 1.9.1 (Firefox 3.5) support:
752
- _normalizeFile: function (index, file) {
753
- if (file.name === undefined && file.size === undefined) {
754
- file.name = file.fileName;
755
- file.size = file.fileSize;
756
- }
757
- },
758
-
759
760
  _replaceFileInput: function (input) {
760
761
  var inputClone = input.clone(true);
761
762
  $('<form></form>').append(inputClone)[0].reset();
@@ -780,21 +781,90 @@
780
781
  }
781
782
  },
782
783
 
784
+ _handleFileTreeEntry: function (entry, path) {
785
+ var that = this,
786
+ dfd = $.Deferred(),
787
+ errorHandler = function () {
788
+ dfd.reject();
789
+ },
790
+ dirReader;
791
+ path = path || '';
792
+ if (entry.isFile) {
793
+ entry.file(function (file) {
794
+ file.relativePath = path;
795
+ dfd.resolve(file);
796
+ }, errorHandler);
797
+ } else if (entry.isDirectory) {
798
+ dirReader = entry.createReader();
799
+ dirReader.readEntries(function (entries) {
800
+ that._handleFileTreeEntries(
801
+ entries,
802
+ path + entry.name + '/'
803
+ ).done(function (files) {
804
+ dfd.resolve(files);
805
+ }).fail(errorHandler);
806
+ }, errorHandler);
807
+ } else {
808
+ errorHandler();
809
+ }
810
+ return dfd.promise();
811
+ },
812
+
813
+ _handleFileTreeEntries: function (entries, path) {
814
+ var that = this;
815
+ return $.when.apply(
816
+ $,
817
+ $.map(entries, function (entry) {
818
+ return that._handleFileTreeEntry(entry, path);
819
+ })
820
+ ).pipe(function () {
821
+ return Array.prototype.concat.apply(
822
+ [],
823
+ arguments
824
+ );
825
+ });
826
+ },
827
+
828
+ _getDroppedFiles: function (dataTransfer) {
829
+ dataTransfer = dataTransfer || {};
830
+ var items = dataTransfer.items;
831
+ if (items && items.length && (items[0].webkitGetAsEntry ||
832
+ items[0].getAsEntry)) {
833
+ return this._handleFileTreeEntries(
834
+ $.map(items, function (item) {
835
+ if (item.webkitGetAsEntry) {
836
+ return item.webkitGetAsEntry();
837
+ }
838
+ return item.getAsEntry();
839
+ })
840
+ );
841
+ }
842
+ return $.Deferred().resolve(
843
+ $.makeArray(dataTransfer.files)
844
+ ).promise();
845
+ },
846
+
783
847
  _getFileInputFiles: function (fileInput) {
784
848
  fileInput = $(fileInput);
785
- var files = $.each($.makeArray(fileInput.prop('files')), this._normalizeFile),
849
+ var entries = fileInput.prop('webkitEntries') ||
850
+ fileInput.prop('entries'),
851
+ files,
786
852
  value;
853
+ if (entries) {
854
+ return this._handleFileTreeEntries(entries);
855
+ }
856
+ files = $.makeArray(fileInput.prop('files'));
787
857
  if (!files.length) {
788
858
  value = fileInput.prop('value');
789
859
  if (!value) {
790
- return [];
860
+ return $.Deferred().reject([]).promise();
791
861
  }
792
862
  // If the files property is not available, the browser does not
793
863
  // support the File API and we add a pseudo File object with
794
864
  // the input value as name with path information removed:
795
865
  files = [{name: value.replace(/^.*\\/, '')}];
796
866
  }
797
- return files;
867
+ return $.Deferred().resolve(files).promise();
798
868
  },
799
869
 
800
870
  _onChange: function (e) {
@@ -803,14 +873,15 @@
803
873
  fileInput: $(e.target),
804
874
  form: $(e.target.form)
805
875
  };
806
- data.files = that._getFileInputFiles(data.fileInput);
807
- if (that.options.replaceFileInput) {
808
- that._replaceFileInput(data.fileInput);
809
- }
810
- if (that._trigger('change', e, data) === false ||
811
- that._onAdd(e, data) === false) {
812
- return false;
813
- }
876
+ that._getFileInputFiles(data.fileInput).always(function (files) {
877
+ data.files = files;
878
+ if (that.options.replaceFileInput) {
879
+ that._replaceFileInput(data.fileInput);
880
+ }
881
+ if (that._trigger('change', e, data) !== false) {
882
+ that._onAdd(e, data);
883
+ }
884
+ });
814
885
  },
815
886
 
816
887
  _onPaste: function (e) {
@@ -831,19 +902,16 @@
831
902
  },
832
903
 
833
904
  _onDrop: function (e) {
905
+ e.preventDefault();
834
906
  var that = e.data.fileupload,
835
907
  dataTransfer = e.dataTransfer = e.originalEvent.dataTransfer,
836
- data = {
837
- files: $.each(
838
- $.makeArray(dataTransfer && dataTransfer.files),
839
- that._normalizeFile
840
- )
841
- };
842
- if (that._trigger('drop', e, data) === false ||
843
- that._onAdd(e, data) === false) {
844
- return false;
845
- }
846
- e.preventDefault();
908
+ data = {};
909
+ that._getDroppedFiles(dataTransfer).always(function (files) {
910
+ data.files = files;
911
+ if (that._trigger('drop', e, data) !== false) {
912
+ that._onAdd(e, data);
913
+ }
914
+ });
847
915
  },
848
916
 
849
917
  _onDragOver: function (e) {
@@ -937,29 +1005,61 @@
937
1005
  // must have a files property and can contain additional options:
938
1006
  // .fileupload('add', {files: filesList});
939
1007
  add: function (data) {
1008
+ var that = this;
940
1009
  if (!data || this.options.disabled) {
941
1010
  return;
942
1011
  }
943
1012
  if (data.fileInput && !data.files) {
944
- data.files = this._getFileInputFiles(data.fileInput);
1013
+ this._getFileInputFiles(data.fileInput).always(function (files) {
1014
+ data.files = files;
1015
+ that._onAdd(null, data);
1016
+ });
945
1017
  } else {
946
- data.files = $.each($.makeArray(data.files), this._normalizeFile);
1018
+ data.files = $.makeArray(data.files);
1019
+ this._onAdd(null, data);
947
1020
  }
948
- this._onAdd(null, data);
949
1021
  },
950
1022
 
951
1023
  // This method is exposed to the widget API and allows sending files
952
1024
  // using the fileupload API. The data parameter accepts an object which
953
- // must have a files property and can contain additional options:
1025
+ // must have a files or fileInput property and can contain additional options:
954
1026
  // .fileupload('send', {files: filesList});
955
1027
  // The method returns a Promise object for the file upload call.
956
1028
  send: function (data) {
957
1029
  if (data && !this.options.disabled) {
958
1030
  if (data.fileInput && !data.files) {
959
- data.files = this._getFileInputFiles(data.fileInput);
960
- } else {
961
- data.files = $.each($.makeArray(data.files), this._normalizeFile);
1031
+ var that = this,
1032
+ dfd = $.Deferred(),
1033
+ promise = dfd.promise(),
1034
+ jqXHR,
1035
+ aborted;
1036
+ promise.abort = function () {
1037
+ aborted = true;
1038
+ if (jqXHR) {
1039
+ return jqXHR.abort();
1040
+ }
1041
+ dfd.reject(null, 'abort', 'abort');
1042
+ return promise;
1043
+ };
1044
+ this._getFileInputFiles(data.fileInput).always(
1045
+ function (files) {
1046
+ if (aborted) {
1047
+ return;
1048
+ }
1049
+ data.files = files;
1050
+ jqXHR = that._onSend(null, data).then(
1051
+ function (result, textStatus, jqXHR) {
1052
+ dfd.resolve(result, textStatus, jqXHR);
1053
+ },
1054
+ function (jqXHR, textStatus, errorThrown) {
1055
+ dfd.reject(jqXHR, textStatus, errorThrown);
1056
+ }
1057
+ );
1058
+ }
1059
+ );
1060
+ return this._enhancePromise(promise);
962
1061
  }
1062
+ data.files = $.makeArray(data.files);
963
1063
  if (data.files.length) {
964
1064
  return this._onSend(null, data);
965
1065
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jQuery Iframe Transport Plugin 1.4
2
+ * jQuery Iframe Transport Plugin 1.5
3
3
  * https://github.com/blueimp/jQuery-File-Upload
4
4
  *
5
5
  * Copyright 2011, Sebastian Tschan
@@ -42,6 +42,7 @@
42
42
  return {
43
43
  send: function (_, completeCallback) {
44
44
  form = $('<form style="display:none;"></form>');
45
+ form.attr('accept-charset', options.formAcceptCharset);
45
46
  // javascript:false as initial iframe src
46
47
  // prevents warning popups on HTTPS in IE6.
47
48
  // IE versions below IE8 cannot set the name property of
@@ -1,5 +1,5 @@
1
1
  /*
2
- * JavaScript Canvas to Blob 2.0.1
2
+ * JavaScript Canvas to Blob 2.0.2
3
3
  * https://github.com/blueimp/JavaScript-Canvas-to-Blob
4
4
  *
5
5
  * Copyright 2012, Sebastian Tschan
@@ -13,16 +13,23 @@
13
13
  */
14
14
 
15
15
  /*jslint nomen: true, regexp: true */
16
- /*global window, atob, ArrayBuffer, Uint8Array, define */
16
+ /*global window, atob, Blob, ArrayBuffer, Uint8Array, define */
17
17
 
18
18
  (function (window) {
19
19
  'use strict';
20
20
  var CanvasPrototype = window.HTMLCanvasElement &&
21
21
  window.HTMLCanvasElement.prototype,
22
+ hasBlobConstructor = function () {
23
+ try {
24
+ return !!new Blob();
25
+ } catch (e) {
26
+ return false;
27
+ }
28
+ }(),
22
29
  BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
23
30
  window.MozBlobBuilder || window.MSBlobBuilder,
24
- dataURLtoBlob = BlobBuilder && window.atob && window.ArrayBuffer &&
25
- window.Uint8Array && function (dataURI) {
31
+ dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
32
+ window.ArrayBuffer && window.Uint8Array && function (dataURI) {
26
33
  var byteString,
27
34
  arrayBuffer,
28
35
  intArray,
@@ -42,11 +49,14 @@
42
49
  for (i = 0; i < byteString.length; i += 1) {
43
50
  intArray[i] = byteString.charCodeAt(i);
44
51
  }
52
+ // Separate out the mime component:
53
+ mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
45
54
  // Write the ArrayBuffer to a blob:
55
+ if (hasBlobConstructor) {
56
+ return new Blob([arrayBuffer], {type: mimeString});
57
+ }
46
58
  bb = new BlobBuilder();
47
59
  bb.append(arrayBuffer);
48
- // Separate out the mime component:
49
- mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
50
60
  return bb.getBlob(mimeString);
51
61
  };
52
62
  if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jQuery UI Widget 1.8.22+amd
2
+ * jQuery UI Widget 1.8.23+amd
3
3
  * https://github.com/blueimp/jQuery-File-Upload
4
4
  *
5
5
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
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.1
4
+ version: 0.3.2
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-07-31 00:00:00.000000000 Z
12
+ date: 2012-08-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties