mirror of
https://github.com/Unleash/unleash.git
synced 2025-07-21 13:47:39 +02:00
chore: admin menu enterprise badge (#9656)
This commit is contained in:
parent
98a0fba1cb
commit
f7dbfe1162
@ -5,6 +5,7 @@ import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
|||||||
import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward';
|
import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward';
|
||||||
import { formatAssetPath } from 'utils/formatPath';
|
import { formatAssetPath } from 'utils/formatPath';
|
||||||
import easyToDeploy from 'assets/img/easyToDeploy.png';
|
import easyToDeploy from 'assets/img/easyToDeploy.png';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
const StyledContainer = styled(Grid)(({ theme }) => ({
|
const StyledContainer = styled(Grid)(({ theme }) => ({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
@ -169,6 +170,8 @@ const InstanceStatsWidget = ({
|
|||||||
projects,
|
projects,
|
||||||
environments,
|
environments,
|
||||||
}: IInstanceStatsWidgetProps) => {
|
}: IInstanceStatsWidgetProps) => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledWidget>
|
<StyledWidget>
|
||||||
<InstanceStatsHeader>Instance statistics</InstanceStatsHeader>
|
<InstanceStatsHeader>Instance statistics</InstanceStatsHeader>
|
||||||
@ -200,10 +203,11 @@ const InstanceStatsWidget = ({
|
|||||||
</StyledGridContainer>
|
</StyledGridContainer>
|
||||||
<StyledLinkContainer>
|
<StyledLinkContainer>
|
||||||
<Button
|
<Button
|
||||||
href='/admin/instance'
|
|
||||||
rel='noreferrer'
|
rel='noreferrer'
|
||||||
target='_blank'
|
|
||||||
endIcon={<ArrowOutwardIcon />}
|
endIcon={<ArrowOutwardIcon />}
|
||||||
|
onClick={() => {
|
||||||
|
navigate('/admin/instance');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
View all instance statistics
|
View all instance statistics
|
||||||
</Button>
|
</Button>
|
||||||
|
@ -64,6 +64,7 @@ const StyledAccordionSummary = styled(AccordionSummary)(({ theme }) => ({
|
|||||||
'&:hover': {
|
'&:hover': {
|
||||||
backgroundColor: theme.palette.action.hover,
|
backgroundColor: theme.palette.action.hover,
|
||||||
},
|
},
|
||||||
|
paddingRight: theme.spacing(1.5),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
interface IMenuGroupProps {
|
interface IMenuGroupProps {
|
||||||
|
@ -5,7 +5,7 @@ import EventNoteIcon from '@mui/icons-material/EventNote';
|
|||||||
import BillingIcon from '@mui/icons-material/CreditCardOutlined';
|
import BillingIcon from '@mui/icons-material/CreditCardOutlined';
|
||||||
import PeopleOutlineRoundedIcon from '@mui/icons-material/PeopleOutlineRounded';
|
import PeopleOutlineRoundedIcon from '@mui/icons-material/PeopleOutlineRounded';
|
||||||
import KeyRoundedIcon from '@mui/icons-material/KeyRounded';
|
import KeyRoundedIcon from '@mui/icons-material/KeyRounded';
|
||||||
import CloudIcon from '@mui/icons-material/Cloud';
|
import SingleSignOnIcon from '@mui/icons-material/AssignmentOutlined';
|
||||||
import HubOutlinedIcon from '@mui/icons-material/HubOutlined';
|
import HubOutlinedIcon from '@mui/icons-material/HubOutlined';
|
||||||
import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined';
|
import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined';
|
||||||
import EmptyIcon from '@mui/icons-material/CheckBoxOutlineBlankOutlined';
|
import EmptyIcon from '@mui/icons-material/CheckBoxOutlineBlankOutlined';
|
||||||
@ -16,7 +16,7 @@ const icons: Record<string, typeof SvgIcon> = {
|
|||||||
users: PeopleOutlineRoundedIcon,
|
users: PeopleOutlineRoundedIcon,
|
||||||
'/admin/service-accounts': LaptopIcon,
|
'/admin/service-accounts': LaptopIcon,
|
||||||
access: KeyRoundedIcon,
|
access: KeyRoundedIcon,
|
||||||
sso: CloudIcon,
|
sso: SingleSignOnIcon,
|
||||||
network: HubOutlinedIcon,
|
network: HubOutlinedIcon,
|
||||||
instance: BuildOutlinedIcon,
|
instance: BuildOutlinedIcon,
|
||||||
'/admin/billing': BillingIcon,
|
'/admin/billing': BillingIcon,
|
||||||
|
@ -11,17 +11,22 @@ import { filterByConfig } from 'component/common/util';
|
|||||||
import { filterAdminRoutes } from 'component/admin/filterAdminRoutes';
|
import { filterAdminRoutes } from 'component/admin/filterAdminRoutes';
|
||||||
import { adminGroups, adminRoutes } from 'component/admin/adminRoutes';
|
import { adminGroups, adminRoutes } from 'component/admin/adminRoutes';
|
||||||
import type { ReactNode } from 'react';
|
import type { ReactNode } from 'react';
|
||||||
|
import type { INavigationMenuItem } from 'interfaces/route';
|
||||||
|
import { useShowBadge } from 'component/layout/components/EnterprisePlanBadge/useShowBadge';
|
||||||
|
import { EnterprisePlanBadge } from 'component/layout/components/EnterprisePlanBadge/EnterprisePlanBadge';
|
||||||
|
|
||||||
interface IMenuLinkItem {
|
interface IMenuLinkItem {
|
||||||
href: string;
|
href: string;
|
||||||
text: string;
|
text: string;
|
||||||
icon: ReactNode;
|
icon: ReactNode;
|
||||||
|
menuMode?: INavigationMenuItem['menu']['mode'];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface IMenuItem {
|
interface IMenuItem {
|
||||||
href: string;
|
href: string;
|
||||||
text: string;
|
text: string;
|
||||||
items?: IMenuLinkItem[];
|
items?: IMenuLinkItem[];
|
||||||
|
menuMode?: INavigationMenuItem['menu']['mode'];
|
||||||
}
|
}
|
||||||
|
|
||||||
const SettingsHeader = styled(Typography)(({ theme }) => ({
|
const SettingsHeader = styled(Typography)(({ theme }) => ({
|
||||||
@ -98,6 +103,7 @@ export const AdminNavigationItems = ({
|
|||||||
const isActiveItem = (item?: string) =>
|
const isActiveItem = (item?: string) =>
|
||||||
item !== undefined && location.pathname === item;
|
item !== undefined && location.pathname === item;
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
const showBadge = useShowBadge();
|
||||||
|
|
||||||
const routes = adminRoutes
|
const routes = adminRoutes
|
||||||
.filter(filterByConfig(uiConfig))
|
.filter(filterByConfig(uiConfig))
|
||||||
@ -123,12 +129,14 @@ export const AdminNavigationItems = ({
|
|||||||
href: route.path,
|
href: route.path,
|
||||||
text: route.title,
|
text: route.title,
|
||||||
icon: <StopRoundedIcon />,
|
icon: <StopRoundedIcon />,
|
||||||
|
menuMode: route?.menu?.mode,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!route.group) {
|
if (!route.group) {
|
||||||
acc[route.path] = {
|
acc[route.path] = {
|
||||||
href: route.path,
|
href: route.path,
|
||||||
text: route.title,
|
text: route.title,
|
||||||
|
menuMode: route?.menu?.mode,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return acc;
|
return acc;
|
||||||
@ -164,6 +172,11 @@ export const AdminNavigationItems = ({
|
|||||||
selected={isActiveItem(subItem.href)}
|
selected={isActiveItem(subItem.href)}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
key={subItem.href}
|
key={subItem.href}
|
||||||
|
badge={
|
||||||
|
showBadge(subItem.menuMode) ? (
|
||||||
|
<EnterprisePlanBadge />
|
||||||
|
) : null
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<StyledStopRoundedIcon />
|
<StyledStopRoundedIcon />
|
||||||
</AdminSubListItem>
|
</AdminSubListItem>
|
||||||
@ -178,6 +191,11 @@ export const AdminNavigationItems = ({
|
|||||||
selected={isActiveItem(item.href)}
|
selected={isActiveItem(item.href)}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
key={item.href}
|
key={item.href}
|
||||||
|
badge={
|
||||||
|
showBadge(item.menuMode) ? (
|
||||||
|
<EnterprisePlanBadge />
|
||||||
|
) : null
|
||||||
|
}
|
||||||
>
|
>
|
||||||
<IconRenderer path={item.href} active={false} />
|
<IconRenderer path={item.href} active={false} />
|
||||||
</AdminListItem>
|
</AdminListItem>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type React from 'react';
|
import type React from 'react';
|
||||||
import { type FC, useCallback } from 'react';
|
import type { FC } from 'react';
|
||||||
import type { INavigationMenuItem } from 'interfaces/route';
|
import type { INavigationMenuItem } from 'interfaces/route';
|
||||||
import type { NavigationMode } from './NavigationMode';
|
import type { NavigationMode } from './NavigationMode';
|
||||||
import { ShowAdmin } from './ShowHide';
|
import { ShowAdmin } from './ShowHide';
|
||||||
@ -9,10 +9,9 @@ import {
|
|||||||
MiniListItem,
|
MiniListItem,
|
||||||
SignOutItem,
|
SignOutItem,
|
||||||
} from './ListItems';
|
} from './ListItems';
|
||||||
import { Box, List, styled, Tooltip, Typography } from '@mui/material';
|
import { Box, List, Typography } from '@mui/material';
|
||||||
import { useUiFlag } from 'hooks/useUiFlag';
|
import { useUiFlag } from 'hooks/useUiFlag';
|
||||||
import { IconRenderer } from './IconRenderer';
|
import { IconRenderer } from './IconRenderer';
|
||||||
import { EnterpriseBadge } from 'component/common/EnterpriseBadge/EnterpriseBadge';
|
|
||||||
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
||||||
import SearchIcon from '@mui/icons-material/Search';
|
import SearchIcon from '@mui/icons-material/Search';
|
||||||
import PlaygroundIcon from '@mui/icons-material/AutoFixNormal';
|
import PlaygroundIcon from '@mui/icons-material/AutoFixNormal';
|
||||||
@ -27,35 +26,8 @@ import { ConditionallyRender } from 'component/common/ConditionallyRender/Condit
|
|||||||
import { ProjectIcon } from 'component/common/ProjectIcon/ProjectIcon';
|
import { ProjectIcon } from 'component/common/ProjectIcon/ProjectIcon';
|
||||||
import SettingsIcon from '@mui/icons-material/Settings';
|
import SettingsIcon from '@mui/icons-material/Settings';
|
||||||
import useProjectOverview from 'hooks/api/getters/useProjectOverview/useProjectOverview';
|
import useProjectOverview from 'hooks/api/getters/useProjectOverview/useProjectOverview';
|
||||||
|
import { useShowBadge } from 'component/layout/components/EnterprisePlanBadge/useShowBadge';
|
||||||
const StyledBadgeContainer = styled('div')(({ theme }) => ({
|
import { EnterprisePlanBadge } from 'component/layout/components/EnterprisePlanBadge/EnterprisePlanBadge';
|
||||||
paddingLeft: theme.spacing(2),
|
|
||||||
display: 'flex',
|
|
||||||
}));
|
|
||||||
|
|
||||||
const EnterprisePlanBadge = () => (
|
|
||||||
<Tooltip title='This is an Enterprise feature'>
|
|
||||||
<StyledBadgeContainer>
|
|
||||||
<EnterpriseBadge />
|
|
||||||
</StyledBadgeContainer>
|
|
||||||
</Tooltip>
|
|
||||||
);
|
|
||||||
|
|
||||||
const useShowBadge = () => {
|
|
||||||
const { isPro } = useUiConfig();
|
|
||||||
|
|
||||||
const showBadge = useCallback(
|
|
||||||
(mode?: INavigationMenuItem['menu']['mode']) => {
|
|
||||||
return !!(
|
|
||||||
isPro() &&
|
|
||||||
!mode?.includes('pro') &&
|
|
||||||
mode?.includes('enterprise')
|
|
||||||
);
|
|
||||||
},
|
|
||||||
[isPro],
|
|
||||||
);
|
|
||||||
return showBadge;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const SecondaryNavigationList: FC<{
|
export const SecondaryNavigationList: FC<{
|
||||||
routes: INavigationMenuItem[];
|
routes: INavigationMenuItem[];
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
import { styled, Tooltip } from '@mui/material';
|
||||||
|
import { EnterpriseBadge } from 'component/common/EnterpriseBadge/EnterpriseBadge';
|
||||||
|
|
||||||
|
const StyledBadgeContainer = styled('div')(({ theme }) => ({
|
||||||
|
paddingLeft: theme.spacing(2),
|
||||||
|
display: 'flex',
|
||||||
|
}));
|
||||||
|
|
||||||
|
export const EnterprisePlanBadge = () => (
|
||||||
|
<Tooltip title='This is an Enterprise feature'>
|
||||||
|
<StyledBadgeContainer>
|
||||||
|
<EnterpriseBadge />
|
||||||
|
</StyledBadgeContainer>
|
||||||
|
</Tooltip>
|
||||||
|
);
|
@ -0,0 +1,19 @@
|
|||||||
|
import useUiConfig from 'hooks/api/getters/useUiConfig/useUiConfig';
|
||||||
|
import type { INavigationMenuItem } from 'interfaces/route';
|
||||||
|
import { useCallback } from 'react';
|
||||||
|
|
||||||
|
export const useShowBadge = () => {
|
||||||
|
const { isPro } = useUiConfig();
|
||||||
|
|
||||||
|
const showBadge = useCallback(
|
||||||
|
(mode?: INavigationMenuItem['menu']['mode']) => {
|
||||||
|
return !!(
|
||||||
|
isPro() &&
|
||||||
|
!mode?.includes('pro') &&
|
||||||
|
mode?.includes('enterprise')
|
||||||
|
);
|
||||||
|
},
|
||||||
|
[isPro],
|
||||||
|
);
|
||||||
|
return showBadge;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user