1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-05 17:53:12 +02:00

feat: group permissions on frontend

This commit is contained in:
Tymoteusz Czech 2022-11-18 13:43:02 +01:00
parent 8d2d6afde0
commit 2faeb3bd42
No known key found for this signature in database
GPG Key ID: 133555230D88D75F

View File

@ -43,6 +43,30 @@ const StyledTitle = styled(StringTruncator)(({ theme }) => ({
marginRight: theme.spacing(1), marginRight: theme.spacing(1),
})); }));
const getPermissionGroupName = (
permission: IPermission
): [groupName: string, order: number] => {
const { name } = permission;
if (name.endsWith('_PROJECT') || name === 'MOVE_FEATURE_TOGGLE') {
return ['Project', 0];
}
if (name.endsWith('_FEATURE') || name === 'UPDATE_FEATURE_ENVIRONMENT') {
return ['Feature toggles', 1];
}
if (name.endsWith('_VARIANTS')) {
return ['Variants', 2];
}
if (name.endsWith('_STRATEGY')) {
return ['Strategies', 3];
}
if (name.endsWith('_CHANGE_REQUEST')) {
return ['Change requests', 4];
}
return ['Other', 5];
};
export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({ export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({
title, title,
permissions, permissions,
@ -78,6 +102,27 @@ export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({
[permissionCount, permissions] [permissionCount, permissions]
); );
const permissionGroups = useMemo(
() =>
permissions
?.reduce((prev, next) => {
const [groupName, order] = getPermissionGroupName(next);
const id = prev.findIndex(el => el.groupName === groupName);
if (id === -1) {
prev.push({
groupName,
order,
groupPermissions: [next],
});
} else {
prev[id].groupPermissions.push(next);
}
return prev;
}, [] as Array<{ groupName: string; order: number; groupPermissions: IPermission[] }>)
.sort((a, b) => a.order - b.order),
[permissions]
);
return ( return (
<Box <Box
sx={{ sx={{
@ -141,8 +186,17 @@ export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({
all {context} permissions all {context} permissions
</Button> </Button>
<Box> <Box>
{permissions?.map((permission: IPermission) => { {permissionGroups.map(
return ( ({ groupName, groupPermissions }) => (
<Box key={groupName} sx={{ mt: 1 }}>
<Typography
variant="body2"
color="text.secondary"
sx={{ mb: 0.5 }}
>
{groupName}
</Typography>
{groupPermissions.map(permission => (
<FormControlLabel <FormControlLabel
sx={{ sx={{
minWidth: { minWidth: {
@ -155,21 +209,27 @@ export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({
<Checkbox <Checkbox
checked={ checked={
checkedPermissions[ checkedPermissions[
getRoleKey(permission) getRoleKey(
permission
)
] ]
? true ? true
: false : false
} }
onChange={() => onChange={() =>
onPermissionChange(permission) onPermissionChange(
permission
)
} }
color="primary" color="primary"
/> />
} }
label={permission.displayName} label={permission.displayName}
/> />
); ))}
})} </Box>
)
)}
</Box> </Box>
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>