From 0736bfb43a0ecc81ba1eb38c4b32fea8ed454957 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 4 Oct 2013 17:49:42 +0200 Subject: Do not call changeDirectory() when no dir set on breadcrumb Some apps like the files_trashbin app do not set a directory on its "home" breadcrumb link. This fix makes sure that the click event doesn't do anything in that case and lets the browser open the link. This fixes the "home" icon in the trashbin app which now correctly reopens the files app. --- apps/files/js/files.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 899bc6469e5..09f5d6f114c 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -701,7 +701,10 @@ function checkTrashStatus() { } function onClickBreadcrumb(e){ - var $el = $(e.target).closest('.crumb'); - e.preventDefault(); - FileList.changeDirectory(decodeURIComponent($el.data('dir'))); + var $el = $(e.target).closest('.crumb'), + $targetDir = $el.data('dir'); + if ($targetDir !== undefined){ + e.preventDefault(); + FileList.changeDirectory(decodeURIComponent($targetDir)); + } } -- cgit v1.2.3 From 6a4563f203d8decb07bee3a82e111d876255e516 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 7 Oct 2013 11:07:33 +0200 Subject: Fix breadcrumb to reinit dnd after ajax nav #5064 Now correctly reinitializing the breadcrumb drop zone after ajax navigation. This also fixes dropping onto the "files" app icon. --- apps/files/js/files.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 899bc6469e5..53858d65c65 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -98,6 +98,8 @@ Files={ lastWidth: 0, initBreadCrumbs: function () { + var $controls = $('#controls'); + Files.lastWidth = 0; Files.breadcrumbs = []; @@ -118,7 +120,10 @@ Files={ }); // event handlers for breadcrumb items - $('#controls .crumb a').on('click', onClickBreadcrumb); + $controls.find('.crumb a').on('click', onClickBreadcrumb); + + // setup drag and drop + $controls.find('.crumb:not(.last)').droppable(crumbDropOptions); }, resizeBreadcrumbs: function (width, firstRun) { @@ -176,11 +181,8 @@ $(document).ready(function() { $('#file_action_panel').attr('activeAction', false); - $('div.crumb:not(.last)').droppable(crumbDropOptions); - $('ul#apps>li:first-child').data('dir',''); - if($('div.crumb').length){ - $('ul#apps>li:first-child').droppable(crumbDropOptions); - } + // allow dropping on the "files" app icon + $('ul#apps li:first-child').data('dir','').droppable(crumbDropOptions); // Triggers invisible file input $('#upload a').on('click', function() { -- cgit v1.2.3 From 4ccbace68df0150cdadaa8e680a7cb2639e8c628 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Fri, 20 Sep 2013 14:59:17 +0200 Subject: remove double uri encoding --- apps/files/js/files.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 899bc6469e5..bffb354fce6 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -367,7 +367,7 @@ $(document).ready(function() { } }); } - + //scroll to and highlight preselected file if (getURLParameter('scrollto')) { FileList.scrollTo(getURLParameter('scrollto')); @@ -645,7 +645,7 @@ function lazyLoadPreview(path, mime, ready, width, height) { // get mime icon url getMimeIcon(mime, function(iconURL) { ready(iconURL); // set mimeicon URL - + // now try getting a preview thumbnail URL if ( ! width ) { width = $('#filestable').data('preview-x'); @@ -654,9 +654,9 @@ function lazyLoadPreview(path, mime, ready, width, height) { height = $('#filestable').data('preview-y'); } if( $('#publicUploadButtonMock').length ) { - var previewURL = OC.Router.generate('core_ajax_public_preview', {file: encodeURIComponent(path), x:width, y:height, t:$('#dirToken').val()}); + var previewURL = OC.Router.generate('core_ajax_public_preview', {file: path, x:width, y:height, t:$('#dirToken').val()}); } else { - var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:width, y:height}); + var previewURL = OC.Router.generate('core_ajax_preview', {file: path, x:width, y:height}); } $.get(previewURL, function() { previewURL = previewURL.replace('(', '%28'); -- cgit v1.2.3 From fab4102c51e92c5e33725c69ec984b8912a9aee1 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 14 Oct 2013 17:47:38 +0200 Subject: Disabled ajax mode for public files view Ajax loading is not supported yet for public files view. This fix disabled the history API, ajax loading and ajax directory switch in public mode until it is implemented properly. --- apps/files/js/filelist.js | 44 ++++++++++++++++++++++++-------------------- apps/files/js/files.js | 4 +++- 2 files changed, 27 insertions(+), 21 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index a9297996778..ccc4b1401ad 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -677,6 +677,7 @@ var FileList={ }; $(document).ready(function(){ + var isPublic = !!$('#isPublic').val(); // handle upload events var file_upload_start = $('#file_upload_start'); @@ -924,29 +925,32 @@ $(document).ready(function(){ return (params && params.dir) || '/'; } - // fallback to hashchange when no history support - if (!window.history.pushState){ - $(window).on('hashchange', function(){ - FileList.changeDirectory(parseCurrentDirFromUrl(), false); - }); - } - window.onpopstate = function(e){ - var targetDir; - if (e.state && e.state.dir){ - targetDir = e.state.dir; - } - else{ - // read from URL - targetDir = parseCurrentDirFromUrl(); + // disable ajax/history API for public app (TODO: until it gets ported) + if (!isPublic){ + // fallback to hashchange when no history support + if (!window.history.pushState){ + $(window).on('hashchange', function(){ + FileList.changeDirectory(parseCurrentDirFromUrl(), false); + }); } - if (targetDir){ - FileList.changeDirectory(targetDir, false); + window.onpopstate = function(e){ + var targetDir; + if (e.state && e.state.dir){ + targetDir = e.state.dir; + } + else{ + // read from URL + targetDir = parseCurrentDirFromUrl(); + } + if (targetDir){ + FileList.changeDirectory(targetDir, false); + } } - } - if (parseInt($('#ajaxLoad').val(), 10) === 1){ - // need to initially switch the dir to the one from the hash (IE8) - FileList.changeDirectory(parseCurrentDirFromUrl(), false, true); + if (parseInt($('#ajaxLoad').val(), 10) === 1){ + // need to initially switch the dir to the one from the hash (IE8) + FileList.changeDirectory(parseCurrentDirFromUrl(), false, true); + } } FileList.createFileSummary(); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 9e7a2364b18..a35ed4add8c 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -705,7 +705,9 @@ function checkTrashStatus() { function onClickBreadcrumb(e){ var $el = $(e.target).closest('.crumb'), $targetDir = $el.data('dir'); - if ($targetDir !== undefined){ + isPublic = !!$('#isPublic').val(); + + if ($targetDir !== undefined && !isPublic){ e.preventDefault(); FileList.changeDirectory(decodeURIComponent($targetDir)); } -- cgit v1.2.3 From 1c611a3dfb16c67a940ad74625bda54e4b593a09 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 18 Oct 2013 10:57:10 +0200 Subject: give getSelectedFilesTrash() a unique name for the trash.js to avoid confusions with the same function in files.js --- apps/files/js/files.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index a35ed4add8c..c3a8d81b50d 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -301,7 +301,7 @@ $(document).ready(function() { }); $('.download').click('click',function(event) { - var files=getSelectedFiles('name'); + var files=getSelectedFilesTrash('name'); var fileslist = JSON.stringify(files); var dir=$('#dir').val()||'/'; OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.')); @@ -315,7 +315,7 @@ $(document).ready(function() { }); $('.delete-selected').click(function(event) { - var files=getSelectedFiles('name'); + var files=getSelectedFilesTrash('name'); event.preventDefault(); FileList.do_delete(files); return false; @@ -433,7 +433,7 @@ var createDragShadow = function(event){ $(event.target).parents('tr').find('td input:first').prop('checked',true); } - var selectedFiles = getSelectedFiles(); + var selectedFiles = getSelectedFilesTrash(); if (!isDragSelected && selectedFiles.length == 1) { //revert the selection @@ -562,7 +562,7 @@ var crumbDropOptions={ } function procesSelection(){ - var selected=getSelectedFiles(); + var selected=getSelectedFilesTrash(); var selectedFiles=selected.filter(function(el){return el.type=='file'}); var selectedFolders=selected.filter(function(el){return el.type=='dir'}); if(selectedFiles.length==0 && selectedFolders.length==0) { @@ -607,7 +607,7 @@ function procesSelection(){ * if property is set, an array with that property for each file is returnd * if it's ommited an array of objects with all properties is returned */ -function getSelectedFiles(property){ +function getSelectedFilesTrash(property){ var elements=$('td.filename input:checkbox:checked').parent().parent(); var files=[]; elements.each(function(i,element){ -- cgit v1.2.3 From 3bb7cf939ec56f97a5fb01c16282ed7d831e338f Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 22 Oct 2013 12:08:05 +0200 Subject: Fixed ugly white space while loading file thumbnail Preview images are now pre-loaded before being set on the file element. This fixes #5135 and prevents a white space to be displayed while the thumbnails is being loaded. --- apps/files/js/files.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index c3a8d81b50d..ec2dc7c62ea 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -663,8 +663,16 @@ function lazyLoadPreview(path, mime, ready, width, height) { $.get(previewURL, function() { previewURL = previewURL.replace('(', '%28'); previewURL = previewURL.replace(')', '%29'); - //set preview thumbnail URL - ready(previewURL + '&reload=true'); + previewURL += '&reload=true'; + + // preload image to prevent delay + // this will make the browser cache the image + var img = new Image(); + img.onload = function(){ + //set preview thumbnail URL + ready(previewURL); + } + img.src = previewURL; }); }); } -- cgit v1.2.3 From 45e6d9670266884806431f35a4cedb80c0ceb229 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Tue, 22 Oct 2013 18:11:03 +0200 Subject: prevent user from creating or renaming sth. to an existing filename - show tooltip when violating naming constraints while typing - when target filename exists on server fallback to dialog to interrupt the users flow because something unexpected went wrong - fixes #5062 - also fixes some whitespace and codestyle issues in files js - uses css selector over filterAttr in touched js files --- apps/files/ajax/newfile.php | 15 ++ apps/files/css/files.css | 8 +- apps/files/js/file-upload.js | 337 ++++++++++++++++++++----------------- apps/files/js/filelist.js | 390 +++++++++++++++++++++++-------------------- apps/files/js/files.js | 198 +++++++++++----------- apps/files/lib/app.php | 10 +- core/js/js.js | 2 +- 7 files changed, 524 insertions(+), 436 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index 76c03c87a51..8f483aa5cb6 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -56,6 +56,21 @@ function progress($notification_code, $severity, $message, $message_code, $bytes $target = $dir.'/'.$filename; +$l10n = \OC_L10n::get('files'); + +if (\OC\Files\Filesystem::file_exists($target)) { + $result = array( + 'success' => false, + 'data' => array( + 'message' => $l10n->t( + "The name %s is already used in the folder %s. Please choose a different name.", + array($newname, $dir)) + ) + ); + OCP\JSON::error($result); + exit(); +} + if($source) { if(substr($source, 0, 8)!='https://' and substr($source, 0, 7)!='http://') { OCP\JSON::error(array("data" => array( "message" => "Not a valid source" ))); diff --git a/apps/files/css/files.css b/apps/files/css/files.css index ac2a243f2b4..af8597192f3 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -49,7 +49,13 @@ background-repeat:no-repeat; cursor:pointer; } #new>ul>li>p { cursor:pointer; padding-top: 7px; padding-bottom: 7px;} - +#new .error, #fileList .error { + color: #e9322d; + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} /* FILE TABLE */ diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index fefb06a8ac5..936487cad3c 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -53,12 +53,12 @@ OC.Upload = { */ cancelUploads:function() { this.log('canceling uploads'); - jQuery.each(this._uploads,function(i, jqXHR){ + jQuery.each(this._uploads,function(i, jqXHR) { jqXHR.abort(); }); this._uploads = []; }, - rememberUpload:function(jqXHR){ + rememberUpload:function(jqXHR) { if (jqXHR) { this._uploads.push(jqXHR); } @@ -68,10 +68,10 @@ OC.Upload = { * returns true if any hxr has the state 'pending' * @returns {boolean} */ - isProcessing:function(){ + isProcessing:function() { var count = 0; - jQuery.each(this._uploads,function(i, data){ + jQuery.each(this._uploads,function(i, data) { if (data.state() === 'pending') { count++; } @@ -114,7 +114,7 @@ OC.Upload = { * handle skipping an upload * @param {object} data */ - onSkip:function(data){ + onSkip:function(data) { this.log('skip', null, data); this.deleteUpload(data); }, @@ -122,12 +122,12 @@ OC.Upload = { * handle replacing a file on the server with an uploaded file * @param {object} data */ - onReplace:function(data){ + onReplace:function(data) { this.log('replace', null, data); - if (data.data){ + if (data.data) { data.data.append('resolution', 'replace'); } else { - data.formData.push({name:'resolution',value:'replace'}); //hack for ie8 + data.formData.push({name:'resolution', value:'replace'}); //hack for ie8 } data.submit(); }, @@ -135,12 +135,12 @@ OC.Upload = { * handle uploading a file and letting the server decide a new name * @param {object} data */ - onAutorename:function(data){ + onAutorename:function(data) { this.log('autorename', null, data); if (data.data) { data.data.append('resolution', 'autorename'); } else { - data.formData.push({name:'resolution',value:'autorename'}); //hack for ie8 + data.formData.push({name:'resolution', value:'autorename'}); //hack for ie8 } data.submit(); }, @@ -162,7 +162,7 @@ OC.Upload = { * @param {function} callbacks.onChooseConflicts * @param {function} callbacks.onCancel */ - checkExistingFiles: function (selection, callbacks){ + checkExistingFiles: function (selection, callbacks) { // TODO check filelist before uploading and show dialog on conflicts, use callbacks callbacks.onNoConflicts(selection); } @@ -215,7 +215,7 @@ $(document).ready(function() { var selection = data.originalFiles.selection; // add uploads - if ( selection.uploads.length < selection.filesToUpload ){ + if ( selection.uploads.length < selection.filesToUpload ) { // remember upload selection.uploads.push(data); } @@ -335,7 +335,7 @@ $(document).ready(function() { delete data.jqXHR; - if(typeof result[0] === 'undefined') { + if (typeof result[0] === 'undefined') { data.textStatus = 'servererror'; data.errorThrown = t('files', 'Could not get result from server.'); var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); @@ -368,13 +368,13 @@ $(document).ready(function() { var fileupload = $('#file_upload_start').fileupload(file_upload_param); window.file_upload_param = fileupload; - if(supportAjaxUploadWithProgress()) { + if (supportAjaxUploadWithProgress()) { // add progress handlers fileupload.on('fileuploadadd', function(e, data) { OC.Upload.log('progress handle fileuploadadd', e, data); //show cancel button - //if(data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie? + //if (data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie? // $('#uploadprogresswrapper input.stop').show(); //} }); @@ -419,7 +419,9 @@ $(document).ready(function() { // http://stackoverflow.com/a/6700/11236 var size = 0, key; for (key in obj) { - if (obj.hasOwnProperty(key)) size++; + if (obj.hasOwnProperty(key)) { + size++; + } } return size; }; @@ -432,56 +434,61 @@ $(document).ready(function() { }); //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 (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){ + while($('div.controls').height() > 40 && crumb.next('div.crumb').length > 0) { crumb.children('a').text('...'); - crumb=crumb.next('div.crumb'); + 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){ + 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'); + 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)+'...'; + 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(){ + $(document).click(function() { $('#new>ul').hide(); $('#new').removeClass('active'); - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ + if ($('#new .error').length > 0) { + $('#new .error').tipsy('hide'); + } + $('#new li').each(function(i,element) { + if ($(element).children('p').length === 0) { $(element).children('form').remove(); $(element).append('

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

'); } }); }); - $('#new').click(function(event){ + $('#new').click(function(event) { event.stopPropagation(); }); - $('#new>a').click(function(){ + $('#new>a').click(function() { $('#new>ul').toggle(); $('#new').toggleClass('active'); }); - $('#new li').click(function(){ - if($(this).children('p').length==0){ + $('#new li').click(function() { + if ($(this).children('p').length === 0) { return; } + + $('#new .error').tipsy('hide'); - $('#new li').each(function(i,element){ - if($(element).children('p').length==0){ + $('#new li').each(function(i,element) { + if ($(element).children('p').length === 0) { $(element).children('form').remove(); $(element).append('

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

'); } @@ -491,132 +498,164 @@ $(document).ready(function() { var text=$(this).children('p').text(); $(this).data('text',text); $(this).children('p').remove(); + + // add input field var form=$('
'); var input=$(''); form.append(input); $(this).append(form); + + var checkInput = function () { + var filename = input.val(); + if (type === 'web' && filename.length === 0) { + throw t('files', 'URL cannot be empty.'); + } else if (type !== 'web' && !Files.isFileNameValid(filename)) { + // Files.isFileNameValid(filename) throws an exception itself + } else if ($('#dir').val() === '/' && filename === 'Shared') { + throw t('files','Invalid name. Usage of \'Shared\' is reserved by ownCloud'); + } else if (FileList.inList(filename)) { + throw t('files', '{new_name} already exists', {new_name: filename}); + } else { + return true; + } + }; + + // verify filename on typing + input.keyup(function(event) { + try { + checkInput(); + input.tipsy('hide'); + input.removeClass('error'); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); + } + }); + input.focus(); - form.submit(function(event){ + 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(); - // TODO: ideally addFile should be able to receive - // all attributes and set them automatically, - // and also auto-load the preview - var tr = FileList.addFile(name,0,date,false,hidden); - tr.attr('data-size',result.data.size); - tr.attr('data-mime',result.data.mime); - tr.attr('data-id', result.data.id); - tr.find('.filesize').text(humanFileSize(result.data.size)); - var path = getPathForPreview(name); - lazyLoadPreview(path, result.data.mime, function(previewpath){ - tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); - FileActions.display(tr.find('td.filename'), true); - } else { - OC.dialogs.alert(result.data.message, t('core', 'Error')); + try { + checkInput(); + var newname = input.val(); + 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(); + // TODO: ideally addFile should be able to receive + // all attributes and set them automatically, + // and also auto-load the preview + var tr = FileList.addFile(name, 0, date, false, hidden); + tr.attr('data-size', result.data.size); + tr.attr('data-mime', result.data.mime); + tr.attr('data-id', result.data.id); + tr.find('.filesize').text(humanFileSize(result.data.size)); + var path = getPathForPreview(name); + lazyLoadPreview(path, result.data.mime, function(previewpath) { + tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + }); + FileActions.display(tr.find('td.filename'), true); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Could not create file')); + } } - } - ); - 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 '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[data-file="'+name+'"]'); + tr.attr('data-id', result.data.id); + } else { + OC.dialogs.alert(result.data.message, t('core', 'Could not create folder')); + } } + ); + break; + case 'web': + if (name.substr(0,8) !== 'https://' && name.substr(0,7) !== 'http://') { + name = 'http://' + name; } - ); - 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) { - $('#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){ + 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) { - $('#uploadprogressbar').progressbar('value',progress); + if ($('html.lte9').length === 0) { + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); } - }); - 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); - var path = $('#dir').val()+'/'+localName; - lazyLoadPreview(path, mime, function(previewpath){ - tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + + 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) { + $('#uploadprogressbar').progressbar('value',progress); + } }); - }); - eventSource.listen('error',function(error){ - $('#uploadprogressbar').fadeOut(); - alert(error); - }); - break; + 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[data-file="'+localName+'"]'); + tr.data('mime', mime).data('id', id); + tr.attr('data-id', id); + var path = $('#dir').val()+'/'+localName; + lazyLoadPreview(path, mime, function(previewpath) { + tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')'); + }); + FileActions.display(tr.find('td.filename'), true); + }); + eventSource.listen('error',function(error) { + $('#uploadprogressbar').fadeOut(); + alert(error); + }); + break; + } + var li=form.parent(); + form.remove(); + /* workaround for IE 9&10 click event trap, 2 lines: */ + $('input').first().focus(); + $('#content').focus(); + li.append('

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

'); + $('#new>a').click(); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); } - var li=form.parent(); - form.remove(); - /* workaround for IE 9&10 click event trap, 2 lines: */ - $('input').first().focus(); - $('#content').focus(); - li.append('

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

'); - $('#new>a').click(); }); }); window.file_upload_param = file_upload_param; diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 84ff1093253..694ddb0c803 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -1,7 +1,7 @@ var FileList={ useUndo:true, - postProcessList: function(){ - $('#fileList tr').each(function(){ + postProcessList: function() { + $('#fileList tr').each(function() { //little hack to set unescape filenames in attribute $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); @@ -11,20 +11,20 @@ var FileList={ permissions = $('#permissions').val(), isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; $fileList.empty().html(fileListHtml); - $('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').length > 0); + $('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').exists()); $fileList.find('tr').each(function () { FileActions.display($(this).children('td.filename')); }); $fileList.trigger(jQuery.Event("fileActionsReady")); FileList.postProcessList(); // "Files" might not be loaded in extending apps - if (window.Files){ + if (window.Files) { Files.setupDragAndDrop(); } FileList.updateFileSummary(); $fileList.trigger(jQuery.Event("updated")); }, - createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions){ + createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions) { var td, simpleSize, basename, extension; //containing tr var tr = $('').attr({ @@ -45,7 +45,7 @@ var FileList={ "href": linktarget }); //split extension from filename for non dirs - if (type != 'dir' && name.indexOf('.')!=-1) { + if (type !== 'dir' && name.indexOf('.') !== -1) { basename=name.substr(0,name.lastIndexOf('.')); extension=name.substr(name.lastIndexOf('.')); } else { @@ -54,11 +54,11 @@ var FileList={ } var name_span=$('').addClass('nametext').text(basename); link_elem.append(name_span); - if(extension){ + if (extension) { name_span.append($('').addClass('extension').text(extension)); } //dirs can show the number of uploaded files - if (type == 'dir') { + if (type === 'dir') { link_elem.append($('').attr({ 'class': 'uploadtext', 'currentUploads': 0 @@ -68,9 +68,9 @@ var FileList={ tr.append(td); //size column - if(size!=t('files', 'Pending')){ + if (size !== t('files', 'Pending')) { simpleSize = humanFileSize(size); - }else{ + } else { simpleSize=t('files', 'Pending'); } var sizeColor = Math.round(160-Math.pow((size/(1024*1024)),2)); @@ -92,7 +92,7 @@ var FileList={ tr.append(td); return tr; }, - addFile:function(name,size,lastModified,loading,hidden,param){ + addFile:function(name, size, lastModified, loading, hidden, param) { var imgurl; if (!param) { @@ -122,9 +122,9 @@ var FileList={ ); FileList.insertElement(name, 'file', tr); - if(loading){ - tr.data('loading',true); - }else{ + if (loading) { + tr.data('loading', true); + } else { tr.find('td.filename').draggable(dragOptions); } if (hidden) { @@ -132,7 +132,7 @@ var FileList={ } return tr; }, - addDir:function(name,size,lastModified,hidden){ + addDir:function(name, size, lastModified, hidden) { var tr = this.createRow( 'dir', @@ -144,7 +144,7 @@ var FileList={ $('#permissions').val() ); - FileList.insertElement(name,'dir',tr); + FileList.insertElement(name, 'dir', tr); var td = tr.find('td.filename'); td.draggable(dragOptions); td.droppable(folderDropOptions); @@ -158,25 +158,26 @@ var FileList={ * @brief Changes the current directory and reload the file list. * @param targetDir target directory (non URL encoded) * @param changeUrl false if the URL must not be changed (defaults to true) + * @param {boolean} force set to true to force changing directory */ - changeDirectory: function(targetDir, changeUrl, force){ + changeDirectory: function(targetDir, changeUrl, force) { var $dir = $('#dir'), url, currentDir = $dir.val() || '/'; targetDir = targetDir || '/'; - if (!force && currentDir === targetDir){ + if (!force && currentDir === targetDir) { return; } FileList.setCurrentDir(targetDir, changeUrl); FileList.reload(); }, - linkTo: function(dir){ + linkTo: function(dir) { return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/'); }, - setCurrentDir: function(targetDir, changeUrl){ + setCurrentDir: function(targetDir, changeUrl) { $('#dir').val(targetDir); - if (changeUrl !== false){ - if (window.history.pushState && changeUrl !== false){ + if (changeUrl !== false) { + if (window.history.pushState && changeUrl !== false) { url = FileList.linkTo(targetDir); window.history.pushState({dir: targetDir}, '', url); } @@ -189,9 +190,9 @@ var FileList={ /** * @brief Reloads the file list using ajax call */ - reload: function(){ + reload: function() { FileList.showMask(); - if (FileList._reloadCall){ + if (FileList._reloadCall) { FileList._reloadCall.abort(); } FileList._reloadCall = $.ajax({ @@ -200,7 +201,7 @@ var FileList={ dir : $('#dir').val(), breadcrumb: true }, - error: function(result){ + error: function(result) { FileList.reloadCallback(result); }, success: function(result) { @@ -208,7 +209,7 @@ var FileList={ } }); }, - reloadCallback: function(result){ + reloadCallback: function(result) { var $controls = $('#controls'); delete FileList._reloadCall; @@ -219,17 +220,17 @@ var FileList={ return; } - if (result.status === 404){ + if (result.status === 404) { // go back home FileList.changeDirectory('/'); return; } - if (result.data.permissions){ + if (result.data.permissions) { FileList.setDirectoryPermissions(result.data.permissions); } - if(typeof(result.data.breadcrumb) != 'undefined'){ + if (typeof(result.data.breadcrumb) !== 'undefined') { $controls.find('.crumb').remove(); $controls.prepend(result.data.breadcrumb); @@ -238,81 +239,83 @@ var FileList={ Files.resizeBreadcrumbs(width, true); // in case svg is not supported by the browser we need to execute the fallback mechanism - if(!SVGSupport()) { + if (!SVGSupport()) { replaceSVG(); } } FileList.update(result.data.files); }, - setDirectoryPermissions: function(permissions){ + setDirectoryPermissions: function(permissions) { var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; $('#permissions').val(permissions); $('.creatable').toggleClass('hidden', !isCreatable); $('.notCreatable').toggleClass('hidden', isCreatable); }, - remove:function(name){ - $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy'); - $('tr').filterAttr('data-file',name).remove(); + remove:function(name) { + $('tr[data-file="'+name+'"]').find('td.filename').draggable('destroy'); + $('tr[data-file="'+name+'"]').remove(); FileList.updateFileSummary(); - if($('tr[data-file]').length==0){ + if ( ! $('tr[data-file]').exists() ) { $('#emptycontent').removeClass('hidden'); } }, - insertElement:function(name,type,element){ + insertElement:function(name, type, element) { //find the correct spot to insert the file or folder var pos, fileElements=$('tr[data-file][data-type="'+type+'"]:visible'); - if(name.localeCompare($(fileElements[0]).attr('data-file'))<0){ - pos=-1; - }else if(name.localeCompare($(fileElements[fileElements.length-1]).attr('data-file'))>0){ - pos=fileElements.length-1; - }else{ - for(pos=0;pos0 && name.localeCompare($(fileElements[pos+1]).attr('data-file'))<0){ + if (name.localeCompare($(fileElements[0]).attr('data-file')) < 0) { + pos = -1; + } else if (name.localeCompare($(fileElements[fileElements.length-1]).attr('data-file')) > 0) { + pos = fileElements.length - 1; + } else { + for(pos = 0; pos 0 + && name.localeCompare($(fileElements[pos+1]).attr('data-file')) < 0) + { break; } } } - if(fileElements.length){ - if(pos==-1){ + if (fileElements.exists()) { + if (pos === -1) { $(fileElements[0]).before(element); - }else{ + } else { $(fileElements[pos]).after(element); } - }else if(type=='dir' && $('tr[data-file]').length>0){ + } else if (type === 'dir' && $('tr[data-file]').exists()) { $('tr[data-file]').first().before(element); - } else if(type=='file' && $('tr[data-file]').length>0) { + } else if (type === 'file' && $('tr[data-file]').exists()) { $('tr[data-file]').last().before(element); - }else{ + } else { $('#fileList').append(element); } $('#emptycontent').addClass('hidden'); FileList.updateFileSummary(); }, - loadingDone:function(name, id){ - var mime, tr=$('tr').filterAttr('data-file',name); - tr.data('loading',false); - mime=tr.data('mime'); - tr.attr('data-mime',mime); - if (id != null) { + loadingDone:function(name, id) { + var mime, tr = $('tr[data-file="'+name+'"]'); + tr.data('loading', false); + mime = tr.data('mime'); + tr.attr('data-mime', mime); + if (id) { tr.attr('data-id', id); } var path = getPathForPreview(name); - lazyLoadPreview(path, mime, function(previewpath){ + lazyLoadPreview(path, mime, function(previewpath) { tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); }); tr.find('td.filename').draggable(dragOptions); }, - isLoading:function(name){ - return $('tr').filterAttr('data-file',name).data('loading'); + isLoading:function(name) { + return $('tr[data-file="'+name+'"]').data('loading'); }, - rename:function(name){ + rename:function(oldname) { var tr, td, input, form; - tr=$('tr').filterAttr('data-file',name); + tr = $('tr[data-file="'+oldname+'"]'); tr.data('renaming',true); - td=tr.children('td.filename'); - input=$('').val(name); - form=$('
'); + td = tr.children('td.filename'); + input = $('').val(oldname); + form = $('
'); form.append(input); td.children('a.name').hide(); td.append(form); @@ -322,18 +325,29 @@ var FileList={ if (len === -1) { len = input.val().length; } - input.selectRange(0,len); - - form.submit(function(event){ + input.selectRange(0, len); + + var checkInput = function () { + var filename = input.val(); + if (filename !== oldname) { + if (!Files.isFileNameValid(filename)) { + // Files.isFileNameValid(filename) throws an exception itself + } else if($('#dir').val() === '/' && filename === 'Shared') { + throw t('files','Invalid name. Usage of \'Shared\' is reserved by ownCloud'); + } else if (FileList.inList(filename)) { + throw t('files', '{new_name} already exists', {new_name: filename}); + } + } + return true; + }; + + form.submit(function(event) { event.stopPropagation(); event.preventDefault(); - var newname=input.val(); - if (!Files.isFileNameValid(newname)) { - return false; - } else if (newname != name) { - if (FileList.checkName(name, newname, false)) { - newname = name; - } else { + try { + var newname = input.val(); + if (newname !== oldname) { + checkInput(); // save background image, because it's replaced by a spinner while async request var oldBackgroundImage = td.css('background-image'); // mark as loading @@ -343,16 +357,16 @@ var FileList={ data: { dir : $('#dir').val(), newname: newname, - file: name + file: oldname }, success: function(result) { if (!result || result.status === 'error') { - OC.Notification.show(result.data.message); - newname = name; + OC.dialogs.alert(result.data.message, t('core', 'Could not rename file')); // revert changes + newname = oldname; tr.attr('data-file', newname); var path = td.children('a.name').attr('href'); - td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname))); + td.children('a.name').attr('href', path.replace(encodeURIComponent(oldname), encodeURIComponent(newname))); if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { var basename=newname.substr(0,newname.lastIndexOf('.')); } else { @@ -360,7 +374,7 @@ var FileList={ } td.find('a.name span.nametext').text(basename); if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { - if (td.find('a.name span.extension').length === 0 ) { + if ( ! td.find('a.name span.extension').exists() ) { td.find('a.name span.nametext').append(''); } td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); @@ -368,70 +382,76 @@ var FileList={ tr.find('.fileactions').effect('highlight', {}, 5000); tr.effect('highlight', {}, 5000); } + // reinsert row + tr.detach(); + FileList.insertElement( tr.attr('data-file'), tr.attr('data-type'),tr ); // remove loading mark and recover old image td.css('background-image', oldBackgroundImage); } }); } - } - tr.data('renaming',false); - tr.attr('data-file', newname); - var path = td.children('a.name').attr('href'); - td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname))); - if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') { - var basename=newname.substr(0,newname.lastIndexOf('.')); - } else { - var basename=newname; - } - td.find('a.name span.nametext').text(basename); - if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') { - if (td.find('a.name span.extension').length == 0 ) { - td.find('a.name span.nametext').append(''); + input.tipsy('hide'); + tr.data('renaming',false); + tr.attr('data-file', newname); + var path = td.children('a.name').attr('href'); + // FIXME this will fail if the path contains the filename. + td.children('a.name').attr('href', path.replace(encodeURIComponent(oldname), encodeURIComponent(newname))); + var basename = newname; + if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { + basename = newname.substr(0, newname.lastIndexOf('.')); + } + td.find('a.name span.nametext').text(basename); + if (newname.indexOf('.') > 0 && tr.data('type') !== 'dir') { + if ( ! td.find('a.name span.extension').exists() ) { + td.find('a.name span.nametext').append(''); + } + td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); } - td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); + form.remove(); + td.children('a.name').show(); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); } - form.remove(); - td.children('a.name').show(); return false; }); - input.keyup(function(event){ - if (event.keyCode == 27) { + input.keyup(function(event) { + // verify filename on typing + try { + checkInput(); + input.tipsy('hide'); + input.removeClass('error'); + } catch (error) { + input.attr('title', error); + input.tipsy({gravity: 'w', trigger: 'manual'}); + input.tipsy('show'); + input.addClass('error'); + } + if (event.keyCode === 27) { + input.tipsy('hide'); tr.data('renaming',false); form.remove(); td.children('a.name').show(); } }); - input.click(function(event){ + input.click(function(event) { event.stopPropagation(); event.preventDefault(); }); - input.blur(function(){ + input.blur(function() { form.trigger('submit'); }); }, - checkName:function(oldName, newName, isNewFile) { - if (isNewFile || $('tr').filterAttr('data-file', newName).length > 0) { - var html; - if(isNewFile){ - html = t('files', '{new_name} already exists', {new_name: escapeHTML(newName)})+''+t('files', 'replace')+''+t('files', 'suggest name')+' '+t('files', 'cancel')+''; - }else{ - html = t('files', '{new_name} already exists', {new_name: escapeHTML(newName)})+''+t('files', 'replace')+''+t('files', 'cancel')+''; - } - html = $('' + html + ''); - html.attr('data-oldName', oldName); - html.attr('data-newName', newName); - html.attr('data-isNewFile', isNewFile); - OC.Notification.showHtml(html); - return true; - } else { - return false; - } + inList:function(filename) { + return $('#fileList tr[data-file="'+filename+'"]').length; }, replace:function(oldName, newName, isNewFile) { // Finish any existing actions - $('tr').filterAttr('data-file', oldName).hide(); - $('tr').filterAttr('data-file', newName).hide(); - var tr = $('tr').filterAttr('data-file', oldName).clone(); + $('tr[data-file="'+oldName+'"]').hide(); + $('tr[data-file="'+newName+'"]').hide(); + var tr = $('tr[data-file="'+oldName+'"]').clone(); tr.attr('data-replace', 'true'); tr.attr('data-file', newName); var td = tr.children('td.filename'); @@ -460,14 +480,14 @@ var FileList={ FileList.finishReplace(); }; if (!isNewFile) { - OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+''+t('files', 'undo')+''); + OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+''+t('files', 'undo')+''); } }, finishReplace:function() { if (!FileList.replaceCanceled && FileList.replaceOldName && FileList.replaceNewName) { $.ajax({url: OC.filePath('files', 'ajax', 'rename.php'), async: false, data: { dir: $('#dir').val(), newname: FileList.replaceNewName, file: FileList.replaceOldName }, success: function(result) { - if (result && result.status == 'success') { - $('tr').filterAttr('data-replace', 'true').removeAttr('data-replace'); + if (result && result.status === 'success') { + $('tr[data-replace="true"').removeAttr('data-replace'); } else { OC.dialogs.alert(result.data.message, 'Error moving file'); } @@ -478,12 +498,12 @@ var FileList={ }}); } }, - do_delete:function(files){ - if(files.substr){ + do_delete:function(files) { + if (files.substr) { files=[files]; } for (var i=0; i 0 ) { + if ( $('#fileList tr').exists() ) { var totalDirs = 0; var totalFiles = 0; var totalSize = 0; @@ -536,7 +556,7 @@ var FileList={ var infoVars = { dirs: ''+directoryInfo+'', files: ''+fileInfo+'' - } + }; var info = t('files', '{dirs} and {files}', infoVars); @@ -618,10 +638,10 @@ var FileList={ } } }, - showMask: function(){ + showMask: function() { // in case one was shown before var $mask = $('#content .mask'); - if ($mask.length){ + if ($mask.exists()) { return; } @@ -632,31 +652,31 @@ var FileList={ $('#content').append($mask); // block UI, but only make visible in case loading takes longer - FileList._maskTimeout = window.setTimeout(function(){ + FileList._maskTimeout = window.setTimeout(function() { // reset opacity $mask.removeClass('transparent'); }, 250); }, - hideMask: function(){ + hideMask: function() { var $mask = $('#content .mask').remove(); - if (FileList._maskTimeout){ + if (FileList._maskTimeout) { window.clearTimeout(FileList._maskTimeout); } }, scrollTo:function(file) { //scroll to and highlight preselected file - var scrolltorow = $('tr[data-file="'+file+'"]'); - if (scrolltorow.length > 0) { - scrolltorow.addClass('searchresult'); - $(window).scrollTop(scrolltorow.position().top); + var $scrolltorow = $('tr[data-file="'+file+'"]'); + if ($scrolltorow.exists()) { + $scrolltorow.addClass('searchresult'); + $(window).scrollTop($scrolltorow.position().top); //remove highlight when hovered over - scrolltorow.one('hover', function(){ - scrolltorow.removeClass('searchresult'); + $scrolltorow.one('hover', function() { + $scrolltorow.removeClass('searchresult'); }); } }, - filter:function(query){ - $('#fileList tr:not(.summary)').each(function(i,e){ + filter:function(query) { + $('#fileList tr:not(.summary)').each(function(i,e) { if ($(e).data('file').toLowerCase().indexOf(query.toLowerCase()) !== -1) { $(e).addClass("searchresult"); } else { @@ -665,18 +685,18 @@ var FileList={ }); //do not use scrollto to prevent removing searchresult css class var first = $('#fileList tr.searchresult').first(); - if (first.length !== 0) { + if (first.exists()) { $(window).scrollTop(first.position().top); } }, - unfilter:function(){ - $('#fileList tr.searchresult').each(function(i,e){ + unfilter:function() { + $('#fileList tr.searchresult').each(function(i,e) { $(e).removeClass("searchresult"); }); } }; -$(document).ready(function(){ +$(document).ready(function() { var isPublic = !!$('#isPublic').val(); // handle upload events @@ -686,16 +706,16 @@ $(document).ready(function(){ OC.Upload.log('filelist handle fileuploaddrop', e, data); var dropTarget = $(e.originalEvent.target).closest('tr, .crumb'); - if(dropTarget && (dropTarget.data('type') === 'dir' || dropTarget.hasClass('crumb'))) { // drag&drop upload to folder + if (dropTarget && (dropTarget.data('type') === 'dir' || dropTarget.hasClass('crumb'))) { // drag&drop upload to folder // remember as context data.context = dropTarget; var dir = dropTarget.data('file'); // if from file list, need to prepend parent dir - if (dir){ + if (dir) { var parentDir = $('#dir').val() || '/'; - if (parentDir[parentDir.length - 1] != '/'){ + if (parentDir[parentDir.length - 1] !== '/') { parentDir += '/'; } dir = parentDir + dir; @@ -719,12 +739,12 @@ $(document).ready(function(){ OC.Upload.log('filelist handle fileuploadadd', e, data); //finish delete if we are uploading a deleted file - if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){ + if (FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1) { FileList.finishDelete(null, true); //delete file before continuing } // add ui visualization to existing folder - if(data.context && data.context.data('type') === 'dir') { + if (data.context && data.context.data('type') === 'dir') { // add to existing folder // update upload counter ui @@ -734,7 +754,7 @@ $(document).ready(function(){ uploadtext.attr('currentUploads', currentUploads); var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); - if(currentUploads === 1) { + if (currentUploads === 1) { var img = OC.imagePath('core', 'loading.gif'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); uploadtext.text(translatedText); @@ -761,7 +781,7 @@ $(document).ready(function(){ } var result=$.parseJSON(response); - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { + if (typeof result[0] !== 'undefined' && result[0].status === 'success') { var file = result[0]; if (data.context && data.context.data('type') === 'dir') { @@ -772,7 +792,7 @@ $(document).ready(function(){ currentUploads -= 1; uploadtext.attr('currentUploads', currentUploads); var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); - if(currentUploads === 0) { + if (currentUploads === 0) { var img = OC.imagePath('core', 'filetypes/folder.png'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); uploadtext.text(translatedText); @@ -789,18 +809,18 @@ $(document).ready(function(){ } else { // only append new file if dragged onto current dir's crumb (last) - if (data.context && data.context.hasClass('crumb') && !data.context.hasClass('last')){ + if (data.context && data.context.hasClass('crumb') && !data.context.hasClass('last')) { return; } // add as stand-alone row to filelist var size=t('files', 'Pending'); - if (data.files[0].size>=0){ + if (data.files[0].size>=0) { size=data.files[0].size; } var date=new Date(); var param = {}; - if ($('#publicUploadRequestToken').length) { + if ($('#publicUploadRequestToken').exists()) { param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + file.name; } //should the file exist in the list remove it @@ -813,14 +833,14 @@ $(document).ready(function(){ data.context.attr('data-mime',file.mime).attr('data-id',file.id); var permissions = data.context.data('permissions'); - if(permissions !== file.permissions) { + if (permissions !== file.permissions) { data.context.attr('data-permissions', file.permissions); data.context.data('permissions', file.permissions); } FileActions.display(data.context.find('td.filename'), true); var path = getPathForPreview(file.name); - lazyLoadPreview(path, file.mime, function(previewpath){ + lazyLoadPreview(path, file.mime, function(previewpath) { data.context.find('td.filename').attr('style','background-image:url('+previewpath+')'); }); } @@ -854,10 +874,10 @@ $(document).ready(function(){ }); $('#notification').hide(); - $('#notification').on('click', '.undo', function(){ + $('#notification').on('click', '.undo', function() { if (FileList.deleteFiles) { - $.each(FileList.deleteFiles,function(index,file){ - $('tr').filterAttr('data-file',file).show(); + $.each(FileList.deleteFiles,function(index,file) { + $('tr[data-file="'+file+'"]').show(); }); FileList.deleteCanceled=true; FileList.deleteFiles=null; @@ -867,10 +887,10 @@ $(document).ready(function(){ FileList.deleteCanceled = false; FileList.deleteFiles = [FileList.replaceOldName]; } else { - $('tr').filterAttr('data-file', FileList.replaceOldName).show(); + $('tr[data-file="'+FileList.replaceOldName+'"]').show(); } - $('tr').filterAttr('data-replace', 'true').remove(); - $('tr').filterAttr('data-file', FileList.replaceNewName).show(); + $('tr[data-replace="true"').remove(); + $('tr[data-file="'+FileList.replaceNewName+'"]').show(); FileList.replaceCanceled = true; FileList.replaceOldName = null; FileList.replaceNewName = null; @@ -885,7 +905,7 @@ $(document).ready(function(){ }); }); $('#notification:first-child').on('click', '.suggest', function() { - $('tr').filterAttr('data-file', $('#notification > span').attr('data-oldName')).show(); + $('tr[data-file="'+$('#notification > span').attr('data-oldName')+'"]').show(); OC.Notification.hide(); }); $('#notification:first-child').on('click', '.cancel', function() { @@ -895,67 +915,67 @@ $(document).ready(function(){ } }); FileList.useUndo=(window.onbeforeunload)?true:false; - $(window).bind('beforeunload', function (){ + $(window).bind('beforeunload', function () { if (FileList.lastAction) { FileList.lastAction(); } }); - $(window).unload(function (){ + $(window).unload(function () { $(window).trigger('beforeunload'); }); - function decodeQuery(query){ + function decodeQuery(query) { return query.replace(/\+/g, ' '); } - function parseHashQuery(){ + function parseHashQuery() { var hash = window.location.hash, pos = hash.indexOf('?'), query; - if (pos >= 0){ + if (pos >= 0) { return hash.substr(pos + 1); } return ''; } - function parseCurrentDirFromUrl(){ + function parseCurrentDirFromUrl() { var query = parseHashQuery(), params, dir = '/'; // try and parse from URL hash first - if (query){ + if (query) { params = OC.parseQueryString(decodeQuery(query)); } // else read from query attributes - if (!params){ + if (!params) { params = OC.parseQueryString(decodeQuery(location.search)); } return (params && params.dir) || '/'; } // disable ajax/history API for public app (TODO: until it gets ported) - if (!isPublic){ + if (!isPublic) { // fallback to hashchange when no history support - if (!window.history.pushState){ - $(window).on('hashchange', function(){ + if (!window.history.pushState) { + $(window).on('hashchange', function() { FileList.changeDirectory(parseCurrentDirFromUrl(), false); }); } - window.onpopstate = function(e){ + window.onpopstate = function(e) { var targetDir; - if (e.state && e.state.dir){ + if (e.state && e.state.dir) { targetDir = e.state.dir; } else{ // read from URL targetDir = parseCurrentDirFromUrl(); } - if (targetDir){ + if (targetDir) { FileList.changeDirectory(targetDir, false); } - } + }; - if (parseInt($('#ajaxLoad').val(), 10) === 1){ + if (parseInt($('#ajaxLoad').val(), 10) === 1) { // need to initially switch the dir to the one from the hash (IE8) FileList.changeDirectory(parseCurrentDirFromUrl(), false, true); } diff --git a/apps/files/js/files.js b/apps/files/js/files.js index c3a8d81b50d..3567904f2f2 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,18 +1,18 @@ Files={ updateMaxUploadFilesize:function(response) { - if(response == undefined) { + if (response === undefined) { return; } - if(response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { + if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { $('#max_upload').val(response.data.uploadMaxFilesize); $('#upload.button').attr('original-title', response.data.maxHumanFilesize); $('#usedSpacePercent').val(response.data.usedSpacePercent); Files.displayStorageWarnings(); } - if(response[0] == undefined) { + if (response[0] === undefined) { return; } - if(response[0].uploadMaxFilesize !== undefined) { + if (response[0].uploadMaxFilesize !== undefined) { $('#max_upload').val(response[0].uploadMaxFilesize); $('#upload.button').attr('original-title', response[0].maxHumanFilesize); $('#usedSpacePercent').val(response[0].usedSpacePercent); @@ -22,23 +22,18 @@ Files={ }, isFileNameValid:function (name) { if (name === '.') { - OC.Notification.show(t('files', '\'.\' is an invalid file name.')); - return false; - } - if (name.length == 0) { - OC.Notification.show(t('files', 'File name cannot be empty.')); - return false; + throw t('files', '\'.\' is an invalid file name.'); + } else if (name.length === 0) { + throw t('files', 'File name cannot be empty.'); } // check for invalid characters var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*']; for (var i = 0; i < invalid_characters.length; i++) { - if (name.indexOf(invalid_characters[i]) != -1) { - OC.Notification.show(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.")); - return false; + if (name.indexOf(invalid_characters[i]) !== -1) { + throw t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."); } } - OC.Notification.hide(); return true; }, displayStorageWarnings: function() { @@ -78,18 +73,18 @@ Files={ } }, - setupDragAndDrop: function(){ + setupDragAndDrop: function() { var $fileList = $('#fileList'); //drag/drop of files - $fileList.find('tr td.filename').each(function(i,e){ + $fileList.find('tr td.filename').each(function(i,e) { if ($(e).parent().data('permissions') & OC.PERMISSION_DELETE) { $(e).draggable(dragOptions); } }); - $fileList.find('tr[data-type="dir"] td.filename').each(function(i,e){ - if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE){ + $fileList.find('tr[data-type="dir"] td.filename').each(function(i,e) { + if ($(e).parent().data('permissions') & OC.PERMISSION_CREATE) { $(e).droppable(folderDropOptions); } }); @@ -127,9 +122,9 @@ Files={ }, resizeBreadcrumbs: function (width, firstRun) { - if (width != Files.lastWidth) { + if (width !== Files.lastWidth) { if ((width < Files.lastWidth || firstRun) && width < Files.breadcrumbsWidth) { - if (Files.hiddenBreadcrumbs == 0) { + if (Files.hiddenBreadcrumbs === 0) { Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth; $(Files.breadcrumbs[1]).find('a').hide(); $(Files.breadcrumbs[1]).append('...'); @@ -141,12 +136,12 @@ Files={ Files.breadcrumbsWidth -= $(Files.breadcrumbs[i]).get(0).offsetWidth; $(Files.breadcrumbs[i]).hide(); Files.hiddenBreadcrumbs = i; - i++ + i++; } } else if (width > Files.lastWidth && Files.hiddenBreadcrumbs > 0) { var i = Files.hiddenBreadcrumbs; while (width > Files.breadcrumbsWidth && i > 0) { - if (Files.hiddenBreadcrumbs == 1) { + if (Files.hiddenBreadcrumbs === 1) { Files.breadcrumbsWidth -= $(Files.breadcrumbs[1]).get(0).offsetWidth; $(Files.breadcrumbs[1]).find('span').remove(); $(Files.breadcrumbs[1]).find('a').show(); @@ -170,7 +165,7 @@ Files={ }; $(document).ready(function() { // FIXME: workaround for trashbin app - if (window.trashBinApp){ + if (window.trashBinApp) { return; } Files.displayEncryptionWarning(); @@ -215,7 +210,7 @@ $(document).ready(function() { var rows = $(this).parent().parent().parent().children('tr'); for (var i = start; i < end; i++) { $(rows).each(function(index) { - if (index == i) { + if (index === i) { var checkbox = $(this).children().children('input:checkbox'); $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().addClass('selected'); @@ -232,23 +227,23 @@ $(document).ready(function() { } else { $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().toggleClass('selected'); - var selectedCount=$('td.filename input:checkbox:checked').length; - if (selectedCount == $('td.filename input:checkbox').length) { + var selectedCount = $('td.filename input:checkbox:checked').length; + if (selectedCount === $('td.filename input:checkbox').length) { $('#select_all').attr('checked', 'checked'); } } procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - var tr=$('tr').filterAttr('data-file',filename); + var tr=$('tr[data-file="'+filename+'"]'); var renaming=tr.data('renaming'); - if(!renaming && !FileList.isLoading(filename)){ + if (!renaming && !FileList.isLoading(filename)) { FileActions.currentFile = $(this).parent(); var mime=FileActions.getCurrentMimeType(); var type=FileActions.getCurrentType(); var permissions = FileActions.getCurrentPermissions(); var action=FileActions.getDefault(mime,type, permissions); - if(action){ + if (action) { event.preventDefault(); action(filename); } @@ -259,11 +254,11 @@ $(document).ready(function() { // Sets the select_all checkbox behaviour : $('#select_all').click(function() { - if($(this).attr('checked')){ + if ($(this).attr('checked')) { // Check all $('td.filename input:checkbox').attr('checked', true); $('td.filename input:checkbox').parent().parent().addClass('selected'); - }else{ + } else { // Uncheck all $('td.filename input:checkbox').attr('checked', false); $('td.filename input:checkbox').parent().parent().removeClass('selected'); @@ -280,7 +275,7 @@ $(document).ready(function() { var rows = $(this).parent().parent().parent().children('tr'); for (var i = start; i < end; i++) { $(rows).each(function(index) { - if (index == i) { + if (index === i) { var checkbox = $(this).children().children('input:checkbox'); $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().addClass('selected'); @@ -290,10 +285,10 @@ $(document).ready(function() { } var selectedCount=$('td.filename input:checkbox:checked').length; $(this).parent().parent().toggleClass('selected'); - if(!$(this).attr('checked')){ + if (!$(this).attr('checked')) { $('#select_all').attr('checked',false); - }else{ - if(selectedCount==$('td.filename input:checkbox').length){ + } else { + if (selectedCount===$('td.filename input:checkbox').length) { $('#select_all').attr('checked',true); } } @@ -306,10 +301,11 @@ $(document).ready(function() { var dir=$('#dir').val()||'/'; OC.Notification.show(t('files','Your download is being prepared. This might take some time if the files are big.')); // use special download URL if provided, e.g. for public shared files - if ( (downloadURL = document.getElementById("downloadURL")) ) { - window.location=downloadURL.value+"&download&files="+encodeURIComponent(fileslist); + var downloadURL = document.getElementById("downloadURL"); + if ( downloadURL ) { + window.location = downloadURL.value+"&download&files=" + encodeURIComponent(fileslist); } else { - window.location=OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist }); + window.location = OC.filePath('files', 'ajax', 'download.php') + '?'+ $.param({ dir: dir, files: fileslist }); } return false; }); @@ -376,12 +372,12 @@ $(document).ready(function() { } }); -function scanFiles(force, dir, users){ +function scanFiles(force, dir, users) { if (!OC.currentUser) { return; } - if(!dir){ + if (!dir) { dir = ''; } force = !!force; //cast to bool @@ -399,17 +395,17 @@ function scanFiles(force, dir, users){ scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir}); } scanFiles.cancel = scannerEventSource.close.bind(scannerEventSource); - scannerEventSource.listen('count',function(count){ - console.log(count + ' files scanned') + scannerEventSource.listen('count',function(count) { + console.log(count + ' files scanned'); }); - scannerEventSource.listen('folder',function(path){ - console.log('now scanning ' + path) + scannerEventSource.listen('folder',function(path) { + console.log('now scanning ' + path); }); - scannerEventSource.listen('done',function(count){ + scannerEventSource.listen('done',function(count) { scanFiles.scanning=false; console.log('done after ' + count + ' files'); }); - scannerEventSource.listen('user',function(user){ + scannerEventSource.listen('user',function(user) { console.log('scanning files for ' + user); }); } @@ -418,14 +414,14 @@ scanFiles.scanning=false; function boolOperationFinished(data, callback) { result = jQuery.parseJSON(data.responseText); Files.updateMaxUploadFilesize(result); - if(result.status == 'success'){ + if (result.status === 'success') { callback.call(); } else { alert(result.data.message); } } -var createDragShadow = function(event){ +var createDragShadow = function(event) { //select dragged file var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked'); if (!isDragSelected) { @@ -435,7 +431,7 @@ var createDragShadow = function(event){ var selectedFiles = getSelectedFilesTrash(); - if (!isDragSelected && selectedFiles.length == 1) { + if (!isDragSelected && selectedFiles.length === 1) { //revert the selection $(event.target).parents('tr').find('td input:first').prop('checked',false); } @@ -452,7 +448,7 @@ var createDragShadow = function(event){ var dir=$('#dir').val(); - $(selectedFiles).each(function(i,elem){ + $(selectedFiles).each(function(i,elem) { var newtr = $('').attr('data-dir', dir).attr('data-filename', elem.name); newtr.append($('').addClass('filename').text(elem.name)); newtr.append($('').addClass('size').text(humanFileSize(elem.size))); @@ -461,14 +457,14 @@ var createDragShadow = function(event){ newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')'); } else { var path = getPathForPreview(elem.name); - lazyLoadPreview(path, elem.mime, function(previewpath){ + lazyLoadPreview(path, elem.mime, function(previewpath) { newtr.find('td.filename').attr('style','background-image:url('+previewpath+')'); }); } }); return dragshadow; -} +}; //options for file drag/drop var dragOptions={ @@ -478,7 +474,7 @@ var dragOptions={ stop: function(event, ui) { $('#fileList tr td.filename').addClass('ui-draggable'); } -} +}; // sane browsers support using the distance option if ( $('html.ie').length === 0) { dragOptions['distance'] = 20; @@ -491,20 +487,20 @@ var folderDropOptions={ return false; } - var target=$.trim($(this).find('.nametext').text()); + var target = $.trim($(this).find('.nametext').text()); var files = ui.helper.find('tr'); - $(files).each(function(i,row){ + $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: dir+'/'+target }, function(result) { if (result) { if (result.status === 'success') { //recalculate folder size - var oldSize = $('#fileList tr').filterAttr('data-file',target).data('size'); - var newSize = oldSize + $('#fileList tr').filterAttr('data-file',file).data('size'); - $('#fileList tr').filterAttr('data-file',target).data('size', newSize); - $('#fileList tr').filterAttr('data-file',target).find('td.filesize').text(humanFileSize(newSize)); + var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size'); + var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size'); + $('#fileList tr[data-file="'+target+'"]').data('size', newSize); + $('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize)); FileList.remove(file); procesSelection(); @@ -521,24 +517,24 @@ var folderDropOptions={ }); }, tolerance: 'pointer' -} +}; var crumbDropOptions={ drop: function( event, ui ) { var target=$(this).data('dir'); - var dir=$('#dir').val(); - while(dir.substr(0,1)=='/'){//remove extra leading /'s + var dir = $('#dir').val(); + while(dir.substr(0,1) === '/') {//remove extra leading /'s dir=dir.substr(1); } - dir='/'+dir; - if(dir.substr(-1,1)!='/'){ - dir=dir+'/'; + dir = '/' + dir; + if (dir.substr(-1,1) !== '/') { + dir = dir + '/'; } - if(target==dir || target+'/'==dir){ + if (target === dir || target+'/' === dir) { return; } var files = ui.helper.find('tr'); - $(files).each(function(i,row){ + $(files).each(function(i,row) { var dir = $(row).data('dir'); var file = $(row).data('filename'); $.post(OC.filePath('files', 'ajax', 'move.php'), { dir: dir, file: file, target: target }, function(result) { @@ -559,13 +555,17 @@ var crumbDropOptions={ }); }, tolerance: 'pointer' -} +}; -function procesSelection(){ - var selected=getSelectedFilesTrash(); - var selectedFiles=selected.filter(function(el){return el.type=='file'}); - var selectedFolders=selected.filter(function(el){return el.type=='dir'}); - if(selectedFiles.length==0 && selectedFolders.length==0) { +function procesSelection() { + var selected = getSelectedFilesTrash(); + var selectedFiles = selected.filter(function(el) { + return el.type==='file'; + }); + var selectedFolders = selected.filter(function(el) { + return el.type==='dir'; + }); + if (selectedFiles.length === 0 && selectedFolders.length === 0) { $('#headerName>span.name').text(t('files','Name')); $('#headerSize').text(t('files','Size')); $('#modified').text(t('files','Modified')); @@ -574,22 +574,22 @@ function procesSelection(){ } else { $('.selectedActions').show(); - var totalSize=0; - for(var i=0;i0){ + var selection = ''; + if (selectedFolders.length > 0) { selection += n('files', '%n folder', '%n folders', selectedFolders.length); - if(selectedFiles.length>0){ - selection+=' & '; + if (selectedFiles.length > 0) { + selection += ' & '; } } - if(selectedFiles.length>0){ + if (selectedFiles.length>0) { selection += n('files', '%n file', '%n files', selectedFiles.length); } $('#headerName>span.name').text(selection); @@ -600,37 +600,37 @@ function procesSelection(){ /** * @brief get a list of selected files - * @param string property (option) the property of the file requested - * @return array + * @param {string} property (option) the property of the file requested + * @return {array} * * possible values for property: name, mime, size and type * if property is set, an array with that property for each file is returnd * if it's ommited an array of objects with all properties is returned */ -function getSelectedFilesTrash(property){ +function getSelectedFilesTrash(property) { var elements=$('td.filename input:checkbox:checked').parent().parent(); var files=[]; - elements.each(function(i,element){ + elements.each(function(i,element) { var file={ name:$(element).attr('data-file'), mime:$(element).data('mime'), type:$(element).data('type'), size:$(element).data('size') }; - if(property){ + if (property) { files.push(file[property]); - }else{ + } else { files.push(file); } }); return files; } -function getMimeIcon(mime, ready){ - if(getMimeIcon.cache[mime]){ +function getMimeIcon(mime, ready) { + if (getMimeIcon.cache[mime]) { ready(getMimeIcon.cache[mime]); - }else{ - $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path){ + } else { + $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) { getMimeIcon.cache[mime]=path; ready(getMimeIcon.cache[mime]); }); @@ -655,7 +655,7 @@ function lazyLoadPreview(path, mime, ready, width, height) { if ( ! height ) { height = $('#filestable').data('preview-y'); } - if( $('#publicUploadButtonMock').length ) { + if ( $('#publicUploadButtonMock').length ) { var previewURL = OC.Router.generate('core_ajax_public_preview', {file: path, x:width, y:height, t:$('#dirToken').val()}); } else { var previewURL = OC.Router.generate('core_ajax_preview', {file: path, x:width, y:height}); @@ -669,8 +669,8 @@ function lazyLoadPreview(path, mime, ready, width, height) { }); } -function getUniqueName(name){ - if($('tr').filterAttr('data-file',name).length>0){ +function getUniqueName(name) { + if ($('tr[data-file="'+name+'"]').exists()) { var parts=name.split('.'); var extension = ""; if (parts.length > 1) { @@ -679,9 +679,9 @@ function getUniqueName(name){ var base=parts.join('.'); numMatch=base.match(/\((\d+)\)/); var num=2; - if(numMatch && numMatch.length>0){ + if (numMatch && numMatch.length>0) { num=parseInt(numMatch[numMatch.length-1])+1; - base=base.split('(') + base=base.split('('); base.pop(); base=$.trim(base.join('(')); } @@ -695,19 +695,19 @@ function getUniqueName(name){ } function checkTrashStatus() { - $.post(OC.filePath('files_trashbin', 'ajax', 'isEmpty.php'), function(result){ + $.post(OC.filePath('files_trashbin', 'ajax', 'isEmpty.php'), function(result) { if (result.data.isEmpty === false) { $("input[type=button][id=trash]").removeAttr("disabled"); } }); } -function onClickBreadcrumb(e){ +function onClickBreadcrumb(e) { var $el = $(e.target).closest('.crumb'), $targetDir = $el.data('dir'); isPublic = !!$('#isPublic').val(); - if ($targetDir !== undefined && !isPublic){ + if ($targetDir !== undefined && !isPublic) { e.preventDefault(); FileList.changeDirectory(decodeURIComponent($targetDir)); } diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php index 579e8676cfc..ccf629ae3cb 100644 --- a/apps/files/lib/app.php +++ b/apps/files/lib/app.php @@ -52,7 +52,15 @@ class App { $result['data'] = array( 'message' => $this->l10n->t("Invalid folder name. Usage of 'Shared' is reserved by ownCloud") ); - } elseif( + // rename to existing file is denied + } else if ($this->view->file_exists($dir . '/' . $newname)) { + + $result['data'] = array( + 'message' => $this->l10n->t( + "The name %s is already used in the folder %s. Please choose a different name.", + array($newname, $dir)) + ); + } else if ( // rename to "." is denied $newname !== '.' and // rename of "/Shared" is denied diff --git a/core/js/js.js b/core/js/js.js index c17e3fa2959..f5991cfc9dd 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -933,7 +933,7 @@ jQuery.fn.selectRange = function(start, end) { */ jQuery.fn.exists = function(){ return this.length > 0; -} +}; /** * Calls the server periodically every 15 mins to ensure that session doesnt -- cgit v1.2.3 From e62ca4ea4fc235d7ec767034a80889b2fa331e97 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 28 Oct 2013 11:22:34 +0100 Subject: Append file etag to preview URLs Fixes #5534 --- apps/files/ajax/newfile.php | 3 +- apps/files/ajax/upload.php | 2 + apps/files/js/file-upload.js | 9 +++-- apps/files/js/filelist.js | 10 ++--- apps/files/js/files.js | 80 +++++++++++++++++++++++++------------- apps/files/lib/helper.php | 2 +- apps/files/templates/part.list.php | 1 + apps/files_sharing/public.php | 2 +- core/js/oc-dialogs.js | 6 +-- lib/private/helper.php | 4 +- 10 files changed, 75 insertions(+), 44 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index eed0047fc81..9d9a81ae3dc 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -89,7 +89,7 @@ if($source) { $meta = \OC\Files\Filesystem::getFileInfo($target); $mime=$meta['mimetype']; $id = $meta['fileid']; - $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id)); + $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id, 'etag' => $meta['etag'])); } else { $eventSource->send('error', $l10n->t('Error while downloading %s to %s', array($source, $target))); } @@ -119,6 +119,7 @@ if($source) { 'mime' => $mime, 'size' => $size, 'content' => $content, + 'etag' => $meta['etag'] ))); exit(); } diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 38c2a053a9e..0e905f993ac 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -132,6 +132,7 @@ if (strpos($dir, '..') === false) { 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), + 'etag' => $meta['etag'], 'originalname' => $files['tmp_name'][$i], 'uploadMaxFilesize' => $maxUploadFileSize, 'maxHumanFilesize' => $maxHumanFileSize, @@ -158,6 +159,7 @@ if (strpos($dir, '..') === false) { 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), + 'etag' => $meta['etag'], 'originalname' => $files['tmp_name'][$i], 'uploadMaxFilesize' => $maxUploadFileSize, 'maxHumanFilesize' => $maxHumanFileSize, diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 5bf4f5c0981..af67a0e2002 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -566,11 +566,12 @@ $(document).ready(function() { tr.attr('data-size', result.data.size); tr.attr('data-mime', result.data.mime); tr.attr('data-id', result.data.id); + tr.attr('data-etag', result.data.etag); tr.find('.filesize').text(humanFileSize(result.data.size)); var path = getPathForPreview(name); - lazyLoadPreview(path, result.data.mime, function(previewpath) { + Files.lazyLoadPreview(path, result.data.mime, function(previewpath) { tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, result.data.etag); FileActions.display(tr.find('td.filename'), true); } else { OC.dialogs.alert(result.data.message, t('core', 'Could not create file')); @@ -632,9 +633,9 @@ $(document).ready(function() { tr.data('mime', mime).data('id', id); tr.attr('data-id', id); var path = $('#dir').val()+'/'+localName; - lazyLoadPreview(path, mime, function(previewpath) { + Files.lazyLoadPreview(path, mime, function(previewpath) { tr.find('td.filename').attr('style', 'background-image:url('+previewpath+')'); - }); + }, null, null, data.etag); FileActions.display(tr.find('td.filename'), true); }); eventSource.listen('error',function(error) { diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index c33a06bbdc3..b05f42a79a8 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -326,9 +326,9 @@ var FileList={ tr.attr('data-id', id); } var path = getPathForPreview(name); - lazyLoadPreview(path, mime, function(previewpath) { + Files.lazyLoadPreview(path, mime, function(previewpath) { tr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, tr.attr('data-etag')); tr.find('td.filename').draggable(dragOptions); }, isLoading:function(name) { @@ -863,7 +863,7 @@ $(document).ready(function() { data.context = FileList.addFile(file.name, file.size, date, false, false, param); // update file data - data.context.attr('data-mime',file.mime).attr('data-id',file.id); + data.context.attr('data-mime',file.mime).attr('data-id',file.id).attr('data-etag', file.etag); var permissions = data.context.data('permissions'); if (permissions !== file.permissions) { @@ -873,9 +873,9 @@ $(document).ready(function() { FileActions.display(data.context.find('td.filename'), true); var path = getPathForPreview(file.name); - lazyLoadPreview(path, file.mime, function(previewpath) { + Files.lazyLoadPreview(path, file.mime, function(previewpath) { data.context.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, file.etag); } } }); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 389bf1bf197..ee0fdcb43a9 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -20,6 +20,17 @@ Files={ } }, + + /** + * Fix path name by removing double slash at the beginning, if any + */ + fixPath: function(fileName) { + if (fileName.substr(0, 2) == '//') { + return fileName.substr(1); + } + return fileName; + }, + isFileNameValid:function (name) { if (name === '.') { throw t('files', '\'.\' is an invalid file name.'); @@ -457,9 +468,9 @@ var createDragShadow = function(event) { newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')'); } else { var path = getPathForPreview(elem.name); - lazyLoadPreview(path, elem.mime, function(previewpath) { + Files.lazyLoadPreview(path, elem.mime, function(previewpath) { newtr.find('td.filename').attr('style','background-image:url('+previewpath+')'); - }); + }, null, null, elem.etag); } }); @@ -626,26 +637,28 @@ function getSelectedFilesTrash(property) { return files; } -function getMimeIcon(mime, ready) { - if (getMimeIcon.cache[mime]) { - ready(getMimeIcon.cache[mime]); +Files.getMimeIcon = function(mime, ready) { + if (Files.getMimeIcon.cache[mime]) { + ready(Files.getMimeIcon.cache[mime]); } else { $.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) { - getMimeIcon.cache[mime]=path; - ready(getMimeIcon.cache[mime]); + Files.getMimeIcon.cache[mime]=path; + ready(Files.getMimeIcon.cache[mime]); }); } } -getMimeIcon.cache={}; +Files.getMimeIcon.cache={}; function getPathForPreview(name) { var path = $('#dir').val() + '/' + name; return path; } -function lazyLoadPreview(path, mime, ready, width, height) { +Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) { // get mime icon url - getMimeIcon(mime, function(iconURL) { + Files.getMimeIcon(mime, function(iconURL) { + var urlSpec = {}; + var previewURL; ready(iconURL); // set mimeicon URL // now try getting a preview thumbnail URL @@ -655,25 +668,38 @@ function lazyLoadPreview(path, mime, ready, width, height) { if ( ! height ) { height = $('#filestable').data('preview-y'); } + // note: the order of arguments must match the one + // from the server's template so that the browser + // knows it's the same file for caching + urlSpec.x = width; + urlSpec.y = height; + urlSpec.file = Files.fixPath(path); + + if (etag){ + // use etag as cache buster + urlSpec.c = etag; + } + else { + console.warn('Files.lazyLoadPreview(): missing etag argument'); + } + if ( $('#publicUploadButtonMock').length ) { - var previewURL = OC.Router.generate('core_ajax_public_preview', {file: path, x:width, y:height, t:$('#dirToken').val()}); + urlSpec.t = $('#dirToken').val(); + previewURL = OC.Router.generate('core_ajax_public_preview', urlSpec); } else { - var previewURL = OC.Router.generate('core_ajax_preview', {file: path, x:width, y:height}); - } - $.get(previewURL, function() { - previewURL = previewURL.replace('(', '%28'); - previewURL = previewURL.replace(')', '%29'); - previewURL += '&reload=true'; - - // preload image to prevent delay - // this will make the browser cache the image - var img = new Image(); - img.onload = function(){ - //set preview thumbnail URL - ready(previewURL); - } - img.src = previewURL; - }); + previewURL = OC.Router.generate('core_ajax_preview', urlSpec); + } + previewURL = previewURL.replace('(', '%28'); + previewURL = previewURL.replace(')', '%29'); + + // preload image to prevent delay + // this will make the browser cache the image + var img = new Image(); + img.onload = function(){ + //set preview thumbnail URL + ready(previewURL); + } + img.src = previewURL; }); } diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index 709d78a4d45..7692dd67574 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -40,7 +40,7 @@ class Helper if($file['isPreviewAvailable']) { $pathForPreview = $file['directory'] . '/' . $file['name']; - return \OC_Helper::previewIcon($pathForPreview); + return \OC_Helper::previewIcon($pathForPreview) . '&c=' . $file['etag']; } return \OC_Helper::mimetypeIcon($file['mimetype']); } diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index a6d2e44f34f..2f630e1f014 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -16,6 +16,7 @@ $totalsize = 0; ?> data-type="" data-mime="" data-size="" + data-etag="" data-permissions=""> 36, 'y' => 36, 'file' => urlencode($path) )); + return self::linkToRoute( 'core_ajax_preview', array('x' => 36, 'y' => 36, 'file' => $path )); } public static function publicPreviewIcon( $path, $token ) { - return self::linkToRoute( 'core_ajax_public_preview', array('x' => 36, 'y' => 36, 'file' => urlencode($path), 't' => $token)); + return self::linkToRoute( 'core_ajax_public_preview', array('x' => 36, 'y' => 36, 'file' => $path, 't' => $token)); } /** -- cgit v1.2.3 From efbd79198b3fed8480566c81397f530dea7e7b5c Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 28 Oct 2013 15:41:52 +0100 Subject: Fixed preview URL + size while dragging an existing file --- apps/files/css/files.css | 3 ++- apps/files/js/files.js | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/css/files.css b/apps/files/css/files.css index af8597192f3..b9bf8cb87c1 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -320,8 +320,9 @@ table.dragshadow { width:auto; } table.dragshadow td.filename { - padding-left:36px; + padding-left:60px; padding-right:16px; + height: 36px; } table.dragshadow td.size { padding-right:8px; diff --git a/apps/files/js/files.js b/apps/files/js/files.js index ee0fdcb43a9..c0acfb4fc2b 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -480,7 +480,7 @@ var createDragShadow = function(event) { //options for file drag/drop var dragOptions={ revert: 'invalid', revertDuration: 300, - opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: -5, top: -5 }, + opacity: 0.7, zIndex: 100, appendTo: 'body', cursorAt: { left: 24, top: 18 }, helper: createDragShadow, cursor: 'move', stop: function(event, ui) { $('#fileList tr td.filename').addClass('ui-draggable'); @@ -626,7 +626,8 @@ function getSelectedFilesTrash(property) { name:$(element).attr('data-file'), mime:$(element).data('mime'), type:$(element).data('type'), - size:$(element).data('size') + size:$(element).data('size'), + etag:$(element).data('etag') }; if (property) { files.push(file[property]); -- cgit v1.2.3 From a4be1ebeb8e596a1f44eae546dbe872544a219f0 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 31 Oct 2013 14:31:57 +0100 Subject: use data-file to retrieve filename forward port of https://github.com/owncloud/core/pull/5647#discussion-diff-7341163 trust me, I know what I'm doing --- apps/files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 389bf1bf197..950dae2f925 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -487,7 +487,7 @@ var folderDropOptions={ return false; } - var target = $.trim($(this).find('.nametext').text()); + var target = $(this).parent('tr').data('file'); var files = ui.helper.find('tr'); $(files).each(function(i,row) { -- cgit v1.2.3 From adb5de4a888c01863b58cd50bd21ab2d4d17cace Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 31 Oct 2013 15:56:02 +0100 Subject: prefer closest over parent closest will search up the tree --- apps/files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 950dae2f925..0b10fa8c63a 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -487,7 +487,7 @@ var folderDropOptions={ return false; } - var target = $(this).parent('tr').data('file'); + var target = $(this).closest('tr').data('file'); var files = ui.helper.find('tr'); $(files).each(function(i,row) { -- cgit v1.2.3 From b869fb2a0961e5cb5a6233626721b14f5e1cfdd8 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 5 Nov 2013 12:18:25 +0100 Subject: calling getstoragestats.php only if a user is logged in because this call requires a user to be logged in --- apps/files/js/files.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 5fa2b128153..eb30ddfda0f 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -357,24 +357,26 @@ $(document).ready(function() { Files.updateMaxUploadFilesize(response); }); } - - // start on load - we ask the server every 5 minutes - var update_storage_statistics_interval = 5*60*1000; - var update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); - - // Use jquery-visibility to de-/re-activate file stats sync - if ($.support.pageVisibility) { - $(document).on({ - 'show.visibility': function() { - if (!update_storage_statistics_interval_id) { - update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + // only possible at the moment if user is logged in + if (OC.currentUser) { + // start on load - we ask the server every 5 minutes + var update_storage_statistics_interval = 5*60*1000; + var update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + + // Use jquery-visibility to de-/re-activate file stats sync + if ($.support.pageVisibility) { + $(document).on({ + 'show.visibility': function() { + if (!update_storage_statistics_interval_id) { + update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + } + }, + 'hide.visibility': function() { + clearInterval(update_storage_statistics_interval_id); + update_storage_statistics_interval_id = 0; } - }, - 'hide.visibility': function() { - clearInterval(update_storage_statistics_interval_id); - update_storage_statistics_interval_id = 0; - } - }); + }); + } } //scroll to and highlight preselected file -- cgit v1.2.3 From 5d9ab6e7ac161a2431d9baca59281c03015b4ff5 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 6 Nov 2013 10:15:05 +0100 Subject: Update quota value in client after scan and upload After uploading, the quota value wasn't refreshed. This fix refreshes the quota value after files have been scanned or uploaded. --- apps/files/js/file-upload.js | 2 +- apps/files/js/filelist.js | 1 + apps/files/js/files.js | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 33 insertions(+), 13 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 94290895ebd..553ca036360 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -404,7 +404,7 @@ $(document).ready(function() { $('#uploadprogresswrapper input.stop').fadeOut(); $('#uploadprogressbar').fadeOut(); - + Files.updateStorageStatistics(); }); fileupload.on('fileuploadfail', function(e, data) { OC.Upload.log('progress handle fileuploadfail', e, data); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 3ef3c2c1766..66b4a006f88 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -554,6 +554,7 @@ var FileList={ checkTrashStatus(); FileList.updateFileSummary(); FileList.updateEmptyContent(); + Files.updateStorageStatistics(); } else { $.each(files,function(index,file) { var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete"); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index eb30ddfda0f..a7aea0957bd 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,4 +1,28 @@ Files={ + // file space size sync + _updateStorageStatistics: function() { + Files._updateStorageStatisticsTimeout = null; + if (Files.updateStorageStatistics.running){ + return; + } + Files.updateStorageStatistics.running = true; + $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) { + Files.updateStorageStatistics.running = false; + Files.updateMaxUploadFilesize(response); + }); + }, + updateStorageStatistics: function() { + if (!OC.currentUser) { + return; + } + + // debounce to prevent calling too often + if (Files._updateStorageStatisticsTimeout) { + clearTimeout(Files._updateStorageStatisticsTimeout); + } + Files._updateStorageStatisticsTimeout = setTimeout(Files._updateStorageStatistics, 1000); + }, + updateMaxUploadFilesize:function(response) { if (response === undefined) { return; @@ -351,29 +375,23 @@ $(document).ready(function() { setTimeout ( "Files.displayStorageWarnings()", 100 ); OC.Notification.setDefault(Files.displayStorageWarnings); - // file space size sync - function update_storage_statistics() { - $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) { - Files.updateMaxUploadFilesize(response); - }); - } // only possible at the moment if user is logged in if (OC.currentUser) { // start on load - we ask the server every 5 minutes - var update_storage_statistics_interval = 5*60*1000; - var update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + var updateStorageStatisticsInterval = 5*60*1000; + var updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); // Use jquery-visibility to de-/re-activate file stats sync if ($.support.pageVisibility) { $(document).on({ 'show.visibility': function() { - if (!update_storage_statistics_interval_id) { - update_storage_statistics_interval_id = setInterval(update_storage_statistics, update_storage_statistics_interval); + if (!updateStorageStatisticsIntervalId) { + updateStorageStatisticsIntervalId = setInterval(Files.updateStorageStatistics, updateStorageStatisticsInterval); } }, 'hide.visibility': function() { - clearInterval(update_storage_statistics_interval_id); - update_storage_statistics_interval_id = 0; + clearInterval(updateStorageStatisticsIntervalId); + updateStorageStatisticsIntervalId = 0; } }); } @@ -417,6 +435,7 @@ function scanFiles(force, dir, users) { scannerEventSource.listen('done',function(count) { scanFiles.scanning=false; console.log('done after ' + count + ' files'); + Files.updateStorageStatistics(); }); scannerEventSource.listen('user',function(user) { console.log('scanning files for ' + user); -- cgit v1.2.3 From 31181e4348b9af2625cf4d6ad38cf4cd81db3c1f Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 6 Nov 2013 10:55:19 +0100 Subject: Fixed storage stats to be based on current directory Previously, the storage statistics were always for the root dir. This means that the upload button would always show the limit for the root dir, even when uploading to a shared dir or external storage. This fix adds a "dir" argument to getstoragestats.php. --- apps/files/ajax/getstoragestats.php | 8 +++++++- apps/files/js/filelist.js | 7 +++++++ apps/files/js/files.js | 26 +++++++++++++++++++------- 3 files changed, 33 insertions(+), 8 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php index 32a77bff6c3..dd7c7dc5571 100644 --- a/apps/files/ajax/getstoragestats.php +++ b/apps/files/ajax/getstoragestats.php @@ -3,7 +3,13 @@ // only need filesystem apps $RUNTIME_APPTYPES = array('filesystem'); +$dir = '/'; + +if (isset($_GET['dir'])) { + $dir = $_GET['dir']; +} + OCP\JSON::checkLoggedIn(); // send back json -OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics('/'))); +OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir))); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 66b4a006f88..006bd1f4966 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -152,6 +152,9 @@ var FileList={ FileActions.display(tr.find('td.filename'), true); return tr; }, + getCurrentDirectory: function(){ + return $('#dir').val() || '/'; + }, /** * @brief Changes the current directory and reload the file list. * @param targetDir target directory (non URL encoded) @@ -224,6 +227,10 @@ var FileList={ return; } + // TODO: should rather return upload file size through + // the files list ajax call + Files.updateStorageStatistics(true); + if (result.data.permissions) { FileList.setDirectoryPermissions(result.data.permissions); } diff --git a/apps/files/js/files.js b/apps/files/js/files.js index a7aea0957bd..2947512ece5 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -2,16 +2,23 @@ Files={ // file space size sync _updateStorageStatistics: function() { Files._updateStorageStatisticsTimeout = null; - if (Files.updateStorageStatistics.running){ - return; + var currentDir = FileList.getCurrentDirectory(), + state = Files.updateStorageStatistics; + if (state.dir){ + if (state.dir === currentDir) { + return; + } + // cancel previous call, as it was for another dir + state.call.abort(); } - Files.updateStorageStatistics.running = true; - $.getJSON(OC.filePath('files','ajax','getstoragestats.php'),function(response) { - Files.updateStorageStatistics.running = false; + state.dir = currentDir; + state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php') + '?dir=' + encodeURIComponent(currentDir),function(response) { + state.dir = null; + state.call = null; Files.updateMaxUploadFilesize(response); }); }, - updateStorageStatistics: function() { + updateStorageStatistics: function(force) { if (!OC.currentUser) { return; } @@ -20,7 +27,12 @@ Files={ if (Files._updateStorageStatisticsTimeout) { clearTimeout(Files._updateStorageStatisticsTimeout); } - Files._updateStorageStatisticsTimeout = setTimeout(Files._updateStorageStatistics, 1000); + if (force) { + Files._updateStorageStatistics(); + } + else { + Files._updateStorageStatisticsTimeout = setTimeout(Files._updateStorageStatistics, 250); + } }, updateMaxUploadFilesize:function(response) { -- cgit v1.2.3 From e285e84e18aa622fd97cde0c9ae41185c06d78df Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 11 Nov 2013 17:14:40 +0100 Subject: Selection summary is now displayed properly Fixes #5775 --- apps/files/js/files.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 2947512ece5..fdaa3aa3342 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -636,7 +636,7 @@ function procesSelection() { if (selectedFiles.length>0) { selection += n('files', '%n file', '%n files', selectedFiles.length); } - $('#headerName>span.name').text(selection); + $('#headerName span.name').text(selection); $('#modified').text(''); $('table').addClass('multiselect'); } -- cgit v1.2.3 From 1042733634622b234beb52e24505d56a9883b4eb Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 10 Jan 2014 15:02:26 +0100 Subject: Fixed various file name escaping issues in core apps - Refactored file tr lookup into FileList.findFileEl that uses filterAttr to avoid escaping issues in jQuery selectors - Fixed versions and sharing app to properly escape file names in attributes --- apps/files/js/file-upload.js | 12 ++++++++-- apps/files/js/fileactions.js | 2 +- apps/files/js/filelist.js | 49 +++++++++++++++++++++++--------------- apps/files/js/files.js | 14 ++++++----- apps/files_sharing/js/public.js | 6 ++--- apps/files_sharing/js/share.js | 2 +- apps/files_trashbin/js/trash.js | 14 +++++------ apps/files_versions/js/versions.js | 16 ++++++------- core/js/share.js | 10 +++++--- 9 files changed, 75 insertions(+), 50 deletions(-) (limited to 'apps/files/js/files.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 196817432d5..225c3319107 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -222,6 +222,14 @@ $(document).ready(function() { //examine file var file = data.files[0]; + try { + // FIXME: not so elegant... need to refactor that method to return a value + Files.isFileNameValid(file.name); + } + catch (errorMessage) { + data.textStatus = 'invalidcharacters'; + data.errorThrown = errorMessage; + } if (file.type === '' && file.size === 4096) { data.textStatus = 'dirorzero'; @@ -605,7 +613,7 @@ $(document).ready(function() { if (result.status === 'success') { var date=new Date(); FileList.addDir(name, 0, date, hidden); - var tr=$('tr[data-file="'+name+'"]'); + var tr = FileList.findFileEl(name); tr.attr('data-id', result.data.id); } else { OC.dialogs.alert(result.data.message, t('core', 'Could not create folder')); @@ -647,7 +655,7 @@ $(document).ready(function() { $('#uploadprogressbar').fadeOut(); var date = new Date(); FileList.addFile(localName, size, date, false, hidden); - var tr = $('tr[data-file="'+localName+'"]'); + var tr = FileList.findFileEl(localName); tr.data('mime', mime).data('id', id); tr.attr('data-id', id); var path = $('#dir').val()+'/'+localName; diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 03e23189a97..74bb711ef3d 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -71,7 +71,7 @@ var FileActions = { FileActions.currentFile = parent; var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions()); var file = FileActions.getCurrentFile(); - if ($('tr[data-file="'+file+'"]').data('renaming')) { + if (FileList.findFileEl(file).data('renaming')) { return; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 473bcf25f2d..c02ab70ce8d 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -6,6 +6,13 @@ var FileList={ $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); }, + /** + * Returns the tr element for a given file name + */ + findFileEl: function(fileName){ + // use filterAttr to avoid escaping issues + return $('#fileList tr').filterAttr('data-file', fileName); + }, update:function(fileListHtml) { var $fileList = $('#fileList'); $fileList.empty().html(fileListHtml); @@ -292,8 +299,9 @@ var FileList={ $('#filestable').toggleClass('hidden', show); }, remove:function(name){ - $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy'); - $('tr').filterAttr('data-file',name).remove(); + var fileEl = FileList.findFileEl(name); + fileEl.find('td.filename').draggable('destroy'); + fileEl.remove(); FileList.updateFileSummary(); if ( ! $('tr[data-file]').exists() ) { $('#emptycontent').removeClass('hidden'); @@ -334,7 +342,7 @@ var FileList={ FileList.updateFileSummary(); }, loadingDone:function(name, id) { - var mime, tr = $('tr[data-file="'+name+'"]'); + var mime, tr = FileList.findFileEl(name); tr.data('loading', false); mime = tr.data('mime'); tr.attr('data-mime', mime); @@ -347,12 +355,12 @@ var FileList={ }, null, null, tr.attr('data-etag')); tr.find('td.filename').draggable(dragOptions); }, - isLoading:function(name) { - return $('tr[data-file="'+name+'"]').data('loading'); + isLoading:function(file) { + return FileList.findFileEl(file).data('loading'); }, rename:function(oldname) { var tr, td, input, form; - tr = $('tr[data-file="'+oldname+'"]'); + tr = FileList.findFileEl(oldname); tr.data('renaming',true); td = tr.children('td.filename'); input = $('').val(oldname); @@ -500,14 +508,16 @@ var FileList={ form.trigger('submit'); }); }, - inList:function(filename) { - return $('#fileList tr[data-file="'+filename+'"]').length; + inList:function(file) { + return FileList.findFileEl(file).length; }, replace:function(oldName, newName, isNewFile) { // Finish any existing actions - $('tr[data-file="'+oldName+'"]').hide(); - $('tr[data-file="'+newName+'"]').hide(); - var tr = $('tr[data-file="'+oldName+'"]').clone(); + var oldFileEl = FileList.findFileEl(oldName); + var newFileEl = FileList.findFileEl(newName); + oldFileEl.hide(); + newFileEl.hide(); + var tr = oldFileEl.clone(); tr.attr('data-replace', 'true'); tr.attr('data-file', newName); var td = tr.children('td.filename'); @@ -559,7 +569,7 @@ var FileList={ files=[files]; } for (var i=0; i span').attr('data-oldName'); + FileList.findFileEl(file).show(); OC.Notification.hide(); }); $('#notification:first-child').on('click', '.cancel', function() { diff --git a/apps/files/js/files.js b/apps/files/js/files.js index fdaa3aa3342..1f12ade8d79 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -282,7 +282,7 @@ $(document).ready(function() { procesSelection(); } else { var filename=$(this).parent().parent().attr('data-file'); - var tr=$('tr[data-file="'+filename+'"]'); + var tr = FileList.findFileEl(filename); var renaming=tr.data('renaming'); if (!renaming && !FileList.isLoading(filename)) { FileActions.currentFile = $(this).parent(); @@ -541,10 +541,12 @@ var folderDropOptions={ if (result) { if (result.status === 'success') { //recalculate folder size - var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size'); - var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size'); - $('#fileList tr[data-file="'+target+'"]').data('size', newSize); - $('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize)); + var oldFile = FileList.findFileEl(target); + var newFile = FileList.findFileEl(file); + var oldSize = oldFile.data('size'); + var newSize = oldSize + newFile.data('size'); + oldFile.data('size', newSize); + oldFile.find('td.filesize').text(humanFileSize(newSize)); FileList.remove(file); procesSelection(); @@ -738,7 +740,7 @@ Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) { } function getUniqueName(name) { - if ($('tr[data-file="'+name+'"]').exists()) { + if (FileList.findFileEl(name).exists()) { var parts=name.split('.'); var extension = ""; if (parts.length > 1) { diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index eacd4096ed8..2e34e6f9bc5 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -29,19 +29,19 @@ $(document).ready(function() { } } FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href'); } }); FileActions.register('file', 'Download', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href'); } }); FileActions.register('dir', 'Download', OC.PERMISSION_READ, '', function(filename) { - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if (tr.length > 0) { window.location = $(tr).find('a.name').attr('href')+'&download'; } diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 340e0939445..36de452a55e 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -22,7 +22,7 @@ $(document).ready(function() { } else { var item = $('#dir').val() + '/' + filename; } - var tr = $('tr').filterAttr('data-file', filename); + var tr = FileList.findFileEl(filename); if ($(tr).data('type') == 'dir') { var itemType = 'folder'; } else { diff --git a/apps/files_trashbin/js/trash.js b/apps/files_trashbin/js/trash.js index 1ff5bac6130..46d8b56308c 100644 --- a/apps/files_trashbin/js/trash.js +++ b/apps/files_trashbin/js/trash.js @@ -3,8 +3,8 @@ $(document).ready(function() { if (typeof FileActions !== 'undefined') { FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) { - var tr = $('tr').filterAttr('data-file', filename); - var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete"); + var tr = FileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); disableActions(); $.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'), @@ -30,8 +30,8 @@ $(document).ready(function() { return OC.imagePath('core', 'actions/delete'); }, function(filename) { $('.tipsy').remove(); - var tr = $('tr').filterAttr('data-file', filename); - var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete"); + var tr = FileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); disableActions(); $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'), @@ -73,7 +73,7 @@ $(document).ready(function() { var dirlisting = getSelectedFiles('dirlisting')[0]; disableActions(); for (var i = 0; i < files.length; i++) { - var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete"); + var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); } @@ -119,7 +119,7 @@ $(document).ready(function() { } else { for (var i = 0; i < files.length; i++) { - var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete"); + var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete"); deleteAction.removeClass('delete-icon').addClass('progress-icon'); } } @@ -169,7 +169,7 @@ $(document).ready(function() { event.preventDefault(); } var filename = $(this).parent().parent().attr('data-file'); - var tr = $('tr').filterAttr('data-file',filename); + var tr = FileList.findFileEl(filename); var renaming = tr.data('renaming'); if(!renaming && !FileList.isLoading(filename)){ if(mime.substr(0, 5) === 'text/'){ //no texteditor for now diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js index 738a7ece6f2..4adf14745de 100644 --- a/apps/files_versions/js/versions.js +++ b/apps/files_versions/js/versions.js @@ -77,6 +77,7 @@ function goToVersionPage(url){ function createVersionsDropdown(filename, files) { var start = 0; + var fileEl; var html = '