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,35 +186,50 @@ export const PermissionAccordion: VFC<IEnvironmentPermissionAccordionProps> = ({
all {context} permissions all {context} permissions
</Button> </Button>
<Box> <Box>
{permissions?.map((permission: IPermission) => { {permissionGroups.map(
return ( ({ groupName, groupPermissions }) => (
<FormControlLabel <Box key={groupName} sx={{ mt: 1 }}>
sx={{ <Typography
minWidth: { variant="body2"
sm: '300px', color="text.secondary"
xs: 'auto', sx={{ mb: 0.5 }}
}, >
}} {groupName}
key={getRoleKey(permission)} </Typography>
control={ {groupPermissions.map(permission => (
<Checkbox <FormControlLabel
checked={ sx={{
checkedPermissions[ minWidth: {
getRoleKey(permission) sm: '300px',
] xs: 'auto',
? true },
: false }}
key={getRoleKey(permission)}
control={
<Checkbox
checked={
checkedPermissions[
getRoleKey(
permission
)
]
? true
: false
}
onChange={() =>
onPermissionChange(
permission
)
}
color="primary"
/>
} }
onChange={() => label={permission.displayName}
onPermissionChange(permission)
}
color="primary"
/> />
} ))}
label={permission.displayName} </Box>
/> )
); )}
})}
</Box> </Box>
</AccordionDetails> </AccordionDetails>
</Accordion> </Accordion>