resumablejs-rails 1.0 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 193ac0f83f8157b10c100d48601be68b89c89769
4
- data.tar.gz: b20ed9c5eb8af57b297b6aa904106e9f058a2cb3
3
+ metadata.gz: bff07b24aa9de454899e5e82e8badee9e9d0c955
4
+ data.tar.gz: 71402b518edf6ee1a23843a6998a43f4abf46196
5
5
  SHA512:
6
- metadata.gz: 25c53ae556106fecf94eccb1b5df1cf0c556df1c8e5c535b06446c51a69471be2b9623fc28b149ffcb49e4531669325c6e0b3dd4a9249f12058f9a61b581e811
7
- data.tar.gz: c0b25f735c94f26c49396d560223a711b2324ee87750fd9fac2bc259c9e488da65fb31456f63744b19d2b38fd76333aad0fca334b0ee21913a7e5913f0fc6811
6
+ metadata.gz: a5c525555bedc63a1d782b49161221028a54b8a7db326511e654403f132a47bb7cfc36e109e9d47e92703764da82df50787bc7f3aebfeb3254b9adacc7f2231f
7
+ data.tar.gz: 5ba6fcc5c4ba9514a046d487a61c457bfba0750afc5cdcedb81e1f82ddfa28d1b4732dc9212f27cba094ef3235ef5833e6b8ab775473d4545002e39b2f902ba0
@@ -1,5 +1,5 @@
1
1
  module Resumablejs
2
2
  module Rails
3
- VERSION = "1.0"
3
+ VERSION = "1.1"
4
4
  end
5
5
  end
@@ -50,7 +50,7 @@
50
50
  generateUniqueIdentifier:null,
51
51
  maxChunkRetries:undefined,
52
52
  chunkRetryInterval:undefined,
53
- permanentErrors:[404, 415, 500, 501],
53
+ permanentErrors:[400, 404, 415, 500, 501],
54
54
  maxFiles:undefined,
55
55
  withCredentials:false,
56
56
  xhrTimeout:0,
@@ -185,13 +185,146 @@
185
185
 
186
186
  var onDrop = function(event){
187
187
  $h.stopEvent(event);
188
- appendFilesFromFileList(event.dataTransfer.files, event);
188
+
189
+ //handle dropped things as items if we can (this lets us deal with folders nicer in some cases)
190
+ if (event.dataTransfer && event.dataTransfer.items) {
191
+ loadFiles(event.dataTransfer.items, event);
192
+ }
193
+ //else handle them as files
194
+ else if (event.dataTransfer && event.dataTransfer.files) {
195
+ loadFiles(event.dataTransfer.files, event);
196
+ }
189
197
  };
190
198
  var onDragOver = function(e) {
191
199
  e.preventDefault();
192
200
  };
193
201
 
194
202
  // INTERNAL METHODS (both handy and responsible for the heavy load)
203
+ /**
204
+ * @summary This function loops over the files passed in from a drag and drop operation and gets them ready for appendFilesFromFileList
205
+ * It attempts to use FileSystem API calls to extract files and subfolders if the dropped items include folders
206
+ * That capability is only currently available in Chrome, but if it isn't available it will just pass the items along to
207
+ * appendFilesFromFileList (via enqueueFileAddition to help with asynchronous processing.)
208
+ * @param files {Array} - the File or Entry objects to be processed depending on your browser support
209
+ * @param event {Object} - the drop event object
210
+ * @param [queue] {Object} - an object to keep track of our progress processing the dropped items
211
+ * @param [path] {String} - the relative path from the originally selected folder to the current files if extracting files from subfolders
212
+ */
213
+ var loadFiles = function (files, event, queue, path){
214
+ //initialize the queue object if it doesn't exist
215
+ if (!queue) {
216
+ queue = {
217
+ total: 0,
218
+ files: [],
219
+ event: event
220
+ };
221
+ }
222
+
223
+ //update the total number of things we plan to process
224
+ updateQueueTotal(files.length, queue);
225
+
226
+ //loop over all the passed in objects checking if they are files or folders
227
+ for (var i = 0; i < files.length; i++) {
228
+ var file = files[i];
229
+ var entry, reader;
230
+
231
+ if (file.isFile || file.isDirectory) {
232
+ //this is an object we can handle below with no extra work needed up front
233
+ entry = file;
234
+ }
235
+ else if (file.getAsEntry) {
236
+ //get the file as an entry object if we can using the proposed HTML5 api (unlikely to get implemented by anyone)
237
+ entry = file.getAsEntry();
238
+ }
239
+ else if (file.webkitGetAsEntry) {
240
+ //get the file as an entry object if we can using the Chrome specific webkit implementation
241
+ entry = file.webkitGetAsEntry();
242
+ }
243
+ else if (typeof file.getAsFile === 'function') {
244
+ //if this is still a DataTransferItem object, get it as a file object
245
+ enqueueFileAddition(file.getAsFile(), queue, path);
246
+ //we just added this file object to the queue so we can go to the next object in the loop and skip the processing below
247
+ continue;
248
+ }
249
+ else if (File && file instanceof File) {
250
+ //this is already a file object so just queue it up and move on
251
+ enqueueFileAddition(file, queue, path);
252
+ //we just added this file object to the queue so we can go to the next object in the loop and skip the processing below
253
+ continue;
254
+ }
255
+ else {
256
+ //we can't do anything with this object, decrement the expected total and skip the processing below
257
+ updateQueueTotal(-1, queue);
258
+ continue;
259
+ }
260
+
261
+ if (!entry) {
262
+ //there isn't anything we can do with this so decrement the total expected
263
+ updateQueueTotal(-1, queue);
264
+ }
265
+ else if (entry.isFile) {
266
+ //this is handling to read an entry object representing a file, parsing the file object is asynchronous which is why we need the queue
267
+ //currently entry objects will only exist in this flow for Chrome
268
+ entry.file(function(file) {
269
+ enqueueFileAddition(file, queue, path);
270
+ }, function(err) {
271
+ console.warn(err);
272
+ });
273
+ }
274
+ else if (entry.isDirectory) {
275
+ //this is handling to read an entry object representing a folder, parsing the directory object is asynchronous which is why we need the queue
276
+ //currently entry objects will only exist in this flow for Chrome
277
+ reader = entry.createReader();
278
+
279
+ //wrap the callback in another function so we can store the path in a closure
280
+ var readDir = function(path){
281
+ return function(entries){
282
+ //process each thing in this directory recursively
283
+ loadFiles(entries, event, queue, path);
284
+ //this was a directory rather than a file so decrement the expected file count
285
+ updateQueueTotal(-1, queue);
286
+ }
287
+ };
288
+
289
+ reader.readEntries(readDir(entry.fullPath), function(err) {
290
+ console.warn(err);
291
+ });
292
+ }
293
+ }
294
+ };
295
+
296
+ /**
297
+ * @summary Adjust the total number of files we are expecting to process
298
+ * if decrementing and the new expected total is equal to the number processed, flush the queue
299
+ * @param addition {Number} - the number of additional files we expect to process (may be negative)
300
+ * @param queue {Object} - an object to keep track of our progress processing the dropped items
301
+ */
302
+ var updateQueueTotal = function(addition, queue){
303
+ queue.total += addition;
304
+
305
+ // If all the files we expect have shown up, then flush the queue.
306
+ if (queue.files.length === queue.total) {
307
+ appendFilesFromFileList(queue.files, queue.event);
308
+ }
309
+ };
310
+
311
+ /**
312
+ * @summary Add a file to the queue of processed files, if it brings the total up to the expected total, flush the queue
313
+ * @param file {Object} - File object to be passed along to appendFilesFromFileList eventually
314
+ * @param queue {Object} - an object to keep track of our progress processing the dropped items
315
+ * @param [path] {String} - the file's relative path from the originally dropped folder if we are parsing folder content (Chrome only for now)
316
+ */
317
+ var enqueueFileAddition = function(file, queue, path) {
318
+ //store the path to this file if it came in as part of a folder
319
+ if (path) file.relativePath = path + '/' + file.name;
320
+ queue.files.push(file);
321
+
322
+ // If all the files we expect have shown up, then flush the queue.
323
+ if (queue.files.length === queue.total) {
324
+ appendFilesFromFileList(queue.files, queue.event);
325
+ }
326
+ };
327
+
195
328
  var appendFilesFromFileList = function(fileList, event){
196
329
  // check for uploading too many files
197
330
  var errorCount = 0;
@@ -207,13 +340,21 @@
207
340
  }
208
341
  var files = [];
209
342
  $h.each(fileList, function(file){
210
- var fileName = file.name.split('.');
211
- var fileType = fileName[fileName.length-1].toLowerCase();
212
-
213
- if (o.fileType.length > 0 && !$h.contains(o.fileType, fileType)) {
214
- o.fileTypeErrorCallback(file, errorCount++);
215
- return false;
343
+ var fileName = file.name;
344
+ if(o.fileType.length > 0){
345
+ var fileTypeFound = false;
346
+ for(var index in o.fileType){
347
+ var extension = '.' + o.fileType[index];
348
+ if(fileName.indexOf(extension, fileName.length - extension.length) !== -1){
349
+ fileTypeFound = true;
350
+ break;
216
351
  }
352
+ }
353
+ if (!fileTypeFound) {
354
+ o.fileTypeErrorCallback(file, errorCount++);
355
+ return false;
356
+ }
357
+ }
217
358
 
218
359
  if (typeof(o.minFileSize)!=='undefined' && file.size<o.minFileSize) {
219
360
  o.minFileSizeErrorCallback(file, errorCount++);
@@ -250,7 +391,7 @@
250
391
  $.file = file;
251
392
  $.fileName = file.fileName||file.name; // Some confusion in different versions of Firefox
252
393
  $.size = file.size;
253
- $.relativePath = file.webkitRelativePath || $.fileName;
394
+ $.relativePath = file.webkitRelativePath || file.relativePath || $.fileName;
254
395
  $.uniqueIdentifier = $h.generateUniqueIdentifier(file);
255
396
  $._pause = false;
256
397
  $.container = '';
@@ -345,7 +486,7 @@
345
486
  if(c.status()=='error') error = true;
346
487
  ret += c.progress(true); // get chunk progress relative to entire file
347
488
  });
348
- ret = (error ? 1 : (ret>0.999 ? 1 : ret));
489
+ ret = (error ? 1 : (ret>0.99999 ? 1 : ret));
349
490
  ret = Math.max($._prevProgress, ret); // We don't want to lose percentages when an upload is paused
350
491
  $._prevProgress = ret;
351
492
  return(ret);
@@ -433,6 +574,7 @@
433
574
  };
434
575
  $.xhr.addEventListener('load', testHandler, false);
435
576
  $.xhr.addEventListener('error', testHandler, false);
577
+ $.xhr.addEventListener('timeout', testHandler, false);
436
578
 
437
579
  // Add data from the query options
438
580
  var params = [];
@@ -518,6 +660,7 @@
518
660
  };
519
661
  $.xhr.addEventListener('load', doneHandler, false);
520
662
  $.xhr.addEventListener('error', doneHandler, false);
663
+ $.xhr.addEventListener('timeout', doneHandler, false);
521
664
 
522
665
  // Set up the basic query data from Resumable
523
666
  var query = {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resumablejs-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
4
+ version: '1.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - beanie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-22 00:00:00.000000000 Z
11
+ date: 2015-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -61,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  version: '0'
62
62
  requirements: []
63
63
  rubyforge_project:
64
- rubygems_version: 2.2.2
64
+ rubygems_version: 2.4.5
65
65
  signing_key:
66
66
  specification_version: 4
67
67
  summary: resumable.js for the Rails Asset Pipeline