Skip to content

Commit a08b2a5

Browse files
committed
support directory drop danialfarid#175
1 parent 6b70ad7 commit a08b2a5

10 files changed

+90
-31
lines changed

demo/war/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ <h3>
5151
<br/>
5252
<div ng-show="selectedFiles != null">
5353
<div class="sel-file" ng-repeat="f in selectedFiles">
54+
{{($index + 1) + '.'}}
5455
<img ng-show="dataUrls[$index]" ng-src="{{dataUrls[$index]}}">
5556
<button class="button" ng-click="start($index)" ng-show="progress[$index] < 0">Start</button>
5657
<span class="progress" ng-show="progress[$index] >= 0">

demo/war/js/angular-file-upload.js

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', funct
167167
} ]);
168168

169169
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', function($parse, $timeout) {
170-
return function(scope, elem, attr) {
170+
return function(scope, elem, attr) {
171171
if ('draggable' in document.createElement('span')) {
172172
var cancel = null;
173173
var fn = $parse(attr['ngFileDrop']);
@@ -182,22 +182,51 @@ angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', function($pars
182182
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
183183
});
184184
}, false);
185+
186+
var processing = 0;
187+
function traverseFileTree(files, item) {
188+
if (item.isDirectory) {
189+
var dirReader = item.createReader();
190+
processing++;
191+
dirReader.readEntries(function(entries) {
192+
for (var i = 0; i < entries.length; i++) {
193+
traverseFileTree(files, entries[i]);
194+
}
195+
processing--;
196+
});
197+
} else {
198+
processing++;
199+
item.file(function(file) {
200+
processing--;
201+
files.push(file);
202+
});
203+
}
204+
}
205+
185206
elem[0].addEventListener("drop", function(evt) {
186207
evt.stopPropagation();
187208
evt.preventDefault();
188209
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
189-
var files = [], fileList = evt.dataTransfer.files, i;
190-
if (fileList != null) {
191-
for (i = 0; i < fileList.length; i++) {
192-
files.push(fileList.item(i));
210+
var files = [], items = evt.dataTransfer.items;
211+
for (var i = 0; i < items.length; i++) {
212+
if (items[i].webkitGetAsEntry) {
213+
traverseFileTree(files, items[i].webkitGetAsEntry());
214+
} else {
215+
files.push(items[i]);
193216
}
194217
}
195-
$timeout(function() {
196-
fn(scope, {
197-
$files : files,
198-
$event : evt
199-
});
200-
});
218+
(function callback(delay) {
219+
$timeout(function() {
220+
if (!processing) {
221+
fn(scope, {
222+
$files : files,
223+
$event : evt
224+
});
225+
} else {
226+
callback(10);
227+
}
228+
}, delay || 0)
229+
})();
201230
}, false);
202231
}
203232
};

dist/angular-file-upload-html5-shim.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**!
22
* AngularJS file upload shim for angular XHR HTML5 browsers
33
* @author Danial <danial.farid@gmail.com>
4-
* @version 1.2.11
4+
* @version 1.3.0
55
*/
66
if (window.XMLHttpRequest) {
77
if (window.FormData) {

dist/angular-file-upload-html5-shim.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/angular-file-upload-shim.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**!
22
* AngularJS file upload shim for HTML5 FormData
33
* @author Danial <danial.farid@gmail.com>
4-
* @version 1.2.11
4+
* @version 1.3.0
55
*/
66
(function() {
77

dist/angular-file-upload-shim.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/angular-file-upload.js

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**!
22
* AngularJS file upload/drop directive with http post and progress
33
* @author Danial <danial.farid@gmail.com>
4-
* @version 1.2.11
4+
* @version 1.3.0
55
*/
66
(function() {
77

@@ -167,7 +167,7 @@ angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', funct
167167
} ]);
168168

169169
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', function($parse, $timeout) {
170-
return function(scope, elem, attr) {
170+
return function(scope, elem, attr) {
171171
if ('draggable' in document.createElement('span')) {
172172
var cancel = null;
173173
var fn = $parse(attr['ngFileDrop']);
@@ -182,22 +182,51 @@ angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', function($pars
182182
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
183183
});
184184
}, false);
185+
186+
var processing = 0;
187+
function traverseFileTree(files, item) {
188+
if (item.isDirectory) {
189+
var dirReader = item.createReader();
190+
processing++;
191+
dirReader.readEntries(function(entries) {
192+
for (var i = 0; i < entries.length; i++) {
193+
traverseFileTree(files, entries[i]);
194+
}
195+
processing--;
196+
});
197+
} else {
198+
processing++;
199+
item.file(function(file) {
200+
processing--;
201+
files.push(file);
202+
});
203+
}
204+
}
205+
185206
elem[0].addEventListener("drop", function(evt) {
186207
evt.stopPropagation();
187208
evt.preventDefault();
188209
elem.removeClass(attr['ngFileDragOverClass'] || "dragover");
189-
var files = [], fileList = evt.dataTransfer.files, i;
190-
if (fileList != null) {
191-
for (i = 0; i < fileList.length; i++) {
192-
files.push(fileList.item(i));
210+
var files = [], items = evt.dataTransfer.items;
211+
for (var i = 0; i < items.length; i++) {
212+
if (items[i].webkitGetAsEntry) {
213+
traverseFileTree(files, items[i].webkitGetAsEntry());
214+
} else {
215+
files.push(items[i]);
193216
}
194217
}
195-
$timeout(function() {
196-
fn(scope, {
197-
$files : files,
198-
$event : evt
199-
});
200-
});
218+
(function callback(delay) {
219+
$timeout(function() {
220+
if (!processing) {
221+
fn(scope, {
222+
$files : files,
223+
$event : evt
224+
});
225+
} else {
226+
callback(10);
227+
}
228+
}, delay || 0)
229+
})();
201230
}, false);
202231
}
203232
};

dist/angular-file-upload.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nuget/Package.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<metadata>
44
<id>angular-file-upload</id>
55
<title>Angular file upload</title>
6-
<version>1.2.11</version>
6+
<version>1.3.0</version>
77
<authors>Danial Farid, Georgios Diamantopoulos (nuget package)</authors>
88
<owners>Danial Farid</owners>
99
<licenseUrl>https://github.com/danialfarid/angular-file-upload/blob/master/LICENSE</licenseUrl>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "angular-file-upload",
3-
"version": "1.2.11",
3+
"version": "1.3.0",
44
"devDependencies": {
55
"grunt": "~0.4.1",
66
"grunt-contrib-uglify": "~0.2.7",

0 commit comments

Comments
 (0)