mirror of
https://github.com/Unleash/unleash.git
synced 2025-01-31 00:16:47 +01:00
bb026c0ba1
## About the changes Implements custom root roles, encompassing a lot of different areas of the project, and slightly refactoring the current roles logic. It includes quite a clean up. This feature itself is behind a flag: `customRootRoles` This feature covers root roles in: - Users; - Service Accounts; - Groups; Apologies in advance. I may have gotten a bit carried away 🙈 ### Roles We now have a new admin tab called "Roles" where we can see all root roles and manage custom ones. We are not allowed to edit or remove *predefined* roles. ![image](https://github.com/Unleash/unleash/assets/14320932/1ad8695c-8c3f-440d-ac32-39746720d588) This meant slightly pushing away the existing roles to `project-roles` instead. One idea we want to explore in the future is to unify both types of roles in the UI instead of having 2 separate tabs. This includes modernizing project roles to fit more into our current design and decisions. Hovering the permissions cell expands detailed information about the role: ![image](https://github.com/Unleash/unleash/assets/14320932/81c4aae7-8b4d-4cb4-92d1-8f1bc3ef1f2a) ### Create and edit role Here's how the role form looks like (create / edit): ![image](https://github.com/Unleash/unleash/assets/14320932/85baec29-bb10-48c5-a207-b3e9a8de838a) Here I categorized permissions so it's easier to visualize and manage from a UX perspective. I'm using the same endpoint as before. I tried to unify the logic and get rid of the `projectRole` specific hooks. What distinguishes custom root roles from custom project roles is the extra `root-custom` type we see on the payload. By default we assume `custom` (custom project role) instead, which should help in terms of backwards compatibility. ### Delete role When we delete a custom role we try to help the end user make an informed decision by listing all the entities which currently use this custom root role: ![image](https://github.com/Unleash/unleash/assets/14320932/352ed529-76be-47a8-88da-5e924fb191d4) ~~As mentioned in the screenshot, when deleting a custom role, we demote all entities associated with it to the predefined `Viewer` role.~~ **EDIT**: Apparently we currently block this from the API (access-service deleteRole) with a message: ![image](https://github.com/Unleash/unleash/assets/14320932/82a8e50f-8dc5-4c18-a2ba-54e2ae91b91c) What should the correct behavior be? ### Role selector I added a new easy-to-use role selector component that is present in: - Users ![image](https://github.com/Unleash/unleash/assets/14320932/76953139-7fb6-437e-b3fa-ace1d9187674) - Service Accounts ![image](https://github.com/Unleash/unleash/assets/14320932/2b80bd55-9abb-4883-b715-15650ae752ea) - Groups ![image](https://github.com/Unleash/unleash/assets/14320932/ab438f7c-2245-4779-b157-2da1689fe402) ### Role description I also added a new role description component that you can see below the dropdown in the selector component, but it's also used to better describe each role in the respective tables: ![image](https://github.com/Unleash/unleash/assets/14320932/a3eecac1-2a34-4500-a68c-e3f62ebfa782) I'm not listing all the permissions of predefined roles. Those simply show the description in the tooltip: ![image](https://github.com/Unleash/unleash/assets/14320932/7e5b2948-45f0-4472-8311-bf533409ba6c) ### Role badge Groups is a bit different, since it uses a list of cards, so I added yet another component - Role badge: ![image](https://github.com/Unleash/unleash/assets/14320932/1d62c3db-072a-4c97-b86f-1d8ebdd3523e) I'm using this same component on the profile tab: ![image](https://github.com/Unleash/unleash/assets/14320932/214272db-a828-444e-8846-4f39b9456bc6) ## Discussion points - Are we being defensive enough with the use of the flag? Should we cover more? - Are we breaking backwards compatibility in any way? - What should we do when removing a role? Block or demote? - Maybe some existing permission-related issues will surface with this change: Are we being specific enough with our permissions? A lot of places are simply checking for `ADMIN`; - We may want to get rid of the API roles coupling we have with the users and SAs and instead use the new hooks (e.g. `useRoles`) explicitly; - We should update the docs; - Maybe we could allow the user to add a custom role directly from the role selector component; --------- Co-authored-by: Gastón Fournier <gaston@getunleash.io>
72 lines
2.1 KiB
TypeScript
72 lines
2.1 KiB
TypeScript
import { styled, Tooltip, tooltipClasses, TooltipProps } from '@mui/material';
|
|
import { SpacingArgument } from '@mui/system/createTheme/createSpacing';
|
|
|
|
const StyledHtmlTooltipBody = styled('div')(({ theme }) => ({
|
|
overflow: 'auto',
|
|
padding: theme.spacing(1, 1.5),
|
|
}));
|
|
|
|
const StyledHtmlTooltip = styled(
|
|
({
|
|
className,
|
|
maxWidth,
|
|
maxHeight,
|
|
fontSize,
|
|
...props
|
|
}: IHtmlTooltipProps) => (
|
|
<Tooltip
|
|
{...props}
|
|
title={<StyledHtmlTooltipBody>{props.title}</StyledHtmlTooltipBody>}
|
|
classes={{ popper: className }}
|
|
/>
|
|
),
|
|
{
|
|
shouldForwardProp: prop =>
|
|
prop !== 'maxWidth' && prop !== 'maxHeight' && prop !== 'fontSize',
|
|
}
|
|
)<{
|
|
maxWidth?: SpacingArgument;
|
|
maxHeight?: SpacingArgument;
|
|
fontSize?: string;
|
|
}>(
|
|
({
|
|
theme,
|
|
maxWidth = theme.spacing(37.5),
|
|
maxHeight = theme.spacing(37.5),
|
|
fontSize = theme.fontSizes.smallerBody,
|
|
}) => ({
|
|
maxWidth,
|
|
[`& .${tooltipClasses.tooltip}`]: {
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
backgroundColor: theme.palette.background.paper,
|
|
padding: 0,
|
|
borderRadius: theme.shape.borderRadiusMedium,
|
|
boxShadow: theme.shadows[2],
|
|
color: theme.palette.text.primary,
|
|
fontWeight: theme.fontWeight.medium,
|
|
maxWidth: 'inherit',
|
|
border: `1px solid ${theme.palette.divider}`,
|
|
maxHeight,
|
|
fontSize,
|
|
},
|
|
[`& .${tooltipClasses.arrow}`]: {
|
|
'&:before': {
|
|
border: `1px solid ${theme.palette.divider}`,
|
|
},
|
|
color: theme.palette.background.paper,
|
|
},
|
|
})
|
|
);
|
|
|
|
export interface IHtmlTooltipProps extends TooltipProps {
|
|
maxWidth?: SpacingArgument;
|
|
maxHeight?: SpacingArgument;
|
|
fontSize?: string;
|
|
}
|
|
|
|
export const HtmlTooltip = (props: IHtmlTooltipProps) => {
|
|
if (!Boolean(props.title)) return props.children;
|
|
return <StyledHtmlTooltip {...props}>{props.children}</StyledHtmlTooltip>;
|
|
};
|