From 7af4cf48c9c542326626d742282aa1958b4b3501 Mon Sep 17 00:00:00 2001
From: Thomas Mueller <thomas.mueller@tmit.eu>
Date: Fri, 16 Nov 2012 10:23:40 +0100
Subject: [PATCH] refs #461 - drag'n'drop upload to a sub folder is working now

---
 apps/files/ajax/upload.php |  6 ++++++
 apps/files/js/filelist.js  |  2 +-
 apps/files/js/files.js     | 17 ++++++++++++++---
 lib/filecache.php          |  2 ++
 4 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php
index 4ed0bbc5b0..9287105993 100644
--- a/apps/files/ajax/upload.php
+++ b/apps/files/ajax/upload.php
@@ -51,6 +51,12 @@ if(strpos($dir, '..') === false) {
 		if(is_uploaded_file($files['tmp_name'][$i]) and OC_Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) {
 			$meta = OC_FileCache::get($target);
 			$id = OC_FileCache::getId($target);
+			// in case the upload goes to a sub directory getID() returns -1 and $target needs to be normalized
+			// calling normalizePath() inside getId() causes endless scan.
+			if ($id == -1) {
+				$path = OC_Filesystem::normalizePath($target);
+				$id = OC_FileCache::getId($path);
+			}
 			$result[]=array( "status" => "success", 'mime'=>$meta['mimetype'], 'size'=>$meta['size'], 'id'=>$id, 'name'=>basename($target));
 		}
 	}
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index f754a7cd16..a5550dc992 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -141,7 +141,7 @@ var FileList={
 		tr=$('tr').filterAttr('data-file',name);
 		tr.data('renaming',true);
 		td=tr.children('td.filename');
-		input=$('<input class="filename"></input>').val(name);
+		input=$('<input class="filename"/>').val(name);
 		form=$('<form></form>');
 		form.append(input);
 		td.children('a.name').hide();
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 982351c589..8b3ab06e6f 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -228,7 +228,12 @@ $(document).ready(function() {
 						}
 					});
 				}else{
-					var date=new Date();
+                    var dropTarget = $(e.originalEvent.target).closest('tr');
+                    if(dropTarget && dropTarget.attr('data-type') === 'dir') { // drag&drop upload to folder
+                        var dirName = dropTarget.attr('data-file')
+                    }
+
+                    var date=new Date();
 					if(files){
 						for(var i=0;i<files.length;i++){
 							if(files[i].size>0){
@@ -281,7 +286,7 @@ $(document).ready(function() {
 								var jqXHR =  $('.file_upload_start').fileupload('send', {files: files[i],
 										formData: function(form) {
 											var formArray = form.serializeArray();
-											formArray[1]['value'] = dirName;
+											formArray[2]['value'] = dirName;
 											return formArray;
 										}}).success(function(result, textStatus, jqXHR) {
 											var response;
@@ -291,7 +296,13 @@ $(document).ready(function() {
 												$('#notification').fadeIn();
 											}
 											var file=response[0];
+                                            // TODO: this doesn't work if the file name has been changed server side
 											delete uploadingFiles[dirName][file.name];
+                                            if ($.assocArraySize(uploadingFiles[dirName]) == 0) {
+                                                delete uploadingFiles[dirName];
+                                            }
+
+                                            var uploadtext = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName).find('.uploadtext')
 											var currentUploads = parseInt(uploadtext.attr('currentUploads'));
 											currentUploads -= 1;
 											uploadtext.attr('currentUploads', currentUploads);
@@ -821,7 +832,7 @@ function getSelectedFiles(property){
 			name:$(element).attr('data-file'),
 			mime:$(element).data('mime'),
 			type:$(element).data('type'),
-			size:$(element).data('size'),
+			size:$(element).data('size')
 		};
 		if(property){
 			files.push(file[property]);
diff --git a/lib/filecache.php b/lib/filecache.php
index 4a7dbd0250..2a389dfc3c 100644
--- a/lib/filecache.php
+++ b/lib/filecache.php
@@ -43,6 +43,8 @@ class OC_FileCache{
 	 * - versioned
 	 */
 	public static function get($path, $root=false) {
+		// $path needs to be normalized - this failed within drag'n'drop upload to a subfolder
+		$path = OC_Filesystem::normalizePath($path);
 		if(OC_FileCache_Update::hasUpdated($path, $root)) {
 			if($root===false) {//filesystem hooks are only valid for the default root
 				OC_Hook::emit('OC_Filesystem', 'post_write', array('path'=>$path));
-- 
GitLab