From e1927d5bee11b561a293a9488bd27d90c2c043e6 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Mon, 12 Aug 2013 12:33:22 +0200 Subject: fix whitespace, check selected files before starting upload --- core/js/oc-dialogs.js | 134 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 2 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index f4bc174b5eb..cf77f5018a6 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -197,7 +197,121 @@ var OCdialogs = { OCdialogs.dialogs_counter++; }) .fail(function() { - alert(t('core', 'Error loading file picker template')); + alert(t('core', 'Error loading message template')); + }); + }, + /** + * Displays file exists dialog + * @param {object} original a file with name, size and mtime + * @param {object} replacement a file with name, size and mtime + * @param {object} controller a controller with onCancel, onSkip, onReplace and onRename methods + */ + fileexists:function(data, original, replacement, controller) { + if (typeof controller !== 'object') { + controller = {}; + } + var self = this; + $.when(this._getFileExistsTemplate()).then(function($tmpl) { + var dialog_name = 'oc-dialog-fileexists-' + OCdialogs.dialogs_counter + '-content'; + var dialog_id = '#' + dialog_name; + var title = t('files','Replace »{filename}«?',{filename: original.name}); + var $dlg = $tmpl.octemplate({ + dialog_name: dialog_name, + title: title, + type: 'fileexists', + + why: t('files','Another file with the same name already exists in "{dir}".',{dir:'somedir'}), + what: t('files','Replacing it will overwrite it\'s contents.'), + original_heading: t('files','Original file'), + original_size: t('files','Size: {size}',{size: original.size}), + original_mtime: t('files','Last changed: {mtime}',{mtime: original.mtime}), + + replacement_heading: t('files','Replace with'), + replacement_size: t('files','Size: {size}',{size: replacement.size}), + replacement_mtime: t('files','Last changed: {mtime}',{mtime: replacement.mtime}), + + new_name_label: t('files','Choose a new name for the target.'), + all_files_label: t('files','Use this action for all files.') + }); + $('body').append($dlg); + + $(dialog_id + ' .original .icon').css('background-image','url('+OC.imagePath('core', 'filetypes/file.png')+')'); + $(dialog_id + ' .replacement .icon').css('background-image','url('+OC.imagePath('core', 'filetypes/file.png')+')'); + $(dialog_id + ' #new-name').val(original.name); + + + $(dialog_id + ' #new-name').on('keyup', function(e){ + if ($(dialog_id + ' #new-name').val() === original.name) { + + $(dialog_id + ' + div .rename').removeClass('primary').hide(); + $(dialog_id + ' + div .replace').addClass('primary').show(); + } else { + $(dialog_id + ' + div .rename').addClass('primary').show(); + $(dialog_id + ' + div .replace').removeClass('primary').hide(); + } + }); + + buttonlist = [{ + text: t('core', 'Cancel'), + classes: 'cancel', + click: function(){ + if ( typeof controller.onCancel !== 'undefined') { + controller.onCancel(data); + } + $(dialog_id).ocdialog('close'); + } + }, + { + text: t('core', 'Skip'), + classes: 'skip', + click: function(){ + if ( typeof controller.onSkip !== 'undefined') { + controller.onSkip(data); + } + $(dialog_id).ocdialog('close'); + } + }, + { + text: t('core', 'Replace'), + classes: 'replace', + click: function(){ + if ( typeof controller.onReplace !== 'undefined') { + controller.onReplace(data); + } + $(dialog_id).ocdialog('close'); + }, + defaultButton: true + }, + { + text: t('core', 'Rename'), + classes: 'rename', + click: function(){ + if ( typeof controller.onRename !== 'undefined') { + controller.onRename(data, $(dialog_id + ' #new-name').val()); + } + $(dialog_id).ocdialog('close'); + } + }]; + + $(dialog_id).ocdialog({ + closeOnEscape: true, + modal: true, + buttons: buttonlist, + close: function(event, ui) { + try { + $(this).ocdialog('destroy').remove(); + } catch(e) { + alert (e); + } + self.$ = null; + } + }); + OCdialogs.dialogs_counter++; + + $(dialog_id + ' + div .rename').hide(); + }) + .fail(function() { + alert(t('core', 'Error loading file exists template')); }); }, _getFilePickerTemplate: function() { @@ -233,6 +347,22 @@ var OCdialogs = { } return defer.promise(); }, + _getFileExistsTemplate: function () { + var defer = $.Deferred(); + if (!this.$fileexistsTemplate) { + var self = this; + $.get(OC.filePath('files', 'templates', 'fileexists.html'), function (tmpl) { + self.$fileexistsTemplate = $(tmpl); + defer.resolve(self.$fileexistsTemplate); + }) + .fail(function () { + defer.reject(); + }); + } else { + defer.resolve(this.$fileexistsTemplate); + } + return defer.promise(); + }, _getFileList: function(dir, mimeType) { return $.getJSON( OC.filePath('files', 'ajax', 'rawlist.php'), @@ -287,7 +417,7 @@ var OCdialogs = { */ _fillSlug: function() { this.$dirTree.empty(); - var self = this + var self = this; var path = this.$filePicker.data('path'); var $template = $('{name}'); if(path) { -- cgit v1.2.3 From 9da49264ea6edbad13455a3e66d7f369f2e8448f Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Wed, 14 Aug 2013 17:49:45 +0200 Subject: change filelist ui updates --- apps/files/js/file-upload.js | 27 +++++++++++ apps/files/js/filelist.js | 106 ++++++++++++++++++++++--------------------- core/js/jquery.ocdialog.js | 9 ++-- core/js/oc-dialogs.js | 9 +--- 4 files changed, 88 insertions(+), 63 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 71034a0b3f4..bd9757b5ffc 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1,3 +1,30 @@ +/** + * + * when versioning app is active -> always overwrite + * + * fileupload scenario: empty folder & d&d 20 files + * queue the 20 files + * check list of files for duplicates -> empty + * start uploading the queue (show progress dialog?) + * - no duplicates -> all good, add files to list + * - server reports duplicate -> show skip, replace or rename dialog (for individual files) + * + * fileupload scenario: files uploaded & d&d 20 files again + * queue the 20 files + * check list of files for duplicates -> find n duplicates -> + * show skip, replace or rename dialog as general option + * - show list of differences with preview (win 8) + * remember action for each file + * start uploading the queue (show progress dialog?) + * - no duplicates -> all good, add files to list + * - server reports duplicate -> use remembered action + * + * dialoge: + * -> skip, replace, choose (or abort) () + * -> choose left or right (with skip) (when only one file in list also show rename option and remember for all option) + */ + + OC.upload = { _isProcessing:false, isProcessing:function(){ diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index bcc77e68ce6..f4863837ce7 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -23,7 +23,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 { @@ -36,7 +36,7 @@ var FileList={ 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 @@ -46,7 +46,7 @@ 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'); @@ -135,7 +135,7 @@ var FileList={ }, refresh:function(data) { var result = jQuery.parseJSON(data.responseText); - if(typeof(result.data.breadcrumb) != 'undefined'){ + if(typeof(result.data.breadcrumb) !== 'undefined'){ updateBreadcrumb(result.data.breadcrumb); } FileList.update(result.data.files); @@ -144,7 +144,7 @@ var FileList={ remove:function(name){ $('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy'); $('tr').filterAttr('data-file',name).remove(); - if($('tr[data-file]').length==0){ + if($('tr[data-file]').length===0){ $('#emptyfolder').show(); } }, @@ -163,14 +163,14 @@ 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); @@ -182,7 +182,7 @@ var FileList={ tr.data('loading',false); mime=tr.data('mime'); tr.attr('data-mime',mime); - if (id != null) { + if (id) { tr.attr('data-id', id); } getMimeIcon(mime,function(path){ @@ -217,7 +217,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 { @@ -265,14 +265,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(''); } td.find('a.name span.extension').text(newname.substr(newname.lastIndexOf('.'))); @@ -282,7 +282,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(); @@ -347,13 +347,13 @@ 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') { + if (result && result.status === 'success') { $('tr').filterAttr('data-replace', 'true').removeAttr('data-replace'); } else { OC.dialogs.alert(result.data.message, 'Error moving file'); @@ -384,7 +384,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(); @@ -412,6 +412,7 @@ $(document).ready(function(){ if ($('#fileList').length > 0) { var dropTarget = $(e.originalEvent.target).closest('tr'); if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder + data.context = dropTarget; var dirName = dropTarget.data('file'); // update folder in form data.formData = function(form) { @@ -426,7 +427,7 @@ $(document).ready(function(){ formArray[2]['value'] += '/'+dirName; } return formArray; - } + }; } } }); @@ -434,11 +435,11 @@ $(document).ready(function(){ // only add to fileList if it exists if ($('#fileList').length > 0) { - if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!=-1){//finish delete if we are uploading a deleted file + if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){//finish delete if we are uploading a deleted file FileList.finishDelete(null, true); //delete file before continuing } - // add ui visualization to existing folder or as new stand-alone file? + // add ui visualization to existing folder var dropTarget = $(e.originalEvent.target).closest('tr'); if(dropTarget && dropTarget.data('type') === 'dir') { // add to existing folder @@ -460,21 +461,6 @@ $(document).ready(function(){ } else { uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); } - } else { - // add as stand-alone row to filelist - var uniqueName = getUniqueName(data.files[0].name); - var size=t('files','Pending'); - if(data.files[0].size>=0){ - size=data.files[0].size; - } - var date=new Date(); - var param = {}; - if ($('#publicUploadRequestToken').length) { - param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + uniqueName; - } - // create new file context - data.context = FileList.addFile(uniqueName,size,date,true,false,param); - } } }); @@ -493,18 +479,8 @@ $(document).ready(function(){ if(typeof result[0] !== 'undefined' && result[0].status === 'success') { var file = result[0]; - if (data.context.data('type') === 'file') { - // update file data - data.context.attr('data-mime',file.mime).attr('data-id',file.id); - var size = data.context.data('size'); - if(size!=file.size){ - data.context.attr('data-size', file.size); - data.context.find('td.filesize').text(humanFileSize(file.size)); - } - if (FileList.loadingDone) { - FileList.loadingDone(file.name, file.id); - } - } else { + if (data.context && data.context.data('type') === 'dir') { + // update upload counter ui var uploadtext = data.context.find('.uploadtext'); var currentUploads = parseInt(uploadtext.attr('currentUploads')); @@ -525,6 +501,32 @@ $(document).ready(function(){ data.context.attr('data-size', size); data.context.find('td.filesize').text(humanFileSize(size)); + } else { + + // add as stand-alone row to filelist + var uniqueName = getUniqueName(data.files[0].name); + var size=t('files','Pending'); + if (data.files[0].size>=0){ + size=data.files[0].size; + } + var date=new Date(); + var param = {}; + if ($('#publicUploadRequestToken').length) { + param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + uniqueName; + } + + //should the file exist in the list remove it + FileList.remove(file.name); + + // create new file context + 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); + + getMimeIcon(file.mime, function(path){ + data.context.find('td.filename').attr('style','background-image:url('+path+')'); + }); } } } @@ -574,16 +576,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')) { diff --git a/core/js/jquery.ocdialog.js b/core/js/jquery.ocdialog.js index 52ff5633f9a..ce991052271 100644 --- a/core/js/jquery.ocdialog.js +++ b/core/js/jquery.ocdialog.js @@ -40,6 +40,9 @@ } // Escape if(event.keyCode === 27 && self.options.closeOnEscape) { + if (self.closeCB) { + self.closeCB(); + } self.close(); return false; } @@ -190,7 +193,7 @@ } }, widget: function() { - return this.$dialog + return this.$dialog; }, close: function() { this._destroyOverlay(); @@ -203,10 +206,10 @@ }, destroy: function() { if(this.$title) { - this.$title.remove() + this.$title.remove(); } if(this.$buttonrow) { - this.$buttonrow.remove() + this.$buttonrow.remove(); } if(this.originalTitle) { diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index cf77f5018a6..88a3f6628cb 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -297,14 +297,7 @@ var OCdialogs = { closeOnEscape: true, modal: true, buttons: buttonlist, - close: function(event, ui) { - try { - $(this).ocdialog('destroy').remove(); - } catch(e) { - alert (e); - } - self.$ = null; - } + closeButton: null }); OCdialogs.dialogs_counter++; -- cgit v1.2.3 From f94e6036980644bdd6312e75a8973f2633cf5ff2 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Fri, 16 Aug 2013 11:40:55 +0200 Subject: progress fixes --- apps/files/ajax/upload.php | 9 +- apps/files/css/files.css | 23 +++- apps/files/js/file-upload.js | 263 ++++++++++++++++++++++++++------------- apps/files/js/fileactions.js | 2 +- apps/files/js/filelist.js | 265 ++++++++++++++++++++++++---------------- apps/files/js/files.js | 29 +---- apps/files_sharing/js/public.js | 7 +- core/js/oc-dialogs.js | 215 ++++++++++++++++++-------------- 8 files changed, 503 insertions(+), 310 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 8d183bd1f9c..619b5f6a04b 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -99,8 +99,8 @@ if (strpos($dir, '..') === false) { $fileCount = count($files['name']); for ($i = 0; $i < $fileCount; $i++) { // $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder - if (isset($_POST['new_name'])) { - $newName = $_POST['new_name']; + if (isset($_POST['newname'])) { + $newName = $_POST['newname']; } else { $newName = $files['name'][$i]; } @@ -109,11 +109,12 @@ if (strpos($dir, '..') === false) { } else { $replace = false; } - $target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).$newName); + $target = \OC\Files\Filesystem::normalizePath(stripslashes($dir).'/'.$newName); if ( ! $replace && \OC\Files\Filesystem::file_exists($target)) { $meta = \OC\Files\Filesystem::getFileInfo($target); $result[] = array('status' => 'existserror', - 'mime' => $meta['mimetype'], + 'type' => $meta['mimetype'], + 'mtime' => $meta['mtime'], 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), diff --git a/apps/files/css/files.css b/apps/files/css/files.css index acee8471aff..0ff25a24d76 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -190,6 +190,9 @@ table.dragshadow td.size { margin-left: -200px; } +.oc-dialog .fileexists table { + width: 100%; +} .oc-dialog .fileexists .original .icon { width: 64px; height: 64px; @@ -201,6 +204,7 @@ table.dragshadow td.size { .oc-dialog .fileexists .replacement { margin-top: 20px; + margin-bottom: 20px; } .oc-dialog .fileexists .replacement .icon { @@ -213,10 +217,23 @@ table.dragshadow td.size { clear: both; } -.oc-dialog .fileexists label[for="new-name"] { - margin-top: 20px; - display: block; +.oc-dialog .fileexists .toggle { + background-image: url('%webroot%/core/img/actions/triangle-e.png'); + width: 16px; + height: 16px; +} +.oc-dialog .fileexists #allfileslabel { + float:right; } +.oc-dialog .fileexists #allfiles { + vertical-align: bottom; + position: relative; + top: -3px; +} +.oc-dialog .fileexists #allfiles + span{ + vertical-align: bottom; +} + .oc-dialog .fileexists h3 { font-weight: bold; } diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index bd9757b5ffc..f8899cb07e6 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1,4 +1,30 @@ /** + * 1. tracking which file to upload next -> upload queue with data elements added whenever add is called + * 2. tracking progress for each folder individually -> track progress in a progress[dirname] object + * - every new selection increases the total size and number of files for a directory + * - add increases, successful done decreases, skip decreases, cancel decreases + * 3. track selections -> the general skip / overwrite decision is selection based and can change + * - server might send already exists error -> show dialog & remember decision for selection again + * - server sends error, how do we find collection? + * 4. track jqXHR object to prevent browser from navigationg away -> track in a uploads[dirname][filename] object [x] + * + * selections can progress in parrallel but each selection progresses sequentially + * + * -> store everything in context? + * context.folder + * context.element? + * context.progressui? + * context.jqXHR + * context.selection + * context.selection.onExistsAction? + * + * context available in what events? + * build in drop() add dir + * latest in add() add file? add selection! + * progress? -> update progress? + * onsubmit -> context.jqXHR? + * fail() -> + * done() * * when versioning app is active -> always overwrite * @@ -22,24 +48,74 @@ * dialoge: * -> skip, replace, choose (or abort) () * -> choose left or right (with skip) (when only one file in list also show rename option and remember for all option) + * + * progress always based on filesize + * number of files as text, bytes as bar + * */ -OC.upload = { + +//TODO clean uploads when all progress has completed +OC.Upload = { + /** + * map to lookup the selections for a given directory. + * @type Array + */ + _selections: {}, + /* + * queue which progress tracker to use for the next upload + * @type Array + */ + _queue: [], + queueUpload:function(data) { + // add to queue + this._queue.push(data); //remember what to upload next + if ( ! this.isProcessing() ) { + this.startUpload(); + } + }, + getSelection:function(originalFiles) { + if (!originalFiles.selectionKey) { + originalFiles.selectionKey = 'selection-' + $.assocArraySize(this._selections); + this._selections[originalFiles.selectionKey] = { + selectionKey:originalFiles.selectionKey, + files:{}, + totalBytes:0, + loadedBytes:0, + currentFile:0, + uploads:{}, + checked:false + }; + } + return this._selections[originalFiles.selectionKey]; + }, + cancelUpload:function(dir, filename) { + var deleted = false; + jQuery.each(this._selections, function(i, selection) { + if (selection.dir === dir && selection.uploads[filename]) { + delete selection.uploads[filename]; + deleted = true; + return false; // end searching through selections + } + }); + return deleted; + }, + cancelUploads:function() { + jQuery.each(this._selections,function(i,selection){ + jQuery.each(selection.uploads, function (j, jqXHR) { + delete jqXHR; + }); + }); + this._queue = []; + this._isProcessing = false; + }, _isProcessing:false, isProcessing:function(){ return this._isProcessing; }, - _uploadQueue:[], - addUpload:function(data){ - this._uploadQueue.push(data); - - if ( ! OC.upload.isProcessing() ) { - OC.upload.startUpload(); - } - }, startUpload:function(){ - if (this._uploadQueue.length > 0) { + if (this._queue.length > 0) { this._isProcessing = true; this.nextUpload(); return true; @@ -48,32 +124,50 @@ OC.upload = { } }, nextUpload:function(){ - if (this._uploadQueue.length > 0) { - var data = this._uploadQueue.pop(); - var jqXHR = data.submit(); - - // remember jqXHR to show warning to user when he navigates away but an upload is still in progress - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - if(typeof uploadingFiles[dirName] === 'undefined') { - uploadingFiles[dirName] = {}; - } - uploadingFiles[dirName][data.files[0].name] = jqXHR; - } else { - uploadingFiles[data.files[0].name] = jqXHR; - } + if (this._queue.length > 0) { + var data = this._queue.pop(); + var selection = this.getSelection(data.originalFiles); + selection.uploads[data.files[0]] = data.submit(); + } else { //queue is empty, we are done this._isProcessing = false; + //TODO free data } + }, + progressBytes: function() { + var total = 0; + var loaded = 0; + jQuery.each(this._selections, function (i, selection) { + total += selection.totalBytes; + loaded += selection.loadedBytes; + }); + return (loaded/total)*100; + }, + loadedBytes: function() { + var loaded = 0; + jQuery.each(this._selections, function (i, selection) { + loaded += selection.loadedBytes; + }); + return loaded; + }, + totalBytes: function() { + var total = 0; + jQuery.each(this._selections, function (i, selection) { + total += selection.totalBytes; + }); + return total; + }, + handleExists:function(data) { + }, onCancel:function(data){ //TODO cancel all uploads - Files.cancelUploads(); - this._uploadQueue = []; - this._isProcessing = false; + OC.Upload.cancelUploads(); }, onSkip:function(data){ + var selection = this.getSelection(data.originalFiles); + selection.loadedBytes += data.loaded; this.nextUpload(); }, onReplace:function(data){ @@ -83,8 +177,14 @@ OC.upload = { }, onRename:function(data, newName){ //TODO rename file in filelist, stop spinner - data.data.append('new_name', newName); + data.data.append('newname', newName); data.submit(); + }, + setAction:function(data, action) { + + }, + setDefaultAction:function(action) { + } }; @@ -92,15 +192,23 @@ $(document).ready(function() { var file_upload_param = { dropZone: $('#content'), // restrict dropZone to content div + //singleFileUploads is on by default, so the data.files array will always have length 1 add: function(e, data) { var that = $(this); - - if (typeof data.originalFiles.checked === 'undefined') { + + // lookup selection for dir + var selection = OC.Upload.getSelection(data.originalFiles); + + if (!selection.dir) { + selection.dir = $('#dir').val(); + } + + if ( ! selection.checked ) { - var totalSize = 0; + selection.totalBytes = 0; $.each(data.originalFiles, function(i, file) { - totalSize += file.size; + selection.totalBytes += file.size; if (file.type === '' && file.size === 4096) { data.textStatus = 'dirorzero'; @@ -111,11 +219,10 @@ $(document).ready(function() { } }); - if (totalSize > $('#max_upload').val()) { + if (selection.totalBytes > $('#max_upload').val()) { data.textStatus = 'notenoughspace'; data.errorThrown = t('files', 'Not enough space available'); } - if (data.errorThrown) { //don't upload anything var fu = that.data('blueimp-fileupload') || that.data('fileupload'); @@ -123,9 +230,22 @@ $(document).ready(function() { return false; } - data.originalFiles.checked = true; // this will skip the checks on subsequent adds + //TODO refactor away: + //show cancel button + if($('html.lte9').length === 0 && data.dataType !== 'iframe') { + $('#uploadprogresswrapper input.stop').show(); + } } + //all subsequent add calls for this selection can be ignored + //allow navigating to the selection from a context + //context.selection = data.originalFiles.selection; + + //allow navigating to contexts / files of a selection + selection.files[data.files[0].name] = data; + + OC.Upload.queueUpload(data); + //TODO check filename already exists /* if ($('tr[data-file="'+data.files[0].name+'"][data-id]').length > 0) { @@ -140,14 +260,6 @@ $(document).ready(function() { } */ - //add files to queue - OC.upload.addUpload(data); - - //TODO refactor away: - //show cancel button - if($('html.lte9').length === 0 && data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').show(); - } return true; }, /** @@ -176,7 +288,8 @@ $(document).ready(function() { $('#notification').fadeOut(); }, 5000); } - delete uploadingFiles[data.files[0].name]; + var selection = OC.Upload.getSelection(data.originalFiles); + delete selection.uploads[data.files[0]]; }, progress: function(e, data) { // TODO: show nice progress bar in file row @@ -186,7 +299,8 @@ $(document).ready(function() { if($('html.lte9').length > 0) { return; } - var progress = (data.loaded/data.total)*100; + //var progress = (data.loaded/data.total)*100; + var progress = OC.Upload.progressBytes(); $('#uploadprogressbar').progressbar('value', progress); }, /** @@ -204,27 +318,22 @@ $(document).ready(function() { response = data.result[0].body.innerText; } var result=$.parseJSON(response); + var selection = OC.Upload.getSelection(data.originalFiles); - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { - OC.upload.nextUpload(); + if(typeof result[0] !== 'undefined' + && result[0].status === 'success' + ) { + selection.loadedBytes+=data.loaded; + OC.Upload.nextUpload(); } else { if (result[0].status === 'existserror') { - //TODO open dialog and retry with other name? - // get jqXHR reference - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - var jqXHR = uploadingFiles[dirName][filename]; - } else { - var jqXHR = uploadingFiles[filename]; - } - //filenames can only be changed on the server side - //TODO show "file already exists" dialog - //options: abort | skip | replace / rename - //TODO reset all-files flag? when done with selection? + //show "file already exists" dialog var original = result[0]; var replacement = data.files[0]; - OC.dialogs.fileexists(data, original, replacement, OC.upload); + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); } else { + delete selection.uploads[data.files[0]]; data.textStatus = 'servererror'; data.errorThrown = t('files', result.data.message); var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); @@ -232,19 +341,6 @@ $(document).ready(function() { } } - var filename = result[0].originalname; - - // delete jqXHR reference - if (typeof data.context !== 'undefined' && data.context.data('type') === 'dir') { - var dirName = data.context.data('file'); - delete uploadingFiles[dirName][filename]; - if ($.assocArraySize(uploadingFiles[dirName]) === 0) { - delete uploadingFiles[dirName]; - } - } else { - delete uploadingFiles[filename]; - } - }, /** * called after last upload @@ -252,17 +348,20 @@ $(document).ready(function() { * @param data */ stop: function(e, data) { - if(data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').hide(); - } + if(OC.Upload.progressBytes()>=100) { - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } + if(data.dataType !== 'iframe') { + $('#uploadprogresswrapper input.stop').hide(); + } - $('#uploadprogressbar').progressbar('value', 100); - $('#uploadprogressbar').fadeOut(); + //IE < 10 does not fire the necessary events for the progress bar. + if($('html.lte9').length > 0) { + return; + } + + $('#uploadprogressbar').progressbar('value', 100); + $('#uploadprogressbar').fadeOut(); + } } }; diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index aa66a57a7b5..277abcfdb15 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -174,7 +174,7 @@ $(document).ready(function () { FileActions.register('all', 'Delete', OC.PERMISSION_DELETE, function () { return OC.imagePath('core', 'actions/delete'); }, function (filename) { - if (Files.cancelUpload(filename)) { + if (OC.Upload.cancelUpload($('#dir').val(), filename)) { if (filename.substr) { filename = [filename]; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index f4863837ce7..335f81e04b9 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -407,151 +407,212 @@ $(document).ready(function(){ // handle upload events var file_upload_start = $('#file_upload_start'); + file_upload_start.on('fileuploaddrop', function(e, data) { - // only handle drop to dir if fileList exists - if ($('#fileList').length > 0) { - var dropTarget = $(e.originalEvent.target).closest('tr'); - if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder - data.context = dropTarget; - var dirName = dropTarget.data('file'); - // update folder in form - data.formData = function(form) { - var formArray = form.serializeArray(); - // array index 0 contains the max files size - // array index 1 contains the request token - // array index 2 contains the directory - var parentDir = formArray[2]['value']; - if (parentDir === '/') { - formArray[2]['value'] += dirName; - } else { - formArray[2]['value'] += '/'+dirName; - } - return formArray; - }; + console.log('fileuploaddrop ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + + var dropTarget = $(e.originalEvent.target).closest('tr'); + if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder + + // lookup selection for dir + var selection = OC.Upload.getSelection(data.files); + + // remember drop target + selection.dropTarget = dropTarget; + + selection.dir = dropTarget.data('file'); + if (selection.dir !== '/') { + if ($('#dir').val() === '/') { + selection.dir = '/' + selection.dir; + } else { + selection.dir = $('#dir').val() + '/' + selection.dir; + } } - } + + // update folder in form + data.formData = function(form) { + var formArray = form.serializeArray(); + // array index 0 contains the max files size + // array index 1 contains the request token + // array index 2 contains the directory + var parentDir = formArray[2]['value']; + if (parentDir === '/') { + formArray[2]['value'] += selection.dir; + } else { + formArray[2]['value'] += '/' + selection.dir; + } + + return formArray; + }; + } + }); file_upload_start.on('fileuploadadd', function(e, data) { - // only add to fileList if it exists - if ($('#fileList').length > 0) { + console.log('fileuploadadd ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + + // lookup selection for dir + var selection = OC.Upload.getSelection(data.originalFiles); + + if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){//finish delete if we are uploading a deleted file + FileList.finishDelete(null, true); //delete file before continuing + } + + // add ui visualization to existing folder + if(selection.dropTarget && selection.dropTarget.data('type') === 'dir') { + // add to existing folder + var dirName = selection.dropTarget.data('file'); + + // set dir context + data.context = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName); - if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){//finish delete if we are uploading a deleted file - FileList.finishDelete(null, true); //delete file before continuing + // update upload counter ui + var uploadtext = data.context.find('.uploadtext'); + var currentUploads = parseInt(uploadtext.attr('currentUploads')); + currentUploads += 1; + uploadtext.attr('currentUploads', currentUploads); + + if(currentUploads === 1) { + var img = OC.imagePath('core', 'loading.gif'); + data.context.find('td.filename').attr('style','background-image:url('+img+')'); + uploadtext.text(t('files', '1 file uploading')); + uploadtext.show(); + } else { + uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); } + } + + }); + file_upload_start.on('fileuploaddone', function(e, data) { + console.log('fileuploaddone ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + + var response; + if (typeof data.result === 'string') { + response = data.result; + } else { + // fetch response from iframe + response = data.result[0].body.innerText; + } + var result=$.parseJSON(response); - // add ui visualization to existing folder - var dropTarget = $(e.originalEvent.target).closest('tr'); - if(dropTarget && dropTarget.data('type') === 'dir') { - // add to existing folder - var dirName = dropTarget.data('file'); + if(typeof result[0] !== 'undefined' && result[0].status === 'success') { + var file = result[0]; - // set dir context - data.context = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName); + if (data.context && data.context.data('type') === 'dir') { // update upload counter ui var uploadtext = data.context.find('.uploadtext'); var currentUploads = parseInt(uploadtext.attr('currentUploads')); - currentUploads += 1; + currentUploads -= 1; uploadtext.attr('currentUploads', currentUploads); - if(currentUploads === 1) { - var img = OC.imagePath('core', 'loading.gif'); + if(currentUploads === 0) { + var img = OC.imagePath('core', 'filetypes/folder.png'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(t('files', '1 file uploading')); - uploadtext.show(); + uploadtext.text(''); + uploadtext.hide(); } else { uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); } - } - } - }); - file_upload_start.on('fileuploaddone', function(e, data) { - // only update the fileList if it exists - if ($('#fileList').length > 0) { - var response; - if (typeof data.result === 'string') { - response = data.result; + + // update folder size + var size = parseInt(data.context.data('size')); + size += parseInt(file.size); + data.context.attr('data-size', size); + data.context.find('td.filesize').text(humanFileSize(size)); + } else { - // fetch response from iframe - response = data.result[0].body.innerText; - } - var result=$.parseJSON(response); - - if(typeof result[0] !== 'undefined' && result[0].status === 'success') { - var file = result[0]; - - if (data.context && data.context.data('type') === 'dir') { - - // update upload counter ui - var uploadtext = data.context.find('.uploadtext'); - var currentUploads = parseInt(uploadtext.attr('currentUploads')); - currentUploads -= 1; - uploadtext.attr('currentUploads', currentUploads); - if(currentUploads === 0) { - var img = OC.imagePath('core', 'filetypes/folder.png'); - data.context.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(''); - uploadtext.hide(); - } else { - uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); - } - // update folder size - var size = parseInt(data.context.data('size')); - size += parseInt(file.size) ; - data.context.attr('data-size', size); - data.context.find('td.filesize').text(humanFileSize(size)); + // add as stand-alone row to filelist + var size=t('files','Pending'); + if (data.files[0].size>=0){ + size=data.files[0].size; + } + var date=new Date(); + var param = {}; + if ($('#publicUploadRequestToken').length) { + param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + file.name; + } + //should the file exist in the list remove it + FileList.remove(file.name); + + // create new file context + data.context = FileList.addFile(file.name, file.size, date, false, false, param); - } else { - - // add as stand-alone row to filelist - var uniqueName = getUniqueName(data.files[0].name); - var size=t('files','Pending'); - if (data.files[0].size>=0){ - size=data.files[0].size; - } - var date=new Date(); - var param = {}; - if ($('#publicUploadRequestToken').length) { - param.download_url = document.location.href + '&download&path=/' + $('#dir').val() + '/' + uniqueName; - } - - //should the file exist in the list remove it - FileList.remove(file.name); + // update file data + data.context.attr('data-mime',file.mime).attr('data-id',file.id); - // create new file context - 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); - - getMimeIcon(file.mime, function(path){ - data.context.find('td.filename').attr('style','background-image:url('+path+')'); - }); - } + getMimeIcon(file.mime, function(path){ + data.context.find('td.filename').attr('style','background-image:url('+path+')'); + }); } } }); + + file_upload_start.on('fileuploadalways', function(e, data) { + console.log('fileuploadalways ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + }); + file_upload_start.on('fileuploadsend', function(e, data) { + console.log('fileuploadsend ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + + // TODOD add vis + //data.context.element = + }); + file_upload_start.on('fileuploadprogress', function(e, data) { + console.log('fileuploadprogress ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + }); + file_upload_start.on('fileuploadprogressall', function(e, data) { + console.log('fileuploadprogressall ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + }); + file_upload_start.on('fileuploadstop', function(e, data) { + console.log('fileuploadstop ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + }); + file_upload_start.on('fileuploadfail', function(e, data) { + console.log('fileuploadfail ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); + }); + /* file_upload_start.on('fileuploadfail', function(e, data) { - // only update the fileList if it exists + console.log('fileuploadfail'+((data.files&&data.files.length>0)?' '+data.files[0].name:'')); + + // if we are uploading to a subdirectory + if (data.context && data.context.data('type') === 'dir') { + + // update upload counter ui + var uploadtext = data.context.find('.uploadtext'); + var currentUploads = parseInt(uploadtext.attr('currentUploads')); + currentUploads -= 1; + uploadtext.attr('currentUploads', currentUploads); + if(currentUploads === 0) { + var img = OC.imagePath('core', 'filetypes/folder.png'); + data.context.find('td.filename').attr('style','background-image:url('+img+')'); + uploadtext.text(''); + uploadtext.hide(); + } else { + uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); + } + + } + // cleanup files, error notification has been shown by fileupload code var tr = data.context; if (typeof tr === 'undefined') { tr = $('tr').filterAttr('data-file', data.files[0].name); } if (tr.attr('data-type') === 'dir') { + //cleanup uploading to a dir var uploadtext = tr.find('.uploadtext'); var img = OC.imagePath('core', 'filetypes/folder.png'); tr.find('td.filename').attr('style','background-image:url('+img+')'); uploadtext.text(''); uploadtext.hide(); //TODO really hide already + } else { + //TODO add row when sending file //remove file tr.fadeOut(); tr.remove(); } }); - +*/ $('#notification').hide(); $('#notification').on('click', '.undo', function(){ if (FileList.deleteFiles) { diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 3fad3fae7d3..a907aeab1fc 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,31 +1,5 @@ var uploadingFiles = {}; Files={ - cancelUpload:function(filename) { - if(uploadingFiles[filename]) { - uploadingFiles[filename].abort(); - delete uploadingFiles[filename]; - return true; - } - return false; - }, - cancelUploads:function() { - $.each(uploadingFiles,function(index,file) { - if(typeof file['abort'] === 'function') { - file.abort(); - var filename = $('tr').filterAttr('data-file',index); - filename.hide(); - filename.find('input[type="checkbox"]').removeAttr('checked'); - filename.removeClass('selected'); - } else { - $.each(file,function(i,f) { - f.abort(); - delete file[i]; - }); - } - delete uploadingFiles[index]; - }); - procesSelection(); - }, updateMaxUploadFilesize:function(response) { if(response == undefined) { return; @@ -117,7 +91,8 @@ $(document).ready(function() { // Trigger cancelling of file upload $('#uploadprogresswrapper .stop').on('click', function() { - Files.cancelUploads(); + OC.Upload.cancelUploads(); + procesSelection(); }); // Show trash bin diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 294223aa094..a20b4ae636f 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -62,7 +62,10 @@ $(document).ready(function() { // Add Uploadprogress Wrapper to controls bar $('#controls').append($('#additional_controls div#uploadprogresswrapper')); - // Cancel upload trigger - $('#cancel_upload_button').click(Files.cancelUploads); + // Cancel upload trigger + $('#cancel_upload_button').click(function() { + OC.Upload.cancelUploads(); + procesSelection(); + }); }); diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 88a3f6628cb..ea03ef21455 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -207,105 +207,142 @@ var OCdialogs = { * @param {object} controller a controller with onCancel, onSkip, onReplace and onRename methods */ fileexists:function(data, original, replacement, controller) { - if (typeof controller !== 'object') { - controller = {}; - } - var self = this; - $.when(this._getFileExistsTemplate()).then(function($tmpl) { - var dialog_name = 'oc-dialog-fileexists-' + OCdialogs.dialogs_counter + '-content'; - var dialog_id = '#' + dialog_name; - var title = t('files','Replace »{filename}«?',{filename: original.name}); - var $dlg = $tmpl.octemplate({ - dialog_name: dialog_name, - title: title, - type: 'fileexists', - - why: t('files','Another file with the same name already exists in "{dir}".',{dir:'somedir'}), - what: t('files','Replacing it will overwrite it\'s contents.'), - original_heading: t('files','Original file'), - original_size: t('files','Size: {size}',{size: original.size}), - original_mtime: t('files','Last changed: {mtime}',{mtime: original.mtime}), + var selection = controller.getSelection(data.originalFiles); + if (selection.defaultAction) { + controller[selection.defaultAction](data); + } else { + $.when(this._getFileExistsTemplate()).then(function($tmpl) { + var dialog_name = 'oc-dialog-fileexists-' + OCdialogs.dialogs_counter + '-content'; + var dialog_id = '#' + dialog_name; + var title = t('files','Replace »{filename}«?',{filename: original.name}); + var original_size= t('files','Size: {size}',{size: original.size}); + var original_mtime = t('files','Last changed: {mtime}',{mtime: original.mtime}); + var replacement_size= t('files','Size: {size}',{size: replacement.size}); + var replacement_mtime = t('files','Last changed: {mtime}',{mtime: replacement.mtime}); + var $dlg = $tmpl.octemplate({ + dialog_name: dialog_name, + title: title, + type: 'fileexists', - replacement_heading: t('files','Replace with'), - replacement_size: t('files','Size: {size}',{size: replacement.size}), - replacement_mtime: t('files','Last changed: {mtime}',{mtime: replacement.mtime}), + why: t('files','Another file with the same name already exists in "{dir}".',{dir:'somedir'}), + what: t('files','Replacing it will overwrite it\'s contents.'), + original_heading: t('files','Original file'), + original_size: original_size, + original_mtime: original_mtime, - new_name_label: t('files','Choose a new name for the target.'), - all_files_label: t('files','Use this action for all files.') - }); - $('body').append($dlg); - - $(dialog_id + ' .original .icon').css('background-image','url('+OC.imagePath('core', 'filetypes/file.png')+')'); - $(dialog_id + ' .replacement .icon').css('background-image','url('+OC.imagePath('core', 'filetypes/file.png')+')'); - $(dialog_id + ' #new-name').val(original.name); - - - $(dialog_id + ' #new-name').on('keyup', function(e){ - if ($(dialog_id + ' #new-name').val() === original.name) { - - $(dialog_id + ' + div .rename').removeClass('primary').hide(); - $(dialog_id + ' + div .replace').addClass('primary').show(); - } else { - $(dialog_id + ' + div .rename').addClass('primary').show(); - $(dialog_id + ' + div .replace').removeClass('primary').hide(); - } - }); + replacement_heading: t('files','Replace with'), + replacement_size: replacement_size, + replacement_mtime: replacement_mtime, - buttonlist = [{ - text: t('core', 'Cancel'), - classes: 'cancel', - click: function(){ - if ( typeof controller.onCancel !== 'undefined') { - controller.onCancel(data); - } - $(dialog_id).ocdialog('close'); + new_name_label: t('files','Choose a new name for the target.'), + all_files_label: t('files','Use this action for all files.') + }); + $('body').append($dlg); + + getMimeIcon(original.type,function(path){ + $(dialog_id + ' .original .icon').css('background-image','url('+path+')'); + }); + getMimeIcon(replacement.type,function(path){ + $(dialog_id + ' .replacement .icon').css('background-image','url('+path+')'); + }); + $(dialog_id + ' #newname').val(original.name); + + + $(dialog_id + ' #newname').on('keyup', function(e){ + if ($(dialog_id + ' #newname').val() === original.name) { + $(dialog_id + ' + div .rename').removeClass('primary').hide(); + $(dialog_id + ' + div .replace').addClass('primary').show(); + } else { + $(dialog_id + ' + div .rename').addClass('primary').show(); + $(dialog_id + ' + div .replace').removeClass('primary').hide(); } - }, - { - text: t('core', 'Skip'), - classes: 'skip', - click: function(){ - if ( typeof controller.onSkip !== 'undefined') { - controller.onSkip(data); + }); + + buttonlist = [{ + text: t('core', 'Cancel'), + classes: 'cancel', + click: function(){ + if ( typeof controller.onCancel !== 'undefined') { + controller.onCancel(data); + } + $(dialog_id).ocdialog('close'); } - $(dialog_id).ocdialog('close'); - } - }, - { - text: t('core', 'Replace'), - classes: 'replace', - click: function(){ - if ( typeof controller.onReplace !== 'undefined') { - controller.onReplace(data); + }, + { + text: t('core', 'Skip'), + classes: 'skip', + click: function(){ + if ( typeof controller.onSkip !== 'undefined') { + if($(dialog_id + ' #allfiles').prop('checked')){ + selection.defaultAction = 'onSkip'; + /*selection.defaultAction = function(){ + controller.onSkip(data); + };*/ + } + controller.onSkip(data); + } + // trigger fileupload done with status skip + //data.result[0].status = 'skip'; + //fileupload._trigger('done', data.e, data); + $(dialog_id).ocdialog('close'); } - $(dialog_id).ocdialog('close'); }, - defaultButton: true - }, - { - text: t('core', 'Rename'), - classes: 'rename', - click: function(){ - if ( typeof controller.onRename !== 'undefined') { - controller.onRename(data, $(dialog_id + ' #new-name').val()); + { + text: t('core', 'Replace'), + classes: 'replace', + click: function(){ + if ( typeof controller.onReplace !== 'undefined') { + if($(dialog_id + ' #allfiles').prop('checked')){ + selection.defaultAction = 'onReplace'; + /*selection.defaultAction = function(){ + controller.onReplace(data); + };*/ + } + controller.onReplace(data); + } + $(dialog_id).ocdialog('close'); + }, + defaultButton: true + }, + { + text: t('core', 'Rename'), + classes: 'rename', + click: function(){ + if ( typeof controller.onRename !== 'undefined') { + //TODO use autorename when repeat is checked + controller.onRename(data, $(dialog_id + ' #newname').val()); + } + $(dialog_id).ocdialog('close'); } - $(dialog_id).ocdialog('close'); - } - }]; + }]; - $(dialog_id).ocdialog({ - closeOnEscape: true, - modal: true, - buttons: buttonlist, - closeButton: null + $(dialog_id).ocdialog({ + width: 500, + closeOnEscape: true, + modal: true, + buttons: buttonlist, + closeButton: null + }); + OCdialogs.dialogs_counter++; + + $(dialog_id + ' + div .rename').hide(); + $(dialog_id + ' #newname').hide(); + + $(dialog_id + ' #newnamecb').on('change', function(){ + if ($(dialog_id + ' #newnamecb').prop('checked')) { + $(dialog_id + ' #newname').fadeIn(); + } else { + $(dialog_id + ' #newname').fadeOut(); + $(dialog_id + ' #newname').val(original.name); + } + }); + + + }) + .fail(function() { + alert(t('core', 'Error loading file exists template')); }); - OCdialogs.dialogs_counter++; - - $(dialog_id + ' + div .rename').hide(); - }) - .fail(function() { - alert(t('core', 'Error loading file exists template')); - }); + } }, _getFilePickerTemplate: function() { var defer = $.Deferred(); -- cgit v1.2.3 From 7c9d9992432839f2265b8f6b0f43ed15bfca9ff1 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 22 Aug 2013 14:29:00 +0200 Subject: reduced complexity, added listing conflicts to dialog --- apps/files/ajax/upload.php | 1 + apps/files/css/files.css | 53 +++++--- apps/files/js/file-upload.js | 226 +++++++++++++++++++++++--------- core/js/oc-dialogs.js | 305 +++++++++++++++++++++++++++---------------- 4 files changed, 390 insertions(+), 195 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 619b5f6a04b..218482cb41d 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -131,6 +131,7 @@ if (strpos($dir, '..') === false) { $result[] = array('status' => 'success', 'mime' => $meta['mimetype'], + 'mtime' => $meta['mtime'], 'size' => $meta['size'], 'id' => $meta['fileid'], 'name' => basename($target), diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 0ff25a24d76..dcd6aeadf82 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -193,28 +193,54 @@ table.dragshadow td.size { .oc-dialog .fileexists table { width: 100%; } -.oc-dialog .fileexists .original .icon { +.oc-dialog .fileexists th { + padding-left: 0; + padding-right: 0; +} +.oc-dialog .fileexists th input[type='checkbox'] { + margin-right: 3px; +} +.oc-dialog .fileexists th:first-child { + width: 235px; +} +.oc-dialog .fileexists th label { + font-weight: normal; + color:black; +} +.oc-dialog .fileexists th .count { + margin-left: 3px; +} +.oc-dialog .fileexists .conflict { + width: 100%; + height: 85px; +} +.oc-dialog .fileexists .conflict .filename { + color:#777; + word-break: break-all; +} +.oc-dialog .fileexists .icon { width: 64px; height: 64px; - margin: 5px 5px 5px 0px; + margin: 0px 5px 5px 5px; background-repeat: no-repeat; background-size: 64px 64px; float: left; } .oc-dialog .fileexists .replacement { - margin-top: 20px; - margin-bottom: 20px; + float: left; + width: 235px; } - -.oc-dialog .fileexists .replacement .icon { - width: 64px; - height: 64px; - margin: 5px 5px 5px 0px; - background-repeat: no-repeat; - background-size: 64px 64px; +.oc-dialog .fileexists .original { + float: left; + width: 235px; +} +.oc-dialog .fileexists .conflict-wrapper { + overflow-y:scroll; + max-height: 225px; +} +.oc-dialog .fileexists .conflict-wrapper input[type='checkbox'] { float: left; - clear: both; } .oc-dialog .fileexists .toggle { @@ -234,9 +260,6 @@ table.dragshadow td.size { vertical-align: bottom; } -.oc-dialog .fileexists h3 { - font-weight: bold; -} .oc-dialog .oc-dialog-buttonrow { diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index c620942170c..ec8c97ff457 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -1,4 +1,43 @@ /** + * + * and yet another idea how to handle file uploads: + * let the jquery fileupload thing handle as much as possible + * + * use singlefileupload + * on first add of every selection + * - check all files of originalFiles array with files in dir + * - on conflict show dialog + * - skip all -> remember as default action + * - replace all -> remember as default action + * - choose -> show choose dialog + * - mark files to keep + * - when only existing -> remember as single skip action + * - when only new -> remember as single replace action + * - when both -> remember as single autorename action + * - start uploading selection + * + * on send + * - if single action or default action + * - when skip -> abort upload + * ..- when replace -> add replace=true parameter + * ..- when rename -> add newName=filename parameter + * ..- when autorename -> add autorename=true parameter + * + * on fail + * - if server sent existserror + * - show dialog + * - on skip single -> abort single upload + * - on skip always -> remember as default action + * - on replace single -> replace single upload + * - on replace always -> remember as default action + * - on rename single -> rename single upload, propose autorename - when changed disable remember always checkbox + * - on rename always -> remember autorename as default action + * - resubmit data + * + * on uplad done + * - if last upload -> unset default action + * + * ------------------------------------------------------------- * * use put t ocacnel upload before it starts? use chunked uploads? * @@ -202,11 +241,11 @@ OC.Upload = { data.submit(); }, logStatus:function(caption, e, data) { - console.log(caption+' ' +OC.Upload.loadedBytes()+' / '+OC.Upload.totalBytes()); - if (data) { - console.log(data); - } - console.log(e); + console.log(caption); + console.log(data); + }, + checkExistingFiles: function (selection, callbacks){ + callbacks.onNoConflicts(selection); } }; @@ -214,44 +253,110 @@ $(document).ready(function() { var file_upload_param = { dropZone: $('#content'), // restrict dropZone to content div + autoUpload: false, + sequentialUploads: true, //singleFileUploads is on by default, so the data.files array will always have length 1 + /** + * on first add of every selection + * - check all files of originalFiles array with files in dir + * - on conflict show dialog + * - skip all -> remember as single skip action for all conflicting files + * - replace all -> remember as single replace action for all conflicting files + * - choose -> show choose dialog + * - mark files to keep + * - when only existing -> remember as single skip action + * - when only new -> remember as single replace action + * - when both -> remember as single autorename action + * - start uploading selection + * @param {type} e + * @param {type} data + * @returns {Boolean} + */ add: function(e, data) { OC.Upload.logStatus('add', e, data); var that = $(this); - // lookup selection for dir - var selection = OC.Upload.getSelection(data.originalFiles); + // we need to collect all data upload objects before starting the upload so we can check their existence + // and set individual conflict actions. unfortunately there is only one variable that we can use to identify + // the selection a data upload is part of, so we have to collect them in data.originalFiles + // turning singleFileUploads off is not an option because we want to gracefully handle server errors like + // already exists - if (!selection.dir) { - selection.dir = $('#dir').val(); + // create a container where we can store the data objects + if ( ! data.originalFiles.selection ) { + // initialize selection and remember number of files to upload + data.originalFiles.selection = { + uploads: [], + filesToUpload: data.originalFiles.length, + totalBytes: 0 + }; } + var selection = data.originalFiles.selection; - if ( ! selection.checked ) { + // add uploads + if ( selection.uploads.length < selection.filesToUpload ){ + // remember upload + selection.uploads.push(data); + } + + //examine file + var file = data.files[0]; + + if (file.type === '' && file.size === 4096) { + data.textStatus = 'dirorzero'; + data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes', + {filename: file.name} + ); + } + + // add size + selection.totalBytes += file.size; + + //check max upload size + if (selection.totalBytes > $('#max_upload').val()) { + data.textStatus = 'notenoughspace'; + data.errorThrown = t('files', 'Not enough space available'); + } + + // end upload for whole selection on error + if (data.errorThrown) { + // trigger fileupload fail + var fu = that.data('blueimp-fileupload') || that.data('fileupload'); + fu._trigger('fail', e, data); + return false; //don't upload anything + } + + // check existing files whan all is collected + if ( selection.uploads.length >= selection.filesToUpload ) { - selection.totalBytes = 0; - $.each(data.originalFiles, function(i, file) { - selection.totalBytes += file.size; + //remove our selection hack: + delete data.originalFiles.selection; - if (file.type === '' && file.size === 4096) { - data.textStatus = 'dirorzero'; - data.errorThrown = t('files', 'Unable to upload {filename} as it is a directory or has 0 bytes', - {filename: file.name} - ); - return false; + var callbacks = { + + onNoConflicts: function (selection) { + $.each(selection.uploads, function(i, upload) { + upload.submit(); + }); + }, + onSkipConflicts: function (selection) { + //TODO mark conflicting files as toskip + }, + onReplaceConflicts: function (selection) { + //TODO mark conflicting files as toreplace + }, + onChooseConflicts: function (selection) { + //TODO mark conflicting files as chosen + }, + onCancel: function (selection) { + $.each(selection.uploads, function(i, upload) { + upload.abort(); + }); } - }); + }; - if (selection.totalBytes > $('#max_upload').val()) { - data.textStatus = 'notenoughspace'; - data.errorThrown = t('files', 'Not enough space available'); - } - if (data.errorThrown) { - //don't upload anything - var fu = that.data('blueimp-fileupload') || that.data('fileupload'); - fu._trigger('fail', e, data); - return false; - } + OC.Upload.checkExistingFiles(selection, callbacks); //TODO refactor away: //show cancel button @@ -259,15 +364,8 @@ $(document).ready(function() { $('#uploadprogresswrapper input.stop').show(); } } + - //all subsequent add calls for this selection can be ignored - //allow navigating to the selection from a context - //context.selection = data.originalFiles.selection; - - //allow navigating to contexts / files of a selection - selection.files[data.files[0].name] = data; - - OC.Upload.queueUpload(data); //TODO check filename already exists /* @@ -283,7 +381,7 @@ $(document).ready(function() { } */ - return true; + return true; // continue adding files }, /** * called after the first add, does NOT have the data param @@ -314,8 +412,8 @@ $(document).ready(function() { $('#notification').fadeOut(); }, 5000); } - var selection = OC.Upload.getSelection(data.originalFiles); - OC.Upload.deleteSelectionUpload(selection, data.files[0].name); + //var selection = OC.Upload.getSelection(data.originalFiles); + //OC.Upload.deleteSelectionUpload(selection, data.files[0].name); //if user pressed cancel hide upload progress bar and cancel button if (data.errorThrown === 'abort') { @@ -339,8 +437,8 @@ $(document).ready(function() { if($('html.lte9').length > 0) { return; } - //var progress = (data.loaded/data.total)*100; - var progress = OC.Upload.progressBytes(); + var progress = (data.loaded/data.total)*100; + //var progress = OC.Upload.progressBytes(); $('#uploadprogressbar').progressbar('value', progress); }, /** @@ -359,15 +457,15 @@ $(document).ready(function() { response = data.result[0].body.innerText; } var result=$.parseJSON(response); - var selection = OC.Upload.getSelection(data.originalFiles); + //var selection = OC.Upload.getSelection(data.originalFiles); if(typeof result[0] !== 'undefined' && result[0].status === 'success' ) { - if (selection) { - selection.loadedBytes+=data.loaded; - } - OC.Upload.nextUpload(); + //if (selection) { + // selection.loadedBytes+=data.loaded; + //} + //OC.Upload.nextUpload(); } else { if (result[0].status === 'existserror') { //show "file already exists" dialog @@ -385,10 +483,10 @@ $(document).ready(function() { } //if user pressed cancel hide upload chrome - if (! OC.Upload.isProcessing()) { - $('#uploadprogresswrapper input.stop').fadeOut(); - $('#uploadprogressbar').fadeOut(); - } + //if (! OC.Upload.isProcessing()) { + // $('#uploadprogresswrapper input.stop').fadeOut(); + // $('#uploadprogressbar').fadeOut(); + //} }, /** @@ -398,27 +496,27 @@ $(document).ready(function() { */ stop: function(e, data) { OC.Upload.logStatus('stop', e, data); - if(OC.Upload.progressBytes()>=100) { //only hide controls when all selections have ended uploading + //if(OC.Upload.progressBytes()>=100) { //only hide controls when all selections have ended uploading - OC.Upload.cancelUploads(); //cleanup + //OC.Upload.cancelUploads(); //cleanup - if(data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').hide(); - } + // if(data.dataType !== 'iframe') { + // $('#uploadprogresswrapper input.stop').hide(); + // } //IE < 10 does not fire the necessary events for the progress bar. if($('html.lte9').length > 0) { return; } - $('#uploadprogressbar').progressbar('value', 100); - $('#uploadprogressbar').fadeOut(); - } + // $('#uploadprogressbar').progressbar('value', 100); + // $('#uploadprogressbar').fadeOut(); + //} //if user pressed cancel hide upload chrome - if (! OC.Upload.isProcessing()) { - $('#uploadprogresswrapper input.stop').fadeOut(); - $('#uploadprogressbar').fadeOut(); - } + //if (! OC.Upload.isProcessing()) { + // $('#uploadprogresswrapper input.stop').fadeOut(); + // $('#uploadprogressbar').fadeOut(); + //} } }; diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index ea03ef21455..a101cce9d1f 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -200,148 +200,221 @@ var OCdialogs = { alert(t('core', 'Error loading message template')); }); }, + _fileexistsshown: false, /** * Displays file exists dialog - * @param {object} original a file with name, size and mtime - * @param {object} replacement a file with name, size and mtime - * @param {object} controller a controller with onCancel, onSkip, onReplace and onRename methods + * @param {object} data upload object + * @param {object} original file with name, size and mtime + * @param {object} replacement file with name, size and mtime + * @param {object} controller with onCancel, onSkip, onReplace and onRename methods */ fileexists:function(data, original, replacement, controller) { + var self = this; var selection = controller.getSelection(data.originalFiles); if (selection.defaultAction) { controller[selection.defaultAction](data); } else { - $.when(this._getFileExistsTemplate()).then(function($tmpl) { - var dialog_name = 'oc-dialog-fileexists-' + OCdialogs.dialogs_counter + '-content'; - var dialog_id = '#' + dialog_name; - var title = t('files','Replace »{filename}«?',{filename: original.name}); - var original_size= t('files','Size: {size}',{size: original.size}); - var original_mtime = t('files','Last changed: {mtime}',{mtime: original.mtime}); - var replacement_size= t('files','Size: {size}',{size: replacement.size}); - var replacement_mtime = t('files','Last changed: {mtime}',{mtime: replacement.mtime}); - var $dlg = $tmpl.octemplate({ - dialog_name: dialog_name, - title: title, - type: 'fileexists', - - why: t('files','Another file with the same name already exists in "{dir}".',{dir:'somedir'}), - what: t('files','Replacing it will overwrite it\'s contents.'), - original_heading: t('files','Original file'), - original_size: original_size, - original_mtime: original_mtime, - - replacement_heading: t('files','Replace with'), - replacement_size: replacement_size, - replacement_mtime: replacement_mtime, - - new_name_label: t('files','Choose a new name for the target.'), - all_files_label: t('files','Use this action for all files.') - }); - $('body').append($dlg); - + var dialog_name = 'oc-dialog-fileexists-content'; + var dialog_id = '#' + dialog_name; + if (this._fileexistsshown) { + // add row + var conflict = $(dialog_id+ ' .conflict').last().clone(); + conflict.find('.name').text(original.name); + conflict.find('.original .size').text(humanFileSize(original.size)); + conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); + conflict.find('.replacement .size').text(humanFileSize(replacement.size)); + conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); getMimeIcon(original.type,function(path){ - $(dialog_id + ' .original .icon').css('background-image','url('+path+')'); + conflict.find('.original .icon').css('background-image','url('+path+')'); }); getMimeIcon(replacement.type,function(path){ - $(dialog_id + ' .replacement .icon').css('background-image','url('+path+')'); + conflict.find('.replacement .icon').css('background-image','url('+path+')'); }); - $(dialog_id + ' #newname').val(original.name); + $(dialog_id+' .conflict').last().after(conflict); + $(dialog_id).parent().children('.oc-dialog-title').text(t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict').length})); + + //set more recent mtime bold + if (replacement.lastModifiedDate.getTime() > original.mtime*1000) { + conflict.find('.replacement .mtime').css('font-weight', 'bold'); + } else if (replacement.lastModifiedDate.getTime() < original.mtime*1000) { + conflict.find('.original .mtime').css('font-weight', 'bold'); + } else { + //TODO add to same mtime colletion? + } + + // set bigger size bold + if (replacement.size > original.size) { + conflict.find('.replacement .size').css('font-weight','bold'); + } else if (replacement.size < original.size) { + conflict.find('.original .size').css('font-weight','bold'); + } else { + //TODO add to same size colletion? + } + + //add checkbox toggling actions + conflict.find('.replacement,.original').on('click', function(){ + var checkbox = $(this).find('input[type="checkbox"]'); + checkbox.prop('checkbox', !checkbox.prop('checkbox')); + }).find('input[type="checkbox"]').prop('checkbox',false); + + //TODO show skip action for files with same size and mtime + + $(window).trigger('resize'); + } else { + //create dialog + this._fileexistsshown = true; + $.when(this._getFileExistsTemplate()).then(function($tmpl) { + var title = t('files','One file conflict'); + var original_size = humanFileSize(original.size); + var original_mtime = formatDate(original.mtime*1000); + var replacement_size= humanFileSize(replacement.size); + var replacement_mtime = formatDate(replacement.lastModifiedDate); + var $dlg = $tmpl.octemplate({ + dialog_name: dialog_name, + title: title, + type: 'fileexists', + why: t('files','Which files do you want to keep?'), + what: t('files','If you select both versions, the copied file will have a number added to its name.'), + filename: original.name, + + original_size: original_size, + original_mtime: original_mtime, - $(dialog_id + ' #newname').on('keyup', function(e){ - if ($(dialog_id + ' #newname').val() === original.name) { - $(dialog_id + ' + div .rename').removeClass('primary').hide(); - $(dialog_id + ' + div .replace').addClass('primary').show(); - } else { - $(dialog_id + ' + div .rename').addClass('primary').show(); - $(dialog_id + ' + div .replace').removeClass('primary').hide(); - } - }); + replacement_size: replacement_size, + replacement_mtime: replacement_mtime + }); + $('body').append($dlg); - buttonlist = [{ - text: t('core', 'Cancel'), - classes: 'cancel', - click: function(){ - if ( typeof controller.onCancel !== 'undefined') { - controller.onCancel(data); - } - $(dialog_id).ocdialog('close'); - } - }, - { - text: t('core', 'Skip'), - classes: 'skip', - click: function(){ - if ( typeof controller.onSkip !== 'undefined') { - if($(dialog_id + ' #allfiles').prop('checked')){ - selection.defaultAction = 'onSkip'; - /*selection.defaultAction = function(){ - controller.onSkip(data); - };*/ - } - controller.onSkip(data); - } - // trigger fileupload done with status skip - //data.result[0].status = 'skip'; - //fileupload._trigger('done', data.e, data); - $(dialog_id).ocdialog('close'); + getMimeIcon(original.type,function(path){ + $(dialog_id + ' .original .icon').css('background-image','url('+path+')'); + }); + getMimeIcon(replacement.type,function(path){ + $(dialog_id + ' .replacement .icon').css('background-image','url('+path+')'); + }); + $(dialog_id + ' #newname').val(original.name); + + $(dialog_id + ' #newname').on('keyup', function(e){ + if ($(dialog_id + ' #newname').val() === original.name) { + $(dialog_id + ' + div .rename').removeClass('primary').hide(); + $(dialog_id + ' + div .replace').addClass('primary').show(); + } else { + $(dialog_id + ' + div .rename').addClass('primary').show(); + $(dialog_id + ' + div .replace').removeClass('primary').hide(); } - }, - { - text: t('core', 'Replace'), - classes: 'replace', - click: function(){ - if ( typeof controller.onReplace !== 'undefined') { - if($(dialog_id + ' #allfiles').prop('checked')){ - selection.defaultAction = 'onReplace'; - /*selection.defaultAction = function(){ - controller.onReplace(data); - };*/ + }); + + buttonlist = [{ + text: t('core', 'Cancel'), + classes: 'cancel', + click: function(){ + self._fileexistsshown = false; + if ( typeof controller.onCancel !== 'undefined') { + controller.onCancel(data); } - controller.onReplace(data); + $(dialog_id).ocdialog('close'); } - $(dialog_id).ocdialog('close'); }, - defaultButton: true - }, - { - text: t('core', 'Rename'), - classes: 'rename', - click: function(){ - if ( typeof controller.onRename !== 'undefined') { - //TODO use autorename when repeat is checked - controller.onRename(data, $(dialog_id + ' #newname').val()); + { + text: t('core', 'Continue'), + classes: 'continue', + click: function(){ + self._fileexistsshown = false; + if ( typeof controller.onRename !== 'undefined') { + //TODO use autorename when repeat is checked + controller.onRename(data, $(dialog_id + ' #newname').val()); + } + $(dialog_id).ocdialog('close'); } - $(dialog_id).ocdialog('close'); + }]; + + $(dialog_id).ocdialog({ + width: 500, + closeOnEscape: true, + modal: true, + buttons: buttonlist, + closeButton: null + }); + + $(dialog_id + ' + div .rename').hide(); + $(dialog_id + ' #newname').hide(); + + $(dialog_id + ' #newnamecb').on('change', function(){ + if ($(dialog_id + ' #newnamecb').prop('checked')) { + $(dialog_id + ' #newname').fadeIn(); + } else { + $(dialog_id + ' #newname').fadeOut(); + $(dialog_id + ' #newname').val(original.name); } - }]; + }); + $(dialog_id).css('height','auto'); - $(dialog_id).ocdialog({ - width: 500, - closeOnEscape: true, - modal: true, - buttons: buttonlist, - closeButton: null - }); - OCdialogs.dialogs_counter++; + var conflict = $(dialog_id + ' .conflict').last(); + //set more recent mtime bold + if (replacement.lastModifiedDate.getTime() > original.mtime*1000) { + conflict.find('.replacement .mtime').css('font-weight','bold'); + } else if (replacement.lastModifiedDate.getTime() < original.mtime*1000) { + conflict.find('.original .mtime').css('font-weight','bold'); + } else { + //TODO add to same mtime colletion? + } - $(dialog_id + ' + div .rename').hide(); - $(dialog_id + ' #newname').hide(); - - $(dialog_id + ' #newnamecb').on('change', function(){ - if ($(dialog_id + ' #newnamecb').prop('checked')) { - $(dialog_id + ' #newname').fadeIn(); + // set bigger size bold + if (replacement.size > original.size) { + conflict.find('.replacement .size').css('font-weight','bold'); + } else if (replacement.size < original.size) { + conflict.find('.original .size').css('font-weight','bold'); } else { - $(dialog_id + ' #newname').fadeOut(); - $(dialog_id + ' #newname').val(original.name); + //TODO add to same size colletion? } - }); - - }) - .fail(function() { - alert(t('core', 'Error loading file exists template')); - }); + //add checkbox toggling actions + //add checkbox toggling actions + $(dialog_id).find('.allnewfiles').on('click', function(){ + var checkboxes = $(dialog_id).find('.replacement input[type="checkbox"]'); + checkboxes.prop('checked', $(this).prop('checked')); + }); + $(dialog_id).find('.allexistingfiles').on('click', function(){ + var checkboxes = $(dialog_id).find('.original input[type="checkbox"]'); + checkboxes.prop('checked', $(this).prop('checked')); + }); + conflict.find('.replacement,.original').on('click', function(){ + var checkbox = $(this).find('input[type="checkbox"]'); + checkbox.prop('checked', !checkbox.prop('checked')); + }); + + //update counters + $(dialog_id).on('click', '.replacement,.allnewfiles', function(){ + var count = $(dialog_id).find('.replacement input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict').length) { + $(dialog_id).find('.allnewfiles').prop('checked', true); + $(dialog_id).find('.allnewfiles + .count').text(t('files','(all selected)')); + } else if (count > 0) { + $(dialog_id).find('.allnewfiles').prop('checked', false); + $(dialog_id).find('.allnewfiles + .count').text(t('files','({count} selected)',{count:count})); + } else { + $(dialog_id).find('.allnewfiles').prop('checked', false); + $(dialog_id).find('.allnewfiles + .count').text(''); + } + }); + $(dialog_id).on('click', '.original,.allexistingfiles', function(){ + var count = $(dialog_id).find('.original input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict').length) { + $(dialog_id).find('.allexistingfiles').prop('checked', true); + $(dialog_id).find('.allexistingfiles + .count').text(t('files','(all selected)')); + } else if (count > 0) { + $(dialog_id).find('.allexistingfiles').prop('checked', false); + $(dialog_id).find('.allexistingfiles + .count').text(t('files','({count} selected)',{count:count})); + } else { + $(dialog_id).find('.allexistingfiles').prop('checked', false); + $(dialog_id).find('.allexistingfiles + .count').text(''); + } + }); + }) + .fail(function() { + alert(t('core', 'Error loading file exists template')); + }); + } } }, _getFilePickerTemplate: function() { -- cgit v1.2.3 From 49fd7e9f1e037266304053c7337c714339d82553 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Wed, 4 Sep 2013 15:24:25 +0200 Subject: refactor dialog creation --- apps/files/css/files.css | 7 +- apps/files/js/filelist.js | 12 ++-- apps/files/templates/fileexists.html | 26 +++++++ core/js/oc-dialogs.js | 134 ++++++++++++----------------------- 4 files changed, 84 insertions(+), 95 deletions(-) create mode 100644 apps/files/templates/fileexists.html (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 141f4557bed..cc556f8321a 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -356,6 +356,9 @@ table.dragshadow td.size { width: 100%; height: 85px; } +.oc-dialog .fileexists .conflict.template { + display: none; +} .oc-dialog .fileexists .conflict .filename { color:#777; word-break: break-all; @@ -377,11 +380,11 @@ table.dragshadow td.size { float: left; width: 235px; } -.oc-dialog .fileexists .conflict-wrapper { +.oc-dialog .fileexists .conflicts { overflow-y:scroll; max-height: 225px; } -.oc-dialog .fileexists .conflict-wrapper input[type='checkbox'] { +.oc-dialog .fileexists .conflict input[type='checkbox'] { float: left; } diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 77ae039f807..31e2a8300e2 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -579,13 +579,14 @@ $(document).ready(function(){ currentUploads += 1; uploadtext.attr('currentUploads', currentUploads); + var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); if(currentUploads === 1) { var img = OC.imagePath('core', 'loading.gif'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); - uploadtext.text(t('files', '1 file uploading')); + uploadtext.text(translatedText); uploadtext.show(); } else { - uploadtext.text(currentUploads + ' ' + t('files', 'files uploading')); + uploadtext.text(translatedText); } } @@ -634,7 +635,7 @@ $(document).ready(function(){ } else { // add as stand-alone row to filelist - var size=t('files','Pending'); + var size=t('files', 'Pending'); if (data.files[0].size>=0){ size=data.files[0].size; } @@ -652,8 +653,9 @@ $(document).ready(function(){ // update file data data.context.attr('data-mime',file.mime).attr('data-id',file.id); - getMimeIcon(file.mime, function(path){ - data.context.find('td.filename').attr('style','background-image:url('+path+')'); + var path = getPathForPreview(file.name); + lazyLoadPreview(path, file.mime, function(previewpath){ + data.context.find('td.filename').attr('style','background-image:url('+previewpath+')'); }); } } diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html new file mode 100644 index 00000000000..a5b2fb76908 --- /dev/null +++ b/apps/files/templates/fileexists.html @@ -0,0 +1,26 @@ +
+ {why}
+ {what}
+
+ + + +
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index b949fc74d14..5ed24417264 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -220,28 +220,24 @@ var OCdialogs = { */ fileexists:function(data, original, replacement, controller) { var self = this; - var selection = controller.getSelection(data.originalFiles); - if (selection.defaultAction) { - controller[selection.defaultAction](data); - } else { - var dialog_name = 'oc-dialog-fileexists-content'; - var dialog_id = '#' + dialog_name; - if (this._fileexistsshown) { - // add row - var conflict = $(dialog_id+ ' .conflict').last().clone(); - conflict.find('.name').text(original.name); + var addConflict = function(conflicts, original, replacement) { + + var conflict = conflicts.find('.conflict.template').clone(); + + conflict.find('.filename').text(original.name); conflict.find('.original .size').text(humanFileSize(original.size)); conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); conflict.find('.replacement .size').text(humanFileSize(replacement.size)); conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); - getMimeIcon(original.type,function(path){ - conflict.find('.original .icon').css('background-image','url('+path+')'); + var path = getPathForPreview(original.name); + lazyLoadPreview(path, original.type, function(previewpath){ + conflict.find('.original .icon').css('background-image','url('+previewpath+')'); }); getMimeIcon(replacement.type,function(path){ conflict.find('.replacement .icon').css('background-image','url('+path+')'); }); - $(dialog_id+' .conflict').last().after(conflict); - $(dialog_id).parent().children('.oc-dialog-title').text(t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict').length})); + conflict.removeClass('template'); + conflicts.append(conflict); //set more recent mtime bold if (replacement.lastModifiedDate.getTime() > original.mtime*1000) { @@ -249,16 +245,16 @@ var OCdialogs = { } else if (replacement.lastModifiedDate.getTime() < original.mtime*1000) { conflict.find('.original .mtime').css('font-weight', 'bold'); } else { - //TODO add to same mtime colletion? + //TODO add to same mtime collection? } // set bigger size bold if (replacement.size > original.size) { - conflict.find('.replacement .size').css('font-weight','bold'); + conflict.find('.replacement .size').css('font-weight', 'bold'); } else if (replacement.size < original.size) { - conflict.find('.original .size').css('font-weight','bold'); + conflict.find('.original .size').css('font-weight', 'bold'); } else { - //TODO add to same size colletion? + //TODO add to same size collection? } //add checkbox toggling actions @@ -269,50 +265,42 @@ var OCdialogs = { //TODO show skip action for files with same size and mtime + }; + var selection = controller.getSelection(data.originalFiles); + if (selection.defaultAction) { + controller[selection.defaultAction](data); + } else { + var dialog_name = 'oc-dialog-fileexists-content'; + var dialog_id = '#' + dialog_name; + if (this._fileexistsshown) { + // add conflict + + var conflicts = $(dialog_id+ ' .conflicts'); + addConflict(conflicts, original, replacement); + + var title = t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict:not(.template)').length}); + $(dialog_id).parent().children('.oc-dialog-title').text(title); + + //recalculate dimensions $(window).trigger('resize'); + } else { //create dialog this._fileexistsshown = true; $.when(this._getFileExistsTemplate()).then(function($tmpl) { var title = t('files','One file conflict'); - var original_size = humanFileSize(original.size); - var original_mtime = formatDate(original.mtime*1000); - var replacement_size= humanFileSize(replacement.size); - var replacement_mtime = formatDate(replacement.lastModifiedDate); var $dlg = $tmpl.octemplate({ dialog_name: dialog_name, title: title, type: 'fileexists', why: t('files','Which files do you want to keep?'), - what: t('files','If you select both versions, the copied file will have a number added to its name.'), - filename: original.name, - - original_size: original_size, - original_mtime: original_mtime, - - replacement_size: replacement_size, - replacement_mtime: replacement_mtime + what: t('files','If you select both versions, the copied file will have a number added to its name.') }); $('body').append($dlg); - getMimeIcon(original.type,function(path){ - $(dialog_id + ' .original .icon').css('background-image','url('+path+')'); - }); - getMimeIcon(replacement.type,function(path){ - $(dialog_id + ' .replacement .icon').css('background-image','url('+path+')'); - }); - $(dialog_id + ' #newname').val(original.name); - - $(dialog_id + ' #newname').on('keyup', function(e){ - if ($(dialog_id + ' #newname').val() === original.name) { - $(dialog_id + ' + div .rename').removeClass('primary').hide(); - $(dialog_id + ' + div .replace').addClass('primary').show(); - } else { - $(dialog_id + ' + div .rename').addClass('primary').show(); - $(dialog_id + ' + div .replace').removeClass('primary').hide(); - } - }); + var conflicts = $($dlg).find('.conflicts'); + addConflict(conflicts, original, replacement); buttonlist = [{ text: t('core', 'Cancel'), @@ -346,57 +334,27 @@ var OCdialogs = { closeButton: null }); - $(dialog_id + ' + div .rename').hide(); - $(dialog_id + ' #newname').hide(); - - $(dialog_id + ' #newnamecb').on('change', function(){ - if ($(dialog_id + ' #newnamecb').prop('checked')) { - $(dialog_id + ' #newname').fadeIn(); - } else { - $(dialog_id + ' #newname').fadeOut(); - $(dialog_id + ' #newname').val(original.name); - } - }); $(dialog_id).css('height','auto'); - var conflict = $(dialog_id + ' .conflict').last(); - //set more recent mtime bold - if (replacement.lastModifiedDate.getTime() > original.mtime*1000) { - conflict.find('.replacement .mtime').css('font-weight','bold'); - } else if (replacement.lastModifiedDate.getTime() < original.mtime*1000) { - conflict.find('.original .mtime').css('font-weight','bold'); - } else { - //TODO add to same mtime colletion? - } - - // set bigger size bold - if (replacement.size > original.size) { - conflict.find('.replacement .size').css('font-weight','bold'); - } else if (replacement.size < original.size) { - conflict.find('.original .size').css('font-weight','bold'); - } else { - //TODO add to same size colletion? - } - //add checkbox toggling actions - //add checkbox toggling actions - $(dialog_id).find('.allnewfiles').on('click', function(){ - var checkboxes = $(dialog_id).find('.replacement input[type="checkbox"]'); + $(dialog_id).find('.allnewfiles').on('click', function() { + var checkboxes = $(dialog_id).find('.conflict:not(.template) .replacement input[type="checkbox"]'); checkboxes.prop('checked', $(this).prop('checked')); }); - $(dialog_id).find('.allexistingfiles').on('click', function(){ - var checkboxes = $(dialog_id).find('.original input[type="checkbox"]'); + $(dialog_id).find('.allexistingfiles').on('click', function() { + var checkboxes = $(dialog_id).find('.conflict:not(.template) .original input[type="checkbox"]'); checkboxes.prop('checked', $(this).prop('checked')); }); - conflict.find('.replacement,.original').on('click', function(){ + + $(dialog_id).find('.conflicts').on('click', '.replacement,.original', function() { var checkbox = $(this).find('input[type="checkbox"]'); checkbox.prop('checked', !checkbox.prop('checked')); }); //update counters - $(dialog_id).on('click', '.replacement,.allnewfiles', function(){ - var count = $(dialog_id).find('.replacement input[type="checkbox"]:checked').length; - if (count === $(dialog_id+ ' .conflict').length) { + $(dialog_id).on('click', '.replacement,.allnewfiles', function() { + var count = $(dialog_id).find('.conflict:not(.template) .replacement input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict:not(.template)').length) { $(dialog_id).find('.allnewfiles').prop('checked', true); $(dialog_id).find('.allnewfiles + .count').text(t('files','(all selected)')); } else if (count > 0) { @@ -408,8 +366,8 @@ var OCdialogs = { } }); $(dialog_id).on('click', '.original,.allexistingfiles', function(){ - var count = $(dialog_id).find('.original input[type="checkbox"]:checked').length; - if (count === $(dialog_id+ ' .conflict').length) { + var count = $(dialog_id).find('.conflict:not(.template) .original input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict:not(.template)').length) { $(dialog_id).find('.allexistingfiles').prop('checked', true); $(dialog_id).find('.allexistingfiles + .count').text(t('files','(all selected)')); } else if (count > 0) { -- cgit v1.2.3 From bbf8acb383bdcb1dcb53f4b9d5a8d894b17401df Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 5 Sep 2013 10:19:54 +0200 Subject: separate uploading code from progress code, add progress capability detection --- apps/files/js/file-upload.js | 193 +++++++++++++++++++++++-------------------- apps/files/js/filelist.js | 20 ++--- apps/files/js/files.js | 32 +++---- core/js/oc-dialogs.js | 13 ++- 4 files changed, 136 insertions(+), 122 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index be3d7e08aff..bd0ae4db00b 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -14,6 +14,7 @@ * - when only existing -> remember as single skip action * - when only new -> remember as single replace action * - when both -> remember as single autorename action + * - continue -> apply marks, when nothing is marked continue == skip all * - start uploading selection * * on send @@ -96,7 +97,30 @@ * */ +// from https://github.com/New-Bamboo/example-ajax-upload/blob/master/public/index.html +// also see article at http://blog.new-bamboo.co.uk/2012/01/10/ridiculously-simple-ajax-uploads-with-formdata +// Function that will allow us to know if Ajax uploads are supported +function supportAjaxUploadWithProgress() { + return supportFileAPI() && supportAjaxUploadProgressEvents() && supportFormData(); + // Is the File API supported? + function supportFileAPI() { + 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() { + return !! window.FormData; + } +} //TODO clean uploads when all progress has completed OC.Upload = { @@ -245,6 +269,7 @@ OC.Upload = { console.log(data); }, checkExistingFiles: function (selection, callbacks){ + // FIXME check filelist before uploading callbacks.onNoConflicts(selection); } }; @@ -327,7 +352,7 @@ $(document).ready(function() { return false; //don't upload anything } - // check existing files whan all is collected + // check existing files when all is collected if ( selection.uploads.length >= selection.filesToUpload ) { //remove our selection hack: @@ -358,11 +383,6 @@ $(document).ready(function() { OC.Upload.checkExistingFiles(selection, callbacks); - //TODO refactor away: - //show cancel button - if($('html.lte9').length === 0 && data.dataType !== 'iframe') { - $('#uploadprogresswrapper input.stop').show(); - } } @@ -389,13 +409,6 @@ $(document).ready(function() { */ start: function(e) { OC.Upload.logStatus('start', e, null); - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return true; - } - $('#uploadprogresswrapper input.stop').show(); - $('#uploadprogressbar').progressbar({value:0}); - $('#uploadprogressbar').fadeIn(); }, fail: function(e, data) { OC.Upload.logStatus('fail', e, data); @@ -414,32 +427,6 @@ $(document).ready(function() { } //var selection = OC.Upload.getSelection(data.originalFiles); //OC.Upload.deleteSelectionUpload(selection, data.files[0].name); - - //if user pressed cancel hide upload progress bar and cancel button - if (data.errorThrown === 'abort') { - $('#uploadprogresswrapper input.stop').fadeOut(); - $('#uploadprogressbar').fadeOut(); - } - }, - progress: function(e, data) { - OC.Upload.logStatus('progress', e, data); - // TODO: show nice progress bar in file row - }, - /** - * - * @param {type} e - * @param {type} data (only has loaded, total and lengthComputable) - * @returns {unresolved} - */ - progressall: function(e, data) { - OC.Upload.logStatus('progressall', e, data); - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - var progress = (data.loaded/data.total)*100; - //var progress = OC.Upload.progressBytes(); - $('#uploadprogressbar').progressbar('value', progress); }, /** * called for every successful upload @@ -460,33 +447,21 @@ $(document).ready(function() { //var selection = OC.Upload.getSelection(data.originalFiles); if(typeof result[0] !== 'undefined' - && result[0].status === 'success' + && result[0].status === 'existserror' ) { - //if (selection) { - // selection.loadedBytes+=data.loaded; - //} - //OC.Upload.nextUpload(); + //show "file already exists" dialog + var original = result[0]; + var replacement = data.files[0]; + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); } else { - if (result[0].status === 'existserror') { - //show "file already exists" dialog - var original = result[0]; - var replacement = data.files[0]; - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); - } else { - OC.Upload.deleteSelectionUpload(selection, data.files[0].name); - data.textStatus = 'servererror'; - data.errorThrown = t('files', result.data.message); - var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); - fu._trigger('fail', e, data); - } + OC.Upload.deleteSelectionUpload(selection, data.files[0].name); + data.textStatus = 'servererror'; + data.errorThrown = t('files', result.data.message); + var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); + fu._trigger('fail', e, data); } - //if user pressed cancel hide upload chrome - //if (! OC.Upload.isProcessing()) { - // $('#uploadprogresswrapper input.stop').fadeOut(); - // $('#uploadprogressbar').fadeOut(); - //} }, /** @@ -496,36 +471,78 @@ $(document).ready(function() { */ stop: function(e, data) { OC.Upload.logStatus('stop', e, data); - //if(OC.Upload.progressBytes()>=100) { //only hide controls when all selections have ended uploading - - //OC.Upload.cancelUploads(); //cleanup - - // if(data.dataType !== 'iframe') { - // $('#uploadprogresswrapper input.stop').hide(); - // } - - //IE < 10 does not fire the necessary events for the progress bar. - if($('html.lte9').length > 0) { - return; - } - - // $('#uploadprogressbar').progressbar('value', 100); - // $('#uploadprogressbar').fadeOut(); - //} - //if user pressed cancel hide upload chrome - //if (! OC.Upload.isProcessing()) { - // $('#uploadprogresswrapper input.stop').fadeOut(); - // $('#uploadprogressbar').fadeOut(); - //} } }; - - var file_upload_handler = function() { - $('#file_upload_start').fileupload(file_upload_param); - }; if ( document.getElementById('data-upload-form') ) { - $(file_upload_handler); + // initialize jquery fileupload (blueimp) + var fileupload = $('#file_upload_start').fileupload(file_upload_param); + + if(supportAjaxUploadWithProgress()) { + + // add progress handlers + fileupload.on('fileuploadadd', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadadd', e, data); + //show cancel button + //if(data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie? + // $('#uploadprogresswrapper input.stop').show(); + //} + }); + // add progress handlers + fileupload.on('fileuploadstart', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadstart', e, data); + $('#uploadprogresswrapper input.stop').show(); + $('#uploadprogressbar').progressbar({value:0}); + $('#uploadprogressbar').fadeIn(); + }); + fileupload.on('fileuploadprogress', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadprogress', e, data); + //TODO progressbar in row + }); + fileupload.on('fileuploadprogressall', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadprogressall', e, data); + var progress = (data.loaded / data.total) * 100; + $('#uploadprogressbar').progressbar('value', progress); + }); + fileupload.on('fileuploaddone', function(e, data) { + OC.Upload.logStatus('progress handle fileuploaddone', e, data); + //if user pressed cancel hide upload chrome + //if (! OC.Upload.isProcessing()) { + // $('#uploadprogresswrapper input.stop').fadeOut(); + // $('#uploadprogressbar').fadeOut(); + //} + }); + fileupload.on('fileuploadstop', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadstop', e, data); + //if(OC.Upload.progressBytes()>=100) { //only hide controls when all selections have ended uploading + + //OC.Upload.cancelUploads(); //cleanup + + // if(data.dataType !== 'iframe') { + // $('#uploadprogresswrapper input.stop').hide(); + // } + + // $('#uploadprogressbar').progressbar('value', 100); + // $('#uploadprogressbar').fadeOut(); + //} + //if user pressed cancel hide upload chrome + //if (! OC.Upload.isProcessing()) { + // $('#uploadprogresswrapper input.stop').fadeOut(); + // $('#uploadprogressbar').fadeOut(); + //} + }); + fileupload.on('fileuploadfail', function(e, data) { + OC.Upload.logStatus('progress handle fileuploadfail', e, data); + //if user pressed cancel hide upload progress bar and cancel button + if (data.errorThrown === 'abort') { + $('#uploadprogresswrapper input.stop').fadeOut(); + $('#uploadprogressbar').fadeOut(); + } + }); + + } else { + console.log('skipping file progress because your browser is broken'); + } } $.assocArraySize = function(obj) { // http://stackoverflow.com/a/6700/11236 diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 31e2a8300e2..4f20d1940aa 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -517,7 +517,7 @@ $(document).ready(function(){ var file_upload_start = $('#file_upload_start'); file_upload_start.on('fileuploaddrop', function(e, data) { - OC.Upload.logStatus('fileuploaddrop', e, data); + OC.Upload.logStatus('filelist handle fileuploaddrop', e, data); var dropTarget = $(e.originalEvent.target).closest('tr'); if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder @@ -556,7 +556,7 @@ $(document).ready(function(){ }); file_upload_start.on('fileuploadadd', function(e, data) { - OC.Upload.logStatus('fileuploadadd', e, data); + OC.Upload.logStatus('filelist handle fileuploadadd', e, data); // lookup selection for dir var selection = OC.Upload.getSelection(data.originalFiles); @@ -592,10 +592,10 @@ $(document).ready(function(){ }); file_upload_start.on('fileuploadstart', function(e, data) { - OC.Upload.logStatus('fileuploadstart', e, data); + OC.Upload.logStatus('filelist handle fileuploadstart', e, data); }); file_upload_start.on('fileuploaddone', function(e, data) { - OC.Upload.logStatus('fileuploaddone', e, data); + OC.Upload.logStatus('filelist handle fileuploaddone', e, data); var response; if (typeof data.result === 'string') { @@ -672,22 +672,22 @@ $(document).ready(function(){ }); file_upload_start.on('fileuploadalways', function(e, data) { - OC.Upload.logStatus('fileuploadalways', e, data); + OC.Upload.logStatus('filelist handle fileuploadalways', e, data); }); file_upload_start.on('fileuploadsend', function(e, data) { - OC.Upload.logStatus('fileuploadsend', e, data); + OC.Upload.logStatus('filelist handle fileuploadsend', e, data); // TODOD add vis //data.context.element = }); file_upload_start.on('fileuploadprogress', function(e, data) { - OC.Upload.logStatus('fileuploadprogress', e, data); + OC.Upload.logStatus('filelist handle fileuploadprogress', e, data); }); file_upload_start.on('fileuploadprogressall', function(e, data) { - OC.Upload.logStatus('fileuploadprogressall', e, data); + OC.Upload.logStatus('filelist handle fileuploadprogressall', e, data); }); file_upload_start.on('fileuploadstop', function(e, data) { - OC.Upload.logStatus('fileuploadstop', e, data); + OC.Upload.logStatus('filelist handle fileuploadstop', e, data); //if user pressed cancel hide upload chrome if (! OC.Upload.isProcessing()) { @@ -700,7 +700,7 @@ $(document).ready(function(){ } }); file_upload_start.on('fileuploadfail', function(e, data) { - OC.Upload.logStatus('fileuploadfail', e, data); + OC.Upload.logStatus('filelist handle fileuploadfail', e, data); //if user pressed cancel hide upload chrome if (data.errorThrown === 'abort') { diff --git a/apps/files/js/files.js b/apps/files/js/files.js index 9a725fc2077..4a6c9c78900 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -1,6 +1,6 @@ Files={ updateMaxUploadFilesize:function(response) { - if(response == undefined) { + if(response === undefined) { return; } if(response.data !== undefined && response.data.uploadMaxFilesize !== undefined) { @@ -9,7 +9,7 @@ Files={ $('#usedSpacePercent').val(response.data.usedSpacePercent); Files.displayStorageWarnings(); } - if(response[0] == undefined) { + if(response[0] === undefined) { return; } if(response[0].uploadMaxFilesize !== undefined) { @@ -25,7 +25,7 @@ Files={ OC.Notification.show(t('files', '\'.\' is an invalid file name.')); return false; } - if (name.length == 0) { + if (name.length === 0) { OC.Notification.show(t('files', 'File name cannot be empty.')); return false; } @@ -33,7 +33,7 @@ Files={ // check for invalid characters var invalid_characters = ['\\', '/', '<', '>', ':', '"', '|', '?', '*']; for (var i = 0; i < invalid_characters.length; i++) { - if (name.indexOf(invalid_characters[i]) != -1) { + if (name.indexOf(invalid_characters[i]) !== -1) { OC.Notification.show(t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.")); return false; } @@ -127,7 +127,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'); @@ -145,7 +145,7 @@ $(document).ready(function() { $(checkbox).attr('checked', 'checked'); $(checkbox).parent().parent().toggleClass('selected'); var selectedCount=$('td.filename input:checkbox:checked').length; - if (selectedCount == $('td.filename input:checkbox').length) { + if (selectedCount === $('td.filename input:checkbox').length) { $('#select_all').attr('checked', 'checked'); } } @@ -192,7 +192,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'); @@ -205,7 +205,7 @@ $(document).ready(function() { if(!$(this).attr('checked')){ $('#select_all').attr('checked',false); }else{ - if(selectedCount==$('td.filename input:checkbox').length){ + if(selectedCount === $('td.filename input:checkbox').length){ $('#select_all').attr('checked',true); } } @@ -262,9 +262,9 @@ $(document).ready(function() { function resizeBreadcrumbs(firstRun) { var width = $(this).width(); - if (width != lastWidth) { + if (width !== lastWidth) { if ((width < lastWidth || firstRun) && width < breadcrumbsWidth) { - if (hiddenBreadcrumbs == 0) { + if (hiddenBreadcrumbs === 0) { breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; $(breadcrumbs[1]).find('a').hide(); $(breadcrumbs[1]).append('...'); @@ -276,12 +276,12 @@ $(document).ready(function() { breadcrumbsWidth -= $(breadcrumbs[i]).get(0).offsetWidth; $(breadcrumbs[i]).hide(); hiddenBreadcrumbs = i; - i++ + i++; } } else if (width > lastWidth && hiddenBreadcrumbs > 0) { var i = hiddenBreadcrumbs; while (width > breadcrumbsWidth && i > 0) { - if (hiddenBreadcrumbs == 1) { + if (hiddenBreadcrumbs === 1) { breadcrumbsWidth -= $(breadcrumbs[1]).get(0).offsetWidth; $(breadcrumbs[1]).find('span').remove(); $(breadcrumbs[1]).find('a').show(); @@ -382,7 +382,7 @@ 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); @@ -436,7 +436,7 @@ var createDragShadow = function(event){ }); return dragshadow; -} +}; //options for file drag/drop var dragOptions={ @@ -446,7 +446,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; @@ -489,7 +489,7 @@ var folderDropOptions={ }); }, tolerance: 'pointer' -} +}; var crumbDropOptions={ drop: function( event, ui ) { diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 5ed24417264..08afbfd42f2 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -257,13 +257,7 @@ var OCdialogs = { //TODO add to same size collection? } - //add checkbox toggling actions - conflict.find('.replacement,.original').on('click', function(){ - var checkbox = $(this).find('input[type="checkbox"]'); - checkbox.prop('checkbox', !checkbox.prop('checkbox')); - }).find('input[type="checkbox"]').prop('checkbox',false); - - //TODO show skip action for files with same size and mtime + //TODO show skip action for files with same size and mtime in bottom row }; var selection = controller.getSelection(data.originalFiles); @@ -345,11 +339,14 @@ var OCdialogs = { var checkboxes = $(dialog_id).find('.conflict:not(.template) .original input[type="checkbox"]'); checkboxes.prop('checked', $(this).prop('checked')); }); - $(dialog_id).find('.conflicts').on('click', '.replacement,.original', function() { var checkbox = $(this).find('input[type="checkbox"]'); checkbox.prop('checked', !checkbox.prop('checked')); }); + $(dialog_id).find('.conflicts').on('click', 'input[type="checkbox"]', function() { + var checkbox = $(this); + checkbox.prop('checked', !checkbox.prop('checked')); + }); //update counters $(dialog_id).on('click', '.replacement,.allnewfiles', function() { -- cgit v1.2.3 From 8a7e26b268b8f4be32bb0b54527a83cadbfc28fd Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 5 Sep 2013 17:46:19 +0200 Subject: cleanup dead code --- apps/files/js/file-upload.js | 68 +++++++++++++++++++++++++------------------- core/js/oc-dialogs.js | 7 +++-- 2 files changed, 42 insertions(+), 33 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index efd3c0d59ed..9af09fcdd92 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -157,25 +157,6 @@ OC.Upload = { } return this._selections[originalFiles.selectionKey]; }, - deleteSelection:function(selectionKey) { - if (this._selections[selectionKey]) { - jQuery.each(this._selections[selectionKey].uploads, function(i, upload) { - upload.abort(); - }); - delete this._selections[selectionKey]; - } else { - console.log('OC.Upload: selection ' + selectionKey + ' does not exist'); - } - }, - deleteSelectionUpload:function(selection, filename) { - if(selection.uploads[filename]) { - selection.uploads[filename].abort(); - return true; - } else { - console.log('OC.Upload: selection ' + selection.selectionKey + ' does not contain upload for ' + filename); - } - return false; - }, cancelUpload:function(dir, filename) { var self = this; var deleted = false; @@ -244,24 +225,48 @@ OC.Upload = { }); return total; }, - onCancel:function(data){ + onCancel:function(data) { //TODO cancel all uploads of this selection var selection = this.getSelection(data.originalFiles); OC.Upload.deleteSelection(selection.selectionKey); //FIXME hide progressbar }, + onContinue:function(conflicts) { + var self = this; + //iterate over all conflicts + jQuery.each(conflicts, function (i, conflict) { + conflict = $(conflict); + var keepOriginal = conflict.find('.original input[type="checkbox"]:checked').length === 1; + var keepReplacement = conflict.find('.replacement input[type="checkbox"]:checked').length === 1; + if (keepOriginal && keepReplacement) { + // when both selected -> autorename + self.onAutorename(conflict.data('data')); + } else if (keepReplacement) { + // when only replacement selected -> overwrite + self.onReplace(conflict.data('data')); + } else { + // when only original seleted -> skip + // when none selected -> skip + self.onSkip(conflict.data('data')); + } + }); + }, onSkip:function(data){ - var selection = this.getSelection(data.originalFiles); - selection.loadedBytes += data.loaded; - this.nextUpload(); + OC.Upload.logStatus('skip', null, data); + //var selection = this.getSelection(data.originalFiles); + //selection.loadedBytes += data.loaded; + //this.nextUpload(); + //TODO trigger skip? what about progress? }, onReplace:function(data){ + OC.Upload.logStatus('replace', null, data); data.data.append('replace', true); data.submit(); }, - onRename:function(data, newName){ - data.data.append('newname', newName); + onAutorename:function(data){ + OC.Upload.logStatus('autorename', null, data); + data.data.append('autorename', true); data.submit(); }, logStatus:function(caption, e, data) { @@ -446,16 +451,19 @@ $(document).ready(function() { var result=$.parseJSON(response); //var selection = OC.Upload.getSelection(data.originalFiles); - if(typeof result[0] !== 'undefined' - && result[0].status === 'existserror' - ) { + 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'); + fu._trigger('fail', e, data); + } else if (result[0].status === 'existserror') { //show "file already exists" dialog var original = result[0]; var replacement = data.files[0]; var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); - } else { - OC.Upload.deleteSelectionUpload(selection, data.files[0].name); + } else if (result[0].status !== 'success') { + delete data.jqXHR; data.textStatus = 'servererror'; data.errorThrown = t('files', result.data.message); var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 08afbfd42f2..77af1a2dde5 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -224,6 +224,8 @@ var OCdialogs = { var conflict = conflicts.find('.conflict.template').clone(); + conflict.data('data',data); + conflict.find('.filename').text(original.name); conflict.find('.original .size').text(humanFileSize(original.size)); conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); @@ -312,9 +314,8 @@ var OCdialogs = { classes: 'continue', click: function(){ self._fileexistsshown = false; - if ( typeof controller.onRename !== 'undefined') { - //TODO use autorename when repeat is checked - controller.onRename(data, $(dialog_id + ' #newname').val()); + if ( typeof controller.onContinue !== 'undefined') { + controller.onContinue($(dialog_id + ' .conflict:not(.template)')); } $(dialog_id).ocdialog('close'); } -- cgit v1.2.3 From 02d14aee17f4d433c28be389cfb1271c68529328 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Fri, 6 Sep 2013 16:50:45 +0200 Subject: completely remove dialog on cancel/continue --- core/js/oc-dialogs.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 77af1a2dde5..fd77f5998b5 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -306,7 +306,7 @@ var OCdialogs = { if ( typeof controller.onCancel !== 'undefined') { controller.onCancel(data); } - $(dialog_id).ocdialog('close'); + $(dialog_id).ocdialog('destroy').remove(); } }, { @@ -318,6 +318,7 @@ var OCdialogs = { controller.onContinue($(dialog_id + ' .conflict:not(.template)')); } $(dialog_id).ocdialog('close'); + $(dialog_id).ocdialog('destroy').remove(); } }]; -- cgit v1.2.3 From 673e0c01a79927359319ff15411a33f460d85ac5 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Fri, 6 Sep 2013 22:40:10 +0200 Subject: fix page leaving checks --- apps/files/js/file-upload.js | 130 +++++++++++-------------------------------- apps/files/js/filelist.js | 21 ++++--- core/js/oc-dialogs.js | 11 ++-- 3 files changed, 52 insertions(+), 110 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 4f93403baf5..47d1188b511 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -124,43 +124,12 @@ function supportAjaxUploadWithProgress() { //TODO clean uploads when all progress has completed OC.Upload = { - /** - * map to lookup the selections for a given directory. - * @type Array - */ - _selections: {}, - _selectionCount: 0, - /* - * queue which progress tracker to use for the next upload - * @type Array - */ - _queue: [], - queueUpload:function(data) { - // add to queue - this._queue.push(data); //remember what to upload next - if ( ! this.isProcessing() ) { - this.startUpload(); - } - }, - getSelection:function(originalFiles) { - if (!originalFiles.selectionKey) { - originalFiles.selectionKey = 'selection-' + this._selectionCount++; - this._selections[originalFiles.selectionKey] = { - selectionKey:originalFiles.selectionKey, - files:{}, - totalBytes:0, - loadedBytes:0, - currentFile:0, - uploads:{}, - checked:false - }; - } - return this._selections[originalFiles.selectionKey]; - }, + _uploads: [], cancelUpload:function(dir, filename) { var self = this; var deleted = false; - jQuery.each(this._selections, function(i, selection) { + //FIXME _selections + jQuery.each(this._uploads, function(i, jqXHR) { if (selection.dir === dir && selection.uploads[filename]) { deleted = self.deleteSelectionUpload(selection, filename); return false; // end searching through selections @@ -168,69 +137,34 @@ OC.Upload = { }); return deleted; }, + deleteUpload:function(data) { + delete data.jqXHR; + }, cancelUploads:function() { console.log('canceling uploads'); - var self = this; - jQuery.each(this._selections,function(i, selection){ - self.deleteSelection(selection.selectionKey); + jQuery.each(this._uploads,function(i, jqXHR){ + jqXHR.abort(); }); - this._queue = []; - this._isProcessing = false; - }, - _isProcessing:false, - isProcessing:function(){ - return this._isProcessing; + this._uploads = []; + }, - startUpload:function(){ - if (this._queue.length > 0) { - this._isProcessing = true; - this.nextUpload(); - return true; - } else { - return false; + rememberUpload:function(jqXHR){ + if (jqXHR) { + this._uploads.push(jqXHR); } }, - nextUpload:function(){ - if (this._queue.length > 0) { - var data = this._queue.pop(); - var selection = this.getSelection(data.originalFiles); - selection.uploads[data.files[0]] = data.submit(); - - } else { - //queue is empty, we are done - this._isProcessing = false; - OC.Upload.cancelUploads(); - } - }, - progressBytes: function() { - var total = 0; - var loaded = 0; - jQuery.each(this._selections, function (i, selection) { - total += selection.totalBytes; - loaded += selection.loadedBytes; - }); - return (loaded/total)*100; - }, - loadedBytes: function() { - var loaded = 0; - jQuery.each(this._selections, function (i, selection) { - loaded += selection.loadedBytes; - }); - return loaded; - }, - totalBytes: function() { - var total = 0; - jQuery.each(this._selections, function (i, selection) { - total += selection.totalBytes; + isProcessing:function(){ + var count = 0; + + jQuery.each(this._uploads,function(i, data){ + if (data.state() === 'pending') { + count++; + } }); - return total; + return count > 0; }, onCancel:function(data) { - //TODO cancel all uploads of this selection - - var selection = this.getSelection(data.originalFiles); - OC.Upload.deleteSelection(selection.selectionKey); - //FIXME hide progressbar + this.cancelUploads(); }, onContinue:function(conflicts) { var self = this; @@ -253,19 +187,16 @@ OC.Upload = { }); }, onSkip:function(data){ - OC.Upload.logStatus('skip', null, data); - //var selection = this.getSelection(data.originalFiles); - //selection.loadedBytes += data.loaded; - //this.nextUpload(); - //TODO trigger skip? what about progress? + this.logStatus('skip', null, data); + this.deleteUpload(data); }, onReplace:function(data){ - OC.Upload.logStatus('replace', null, data); + this.logStatus('replace', null, data); data.data.append('resolution', 'replace'); data.submit(); }, onAutorename:function(data){ - OC.Upload.logStatus('autorename', null, data); + this.logStatus('autorename', null, data); data.data.append('resolution', 'autorename'); data.submit(); }, @@ -415,6 +346,9 @@ $(document).ready(function() { start: function(e) { OC.Upload.logStatus('start', e, null); }, + submit: function (e, data) { + OC.Upload.rememberUpload(data); + }, fail: function(e, data) { OC.Upload.logStatus('fail', e, data); if (typeof data.textStatus !== 'undefined' && data.textStatus !== 'success' ) { @@ -432,6 +366,7 @@ $(document).ready(function() { } //var selection = OC.Upload.getSelection(data.originalFiles); //OC.Upload.deleteSelectionUpload(selection, data.files[0].name); + OC.Upload.deleteUpload(data); }, /** * called for every successful upload @@ -449,8 +384,9 @@ $(document).ready(function() { response = data.result[0].body.innerText; } var result=$.parseJSON(response); - //var selection = OC.Upload.getSelection(data.originalFiles); + delete data.jqXHR; + if(typeof result[0] === 'undefined') { data.textStatus = 'servererror'; data.errorThrown = t('files', 'Could not get result from server.'); @@ -463,7 +399,7 @@ $(document).ready(function() { var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); } else if (result[0].status !== 'success') { - delete data.jqXHR; + //delete data.jqXHR; data.textStatus = 'servererror'; data.errorThrown = t('files', result.data.message); var fu = $(this).data('blueimp-fileupload') || $(this).data('fileupload'); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 1bb9672f961..a96f555ac0b 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -522,6 +522,9 @@ $(document).ready(function(){ var dropTarget = $(e.originalEvent.target).closest('tr'); if(dropTarget && dropTarget.data('type') === 'dir') { // drag&drop upload to folder + // remember as context + data.context = dropTarget; + var dir = dropTarget.data('file'); // update folder in form @@ -546,19 +549,15 @@ $(document).ready(function(){ OC.Upload.logStatus('filelist handle fileuploadadd', e, data); // lookup selection for dir - var selection = OC.Upload.getSelection(data.originalFiles); + //var selection = OC.Upload.getSelection(data.originalFiles); if(FileList.deleteFiles && FileList.deleteFiles.indexOf(data.files[0].name)!==-1){//finish delete if we are uploading a deleted file FileList.finishDelete(null, true); //delete file before continuing } // add ui visualization to existing folder - if(selection.dropTarget && selection.dropTarget.data('type') === 'dir') { + if(data.context && data.context.data('type') === 'dir') { // add to existing folder - var dirName = selection.dropTarget.data('file'); - - // set dir context - data.context = $('tr').filterAttr('data-type', 'dir').filterAttr('data-file', dirName); // update upload counter ui var uploadtext = data.context.find('.uploadtext'); @@ -578,6 +577,10 @@ $(document).ready(function(){ } }); + file_upload_start.on('fileuploadsend', function(e, data) { + OC.Upload.logStatus('filelist handle fileuploadsend', e, data); + return true; + }); file_upload_start.on('fileuploadstart', function(e, data) { OC.Upload.logStatus('filelist handle fileuploadstart', e, data); }); @@ -608,7 +611,7 @@ $(document).ready(function(){ var img = OC.imagePath('core', 'filetypes/folder.png'); data.context.find('td.filename').attr('style','background-image:url('+img+')'); uploadtext.text(translatedText); - uploadtext.show(); + uploadtext.hide(); } else { uploadtext.text(translatedText); } @@ -648,6 +651,7 @@ $(document).ready(function(){ } //if user pressed cancel hide upload chrome + /* if (! OC.Upload.isProcessing()) { //cleanup uploading to a dir var uploadtext = $('tr .uploadtext'); @@ -656,6 +660,7 @@ $(document).ready(function(){ uploadtext.fadeOut(); uploadtext.attr('currentUploads', 0); } + */ }); file_upload_start.on('fileuploadalways', function(e, data) { @@ -677,7 +682,7 @@ $(document).ready(function(){ OC.Upload.logStatus('filelist handle fileuploadstop', e, data); //if user pressed cancel hide upload chrome - if (! OC.Upload.isProcessing()) { + if (data.errorThrown === 'abort') { //cleanup uploading to a dir var uploadtext = $('tr .uploadtext'); var img = OC.imagePath('core', 'filetypes/folder.png'); diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index fd77f5998b5..bc460798350 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -262,10 +262,10 @@ var OCdialogs = { //TODO show skip action for files with same size and mtime in bottom row }; - var selection = controller.getSelection(data.originalFiles); - if (selection.defaultAction) { - controller[selection.defaultAction](data); - } else { + //var selection = controller.getSelection(data.originalFiles); + //if (selection.defaultAction) { + // controller[selection.defaultAction](data); + //} else { var dialog_name = 'oc-dialog-fileexists-content'; var dialog_id = '#' + dialog_name; if (this._fileexistsshown) { @@ -306,6 +306,7 @@ var OCdialogs = { if ( typeof controller.onCancel !== 'undefined') { controller.onCancel(data); } + $(dialog_id).ocdialog('close'); $(dialog_id).ocdialog('destroy').remove(); } }, @@ -382,7 +383,7 @@ var OCdialogs = { alert(t('core', 'Error loading file exists template')); }); } - } + //} }, _getFilePickerTemplate: function() { var defer = $.Deferred(); -- cgit v1.2.3 From ce035016460d8285d5511e67b389d494eb78c1ce Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Fri, 6 Sep 2013 23:44:40 +0200 Subject: fine ie8 compatability --- apps/files/css/files.css | 4 ++++ apps/files/js/file-upload.js | 6 +++++- core/js/oc-dialogs.js | 16 ++++++++++------ 3 files changed, 19 insertions(+), 7 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/css/files.css b/apps/files/css/files.css index 65aa29052e6..ea9c99bb269 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -380,6 +380,10 @@ table.dragshadow td.size { float: left; width: 235px; } +html.lte9 .oc-dialog .fileexists .original { + float: left; + width: 225px; +} .oc-dialog .fileexists .conflicts { overflow-y:scroll; max-height: 225px; diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 47d1188b511..ead397c569e 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -197,7 +197,11 @@ OC.Upload = { }, onAutorename:function(data){ this.logStatus('autorename', null, data); - data.data.append('resolution', 'autorename'); + if (data.data) { + data.data.append('resolution', 'autorename'); + } else { + data.formData.push({name:'resolution',value:'autorename'}); //hack for ie8 + } data.submit(); }, logStatus:function(caption, e, data) { diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index bc460798350..82bf49fc3a7 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -229,8 +229,11 @@ var OCdialogs = { conflict.find('.filename').text(original.name); conflict.find('.original .size').text(humanFileSize(original.size)); conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); - conflict.find('.replacement .size').text(humanFileSize(replacement.size)); - conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); + // ie sucks + if (replacement.size && replacement.lastModifiedDate) { + conflict.find('.replacement .size').text(humanFileSize(replacement.size)); + conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); + } var path = getPathForPreview(original.name); lazyLoadPreview(path, original.type, function(previewpath){ conflict.find('.original .icon').css('background-image','url('+previewpath+')'); @@ -242,18 +245,19 @@ var OCdialogs = { conflicts.append(conflict); //set more recent mtime bold - if (replacement.lastModifiedDate.getTime() > original.mtime*1000) { + // ie sucks + if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime*1000) { conflict.find('.replacement .mtime').css('font-weight', 'bold'); - } else if (replacement.lastModifiedDate.getTime() < original.mtime*1000) { + } else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime*1000) { conflict.find('.original .mtime').css('font-weight', 'bold'); } else { //TODO add to same mtime collection? } // set bigger size bold - if (replacement.size > original.size) { + if (replacement.size && replacement.size > original.size) { conflict.find('.replacement .size').css('font-weight', 'bold'); - } else if (replacement.size < original.size) { + } else if (replacement.size && replacement.size < original.size) { conflict.find('.original .size').css('font-weight', 'bold'); } else { //TODO add to same size collection? -- cgit v1.2.3 From 00cc83e3f7ce53840f5cf03a05a3d995355d1925 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Sat, 7 Sep 2013 14:52:56 +0200 Subject: show preview for uploading image files on conflict --- core/js/oc-dialogs.js | 87 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 16 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 82bf49fc3a7..13348b455d1 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -220,12 +220,61 @@ var OCdialogs = { */ fileexists:function(data, original, replacement, controller) { var self = this; + + var getCroppedPreview = function(file) { + var deferred = new $.Deferred(); + // Only process image files. + var type = file.type.split('/').shift(); + if (window.FileReader && type === 'image') { + var reader = new FileReader(); + reader.onload = function (e) { + var blob = new Blob([event.target.result]); + window.URL = window.URL || window.webkitURL; + var originalUrl = window.URL.createObjectURL(blob); + var image = new Image(); + image.src = originalUrl; + image.onload = function () { + var url = crop(image); + deferred.resolve(url); + } + }; + reader.readAsArrayBuffer(file); + } else { + deferred.reject(); + } + return deferred; + }; + + var crop = function(img) { + var canvas = document.createElement('canvas'), + width = img.width, + height = img.height, + x, y, size; + + // calculate the width and height, constraining the proportions + if (width > height) { + y = 0; + x = (width - height) / 2; + } else { + y = (height - width) / 2; + x = 0; + } + size = Math.min(width, height); + + // resize the canvas and draw the image data into it + canvas.width = 64; + canvas.height = 64; + var ctx = canvas.getContext("2d"); + ctx.drawImage(img, x, y, size, size, 0, 0, 64, 64); + return canvas.toDataURL("image/png", 0.7); + }; + var addConflict = function(conflicts, original, replacement) { - + var conflict = conflicts.find('.conflict.template').clone(); - + conflict.data('data',data); - + conflict.find('.filename').text(original.name); conflict.find('.original .size').text(humanFileSize(original.size)); conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); @@ -238,12 +287,18 @@ var OCdialogs = { lazyLoadPreview(path, original.type, function(previewpath){ conflict.find('.original .icon').css('background-image','url('+previewpath+')'); }); - getMimeIcon(replacement.type,function(path){ - conflict.find('.replacement .icon').css('background-image','url('+path+')'); - }); + getCroppedPreview(replacement).then( + function(path){ + conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); + }, function(){ + getMimeIcon(replacement.type,function(path){ + conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); + }); + } + ); conflict.removeClass('template'); conflicts.append(conflict); - + //set more recent mtime bold // ie sucks if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime*1000) { @@ -253,7 +308,7 @@ var OCdialogs = { } else { //TODO add to same mtime collection? } - + // set bigger size bold if (replacement.size && replacement.size > original.size) { conflict.find('.replacement .size').css('font-weight', 'bold'); @@ -262,9 +317,9 @@ var OCdialogs = { } else { //TODO add to same size collection? } - + //TODO show skip action for files with same size and mtime in bottom row - + }; //var selection = controller.getSelection(data.originalFiles); //if (selection.defaultAction) { @@ -274,16 +329,16 @@ var OCdialogs = { var dialog_id = '#' + dialog_name; if (this._fileexistsshown) { // add conflict - + var conflicts = $(dialog_id+ ' .conflicts'); addConflict(conflicts, original, replacement); - + var title = t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict:not(.template)').length}); $(dialog_id).parent().children('.oc-dialog-title').text(title); - + //recalculate dimensions $(window).trigger('resize'); - + } else { //create dialog this._fileexistsshown = true; @@ -334,7 +389,7 @@ var OCdialogs = { buttons: buttonlist, closeButton: null }); - + $(dialog_id).css('height','auto'); //add checkbox toggling actions @@ -354,7 +409,7 @@ var OCdialogs = { var checkbox = $(this); checkbox.prop('checked', !checkbox.prop('checked')); }); - + //update counters $(dialog_id).on('click', '.replacement,.allnewfiles', function() { var count = $(dialog_id).find('.conflict:not(.template) .replacement input[type="checkbox"]:checked').length; -- cgit v1.2.3 From 0a0410815ee3130fc73bf9f9cab19f287f7a23b3 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Sun, 8 Sep 2013 10:11:35 +0200 Subject: close and destroy dialog on ESC --- core/js/oc-dialogs.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 13348b455d1..7c4483cefcf 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -387,7 +387,10 @@ var OCdialogs = { closeOnEscape: true, modal: true, buttons: buttonlist, - closeButton: null + closeButton: null, + close: function(event, ui) { + $(this).ocdialog('destroy').remove(); + } }); $(dialog_id).css('height','auto'); -- cgit v1.2.3 From bd1d5b69fbe6df0f8faf53e3edb5cd7c44e1577c Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Sun, 8 Sep 2013 17:31:12 +0200 Subject: fix ESC for conflicts dialog --- core/js/oc-dialogs.js | 2 -- 1 file changed, 2 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 7c4483cefcf..dc293f949c1 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -366,7 +366,6 @@ var OCdialogs = { controller.onCancel(data); } $(dialog_id).ocdialog('close'); - $(dialog_id).ocdialog('destroy').remove(); } }, { @@ -378,7 +377,6 @@ var OCdialogs = { controller.onContinue($(dialog_id + ' .conflict:not(.template)')); } $(dialog_id).ocdialog('close'); - $(dialog_id).ocdialog('destroy').remove(); } }]; -- cgit v1.2.3 From 7bd5e89f8cf6e46daa45e588d9275728b93a230e Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Wed, 18 Sep 2013 17:22:29 +0200 Subject: simplify conflict template handling, fix reopen after ESC --- apps/files/templates/fileexists.html | 2 +- core/js/oc-dialogs.js | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html index a5b2fb76908..662177ac7ed 100644 --- a/apps/files/templates/fileexists.html +++ b/apps/files/templates/fileexists.html @@ -7,7 +7,7 @@
-
+
diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 28bd94b9b0f..c4d1f34a094 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -281,8 +281,8 @@ var OCdialogs = { var addConflict = function(conflicts, original, replacement) { - var conflict = conflicts.find('.conflict.template').clone(); - + var conflict = conflicts.find('.template').clone().removeClass('template').addClass('conflict'); + conflict.data('data',data); conflict.find('.filename').text(original.name); @@ -306,7 +306,6 @@ var OCdialogs = { }); } ); - conflict.removeClass('template'); conflicts.append(conflict); //set more recent mtime bold @@ -343,7 +342,7 @@ var OCdialogs = { var conflicts = $(dialog_id+ ' .conflicts'); addConflict(conflicts, original, replacement); - var title = t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict:not(.template)').length}); + var title = t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict').length}); $(dialog_id).parent().children('.oc-dialog-title').text(title); //recalculate dimensions @@ -371,7 +370,6 @@ var OCdialogs = { text: t('core', 'Cancel'), classes: 'cancel', click: function(){ - self._fileexistsshown = false; if ( typeof controller.onCancel !== 'undefined') { controller.onCancel(data); } @@ -382,9 +380,8 @@ var OCdialogs = { text: t('core', 'Continue'), classes: 'continue', click: function(){ - self._fileexistsshown = false; if ( typeof controller.onContinue !== 'undefined') { - controller.onContinue($(dialog_id + ' .conflict:not(.template)')); + controller.onContinue($(dialog_id + ' .conflict')); } $(dialog_id).ocdialog('close'); } @@ -397,6 +394,7 @@ var OCdialogs = { buttons: buttonlist, closeButton: null, close: function(event, ui) { + self._fileexistsshown = false; $(this).ocdialog('destroy').remove(); } }); @@ -405,11 +403,11 @@ var OCdialogs = { //add checkbox toggling actions $(dialog_id).find('.allnewfiles').on('click', function() { - var checkboxes = $(dialog_id).find('.conflict:not(.template) .replacement input[type="checkbox"]'); + var checkboxes = $(dialog_id).find('.conflict .replacement input[type="checkbox"]'); checkboxes.prop('checked', $(this).prop('checked')); }); $(dialog_id).find('.allexistingfiles').on('click', function() { - var checkboxes = $(dialog_id).find('.conflict:not(.template) .original input[type="checkbox"]'); + var checkboxes = $(dialog_id).find('.conflict .original input[type="checkbox"]'); checkboxes.prop('checked', $(this).prop('checked')); }); $(dialog_id).find('.conflicts').on('click', '.replacement,.original', function() { @@ -423,8 +421,8 @@ var OCdialogs = { //update counters $(dialog_id).on('click', '.replacement,.allnewfiles', function() { - var count = $(dialog_id).find('.conflict:not(.template) .replacement input[type="checkbox"]:checked').length; - if (count === $(dialog_id+ ' .conflict:not(.template)').length) { + var count = $(dialog_id).find('.conflict .replacement input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict').length) { $(dialog_id).find('.allnewfiles').prop('checked', true); $(dialog_id).find('.allnewfiles + .count').text(t('files','(all selected)')); } else if (count > 0) { @@ -436,8 +434,8 @@ var OCdialogs = { } }); $(dialog_id).on('click', '.original,.allexistingfiles', function(){ - var count = $(dialog_id).find('.conflict:not(.template) .original input[type="checkbox"]:checked').length; - if (count === $(dialog_id+ ' .conflict:not(.template)').length) { + var count = $(dialog_id).find('.conflict .original input[type="checkbox"]:checked').length; + if (count === $(dialog_id+ ' .conflict').length) { $(dialog_id).find('.allexistingfiles').prop('checked', true); $(dialog_id).find('.allexistingfiles + .count').text(t('files','(all selected)')); } else if (count > 0) { -- cgit v1.2.3 From 72d53008cc848f7bdaf55183d6e4be75c8bfae53 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Wed, 18 Sep 2013 17:58:15 +0200 Subject: indentation --- core/js/oc-dialogs.js | 86 +++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index c4d1f34a094..ddd3cb4ac78 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -281,53 +281,53 @@ var OCdialogs = { var addConflict = function(conflicts, original, replacement) { - var conflict = conflicts.find('.template').clone().removeClass('template').addClass('conflict'); - - conflict.data('data',data); - - conflict.find('.filename').text(original.name); - conflict.find('.original .size').text(humanFileSize(original.size)); - conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); - // ie sucks - if (replacement.size && replacement.lastModifiedDate) { - conflict.find('.replacement .size').text(humanFileSize(replacement.size)); - conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); - } - var path = getPathForPreview(original.name); - lazyLoadPreview(path, original.type, function(previewpath){ - conflict.find('.original .icon').css('background-image','url('+previewpath+')'); - }); - getCroppedPreview(replacement).then( - function(path){ + var conflict = conflicts.find('.template').clone().removeClass('template').addClass('conflict'); + + conflict.data('data',data); + + conflict.find('.filename').text(original.name); + conflict.find('.original .size').text(humanFileSize(original.size)); + conflict.find('.original .mtime').text(formatDate(original.mtime*1000)); + // ie sucks + if (replacement.size && replacement.lastModifiedDate) { + conflict.find('.replacement .size').text(humanFileSize(replacement.size)); + conflict.find('.replacement .mtime').text(formatDate(replacement.lastModifiedDate)); + } + var path = getPathForPreview(original.name); + lazyLoadPreview(path, original.type, function(previewpath){ + conflict.find('.original .icon').css('background-image','url('+previewpath+')'); + }); + getCroppedPreview(replacement).then( + function(path){ + conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); + }, function(){ + getMimeIcon(replacement.type,function(path){ conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); - }, function(){ - getMimeIcon(replacement.type,function(path){ - conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); - }); - } - ); - conflicts.append(conflict); - - //set more recent mtime bold - // ie sucks - if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime*1000) { - conflict.find('.replacement .mtime').css('font-weight', 'bold'); - } else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime*1000) { - conflict.find('.original .mtime').css('font-weight', 'bold'); - } else { - //TODO add to same mtime collection? + }); } + ); + conflicts.append(conflict); + + //set more recent mtime bold + // ie sucks + if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() > original.mtime*1000) { + conflict.find('.replacement .mtime').css('font-weight', 'bold'); + } else if (replacement.lastModifiedDate && replacement.lastModifiedDate.getTime() < original.mtime*1000) { + conflict.find('.original .mtime').css('font-weight', 'bold'); + } else { + //TODO add to same mtime collection? + } - // set bigger size bold - if (replacement.size && replacement.size > original.size) { - conflict.find('.replacement .size').css('font-weight', 'bold'); - } else if (replacement.size && replacement.size < original.size) { - conflict.find('.original .size').css('font-weight', 'bold'); - } else { - //TODO add to same size collection? - } + // set bigger size bold + if (replacement.size && replacement.size > original.size) { + conflict.find('.replacement .size').css('font-weight', 'bold'); + } else if (replacement.size && replacement.size < original.size) { + conflict.find('.original .size').css('font-weight', 'bold'); + } else { + //TODO add to same size collection? + } - //TODO show skip action for files with same size and mtime in bottom row + //TODO show skip action for files with same size and mtime in bottom row }; //var selection = controller.getSelection(data.originalFiles); -- cgit v1.2.3 From f7800cd63ef55b9fc0e8379291adeb9e45356fb1 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 19 Sep 2013 09:47:51 +0200 Subject: fix 'event is not defined' error --- core/js/oc-dialogs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index ddd3cb4ac78..7ca94dcbaa4 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -238,7 +238,7 @@ var OCdialogs = { if (window.FileReader && type === 'image') { var reader = new FileReader(); reader.onload = function (e) { - var blob = new Blob([event.target.result]); + var blob = new Blob([e.target.result]); window.URL = window.URL || window.webkitURL; var originalUrl = window.URL.createObjectURL(blob); var image = new Image(); -- cgit v1.2.3 From 0d81a53e12bed66e5ec9684424519913283110a5 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 19 Sep 2013 10:00:42 +0200 Subject: use 96x96 as 64x64 thumbnails in conflicts dialog, 64x64 looks very blocky ... maybe something is wrong there --- apps/files/js/files.js | 12 ++++++++---- core/js/oc-dialogs.js | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'core/js/oc-dialogs.js') diff --git a/apps/files/js/files.js b/apps/files/js/files.js index afbb14c5e00..76f19b87cbc 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -627,11 +627,15 @@ function getPathForPreview(name) { return path; } -function lazyLoadPreview(path, mime, ready) { +function lazyLoadPreview(path, mime, ready, width, height) { getMimeIcon(mime,ready); - var x = $('#filestable').data('preview-x'); - var y = $('#filestable').data('preview-y'); - var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:x, y:y}); + if (!width) { + width = $('#filestable').data('preview-x'); + } + if (!height) { + height = $('#filestable').data('preview-y'); + } + var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:width, y:height}); $.get(previewURL, function() { previewURL = previewURL.replace('(','%28'); previewURL = previewURL.replace(')','%29'); diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index 7ca94dcbaa4..d661a871a5f 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -296,7 +296,7 @@ var OCdialogs = { var path = getPathForPreview(original.name); lazyLoadPreview(path, original.type, function(previewpath){ conflict.find('.original .icon').css('background-image','url('+previewpath+')'); - }); + }, 96, 96); getCroppedPreview(replacement).then( function(path){ conflict.find('.replacement .icon').css('background-image','url(' + path + ')'); -- cgit v1.2.3 From a6933efce358db5930c9e6bf516171baa81f8472 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 19 Sep 2013 11:25:41 +0200 Subject: use n to translate title --- core/js/oc-dialogs.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index d661a871a5f..d6453d2d56c 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -342,7 +342,13 @@ var OCdialogs = { var conflicts = $(dialog_id+ ' .conflicts'); addConflict(conflicts, original, replacement); - var title = t('files','{count} file conflicts',{count:$(dialog_id+ ' .conflict').length}); + var count = $(dialog_id+ ' .conflict').length; + var title = n('files', + 'One file conflict', + '{count} file conflicts', + count, + {count:count} + ); $(dialog_id).parent().children('.oc-dialog-title').text(title); //recalculate dimensions -- cgit v1.2.3 From 078bf0df2583a8a93f2fe8df15cf29f14c4ee02b Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Thu, 19 Sep 2013 12:05:30 +0200 Subject: use {count} instead of 'One' for more versatile translation --- core/js/oc-dialogs.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'core/js/oc-dialogs.js') diff --git a/core/js/oc-dialogs.js b/core/js/oc-dialogs.js index d6453d2d56c..ac37b109e76 100644 --- a/core/js/oc-dialogs.js +++ b/core/js/oc-dialogs.js @@ -344,7 +344,7 @@ var OCdialogs = { var count = $(dialog_id+ ' .conflict').length; var title = n('files', - 'One file conflict', + '{count} file conflict', '{count} file conflicts', count, {count:count} -- cgit v1.2.3