chore: update settings sidebar links ui

This commit is contained in:
mazzucchelli 2025-06-03 19:22:30 +02:00
parent bd4b5e5f7c
commit ef8b017af0
6 changed files with 45 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import { useIntl } from 'react-intl';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { styled } from 'styled-components'; import { styled } from 'styled-components';
import { useLicenseLimits } from '../../../../../ee/admin/src/hooks/useLicenseLimits';
import { SubNav } from '../../../components/SubNav'; import { SubNav } from '../../../components/SubNav';
import { useTracking } from '../../../features/Tracking'; import { useTracking } from '../../../features/Tracking';
import { SettingsMenu } from '../../../hooks/useSettingsMenu'; import { SettingsMenu } from '../../../hooks/useSettingsMenu';
@ -22,6 +23,17 @@ const SettingsNav = ({ menu }: SettingsNavProps) => {
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();
const { pathname } = useLocation(); const { pathname } = useLocation();
const { license } = useLicenseLimits();
const availableFeatureNames = license?.features.map((feature) => feature.name);
const linksIdsToLicenseFeaturesNames = {
'content-releases': 'cms-content-releases',
'review-workflows': 'review-workflows',
sso: 'sso',
auditLogs: 'audit-logs',
'auditLogs-purchase-page': 'audit-logs',
};
const filteredMenu = menu.filter( const filteredMenu = menu.filter(
(section) => !section.links.every((link) => link.isDisplayed === false) (section) => !section.links.every((link) => link.isDisplayed === false)
@ -67,7 +79,19 @@ const SettingsNav = ({ menu }: SettingsNavProps) => {
endAction={ endAction={
<> <>
{link?.licenseOnly && ( {link?.licenseOnly && (
<Lightning fill="primary600" width="1.5rem" height="1.5rem" /> <Lightning
fill={
(availableFeatureNames || []).includes(
linksIdsToLicenseFeaturesNames[
link.id as keyof typeof linksIdsToLicenseFeaturesNames
] as keyof typeof availableFeatureNames
)
? 'primary600'
: 'neutral300'
}
width="1.5rem"
height="1.5rem"
/>
)} )}
{link?.hasNotification && ( {link?.hasNotification && (
<StyledBadge <StyledBadge

View File

@ -2,6 +2,14 @@ import { render } from '@tests/utils';
import { SettingsNav, SettingsNavProps } from '../SettingsNav'; import { SettingsNav, SettingsNavProps } from '../SettingsNav';
jest.mock('../../../../../../ee/admin/src/hooks/useLicenseLimits', () => ({
useLicenseLimits: jest.fn(() => ({
license: {
features: [],
},
})),
}));
const menu = [ const menu = [
{ {
id: 'global', id: 'global',

View File

@ -8,6 +8,14 @@ import { Layout } from '../Layout';
jest.mock('../../../hooks/useSettingsMenu'); jest.mock('../../../hooks/useSettingsMenu');
jest.mock('../../../../../ee/admin/src/hooks/useLicenseLimits', () => ({
useLicenseLimits: jest.fn(() => ({
license: {
features: [],
},
})),
}));
const LocationDisplay = () => { const LocationDisplay = () => {
const location = useLocation(); const location = useLocation();

View File

@ -72,6 +72,7 @@ export const SETTINGS_LINKS_EE = (): SettingsMenu => ({
intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' }, intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },
to: '/settings/single-sign-on', to: '/settings/single-sign-on',
id: 'sso', id: 'sso',
licenseOnly: true,
}, },
] ]
: []), : []),
@ -84,6 +85,7 @@ export const SETTINGS_LINKS_EE = (): SettingsMenu => ({
intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' }, intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },
to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC', to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC',
id: 'auditLogs', id: 'auditLogs',
licenseOnly: true,
}, },
] ]
: []), : []),

View File

@ -67,6 +67,7 @@ const admin: Plugin.Config.AdminInput = {
id: `${pluginId}.plugin.name`, id: `${pluginId}.plugin.name`,
defaultMessage: 'Releases', defaultMessage: 'Releases',
}, },
licenseOnly: true,
permissions: [], permissions: [],
async Component() { async Component() {
const { ProtectedReleasesSettingsPage } = await import('./pages/ReleasesSettingsPage'); const { ProtectedReleasesSettingsPage } = await import('./pages/ReleasesSettingsPage');

View File

@ -30,6 +30,7 @@ const admin: Plugin.Config.AdminInput = {
id: `${PLUGIN_ID}.plugin.name`, id: `${PLUGIN_ID}.plugin.name`,
defaultMessage: 'Review Workflows', defaultMessage: 'Review Workflows',
}, },
licenseOnly: true,
permissions: [], permissions: [],
async Component() { async Component() {
const { Router } = await import('./router'); const { Router } = await import('./router');