diff options
Diffstat (limited to 'apps/files/js/filelist.js')
-rw-r--r-- | apps/files/js/filelist.js | 265 |
1 files changed, 225 insertions, 40 deletions
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 49d7afa9b5c..ffdbe5ef01e 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -1,7 +1,28 @@ var FileList={ useUndo:true, + postProcessList: function(){ + $('#fileList tr').each(function(){ + //little hack to set unescape filenames in attribute + $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); + }); + }, update:function(fileListHtml) { - $('#fileList').empty().html(fileListHtml); + var $fileList = $('#fileList'), + permissions = $('#permissions').val(), + isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; + $fileList.empty().html(fileListHtml); + $('#emptycontent').toggleClass('hidden', !isCreatable || $fileList.find('tr').length > 0); + $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){ + Files.setupDragAndDrop(); + } + FileList.updateFileSummary(); + $fileList.trigger(jQuery.Event("updated")); }, createRow:function(type, name, iconurl, linktarget, size, lastModified, permissions){ var td, simpleSize, basename, extension; @@ -24,20 +45,20 @@ var FileList={ "href": linktarget }); //split extension from filename for non dirs - if (type !== 'dir' && name.indexOf('.')!==-1) { - basename = name.substr(0,name.lastIndexOf('.')); - extension = name.substr(name.lastIndexOf('.')); + if (type != 'dir' && name.indexOf('.')!=-1) { + basename=name.substr(0,name.lastIndexOf('.')); + extension=name.substr(name.lastIndexOf('.')); } else { - basename = name; - extension = false; + basename=name; + extension=false; } - var name_span = $('<span></span>').addClass('nametext').text(basename); + var name_span=$('<span></span>').addClass('nametext').text(basename); link_elem.append(name_span); if(extension){ name_span.append($('<span></span>').addClass('extension').text(extension)); } //dirs can show the number of uploaded files - if (type === 'dir') { + if (type == 'dir') { link_elem.append($('<span></span>').attr({ 'class': 'uploadtext', 'currentUploads': 0 @@ -47,10 +68,10 @@ var FileList={ tr.append(td); //size column - if (size!==t('files', 'Pending')) { + if(size!=t('files', 'Pending')){ simpleSize = humanFileSize(size); - } else { - simpleSize = t('files', 'Pending'); + }else{ + simpleSize=t('files', 'Pending'); } var sizeColor = Math.round(160-Math.pow((size/(1024*1024)),2)); var lastModifiedTime = Math.round(lastModified.getTime() / 1000); @@ -101,9 +122,9 @@ var FileList={ ); FileList.insertElement(name, 'file', tr); - if (loading) { + if(loading){ tr.data('loading',true); - } else { + }else{ tr.find('td.filename').draggable(dragOptions); } if (hidden) { @@ -134,20 +155,109 @@ var FileList={ FileActions.display(tr.find('td.filename')); return tr; }, - refresh:function(data) { - var result = jQuery.parseJSON(data.responseText); - if(typeof(result.data.breadcrumb) !== 'undefined'){ - updateBreadcrumb(result.data.breadcrumb); + /** + * @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) + */ + changeDirectory: function(targetDir, changeUrl, force){ + var $dir = $('#dir'), + url, + currentDir = $dir.val() || '/'; + targetDir = targetDir || '/'; + if (!force && currentDir === targetDir){ + return; + } + FileList.setCurrentDir(targetDir, changeUrl); + FileList.reload(); + }, + linkTo: function(dir){ + return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/'); + }, + setCurrentDir: function(targetDir, changeUrl){ + $('#dir').val(targetDir); + if (changeUrl !== false){ + if (window.history.pushState && changeUrl !== false){ + url = FileList.linkTo(targetDir); + window.history.pushState({dir: targetDir}, '', url); + } + // use URL hash for IE8 + else{ + window.location.hash = '?dir='+ encodeURIComponent(targetDir).replace(/%2F/g, '/'); + } + } + }, + /** + * @brief Reloads the file list using ajax call + */ + reload: function(){ + FileList.showMask(); + if (FileList._reloadCall){ + FileList._reloadCall.abort(); + } + FileList._reloadCall = $.ajax({ + url: OC.filePath('files','ajax','list.php'), + data: { + dir : $('#dir').val(), + breadcrumb: true + }, + error: function(result){ + FileList.reloadCallback(result); + }, + success: function(result) { + FileList.reloadCallback(result); + } + }); + }, + reloadCallback: function(result){ + var $controls = $('#controls'); + + delete FileList._reloadCall; + FileList.hideMask(); + + if (!result || result.status === 'error') { + OC.Notification.show(result.data.message); + return; + } + + if (result.status === 404){ + // go back home + FileList.changeDirectory('/'); + return; + } + + if (result.data.permissions){ + FileList.setDirectoryPermissions(result.data.permissions); + } + + if(typeof(result.data.breadcrumb) != 'undefined'){ + $controls.find('.crumb').remove(); + $controls.prepend(result.data.breadcrumb); + + var width = $(window).width(); + Files.initBreadCrumbs(); + Files.resizeBreadcrumbs(width, true); + + // in case svg is not supported by the browser we need to execute the fallback mechanism + if(!SVGSupport()) { + replaceSVG(); + } } + FileList.update(result.data.files); - resetFileActionPanel(); + }, + 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(); FileList.updateFileSummary(); - if($('tr[data-file]').length===0){ - $('#emptycontent').show(); + if($('tr[data-file]').length==0){ + $('#emptycontent').removeClass('hidden'); } }, insertElement:function(name,type,element){ @@ -165,19 +275,19 @@ var FileList={ } } if(fileElements.length){ - if(pos===-1){ + if(pos==-1){ $(fileElements[0]).before(element); }else{ $(fileElements[pos]).after(element); } - }else if(type==='dir' && $('tr[data-file]').length>0){ + }else if(type=='dir' && $('tr[data-file]').length>0){ $('tr[data-file]').first().before(element); - } else if(type==='file' && $('tr[data-file]').length>0) { + } else if(type=='file' && $('tr[data-file]').length>0) { $('tr[data-file]').last().before(element); }else{ $('#fileList').append(element); } - $('#emptycontent').hide(); + $('#emptycontent').addClass('hidden'); FileList.updateFileSummary(); }, loadingDone:function(name, id){ @@ -185,7 +295,7 @@ var FileList={ tr.data('loading',false); mime=tr.data('mime'); tr.attr('data-mime',mime); - if (id) { + if (id != null) { tr.attr('data-id', id); } var path = getPathForPreview(name); @@ -221,7 +331,7 @@ var FileList={ var newname=input.val(); if (!Files.isFileNameValid(newname)) { return false; - } else if (newname !== name) { + } else if (newname != name) { if (FileList.checkName(name, newname, false)) { newname = name; } else { @@ -269,14 +379,14 @@ var FileList={ 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') { + 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 ) { + if (newname.indexOf('.') > 0 && tr.data('type') != 'dir') { + if (td.find('a.name span.extension').length == 0 ) { td.find('a.name span.nametext').append('<span class="extension"></span>'); } td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); @@ -286,7 +396,7 @@ var FileList={ return false; }); input.keyup(function(event){ - if (event.keyCode === 27) { + if (event.keyCode == 27) { tr.data('renaming',false); form.remove(); td.children('a.name').show(); @@ -312,7 +422,7 @@ var FileList={ html.attr('data-oldName', oldName); html.attr('data-newName', newName); html.attr('data-isNewFile', isNewFile); - OC.Notification.showHtml(html); + OC.Notification.showHtml(html); return true; } else { return false; @@ -351,13 +461,13 @@ var FileList={ FileList.finishReplace(); }; if (!isNewFile) { - OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+'<span class="undo">'+t('files', 'undo')+'</span>'); + OC.Notification.showHtml(t('files', 'replaced {new_name} with {old_name}', {new_name: newName}, {old_name: oldName})+'<span class="undo">'+t('files', 'undo')+'</span>'); } }, 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') { + if (result && result.status == 'success') { $('tr').filterAttr('data-replace', 'true').removeAttr('data-replace'); } else { OC.dialogs.alert(result.data.message, 'Error moving file'); @@ -386,7 +496,7 @@ var FileList={ $.post(OC.filePath('files', 'ajax', 'delete.php'), {dir:$('#dir').val(),files:fileNames}, function(result){ - if (result.status === 'success') { + if (result.status == 'success') { $.each(files,function(index,file){ var files = $('tr').filterAttr('data-file',file); files.remove(); @@ -427,7 +537,7 @@ var FileList={ var infoVars = { dirs: '<span class="dirinfo">'+directoryInfo+'</span><span class="connector">', files: '</span><span class="fileinfo">'+fileInfo+'</span>' - }; + } var info = t('files', '{dirs} and {files}', infoVars); @@ -508,6 +618,31 @@ var FileList={ $connector.show(); } } + }, + showMask: function(){ + // in case one was shown before + var $mask = $('#content .mask'); + if ($mask.length){ + return; + } + + $mask = $('<div class="mask transparent"></div>'); + + $mask.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); + $mask.css('background-repeat', 'no-repeat'); + $('#content').append($mask); + + // block UI, but only make visible in case loading takes longer + FileList._maskTimeout = window.setTimeout(function(){ + // reset opacity + $mask.removeClass('transparent'); + }, 250); + }, + hideMask: function(){ + var $mask = $('#content .mask').remove(); + if (FileList._maskTimeout){ + window.clearTimeout(FileList._maskTimeout); + } } }; @@ -696,16 +831,16 @@ $(document).ready(function(){ FileList.replaceIsNewFile = null; } FileList.lastAction = null; - OC.Notification.hide(); + OC.Notification.hide(); }); $('#notification:first-child').on('click', '.replace', function() { - OC.Notification.hide(function() { - FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile')); - }); + OC.Notification.hide(function() { + FileList.replace($('#notification > span').attr('data-oldName'), $('#notification > span').attr('data-newName'), $('#notification > span').attr('data-isNewFile')); + }); }); $('#notification:first-child').on('click', '.suggest', function() { $('tr').filterAttr('data-file', $('#notification > span').attr('data-oldName')).show(); - OC.Notification.hide(); + OC.Notification.hide(); }); $('#notification:first-child').on('click', '.cancel', function() { if ($('#notification > span').attr('data-isNewFile')) { @@ -723,5 +858,55 @@ $(document).ready(function(){ $(window).trigger('beforeunload'); }); + function parseHashQuery(){ + var hash = window.location.hash, + pos = hash.indexOf('?'), + query; + if (pos >= 0){ + return hash.substr(pos + 1); + } + return ''; + } + + function parseCurrentDirFromUrl(){ + var query = parseHashQuery(), + params, + dir = '/'; + // try and parse from URL hash first + if (query){ + params = OC.parseQueryString(query); + } + // else read from query attributes + if (!params){ + params = OC.parseQueryString(location.search); + } + 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(); + } + 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); + } + FileList.createFileSummary(); }); |