Implement support for replacing files during upload with the actions: replace, suggest name, and cancel

This commit is contained in:
Michael Gapczynski 2012-09-05 00:12:11 -04:00
parent e8fcc71129
commit a26ea6d65c
2 changed files with 107 additions and 44 deletions

View file

@ -3,7 +3,7 @@ var FileList={
update:function(fileListHtml) {
$('#fileList').empty().html(fileListHtml);
},
addFile:function(name,size,lastModified,loading){
addFile:function(name,size,lastModified,loading,hidden){
var img=(loading)?OC.imagePath('core', 'loading.gif'):OC.imagePath('core', 'filetypes/file.png');
var html='<tr data-type="file" data-size="'+size+'">';
if(name.indexOf('.')!=-1){
@ -36,8 +36,11 @@ var FileList={
}else{
$('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions);
}
if (hidden) {
$('tr').filterAttr('data-file', name).hide();
}
},
addDir:function(name,size,lastModified){
addDir:function(name,size,lastModified,hidden){
html = $('<tr></tr>').attr({ "data-type": "dir", "data-size": size, "data-file": name});
td = $('<td></td>').attr({"class": "filename", "style": 'background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')' });
td.append('<input type="checkbox" />');
@ -63,6 +66,9 @@ var FileList={
FileList.insertElement(name,'dir',html);
$('tr').filterAttr('data-file',name).find('td.filename').draggable(dragOptions);
$('tr').filterAttr('data-file',name).find('td.filename').droppable(folderDropOptions);
if (hidden) {
$('tr').filterAttr('data-file', name).hide();
}
},
refresh:function(data) {
result = jQuery.parseJSON(data.responseText);
@ -82,7 +88,7 @@ var FileList={
},
insertElement:function(name,type,element){
//find the correct spot to insert the file or folder
var fileElements=$('tr[data-file][data-type="'+type+'"]');
var fileElements=$('tr[data-file][data-type="'+type+'"]:visible');
var pos;
if(name.localeCompare($(fileElements[0]).attr('data-file'))<0){
pos=-1;
@ -137,11 +143,7 @@ var FileList={
event.preventDefault();
var newname=input.val();
if (newname != name) {
if ($('tr').filterAttr('data-file', newname).length > 0) {
$('#notification').html(newname+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
$('#notification').data('oldName', name);
$('#notification').data('newName', newname);
$('#notification').fadeIn();
if (FileList.checkName(name, newname, false)) {
newname = name;
} else {
$.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(result) {
@ -151,7 +153,6 @@ var FileList={
}
});
}
}
tr.attr('data-file', newname);
var path = td.children('a.name').attr('href');
@ -179,20 +180,62 @@ var FileList={
form.trigger('submit');
});
},
replace:function(oldName, newName) {
checkName:function(oldName, newName, isNewFile) {
if (isNewFile || $('tr').filterAttr('data-file', newName).length > 0) {
if (isNewFile) {
$('#notification').html(newName+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="suggest">'+t('files', 'suggest name')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
} else {
$('#notification').html(newName+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
}
$('#notification').data('oldName', oldName);
$('#notification').data('newName', newName);
$('#notification').data('isNewFile', isNewFile);
$('#notification').fadeIn();
return true;
} else {
return false;
}
},
replace:function(oldName, newName, isNewFile) {
// Finish any existing actions
if (FileList.lastAction || !FileList.useUndo) {
FileList.lastAction();
}
var tr = $('tr').filterAttr('data-file', oldName);
tr.hide();
$('tr').filterAttr('data-file', oldName).hide();
$('tr').filterAttr('data-file', newName).hide();
var tr = $('tr').filterAttr('data-file', oldName).clone();
tr.attr('data-replace', 'true');
tr.attr('data-file', newName);
var td = tr.children('td.filename');
td.children('a.name .span').text(newName);
var path = td.children('a.name').attr('href');
td.children('a.name').attr('href', path.replace(encodeURIComponent(oldName), encodeURIComponent(newName)));
if (newName.indexOf('.') > 0) {
var basename = newName.substr(0, newName.lastIndexOf('.'));
} else {
var basename = newName;
}
td.children('a.name').empty();
var span = $('<span class="nametext"></span>');
span.text(basename);
td.children('a.name').append(span);
if (newName.indexOf('.') > 0) {
span.append($('<span class="extension">'+newName.substr(newName.lastIndexOf('.'))+'</span>'));
}
FileList.insertElement(newName, tr.data('type'), tr);
tr.show();
FileList.replaceCanceled = false;
FileList.replaceOldName = oldName;
FileList.replaceNewName = newName;
FileList.replaceIsNewFile = isNewFile;
FileList.lastAction = function() {
FileList.finishReplace();
};
$('#notification').html(t('files', 'replaced')+' '+newName+' '+t('files', 'with')+' '+oldName+'<span class="undo">'+t('files', 'undo')+'</span>');
if (isNewFile) {
$('#notification').html(t('files', 'replaced')+' '+newName+'<span class="undo">'+t('files', 'undo')+'</span>');
} else {
$('#notification').html(t('files', 'replaced')+' '+newName+' '+t('files', 'with')+' '+oldName+'<span class="undo">'+t('files', 'undo')+'</span>');
}
$('#notification').fadeIn();
},
finishReplace:function() {
@ -203,25 +246,7 @@ var FileList={
FileList.finishDelete(function() {
$.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') {
var tr = $('tr').filterAttr('data-file', FileList.replaceOldName);
tr.attr('data-file', FileList.replaceNewName);
var td = tr.children('td.filename');
td.children('a.name .span').text(FileList.replaceNewName);
var path = td.children('a.name').attr('href');
td.children('a.name').attr('href', path.replace(encodeURIComponent(FileList.replaceOldName), encodeURIComponent(FileList.replaceNewName)));
if (FileList.replaceNewName.indexOf('.') > 0) {
var basename = FileList.replaceNewName.substr(0, FileList.replaceNewName.lastIndexOf('.'));
} else {
var basename = FileList.replaceNewName;
}
td.children('a.name').empty();
var span = $('<span class="nametext"></span>');
span.text(basename);
td.children('a.name').append(span);
if (FileList.replaceNewName.indexOf('.') > 0) {
span.append($('<span class="extension">'+FileList.replaceNewName.substr(FileList.replaceNewName.lastIndexOf('.'))+'</span>'));
}
tr.show();
$('tr').filterAttr('data-replace', 'true').removeAttr('data-replace');
} else {
OC.dialogs.alert(result.data.message, 'Error moving file');
}
@ -255,7 +280,7 @@ var FileList={
data: {dir:$('#dir').val(),files:fileNames},
complete: function(data){
boolOperationFinished(data, function(){
$('#notification').fadeOut();
$('#notification').fadeOut('400');
$.each(FileList.deleteFiles,function(index,file){
FileList.remove(file);
});
@ -299,21 +324,39 @@ $(document).ready(function(){
FileList.deleteCanceled=true;
FileList.deleteFiles=null;
} else if (FileList.replaceOldName && FileList.replaceNewName) {
$('tr').filterAttr('data-file', FileList.replaceOldName).show();
if (FileList.replaceIsNewFile) {
// Delete the new uploaded file
FileList.deleteCanceled = false;
FileList.deleteFiles = [FileList.replaceOldName];
FileList.finishDelete(null, true);
} else {
$('tr').filterAttr('data-file', FileList.replaceOldName).show();
}
$('tr').filterAttr('data-replace', 'true').remove();
$('tr').filterAttr('data-file', FileList.replaceNewName).show();
FileList.replaceCanceled = true;
FileList.replaceOldName = null;
FileList.replaceNewName = null;
FileList.replaceIsNewFile = null;
}
FileList.lastAction = null;
$('#notification').fadeOut();
$('#notification').fadeOut('400');
});
$('#notification .replace').live('click', function() {
$('#notification').fadeOut('400', function() {
FileList.replace($('#notification').data('oldName'), $('#notification').data('newName'));
FileList.replace($('#notification').data('oldName'), $('#notification').data('newName'), $('#notification').data('isNewFile'));
});
});
$('#notification .suggest').live('click', function() {
$('tr').filterAttr('data-file', $('#notification').data('oldName')).show();
$('#notification').fadeOut('400');
});
$('#notification .cancel').live('click', function() {
$('#notification').fadeOut();
if ($('#notification').data('isNewFile')) {
FileList.deleteCanceled = false;
FileList.deleteFiles = [$('#notification').data('oldName')];
FileList.finishDelete(null, true);
}
});
FileList.useUndo=('onbeforeunload' in window)
$(window).bind('beforeunload', function (){

View file

@ -236,7 +236,14 @@ $(document).ready(function() {
var size=t('files','Pending');
}
if(files && !dirName){
FileList.addFile(getUniqueName(files[i].name),size,date,true);
var uniqueName = getUniqueName(files[i].name);
if (uniqueName != files[i].name) {
FileList.checkName(uniqueName, files[i].name, true);
var hidden = true;
} else {
var hidden = false;
}
FileList.addFile(uniqueName,size,date,true,hidden);
} else if(dirName) {
var uploadtext = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName).find('.uploadtext')
var currentUploads = parseInt(uploadtext.attr('currentUploads'));
@ -255,7 +262,14 @@ $(document).ready(function() {
}
}else{
var filename=this.value.split('\\').pop(); //ie prepends C:\fakepath\ in front of the filename
FileList.addFile(getUniqueName(filename),'Pending',date,true);
var uniqueName = getUniqueName(filename);
if (uniqueName != filename) {
FileList.checkName(uniqueName, filename, true);
var hidden = true;
} else {
var hidden = false;
}
FileList.addFile(uniqueName,'Pending',date,true,hidden);
}
if($.support.xhrFileUpload) {
for(var i=0;i<files.length;i++){
@ -475,12 +489,18 @@ $(document).ready(function() {
$(this).append(input);
input.focus();
input.change(function(){
var name=getUniqueName($(this).val());
if(type != 'web' && name.indexOf('/')!=-1){
if(type != 'web' && $(this).val().indexOf('/')!=-1){
$('#notification').text(t('files','Invalid name, \'/\' is not allowed.'));
$('#notification').fadeIn();
return;
}
var name = getUniqueName($(this).val());
if (name != $(this).val()) {
FileList.checkName(name, $(this).val(), true);
var hidden = true;
} else {
var hidden = false;
}
switch(type){
case 'file':
$.post(
@ -489,7 +509,7 @@ $(document).ready(function() {
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addFile(name,0,date);
FileList.addFile(name,0,date,false,hidden);
var tr=$('tr').filterAttr('data-file',name);
tr.data('mime','text/plain');
getMimeIcon('text/plain',function(path){
@ -508,7 +528,7 @@ $(document).ready(function() {
function(result){
if (result.status == 'success') {
var date=new Date();
FileList.addDir(name,0,date);
FileList.addDir(name,0,date,hidden);
} else {
OC.dialogs.alert(result.data.message, 'Error');
}
@ -539,7 +559,7 @@ $(document).ready(function() {
eventSource.listen('success',function(mime){
$('#uploadprogressbar').fadeOut();
var date=new Date();
FileList.addFile(localName,0,date);
FileList.addFile(localName,0,date,false,hidden);
var tr=$('tr').filterAttr('data-file',localName);
tr.data('mime',mime);
getMimeIcon(mime,function(path){