Browse Source

add an option to the multiple files selected actions to add and remove tags from multiple files at once

Signed-off-by: Roland Scheidel <kontakt@scheidel.at>
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
tags/v23.0.0beta1
Roland Scheidel 4 years ago
parent
commit
c5af910886
No account linked to committer's email address
3 changed files with 148 additions and 0 deletions
  1. 22
    0
      apps/files/css/files.scss
  2. 5
    0
      apps/files/js/app.js
  3. 121
    0
      apps/files/js/filelist.js

+ 22
- 0
apps/files/css/files.scss View File

@@ -1215,3 +1215,25 @@ table.dragshadow td.size {
#gallery-button {
display: none;
}

#tag_multiple_files_container {
overflow: hidden;
background-color: #fff;
border-radius: 3px;
position: relative;
display: flex;
flex-wrap: wrap;
margin-bottom: 10px;

h3 {
width: 100%;
padding: 0 18px;
}

.systemTagsInputFieldContainer {
flex: 1 1 80%;
min-width: 0;
margin: 0 12px;
}
}


+ 5
- 0
apps/files/js/app.js View File

@@ -113,6 +113,11 @@
iconClass: 'icon-delete',
order: 99,
},
{
name: 'tags',
displayName: 'Tags',
iconClass: 'icon-tag'
},
],
sorting: {
mode: $('#defaultFileSorting').val(),

+ 121
- 0
apps/files/js/filelist.js View File

@@ -555,6 +555,9 @@
case 'restore':
this._onClickRestoreSelected(ev);
break;
case 'tags':
this._onClickTagSelected(ev);
break;
}
},
/**
@@ -1116,6 +1119,124 @@
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();

// Build dom
self.tagsTitle = $('<h3>'+ t('files', 'Please select tag(s) to add to the selection') +'</h3>');
self.tagsSubmit = $('<button>' + t('files', 'Apply tag(s) to selection') + '</button>');
self.tagsContainer = $('<tr id="tag_multiple_files_container"></tr>');
self.tagsTitle.appendTo(self.tagsContainer)
self.tagsContainer.append(self._inputView.el);
self.tagsSubmit.appendTo(self.tagsContainer)

// Inject everything
self.$table.find('thead').append(self.tagsContainer);

self.tagsSubmit.on('click', function(ev){
self._onClickDocument(ev);
});
}

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).off('click', this._onClickDocument);
}

},

/**
* Custom code
* Set tag for all selected files
* @param tagModel
* @private
*/
_onSelectTag: function(tagModel) {
var selectedFiles = _.pluck(this.getSelectedFiles(),'id')
if (!_.isArray(selectedFiles)) {
return;
}
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');
if (!_.isArray(selectedFiles)) {
return;
}
selectedFiles.forEach(function(fileId) {
$.ajax({
url: OC.linkToRemote('dav') + '/systemtags-relations/files/' +fileId + '/'+ tagId,
type: 'DELETE'
});
});
},

/**
* Event handler when clicking on a table header
*/

Loading…
Cancel
Save