Skip to content

Commit 38e57e6

Browse files
committed
feat: hide restore action in the version sidebar panel if the resource permission is missing
1 parent aa5c5e0 commit 38e57e6

2 files changed

Lines changed: 51 additions & 19 deletions

File tree

packages/web-app-files/src/components/SideBar/Versions/FileVersions.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
</div>
4949
</template>
5050
<script lang="ts">
51-
import { DavPermission } from '@opencloud-eu/web-client/webdav'
5251
import {
5352
formatRelativeDateFromHTTP,
5453
formatDateFromJSDate,
@@ -58,7 +57,13 @@ import {
5857
useResourcesStore
5958
} from '@opencloud-eu/web-pkg'
6059
import { computed, defineComponent, inject, Ref, unref } from 'vue'
61-
import { isShareSpaceResource, Resource, SpaceResource } from '@opencloud-eu/web-client'
60+
import {
61+
GraphSharePermission,
62+
isProjectSpaceResource,
63+
isShareSpaceResource,
64+
Resource,
65+
SpaceResource
66+
} from '@opencloud-eu/web-client'
6267
import { useGettext } from 'vue3-gettext'
6368
6469
export default defineComponent({
@@ -85,10 +90,8 @@ export default defineComponent({
8590
return false
8691
}
8792
88-
if (isShareSpaceResource(unref(space)) || unref(resource).isReceivedShare()) {
89-
if (unref(resource).permissions !== undefined) {
90-
return unref(resource).permissions.includes(DavPermission.Updateable)
91-
}
93+
if (isShareSpaceResource(unref(space)) || isProjectSpaceResource(unref(space))) {
94+
return unref(space).graphPermissions.includes(GraphSharePermission.updateVersions)
9295
}
9396
9497
return true

packages/web-app-files/tests/unit/components/SideBar/Versions/FileVersions.spec.ts

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { DateTime } from 'luxon'
22
import FileVersions from '../../../../../src/components/SideBar/Versions/FileVersions.vue'
3-
import { defaultComponentMocks, defaultStubs } from '@opencloud-eu/web-test-helpers'
3+
import {defaultComponentMocks, defaultStubs, PartialComponentProps} from '@opencloud-eu/web-test-helpers'
44
import { mock, mockDeep } from 'vitest-mock-extended'
5-
import { Resource, SpaceResource } from '@opencloud-eu/web-client'
6-
import { ShareResource, ShareSpaceResource } from '@opencloud-eu/web-client'
7-
import { DavPermission } from '@opencloud-eu/web-client/webdav'
5+
import { GraphSharePermission, Resource, SpaceResource } from '@opencloud-eu/web-client'
6+
import { ProjectSpaceResource, ShareSpaceResource } from '@opencloud-eu/web-client'
87
import { defaultPlugins, mount, shallowMount } from '@opencloud-eu/web-test-helpers'
98
import { useDownloadFile, useResourcesStore } from '@opencloud-eu/web-pkg'
109
import { computed } from 'vue'
@@ -76,17 +75,44 @@ describe('FileVersions', () => {
7675
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
7776
expect(revertVersionButton.length).toBe(defaultVersions.length)
7877
})
79-
it('should be possible for a share with write permissions', () => {
80-
const resource = mockDeep<ShareResource>({ permissions: DavPermission.Updateable })
81-
const space = mockDeep<ShareSpaceResource>({ driveType: 'share' })
82-
const { wrapper } = getMountedWrapper({ resource, space })
78+
it('should not be possible when isReadOnly prop is true', () => {
79+
const { wrapper } = getMountedWrapper({ props: { isReadOnly: true } })
80+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
81+
expect(revertVersionButton.length).toBe(0)
82+
})
83+
it('should be possible for a share space with updateVersions graph permission', () => {
84+
const space = mockDeep<ShareSpaceResource>({
85+
driveType: 'share',
86+
graphPermissions: [GraphSharePermission.updateVersions]
87+
})
88+
const { wrapper } = getMountedWrapper({ space })
89+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
90+
expect(revertVersionButton.length).toBe(defaultVersions.length)
91+
})
92+
it('should not be possible for a share space without updateVersions graph permission', () => {
93+
const space = mockDeep<ShareSpaceResource>({
94+
driveType: 'share',
95+
graphPermissions: []
96+
})
97+
const { wrapper } = getMountedWrapper({ space })
98+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
99+
expect(revertVersionButton.length).toBe(0)
100+
})
101+
it('should be possible for a project space with updateVersions graph permission', () => {
102+
const space = mockDeep<ProjectSpaceResource>({
103+
driveType: 'project',
104+
graphPermissions: [GraphSharePermission.updateVersions]
105+
})
106+
const { wrapper } = getMountedWrapper({ space })
83107
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
84108
expect(revertVersionButton.length).toBe(defaultVersions.length)
85109
})
86-
it('should not be possible for a share with read-only permissions', () => {
87-
const resource = mockDeep<ShareResource>({ permissions: '' })
88-
const space = mockDeep<ShareSpaceResource>({ driveType: 'share' })
89-
const { wrapper } = getMountedWrapper({ resource, space })
110+
it('should not be possible for a project space without updateVersions graph permission', () => {
111+
const space = mockDeep<ProjectSpaceResource>({
112+
driveType: 'project',
113+
graphPermissions: [GraphSharePermission.readVersions]
114+
})
115+
const { wrapper } = getMountedWrapper({ space })
90116
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
91117
expect(revertVersionButton.length).toBe(0)
92118
})
@@ -125,12 +151,14 @@ function getMountedWrapper({
125151
mountType = mount,
126152
space = undefined,
127153
versions = defaultVersions,
128-
resource = mock<Resource>({ id: '1', size: 0, mdate: '' })
154+
resource = mock<Resource>({ id: '1', size: 0, mdate: '' }),
155+
props = {}
129156
}: {
130157
mountType?: typeof mount
131158
space?: SpaceResource
132159
versions?: Resource[]
133160
resource?: Resource
161+
props?: PartialComponentProps<typeof FileVersions>
134162
} = {}) {
135163
const downloadFile = vi.fn()
136164
vi.mocked(useDownloadFile).mockReturnValue({ downloadFile })
@@ -142,6 +170,7 @@ function getMountedWrapper({
142170

143171
return {
144172
wrapper: mountType(FileVersions, {
173+
props,
145174
global: {
146175
mocks,
147176
renderStubDefaultSlot: true,

0 commit comments

Comments
 (0)