diff options
author | Vincent Petry <pvince81@owncloud.com> | 2015-10-21 11:46:51 +0200 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2015-10-21 12:18:06 +0200 |
commit | abd0ba1f2593770833ed6bf886c72b1c24817ecf (patch) | |
tree | 17f3f229556e30a415b38a85bfaf073cc8e8c2ca /apps/files | |
parent | d0aeb268d687f803e62069c852bcd7a1a86eadee (diff) | |
download | nextcloud-server-abd0ba1f2593770833ed6bf886c72b1c24817ecf.tar.gz nextcloud-server-abd0ba1f2593770833ed6bf886c72b1c24817ecf.zip |
Fix file upload, conflict dialog, also in public link
- Use "FileList" instead of "OCA.Files.App.fileList" that doesn't exist in public
link page.
- Fix public link upload by properly adding the form data using a new
utility function "addFormData". That one is needed because IE8 upload
and regular upload use a different format...
Diffstat (limited to 'apps/files')
-rw-r--r-- | apps/files/js/file-upload.js | 44 | ||||
-rw-r--r-- | apps/files/tests/js/fileUploadSpec.js | 96 |
2 files changed, 129 insertions, 11 deletions
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 77b85ecd7da..d419cb3a2c0 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -18,7 +18,7 @@ * - TODO music upload button */ -/* global jQuery, oc_requesttoken, humanFileSize */ +/* global jQuery, oc_requesttoken, humanFileSize, FileList */ /** * Function that will allow us to know if Ajax uploads are supported @@ -48,6 +48,26 @@ function supportAjaxUploadWithProgress() { } /** + * Add form data into the given form data + * + * @param {Array|Object} formData form data which can either be an array or an object + * @param {Object} newData key-values to add to the form data + * + * @return updated form data + */ +function addFormData(formData, newData) { + // in IE8, formData is an array instead of object + if (_.isArray(formData)) { + _.each(newData, function(value, key) { + formData.push({name: key, value: value}); + }); + } else { + formData = _.extend(formData, newData); + } + return formData; +} + +/** * keeps track of uploads in progress and implements callbacks for the conflicts dialog * @namespace */ @@ -143,9 +163,9 @@ OC.Upload = { data.data.append('resolution', 'replace'); } else { if (!data.formData) { - data.formData = []; + data.formData = {}; } - data.formData.push({name:'resolution', value:'replace'}); //hack for ie8 + addFormData(data.formData, {resolution: 'replace'}); } data.submit(); }, @@ -159,9 +179,9 @@ OC.Upload = { data.data.append('resolution', 'autorename'); } else { if (!data.formData) { - data.formData = []; + data.formData = {}; } - data.formData.push({name:'resolution', value:'autorename'}); //hack for ie8 + addFormData(data.formData, {resolution: 'autorename'}); } data.submit(); }, @@ -185,7 +205,7 @@ OC.Upload = { * @param {function} callbacks.onCancel */ checkExistingFiles: function (selection, callbacks) { - var fileList = OCA.Files.App.fileList; + var fileList = FileList; var conflicts = []; // only keep non-conflicting uploads selection.uploads = _.filter(selection.uploads, function(upload) { @@ -402,17 +422,19 @@ OC.Upload = { submit: function(e, data) { OC.Upload.rememberUpload(data); if (!data.formData) { - data.formData = []; + data.formData = {}; } var fileDirectory = ''; if(typeof data.files[0].relativePath !== 'undefined') { fileDirectory = data.files[0].relativePath; } - // FIXME: prevent re-adding the same - data.formData.push({name: 'requesttoken', value: oc_requesttoken}); - data.formData.push({name: 'dir', value: data.targetDir || FileList.getCurrentDirectory()}); - data.formData.push({name: 'file_directory', value: fileDirectory}); + + addFormData(data.formData, { + requesttoken: oc_requesttoken, + dir: data.targetDir || FileList.getCurrentDirectory(), + file_directory: fileDirectory + }); }, fail: function(e, data) { OC.Upload.log('fail', e, data); diff --git a/apps/files/tests/js/fileUploadSpec.js b/apps/files/tests/js/fileUploadSpec.js index cad8468d1c8..a49a5d4e2e0 100644 --- a/apps/files/tests/js/fileUploadSpec.js +++ b/apps/files/tests/js/fileUploadSpec.js @@ -117,4 +117,100 @@ describe('OC.Upload tests', function() { ); }); }); + describe('Upload conflicts', function() { + var oldFileList; + var conflictDialogStub; + var callbacks; + + beforeEach(function() { + oldFileList = FileList; + $('#testArea').append( + '<div id="tableContainer">' + + '<table id="filestable">' + + '<thead><tr>' + + '<th id="headerName" class="hidden column-name">' + + '<input type="checkbox" id="select_all_files" class="select-all">' + + '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' + + '<span id="selectedActionsList" class="selectedActions hidden">' + + '<a href class="download"><img src="actions/download.svg">Download</a>' + + '<a href class="delete-selected">Delete</a></span>' + + '</th>' + + '<th class="hidden column-size"><a class="columntitle" data-sort="size"><span class="sort-indicator"></span></a></th>' + + '<th class="hidden column-mtime"><a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a></th>' + + '</tr></thead>' + + '<tbody id="fileList"></tbody>' + + '<tfoot></tfoot>' + + '</table>' + + '</div>' + ); + FileList = new OCA.Files.FileList($('#tableContainer')); + + FileList.add({name: 'conflict.txt', mimetype: 'text/plain'}); + FileList.add({name: 'conflict2.txt', mimetype: 'text/plain'}); + + conflictDialogStub = sinon.stub(OC.dialogs, 'fileexists'); + callbacks = { + onNoConflicts: sinon.stub() + }; + }); + afterEach(function() { + conflictDialogStub.restore(); + + FileList.destroy(); + FileList = oldFileList; + }); + it('does not show conflict dialog when no client side conflict', function() { + var selection = { + // yes, the format of uploads is weird... + uploads: [ + {files: [{name: 'noconflict.txt'}]}, + {files: [{name: 'noconflict2.txt'}]} + ] + }; + + OC.Upload.checkExistingFiles(selection, callbacks); + + expect(conflictDialogStub.notCalled).toEqual(true); + expect(callbacks.onNoConflicts.calledOnce).toEqual(true); + expect(callbacks.onNoConflicts.calledWith(selection)).toEqual(true); + }); + it('shows conflict dialog when no client side conflict', function() { + var selection = { + // yes, the format of uploads is weird... + uploads: [ + {files: [{name: 'conflict.txt'}]}, + {files: [{name: 'conflict2.txt'}]}, + {files: [{name: 'noconflict.txt'}]} + ] + }; + + var deferred = $.Deferred(); + conflictDialogStub.returns(deferred.promise()); + deferred.resolve(); + + OC.Upload.checkExistingFiles(selection, callbacks); + + expect(conflictDialogStub.callCount).toEqual(3); + expect(conflictDialogStub.getCall(1).args[0]) + .toEqual({files: [ { name: 'conflict.txt' } ]}); + expect(conflictDialogStub.getCall(1).args[1]) + .toEqual({ name: 'conflict.txt', mimetype: 'text/plain', directory: '/' }); + expect(conflictDialogStub.getCall(1).args[2]).toEqual({ name: 'conflict.txt' }); + + // yes, the dialog must be called several times... + expect(conflictDialogStub.getCall(2).args[0]).toEqual({ + files: [ { name: 'conflict2.txt' } ] + }); + expect(conflictDialogStub.getCall(2).args[1]) + .toEqual({ name: 'conflict2.txt', mimetype: 'text/plain', directory: '/' }); + expect(conflictDialogStub.getCall(2).args[2]).toEqual({ name: 'conflict2.txt' }); + + expect(callbacks.onNoConflicts.calledOnce).toEqual(true); + expect(callbacks.onNoConflicts.calledWith({ + uploads: [ + {files: [{name: 'noconflict.txt'}]} + ] + })).toEqual(true); + }); + }); }); |