Skip to content

Commit ba65fad

Browse files
committed
fix(content-sharing): Add shared link permission can edit option
1 parent a386199 commit ba65fad

File tree

6 files changed

+136
-22
lines changed

6 files changed

+136
-22
lines changed

src/elements/content-sharing/utils/__tests__/convertItemResponse.test.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import {
22
DEFAULT_ITEM_API_RESPONSE,
3-
MOCK_ITEM_API_RESPONSE_WITH_SHARED_LINK,
43
MOCK_ITEM_API_RESPONSE_WITH_CLASSIFICATION,
5-
mockOwnerId,
4+
MOCK_ITEM_API_RESPONSE_WITH_SHARED_LINK,
65
mockOwnerEmail,
6+
mockOwnerId,
77
mockOwnerName,
88
} from '../__mocks__/ContentSharingV2Mocks';
99
import { convertItemResponse } from '../convertItemResponse';
10+
import { getAllowedPermissionLevels } from '../getAllowedPermissionLevels';
1011

1112
jest.mock('../getAllowedAccessLevels', () => ({
1213
getAllowedAccessLevels: jest.fn().mockReturnValue(['open', 'company', 'collaborators']),
@@ -96,6 +97,22 @@ describe('convertItemResponse', () => {
9697
});
9798
});
9899

100+
test('should pass extension to getAllowedPermissionLevels', () => {
101+
const MOCK_ITEM_WITH_EXTENSION = {
102+
...MOCK_ITEM_API_RESPONSE_WITH_SHARED_LINK,
103+
extension: 'pdf',
104+
};
105+
convertItemResponse(MOCK_ITEM_WITH_EXTENSION);
106+
expect(getAllowedPermissionLevels).toHaveBeenCalledWith({
107+
access: 'open',
108+
canChangeAccessLevel: true,
109+
extension: 'pdf',
110+
isDownloadSettingAvailable: true,
111+
itemType: 'file',
112+
permission: 'can_download',
113+
});
114+
});
115+
99116
test('should convert shared link settings correctly if user cannot change access level', () => {
100117
const MOCK_ITEM_API_RESPONSE_WITH_SHARED_LINK_WITH_PERMISSIONS = {
101118
...MOCK_ITEM_API_RESPONSE_WITH_SHARED_LINK,

src/elements/content-sharing/utils/__tests__/convertSharingServiceData.test.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
ACCESS_COMPANY,
44
ACCESS_OPEN,
55
PERMISSION_CAN_DOWNLOAD,
6+
PERMISSION_CAN_EDIT,
67
PERMISSION_CAN_PREVIEW,
78
} from '../../../../constants';
89
import { convertISOStringToUTCDate } from '../../../../utils/datetime';
@@ -22,9 +23,19 @@ describe('elements/content-sharing/utils/convertSharingServiceData', () => {
2223

2324
describe('convertSharedLinkPermissions', () => {
2425
test.each([
25-
[PERMISSION_CAN_DOWNLOAD, { [PERMISSION_CAN_DOWNLOAD]: true, [PERMISSION_CAN_PREVIEW]: false }],
26-
[PERMISSION_CAN_PREVIEW, { [PERMISSION_CAN_DOWNLOAD]: false, [PERMISSION_CAN_PREVIEW]: true }],
27-
])('should return correct permissions for download permission level', (permissionLevel, expected) => {
26+
[
27+
PERMISSION_CAN_DOWNLOAD,
28+
{ [PERMISSION_CAN_DOWNLOAD]: true, [PERMISSION_CAN_EDIT]: false, [PERMISSION_CAN_PREVIEW]: false },
29+
],
30+
[
31+
PERMISSION_CAN_EDIT,
32+
{ [PERMISSION_CAN_DOWNLOAD]: true, [PERMISSION_CAN_EDIT]: true, [PERMISSION_CAN_PREVIEW]: false },
33+
],
34+
[
35+
PERMISSION_CAN_PREVIEW,
36+
{ [PERMISSION_CAN_DOWNLOAD]: false, [PERMISSION_CAN_EDIT]: false, [PERMISSION_CAN_PREVIEW]: true },
37+
],
38+
])('should return correct permissions for %s permission level', (permissionLevel, expected) => {
2839
const result = convertSharedLinkPermissions(permissionLevel);
2940
expect(result).toEqual(expected);
3041
});
Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,72 @@
1-
import { PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW } from '../../../../constants';
1+
import {
2+
ACCESS_OPEN,
3+
PERMISSION_CAN_DOWNLOAD,
4+
PERMISSION_CAN_EDIT,
5+
PERMISSION_CAN_PREVIEW,
6+
TYPE_FILE,
7+
} from '../../../../constants';
8+
29
import { getAllowedPermissionLevels } from '../getAllowedPermissionLevels';
310

411
describe('getAllowedPermissionLevels', () => {
5-
test('should return both permission levels when all conditions are met', () => {
6-
const result = getAllowedPermissionLevels(true, true, PERMISSION_CAN_DOWNLOAD);
7-
expect(result).toEqual([PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW]);
12+
const defaultParams = {
13+
access: ACCESS_OPEN,
14+
canChangeAccessLevel: true,
15+
extension: 'pdf',
16+
isDownloadSettingAvailable: true,
17+
itemType: TYPE_FILE,
18+
permission: PERMISSION_CAN_DOWNLOAD,
19+
};
20+
21+
test('should return all permission levels when all conditions are met', () => {
22+
const result = getAllowedPermissionLevels(defaultParams);
23+
expect(result).toEqual([PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW, PERMISSION_CAN_EDIT]);
824
});
925

10-
test.each([PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW])(
26+
test.each([PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW, PERMISSION_CAN_EDIT])(
1127
'should return only current permission when cannot change access level',
1228
permission => {
13-
const result = getAllowedPermissionLevels(false, true, permission);
29+
const result = getAllowedPermissionLevels({
30+
...defaultParams,
31+
canChangeAccessLevel: false,
32+
permission,
33+
});
1434
expect(result).toEqual([permission]);
1535
},
1636
);
1737

1838
test('should exclude download permission when download setting is not available', () => {
19-
const result = getAllowedPermissionLevels(true, false, PERMISSION_CAN_DOWNLOAD);
20-
expect(result).toEqual([PERMISSION_CAN_PREVIEW]);
39+
const result = getAllowedPermissionLevels({
40+
...defaultParams,
41+
isDownloadSettingAvailable: false,
42+
});
43+
expect(result).toEqual([PERMISSION_CAN_PREVIEW, PERMISSION_CAN_EDIT]);
2144
});
2245

2346
test('should return empty array for unknown permission values when cannot change access level', () => {
24-
const unknownPermission = 'unknown_permission';
25-
const result = getAllowedPermissionLevels(false, true, unknownPermission);
47+
const result = getAllowedPermissionLevels({
48+
...defaultParams,
49+
canChangeAccessLevel: false,
50+
permission: 'unknown_permission',
51+
});
2652
expect(result).toEqual([]);
2753
});
54+
55+
test.each([
56+
[true, true, PERMISSION_CAN_PREVIEW],
57+
[true, true, PERMISSION_CAN_DOWNLOAD],
58+
[false, true, PERMISSION_CAN_PREVIEW],
59+
])(
60+
'should exclude edit permission for webdocs when canChangeAccessLevel=%s, isDownloadSettingAvailable=%s, permission=%s',
61+
(canChangeAccessLevel, isDownloadSettingAvailable, permission) => {
62+
const result = getAllowedPermissionLevels({
63+
...defaultParams,
64+
canChangeAccessLevel,
65+
extension: 'webdoc',
66+
isDownloadSettingAvailable,
67+
permission,
68+
});
69+
expect(result).not.toContain(PERMISSION_CAN_EDIT);
70+
},
71+
);
2872
});

src/elements/content-sharing/utils/convertItemResponse.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const convertItemResponse = (itemApiData: ContentSharingItemAPIResponse):
1111
allowed_shared_link_access_levels,
1212
allowed_shared_link_access_levels_disabled_reasons,
1313
classification,
14+
extension,
1415
id,
1516
name,
1617
owned_by: ownedBy,
@@ -67,7 +68,14 @@ export const convertItemResponse = (itemApiData: ContentSharingItemAPIResponse):
6768
),
6869
expiresAt: expirationTimestamp ? new Date(expirationTimestamp).getTime() : undefined, // convert to milliseconds
6970
permission,
70-
permissionLevels: getAllowedPermissionLevels(canChangeAccessLevel, isDownloadSettingAvailable, permission),
71+
permissionLevels: getAllowedPermissionLevels({
72+
access,
73+
canChangeAccessLevel,
74+
extension,
75+
isDownloadSettingAvailable,
76+
itemType: type,
77+
permission,
78+
}),
7179
settings: {
7280
canChangeDownload,
7381
canChangeExpiration,

src/elements/content-sharing/utils/convertSharingServiceData.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { ACCESS_COLLAB, ACCESS_OPEN, PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW } from '../../../constants';
1+
import {
2+
ACCESS_COLLAB,
3+
ACCESS_OPEN,
4+
PERMISSION_CAN_DOWNLOAD,
5+
PERMISSION_CAN_EDIT,
6+
PERMISSION_CAN_PREVIEW,
7+
} from '../../../constants';
28
import { convertISOStringToUTCDate } from '../../../utils/datetime';
39

410
import type { SharedLinkSettings } from '../types';
@@ -18,8 +24,11 @@ export const convertSharedLinkPermissions = (permissionLevel: string) => {
1824
return {};
1925
}
2026

27+
const isEdit = permissionLevel === PERMISSION_CAN_EDIT;
28+
2129
return {
22-
[PERMISSION_CAN_DOWNLOAD]: permissionLevel === PERMISSION_CAN_DOWNLOAD,
30+
[PERMISSION_CAN_DOWNLOAD]: isEdit || permissionLevel === PERMISSION_CAN_DOWNLOAD,
31+
[PERMISSION_CAN_EDIT]: isEdit,
2332
[PERMISSION_CAN_PREVIEW]: permissionLevel === PERMISSION_CAN_PREVIEW,
2433
};
2534
};
Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,30 @@
1-
import { PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW } from '../../../constants';
1+
import {
2+
ACCESS_COMPANY,
3+
ACCESS_OPEN,
4+
PERMISSION_CAN_DOWNLOAD,
5+
PERMISSION_CAN_EDIT,
6+
PERMISSION_CAN_PREVIEW,
7+
TYPE_FOLDER,
8+
} from '../../../constants';
29

3-
export const getAllowedPermissionLevels = (
10+
type GetAllowedPermissionLevelsParams = {
11+
access: string;
12+
canChangeAccessLevel: boolean;
13+
extension: string;
14+
isDownloadSettingAvailable: boolean;
15+
itemType: string;
16+
permission: string;
17+
};
18+
19+
export const getAllowedPermissionLevels = ({
20+
access,
421
canChangeAccessLevel,
22+
extension,
523
isDownloadSettingAvailable,
24+
itemType,
625
permission,
7-
): Array<string> => {
8-
let allowedPermissionLevels = [PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW];
26+
}: GetAllowedPermissionLevelsParams): Array<string> => {
27+
let allowedPermissionLevels = [PERMISSION_CAN_DOWNLOAD, PERMISSION_CAN_PREVIEW, PERMISSION_CAN_EDIT];
928

1029
if (!canChangeAccessLevel) {
1130
// remove all but current level
@@ -17,5 +36,11 @@ export const getAllowedPermissionLevels = (
1736
allowedPermissionLevels = allowedPermissionLevels.filter(level => level !== PERMISSION_CAN_DOWNLOAD);
1837
}
1938

39+
// Can Edit requires ACCESS_OPEN or ACCESS_COMPANY, and must NOT be a folder
40+
const canEditAccessLevels = [ACCESS_OPEN, ACCESS_COMPANY];
41+
if (!canEditAccessLevels.includes(access) || itemType === TYPE_FOLDER || extension?.toLowerCase() === 'webdoc') {
42+
allowedPermissionLevels = allowedPermissionLevels.filter(level => level !== PERMISSION_CAN_EDIT);
43+
}
44+
2045
return allowedPermissionLevels;
2146
};

0 commit comments

Comments
 (0)