summaryrefslogtreecommitdiffstats
path: root/apps/files/js/file-upload.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files/js/file-upload.js')
-rw-r--r--apps/files/js/file-upload.js341
1 files changed, 190 insertions, 151 deletions
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index fefb06a8ac5..5bf4f5c0981 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -21,13 +21,13 @@ function supportAjaxUploadWithProgress() {
var fi = document.createElement('INPUT');
fi.type = 'file';
return 'files' in fi;
- };
+ }
// Are progress events supported?
function supportAjaxUploadProgressEvents() {
var xhr = new XMLHttpRequest();
return !! (xhr && ('upload' in xhr) && ('onprogress' in xhr.upload));
- };
+ }
// Is FormData supported?
function supportFormData() {
@@ -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('<p>'+$(element).data('text')+'</p>');
}
});
});
- $('#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('<p>'+$(element).data('text')+'</p>');
}
@@ -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=$('<form></form>');
var input=$('<input type="text">');
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', 'In the home folder \'Shared\' is a reserved filename');
+ } 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('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;
+ 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('<p>'+li.data('text')+'</p>');
+ $('#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('<p>'+li.data('text')+'</p>');
- $('#new>a').click();
});
});
window.file_upload_param = file_upload_param;