Skip to content

Commit 32bb788

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

2 files changed

Lines changed: 55 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: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
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 {
4+
defaultComponentMocks,
5+
defaultStubs,
6+
PartialComponentProps
7+
} from '@opencloud-eu/web-test-helpers'
48
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'
9+
import { GraphSharePermission, Resource, SpaceResource } from '@opencloud-eu/web-client'
10+
import { ProjectSpaceResource, ShareSpaceResource } from '@opencloud-eu/web-client'
811
import { defaultPlugins, mount, shallowMount } from '@opencloud-eu/web-test-helpers'
912
import { useDownloadFile, useResourcesStore } from '@opencloud-eu/web-pkg'
1013
import { computed } from 'vue'
@@ -76,17 +79,44 @@ describe('FileVersions', () => {
7679
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
7780
expect(revertVersionButton.length).toBe(defaultVersions.length)
7881
})
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 })
82+
it('should not be possible when isReadOnly prop is true', () => {
83+
const { wrapper } = getMountedWrapper({ props: { isReadOnly: true } })
84+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
85+
expect(revertVersionButton.length).toBe(0)
86+
})
87+
it('should be possible for a share space with updateVersions graph permission', () => {
88+
const space = mockDeep<ShareSpaceResource>({
89+
driveType: 'share',
90+
graphPermissions: [GraphSharePermission.updateVersions]
91+
})
92+
const { wrapper } = getMountedWrapper({ space })
93+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
94+
expect(revertVersionButton.length).toBe(defaultVersions.length)
95+
})
96+
it('should not be possible for a share space without updateVersions graph permission', () => {
97+
const space = mockDeep<ShareSpaceResource>({
98+
driveType: 'share',
99+
graphPermissions: []
100+
})
101+
const { wrapper } = getMountedWrapper({ space })
102+
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
103+
expect(revertVersionButton.length).toBe(0)
104+
})
105+
it('should be possible for a project space with updateVersions graph permission', () => {
106+
const space = mockDeep<ProjectSpaceResource>({
107+
driveType: 'project',
108+
graphPermissions: [GraphSharePermission.updateVersions]
109+
})
110+
const { wrapper } = getMountedWrapper({ space })
83111
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
84112
expect(revertVersionButton.length).toBe(defaultVersions.length)
85113
})
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 })
114+
it('should not be possible for a project space without updateVersions graph permission', () => {
115+
const space = mockDeep<ProjectSpaceResource>({
116+
driveType: 'project',
117+
graphPermissions: [GraphSharePermission.readVersions]
118+
})
119+
const { wrapper } = getMountedWrapper({ space })
90120
const revertVersionButton = wrapper.findAll(selectors.revertVersionButton)
91121
expect(revertVersionButton.length).toBe(0)
92122
})
@@ -125,12 +155,14 @@ function getMountedWrapper({
125155
mountType = mount,
126156
space = undefined,
127157
versions = defaultVersions,
128-
resource = mock<Resource>({ id: '1', size: 0, mdate: '' })
158+
resource = mock<Resource>({ id: '1', size: 0, mdate: '' }),
159+
props = {}
129160
}: {
130161
mountType?: typeof mount
131162
space?: SpaceResource
132163
versions?: Resource[]
133164
resource?: Resource
165+
props?: PartialComponentProps<typeof FileVersions>
134166
} = {}) {
135167
const downloadFile = vi.fn()
136168
vi.mocked(useDownloadFile).mockReturnValue({ downloadFile })
@@ -142,6 +174,7 @@ function getMountedWrapper({
142174

143175
return {
144176
wrapper: mountType(FileVersions, {
177+
props,
145178
global: {
146179
mocks,
147180
renderStubDefaultSlot: true,

0 commit comments

Comments
 (0)