From 6535c12028702c922fd824d2e394dbfc96183289 Mon Sep 17 00:00:00 2001
From: Roland Scheidel
Date: Tue, 3 Dec 2019 09:45:33 +0100
Subject: [PATCH 1/3] add an option to the multiple files selected actions to
add and remove tags from multiple files at once
Signed-off-by: Roland Scheidel
---
apps/files/css/files.scss | 12 +++++
apps/files/js/app.js | 5 ++
apps/files/js/filelist.js | 109 ++++++++++++++++++++++++++++++++++++++
3 files changed, 126 insertions(+)
diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss
index b826f305d146a..5806027bb9ee7 100644
--- a/apps/files/css/files.scss
+++ b/apps/files/css/files.scss
@@ -1138,3 +1138,15 @@ table.dragshadow td.size {
#gallery-button {
display: none;
}
+
+#tag_multiple_files_container {
+ overflow: hidden;
+ background-color: #fff;
+ border-radius: 3px;
+ position: relative;
+
+ td {
+ padding: 0 0.5em 0 0.5em;
+ }
+}
+
diff --git a/apps/files/js/app.js b/apps/files/js/app.js
index 20da85f0f927b..d6b5f4756da91 100644
--- a/apps/files/js/app.js
+++ b/apps/files/js/app.js
@@ -102,6 +102,11 @@
displayName: t('files', 'Delete'),
iconClass: 'icon-delete',
},
+ { name: 'tags',
+ displayName: 'Tags',
+ iconClass: 'icon-tag'
+
+ }
],
sorting: {
mode: $('#defaultFileSorting').val(),
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index e7d48d4bcd13f..783560d854fc9 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -527,6 +527,9 @@
case 'restore':
this._onClickRestoreSelected(ev);
break;
+ case 'tags':
+ this._onClickTagSelected(ev);
+ break;
}
},
/**
@@ -1087,6 +1090,112 @@
event.preventDefault();
},
+ /**
+ * CUSTOM CODE
+ * Event handler for when clicking on "Tags" for the selected files
+ */
+ _onClickTagSelected: function(event) {
+ var self = this;
+ event.preventDefault();
+ var commonTags = [];
+
+ var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
+ var tagCollections=[];
+ var fetchTagPromises = [];
+
+
+ selectedFiles.forEach(function(fileId) {
+ var deferred = new $.Deferred();
+ var tagCollection = new OC.SystemTags.SystemTagsMappingCollection([], {
+ objectType: 'files',
+ objectId: fileId});
+ tagCollections.push(tagCollection);
+ tagCollection.fetch({
+ success: function(){
+ deferred.resolve('success');
+ },
+ error: function() {deferred.resolve('failed');}
+ })
+ fetchTagPromises.push(deferred);
+ });
+ if (!self._inputView) {
+ self._inputView = new OC.SystemTags.SystemTagsInputField({
+ multiple: true,
+ allowActions: true,
+ allowCreate: true,
+ isAdmin: OC.isUserAdmin(),
+ });
+ self._inputView.on('select', self._onSelectTag, self);
+ self._inputView.on('deselect', self._onDeselectTag, self);
+ self._inputView.render();
+ self.tagsContainer = $(' |
');
+ // console.log('inputView',self._inputView, self._inputView.$el,'tag container', self.tagsContainer);
+ self.tagsContainer.children()[0].append(self._inputView.$el.context);
+ $('#app-content-files>#filestable>thead').append(self.tagsContainer);
+
+ }
+ self._inputView.$el.addClass('icon-loading');
+ self.tagsContainer.show();
+ Promise.all(fetchTagPromises).then(function() {
+ //find tags which are common to all selected files
+ commonTags =_.intersection.apply(null, tagCollections.map(function (tagCollection) {return tagCollection.getTagIds();}));
+ self._inputView.setValues(commonTags);
+ self._inputView.$el.removeClass('icon-loading');
+ $(document).on('click',function(ev){
+ self._onClickDocument(ev);
+ });
+ });
+ },
+
+ _onClickDocument: function(ev) {
+ if(!$(ev.target).closest('#editor_container').length) {
+ this._inputView.setValues([]);
+ this.tagsContainer.hide();
+ $(document).unbind('click', this._onClickDocument);
+ }
+
+ },
+
+ /**
+ * Custom code
+ * Set tag for all selected files
+ * @param tagModel
+ * @private
+ */
+ _onSelectTag: function(tagModel) {
+ console.log('selected',tagModel.attributes);
+ var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
+ if (!_.isArray(selectedFiles)) {
+ console.log('selected files - no array!', selectedFiles);
+ }
+ selectedFiles.forEach(function(fileId) {
+ $.ajax({
+ url: OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagModel.attributes.id,
+ type: 'PUT',
+ });
+ });
+
+ },
+ /**
+ * remove tag from all selected files
+ * @param tagId
+ * @private
+ */
+ _onDeselectTag: function(tagId) {
+ var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
+ console.log('removing tag', tagId, 'for files', selectedFiles, this.getSelectedFiles())
+ if (!_.isArray(selectedFiles)) {
+ console.log('selected files - no array!', selectedFiles);
+ }
+ selectedFiles.forEach(function(fileId) {
+ console.log('remove tag route',OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagId)
+ $.ajax({
+ url: OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagId,
+ type: 'DELETE'
+ });
+ });
+ },
+
/**
* Event handler when clicking on a table header
*/
From bea1e82bc7fcccae4b7d692aedf4ae38c87b65fe Mon Sep 17 00:00:00 2001
From: Roland <[email protected]>
Date: Thu, 5 Dec 2019 15:14:23 +0100
Subject: [PATCH 2/3] return early if no files are selected
return early from _onSelectTag, _onSelectTag if no tags are selected.
Signed-off-by: Roland Scheidel
---
apps/files/js/filelist.js | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 783560d854fc9..4b32f45a36f5f 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -1163,10 +1163,9 @@
* @private
*/
_onSelectTag: function(tagModel) {
- console.log('selected',tagModel.attributes);
var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
if (!_.isArray(selectedFiles)) {
- console.log('selected files - no array!', selectedFiles);
+ return;
}
selectedFiles.forEach(function(fileId) {
$.ajax({
@@ -1182,10 +1181,9 @@
* @private
*/
_onDeselectTag: function(tagId) {
- var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
- console.log('removing tag', tagId, 'for files', selectedFiles, this.getSelectedFiles())
+ var selectedFiles = _.pluck(this.getSelectedFiles(),'id');
if (!_.isArray(selectedFiles)) {
- console.log('selected files - no array!', selectedFiles);
+ return;
}
selectedFiles.forEach(function(fileId) {
console.log('remove tag route',OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagId)
From acb121aa41639853f52ffcf3d09ec404953c2315 Mon Sep 17 00:00:00 2001
From: Roland <[email protected]>
Date: Thu, 30 Jan 2020 11:48:54 +0100
Subject: [PATCH 3/3] Update apps/files/js/filelist.js
remove console.log
Co-Authored-By: kesselb
Signed-off-by: Roland Scheidel
---
apps/files/js/filelist.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 4b32f45a36f5f..a8d272dfb4f20 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -1129,7 +1129,6 @@
self._inputView.on('deselect', self._onDeselectTag, self);
self._inputView.render();
self.tagsContainer = $(' |
');
- // console.log('inputView',self._inputView, self._inputView.$el,'tag container', self.tagsContainer);
self.tagsContainer.children()[0].append(self._inputView.$el.context);
$('#app-content-files>#filestable>thead').append(self.tagsContainer);