From 3e7a86c6ecd332c268e690399a015ab618e87754 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 6 Aug 2013 15:59:06 +0200 Subject: [PATCH 01/99] remove deleted files while scanning --- lib/files/cache/scanner.php | 2 ++ tests/lib/files/cache/scanner.php | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php index adecc2bb90..3349245616 100644 --- a/lib/files/cache/scanner.php +++ b/lib/files/cache/scanner.php @@ -112,6 +112,8 @@ class Scanner extends BasicEmitter { if (!empty($newData)) { $this->cache->put($file, $newData); } + } else { + $this->cache->remove($file); } return $data; } diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php index 263ceadccc..bb90adce5c 100644 --- a/tests/lib/files/cache/scanner.php +++ b/tests/lib/files/cache/scanner.php @@ -166,6 +166,16 @@ class Scanner extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->cache->inCache('folder/bar.txt')); } + public function testScanRemovedFile(){ + $this->fillTestFolders(); + + $this->scanner->scan(''); + $this->assertTrue($this->cache->inCache('folder/bar.txt')); + $this->storage->unlink('folder/bar.txt'); + $this->scanner->scanFile('folder/bar.txt'); + $this->assertFalse($this->cache->inCache('folder/bar.txt')); + } + function setUp() { $this->storage = new \OC\Files\Storage\Temporary(array()); $this->scanner = new \OC\Files\Cache\Scanner($this->storage); From e1927d5bee11b561a293a9488bd27d90c2c043e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Mon, 12 Aug 2013 12:33:22 +0200 Subject: [PATCH 02/99] fix whitespace, check selected files before starting upload --- apps/files/ajax/upload.php | 39 +- apps/files/css/files.css | 41 ++ apps/files/js/file-upload.js | 736 ++++++++++++++++++++--------------- apps/files/js/filelist.js | 2 +- core/js/jquery.ocdialog.js | 3 + core/js/oc-dialogs.js | 134 ++++++- 6 files changed, 627 insertions(+), 328 deletions(-) diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index dde5d3c50a..8d183bd1f9 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -98,23 +98,46 @@ $result = array(); if (strpos($dir, '..') === false) { $fileCount = count($files['name']); for ($i = 0; $i < $fileCount; $i++) { - $target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]); // $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder - $target = \OC\Files\Filesystem::normalizePath($target); - if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) { + if (isset($_POST['new_name'])) { + $newName = $_POST['new_name']; + } else { + $newName = $files['name'][$i]; + } + if (isset($_POST['replace']) && $_POST['replace'] == true) { + $replace = true; + } else { + $replace = false; + } + $target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).$newName); + if ( ! $replace && \OC\Files\Filesystem::file_exists($target)) { $meta = \OC\Files\Filesystem::getFileInfo($target); - // updated max file size after upload - $storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); - - $result[] = array('status' => 'success', + $result[] = array('status' => 'existserror', 'mime' => $meta['mimetype'], 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), - 'originalname' => $files['name'][$i], + 'originalname' => $newName, 'uploadMaxFilesize' => $maxUploadFileSize, 'maxHumanFilesize' => $maxHumanFileSize ); + } else { + //$target = OCP\Files::buildNotExistingFileName(stripslashes($dir), $files['name'][$i]); + if (is_uploaded_file($files['tmp_name'][$i]) and \OC\Files\Filesystem::fromTmpFile($files['tmp_name'][$i], $target)) { + $meta = \OC\Files\Filesystem::getFileInfo($target); + // updated max file size after upload + $storageStats = \OCA\files\lib\Helper::buildFileStorageStatistics($dir); + + $result[] = array('status' => 'success', + 'mime' => $meta['mimetype'], + 'size' => $meta['size'], + 'id' => $meta['fileid'], + 'name' => basename($target), + 'originalname' => $newName, + 'uploadMaxFilesize' => $maxUploadFileSize, + 'maxHumanFilesize' => $maxHumanFileSize + ); + } } } OCP\JSON::encodedPrint($result); diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 86fb0dc604..acee8471af 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -189,3 +189,44 @@ table.dragshadow td.size { text-align: center; margin-left: -200px; } + +.oc-dialog .fileexists .original .icon { + width: 64px; + height: 64px; + margin: 5px 5px 5px 0px; + background-repeat: no-repeat; + background-size: 64px 64px; + float: left; +} + +.oc-dialog .fileexists .replacement { + margin-top: 20px; +} + +.oc-dialog .fileexists .replacement .icon { + width: 64px; + height: 64px; + margin: 5px 5px 5px 0px; + background-repeat: no-repeat; + background-size: 64px 64px; + float: left; + clear: both; +} + +.oc-dialog .fileexists label[for="new-name"] { + margin-top: 20px; + display: block; +} +.oc-dialog .fileexists h3 { + font-weight: bold; +} + + +.oc-dialog .oc-dialog-buttonrow { + width:100%; + text-align:right; +} + +.oc-dialog .oc-dialog-buttonrow .cancel { + float:left; +} \ No newline at end of file diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 942a07dfcc..71034a0b3f 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1,343 +1,445 @@ +OC.upload = { + _isProcessing:false, + isProcessing:function(){ + return this._isProcessing; + }, + _uploadQueue:[], + addUpload:function(data){ + this._uploadQueue.push(data); + + if ( ! OC.upload.isProcessing() ) { + OC.upload.startUpload(); + } + }, + startUpload:function(){ + if (this._uploadQueue.length > 0) { + this._isProcessing = true; + this.nextUpload(); + return true; + } else { + return false; + } + }, + nextUpload:function(){ + if (this._uploadQueue.length > 0) { + var data = this._uploadQueue.pop(); + var jqXHR = data.submit(); + + // remember jqXHR to show warning to user when he navigates away but an upload is still in progress + if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { + var dirName = data.context.data('file'); + if(typeof uploadingFiles[dirName] === 'undefined') { + uploadingFiles[dirName] = {}; + } + uploadingFiles[dirName][data.files[0].name] = jqXHR; + } else { + uploadingFiles[data.files[0].name] = jqXHR; + } + } else { + //queue is empty, we are done + this._isProcessing = false; + } + }, + onCancel:function(data){ + //TODO cancel all uploads + Files.cancelUploads(); + this._uploadQueue = []; + this._isProcessing = false; + }, + onSkip:function(data){ + this.nextUpload(); + }, + onReplace:function(data){ + //TODO overwrite file + data.data.append('replace', true); + data.submit(); + }, + onRename:function(data, newName){ + //TODO rename file in filelist, stop spinner + data.data.append('new_name', newName); + data.submit(); + } +}; + $(document).ready(function() { - file_upload_param = { - dropZone: $('#content'), // restrict dropZone to content div - //singleFileUploads is on by default, so the data.files array will always have length 1 - add: function(e, data) { + var file_upload_param = { + dropZone: $('#content'), // restrict dropZone to content div + //singleFileUploads is on by default, so the data.files array will always have length 1 + add: function(e, data) { + var that = $(this); - if(data.files[0].type === '' && data.files[0].size == 4096) - { - data.textStatus = 'dirorzero'; - data.errorThrown = t('files','Unable to upload your file as it is a directory or has 0 bytes'); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - return true; //don't upload this file but go on with next in queue - } + if (typeof data.originalFiles.checked === 'undefined') { + + var totalSize = 0; + $.each(data.originalFiles, function(i, file) { + totalSize += file.size; - var totalSize=0; - $.each(data.originalFiles, function(i,file){ - totalSize+=file.size; - }); + if (file.type === '' && file.size === 4096) { + data.textStatus = 'dirorzero'; + data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes', + {filename: file.name} + ); + return false; + } + }); - if(totalSize>$('#max_upload').val()){ - data.textStatus = 'notenoughspace'; - data.errorThrown = t('files','Not enough space available'); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - return false; //don't upload anything - } + if (totalSize > $('#max_upload').val()) { + data.textStatus = 'notenoughspace'; + data.errorThrown = t('files', 'Not enough space available'); + } - // start the actual file upload - var jqXHR = data.submit(); + if (data.errorThrown) { + //don't upload anything + var fu = that.data('blueimp-fileupload') || that.data('fileupload'); + fu._trigger('fail', e, data); + return false; + } + + data.originalFiles.checked = true; // this will skip the checks on subsequent adds + } + + //TODO check filename already exists + /* + if ($('tr[data-file="'+data.files[0].name+'"][data-id]').length > 0) { + data.textStatus = 'alreadyexists'; + data.errorThrown = t('files', '{filename} already exists', + {filename: data.files[0].name} + ); + //TODO show "file already exists" dialog + var fu = that.data('blueimp-fileupload') || that.data('fileupload'); + fu._trigger('fail', e, data); + return false; + } + */ - // remember jqXHR to show warning to user when he navigates away but an upload is still in progress - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - if(typeof uploadingFiles[dirName] === 'undefined') { - uploadingFiles[dirName] = {}; + //add files to queue + OC.upload.addUpload(data); + + //TODO refactor away: + //show cancel button + if($('html.lte9').length === 0 && data.dataType !== 'iframe') { + $('#uploadprogresswrapper input.stop').show(); + } + return true; + }, + /** + * called after the first add, does NOT have the data param + * @param e + */ + start: function(e) { + //IE < 10 does not fire the necessary events for the progress bar. + if($('html.lte9').length > 0) { + return true; + } + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); + }, + fail: function(e, data) { + if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { + if (data.textStatus === 'abort') { + $('#notification').text(t('files', 'Upload cancelled.')); + } else { + // HTTP connection problem + $('#notification').text(data.errorThrown); + } + $('#notification').fadeIn(); + //hide notification after 5 sec + setTimeout(function() { + $('#notification').fadeOut(); + }, 5000); + } + delete uploadingFiles[data.files[0].name]; + }, + progress: function(e, data) { + // TODO: show nice progress bar in file row + }, + progressall: function(e, data) { + //IE < 10 does not fire the necessary events for the progress bar. + if($('html.lte9').length > 0) { + return; + } + var progress = (data.loaded/data.total)*100; + $('#uploadprogressbar').progressbar('value', progress); + }, + /** + * called for every successful upload + * @param e + * @param data + */ + done:function(e, data) { + // handle different responses (json or body from iframe for ie) + var response; + if (typeof data.result === 'string') { + response = data.result; + } else { + //fetch response from iframe + response = data.result[0].body.innerText; + } + var result=$.parseJSON(response); + + if(typeof result[0] !== 'undefined' && result[0].status === 'success') { + OC.upload.nextUpload(); + } else { + if (result[0].status === 'existserror') { + //TODO open dialog and retry with other name? + // get jqXHR reference + if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { + var dirName = data.context.data('file'); + var jqXHR = uploadingFiles[dirName][filename]; + } else { + var jqXHR = uploadingFiles[filename]; + } + //filenames can only be changed on the server side + //TODO show "file already exists" dialog + //options: abort | skip | replace / rename + //TODO reset all-files flag? when done with selection? + var original = result[0]; + var replacement = data.files[0]; + OC.dialogs.fileexists(data, original, replacement, OC.upload); + } else { + data.textStatus = 'servererror'; + data.errorThrown = t('files', result.data.message); + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + fu._trigger('fail', e, data); + } + } + + var filename = result[0].originalname; + + // delete jqXHR reference + if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { + var dirName = data.context.data('file'); + delete uploadingFiles[dirName][filename]; + if ($.assocArraySize(uploadingFiles[dirName]) === 0) { + delete uploadingFiles[dirName]; + } + } else { + delete uploadingFiles[filename]; + } + + }, + /** + * called after last upload + * @param e + * @param data + */ + stop: function(e, data) { + if(data.dataType !== 'iframe') { + $('#uploadprogresswrapper input.stop').hide(); + } + + //IE < 10 does not fire the necessary events for the progress bar. + if($('html.lte9').length > 0) { + return; + } + + $('#uploadprogressbar').progressbar('value', 100); + $('#uploadprogressbar').fadeOut(); } - uploadingFiles[dirName][data.files[0].name] = jqXHR; - } else { - uploadingFiles[data.files[0].name] = jqXHR; - } + }; + + var file_upload_handler = function() { + $('#file_upload_start').fileupload(file_upload_param); + }; - //show cancel button - if($('html.lte9').length === 0 && data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').show(); - } - }, - /** - * called after the first add, does NOT have the data param - * @param e - */ - start: function(e) { - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); - }, - fail: function(e, data) { - if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { - if (data.textStatus === 'abort') { - $('#notification').text(t('files', 'Upload cancelled.')); - } else { - // HTTP connection problem - $('#notification').text(data.errorThrown); + if ( document.getElementById('data-upload-form') ) { + $(file_upload_handler); + } + $.assocArraySize = function(obj) { + // http://stackoverflow.com/a/6700/11236 + var size = 0, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + size++; + } } - $('#notification').fadeIn(); - //hide notification after 5 sec - setTimeout(function() { - $('#notification').fadeOut(); - }, 5000); - } - delete uploadingFiles[data.files[0].name]; - }, - progress: function(e, data) { - // TODO: show nice progress bar in file row - }, - progressall: function(e, data) { - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - var progress = (data.loaded/data.total)*100; - $('#uploadprogressbar').progressbar('value',progress); - }, - /** - * called for every successful upload - * @param e - * @param data - */ - done:function(e, data) { - // handle different responses (json or body from iframe for ie) - var response; - if (typeof data.result === 'string') { - response = data.result; - } else { - //fetch response from iframe - response = data.result[0].body.innerText; - } - var result=$.parseJSON(response); + return size; + }; - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { - var file = result[0]; - } else { - data.textStatus = 'servererror'; - data.errorThrown = t('files', result.data.message); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - } - - var filename = result[0].originalname; - - // delete jqXHR reference - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - delete uploadingFiles[dirName][filename]; - if ($.assocArraySize(uploadingFiles[dirName]) == 0) { - delete uploadingFiles[dirName]; + // warn user not to leave the page while upload is in progress + $(window).bind('beforeunload', function(e) { + if ($.assocArraySize(uploadingFiles) > 0) { + return t('files', 'File upload is in progress. Leaving the page now will cancel the upload.'); } - } else { - delete uploadingFiles[filename]; - } - - }, - /** - * called after last upload - * @param e - * @param data - */ - stop: function(e, data) { - if(data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').hide(); - } - - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - - $('#uploadprogressbar').progressbar('value',100); - $('#uploadprogressbar').fadeOut(); - } - } - var file_upload_handler = function() { - $('#file_upload_start').fileupload(file_upload_param); - }; - - - - if ( document.getElementById('data-upload-form') ) { - $(file_upload_handler); - } - $.assocArraySize = function(obj) { - // http://stackoverflow.com/a/6700/11236 - var size = 0, key; - for (key in obj) { - if (obj.hasOwnProperty(key)) size++; - } - return size; - }; - - // warn user not to leave the page while upload is in progress - $(window).bind('beforeunload', function(e) { - if ($.assocArraySize(uploadingFiles) > 0) - return t('files','File upload is in progress. Leaving the page now will cancel the upload.'); - }); - - //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) - if(navigator.userAgent.search(/konqueror/i)==-1){ - $('#file_upload_start').attr('multiple','multiple') - } - - //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder - var crumb=$('div.crumb').first(); - while($('div.controls').height()>40 && crumb.next('div.crumb').length>0){ - crumb.children('a').text('...'); - crumb=crumb.next('div.crumb'); - } - //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent - var crumb=$('div.crumb').first(); - var next=crumb.next('div.crumb'); - while($('div.controls').height()>40 && next.next('div.crumb').length>0){ - crumb.remove(); - crumb=next; - next=crumb.next('div.crumb'); - } - //still not enough, start shorting down the current folder name - var crumb=$('div.crumb>a').last(); - while($('div.controls').height()>40 && crumb.text().length>6){ - var text=crumb.text() - text=text.substr(0,text.length-6)+'...'; - crumb.text(text); - } - - $(document).click(function(){ - $('#new>ul').hide(); - $('#new').removeClass('active'); - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } - }); - }); - $('#new li').click(function(){ - if($(this).children('p').length==0){ - return; - } - - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ - $(element).children('form').remove(); - $(element).append('

'+$(element).data('text')+'

'); - } }); - var type=$(this).data('type'); - var text=$(this).children('p').text(); - $(this).data('text',text); + //add multiply file upload attribute to all browsers except konqueror (which crashes when it's used) + if(navigator.userAgent.search(/konqueror/i) === -1) { + $('#file_upload_start').attr('multiple', 'multiple'); + } + + //if the breadcrumb is to long, start by replacing foldernames with '...' except for the current folder + var crumb = $('div.crumb').first(); + while($('div.controls').height() > 40 && crumb.next('div.crumb').length > 0) { + crumb.children('a').text('...'); + crumb = crumb.next('div.crumb'); + } + //if that isn't enough, start removing items from the breacrumb except for the current folder and it's parent + var crumb = $('div.crumb').first(); + var next = crumb.next('div.crumb'); + while($('div.controls').height() > 40 && next.next('div.crumb').length > 0) { + crumb.remove(); + crumb = next; + next = crumb.next('div.crumb'); + } + //still not enough, start shorting down the current folder name + var crumb = $('div.crumb>a').last(); + while($('div.controls').height() > 40 && crumb.text().length > 6) { + var text = crumb.text(); + text = text.substr(0, text.length-6)+'...'; + crumb.text(text); + } + + $(document).click(function() { + $('#new>ul').hide(); + $('#new').removeClass('active'); + $('#new li').each(function(i, element) { + if($(element).children('p').length === 0) { + $(element).children('form').remove(); + $(element).append('

' + $(element).data('text') + '

'); + } + }); + }); + $('#new li').click(function() { + if($(this).children('p').length === 0) { + return; + } + + $('#new li').each(function(i, element) { + if($(element).children('p').length === 0) { + $(element).children('form').remove(); + $(element).append('

' + $(element).data('text') + '

'); + } + }); + + var type = $(this).data('type'); + var text = $(this).children('p').text(); + $(this).data('text', text); $(this).children('p').remove(); - var form=$('
'); - var input=$(''); + var form = $('
'); + var input = $(''); form.append(input); $(this).append(form); input.focus(); - form.submit(function(event){ - event.stopPropagation(); - event.preventDefault(); - var newname=input.val(); - if(type == 'web' && newname.length == 0) { - OC.Notification.show(t('files', 'URL cannot be empty.')); - return false; - } else if (type != 'web' && !Files.isFileNameValid(newname)) { - return false; - } else if( type == 'folder' && $('#dir').val() == '/' && newname == 'Shared') { - OC.Notification.show(t('files','Invalid folder name. Usage of \'Shared\' is reserved by ownCloud')); - return false; - } - if (FileList.lastAction) { - FileList.lastAction(); - } - var name = getUniqueName(newname); - if (newname != name) { - FileList.checkName(name, newname, true); - var hidden = true; - } else { - var hidden = false; - } - switch(type){ - case 'file': - $.post( - OC.filePath('files','ajax','newfile.php'), - {dir:$('#dir').val(),filename:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addFile(name,0,date,false,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-mime',result.data.mime); - tr.attr('data-id', result.data.id); - getMimeIcon(result.data.mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); - } - } - ); - break; - case 'folder': - $.post( - OC.filePath('files','ajax','newfolder.php'), - {dir:$('#dir').val(),foldername:name}, - function(result){ - if (result.status == 'success') { - var date=new Date(); - FileList.addDir(name,0,date,hidden); - var tr=$('tr').filterAttr('data-file',name); - tr.attr('data-id', result.data.id); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); - } - } - ); - break; - case 'web': - if(name.substr(0,8)!='https://' && name.substr(0,7)!='http://'){ - name='http://'+name; + form.submit(function(event) { + event.stopPropagation(); + event.preventDefault(); + var newname=input.val(); + if(type === 'web' && newname.length === 0) { + OC.Notification.show(t('files', 'URL cannot be empty.')); + return false; + } else if (type !== 'web' && !Files.isFileNameValid(newname)) { + return false; + } else if( type === 'folder' && $('#dir').val() === '/' && newname === 'Shared') { + OC.Notification.show(t('files', 'Invalid folder name. Usage of \'Shared\' is reserved by ownCloud')); + return false; } - var localName=name; - if(localName.substr(localName.length-1,1)=='/'){//strip / - localName=localName.substr(0,localName.length-1) + if (FileList.lastAction) { + FileList.lastAction(); } - if(localName.indexOf('/')){//use last part of url - localName=localName.split('/').pop(); - } else { //or the domain - localName=(localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.',''); - } - localName = getUniqueName(localName); - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { + var name = getUniqueName(newname); + if (newname !== name) { + FileList.checkName(name, newname, true); + var hidden = true; } else { - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); + var hidden = false; } + switch(type) { + case 'file': + $.post( + OC.filePath('files', 'ajax', 'newfile.php'), + {dir:$('#dir').val(), filename:name}, + function(result) { + if (result.status === 'success') { + var date = new Date(); + FileList.addFile(name, 0, date, false, hidden); + var tr = $('tr').filterAttr('data-file', name); + tr.attr('data-mime', result.data.mime); + tr.attr('data-id', result.data.id); + getMimeIcon(result.data.mime, function(path) { + tr.find('td.filename').attr('style', 'background-image:url('+path+')'); + }); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Error')); + } + } + ); + break; + case 'folder': + $.post( + OC.filePath('files', 'ajax', 'newfolder.php'), + {dir:$('#dir').val(), foldername:name}, + function(result) { + if (result.status === 'success') { + var date = new Date(); + FileList.addDir(name, 0, date, hidden); + var tr = $('tr').filterAttr('data-file', name); + tr.attr('data-id', result.data.id); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Error')); + } + } + ); + break; + case 'web': + if (name.substr(0, 8) !== 'https://' && name.substr(0, 7) !== 'http://') { + name = 'http://' + name; + } + var localName = name; + if(localName.substr(localName.length-1, 1) === '/') { //strip / + localName = localName.substr(0, localName.length-1); + } + if (localName.indexOf('/')) { //use last part of url + localName = localName.split('/').pop(); + } else { //or the domain + localName = (localName.match(/:\/\/(.[^\/]+)/)[1]).replace('www.', ''); + } + localName = getUniqueName(localName); + //IE < 10 does not fire the necessary events for the progress bar. + if ($('html.lte9').length > 0) { + } else { + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); + } - var eventSource=new OC.EventSource(OC.filePath('files','ajax','newfile.php'),{dir:$('#dir').val(),source:name,filename:localName}); - eventSource.listen('progress',function(progress){ - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - } else { - $('#uploadprogressbar').progressbar('value',progress); - } + var eventSource = new OC.EventSource( + OC.filePath('files', 'ajax', 'newfile.php'), + {dir:$('#dir').val(), source:name, filename:localName} + ); + eventSource.listen('progress', function(progress) { + //IE < 10 does not fire the necessary events for the progress bar. + if($('html.lte9').length > 0) { + } else { + $('#uploadprogressbar').progressbar('value', progress); + } + }); + eventSource.listen('success', function(data) { + var mime = data.mime; + var size = data.size; + var id = data.id; + $('#uploadprogressbar').fadeOut(); + var date = new Date(); + FileList.addFile(localName, size, date, false, hidden); + var tr = $('tr').filterAttr('data-file', localName); + tr.data('mime', mime).data('id', id); + tr.attr('data-id', id); + getMimeIcon(mime, function(path) { + tr.find('td.filename').attr('style', 'background-image:url(' + path + ')'); + }); + }); + eventSource.listen('error', function(error) { + $('#uploadprogressbar').fadeOut(); + alert(error); + }); + break; + } + var li = form.parent(); + form.remove(); + li.append('

' + li.data('text') + '

'); + $('#new>a').click(); }); - eventSource.listen('success',function(data){ - var mime=data.mime; - var size=data.size; - var id=data.id; - $('#uploadprogressbar').fadeOut(); - var date=new Date(); - FileList.addFile(localName,size,date,false,hidden); - var tr=$('tr').filterAttr('data-file',localName); - tr.data('mime',mime).data('id',id); - tr.attr('data-id', id); - getMimeIcon(mime,function(path){ - tr.find('td.filename').attr('style','background-image:url('+path+')'); - }); - }); - eventSource.listen('error',function(error){ - $('#uploadprogressbar').fadeOut(); - alert(error); - }); - break; - } - var li=form.parent(); - form.remove(); - li.append('

'+li.data('text')+'

'); - $('#new>a').click(); + }); - }); + }); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index b858e2580e..bcc77e68ce 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -308,7 +308,7 @@ var FileList={ html.attr('data-oldName', oldName); html.attr('data-newName', newName); html.attr('data-isNewFile', isNewFile); - OC.Notification.showHtml(html); + OC.Notification.showHtml(html); return true; } else { return false; diff --git a/core/js/jquery.ocdialog.js b/core/js/jquery.ocdialog.js index 7413927e3b..52ff5633f9 100644 --- a/core/js/jquery.ocdialog.js +++ b/core/js/jquery.ocdialog.js @@ -101,6 +101,9 @@ } $.each(value, function(idx, val) { var $button = $('