From 1936895a42b1f367d59bf8ba03f87c398e9d6643 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 2 Feb 2021 16:32:24 +0100 Subject: [PATCH] Fix duplicate tag info view registration Only register the tag info view once as it's stored in a singleton. This fixes an issue where the tag info view did not get rendered after swiching between different file views. Signed-off-by: Vincent Petry --- apps/systemtags/js/systemtags.js | 2 +- apps/systemtags/js/systemtags.js.map | 2 +- apps/systemtags/src/filesplugin.js | 11 ++++++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/systemtags/js/systemtags.js b/apps/systemtags/js/systemtags.js index e60e0c1f98..ffa940f232 100644 --- a/apps/systemtags/js/systemtags.js +++ b/apps/systemtags/js/systemtags.js @@ -1,2 +1,2 @@ -!function(t){var e={};function i(s){if(e[s])return e[s].exports;var n=e[s]={i:s,l:!1,exports:{}};return t[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}i.m=t,i.c=e,i.d=function(t,e,s){i.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:s})},i.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i.t=function(t,e){if(1&e&&(t=i(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)i.d(s,n,function(e){return t[e]}.bind(null,n));return s},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="/js/",i(i.s=0)}([function(t,e,i){"use strict";i.r(e);i(1),i(2),i(3),i(4),i(5);window.OCA.SystemTags=OCA.SystemTags},function(e,i){OCA.SystemTags||(OCA.SystemTags={}),OCA.SystemTags.App={initFileList:function(e){return this._fileList||(this._fileList=new OCA.SystemTags.FileList(e,{id:"systemtags",fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._fileList.appName=t("systemtags","Tags")),this._fileList},removeFileList:function(){this._fileList&&this._fileList.$fileList.empty()},_createFileActions:function(){var t=new OCA.Files.FileActions;return t.registerDefaultActions(),t.merge(OCA.Files.fileActions),this._globalActionsInitialized||(this._onActionsUpdated=_.bind(this._onActionsUpdated,this),OCA.Files.fileActions.on("setDefault.app-systemtags",this._onActionsUpdated),OCA.Files.fileActions.on("registerAction.app-systemtags",this._onActionsUpdated),this._globalActionsInitialized=!0),t.register("dir","Open",OC.PERMISSION_READ,"",(function(t,e){OCA.Files.App.setActiveView("files",{silent:!0}),OCA.Files.App.fileList.changeDirectory(OC.joinPaths(e.$file.attr("data-path"),t),!0,!0)})),t.setDefault("dir","Open"),t},_onActionsUpdated:function(t){this._fileList&&(t.action?this._fileList.fileActions.registerAction(t.action):t.defaultAction&&this._fileList.fileActions.setDefault(t.defaultAction.mime,t.defaultAction.name))},destroy:function(){OCA.Files.fileActions.off("setDefault.app-systemtags",this._onActionsUpdated),OCA.Files.fileActions.off("registerAction.app-systemtags",this._onActionsUpdated),this.removeFileList(),this._fileList=null,delete this._globalActionsInitialized}},window.addEventListener("DOMContentLoaded",(function(){$("#app-content-systemtagsfilter").on("show",(function(t){OCA.SystemTags.App.initFileList($(t.target))})),$("#app-content-systemtagsfilter").on("hide",(function(){OCA.SystemTags.App.removeFileList()}))}))},function(e,i){var s;(s=function(t,e){this.initialize(t,e)}).prototype=_.extend({},OCA.Files.FileList.prototype,{id:"systemtagsfilter",appName:t("systemtags","Tagged files"),_systemTagIds:[],_lastUsedTags:[],_clientSideSort:!0,_allowSelection:!1,_filterField:null,initialize:function(t,e){if(OCA.Files.FileList.prototype.initialize.apply(this,arguments),!this.initialized){e&&e.systemTagIds&&(this._systemTagIds=e.systemTagIds),OC.Plugins.attach("OCA.SystemTags.FileList",this);var i=this.$el.find("#controls").empty();_.defer(_.bind(this._getLastUsedTags,this)),this._initFilterField(i)}},destroy:function(){this.$filterField.remove(),OCA.Files.FileList.prototype.destroy.apply(this,arguments)},_getLastUsedTags:function(){var t=this;$.ajax({type:"GET",url:OC.generateUrl("/apps/systemtags/lastused"),success:function(e){t._lastUsedTags=e}})},_initFilterField:function(e){var i=this;return this.$filterField=$(''),e.append(this.$filterField),this.$filterField.select2({placeholder:t("systemtags","Select tags to filter by"),allowClear:!1,multiple:!0,toggleSelect:!0,separator:",",query:_.bind(this._queryTagsAutocomplete,this),id:function(t){return t.id},initSelection:function(t,e){var i=$(t).val().trim();if(i){var s=i.split(","),n=[];OC.SystemTags.collection.fetch({success:function(){_.each(s,(function(t){var e=OC.SystemTags.collection.get(t);_.isUndefined(e)||n.push(e.toJSON())})),e(n)}})}else e([])},formatResult:function(t){return OC.SystemTags.getDescriptiveTag(t)},formatSelection:function(t){return OC.SystemTags.getDescriptiveTag(t)[0].outerHTML},sortResults:function(t){return t.sort((function(t,e){var s=i._lastUsedTags.indexOf(t.id),n=i._lastUsedTags.indexOf(e.id);return s!==n?-1===n?-1:-1===s?1:s

'+t("systemtags","No files found for the selected tags")+"

"):this.$el.find("#emptycontent").html('

'+t("systemtags","Please select tags to filter by")+"

"),this.$el.find("#emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find("#filestable thead th").toggleClass("hidden",this.isEmpty)):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},reload:function(){if(this._setCurrentDir("/",!1),!this._systemTagIds.length)return this.updateEmptyContent(),this.setFiles([]),$.Deferred().resolve();this._selectedFiles={},this._selectionSummary.clear(),this._currentFileModel&&this._currentFileModel.off(),this._currentFileModel=null,this.$el.find(".select-all").prop("checked",!1),this.showMask(),this._reloadCall=this.filesClient.getFilteredFiles({systemTagIds:this._systemTagIds},{properties:this._getWebdavProperties()}),this._detailsView&&this._updateDetailsView(null);var t=this.reloadCallback.bind(this);return this._reloadCall.then(t,t)},reloadCallback:function(t,e){return e&&e.unshift({}),OCA.Files.FileList.prototype.reloadCallback.call(this,t,e)}}),OCA.SystemTags.FileList=s},function(t,e){OCA.SystemTags=_.extend({},OCA.SystemTags),OCA.SystemTags||(OCA.SystemTags={}),OCA.SystemTags.FilesPlugin={ignoreLists:["trashbin","files.public"],attach:function(t){if(!(this.ignoreLists.indexOf(t.id)>=0)){var e=new OCA.SystemTags.SystemTagsInfoView;t.registerDetailView(e),OCA.SystemTags.View=e}}},OC.Plugins.register("OCA.Files.FileList",OCA.SystemTags.FilesPlugin)},function(t,e){!function(t){function e(t){var e=t.toJSON();return OC.isUserAdmin()||e.canAssign||(e.locked=!0),e}var i=t.Files.DetailFileInfoView.extend({_rendered:!1,className:"systemTagsInfoView",name:"systemTags",id:"systemTagsInfoView",_inputView:null,initialize:function(t){var i=this;t=t||{},this._inputView=new OC.SystemTags.SystemTagsInputField({multiple:!0,allowActions:!0,allowCreate:!0,isAdmin:OC.isUserAdmin(),initSelection:function(t,s){s(i.selectedTagsCollection.map(e))}}),this.selectedTagsCollection=new OC.SystemTags.SystemTagsMappingCollection([],{objectType:"files"}),this._inputView.collection.on("change:name",this._onTagRenamedGlobally,this),this._inputView.collection.on("remove",this._onTagDeletedGlobally,this),this._inputView.on("select",this._onSelectTag,this),this._inputView.on("deselect",this._onDeselectTag,this)},_onSelectTag:function(t){this.selectedTagsCollection.create(t.toJSON())},_onDeselectTag:function(t){this.selectedTagsCollection.get(t).destroy()},_onTagRenamedGlobally:function(t){var e=this.selectedTagsCollection.get(t.id);e&&e.set(t.toJSON())},_onTagDeletedGlobally:function(t){this.selectedTagsCollection.remove(t)},setFileInfo:function(t){var i=this;this._rendered||this.render(),t&&(this.selectedTagsCollection.setObjectId(t.id),this.selectedTagsCollection.fetch({success:function(t){t.fetched=!0;var s=t.map(e);i._inputView.setData(s),s.length>0&&i.show()}})),this.hide()},render:function(){this.$el.append(this._inputView.$el),this._inputView.render()},isVisible:function(){return!this.$el.hasClass("hidden")},show:function(){this.$el.removeClass("hidden")},hide:function(){this.$el.addClass("hidden")},toggle:function(){this.$el.toggleClass("hidden")},openDropdown:function(){this.$el.find(".systemTagsInputField").select2("open")},remove:function(){this._inputView.remove()}});t.SystemTags.SystemTagsInfoView=i}(OCA)},function(t,e,i){var s=i(6);"string"==typeof s&&(s=[[t.i,s,""]]),s.locals&&(t.exports=s.locals);(0,i(8).default)("4b13cbab",s,!0,{})},function(t,e,i){(e=i(7)(!1)).push([t.i,"#app-content-systemtagsfilter .select2-container{width:30%;margin-left:10px}#app-sidebar .app-sidebar-header__action .tag-label{cursor:pointer;padding:13px 0;display:flex;color:var(--color-text-light);position:relative;margin-top:-20px}\n",""]),t.exports=e},function(t,e,i){"use strict";t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i=function(t,e){var i=t[1]||"",s=t[3];if(!s)return i;if(e&&"function"==typeof btoa){var n=(a=s,r=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),l="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),"/*# ".concat(l," */")),o=s.sources.map((function(t){return"/*# sourceURL=".concat(s.sourceRoot||"").concat(t," */")}));return[i].concat(o).concat([n]).join("\n")}var a,r,l;return[i].join("\n")}(e,t);return e[2]?"@media ".concat(e[2]," {").concat(i,"}"):i})).join("")},e.i=function(t,i,s){"string"==typeof t&&(t=[[null,t,""]]);var n={};if(s)for(var o=0;oi.parts.length&&(s.parts.length=i.parts.length)}else{var a=[];for(n=0;n'),e.append(this.$filterField),this.$filterField.select2({placeholder:t("systemtags","Select tags to filter by"),allowClear:!1,multiple:!0,toggleSelect:!0,separator:",",query:_.bind(this._queryTagsAutocomplete,this),id:function(e){return e.id},initSelection:function(e,t){var i=$(e).val().trim();if(i){var s=i.split(","),n=[];OC.SystemTags.collection.fetch({success:function(){_.each(s,(function(e){var t=OC.SystemTags.collection.get(e);_.isUndefined(t)||n.push(t.toJSON())})),t(n)}})}else t([])},formatResult:function(e){return OC.SystemTags.getDescriptiveTag(e)},formatSelection:function(e){return OC.SystemTags.getDescriptiveTag(e)[0].outerHTML},sortResults:function(e){return e.sort((function(e,t){var s=i._lastUsedTags.indexOf(e.id),n=i._lastUsedTags.indexOf(t.id);return s!==n?-1===n?-1:-1===s?1:s

'+t("systemtags","No files found for the selected tags")+"

"):this.$el.find("#emptycontent").html('

'+t("systemtags","Please select tags to filter by")+"

"),this.$el.find("#emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find("#filestable thead th").toggleClass("hidden",this.isEmpty)):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},reload:function(){if(this._setCurrentDir("/",!1),!this._systemTagIds.length)return this.updateEmptyContent(),this.setFiles([]),$.Deferred().resolve();this._selectedFiles={},this._selectionSummary.clear(),this._currentFileModel&&this._currentFileModel.off(),this._currentFileModel=null,this.$el.find(".select-all").prop("checked",!1),this.showMask(),this._reloadCall=this.filesClient.getFilteredFiles({systemTagIds:this._systemTagIds},{properties:this._getWebdavProperties()}),this._detailsView&&this._updateDetailsView(null);var e=this.reloadCallback.bind(this);return this._reloadCall.then(e,e)},reloadCallback:function(e,t){return t&&t.unshift({}),OCA.Files.FileList.prototype.reloadCallback.call(this,e,t)}}),OCA.SystemTags.FileList=s},function(e,t){OCA.SystemTags=_.extend({},OCA.SystemTags),OCA.SystemTags||(OCA.SystemTags={}),OCA.SystemTags.FilesPlugin={ignoreLists:["trashbin","files.public"],attach:function(e){if(!(this.ignoreLists.indexOf(e.id)>=0||OCA.SystemTags.View)){var t=new OCA.SystemTags.SystemTagsInfoView;e.registerDetailView(t),OCA.SystemTags.View=t}}},OC.Plugins.register("OCA.Files.FileList",OCA.SystemTags.FilesPlugin)},function(e,t){!function(e){function t(e){var t=e.toJSON();return OC.isUserAdmin()||t.canAssign||(t.locked=!0),t}var i=e.Files.DetailFileInfoView.extend({_rendered:!1,className:"systemTagsInfoView",name:"systemTags",id:"systemTagsInfoView",_inputView:null,initialize:function(e){var i=this;e=e||{},this._inputView=new OC.SystemTags.SystemTagsInputField({multiple:!0,allowActions:!0,allowCreate:!0,isAdmin:OC.isUserAdmin(),initSelection:function(e,s){s(i.selectedTagsCollection.map(t))}}),this.selectedTagsCollection=new OC.SystemTags.SystemTagsMappingCollection([],{objectType:"files"}),this._inputView.collection.on("change:name",this._onTagRenamedGlobally,this),this._inputView.collection.on("remove",this._onTagDeletedGlobally,this),this._inputView.on("select",this._onSelectTag,this),this._inputView.on("deselect",this._onDeselectTag,this)},_onSelectTag:function(e){this.selectedTagsCollection.create(e.toJSON())},_onDeselectTag:function(e){this.selectedTagsCollection.get(e).destroy()},_onTagRenamedGlobally:function(e){var t=this.selectedTagsCollection.get(e.id);t&&t.set(e.toJSON())},_onTagDeletedGlobally:function(e){this.selectedTagsCollection.remove(e)},setFileInfo:function(e){var i=this;this._rendered||this.render(),e&&(this.selectedTagsCollection.setObjectId(e.id),this.selectedTagsCollection.fetch({success:function(e){e.fetched=!0;var s=e.map(t);i._inputView.setData(s),s.length>0&&i.show()}})),this.hide()},render:function(){this.$el.append(this._inputView.$el),this._inputView.render()},isVisible:function(){return!this.$el.hasClass("hidden")},show:function(){this.$el.removeClass("hidden")},hide:function(){this.$el.addClass("hidden")},toggle:function(){this.$el.toggleClass("hidden")},openDropdown:function(){this.$el.find(".systemTagsInputField").select2("open")},remove:function(){this._inputView.remove()}});e.SystemTags.SystemTagsInfoView=i}(OCA)},function(e,t,i){var s=i(6);"string"==typeof s&&(s=[[e.i,s,""]]),s.locals&&(e.exports=s.locals);(0,i(8).default)("4b13cbab",s,!0,{})},function(e,t,i){(t=i(7)(!1)).push([e.i,"#app-content-systemtagsfilter .select2-container{width:30%;margin-left:10px}#app-sidebar .app-sidebar-header__action .tag-label{cursor:pointer;padding:13px 0;display:flex;color:var(--color-text-light);position:relative;margin-top:-20px}\n",""]),e.exports=t},function(e,t,i){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var i=function(e,t){var i=e[1]||"",s=e[3];if(!s)return i;if(t&&"function"==typeof btoa){var n=(a=s,r=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),l="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),"/*# ".concat(l," */")),o=s.sources.map((function(e){return"/*# sourceURL=".concat(s.sourceRoot||"").concat(e," */")}));return[i].concat(o).concat([n]).join("\n")}var a,r,l;return[i].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(i,"}"):i})).join("")},t.i=function(e,i,s){"string"==typeof e&&(e=[[null,e,""]]);var n={};if(s)for(var o=0;oi.parts.length&&(s.parts.length=i.parts.length)}else{var a=[];for(n=0;n\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function() {\n\tif (!OCA.SystemTags) {\n\t\t/**\n\t\t * @namespace\n\t\t */\n\t\tOCA.SystemTags = {}\n\t}\n\n\tOCA.SystemTags.App = {\n\n\t\tinitFileList($el) {\n\t\t\tif (this._fileList) {\n\t\t\t\treturn this._fileList\n\t\t\t}\n\n\t\t\tthis._fileList = new OCA.SystemTags.FileList(\n\t\t\t\t$el,\n\t\t\t\t{\n\t\t\t\t\tid: 'systemtags',\n\t\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t\t// The file list is created when a \"show\" event is handled,\n\t\t\t\t\t// so it should be marked as \"shown\" like it would have been\n\t\t\t\t\t// done if handling the event with the file list already\n\t\t\t\t\t// created.\n\t\t\t\t\tshown: true,\n\t\t\t\t}\n\t\t\t)\n\n\t\t\tthis._fileList.appName = t('systemtags', 'Tags')\n\t\t\treturn this._fileList\n\t\t},\n\n\t\tremoveFileList() {\n\t\t\tif (this._fileList) {\n\t\t\t\tthis._fileList.$fileList.empty()\n\t\t\t}\n\t\t},\n\n\t\t_createFileActions() {\n\t\t\t// inherit file actions from the files app\n\t\t\tconst fileActions = new OCA.Files.FileActions()\n\t\t\t// note: not merging the legacy actions because legacy apps are not\n\t\t\t// compatible with the sharing overview and need to be adapted first\n\t\t\tfileActions.registerDefaultActions()\n\t\t\tfileActions.merge(OCA.Files.fileActions)\n\n\t\t\tif (!this._globalActionsInitialized) {\n\t\t\t\t// in case actions are registered later\n\t\t\t\tthis._onActionsUpdated = _.bind(this._onActionsUpdated, this)\n\t\t\t\tOCA.Files.fileActions.on('setDefault.app-systemtags', this._onActionsUpdated)\n\t\t\t\tOCA.Files.fileActions.on('registerAction.app-systemtags', this._onActionsUpdated)\n\t\t\t\tthis._globalActionsInitialized = true\n\t\t\t}\n\n\t\t\t// when the user clicks on a folder, redirect to the corresponding\n\t\t\t// folder in the files app instead of opening it directly\n\t\t\tfileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename, context) {\n\t\t\t\tOCA.Files.App.setActiveView('files', { silent: true })\n\t\t\t\tOCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true)\n\t\t\t})\n\t\t\tfileActions.setDefault('dir', 'Open')\n\t\t\treturn fileActions\n\t\t},\n\n\t\t_onActionsUpdated(ev) {\n\t\t\tif (!this._fileList) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ev.action) {\n\t\t\t\tthis._fileList.fileActions.registerAction(ev.action)\n\t\t\t} else if (ev.defaultAction) {\n\t\t\t\tthis._fileList.fileActions.setDefault(\n\t\t\t\t\tev.defaultAction.mime,\n\t\t\t\t\tev.defaultAction.name\n\t\t\t\t)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Destroy the app\n\t\t */\n\t\tdestroy() {\n\t\t\tOCA.Files.fileActions.off('setDefault.app-systemtags', this._onActionsUpdated)\n\t\t\tOCA.Files.fileActions.off('registerAction.app-systemtags', this._onActionsUpdated)\n\t\t\tthis.removeFileList()\n\t\t\tthis._fileList = null\n\t\t\tdelete this._globalActionsInitialized\n\t\t},\n\t}\n\n})()\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\t$('#app-content-systemtagsfilter').on('show', function(e) {\n\t\tOCA.SystemTags.App.initFileList($(e.target))\n\t})\n\t$('#app-content-systemtagsfilter').on('hide', function() {\n\t\tOCA.SystemTags.App.removeFileList()\n\t})\n})\n","/*\n * Copyright (c) 2016 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function() {\n\t/**\n\t * @class OCA.SystemTags.FileList\n\t * @augments OCA.Files.FileList\n\t *\n\t * @classdesc SystemTags file list.\n\t * Contains a list of files filtered by system tags.\n\t *\n\t * @param {Object} $el container element with existing markup for the #controls and a table\n\t * @param {Array} [options] map of options, see other parameters\n\t * @param {Array.} [options.systemTagIds] array of system tag ids to\n\t * filter by\n\t */\n\tconst FileList = function($el, options) {\n\t\tthis.initialize($el, options)\n\t}\n\tFileList.prototype = _.extend(\n\t\t{},\n\t\tOCA.Files.FileList.prototype,\n\t\t/** @lends OCA.SystemTags.FileList.prototype */ {\n\t\t\tid: 'systemtagsfilter',\n\t\t\tappName: t('systemtags', 'Tagged files'),\n\n\t\t\t/**\n\t\t\t * Array of system tag ids to filter by\n\t\t\t *\n\t\t\t * @type Array.\n\t\t\t */\n\t\t\t_systemTagIds: [],\n\t\t\t_lastUsedTags: [],\n\n\t\t\t_clientSideSort: true,\n\t\t\t_allowSelection: false,\n\n\t\t\t_filterField: null,\n\n\t\t\t/**\n\t\t\t * @private\n\t\t\t * @param {Object} $el container element\n\t\t\t * @param {Object} [options] map of options, see other parameters\n\t\t\t */\n\t\t\tinitialize($el, options) {\n\t\t\t\tOCA.Files.FileList.prototype.initialize.apply(this, arguments)\n\t\t\t\tif (this.initialized) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (options && options.systemTagIds) {\n\t\t\t\t\tthis._systemTagIds = options.systemTagIds\n\t\t\t\t}\n\n\t\t\t\tOC.Plugins.attach('OCA.SystemTags.FileList', this)\n\n\t\t\t\tconst $controls = this.$el.find('#controls').empty()\n\n\t\t\t\t_.defer(_.bind(this._getLastUsedTags, this))\n\t\t\t\tthis._initFilterField($controls)\n\t\t\t},\n\n\t\t\tdestroy() {\n\t\t\t\tthis.$filterField.remove()\n\n\t\t\t\tOCA.Files.FileList.prototype.destroy.apply(this, arguments)\n\t\t\t},\n\n\t\t\t_getLastUsedTags() {\n\t\t\t\tconst self = this\n\t\t\t\t$.ajax({\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\turl: OC.generateUrl('/apps/systemtags/lastused'),\n\t\t\t\t\tsuccess(response) {\n\t\t\t\t\t\tself._lastUsedTags = response\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\n\t\t\t_initFilterField($container) {\n\t\t\t\tconst self = this\n\t\t\t\tthis.$filterField = $('')\n\t\t\t\t$container.append(this.$filterField)\n\t\t\t\tthis.$filterField.select2({\n\t\t\t\t\tplaceholder: t('systemtags', 'Select tags to filter by'),\n\t\t\t\t\tallowClear: false,\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\ttoggleSelect: true,\n\t\t\t\t\tseparator: ',',\n\t\t\t\t\tquery: _.bind(this._queryTagsAutocomplete, this),\n\n\t\t\t\t\tid(tag) {\n\t\t\t\t\t\treturn tag.id\n\t\t\t\t\t},\n\n\t\t\t\t\tinitSelection(element, callback) {\n\t\t\t\t\t\tconst val = $(element)\n\t\t\t\t\t\t\t.val()\n\t\t\t\t\t\t\t.trim()\n\t\t\t\t\t\tif (val) {\n\t\t\t\t\t\t\tconst tagIds = val.split(',')\n\t\t\t\t\t\t\tconst tags = []\n\n\t\t\t\t\t\t\tOC.SystemTags.collection.fetch({\n\t\t\t\t\t\t\t\tsuccess() {\n\t\t\t\t\t\t\t\t\t_.each(tagIds, function(tagId) {\n\t\t\t\t\t\t\t\t\t\tconst tag = OC.SystemTags.collection.get(\n\t\t\t\t\t\t\t\t\t\t\ttagId\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tif (!_.isUndefined(tag)) {\n\t\t\t\t\t\t\t\t\t\t\ttags.push(tag.toJSON())\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t\tcallback(tags)\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// eslint-disable-next-line standard/no-callback-literal\n\t\t\t\t\t\t\tcallback([])\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tformatResult(tag) {\n\t\t\t\t\t\treturn OC.SystemTags.getDescriptiveTag(tag)\n\t\t\t\t\t},\n\n\t\t\t\t\tformatSelection(tag) {\n\t\t\t\t\t\treturn OC.SystemTags.getDescriptiveTag(tag)[0]\n\t\t\t\t\t\t\t.outerHTML\n\t\t\t\t\t},\n\n\t\t\t\t\tsortResults(results) {\n\t\t\t\t\t\tresults.sort(function(a, b) {\n\t\t\t\t\t\t\tconst aLastUsed = self._lastUsedTags.indexOf(a.id)\n\t\t\t\t\t\t\tconst bLastUsed = self._lastUsedTags.indexOf(b.id)\n\n\t\t\t\t\t\t\tif (aLastUsed !== bLastUsed) {\n\t\t\t\t\t\t\t\tif (bLastUsed === -1) {\n\t\t\t\t\t\t\t\t\treturn -1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (aLastUsed === -1) {\n\t\t\t\t\t\t\t\t\treturn 1\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn aLastUsed < bLastUsed ? -1 : 1\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Both not found\n\t\t\t\t\t\t\treturn OC.Util.naturalSortCompare(a.name, b.name)\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn results\n\t\t\t\t\t},\n\n\t\t\t\t\tescapeMarkup(m) {\n\t\t\t\t\t\t// prevent double markup escape\n\t\t\t\t\t\treturn m\n\t\t\t\t\t},\n\t\t\t\t\tformatNoMatches() {\n\t\t\t\t\t\treturn t('systemtags', 'No tags found')\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\tthis.$filterField.on(\n\t\t\t\t\t'change',\n\t\t\t\t\t_.bind(this._onTagsChanged, this)\n\t\t\t\t)\n\t\t\t\treturn this.$filterField\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Autocomplete function for dropdown results\n\t\t\t *\n\t\t\t * @param {Object} query select2 query object\n\t\t\t */\n\t\t\t_queryTagsAutocomplete(query) {\n\t\t\t\tOC.SystemTags.collection.fetch({\n\t\t\t\t\tsuccess() {\n\t\t\t\t\t\tconst results = OC.SystemTags.collection.filterByName(\n\t\t\t\t\t\t\tquery.term\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tquery.callback({\n\t\t\t\t\t\t\tresults: _.invoke(results, 'toJSON'),\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Event handler for when the URL changed\n\t\t\t *\n\t\t\t * @param {Event} e the urlchanged event\n\t\t\t */\n\t\t\t_onUrlChanged(e) {\n\t\t\t\tif (e.dir) {\n\t\t\t\t\tconst tags = _.filter(e.dir.split('/'), function(val) {\n\t\t\t\t\t\treturn val.trim() !== ''\n\t\t\t\t\t})\n\t\t\t\t\tthis.$filterField.select2('val', tags || [])\n\t\t\t\t\tthis._systemTagIds = tags\n\t\t\t\t\tthis.reload()\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_onTagsChanged(ev) {\n\t\t\t\tconst val = $(ev.target)\n\t\t\t\t\t.val()\n\t\t\t\t\t.trim()\n\t\t\t\tif (val !== '') {\n\t\t\t\t\tthis._systemTagIds = val.split(',')\n\t\t\t\t} else {\n\t\t\t\t\tthis._systemTagIds = []\n\t\t\t\t}\n\n\t\t\t\tthis.$el.trigger(\n\t\t\t\t\t$.Event('changeDirectory', {\n\t\t\t\t\t\tdir: this._systemTagIds.join('/'),\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\tthis.reload()\n\t\t\t},\n\n\t\t\tupdateEmptyContent() {\n\t\t\t\tconst dir = this.getCurrentDirectory()\n\t\t\t\tif (dir === '/') {\n\t\t\t\t\t// root has special permissions\n\t\t\t\t\tif (!this._systemTagIds.length) {\n\t\t\t\t\t\t// no tags selected\n\t\t\t\t\t\tthis.$el\n\t\t\t\t\t\t\t.find('#emptycontent')\n\t\t\t\t\t\t\t.html(\n\t\t\t\t\t\t\t\t'
'\n\t\t\t\t\t\t\t\t\t+ '

'\n\t\t\t\t\t\t\t\t\t+ t(\n\t\t\t\t\t\t\t\t\t\t'systemtags',\n\t\t\t\t\t\t\t\t\t\t'Please select tags to filter by'\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t+ '

'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// tags selected but no results\n\t\t\t\t\t\tthis.$el\n\t\t\t\t\t\t\t.find('#emptycontent')\n\t\t\t\t\t\t\t.html(\n\t\t\t\t\t\t\t\t'
'\n\t\t\t\t\t\t\t\t\t+ '

'\n\t\t\t\t\t\t\t\t\t+ t(\n\t\t\t\t\t\t\t\t\t\t'systemtags',\n\t\t\t\t\t\t\t\t\t\t'No files found for the selected tags'\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t+ '

'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.find('#emptycontent')\n\t\t\t\t\t\t.toggleClass('hidden', !this.isEmpty)\n\t\t\t\t\tthis.$el\n\t\t\t\t\t\t.find('#filestable thead th')\n\t\t\t\t\t\t.toggleClass('hidden', this.isEmpty)\n\t\t\t\t} else {\n\t\t\t\t\tOCA.Files.FileList.prototype.updateEmptyContent.apply(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\targuments\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetDirectoryPermissions() {\n\t\t\t\treturn OC.PERMISSION_READ | OC.PERMISSION_DELETE\n\t\t\t},\n\n\t\t\tupdateStorageStatistics() {\n\t\t\t\t// no op because it doesn't have\n\t\t\t\t// storage info like free space / used space\n\t\t\t},\n\n\t\t\treload() {\n\t\t\t\t// there is only root\n\t\t\t\tthis._setCurrentDir('/', false)\n\n\t\t\t\tif (!this._systemTagIds.length) {\n\t\t\t\t\t// don't reload\n\t\t\t\t\tthis.updateEmptyContent()\n\t\t\t\t\tthis.setFiles([])\n\t\t\t\t\treturn $.Deferred().resolve()\n\t\t\t\t}\n\n\t\t\t\tthis._selectedFiles = {}\n\t\t\t\tthis._selectionSummary.clear()\n\t\t\t\tif (this._currentFileModel) {\n\t\t\t\t\tthis._currentFileModel.off()\n\t\t\t\t}\n\t\t\t\tthis._currentFileModel = null\n\t\t\t\tthis.$el.find('.select-all').prop('checked', false)\n\t\t\t\tthis.showMask()\n\t\t\t\tthis._reloadCall = this.filesClient.getFilteredFiles(\n\t\t\t\t\t{\n\t\t\t\t\t\tsystemTagIds: this._systemTagIds,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tproperties: this._getWebdavProperties(),\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tif (this._detailsView) {\n\t\t\t\t\t// close sidebar\n\t\t\t\t\tthis._updateDetailsView(null)\n\t\t\t\t}\n\t\t\t\tconst callBack = this.reloadCallback.bind(this)\n\t\t\t\treturn this._reloadCall.then(callBack, callBack)\n\t\t\t},\n\n\t\t\treloadCallback(status, result) {\n\t\t\t\tif (result) {\n\t\t\t\t\t// prepend empty dir info because original handler\n\t\t\t\t\tresult.unshift({})\n\t\t\t\t}\n\n\t\t\t\treturn OCA.Files.FileList.prototype.reloadCallback.call(\n\t\t\t\t\tthis,\n\t\t\t\t\tstatus,\n\t\t\t\t\tresult\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\t)\n\n\tOCA.SystemTags.FileList = FileList\n})()\n","/*\n * Copyright (c) 2015 Vincent Petry \n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function() {\n\tOCA.SystemTags = _.extend({}, OCA.SystemTags)\n\tif (!OCA.SystemTags) {\n\t\t/**\n\t\t * @namespace\n\t\t */\n\t\tOCA.SystemTags = {}\n\t}\n\n\t/**\n\t * @namespace\n\t */\n\tOCA.SystemTags.FilesPlugin = {\n\t\tignoreLists: [\n\t\t\t'trashbin',\n\t\t\t'files.public',\n\t\t],\n\n\t\tattach(fileList) {\n\t\t\tif (this.ignoreLists.indexOf(fileList.id) >= 0) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst systemTagsInfoView = new OCA.SystemTags.SystemTagsInfoView()\n\t\t\tfileList.registerDetailView(systemTagsInfoView)\n\t\t\tOCA.SystemTags.View = systemTagsInfoView\n\t\t},\n\t}\n\n})()\n\nOC.Plugins.register('OCA.Files.FileList', OCA.SystemTags.FilesPlugin)\n","/*\n * Copyright (c) 2015\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\n(function(OCA) {\n\n\tfunction modelToSelection(model) {\n\t\tconst data = model.toJSON()\n\t\tif (!OC.isUserAdmin() && !data.canAssign) {\n\t\t\tdata.locked = true\n\t\t}\n\t\treturn data\n\t}\n\n\t/**\n\t * @class OCA.SystemTags.SystemTagsInfoView\n\t * @classdesc\n\t *\n\t * Displays a file's system tags\n\t *\n\t */\n\tconst SystemTagsInfoView = OCA.Files.DetailFileInfoView.extend(\n\t\t/** @lends OCA.SystemTags.SystemTagsInfoView.prototype */ {\n\n\t\t\t_rendered: false,\n\n\t\t\tclassName: 'systemTagsInfoView',\n\t\t\tname: 'systemTags',\n\n\t\t\t/* required by the new files sidebar to check if the view is unique */\n\t\t\tid: 'systemTagsInfoView',\n\n\t\t\t/**\n\t\t\t * @type OC.SystemTags.SystemTagsInputField\n\t\t\t */\n\t\t\t_inputView: null,\n\n\t\t\tinitialize(options) {\n\t\t\t\tconst self = this\n\t\t\t\toptions = options || {}\n\n\t\t\t\tthis._inputView = new OC.SystemTags.SystemTagsInputField({\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\tallowActions: true,\n\t\t\t\t\tallowCreate: true,\n\t\t\t\t\tisAdmin: OC.isUserAdmin(),\n\t\t\t\t\tinitSelection(element, callback) {\n\t\t\t\t\t\tcallback(self.selectedTagsCollection.map(modelToSelection))\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tthis.selectedTagsCollection = new OC.SystemTags.SystemTagsMappingCollection([], { objectType: 'files' })\n\n\t\t\t\tthis._inputView.collection.on('change:name', this._onTagRenamedGlobally, this)\n\t\t\t\tthis._inputView.collection.on('remove', this._onTagDeletedGlobally, this)\n\n\t\t\t\tthis._inputView.on('select', this._onSelectTag, this)\n\t\t\t\tthis._inputView.on('deselect', this._onDeselectTag, this)\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Event handler whenever a tag was selected\n\t\t\t * @param {Object} tag the tag to create\n\t\t\t */\n\t\t\t_onSelectTag(tag) {\n\t\t\t// create a mapping entry for this tag\n\t\t\t\tthis.selectedTagsCollection.create(tag.toJSON())\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Event handler whenever a tag gets deselected.\n\t\t\t * Removes the selected tag from the mapping collection.\n\t\t\t *\n\t\t\t * @param {string} tagId tag id\n\t\t\t */\n\t\t\t_onDeselectTag(tagId) {\n\t\t\t\tthis.selectedTagsCollection.get(tagId).destroy()\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Event handler whenever a tag was renamed globally.\n\t\t\t *\n\t\t\t * This will automatically adjust the tag mapping collection to\n\t\t\t * container the new name.\n\t\t\t *\n\t\t\t * @param {OC.Backbone.Model} changedTag tag model that has changed\n\t\t\t */\n\t\t\t_onTagRenamedGlobally(changedTag) {\n\t\t\t// also rename it in the selection, if applicable\n\t\t\t\tconst selectedTagMapping = this.selectedTagsCollection.get(changedTag.id)\n\t\t\t\tif (selectedTagMapping) {\n\t\t\t\t\tselectedTagMapping.set(changedTag.toJSON())\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Event handler whenever a tag was deleted globally.\n\t\t\t *\n\t\t\t * This will automatically adjust the tag mapping collection to\n\t\t\t * container the new name.\n\t\t\t *\n\t\t\t * @param {OC.Backbone.Model} tagId tag model that has changed\n\t\t\t */\n\t\t\t_onTagDeletedGlobally(tagId) {\n\t\t\t// also rename it in the selection, if applicable\n\t\t\t\tthis.selectedTagsCollection.remove(tagId)\n\t\t\t},\n\n\t\t\tsetFileInfo(fileInfo) {\n\t\t\t\tconst self = this\n\t\t\t\tif (!this._rendered) {\n\t\t\t\t\tthis.render()\n\t\t\t\t}\n\n\t\t\t\tif (fileInfo) {\n\t\t\t\t\tthis.selectedTagsCollection.setObjectId(fileInfo.id)\n\t\t\t\t\tthis.selectedTagsCollection.fetch({\n\t\t\t\t\t\tsuccess(collection) {\n\t\t\t\t\t\t\tcollection.fetched = true\n\n\t\t\t\t\t\t\tconst appliedTags = collection.map(modelToSelection)\n\t\t\t\t\t\t\tself._inputView.setData(appliedTags)\n\t\t\t\t\t\t\tif (appliedTags.length > 0) {\n\t\t\t\t\t\t\t\tself.show()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tthis.hide()\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Renders this details view\n\t\t\t */\n\t\t\trender() {\n\t\t\t\tthis.$el.append(this._inputView.$el)\n\t\t\t\tthis._inputView.render()\n\t\t\t},\n\n\t\t\tisVisible() {\n\t\t\t\treturn !this.$el.hasClass('hidden')\n\t\t\t},\n\n\t\t\tshow() {\n\t\t\t\tthis.$el.removeClass('hidden')\n\t\t\t},\n\n\t\t\thide() {\n\t\t\t\tthis.$el.addClass('hidden')\n\t\t\t},\n\n\t\t\ttoggle() {\n\t\t\t\tthis.$el.toggleClass('hidden')\n\t\t\t},\n\n\t\t\topenDropdown() {\n\t\t\t\tthis.$el.find('.systemTagsInputField').select2('open')\n\t\t\t},\n\n\t\t\tremove() {\n\t\t\t\tthis._inputView.remove()\n\t\t\t},\n\t\t})\n\n\tOCA.SystemTags.SystemTagsInfoView = SystemTagsInfoView\n\n})(OCA)\n","// style-loader: Adds some css to the DOM by adding a