diff --git a/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/side_navigation.ts b/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/side_navigation.ts index 9e08345dac8f1..7ae283b863efe 100644 --- a/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/side_navigation.ts +++ b/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/side_navigation.ts @@ -37,6 +37,7 @@ export const initSideNavigation = async (services: Services) => { management.id = 'stack_management'; management.spaceBefore = null; management.children = stackManagementLinks; + delete management.link; } }) ) diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/side_navigation.ts b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/side_navigation.ts index b8e7bdea916c5..f27dbbfb9ec79 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/side_navigation.ts +++ b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/side_navigation.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import type { GroupDefinition } from '@kbn/core-chrome-browser'; +import type { AppDeepLinkId, GroupDefinition, NodeDefinition } from '@kbn/core-chrome-browser'; import produce from 'immer'; import { map } from 'rxjs'; import { type Services } from '../common/services'; @@ -29,6 +29,14 @@ export const initSideNavigation = async (services: Services) => { const footerGroup: GroupDefinition | undefined = draft.footer?.find( ({ type }) => type === 'navGroup' ) as GroupDefinition; + const management = footerGroup?.children.find((child) => child.link === 'management'); + if (management) { + management.renderAs = 'panelOpener'; + management.id = 'stack_management'; + management.spaceBefore = null; + management.children = stackManagementLinks; + delete management.link; + } if (footerGroup) { footerGroup.title = PROJECT_SETTINGS_TITLE; footerGroup.children.push({ cloudLink: 'billingAndSub', openInNewTab: true }); @@ -42,3 +50,83 @@ export const initSideNavigation = async (services: Services) => { dataTestSubj: 'securitySolutionSideNav', }); }; + +// Stack Management static node definition +const stackManagementLinks: Array> = [ + { + title: i18n.translate('xpack.securitySolutionServerless.navLinks.projectSettings.mngt.data', { + defaultMessage: 'Data', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:index_management', breadcrumbStatus: 'hidden' }, + { link: 'management:transform', breadcrumbStatus: 'hidden' }, + { link: 'management:ingest_pipelines', breadcrumbStatus: 'hidden' }, + { link: 'management:dataViews', breadcrumbStatus: 'hidden' }, + { link: 'management:jobsListLink', breadcrumbStatus: 'hidden' }, + { link: 'management:pipelines', breadcrumbStatus: 'hidden' }, + { link: 'management:data_quality', breadcrumbStatus: 'hidden' }, + { link: 'management:data_usage', breadcrumbStatus: 'hidden' }, + ], + }, + { + title: i18n.translate('xpack.securitySolutionServerless.navLinks.projectSettings.mngt.access', { + defaultMessage: 'Access', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:api_keys', breadcrumbStatus: 'hidden' }, + { link: 'management:roles', breadcrumbStatus: 'hidden' }, + { + cloudLink: 'userAndRoles', + title: i18n.translate( + 'xpack.securitySolutionServerless.navLinks.projectSettings.mngt.usersAndRoles', + { defaultMessage: 'Manage organization members' } + ), + }, + ], + }, + { + title: i18n.translate( + 'xpack.securitySolutionServerless.navLinks.projectSettings.mngt.alertsAndInsights', + { defaultMessage: 'Alerts and Insights' } + ), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:triggersActions', breadcrumbStatus: 'hidden' }, + { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, + { link: 'management:maintenanceWindows', breadcrumbStatus: 'hidden' }, + { link: 'securitySolutionUI:entity_analytics-management', breadcrumbStatus: 'hidden' }, + { + link: 'securitySolutionUI:entity_analytics-entity_store_management', + breadcrumbStatus: 'hidden', + }, + ], + }, + { + title: i18n.translate( + 'xpack.securitySolutionServerless.navLinks.projectSettings.mngt.content', + { defaultMessage: 'Content' } + ), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:spaces', breadcrumbStatus: 'hidden' }, + { link: 'management:objects', breadcrumbStatus: 'hidden' }, + { link: 'management:filesManagement', breadcrumbStatus: 'hidden' }, + { link: 'management:reporting', breadcrumbStatus: 'hidden' }, + { link: 'management:tags', breadcrumbStatus: 'hidden' }, + { link: 'maps' }, + { link: 'visualize' }, + ], + }, + { + title: i18n.translate('xpack.securitySolutionServerless.navLinks.projectSettings.mngt.other', { + defaultMessage: 'Other', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:settings', breadcrumbStatus: 'hidden' }, + { link: 'management:securityAiAssistantManagement', breadcrumbStatus: 'hidden' }, + ], + }, +]; diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/navigation.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/navigation.ts index b7d7ef5c6dbbb..b5ecfa9e63a38 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/navigation.ts @@ -49,7 +49,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.search.hideSearch(); await headerPage.waitUntilLoadingHasFinished(); - await expect(await browser.getCurrentUrl()).contain('app/security/dashboards'); + expect(await browser.getCurrentUrl()).contain('app/security/dashboards'); }); it('shows cases in sidebar navigation', async () => { @@ -74,12 +74,13 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await testSubjects.existOrFail('cases-all-title'); }); }); + it('navigates to maintenance windows', async () => { await svlCommonPage.loginAsAdmin(); await svlSecNavigation.navigateToLandingPage(); await svlCommonNavigation.sidenav.openSection('category-management'); - await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' }); - await testSubjects.click('app-card-maintenanceWindows'); + await svlCommonNavigation.sidenav.clickLink({ navId: 'stack_management' }); + await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ 'Stack Management', 'Maintenance Windows',