🛂(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.
This commit is contained in:
committed by
Manuel Raynaud
parent
1292c33a58
commit
b069310bf0
@@ -160,6 +160,9 @@ test.describe('Document list members', () => {
|
|||||||
`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.`,
|
`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.`,
|
||||||
);
|
);
|
||||||
await expect(soloOwner).toBeVisible();
|
await expect(soloOwner).toBeVisible();
|
||||||
|
await expect(
|
||||||
|
page.getByRole('menuitem', { name: 'Administrator' }),
|
||||||
|
).toBeDisabled();
|
||||||
|
|
||||||
await list.click({
|
await list.click({
|
||||||
force: true, // Force click to close the dropdown
|
force: true, // Force click to close the dropdown
|
||||||
@@ -186,9 +189,17 @@ test.describe('Document list members', () => {
|
|||||||
await list.click();
|
await list.click();
|
||||||
await expect(currentUserRole).toBeVisible();
|
await expect(currentUserRole).toBeVisible();
|
||||||
|
|
||||||
|
await newUserRoles.click();
|
||||||
|
await expect(page.getByRole('menuitem', { name: 'Owner' })).toBeDisabled();
|
||||||
|
await list.click({
|
||||||
|
force: true, // Force click to close the dropdown
|
||||||
|
});
|
||||||
|
|
||||||
await currentUserRole.click();
|
await currentUserRole.click();
|
||||||
await page.getByRole('menuitem', { name: 'Reader' }).click();
|
await page.getByRole('menuitem', { name: 'Reader' }).click();
|
||||||
await list.click();
|
await list.click({
|
||||||
|
force: true, // Force click to close the dropdown
|
||||||
|
});
|
||||||
await expect(currentUserRole).toBeHidden();
|
await expect(currentUserRole).toBeHidden();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -7,14 +7,14 @@ import {
|
|||||||
verifyDocName,
|
verifyDocName,
|
||||||
} from './utils-common';
|
} from './utils-common';
|
||||||
|
|
||||||
export type Role = 'Administrator' | 'Owner' | 'Member' | 'Editor' | 'Reader';
|
export type Role = 'Administrator' | 'Owner' | 'Editor' | 'Reader';
|
||||||
export type LinkReach = 'Private' | 'Connected' | 'Public';
|
export type LinkReach = 'Private' | 'Connected' | 'Public';
|
||||||
export type LinkRole = 'Reading' | 'Editing';
|
export type LinkRole = 'Reading' | 'Editing';
|
||||||
|
|
||||||
export const addNewMember = async (
|
export const addNewMember = async (
|
||||||
page: Page,
|
page: Page,
|
||||||
index: number,
|
index: number,
|
||||||
role: 'Administrator' | 'Owner' | 'Editor' | 'Reader',
|
role: Role,
|
||||||
fillText = 'user.test',
|
fillText = 'user.test',
|
||||||
) => {
|
) => {
|
||||||
const responsePromiseSearchUser = page.waitForResponse(
|
const responsePromiseSearchUser = page.waitForResponse(
|
||||||
|
|||||||
@@ -132,5 +132,6 @@ export interface AccessRequest {
|
|||||||
partial_update: boolean;
|
partial_update: boolean;
|
||||||
retrieve: boolean;
|
retrieve: boolean;
|
||||||
accept: boolean;
|
accept: boolean;
|
||||||
|
set_role_to: Role[];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,12 +90,14 @@ export const DocRoleDropdown = ({
|
|||||||
const roles: DropdownMenuOption[] = Object.keys(translatedRoles).map(
|
const roles: DropdownMenuOption[] = Object.keys(translatedRoles).map(
|
||||||
(key, index) => {
|
(key, index) => {
|
||||||
const isLast = index === Object.keys(translatedRoles).length - 1;
|
const isLast = index === Object.keys(translatedRoles).length - 1;
|
||||||
|
const isRoleAllowed = rolesAllowed?.includes(key as Role) ?? true;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: transRole(key as Role),
|
label: transRole(key as Role),
|
||||||
callback: () => onSelectRole?.(key as Role),
|
callback: () => onSelectRole?.(key as Role),
|
||||||
isSelected: currentRole === (key as Role),
|
isSelected: currentRole === (key as Role),
|
||||||
showSeparator: isLast,
|
showSeparator: isLast,
|
||||||
disabled: isLastOwner && key !== 'owner',
|
disabled: (isLastOwner && key !== 'owner') || !isRoleAllowed,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ const DocShareAccessRequestItem = ({ doc, accessRequest }: Props) => {
|
|||||||
currentRole={role}
|
currentRole={role}
|
||||||
onSelectRole={setRole}
|
onSelectRole={setRole}
|
||||||
canUpdate={doc.abilities.accesses_manage}
|
canUpdate={doc.abilities.accesses_manage}
|
||||||
|
rolesAllowed={accessRequest.abilities.set_role_to}
|
||||||
/>
|
/>
|
||||||
<Button
|
<Button
|
||||||
color="tertiary"
|
color="tertiary"
|
||||||
|
|||||||
Reference in New Issue
Block a user