diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 4790afcf4d0a8..f7bbb32953209 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -2822,10 +2822,30 @@
this.$el.find('#headerName a.name>span:first').text(selection);
this.$el.find('#modified a>span:first').text('');
this.$el.find('table').addClass('multiselect');
+ this.$el.find('.selectedActions .copy-move').toggleClass('hidden', !this.isSelectedCopiableOrMovable());
+ this.$el.find('.selectedActions .download').toggleClass('hidden', !this.isSelectedDownloadable());
this.$el.find('.delete-selected').toggleClass('hidden', !this.isSelectedDeletable());
}
},
+ /**
+ * Check whether all selected files are copiable or movable
+ */
+ isSelectedCopiableOrMovable: function() {
+ return _.reduce(this.getSelectedFiles(), function(copiableOrMovable, file) {
+ return copiableOrMovable && (file.permissions & OC.PERMISSION_UPDATE);
+ }, true);
+ },
+
+ /**
+ * Check whether all selected files are downloadable
+ */
+ isSelectedDownloadable: function() {
+ return _.reduce(this.getSelectedFiles(), function(downloadable, file) {
+ return downloadable && (file.permissions & OC.PERMISSION_READ);
+ }, true);
+ },
+
/**
* Check whether all selected files are deletable
*/
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 8bb188e3602ae..fd011474eb14f 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -94,6 +94,7 @@ describe('OCA.Files.FileList tests', function() {
'' +
'Name' +
'' +
+ 'Move or copy' +
'
Download' +
'Delete' +
'' +
@@ -2024,6 +2025,28 @@ describe('OCA.Files.FileList tests', function() {
});
});
describe('Selection overlay', function() {
+ it('show doesnt show the copy/move action if one or more files are not copiable/movable', function () {
+ fileList.setFiles(testFiles);
+ $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
+ $('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(false);
+ testFiles[0].permissions = OC.PERMISSION_READ;
+ $('.select-all').click();
+ fileList.setFiles(testFiles);
+ $('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(true);
+ });
+ it('show doesnt show the download action if one or more files are not downloadable', function () {
+ fileList.setFiles(testFiles);
+ $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
+ $('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .download').hasClass('hidden')).toEqual(false);
+ testFiles[0].permissions = OC.PERMISSION_UPDATE;
+ $('.select-all').click();
+ fileList.setFiles(testFiles);
+ $('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .download').hasClass('hidden')).toEqual(true);
+ });
it('show doesnt show the delete action if one or more files are not deletable', function () {
fileList.setFiles(testFiles);
$('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_DELETE);