jquery-fileupload-rails 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +38 -16
  3. data/{vendor → app}/assets/images/loading.gif +0 -0
  4. data/{vendor → app}/assets/images/progressbar.gif +0 -0
  5. data/app/assets/javascripts/jquery-fileupload/angularjs.js +12 -0
  6. data/app/assets/javascripts/jquery-fileupload/basic-plus.js +11 -0
  7. data/app/assets/javascripts/jquery-fileupload/basic.js +3 -0
  8. data/{vendor → app}/assets/javascripts/jquery-fileupload/cors/jquery.postmessage-transport.js +4 -4
  9. data/{vendor → app}/assets/javascripts/jquery-fileupload/cors/jquery.xdr-transport.js +1 -2
  10. data/app/assets/javascripts/jquery-fileupload/index.js +13 -0
  11. data/app/assets/javascripts/jquery-fileupload/jquery-ui.js +13 -0
  12. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-angular.js +429 -0
  13. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-audio.js +106 -0
  14. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-image.js +315 -0
  15. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-jquery-ui.js +152 -0
  16. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-process.js +172 -0
  17. data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.fileupload-ui.js +178 -273
  18. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-validate.js +119 -0
  19. data/app/assets/javascripts/jquery-fileupload/jquery.fileupload-video.js +106 -0
  20. data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.fileupload.js +481 -188
  21. data/{vendor → app}/assets/javascripts/jquery-fileupload/jquery.iframe-transport.js +43 -14
  22. data/{vendor → app}/assets/javascripts/jquery-fileupload/locale.js +0 -0
  23. data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/canvas-to-blob.js +9 -5
  24. data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/jquery.ui.widget.js +72 -44
  25. data/app/assets/javascripts/jquery-fileupload/vendor/load-image.all.min.js +1 -0
  26. data/{vendor → app}/assets/javascripts/jquery-fileupload/vendor/tmpl.js +9 -8
  27. data/app/assets/stylesheets/jquery.fileupload-noscript.scss +22 -0
  28. data/app/assets/stylesheets/jquery.fileupload-ui-noscript.scss +17 -0
  29. data/app/assets/stylesheets/jquery.fileupload-ui.scss +57 -0
  30. data/app/assets/stylesheets/jquery.fileupload.scss +36 -0
  31. data/lib/jquery/fileupload/rails/version.rb +1 -1
  32. metadata +43 -39
  33. data/vendor/assets/javascripts/jquery-fileupload/basic.js +0 -4
  34. data/vendor/assets/javascripts/jquery-fileupload/index.js +0 -9
  35. data/vendor/assets/javascripts/jquery-fileupload/jquery.fileupload-fp.js +0 -223
  36. data/vendor/assets/javascripts/jquery-fileupload/vendor/load-image.js +0 -121
  37. data/vendor/assets/stylesheets/jquery.fileupload-ui.scss +0 -84
@@ -0,0 +1,172 @@
1
+ /*
2
+ * jQuery File Upload Processing Plugin 1.3.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
+ /* jshint nomen:false */
13
+ /* global define, window */
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
+ './jquery.fileupload'
22
+ ], factory);
23
+ } else {
24
+ // Browser globals:
25
+ factory(
26
+ window.jQuery
27
+ );
28
+ }
29
+ }(function ($) {
30
+ 'use strict';
31
+
32
+ var originalAdd = $.blueimp.fileupload.prototype.options.add;
33
+
34
+ // The File Upload Processing plugin extends the fileupload widget
35
+ // with file processing functionality:
36
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
37
+
38
+ options: {
39
+ // The list of processing actions:
40
+ processQueue: [
41
+ /*
42
+ {
43
+ action: 'log',
44
+ type: 'debug'
45
+ }
46
+ */
47
+ ],
48
+ add: function (e, data) {
49
+ var $this = $(this);
50
+ data.process(function () {
51
+ return $this.fileupload('process', data);
52
+ });
53
+ originalAdd.call(this, e, data);
54
+ }
55
+ },
56
+
57
+ processActions: {
58
+ /*
59
+ log: function (data, options) {
60
+ console[options.type](
61
+ 'Processing "' + data.files[data.index].name + '"'
62
+ );
63
+ }
64
+ */
65
+ },
66
+
67
+ _processFile: function (data, originalData) {
68
+ var that = this,
69
+ dfd = $.Deferred().resolveWith(that, [data]),
70
+ chain = dfd.promise();
71
+ this._trigger('process', null, data);
72
+ $.each(data.processQueue, function (i, settings) {
73
+ var func = function (data) {
74
+ if (originalData.errorThrown) {
75
+ return $.Deferred()
76
+ .rejectWith(that, [originalData]).promise();
77
+ }
78
+ return that.processActions[settings.action].call(
79
+ that,
80
+ data,
81
+ settings
82
+ );
83
+ };
84
+ chain = chain.pipe(func, settings.always && func);
85
+ });
86
+ chain
87
+ .done(function () {
88
+ that._trigger('processdone', null, data);
89
+ that._trigger('processalways', null, data);
90
+ })
91
+ .fail(function () {
92
+ that._trigger('processfail', null, data);
93
+ that._trigger('processalways', null, data);
94
+ });
95
+ return chain;
96
+ },
97
+
98
+ // Replaces the settings of each processQueue item that
99
+ // are strings starting with an "@", using the remaining
100
+ // substring as key for the option map,
101
+ // e.g. "@autoUpload" is replaced with options.autoUpload:
102
+ _transformProcessQueue: function (options) {
103
+ var processQueue = [];
104
+ $.each(options.processQueue, function () {
105
+ var settings = {},
106
+ action = this.action,
107
+ prefix = this.prefix === true ? action : this.prefix;
108
+ $.each(this, function (key, value) {
109
+ if ($.type(value) === 'string' &&
110
+ value.charAt(0) === '@') {
111
+ settings[key] = options[
112
+ value.slice(1) || (prefix ? prefix +
113
+ key.charAt(0).toUpperCase() + key.slice(1) : key)
114
+ ];
115
+ } else {
116
+ settings[key] = value;
117
+ }
118
+
119
+ });
120
+ processQueue.push(settings);
121
+ });
122
+ options.processQueue = processQueue;
123
+ },
124
+
125
+ // Returns the number of files currently in the processsing queue:
126
+ processing: function () {
127
+ return this._processing;
128
+ },
129
+
130
+ // Processes the files given as files property of the data parameter,
131
+ // returns a Promise object that allows to bind callbacks:
132
+ process: function (data) {
133
+ var that = this,
134
+ options = $.extend({}, this.options, data);
135
+ if (options.processQueue && options.processQueue.length) {
136
+ this._transformProcessQueue(options);
137
+ if (this._processing === 0) {
138
+ this._trigger('processstart');
139
+ }
140
+ $.each(data.files, function (index) {
141
+ var opts = index ? $.extend({}, options) : options,
142
+ func = function () {
143
+ if (data.errorThrown) {
144
+ return $.Deferred()
145
+ .rejectWith(that, [data]).promise();
146
+ }
147
+ return that._processFile(opts, data);
148
+ };
149
+ opts.index = index;
150
+ that._processing += 1;
151
+ that._processingQueue = that._processingQueue.pipe(func, func)
152
+ .always(function () {
153
+ that._processing -= 1;
154
+ if (that._processing === 0) {
155
+ that._trigger('processstop');
156
+ }
157
+ });
158
+ });
159
+ }
160
+ return this._processingQueue;
161
+ },
162
+
163
+ _create: function () {
164
+ this._super();
165
+ this._processing = 0;
166
+ this._processingQueue = $.Deferred().resolveWith(this)
167
+ .promise();
168
+ }
169
+
170
+ });
171
+
172
+ }));
@@ -1,5 +1,5 @@
1
1
  /*
2
- * jQuery File Upload User Interface Plugin 7.3
2
+ * jQuery File Upload User Interface Plugin 9.6.0
3
3
  * https://github.com/blueimp/jQuery-File-Upload
4
4
  *
5
5
  * Copyright 2010, Sebastian Tschan
@@ -9,8 +9,8 @@
9
9
  * http://www.opensource.org/licenses/MIT
10
10
  */
11
11
 
12
- /*jslint nomen: true, unparam: true, regexp: true */
13
- /*global define, window, URL, webkitURL, FileReader */
12
+ /* jshint nomen:false */
13
+ /* global define, window */
14
14
 
15
15
  (function (factory) {
16
16
  'use strict';
@@ -19,20 +19,27 @@
19
19
  define([
20
20
  'jquery',
21
21
  'tmpl',
22
- 'load-image',
23
- './jquery.fileupload-fp'
22
+ './jquery.fileupload-image',
23
+ './jquery.fileupload-audio',
24
+ './jquery.fileupload-video',
25
+ './jquery.fileupload-validate'
24
26
  ], factory);
25
27
  } else {
26
28
  // Browser globals:
27
29
  factory(
28
30
  window.jQuery,
29
- window.tmpl,
30
- window.loadImage
31
+ window.tmpl
31
32
  );
32
33
  }
33
- }(function ($, tmpl, loadImage) {
34
+ }(function ($, tmpl) {
34
35
  'use strict';
35
36
 
37
+ $.blueimp.fileupload.prototype._specialOptions.push(
38
+ 'filesContainer',
39
+ 'uploadTemplateId',
40
+ 'downloadTemplateId'
41
+ );
42
+
36
43
  // The UI version extends the file upload widget
37
44
  // and adds complete user interface interaction:
38
45
  $.widget('blueimp.fileupload', $.blueimp.fileupload, {
@@ -42,29 +49,6 @@
42
49
  // as the user clicks on the start buttons. To enable automatic
43
50
  // uploads, set the following option to true:
44
51
  autoUpload: false,
45
- // The following option limits the number of files that are
46
- // allowed to be uploaded using this widget:
47
- maxNumberOfFiles: undefined,
48
- // The maximum allowed file size:
49
- maxFileSize: undefined,
50
- // The minimum allowed file size:
51
- minFileSize: undefined,
52
- // The regular expression for allowed file types, matches
53
- // against either file type or file name:
54
- acceptFileTypes: /.+$/i,
55
- // The regular expression to define for which files a preview
56
- // image is shown, matched against the file type:
57
- previewSourceFileTypes: /^image\/(gif|jpeg|png)$/,
58
- // The maximum file size of images that are to be displayed as preview:
59
- previewSourceMaxFileSize: 5000000, // 5MB
60
- // The maximum width of the preview images:
61
- previewMaxWidth: 80,
62
- // The maximum height of the preview images:
63
- previewMaxHeight: 80,
64
- // By default, preview images are displayed as canvas elements
65
- // if supported by the browser. Set the following option to false
66
- // to always display preview images as img elements:
67
- previewAsCanvas: true,
68
52
  // The ID of the upload template:
69
53
  uploadTemplateId: 'template-upload',
70
54
  // The ID of the download template:
@@ -79,48 +63,79 @@
79
63
  // option of the $.ajax upload requests:
80
64
  dataType: 'json',
81
65
 
66
+ // Error and info messages:
67
+ messages: {
68
+ unknownError: 'Unknown error'
69
+ },
70
+
71
+ // Function returning the current number of files,
72
+ // used by the maxNumberOfFiles validation:
73
+ getNumberOfFiles: function () {
74
+ return this.filesContainer.children()
75
+ .not('.processing').length;
76
+ },
77
+
78
+ // Callback to retrieve the list of files from the server response:
79
+ getFilesFromResponse: function (data) {
80
+ if (data.result && $.isArray(data.result.files)) {
81
+ return data.result.files;
82
+ }
83
+ return [];
84
+ },
85
+
82
86
  // The add callback is invoked as soon as files are added to the fileupload
83
87
  // widget (via file input selection, drag & drop or add API call).
84
88
  // See the basic file upload widget for more information:
85
89
  add: function (e, data) {
86
- var that = $(this).data('blueimp-fileupload') ||
87
- $(this).data('fileupload'),
88
- options = that.options,
89
- files = data.files;
90
- $(this).fileupload('process', data).done(function () {
91
- that._adjustMaxNumberOfFiles(-files.length);
92
- data.maxNumberOfFilesAdjusted = true;
93
- data.files.valid = data.isValidated = that._validate(files);
94
- data.context = that._renderUpload(files).data('data', data);
95
- options.filesContainer[
96
- options.prependFiles ? 'prepend' : 'append'
97
- ](data.context);
90
+ if (e.isDefaultPrevented()) {
91
+ return false;
92
+ }
93
+ var $this = $(this),
94
+ that = $this.data('blueimp-fileupload') ||
95
+ $this.data('fileupload'),
96
+ options = that.options;
97
+ data.context = that._renderUpload(data.files)
98
+ .data('data', data)
99
+ .addClass('processing');
100
+ options.filesContainer[
101
+ options.prependFiles ? 'prepend' : 'append'
102
+ ](data.context);
103
+ that._forceReflow(data.context);
104
+ that._transition(data.context);
105
+ data.process(function () {
106
+ return $this.fileupload('process', data);
107
+ }).always(function () {
108
+ data.context.each(function (index) {
109
+ $(this).find('.size').text(
110
+ that._formatFileSize(data.files[index].size)
111
+ );
112
+ }).removeClass('processing');
98
113
  that._renderPreviews(data);
99
- that._forceReflow(data.context);
100
- that._transition(data.context).done(
101
- function () {
102
- if ((that._trigger('added', e, data) !== false) &&
103
- (options.autoUpload || data.autoUpload) &&
104
- data.autoUpload !== false && data.isValidated) {
105
- data.submit();
114
+ }).done(function () {
115
+ data.context.find('.start').prop('disabled', false);
116
+ if ((that._trigger('added', e, data) !== false) &&
117
+ (options.autoUpload || data.autoUpload) &&
118
+ data.autoUpload !== false) {
119
+ data.submit();
120
+ }
121
+ }).fail(function () {
122
+ if (data.files.error) {
123
+ data.context.each(function (index) {
124
+ var error = data.files[index].error;
125
+ if (error) {
126
+ $(this).find('.error').text(error);
106
127
  }
107
- }
108
- );
128
+ });
129
+ }
109
130
  });
110
131
  },
111
132
  // Callback for the start of each file upload request:
112
133
  send: function (e, data) {
134
+ if (e.isDefaultPrevented()) {
135
+ return false;
136
+ }
113
137
  var that = $(this).data('blueimp-fileupload') ||
114
138
  $(this).data('fileupload');
115
- if (!data.isValidated) {
116
- if (!data.maxNumberOfFilesAdjusted) {
117
- that._adjustMaxNumberOfFiles(-data.files.length);
118
- data.maxNumberOfFilesAdjusted = true;
119
- }
120
- if (!that._validate(data.files)) {
121
- return false;
122
- }
123
- }
124
139
  if (data.context && data.dataType &&
125
140
  data.dataType.substr(0, 6) === 'iframe') {
126
141
  // Iframe Transport does not support progress events.
@@ -131,7 +146,7 @@
131
146
  !$.support.transition && 'progress-animated'
132
147
  )
133
148
  .attr('aria-valuenow', 100)
134
- .find('.bar').css(
149
+ .children().first().css(
135
150
  'width',
136
151
  '100%'
137
152
  );
@@ -140,19 +155,21 @@
140
155
  },
141
156
  // Callback for successful uploads:
142
157
  done: function (e, data) {
158
+ if (e.isDefaultPrevented()) {
159
+ return false;
160
+ }
143
161
  var that = $(this).data('blueimp-fileupload') ||
144
162
  $(this).data('fileupload'),
145
- files = that._getFilesFromResponse(data),
163
+ getFilesFromResponse = data.getFilesFromResponse ||
164
+ that.options.getFilesFromResponse,
165
+ files = getFilesFromResponse(data),
146
166
  template,
147
167
  deferred;
148
168
  if (data.context) {
149
169
  data.context.each(function (index) {
150
170
  var file = files[index] ||
151
- {error: 'Empty file upload result'},
152
- deferred = that._addFinishedDeferreds();
153
- if (file.error) {
154
- that._adjustMaxNumberOfFiles(1);
155
- }
171
+ {error: 'Empty file upload result'};
172
+ deferred = that._addFinishedDeferreds();
156
173
  that._transition($(this)).done(
157
174
  function () {
158
175
  var node = $(this);
@@ -171,19 +188,9 @@
171
188
  );
172
189
  });
173
190
  } else {
174
- if (files.length) {
175
- $.each(files, function (index, file) {
176
- if (data.maxNumberOfFilesAdjusted && file.error) {
177
- that._adjustMaxNumberOfFiles(1);
178
- } else if (!data.maxNumberOfFilesAdjusted &&
179
- !file.error) {
180
- that._adjustMaxNumberOfFiles(-1);
181
- }
182
- });
183
- data.maxNumberOfFilesAdjusted = true;
184
- }
185
- template = that._renderDownload(files)
186
- .appendTo(that.options.filesContainer);
191
+ template = that._renderDownload(files)[
192
+ that.options.prependFiles ? 'prependTo' : 'appendTo'
193
+ ](that.options.filesContainer);
187
194
  that._forceReflow(template);
188
195
  deferred = that._addFinishedDeferreds();
189
196
  that._transition(template).done(
@@ -198,19 +205,19 @@
198
205
  },
199
206
  // Callback for failed (abort or error) uploads:
200
207
  fail: function (e, data) {
208
+ if (e.isDefaultPrevented()) {
209
+ return false;
210
+ }
201
211
  var that = $(this).data('blueimp-fileupload') ||
202
212
  $(this).data('fileupload'),
203
213
  template,
204
214
  deferred;
205
- if (data.maxNumberOfFilesAdjusted) {
206
- that._adjustMaxNumberOfFiles(data.files.length);
207
- }
208
215
  if (data.context) {
209
216
  data.context.each(function (index) {
210
217
  if (data.errorThrown !== 'abort') {
211
218
  var file = data.files[index];
212
219
  file.error = file.error || data.errorThrown ||
213
- true;
220
+ data.i18n('unknownError');
214
221
  deferred = that._addFinishedDeferreds();
215
222
  that._transition($(this)).done(
216
223
  function () {
@@ -241,8 +248,9 @@
241
248
  }
242
249
  });
243
250
  } else if (data.errorThrown !== 'abort') {
244
- data.context = that._renderUpload(data.files)
245
- .appendTo(that.options.filesContainer)
251
+ data.context = that._renderUpload(data.files)[
252
+ that.options.prependFiles ? 'prependTo' : 'appendTo'
253
+ ](that.options.filesContainer)
246
254
  .data('data', data);
247
255
  that._forceReflow(data.context);
248
256
  deferred = that._addFinishedDeferreds();
@@ -262,20 +270,28 @@
262
270
  },
263
271
  // Callback for upload progress events:
264
272
  progress: function (e, data) {
273
+ if (e.isDefaultPrevented()) {
274
+ return false;
275
+ }
276
+ var progress = Math.floor(data.loaded / data.total * 100);
265
277
  if (data.context) {
266
- var progress = parseInt(data.loaded / data.total * 100, 10);
267
- data.context.find('.progress')
268
- .attr('aria-valuenow', progress)
269
- .find('.bar').css(
270
- 'width',
271
- progress + '%'
272
- );
278
+ data.context.each(function () {
279
+ $(this).find('.progress')
280
+ .attr('aria-valuenow', progress)
281
+ .children().first().css(
282
+ 'width',
283
+ progress + '%'
284
+ );
285
+ });
273
286
  }
274
287
  },
275
288
  // Callback for global upload progress events:
276
289
  progressall: function (e, data) {
290
+ if (e.isDefaultPrevented()) {
291
+ return false;
292
+ }
277
293
  var $this = $(this),
278
- progress = parseInt(data.loaded / data.total * 100, 10),
294
+ progress = Math.floor(data.loaded / data.total * 100),
279
295
  globalProgressNode = $this.find('.fileupload-progress'),
280
296
  extendedProgressNode = globalProgressNode
281
297
  .find('.progress-extended');
@@ -288,13 +304,16 @@
288
304
  globalProgressNode
289
305
  .find('.progress')
290
306
  .attr('aria-valuenow', progress)
291
- .find('.bar').css(
307
+ .children().first().css(
292
308
  'width',
293
309
  progress + '%'
294
310
  );
295
311
  },
296
312
  // Callback for uploads start, equivalent to the global ajaxStart event:
297
313
  start: function (e) {
314
+ if (e.isDefaultPrevented()) {
315
+ return false;
316
+ }
298
317
  var that = $(this).data('blueimp-fileupload') ||
299
318
  $(this).data('fileupload');
300
319
  that._resetFinishedDeferreds();
@@ -306,6 +325,9 @@
306
325
  },
307
326
  // Callback for uploads stop, equivalent to the global ajaxStop event:
308
327
  stop: function (e) {
328
+ if (e.isDefaultPrevented()) {
329
+ return false;
330
+ }
309
331
  var that = $(this).data('blueimp-fileupload') ||
310
332
  $(this).data('fileupload'),
311
333
  deferred = that._addFinishedDeferreds();
@@ -317,26 +339,47 @@
317
339
  function () {
318
340
  $(this).find('.progress')
319
341
  .attr('aria-valuenow', '0')
320
- .find('.bar').css('width', '0%');
342
+ .children().first().css('width', '0%');
321
343
  $(this).find('.progress-extended').html(' ');
322
344
  deferred.resolve();
323
345
  }
324
346
  );
325
347
  },
348
+ processstart: function (e) {
349
+ if (e.isDefaultPrevented()) {
350
+ return false;
351
+ }
352
+ $(this).addClass('fileupload-processing');
353
+ },
354
+ processstop: function (e) {
355
+ if (e.isDefaultPrevented()) {
356
+ return false;
357
+ }
358
+ $(this).removeClass('fileupload-processing');
359
+ },
326
360
  // Callback for file deletion:
327
361
  destroy: function (e, data) {
362
+ if (e.isDefaultPrevented()) {
363
+ return false;
364
+ }
328
365
  var that = $(this).data('blueimp-fileupload') ||
329
- $(this).data('fileupload');
366
+ $(this).data('fileupload'),
367
+ removeNode = function () {
368
+ that._transition(data.context).done(
369
+ function () {
370
+ $(this).remove();
371
+ that._trigger('destroyed', e, data);
372
+ }
373
+ );
374
+ };
330
375
  if (data.url) {
331
- $.ajax(data);
332
- that._adjustMaxNumberOfFiles(1);
376
+ data.dataType = data.dataType || that.options.dataType;
377
+ $.ajax(data).done(removeNode).fail(function () {
378
+ that._trigger('destroyfailed', e, data);
379
+ });
380
+ } else {
381
+ removeNode();
333
382
  }
334
- that._transition(data.context).done(
335
- function () {
336
- $(this).remove();
337
- that._trigger('destroyed', e, data);
338
- }
339
- );
340
383
  }
341
384
  },
342
385
 
@@ -356,13 +399,6 @@
356
399
  return this._finishedUploads;
357
400
  },
358
401
 
359
- _getFilesFromResponse: function (data) {
360
- if (data.result && $.isArray(data.result.files)) {
361
- return data.result.files;
362
- }
363
- return [];
364
- },
365
-
366
402
  // Link handler, that allows to download files
367
403
  // by drag & drop of the links to the desktop:
368
404
  _enableDragToDesktop: function () {
@@ -376,21 +412,10 @@
376
412
  'DownloadURL',
377
413
  [type, name, url].join(':')
378
414
  );
379
- } catch (err) {}
415
+ } catch (ignore) {}
380
416
  });
381
417
  },
382
418
 
383
- _adjustMaxNumberOfFiles: function (operand) {
384
- if (typeof this.options.maxNumberOfFiles === 'number') {
385
- this.options.maxNumberOfFiles += operand;
386
- if (this.options.maxNumberOfFiles < 1) {
387
- this._disableFileInputButton();
388
- } else {
389
- this._enableFileInputButton();
390
- }
391
- }
392
- },
393
-
394
419
  _formatFileSize: function (bytes) {
395
420
  if (typeof bytes !== 'number') {
396
421
  return '';
@@ -422,7 +447,7 @@
422
447
 
423
448
  _formatTime: function (seconds) {
424
449
  var date = new Date(seconds * 1000),
425
- days = parseInt(seconds / 86400, 10);
450
+ days = Math.floor(seconds / 86400);
426
451
  days = days ? days + 'd ' : '';
427
452
  return days +
428
453
  ('0' + date.getUTCHours()).slice(-2) + ':' +
@@ -446,46 +471,6 @@
446
471
  this._formatFileSize(data.total);
447
472
  },
448
473
 
449
- _hasError: function (file) {
450
- if (file.error) {
451
- return file.error;
452
- }
453
- // The number of added files is subtracted from
454
- // maxNumberOfFiles before validation, so we check if
455
- // maxNumberOfFiles is below 0 (instead of below 1):
456
- if (this.options.maxNumberOfFiles < 0) {
457
- return 'Maximum number of files exceeded';
458
- }
459
- // Files are accepted if either the file type or the file name
460
- // matches against the acceptFileTypes regular expression, as
461
- // only browsers with support for the File API report the type:
462
- if (!(this.options.acceptFileTypes.test(file.type) ||
463
- this.options.acceptFileTypes.test(file.name))) {
464
- return 'Filetype not allowed';
465
- }
466
- if (this.options.maxFileSize &&
467
- file.size > this.options.maxFileSize) {
468
- return 'File is too big';
469
- }
470
- if (typeof file.size === 'number' &&
471
- file.size < this.options.minFileSize) {
472
- return 'File is too small';
473
- }
474
- return null;
475
- },
476
-
477
- _validate: function (files) {
478
- var that = this,
479
- valid = !!files.length;
480
- $.each(files, function (index, file) {
481
- file.error = that._hasError(file);
482
- if (file.error) {
483
- valid = false;
484
- }
485
- });
486
- return valid;
487
- },
488
-
489
474
  _renderTemplate: function (func, files) {
490
475
  if (!func) {
491
476
  return $();
@@ -501,57 +486,10 @@
501
486
  return $(this.options.templatesContainer).html(result).children();
502
487
  },
503
488
 
504
- _renderPreview: function (file, node) {
505
- var that = this,
506
- options = this.options,
507
- dfd = $.Deferred();
508
- return ((loadImage && loadImage(
509
- file,
510
- function (img) {
511
- node.append(img);
512
- that._forceReflow(node);
513
- that._transition(node).done(function () {
514
- dfd.resolveWith(node);
515
- });
516
- if (!$.contains(that.document[0].body, node[0])) {
517
- // If the element is not part of the DOM,
518
- // transition events are not triggered,
519
- // so we have to resolve manually:
520
- dfd.resolveWith(node);
521
- }
522
- },
523
- {
524
- maxWidth: options.previewMaxWidth,
525
- maxHeight: options.previewMaxHeight,
526
- canvas: options.previewAsCanvas
527
- }
528
- )) || dfd.resolveWith(node)) && dfd;
529
- },
530
-
531
489
  _renderPreviews: function (data) {
532
- var that = this,
533
- options = this.options;
534
- data.context.find('.preview span').each(function (index, element) {
535
- var file = data.files[index];
536
- if (options.previewSourceFileTypes.test(file.type) &&
537
- ($.type(options.previewSourceMaxFileSize) !== 'number' ||
538
- file.size < options.previewSourceMaxFileSize)) {
539
- that._processingQueue = that._processingQueue.pipe(function () {
540
- var dfd = $.Deferred(),
541
- ev = $.Event('previewdone', {
542
- target: element
543
- });
544
- that._renderPreview(file, $(element)).done(
545
- function () {
546
- that._trigger(ev.type, ev, data);
547
- dfd.resolveWith(that);
548
- }
549
- );
550
- return dfd.promise();
551
- });
552
- }
490
+ data.context.find('.preview').each(function (index, elm) {
491
+ $(elm).append(data.files[index].preview);
553
492
  });
554
- return this._processingQueue;
555
493
  },
556
494
 
557
495
  _renderUpload: function (files) {
@@ -573,20 +511,23 @@
573
511
  var button = $(e.currentTarget),
574
512
  template = button.closest('.template-upload'),
575
513
  data = template.data('data');
576
- if (data && data.submit && !data.jqXHR && data.submit()) {
577
- button.prop('disabled', true);
514
+ button.prop('disabled', true);
515
+ if (data && data.submit) {
516
+ data.submit();
578
517
  }
579
518
  },
580
519
 
581
520
  _cancelHandler: function (e) {
582
521
  e.preventDefault();
583
- var template = $(e.currentTarget).closest('.template-upload'),
522
+ var template = $(e.currentTarget)
523
+ .closest('.template-upload,.template-download'),
584
524
  data = template.data('data') || {};
585
- if (!data.jqXHR) {
525
+ data.context = data.context || template;
526
+ if (data.abort) {
527
+ data.abort();
528
+ } else {
586
529
  data.errorThrown = 'abort';
587
530
  this._trigger('fail', e, data);
588
- } else {
589
- data.jqXHR.abort();
590
531
  }
591
532
  },
592
533
 
@@ -595,8 +536,7 @@
595
536
  var button = $(e.currentTarget);
596
537
  this._trigger('destroy', e, $.extend({
597
538
  context: button.closest('.template-download'),
598
- type: 'DELETE',
599
- dataType: this.options.dataType
539
+ type: 'DELETE'
600
540
  }, button.data()));
601
541
  },
602
542
 
@@ -607,7 +547,7 @@
607
547
 
608
548
  _transition: function (node) {
609
549
  var dfd = $.Deferred();
610
- if ($.support.transition && node.hasClass('fade')) {
550
+ if ($.support.transition && node.hasClass('fade') && node.is(':visible')) {
611
551
  node.bind(
612
552
  $.support.transition.end,
613
553
  function (e) {
@@ -632,27 +572,28 @@
632
572
  this._on(fileUploadButtonBar.find('.start'), {
633
573
  click: function (e) {
634
574
  e.preventDefault();
635
- filesList.find('.start button').click();
575
+ filesList.find('.start').click();
636
576
  }
637
577
  });
638
578
  this._on(fileUploadButtonBar.find('.cancel'), {
639
579
  click: function (e) {
640
580
  e.preventDefault();
641
- filesList.find('.cancel button').click();
581
+ filesList.find('.cancel').click();
642
582
  }
643
583
  });
644
584
  this._on(fileUploadButtonBar.find('.delete'), {
645
585
  click: function (e) {
646
586
  e.preventDefault();
647
- filesList.find('.delete input:checked')
648
- .siblings('button').click();
587
+ filesList.find('.toggle:checked')
588
+ .closest('.template-download')
589
+ .find('.delete').click();
649
590
  fileUploadButtonBar.find('.toggle')
650
591
  .prop('checked', false);
651
592
  }
652
593
  });
653
594
  this._on(fileUploadButtonBar.find('.toggle'), {
654
595
  change: function (e) {
655
- filesList.find('.delete input').prop(
596
+ filesList.find('.toggle').prop(
656
597
  'checked',
657
598
  $(e.currentTarget).is(':checked')
658
599
  );
@@ -662,7 +603,8 @@
662
603
 
663
604
  _destroyButtonBarEventHandlers: function () {
664
605
  this._off(
665
- this.element.find('.fileupload-buttonbar button'),
606
+ this.element.find('.fileupload-buttonbar')
607
+ .find('.start, .cancel, .delete'),
666
608
  'click'
667
609
  );
668
610
  this._off(
@@ -674,9 +616,9 @@
674
616
  _initEventHandlers: function () {
675
617
  this._super();
676
618
  this._on(this.options.filesContainer, {
677
- 'click .start button': this._startHandler,
678
- 'click .cancel button': this._cancelHandler,
679
- 'click .delete button': this._deleteHandler
619
+ 'click .start': this._startHandler,
620
+ 'click .cancel': this._cancelHandler,
621
+ 'click .delete': this._deleteHandler
680
622
  });
681
623
  this._initButtonBarEventHandlers();
682
624
  },
@@ -723,55 +665,18 @@
723
665
  }
724
666
  },
725
667
 
726
- _stringToRegExp: function (str) {
727
- var parts = str.split('/'),
728
- modifiers = parts.pop();
729
- parts.shift();
730
- return new RegExp(parts.join('/'), modifiers);
731
- },
732
-
733
- _initRegExpOptions: function () {
734
- var options = this.options;
735
- if ($.type(options.acceptFileTypes) === 'string') {
736
- options.acceptFileTypes = this._stringToRegExp(
737
- options.acceptFileTypes
738
- );
739
- }
740
- if ($.type(options.previewSourceFileTypes) === 'string') {
741
- options.previewSourceFileTypes = this._stringToRegExp(
742
- options.previewSourceFileTypes
743
- );
744
- }
745
- },
746
-
747
668
  _initSpecialOptions: function () {
748
669
  this._super();
749
670
  this._initFilesContainer();
750
671
  this._initTemplates();
751
- this._initRegExpOptions();
752
- },
753
-
754
- _setOption: function (key, value) {
755
- this._super(key, value);
756
- if (key === 'maxNumberOfFiles') {
757
- this._adjustMaxNumberOfFiles(0);
758
- }
759
672
  },
760
673
 
761
674
  _create: function () {
762
675
  this._super();
763
- this._refreshOptionsList.push(
764
- 'filesContainer',
765
- 'uploadTemplateId',
766
- 'downloadTemplateId'
767
- );
768
- if (!this._processingQueue) {
769
- this._processingQueue = $.Deferred().resolveWith(this).promise();
770
- this.process = function () {
771
- return this._processingQueue;
772
- };
773
- }
774
676
  this._resetFinishedDeferreds();
677
+ if (!$.support.fileInput) {
678
+ this._disableFileInputButton();
679
+ }
775
680
  },
776
681
 
777
682
  enable: function () {