|
|
@@ -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 |
|
|
|
*/ |