Skip to content

Commit 3ce8864

Browse files
AntoLClunika
authored andcommitted
🛂(frontend) disabled role not allowed to be assigned
We disable roles that the current user is not allowed to assign when sharing a document. This prevents users from selecting roles they cannot actually assign, improving the user experience and reducing confusion.
1 parent 2be4e3a commit 3ce8864

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

src/frontend/apps/e2e/__tests__/app-impress/doc-member-list.spec.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ test.describe('Document list members', () => {
160160
`You are the sole owner of this group, make another member the group owner before you can change your own role or be removed from your document.`,
161161
);
162162
await expect(soloOwner).toBeVisible();
163+
await expect(
164+
page.getByRole('menuitem', { name: 'Administrator' }),
165+
).toBeDisabled();
163166

164167
await list.click({
165168
force: true, // Force click to close the dropdown
@@ -186,9 +189,17 @@ test.describe('Document list members', () => {
186189
await list.click();
187190
await expect(currentUserRole).toBeVisible();
188191

192+
await newUserRoles.click();
193+
await expect(page.getByRole('menuitem', { name: 'Owner' })).toBeDisabled();
194+
await list.click({
195+
force: true, // Force click to close the dropdown
196+
});
197+
189198
await currentUserRole.click();
190199
await page.getByRole('menuitem', { name: 'Reader' }).click();
191-
await list.click();
200+
await list.click({
201+
force: true, // Force click to close the dropdown
202+
});
192203
await expect(currentUserRole).toBeHidden();
193204
});
194205

src/frontend/apps/e2e/__tests__/app-impress/utils-share.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import {
77
verifyDocName,
88
} from './utils-common';
99

10-
export type Role = 'Administrator' | 'Owner' | 'Member' | 'Editor' | 'Reader';
10+
export type Role = 'Administrator' | 'Owner' | 'Editor' | 'Reader';
1111
export type LinkReach = 'Private' | 'Connected' | 'Public';
1212
export type LinkRole = 'Reading' | 'Editing';
1313

1414
export const addNewMember = async (
1515
page: Page,
1616
index: number,
17-
role: 'Administrator' | 'Owner' | 'Editor' | 'Reader',
17+
role: Role,
1818
fillText = 'user.test',
1919
) => {
2020
const responsePromiseSearchUser = page.waitForResponse(

src/frontend/apps/impress/src/features/docs/doc-management/types.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,5 +132,6 @@ export interface AccessRequest {
132132
partial_update: boolean;
133133
retrieve: boolean;
134134
accept: boolean;
135+
set_role_to: Role[];
135136
};
136137
}

src/frontend/apps/impress/src/features/docs/doc-share/components/DocRoleDropdown.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,14 @@ export const DocRoleDropdown = ({
9090
const roles: DropdownMenuOption[] = Object.keys(translatedRoles).map(
9191
(key, index) => {
9292
const isLast = index === Object.keys(translatedRoles).length - 1;
93+
const isRoleAllowed = rolesAllowed?.includes(key as Role) ?? true;
94+
9395
return {
9496
label: transRole(key as Role),
9597
callback: () => onSelectRole?.(key as Role),
9698
isSelected: currentRole === (key as Role),
9799
showSeparator: isLast,
98-
disabled: isLastOwner && key !== 'owner',
100+
disabled: (isLastOwner && key !== 'owner') || !isRoleAllowed,
99101
};
100102
},
101103
);

src/frontend/apps/impress/src/features/docs/doc-share/components/DocShareAccessRequest.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ const DocShareAccessRequestItem = ({ doc, accessRequest }: Props) => {
7777
currentRole={role}
7878
onSelectRole={setRole}
7979
canUpdate={doc.abilities.accesses_manage}
80+
rolesAllowed={accessRequest.abilities.set_role_to}
8081
/>
8182
<Button
8283
color="tertiary"

0 commit comments

Comments
 (0)