From 882a580d81d428784dba84341960c794ab0e6f8c Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:01:22 +0200 Subject: [PATCH 01/17] Tags init --- .../components/FilesList/ContextActions.vue | 3 + .../SideBar/Details/FileDetails.vue | 26 +++- .../src/components/SideBar/TagsPanel.vue | 123 ++++++++++++++++++ packages/web-app-files/src/fileSideBars.ts | 17 +++ .../web-app-files/src/helpers/resources.ts | 1 + .../src/mixins/actions/showEditTags.js | 44 +++++++ .../web-app-files/src/mixins/fileActions.ts | 5 +- .../web-client/src/helpers/resource/types.ts | 1 + 8 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 packages/web-app-files/src/components/SideBar/TagsPanel.vue create mode 100644 packages/web-app-files/src/mixins/actions/showEditTags.js diff --git a/packages/web-app-files/src/components/FilesList/ContextActions.vue b/packages/web-app-files/src/components/FilesList/ContextActions.vue index 0fd0b2f09ea..d7c2d1f0971 100644 --- a/packages/web-app-files/src/components/FilesList/ContextActions.vue +++ b/packages/web-app-files/src/components/FilesList/ContextActions.vue @@ -22,6 +22,7 @@ import Rename from '../../mixins/actions/rename' import Restore from '../../mixins/actions/restore' import ShowActions from '../../mixins/actions/showActions' import ShowDetails from '../../mixins/actions/showDetails' +import ShowEditTags from '../../mixins/actions/showEditTags' import ShowShares from '../../mixins/actions/showShares' import SetSpaceImage from '../../mixins/spaces/actions/setImage' import SetSpaceReadme from '../../mixins/spaces/actions/setReadme' @@ -50,6 +51,7 @@ export default { Restore, ShowActions, ShowDetails, + ShowEditTags, ShowShares, SetSpaceImage, SetSpaceReadme, @@ -152,6 +154,7 @@ export default { ...this.$_copy_items, ...this.$_paste_items, ...this.$_rename_items, + ...this.$_showEditTags_items, ...this.$_restore_items, ...this.$_acceptShare_items, ...this.$_declineShare_items, diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index 70103b00d77..5430f41561e 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -140,6 +140,17 @@ + + + + + + {{ tag }}, + + + + +

@@ -154,8 +165,9 @@ import { ImageDimension } from '../../../constants' import { loadPreview } from 'web-pkg/src/helpers/preview' import upperFirst from 'lodash-es/upperFirst' import path from 'path' -import { createLocationSpaces, isLocationSpacesActive } from '../../../router' +import { createLocationSpaces, isLocationSpacesActive, createLocationCommon } from '../../../router' import { ShareTypes } from 'web-client/src/helpers/share' + import { useAccessToken, usePublicLinkContext, @@ -334,6 +346,12 @@ export default defineComponent({ const displayDate = this.formDateFromHTTP(this.file.mdate) return upperFirst(displayDate) }, + showTags() { + return this.file.tags.length + }, + tagsLabel() { + return this.$gettext('Tags') + }, hasAnyShares() { return ( this.file.shareTypes?.length > 0 || @@ -462,6 +480,11 @@ export default defineComponent({ this.copiedDirect = false this.copiedEos = false }, 550) + }, + getTagLink(tag) { + return createLocationCommon('files-common-search', { + query: { term: `tag:${tag}`, provider: 'files.sdk' } + }) } } }) @@ -476,6 +499,7 @@ export default defineComponent({ td { max-width: 0; width: 100%; + overflow-wrap: break-word; div { min-width: 0; diff --git a/packages/web-app-files/src/components/SideBar/TagsPanel.vue b/packages/web-app-files/src/components/SideBar/TagsPanel.vue new file mode 100644 index 00000000000..9d4b30bd5cb --- /dev/null +++ b/packages/web-app-files/src/components/SideBar/TagsPanel.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/packages/web-app-files/src/fileSideBars.ts b/packages/web-app-files/src/fileSideBars.ts index 1f6e4668e53..85a97d30e04 100644 --- a/packages/web-app-files/src/fileSideBars.ts +++ b/packages/web-app-files/src/fileSideBars.ts @@ -3,6 +3,7 @@ import FileDetailsMultiple from './components/SideBar/Details/FileDetailsMultipl import FileActions from './components/SideBar/Actions/FileActions.vue' import FileVersions from './components/SideBar/Versions/FileVersions.vue' import SharesPanel from './components/SideBar/Shares/SharesPanel.vue' +import TagsPanel from './components/SideBar/TagsPanel.vue' import NoSelection from './components/SideBar/NoSelection.vue' import SpaceActions from './components/SideBar/Actions/SpaceActions.vue' import SpaceDetails from './components/SideBar/Details/SpaceDetails.vue' @@ -140,6 +141,22 @@ const panelGenerators: (({ return false } }), + ({ capabilities, router, multipleSelection, rootFolder }) => ({ + app: 'tags-item', + icon: 'price-tag-3', + iconFillType: 'line', + title: $gettext('Tags'), + component: TagsPanel, + componentAttrs: {}, + get enabled() { + if (multipleSelection || rootFolder) return false + return !( + isLocationTrashActive(router, 'files-trash-personal') || + isLocationTrashActive(router, 'files-trash-spaces-project') || + isLocationPublicActive(router, 'files-public-files') + ) + } + }), ({ highlightedFile, capabilities }) => ({ app: 'space-share-item', icon: 'group', diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index 94048e21df6..bccb253dd59 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -81,6 +81,7 @@ export function buildResource(resource): Resource { downloadURL: resource.fileInfo[DavProperty.DownloadURL], ownerDisplayName: resource.fileInfo[DavProperty.OwnerDisplayName], ownerId: resource.fileInfo[DavProperty.OwnerId], + tags: ['space', 'oddity'], canUpload: function () { return this.permissions.indexOf(DavPermission.FolderCreateable) >= 0 }, diff --git a/packages/web-app-files/src/mixins/actions/showEditTags.js b/packages/web-app-files/src/mixins/actions/showEditTags.js new file mode 100644 index 00000000000..a574d1a41e2 --- /dev/null +++ b/packages/web-app-files/src/mixins/actions/showEditTags.js @@ -0,0 +1,44 @@ +import { mapActions } from 'vuex' +import { isLocationTrashActive } from '../../router' +import isFilesAppActive from './helpers/isFilesAppActive' + +export default { + mixins: [isFilesAppActive], + computed: { + $_showEditTags_items() { + return [ + { + name: 'show-edit-tags', + icon: 'price-tag-3', + label: () => this.$gettext('Add or edit tags'), + handler: this.$_showEditTags_trigger, + // we don't have details in the trashbin, yet. + // remove trashbin route rule once we have them. + isEnabled: ({ resources }) => { + // sidebar is currently only available inside files app + if (!this.$_isFilesAppActive) { + return false + } + + if ( + isLocationTrashActive(this.$router, 'files-trash-personal') || + isLocationTrashActive(this.$router, 'files-trash-spaces-project') + ) { + return false + } + return resources.length === 1 + }, + componentType: 'oc-button', + class: 'oc-files-actions-show-edit-tags-trigger' + } + ] + } + }, + methods: { + ...mapActions('Files/sidebar', { openSidebarWithPanel: 'openWithPanel' }), + + async $_showEditTags_trigger() { + await this.openSidebarWithPanel('tags-item') + } + } +} diff --git a/packages/web-app-files/src/mixins/fileActions.ts b/packages/web-app-files/src/mixins/fileActions.ts index 721885d718b..89a742dad42 100644 --- a/packages/web-app-files/src/mixins/fileActions.ts +++ b/packages/web-app-files/src/mixins/fileActions.ts @@ -11,6 +11,7 @@ import DownloadArchive from './actions/downloadArchive' import DownloadFile from './actions/downloadFile' import Favorite from './actions/favorite' import Move from './actions/move' +import ShowEditTags from './actions/showEditTags' import Navigate from './actions/navigate' import Rename from './actions/rename' import Restore from './actions/restore' @@ -25,6 +26,7 @@ const actionsMixins = [ 'copy', 'move', 'rename', + 'showEditTags', 'restore', 'delete', 'acceptShare', @@ -46,7 +48,8 @@ export default { Move, Navigate, Rename, - Restore + Restore, + ShowEditTags ], computed: { ...mapState(['apps']), diff --git a/packages/web-client/src/helpers/resource/types.ts b/packages/web-client/src/helpers/resource/types.ts index 3a053463f94..7ef60ab386a 100644 --- a/packages/web-client/src/helpers/resource/types.ts +++ b/packages/web-client/src/helpers/resource/types.ts @@ -25,6 +25,7 @@ export interface Resource { sharePermissions?: number shareTypes?: number[] privateLink?: string + tags?: string[] canCreate?(): boolean canUpload?(): boolean From 5d040f769fba44ffbecb93f45ac06efaf537e316 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:15:41 +0200 Subject: [PATCH 02/17] Add permission system --- packages/web-app-files/src/fileSideBars.ts | 4 ++-- packages/web-app-files/src/helpers/resources.ts | 6 ++++++ packages/web-app-files/src/mixins/actions/showEditTags.js | 2 +- packages/web-client/src/helpers/resource/types.ts | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/web-app-files/src/fileSideBars.ts b/packages/web-app-files/src/fileSideBars.ts index 85a97d30e04..3cf754dbff5 100644 --- a/packages/web-app-files/src/fileSideBars.ts +++ b/packages/web-app-files/src/fileSideBars.ts @@ -141,7 +141,7 @@ const panelGenerators: (({ return false } }), - ({ capabilities, router, multipleSelection, rootFolder }) => ({ + ({ highlightedFile, router, multipleSelection, rootFolder }) => ({ app: 'tags-item', icon: 'price-tag-3', iconFillType: 'line', @@ -149,7 +149,7 @@ const panelGenerators: (({ component: TagsPanel, componentAttrs: {}, get enabled() { - if (multipleSelection || rootFolder) return false + if (multipleSelection || rootFolder || !highlightedFile.canEditTags()) return false return !( isLocationTrashActive(router, 'files-trash-personal') || isLocationTrashActive(router, 'files-trash-spaces-project') || diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index bccb253dd59..8c04ace3889 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -100,6 +100,12 @@ export function buildResource(resource): Resource { canCreate: function () { return this.permissions.indexOf(DavPermission.FolderCreateable) >= 0 }, + canEditTags: function () { + return ( + this.permissions.indexOf(DavPermission.Updateable) >= 0 && + this.permissions.indexOf(DavPermission.FileUpdateable) >= 0 + ) + }, isMounted: function () { return this.permissions.indexOf(DavPermission.Mounted) >= 0 }, diff --git a/packages/web-app-files/src/mixins/actions/showEditTags.js b/packages/web-app-files/src/mixins/actions/showEditTags.js index a574d1a41e2..8cc4fcb2f13 100644 --- a/packages/web-app-files/src/mixins/actions/showEditTags.js +++ b/packages/web-app-files/src/mixins/actions/showEditTags.js @@ -26,7 +26,7 @@ export default { ) { return false } - return resources.length === 1 + return resources.length === 1 && resources[0].canEditTags() }, componentType: 'oc-button', class: 'oc-files-actions-show-edit-tags-trigger' diff --git a/packages/web-client/src/helpers/resource/types.ts b/packages/web-client/src/helpers/resource/types.ts index 7ef60ab386a..f9aeb233363 100644 --- a/packages/web-client/src/helpers/resource/types.ts +++ b/packages/web-client/src/helpers/resource/types.ts @@ -34,6 +34,7 @@ export interface Resource { canRename?(): boolean canBeDeleted?(): boolean canBeRestored?(): boolean + canEditTags?(): boolean isReceivedShare?(): boolean isMounted?(): boolean From d4d6da5cd36145547b67444890bb732377902304 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:23:49 +0200 Subject: [PATCH 03/17] enhance permission system --- packages/web-app-files/src/helpers/resources.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index 8c04ace3889..8817ec7e485 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -229,7 +229,8 @@ export function buildSharedResource( sdate: DateTime.fromSeconds(parseInt(share.stime)).toRFC2822(), indicators: [], path: undefined, - webDavPath: undefined + webDavPath: undefined, + tags: ['space', 'oddity'] } if (incomingShares) { @@ -261,6 +262,9 @@ export function buildSharedResource( resource.canShare = () => SharePermissions.share.enabled(share.permissions) resource.canRename = () => SharePermissions.update.enabled(share.permissions) resource.canBeDeleted = () => SharePermissions.delete.enabled(share.permissions) + resource.canEditTags = () => + parseInt(share.state) === ShareStatus.accepted && + SharePermissions.update.enabled(share.permissions) } else { resource.sharedWith = share.sharedWith || [] resource.shareOwner = share.uid_owner @@ -274,6 +278,7 @@ export function buildSharedResource( resource.canShare = () => true resource.canRename = () => true resource.canBeDeleted = () => true + resource.canEditTags = () => true } resource.extension = extractExtensionFromFile(resource) From 9822b6ca0c43d3007fd6d21672e129a22e33cd39 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:26:08 +0200 Subject: [PATCH 04/17] Remove console.log --- packages/web-app-files/src/components/SideBar/TagsPanel.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web-app-files/src/components/SideBar/TagsPanel.vue b/packages/web-app-files/src/components/SideBar/TagsPanel.vue index 9d4b30bd5cb..ec0e2b88f6a 100644 --- a/packages/web-app-files/src/components/SideBar/TagsPanel.vue +++ b/packages/web-app-files/src/components/SideBar/TagsPanel.vue @@ -113,7 +113,6 @@ export default defineComponent({ return option.toLowerCase() }, showSelectNewLabel(option) { - console.log(this.$refs.tagSelect) return !this.$refs.tagSelect.$refs.select.optionExists(option) } } From af3ec52b46632a91a435ac83dd3537c59df72809 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:35:49 +0200 Subject: [PATCH 05/17] Lint --- .../src/components/SideBar/Details/FileDetails.vue | 2 +- packages/web-app-files/src/components/SideBar/TagsPanel.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index 5430f41561e..95780f0529f 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -143,7 +143,7 @@ - + {{ tag }}, diff --git a/packages/web-app-files/src/components/SideBar/TagsPanel.vue b/packages/web-app-files/src/components/SideBar/TagsPanel.vue index ec0e2b88f6a..562c2c6c580 100644 --- a/packages/web-app-files/src/components/SideBar/TagsPanel.vue +++ b/packages/web-app-files/src/components/SideBar/TagsPanel.vue @@ -86,7 +86,7 @@ export default defineComponent({ computed: { resource() { return this.displayedItem.value - }, + } }, mounted() { this.editAssignedTags = [...this.resource.tags] From 07bdfd12851d1cce81dbc2063afe75abcc47066d Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 11:39:30 +0200 Subject: [PATCH 06/17] enhance permission system --- packages/web-app-files/src/helpers/resources.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index 8817ec7e485..d124c93d481 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -102,7 +102,7 @@ export function buildResource(resource): Resource { }, canEditTags: function () { return ( - this.permissions.indexOf(DavPermission.Updateable) >= 0 && + this.permissions.indexOf(DavPermission.Updateable) >= 0 || this.permissions.indexOf(DavPermission.FileUpdateable) >= 0 ) }, From b0498d99d0994c409d4365b4a1ffcd5b46e5d0f3 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 12:25:23 +0200 Subject: [PATCH 07/17] Fix unit tests --- packages/web-app-files/src/fileSideBars.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/web-app-files/src/fileSideBars.ts b/packages/web-app-files/src/fileSideBars.ts index 3cf754dbff5..21d558cef96 100644 --- a/packages/web-app-files/src/fileSideBars.ts +++ b/packages/web-app-files/src/fileSideBars.ts @@ -149,7 +149,9 @@ const panelGenerators: (({ component: TagsPanel, componentAttrs: {}, get enabled() { - if (multipleSelection || rootFolder || !highlightedFile.canEditTags()) return false + if (multipleSelection || rootFolder) return false + if (typeof highlightedFile.canEditTags !== 'function' || !highlightedFile.canEditTags()) + return false return !( isLocationTrashActive(router, 'files-trash-personal') || isLocationTrashActive(router, 'files-trash-spaces-project') || From 20903a3e7efbd78441cd32abd084dee0dc9fcf88 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Tue, 2 Aug 2022 12:38:52 +0200 Subject: [PATCH 08/17] Update snapshots --- .../src/components/SideBar/Details/FileDetails.vue | 2 +- .../Details/__snapshots__/FileDetails.spec.js.snap | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index 95780f0529f..f0d72fb2900 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -347,7 +347,7 @@ export default defineComponent({ return upperFirst(displayDate) }, showTags() { - return this.file.tags.length + return this.file.tags?.length }, tagsLabel() { return this.$gettext('Tags') diff --git a/packages/web-app-files/tests/unit/components/SideBar/Details/__snapshots__/FileDetails.spec.js.snap b/packages/web-app-files/tests/unit/components/SideBar/Details/__snapshots__/FileDetails.spec.js.snap index e86fa4884d7..0d15c4c5c0b 100644 --- a/packages/web-app-files/tests/unit/components/SideBar/Details/__snapshots__/FileDetails.spec.js.snap +++ b/packages/web-app-files/tests/unit/components/SideBar/Details/__snapshots__/FileDetails.spec.js.snap @@ -39,6 +39,7 @@ exports[`Details SideBar Panel displays a resource of type file on a private pag + @@ -86,6 +87,7 @@ exports[`Details SideBar Panel displays a resource of type file on a private pag + @@ -122,6 +124,7 @@ exports[`Details SideBar Panel displays a resource of type file on a private pag + @@ -163,6 +166,7 @@ exports[`Details SideBar Panel displays a resource of type file on a private pag + @@ -224,6 +228,7 @@ exports[`Details SideBar Panel displays a resource of type file on a private pag + @@ -260,6 +265,7 @@ exports[`Details SideBar Panel displays a resource of type file on a public page + @@ -316,6 +322,7 @@ exports[`Details SideBar Panel displays a resource of type file on a public page + @@ -352,6 +359,7 @@ exports[`Details SideBar Panel displays a resource of type folder on a private p + @@ -388,6 +396,7 @@ exports[`Details SideBar Panel displays a resource of type folder on a private p + @@ -444,6 +453,7 @@ exports[`Details SideBar Panel displays a resource of type folder on a private p + @@ -480,6 +490,7 @@ exports[`Details SideBar Panel displays a resource of type folder on a public pa + @@ -536,6 +547,7 @@ exports[`Details SideBar Panel displays a resource of type folder on a public pa + From 886d2ade956f6a972889c24c7a73608a6bdbb18b Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Thu, 4 Aug 2022 17:37:51 +0200 Subject: [PATCH 09/17] Enhancements --- .../src/components/SideBar/TagsPanel.vue | 33 ++++++++++++++----- .../web-app-files/src/helpers/resources.ts | 2 +- packages/web-pkg/src/constants/dav.ts | 4 ++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/TagsPanel.vue b/packages/web-app-files/src/components/SideBar/TagsPanel.vue index 562c2c6c580..a942b84e1c9 100644 --- a/packages/web-app-files/src/components/SideBar/TagsPanel.vue +++ b/packages/web-app-files/src/components/SideBar/TagsPanel.vue @@ -99,15 +99,32 @@ export default defineComponent({ revertChanges() { this.editAssignedTags = [...this.resource.tags] }, - save() { - this.UPDATE_RESOURCE_FIELD({ - id: this.resource.id, - field: 'tags', - value: [...this.editAssignedTags] - }) - this.displayedItem.value.tags = [...this.editAssignedTags] + async save() { + try { + const tagsToAdd = this.editAssignedTags.filter((tag) => !this.resource.tags.includes(tag)) + const tagsToRemove = this.resource.tags.filter( + (tag) => !this.editAssignedTags.includes(tag) + ) - bus.publish('sidebar.entity.saved') + if (tagsToAdd.length) { + await this.$client.tags.addResourceTag(this.resource.fileId, tagsToAdd) + } + + if (tagsToRemove.length) { + await this.$client.tags.removeResourceTag(this.resource.fileId, tagsToRemove) + } + + this.UPDATE_RESOURCE_FIELD({ + id: this.resource.id, + field: 'tags', + value: [...this.editAssignedTags] + }) + this.displayedItem.value.tags = [...this.editAssignedTags] + + bus.publish('sidebar.entity.saved') + } catch (e) { + console.error(e) + } }, createOption(option) { return option.toLowerCase() diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index d124c93d481..a533df8e722 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -81,7 +81,7 @@ export function buildResource(resource): Resource { downloadURL: resource.fileInfo[DavProperty.DownloadURL], ownerDisplayName: resource.fileInfo[DavProperty.OwnerDisplayName], ownerId: resource.fileInfo[DavProperty.OwnerId], - tags: ['space', 'oddity'], + tags: (resource.fileInfo[DavProperty.Tags] || '').split(',').filter(Boolean), canUpload: function () { return this.permissions.indexOf(DavPermission.FolderCreateable) >= 0 }, diff --git a/packages/web-pkg/src/constants/dav.ts b/packages/web-pkg/src/constants/dav.ts index 197382fdfd5..f995850e815 100644 --- a/packages/web-pkg/src/constants/dav.ts +++ b/packages/web-pkg/src/constants/dav.ts @@ -20,6 +20,7 @@ export abstract class DavProperty { static readonly ContentLength: string = '{DAV:}getcontentlength' static readonly ContentSize: string = '{http://owncloud.org/ns}size' static readonly LastModifiedDate: string = '{DAV:}getlastmodified' + static readonly Tags: string = '{http://owncloud.org/ns}tags' static readonly ETag: string = '{DAV:}getetag' static readonly MimeType: string = '{DAV:}getcontenttype' static readonly ResourceType: string = '{DAV:}resourcetype' @@ -59,7 +60,8 @@ export abstract class DavProperties { DavProperty.ETag, DavProperty.MimeType, DavProperty.ResourceType, - DavProperty.DownloadURL + DavProperty.DownloadURL, + DavProperty.Tags ] static readonly PublicLink: DavProperty[] = DavProperties.Default.concat([ From e26bc507e26237c1d0a9e4880b0ecfd942d27844 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Thu, 11 Aug 2022 17:55:48 +0200 Subject: [PATCH 10/17] update search tag query add keys tags key to filter search bump sdk to experimental version open details sidebar instead of tags sidebar panel when navigation through files table more tags link update search input value when search query changes add list all tags endpoint and use it when entering a tag phrase --- .../enhancement-add-tags-to-resource-table | 5 --- changelog/unreleased/enhancement-tags-support | 9 +++++ .../components/FilesList/ResourceTable.vue | 5 ++- .../SideBar/Details/FileDetails.vue | 2 +- .../src/components/SideBar/TagsPanel.vue | 9 ++++- .../src/helpers/resource/filter.ts | 2 +- .../web-app-files/src/helpers/resources.ts | 4 +- .../src/mixins/actions/showEditTags.js | 5 ++- .../web-app-search/src/portals/SearchBar.vue | 37 ++++++++++--------- .../web-client/src/helpers/resource/types.ts | 1 - packages/web-runtime/package.json | 2 +- yarn.lock | 10 ++--- 12 files changed, 52 insertions(+), 39 deletions(-) delete mode 100644 changelog/unreleased/enhancement-add-tags-to-resource-table create mode 100644 changelog/unreleased/enhancement-tags-support diff --git a/changelog/unreleased/enhancement-add-tags-to-resource-table b/changelog/unreleased/enhancement-add-tags-to-resource-table deleted file mode 100644 index e1f21edaa70..00000000000 --- a/changelog/unreleased/enhancement-add-tags-to-resource-table +++ /dev/null @@ -1,5 +0,0 @@ -Enhancement: Add Tags to ResourceTable - -We've added a new column in ResourceTable to display tags - -https://github.com/owncloud/web/pull/7388 \ No newline at end of file diff --git a/changelog/unreleased/enhancement-tags-support b/changelog/unreleased/enhancement-tags-support new file mode 100644 index 00000000000..32ec3d34f6d --- /dev/null +++ b/changelog/unreleased/enhancement-tags-support @@ -0,0 +1,9 @@ +Enhancement: Add Tag support + +Managing files via tags is now possible in web, the feature is experimental and will be only available through a dedicated experimental web build. +Beside that the web version is experimental, it also needs a special experimental ocis version. + +Creating Tags, tagging resources and search for tags now is possible and can be used as an alternative way of working and organizing resources. + +https://github.com/owncloud/web/pull/7388 +https://github.com/owncloud/web/pull/7385 diff --git a/packages/web-app-files/src/components/FilesList/ResourceTable.vue b/packages/web-app-files/src/components/FilesList/ResourceTable.vue index 52d1568d631..cdc7a69e5c2 100644 --- a/packages/web-app-files/src/components/FilesList/ResourceTable.vue +++ b/packages/web-app-files/src/components/FilesList/ResourceTable.vue @@ -589,12 +589,13 @@ export default defineComponent({ }, methods: { ...mapActions('Files/sidebar', ['openWithPanel']), + ...mapActions('Files/sidebar', { openSidebar: 'open' }), isResourceSelected(item) { return this.selectedIds.includes(item.id) }, getTagLink(tag) { return createLocationCommon('files-common-search', { - query: { term: `tag:${tag}`, provider: 'files.sdk' } + query: { term: `Tags:${tag}`, provider: 'files.sdk' } }) }, isResourceCut(resource) { @@ -612,7 +613,7 @@ export default defineComponent({ this.$_rename_trigger({ resources: [item] }) }, openTagsSidebar() { - this.openWithPanel('tags-item') + this.openSidebar() }, openSharingSidebar(file) { if (file.share?.shareType === ShareTypes.link.value) { diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index f0d72fb2900..543222ba8f4 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -483,7 +483,7 @@ export default defineComponent({ }, getTagLink(tag) { return createLocationCommon('files-common-search', { - query: { term: `tag:${tag}`, provider: 'files.sdk' } + query: { term: `Tags:${tag}`, provider: 'files.sdk' } }) } } diff --git a/packages/web-app-files/src/components/SideBar/TagsPanel.vue b/packages/web-app-files/src/components/SideBar/TagsPanel.vue index a942b84e1c9..745662aa4a6 100644 --- a/packages/web-app-files/src/components/SideBar/TagsPanel.vue +++ b/packages/web-app-files/src/components/SideBar/TagsPanel.vue @@ -58,6 +58,8 @@ import { defineComponent, ref } from '@vue/composition-api' import CompareSaveDialog from 'web-pkg/src/components/sidebar/CompareSaveDialog.vue' import { bus } from 'web-pkg/src/instance' import { useTask } from 'vue-concurrency' +import { useRequest, useStore } from 'web-pkg/src/composables' + const tagsMaxCount = 100 export default defineComponent({ @@ -67,9 +69,14 @@ export default defineComponent({ }, inject: ['displayedItem'], setup() { + const store = useStore() const allTags = ref([]) + const { makeRequest } = useRequest() const loadAllTagsTask = useTask(function* (signal, ref) { - allTags.value = ['space', 'oddity', 'astronaut'] + const { + data: { tags = [] } + } = yield makeRequest('GET', `${store.getters.configuration.server}experimental/tags`, {}) + allTags.value = tags }) return { diff --git a/packages/web-app-files/src/helpers/resource/filter.ts b/packages/web-app-files/src/helpers/resource/filter.ts index 83cb8752490..57608f053b5 100644 --- a/packages/web-app-files/src/helpers/resource/filter.ts +++ b/packages/web-app-files/src/helpers/resource/filter.ts @@ -5,7 +5,7 @@ export const filterResources = (resources: unknown[], term: string, limit?: numb includeScore: true, useExtendedSearch: true, threshold: 0.3, - keys: ['name', 'type', 'icon', 'extension'] + keys: ['name', 'type', 'icon', 'extension', 'tags'] }) return (engine.search(term, { limit }) as any[]).map((result: any) => result.item) diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index a533df8e722..12eb7869e34 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -56,7 +56,6 @@ export function buildResource(resource): Resource { storageId: extractStorageId(resource.fileInfo[DavProperty.FileId]), mimeType: resource.fileInfo[DavProperty.MimeType], name: path.basename(resource.name), - tags: ['space', 'mars', 'code', 'intern'], extension: isFolder ? '' : extension, path: resourcePath, webDavPath: resource.name, @@ -229,8 +228,7 @@ export function buildSharedResource( sdate: DateTime.fromSeconds(parseInt(share.stime)).toRFC2822(), indicators: [], path: undefined, - webDavPath: undefined, - tags: ['space', 'oddity'] + webDavPath: undefined } if (incomingShares) { diff --git a/packages/web-app-files/src/mixins/actions/showEditTags.js b/packages/web-app-files/src/mixins/actions/showEditTags.js index 8cc4fcb2f13..ebd02486615 100644 --- a/packages/web-app-files/src/mixins/actions/showEditTags.js +++ b/packages/web-app-files/src/mixins/actions/showEditTags.js @@ -1,5 +1,5 @@ import { mapActions } from 'vuex' -import { isLocationTrashActive } from '../../router' +import { isLocationTrashActive, isLocationPublicActive } from '../../router' import isFilesAppActive from './helpers/isFilesAppActive' export default { @@ -22,7 +22,8 @@ export default { if ( isLocationTrashActive(this.$router, 'files-trash-personal') || - isLocationTrashActive(this.$router, 'files-trash-spaces-project') + isLocationTrashActive(this.$router, 'files-trash-spaces-project') || + isLocationPublicActive(this.$router, 'files-public-files') ) { return false } diff --git a/packages/web-app-search/src/portals/SearchBar.vue b/packages/web-app-search/src/portals/SearchBar.vue index 00af1cc5c6a..7a79186e7c7 100644 --- a/packages/web-app-search/src/portals/SearchBar.vue +++ b/packages/web-app-search/src/portals/SearchBar.vue @@ -88,27 +88,30 @@ export default { }, watch: { - $route() { - if (this.activeProvider && !this.activeProvider.available) { - this.activeProvider = undefined - } - } - }, + $route: { + handler(r) { + if (this.activeProvider && !this.activeProvider.available) { + this.activeProvider = undefined + } - mounted() { - if (!this.availableProviders.length) { - return - } + this.$nextTick(() => { + if (!this.availableProviders.length) { + return + } - const input = this.$el.getElementsByTagName('input')[0] - const routeTerm = get(this, '$route.query.term') + const routeTerm = get(r, 'query.term') + const input = this.$el.getElementsByTagName('input')[0] + if (!input || !routeTerm) { + return + } - if (!input || !routeTerm) { - return + this.term = routeTerm + input.value = routeTerm + }) + }, + // force eager callback execution + immediate: true } - - this.term = routeTerm - input.value = routeTerm }, asyncComputed: { diff --git a/packages/web-client/src/helpers/resource/types.ts b/packages/web-client/src/helpers/resource/types.ts index f9aeb233363..7b39a5f8818 100644 --- a/packages/web-client/src/helpers/resource/types.ts +++ b/packages/web-client/src/helpers/resource/types.ts @@ -6,7 +6,6 @@ export interface Resource { fileId?: string storageId?: string name?: string - tags?: string[] path: string webDavPath?: string downloadURL?: string diff --git a/packages/web-runtime/package.json b/packages/web-runtime/package.json index 6a6bd06e2ce..c1258efcf66 100644 --- a/packages/web-runtime/package.json +++ b/packages/web-runtime/package.json @@ -25,7 +25,7 @@ "marked": "^4.0.12", "oidc-client-ts": "^2.0.5", "owncloud-design-system": "14.0.0-alpha.14", - "owncloud-sdk": "~3.0.0-alpha.15", + "owncloud-sdk": "owncloud/owncloud-sdk.git#experimental", "p-queue": "^6.6.2", "popper-max-size-modifier": "^0.2.0", "portal-vue": "^2.1.7", diff --git a/yarn.lock b/yarn.lock index 27a131ef53a..e486f32d204 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9734,9 +9734,9 @@ __metadata: languageName: node linkType: hard -"owncloud-sdk@npm:~3.0.0-alpha.15": - version: 3.0.0-alpha.15 - resolution: "owncloud-sdk@npm:3.0.0-alpha.15" +"owncloud-sdk@owncloud/owncloud-sdk.git#experimental": + version: 2.0.1 + resolution: "owncloud-sdk@https://github.com/owncloud/owncloud-sdk.git#commit=4341933e1456ceeb806b65897517854297536bc1" peerDependencies: axios: ^0.27.2 cross-fetch: ^3.0.6 @@ -9749,7 +9749,7 @@ __metadata: dependenciesMeta: "@pact-foundation/pact": built: true - checksum: 3892508b42965f5602fb985173185ee9799d41d0e719895ad574d4b8b2b15326d69bc14300c1d84b14422e4acb3f4de101fdce2f36fc52658c0fa8b17b76c614 + checksum: aefe1b9059f850703520b68c5e1808b203db6e7e426bd7454261e0a839c7c3c46e186b3f1f66a0d421fcc595f8a9c55244e4954f92a99f89aa5e535abf32a3d6 languageName: node linkType: hard @@ -13774,7 +13774,7 @@ __metadata: marked: ^4.0.12 oidc-client-ts: ^2.0.5 owncloud-design-system: 14.0.0-alpha.14 - owncloud-sdk: ~3.0.0-alpha.15 + owncloud-sdk: "owncloud/owncloud-sdk.git#experimental" p-queue: ^6.6.2 popper-max-size-modifier: ^0.2.0 portal-vue: ^2.1.7 From fa7ea8b70e6c09901cd74b48e070d7db0fa6fec3 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Thu, 11 Aug 2022 18:29:13 +0200 Subject: [PATCH 11/17] fix tests --- packages/web-app-search/src/portals/SearchBar.vue | 5 ++--- .../web-app-search/tests/unit/portals/SearchBar.spec.ts | 6 ++++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/web-app-search/src/portals/SearchBar.vue b/packages/web-app-search/src/portals/SearchBar.vue index 7a79186e7c7..34e4555d5b1 100644 --- a/packages/web-app-search/src/portals/SearchBar.vue +++ b/packages/web-app-search/src/portals/SearchBar.vue @@ -89,8 +89,8 @@ export default { watch: { $route: { - handler(r) { - if (this.activeProvider && !this.activeProvider.available) { + handler(r, o) { + if (!!o && this.activeProvider && !this.activeProvider.available) { this.activeProvider = undefined } @@ -109,7 +109,6 @@ export default { input.value = routeTerm }) }, - // force eager callback execution immediate: true } }, diff --git a/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts index ebd33231393..6c3c86248ad 100644 --- a/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts +++ b/packages/web-app-search/tests/unit/portals/SearchBar.spec.ts @@ -89,7 +89,7 @@ describe('Search Bar portal component', () => { }) expect(wrapper.vm.$data.activeProvider).toBeTruthy() - ;(wrapper.vm.$options.watch.$route as any).call(wrapper.vm) + ;(wrapper.vm.$options.watch.$route.handler as any).call(wrapper.vm, undefined, true) expect(wrapper.vm.$data.activeProvider).toBeFalsy() }) test('notifies active provider to update term on input', async () => { @@ -376,7 +376,7 @@ describe('Search Bar portal component', () => { data: 'dummyProviderOne - 2' }) }) - test('sets the search term and input term to the route value on mount', () => { + test('sets the search term and input term to the route value on mount', async () => { wrapper = mount(SearchBar, { localVue, data() { @@ -397,6 +397,8 @@ describe('Search Bar portal component', () => { } }) + await wrapper.vm.$nextTick() + expect(wrapper.vm.$data.term).toBe('routeTerm') expect((wrapper.get('input').element as HTMLInputElement).value).toBe('routeTerm') }) From 74937604a76470925b3fb6b9974d30ff205059c2 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Fri, 12 Aug 2022 12:21:56 +0200 Subject: [PATCH 12/17] bump ocis --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index 4c5b143817e..c14c7a2691f 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The version of OCIS to use in pipelines that test against OCIS -OCIS_COMMITID=58a88456856364a631eaf7f7b74105c708362632 +OCIS_COMMITID=c2b27ef4c1cb48664dfbc6d75344ddea69345a0f OCIS_BRANCH=experimental From 6a47968a55a28d78b54016507053e8d4e141a073 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Fri, 12 Aug 2022 13:35:27 +0200 Subject: [PATCH 13/17] Add capabilities check --- .../src/components/SideBar/Details/FileDetails.vue | 4 ++-- packages/web-app-files/src/fileSideBars.ts | 4 ++-- packages/web-app-files/src/mixins/actions/showEditTags.js | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue index 543222ba8f4..5aa9ef61d88 100644 --- a/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue +++ b/packages/web-app-files/src/components/SideBar/Details/FileDetails.vue @@ -224,7 +224,7 @@ export default defineComponent({ }), computed: { ...mapGetters('Files', ['versions', 'sharesTree', 'sharesTreeLoading']), - ...mapGetters(['user', 'configuration']), + ...mapGetters(['user', 'configuration', 'capabilities']), file() { return this.displayedItem.value @@ -347,7 +347,7 @@ export default defineComponent({ return upperFirst(displayDate) }, showTags() { - return this.file.tags?.length + return this.capabilities?.files.tags && this.file.tags?.length }, tagsLabel() { return this.$gettext('Tags') diff --git a/packages/web-app-files/src/fileSideBars.ts b/packages/web-app-files/src/fileSideBars.ts index 21d558cef96..de5d748bced 100644 --- a/packages/web-app-files/src/fileSideBars.ts +++ b/packages/web-app-files/src/fileSideBars.ts @@ -141,7 +141,7 @@ const panelGenerators: (({ return false } }), - ({ highlightedFile, router, multipleSelection, rootFolder }) => ({ + ({ capabilities, highlightedFile, router, multipleSelection, rootFolder }) => ({ app: 'tags-item', icon: 'price-tag-3', iconFillType: 'line', @@ -149,7 +149,7 @@ const panelGenerators: (({ component: TagsPanel, componentAttrs: {}, get enabled() { - if (multipleSelection || rootFolder) return false + if (!capabilities?.files?.tags || multipleSelection || rootFolder) return false if (typeof highlightedFile.canEditTags !== 'function' || !highlightedFile.canEditTags()) return false return !( diff --git a/packages/web-app-files/src/mixins/actions/showEditTags.js b/packages/web-app-files/src/mixins/actions/showEditTags.js index ebd02486615..8fefbb4baa9 100644 --- a/packages/web-app-files/src/mixins/actions/showEditTags.js +++ b/packages/web-app-files/src/mixins/actions/showEditTags.js @@ -1,10 +1,12 @@ -import { mapActions } from 'vuex' +import { mapActions, mapGetters } from 'vuex' import { isLocationTrashActive, isLocationPublicActive } from '../../router' import isFilesAppActive from './helpers/isFilesAppActive' export default { mixins: [isFilesAppActive], computed: { + ...mapGetters(['capabilities']), + $_showEditTags_items() { return [ { @@ -16,7 +18,7 @@ export default { // remove trashbin route rule once we have them. isEnabled: ({ resources }) => { // sidebar is currently only available inside files app - if (!this.$_isFilesAppActive) { + if (!this.$_isFilesAppActive || !this.capabilities?.files?.tags) { return false } From c7704246599a76f615198e9a810574f6209d55fb Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 15 Aug 2022 11:37:37 +0200 Subject: [PATCH 14/17] Bump OCIS_COMMITID --- .drone.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.drone.env b/.drone.env index c14c7a2691f..a3c4e868e2d 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The version of OCIS to use in pipelines that test against OCIS -OCIS_COMMITID=c2b27ef4c1cb48664dfbc6d75344ddea69345a0f +OCIS_COMMITID=f99a2072d33debc7fda43f9b27ba48c01014a83b OCIS_BRANCH=experimental From 64a5732af9a1ab91e0f158bae6c7d9f2b319ef46 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 15 Aug 2022 12:18:34 +0200 Subject: [PATCH 15/17] Fix acceptance tests --- .../fileFolderActionMenu.feature | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/acceptance/features/webUIFilesActionMenu/fileFolderActionMenu.feature b/tests/acceptance/features/webUIFilesActionMenu/fileFolderActionMenu.feature index a99efc04848..49eb0fbcaea 100644 --- a/tests/acceptance/features/webUIFilesActionMenu/fileFolderActionMenu.feature +++ b/tests/acceptance/features/webUIFilesActionMenu/fileFolderActionMenu.feature @@ -11,6 +11,7 @@ Feature: User can see the file or folder actions menu options And user "Alice" has logged in using the webUI And the user has browsed to the personal page + @skipOnOCIS Scenario: observe different actions menu options on selecting different file types Given user "Alice" has uploaded file with content "pdf file" to "lorem.pdf" in the server And the user has reloaded the current page of the webUI @@ -33,7 +34,7 @@ Feature: User can see the file or folder actions menu options | preview | | download | - + @skipOnOCIS Scenario: observe different actions menu options on selecting a folder When the user opens the actions sidebar panel of folder "simple-folder" on the webUI Then the app-sidebar for folder "simple-folder" should be visible on the webUI @@ -41,3 +42,40 @@ Feature: User can see the file or folder actions menu options | items | | open folder | | download | + + @skipOnOC10 + Scenario: observe different actions menu options on selecting different file types + Given user "Alice" has uploaded file with content "pdf file" to "lorem.pdf" in the server + And the user has reloaded the current page of the webUI + When the user opens the actions sidebar panel of file "lorem.txt" on the webUI + Then the app-sidebar for file "lorem.txt" should be visible on the webUI + And only the following items with default items should be visible in the actions menu on the webUI + | items | + | open in text editor | + | download | + | add or edit tags | + When the user opens the actions sidebar panel of file "lorem.pdf" on the webUI + Then the app-sidebar for file "lorem.pdf" should be visible on the webUI + And only the following items with default items should be visible in the actions menu on the webUI + | items | + | open in pdf viewer | + | download | + | add or edit tags | + When the user opens the actions sidebar panel of file "testavatar.png" on the webUI + Then the app-sidebar for file "testavatar.png" should be visible on the webUI + And only the following items with default items should be visible in the actions menu on the webUI + | items | + | preview | + | download | + | add or edit tags | + + @skipOnOC10 + Scenario: observe different actions menu options on selecting a folder + When the user opens the actions sidebar panel of folder "simple-folder" on the webUI + Then the app-sidebar for folder "simple-folder" should be visible on the webUI + And only the following items with default items should be visible in the actions menu on the webUI + | items | + | open folder | + | download | + | add or edit tags | + From ae4dbfeba2c8a229f5b9fbabad3c3116156a6194 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Mon, 15 Aug 2022 14:19:09 +0200 Subject: [PATCH 16/17] only show tags in table when capability is active --- .../src/components/FilesList/ResourceTable.vue | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/web-app-files/src/components/FilesList/ResourceTable.vue b/packages/web-app-files/src/components/FilesList/ResourceTable.vue index cdc7a69e5c2..3e8cb941b27 100644 --- a/packages/web-app-files/src/components/FilesList/ResourceTable.vue +++ b/packages/web-app-files/src/components/FilesList/ResourceTable.vue @@ -416,7 +416,7 @@ export default defineComponent({ } }, computed: { - ...mapGetters(['configuration']), + ...mapGetters(['configuration', 'capabilities']), ...mapState('Files', [ 'areFileExtensionsShown', 'latestSelectedId', @@ -488,13 +488,15 @@ export default defineComponent({ alignH: 'right', wrap: 'nowrap' }, - { - name: 'tags', - title: this.$gettext('Tags'), - type: 'slot', - alignH: 'right', - wrap: 'nowrap' - }, + this.capabilities.files.tags + ? { + name: 'tags', + title: this.$gettext('Tags'), + type: 'slot', + alignH: 'right', + wrap: 'nowrap' + } + : {}, { name: 'owner', title: this.$gettext('Share owner'), From ae854a373c1a37f91cf8608ae3218a09410ad347 Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Mon, 15 Aug 2022 15:00:18 +0200 Subject: [PATCH 17/17] fix unit tests --- .../web-app-files/src/components/FilesList/ResourceTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web-app-files/src/components/FilesList/ResourceTable.vue b/packages/web-app-files/src/components/FilesList/ResourceTable.vue index 3e8cb941b27..49b7bf80420 100644 --- a/packages/web-app-files/src/components/FilesList/ResourceTable.vue +++ b/packages/web-app-files/src/components/FilesList/ResourceTable.vue @@ -488,7 +488,7 @@ export default defineComponent({ alignH: 'right', wrap: 'nowrap' }, - this.capabilities.files.tags + this.capabilities?.files?.tags ? { name: 'tags', title: this.$gettext('Tags'),