diff --git a/changelog/unreleased/bugfix-spaces-on-share-via-link-page b/changelog/unreleased/bugfix-spaces-on-share-via-link-page new file mode 100644 index 00000000000..1c87f37c3db --- /dev/null +++ b/changelog/unreleased/bugfix-spaces-on-share-via-link-page @@ -0,0 +1,6 @@ +Bugfix: Spaces on "Shared via link"-page + +Spaces on the "Shared via link"-page are now being displayed correctly. Also, the sidebar for those has been fixed. + +https://github.com/owncloud/web/pull/7651 +https://github.com/owncloud/web/issues/7103 diff --git a/packages/web-app-files/src/components/FilesList/ResourceTable.vue b/packages/web-app-files/src/components/FilesList/ResourceTable.vue index 1ad63d1553b..53f7068035c 100644 --- a/packages/web-app-files/src/components/FilesList/ResourceTable.vue +++ b/packages/web-app-files/src/components/FilesList/ResourceTable.vue @@ -54,7 +54,7 @@ ({ + ({ highlightedFile }) => ({ app: 'details-space-item', icon: 'questionnaire-line', title: $gettext('Details'), component: SpaceDetails, - default: isLocationSpacesActive(router, 'files-spaces-projects'), + default: highlightedFile?.type === 'space', get enabled() { return highlightedFile?.type === 'space' } diff --git a/packages/web-app-files/src/helpers/resources.ts b/packages/web-app-files/src/helpers/resources.ts index b8329d13698..1e42dec7a42 100644 --- a/packages/web-app-files/src/helpers/resources.ts +++ b/packages/web-app-files/src/helpers/resources.ts @@ -136,14 +136,19 @@ export function attachIndicators(resource, sharesTree) { * @param {Boolean} incomingShares Asserts whether the shares are incoming * @param {Boolean} allowSharePermission Asserts whether the reshare permission is available * @param {Boolean} hasShareJail Asserts whether the share jail is available backend side + * @param {Array} spaces A list of spaces the current user has access to */ export function aggregateResourceShares( shares, incomingShares = false, allowSharePermission, - hasShareJail + hasShareJail, + spaces = [] ): Resource[] { shares.sort((a, b) => a.path.localeCompare(b.path)) + if (spaces.length) { + shares = addMatchingSpaceToShares(shares, spaces) + } if (incomingShares) { shares = addSharedWithToShares(shares) return orderBy(shares, ['file_target', 'permissions'], ['asc', 'desc']).map((share) => @@ -210,6 +215,19 @@ function addSharedWithToShares(shares) { return resources } +function addMatchingSpaceToShares(shares, spaces) { + const resources = [] + for (const share of shares) { + let matchingSpace + if (share.path === '/') { + const storageId = extractStorageId(share.item_source) + matchingSpace = spaces.find((s) => s.id === storageId && s.driveType === 'project') + } + resources.push({ ...share, matchingSpace }) + } + return resources +} + export function buildSharedResource( share, incomingShares = false, @@ -217,7 +235,7 @@ export function buildSharedResource( hasShareJail = false ): Resource { const isFolder = share.item_type === 'folder' - const resource: Resource = { + let resource: Resource = { id: share.id, fileId: share.item_source, storageId: extractStorageId(share.item_source), @@ -282,6 +300,10 @@ export function buildSharedResource( resource.canDeny = () => SharePermissions.denied.enabled(share.permissions) resource.getDomSelector = () => extractDomSelector(share.id) + if (share.matchingSpace) { + resource = { ...resource, ...share.matchingSpace } + } + return resource } diff --git a/packages/web-app-files/src/mixins/actions/navigate.ts b/packages/web-app-files/src/mixins/actions/navigate.ts index 42e6f558945..4c31ef70c43 100644 --- a/packages/web-app-files/src/mixins/actions/navigate.ts +++ b/packages/web-app-files/src/mixins/actions/navigate.ts @@ -37,7 +37,7 @@ export default { return false } - if (!resources[0].isFolder) { + if (!resources[0].isFolder || resources[0].type === 'space') { return false } diff --git a/packages/web-app-files/src/services/folder/loaderSharedViaLink.ts b/packages/web-app-files/src/services/folder/loaderSharedViaLink.ts index 747f34b43af..6c72d348cb1 100644 --- a/packages/web-app-files/src/services/folder/loaderSharedViaLink.ts +++ b/packages/web-app-files/src/services/folder/loaderSharedViaLink.ts @@ -10,6 +10,8 @@ import { useCapabilityShareJailEnabled } from 'web-pkg/src/composables' import { unref } from '@vue/composition-api' +import { clientService } from 'web-pkg/src/services' +import { configurationManager } from 'web-pkg/src/configuration' export class FolderLoaderSharedViaLink implements FolderLoader { // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -40,13 +42,23 @@ export class FolderLoaderSharedViaLink implements FolderLoader { }) resources = resources.map((r) => r.shareInfo) + let spaces = [] + if (store.getters.capabilities?.spaces?.enabled) { + const accessToken = store.getters['runtime/auth/accessToken'] + const serverUrl = configurationManager.serverUrl + const graphClient = clientService.graphAuthenticated(serverUrl, accessToken) + // FIXME: Wait until spaces are loaded? We already load them in the runtime + yield store.dispatch('runtime/spaces/loadSpaces', { graphClient }) + spaces = store.getters['runtime/spaces/spaces'] + } if (resources.length) { resources = aggregateResourceShares( resources, false, unref(hasResharing), - unref(hasShareJail) + unref(hasShareJail), + spaces ) } diff --git a/packages/web-client/src/helpers/resource/types.ts b/packages/web-client/src/helpers/resource/types.ts index 8717024786b..83967f877fa 100644 --- a/packages/web-client/src/helpers/resource/types.ts +++ b/packages/web-client/src/helpers/resource/types.ts @@ -12,6 +12,10 @@ export interface Resource { type?: string status?: number spaceRoles?: any[] + spaceQuota?: any[] + spaceMemberIds?: any[] + spaceImageData?: any[] + spaceReadmeData?: any[] mimeType?: string isFolder?: boolean sdate?: string @@ -35,12 +39,19 @@ export interface Resource { canBeDeleted?(): boolean canBeRestored?(): boolean canDeny?(): boolean + canEditDescription?(): boolean + canRestore?(): boolean + canDisable?(): boolean + canEditImage?(): boolean + canEditReadme?(): boolean isReceivedShare?(): boolean isMounted?(): boolean getDomSelector?(): string + matchingSpace?: any + resourceOwner?: User owner?: User[] ownerDisplayName?: string