diff --git a/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/components/navigation_section/navigation_section_ui.tsx b/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/components/navigation_section/navigation_section_ui.tsx index e2fe6fc3c6d5..399641fd18f0 100644 --- a/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/components/navigation_section/navigation_section_ui.tsx +++ b/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/components/navigation_section/navigation_section_ui.tsx @@ -42,14 +42,19 @@ const sectionStyles = { paddingBlock: euiTheme.size.xs, paddingInline: euiTheme.size.s, }), - euiCollapsibleNavItem: ({ euiTheme }: Theme) => css` - .euiAccordion__childWrapper { - transition: none; // Remove the transition as it does not play well with dynamic links added to the accordion + euiCollapsibleNavSection: ({ euiTheme }: Theme) => css` + .euiCollapsibleNavAccordion.isSelected { + .euiAccordion__triggerWrapper, + .euiCollapsibleNavLink { + background-color: ${euiTheme.colors.backgroundLightPrimary}; + } } + .euiAccordion__children .euiCollapsibleNavItem__items { padding-inline-start: ${euiTheme.size.m}; margin-inline-start: ${euiTheme.size.m}; } + &:only-child .euiCollapsibleNavItem__icon { transform: scale(1.33); } @@ -60,15 +65,19 @@ const sectionStyles = { :hover { background-color: ${euiTheme.colors.backgroundBaseInteractiveHover}; } + &.isSelected { + background-color: ${euiTheme.colors.backgroundLightPrimary}; :hover { background-color: ${euiTheme.colors.backgroundLightPrimary}; } } } - + `, + euiAccordionChildWrapper: ({ euiTheme }: Theme) => css` .euiAccordion__childWrapper { background-color: ${euiTheme.colors.backgroundBasePlain}; + transition: none; // Remove the transition as it does not play well with dynamic links added to the accordion } `, }; @@ -461,7 +470,8 @@ function nodeToEuiCollapsibleNavProps( path, isSelected, onClick, - css: sectionStyles.euiCollapsibleNavSubItem, + css: [sectionStyles.euiCollapsibleNavSubItem, sectionStyles.euiAccordionChildWrapper], + className: classnames([isSelected ? 'isSelected' : undefined]), icon: navNode.icon, // @ts-expect-error title accepts JSX elements and they render correctly but the type definition expects a string title: navNode.withBadge ? : navNode.title, @@ -609,12 +619,12 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) {items ? ( ) : ( - + )} ); diff --git a/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx b/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx index 29aec5e21552..015636d96670 100644 --- a/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx +++ b/src/platform/packages/shared/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx @@ -87,7 +87,15 @@ const NavigationWrapper: FC, 'c {props.clickActionText ?? 'Click me'} ) : ( -

Hello world

+ <> +

Solution side nav

+
+

There should be multiple "selected" nodes in the side nav:

+
    +
  • * Item 03 » Item 22
  • +
  • * Footer parent 1 » Item 35
  • +
+ )} @@ -455,9 +463,49 @@ const generalLayoutNavTree: NavigationTreeDefinitionUI = { id: 'example_project_footer', path: '', children: [ + { + id: 'footer-section6', + title: 'Footer parent 1', + path: '', + renderAs: 'accordion', + spaceBefore: null, + icon: 'iInCircle', + defaultIsCollapsed: false, + children: [ + { + id: 'item33', + path: '', + title: 'Item 33', + href: '/app/kibana', + icon: 'iInCircle', + }, + { + id: 'item34', + path: '', + title: 'Item 34', + href: '/app/kibana', + icon: 'iInCircle', + }, + { + id: 'item35', + path: '', + title: 'Item 35', + href: '/app/kibana', + icon: 'iInCircle', + openInNewTab: true, + }, + ], + }, + { + id: 'item10', + path: '', + title: 'Item 10', + icon: 'iInCircle', + href: '/app/kibana', + }, { id: 'footer-section5', - title: 'Parent item, closed', + title: 'Footer parent 2', path: '', renderAs: 'accordion', spaceBefore: null, @@ -502,46 +550,6 @@ const generalLayoutNavTree: NavigationTreeDefinitionUI = { }, ], }, - { - id: 'item10', - path: '', - title: 'Item 10', - icon: 'iInCircle', - href: '/app/kibana', - }, - { - id: 'footer-section6', - title: 'Parent item, opened', - path: '', - renderAs: 'accordion', - spaceBefore: null, - icon: 'iInCircle', - defaultIsCollapsed: false, - children: [ - { - id: 'item33', - path: '', - title: 'Item 33', - href: '/app/kibana', - icon: 'iInCircle', - }, - { - id: 'item34', - path: '', - title: 'Item 34', - href: '/app/kibana', - icon: 'iInCircle', - }, - { - id: 'item35', - path: '', - title: 'Item 35', - href: '/app/kibana', - icon: 'iInCircle', - openInNewTab: true, - }, - ], - }, ], }, ], @@ -585,6 +593,11 @@ export const GeneralLayoutStructure = (args: NavigationServices) => { { id: '', path: 'example_project.root-section1.item03.child-section4' }, { id: '', path: 'example_project.root-section1.item03.child-section4.sub3' }, ], + [ + { id: '', path: 'example_project_footer' }, + { id: '', path: 'example_project_footer.footer-section6' }, + { id: '', path: 'example_project_footer.footer-section6.item35' }, + ], ]); return ( diff --git a/x-pack/solutions/chat/plugins/serverless_chat/public/navigation_tree.ts b/x-pack/solutions/chat/plugins/serverless_chat/public/navigation_tree.ts index 39fd27eee11d..dd419cc3d92d 100644 --- a/x-pack/solutions/chat/plugins/serverless_chat/public/navigation_tree.ts +++ b/x-pack/solutions/chat/plugins/serverless_chat/public/navigation_tree.ts @@ -11,7 +11,6 @@ import type { NavigationTreeDefinition } from '@kbn/core-chrome-browser'; export const createNavigationTree = (): NavigationTreeDefinition => { return { body: [ - { type: 'recentlyAccessed' }, { type: 'navGroup', id: 'workchat_project_nav', @@ -35,101 +34,109 @@ export const createNavigationTree = (): NavigationTreeDefinition => { }, ], footer: [ - { - type: 'navItem', - id: 'devTools', - title: i18n.translate('xpack.serverlessObservability.nav.devTools', { - defaultMessage: 'Developer tools', - }), - link: 'dev_tools', - icon: 'editorCodeBlock', - }, { type: 'navGroup', - id: 'project_settings_project_nav', - title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', { - defaultMessage: 'Project settings', - }), - icon: 'gear', - breadcrumbStatus: 'hidden', + id: 'workchat_project_nav_footer', children: [ { - id: 'management', - title: i18n.translate('xpack.serverlessObservability.nav.mngt', { - defaultMessage: 'Management', + id: 'devTools', + title: i18n.translate('xpack.serverlessObservability.nav.devTools', { + defaultMessage: 'Developer tools', }), + link: 'dev_tools', + icon: 'editorCodeBlock', + }, + { + id: 'project_settings_project_nav', + title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', { + defaultMessage: 'Project settings', + }), + icon: 'gear', + breadcrumbStatus: 'hidden', + renderAs: 'accordion', spaceBefore: null, - renderAs: 'panelOpener', children: [ { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.data', { - defaultMessage: 'Data', + id: 'management', + title: i18n.translate('xpack.serverlessObservability.nav.mngt', { + defaultMessage: 'Management', }), - breadcrumbStatus: 'hidden', + renderAs: 'panelOpener', 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.serverlessObservability.nav.mngt.access', { - defaultMessage: 'Access', - }), - breadcrumbStatus: 'hidden', - children: [{ link: 'management:api_keys', breadcrumbStatus: 'hidden' }], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.alertsAndInsights', { - defaultMessage: 'Alerts and insights', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, - { link: 'management:maintenanceWindows', breadcrumbStatus: 'hidden' }, - ], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.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' }, - ], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.other', { - defaultMessage: 'Other', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:settings', breadcrumbStatus: 'hidden' }, { - link: 'management:observabilityAiAssistantManagement', + title: i18n.translate('xpack.serverlessObservability.nav.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.serverlessObservability.nav.mngt.access', { + defaultMessage: 'Access', + }), + breadcrumbStatus: 'hidden', + children: [{ link: 'management:api_keys', breadcrumbStatus: 'hidden' }], + }, + { + title: i18n.translate( + 'xpack.serverlessObservability.nav.mngt.alertsAndInsights', + { + defaultMessage: 'Alerts and insights', + } + ), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, + { link: 'management:maintenanceWindows', breadcrumbStatus: 'hidden' }, + ], + }, + { + title: i18n.translate('xpack.serverlessObservability.nav.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' }, + ], + }, + { + title: i18n.translate('xpack.serverlessObservability.nav.mngt.other', { + defaultMessage: 'Other', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:settings', breadcrumbStatus: 'hidden' }, + { + link: 'management:observabilityAiAssistantManagement', + breadcrumbStatus: 'hidden', + }, + ], }, ], }, + { + id: 'cloudLinkUserAndRoles', + cloudLink: 'userAndRoles', + }, + { + id: 'cloudLinkBilling', + cloudLink: 'billingAndSub', + }, ], }, - { - id: 'cloudLinkUserAndRoles', - cloudLink: 'userAndRoles', - }, - { - id: 'cloudLinkBilling', - cloudLink: 'billingAndSub', - }, ], }, ], diff --git a/x-pack/solutions/observability/plugins/observability/public/navigation_tree.ts b/x-pack/solutions/observability/plugins/observability/public/navigation_tree.ts index 3a373111b1b2..f3ac899e3b35 100644 --- a/x-pack/solutions/observability/plugins/observability/public/navigation_tree.ts +++ b/x-pack/solutions/observability/plugins/observability/public/navigation_tree.ts @@ -210,7 +210,7 @@ function createNavTree({ streamsAvailable }: { streamsAvailable?: boolean }) { id: 'machine_learning-landing', renderAs: 'panelOpener', title: i18n.translate('xpack.observability.obltNav.machineLearning', { - defaultMessage: 'Machine learning', + defaultMessage: 'Machine Learning', }), children: [ { @@ -325,133 +325,137 @@ function createNavTree({ streamsAvailable }: { streamsAvailable?: boolean }) { }, ], footer: [ - { type: 'recentlyAccessed' }, - { - type: 'navItem', - title: i18n.translate('xpack.observability.obltNav.addData', { - defaultMessage: 'Add data', - }), - link: 'observabilityOnboarding', - icon: 'launch', - }, - { - type: 'navItem', - id: 'devTools', - title: i18n.translate('xpack.observability.obltNav.devTools', { - defaultMessage: 'Developer tools', - }), - link: 'dev_tools', - icon: 'editorCodeBlock', - }, { type: 'navGroup', - id: 'project_settings_project_nav', - title: i18n.translate('xpack.observability.obltNav.management', { - defaultMessage: 'Management', - }), - icon: 'gear', - breadcrumbStatus: 'hidden', + id: 'observability_project_nav_footer', children: [ { - id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically - title: i18n.translate('xpack.observability.obltNav.stackManagement', { - defaultMessage: 'Stack Management', + title: i18n.translate('xpack.observability.obltNav.addData', { + defaultMessage: 'Add data', }), - renderAs: 'panelOpener', + link: 'observabilityOnboarding', + icon: 'launch', + }, + { + id: 'devTools', + title: i18n.translate('xpack.observability.obltNav.devTools', { + defaultMessage: 'Developer tools', + }), + link: 'dev_tools', + icon: 'editorCodeBlock', + }, + { + id: 'project_settings_project_nav', + title: i18n.translate('xpack.observability.obltNav.management', { + defaultMessage: 'Management', + }), + icon: 'gear', + breadcrumbStatus: 'hidden', + renderAs: 'accordion', spaceBefore: null, children: [ { - title: 'Ingest', + id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically + title: i18n.translate('xpack.observability.obltNav.stackManagement', { + defaultMessage: 'Stack Management', + }), + renderAs: 'panelOpener', + spaceBefore: null, children: [ - { link: 'management:ingest_pipelines' }, - { link: 'management:pipelines' }, + { + title: 'Ingest', + children: [ + { link: 'management:ingest_pipelines' }, + { link: 'management:pipelines' }, + ], + }, + { + title: 'Data', + children: [ + { link: 'management:index_management' }, + { link: 'management:data_quality' }, + { link: 'management:index_lifecycle_management' }, + { link: 'management:snapshot_restore' }, + { link: 'management:rollup_jobs' }, + { link: 'management:transform' }, + { link: 'management:cross_cluster_replication' }, + { link: 'management:remote_clusters' }, + { link: 'management:migrate_data' }, + ], + }, + { + title: 'Alerts and Insights', + children: [ + { link: 'management:triggersActions' }, + { link: 'management:cases' }, + { link: 'management:triggersActionsConnectors' }, + { link: 'management:reporting' }, + { link: 'management:jobsListLink' }, + { link: 'management:watcher' }, + { link: 'management:maintenanceWindows' }, + ], + }, + { + title: 'Machine Learning', + children: [ + { link: 'management:overview' }, + { link: 'management:anomaly_detection' }, + { link: 'management:analytics' }, + { link: 'management:trained_models' }, + { link: 'management:supplied_configurations' }, + ], + }, + { + title: 'Security', + children: [ + { link: 'management:users' }, + { link: 'management:roles' }, + { link: 'management:api_keys' }, + { link: 'management:role_mappings' }, + ], + }, + { + title: 'Kibana', + children: [ + { link: 'management:dataViews' }, + { link: 'management:filesManagement' }, + { link: 'management:objects' }, + { link: 'management:tags' }, + { link: 'management:search_sessions' }, + { link: 'management:aiAssistantManagementSelection' }, + { link: 'management:spaces' }, + { link: 'management:settings' }, + ], + }, + { + title: 'Stack', + children: [ + { link: 'management:license_management' }, + { link: 'management:upgrade_assistant' }, + ], + }, ], }, { - title: 'Data', - children: [ - { link: 'management:index_management' }, - { link: 'management:data_quality' }, - { link: 'management:index_lifecycle_management' }, - { link: 'management:snapshot_restore' }, - { link: 'management:rollup_jobs' }, - { link: 'management:transform' }, - { link: 'management:cross_cluster_replication' }, - { link: 'management:remote_clusters' }, - { link: 'management:migrate_data' }, - ], + id: 'monitoring', + link: 'monitoring', }, { - title: 'Alerts and Insights', - children: [ - { link: 'management:triggersActions' }, - { link: 'management:cases' }, - { link: 'management:triggersActionsConnectors' }, - { link: 'management:reporting' }, - { link: 'management:jobsListLink' }, - { link: 'management:watcher' }, - { link: 'management:maintenanceWindows' }, - ], + link: 'integrations', }, { - title: 'Machine Learning', - children: [ - { link: 'management:overview' }, - { link: 'management:anomaly_detection' }, - { link: 'management:analytics' }, - { link: 'management:trained_models' }, - { link: 'management:supplied_configurations' }, - ], + link: 'fleet', }, { - title: 'Security', - children: [ - { link: 'management:users' }, - { link: 'management:roles' }, - { link: 'management:api_keys' }, - { link: 'management:role_mappings' }, - ], + id: 'cloudLinkUserAndRoles', + cloudLink: 'userAndRoles', }, { - title: 'Kibana', - children: [ - { link: 'management:dataViews' }, - { link: 'management:filesManagement' }, - { link: 'management:objects' }, - { link: 'management:tags' }, - { link: 'management:search_sessions' }, - { link: 'management:aiAssistantManagementSelection' }, - { link: 'management:spaces' }, - { link: 'management:settings' }, - ], - }, - { - title: 'Stack', - children: [ - { link: 'management:license_management' }, - { link: 'management:upgrade_assistant' }, - ], + id: 'cloudLinkBilling', + cloudLink: 'billingAndSub', }, ], }, - { - id: 'monitoring', - link: 'monitoring', - }, - { - link: 'integrations', - }, - { - link: 'fleet', - }, - { - id: 'cloudLinkUserAndRoles', - cloudLink: 'userAndRoles', - }, - { - id: 'cloudLinkBilling', - cloudLink: 'billingAndSub', - }, ], }, ], diff --git a/x-pack/solutions/observability/plugins/serverless_observability/public/navigation_tree.ts b/x-pack/solutions/observability/plugins/serverless_observability/public/navigation_tree.ts index 82785301d0de..6caacb2082c4 100644 --- a/x-pack/solutions/observability/plugins/serverless_observability/public/navigation_tree.ts +++ b/x-pack/solutions/observability/plugins/serverless_observability/public/navigation_tree.ts @@ -15,7 +15,6 @@ export const createNavigationTree = ({ }): NavigationTreeDefinition => { return { body: [ - { type: 'recentlyAccessed' }, { type: 'navGroup', id: 'observability_project_nav', @@ -173,7 +172,7 @@ export const createNavigationTree = ({ id: 'machine_learning-landing', renderAs: 'panelOpener', title: i18n.translate('xpack.serverlessObservability.nav.machineLearning', { - defaultMessage: 'Machine learning', + defaultMessage: 'Machine Learning', }), children: [ { @@ -258,126 +257,134 @@ export const createNavigationTree = ({ }, ], footer: [ - { - type: 'navItem', - title: i18n.translate('xpack.serverlessObservability.nav.getStarted', { - defaultMessage: 'Add data', - }), - link: 'observabilityOnboarding', - icon: 'launch', - }, - { - type: 'navItem', - id: 'devTools', - title: i18n.translate('xpack.serverlessObservability.nav.devTools', { - defaultMessage: 'Developer tools', - }), - link: 'dev_tools', - icon: 'editorCodeBlock', - }, { type: 'navGroup', - id: 'project_settings_project_nav', - title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', { - defaultMessage: 'Project settings', - }), - icon: 'gear', - breadcrumbStatus: 'hidden', + id: 'observability_project_nav_footer', children: [ { - id: 'management', - title: i18n.translate('xpack.serverlessObservability.nav.mngt', { - defaultMessage: 'Management', + title: i18n.translate('xpack.serverlessObservability.nav.getStarted', { + defaultMessage: 'Add data', }), + link: 'observabilityOnboarding', + icon: 'launch', + }, + { + id: 'devTools', + title: i18n.translate('xpack.serverlessObservability.nav.devTools', { + defaultMessage: 'Developer tools', + }), + link: 'dev_tools', + icon: 'editorCodeBlock', + }, + { + id: 'project_settings_project_nav', + title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', { + defaultMessage: 'Project settings', + }), + icon: 'gear', + breadcrumbStatus: 'hidden', + renderAs: 'accordion', spaceBefore: null, - renderAs: 'panelOpener', children: [ { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.data', { - defaultMessage: 'Data', + id: 'management', + title: i18n.translate('xpack.serverlessObservability.nav.mngt', { + defaultMessage: 'Management', }), - breadcrumbStatus: 'hidden', + spaceBefore: null, + renderAs: 'panelOpener', 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' }, - { link: 'management:content_connectors', breadcrumbStatus: 'hidden' }, - ], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.access', { - defaultMessage: 'Access', - }), - breadcrumbStatus: 'hidden', - children: [{ link: 'management:api_keys', breadcrumbStatus: 'hidden' }], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.alertsAndInsights', { - defaultMessage: 'Alerts and insights', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, - { link: 'management:maintenanceWindows', breadcrumbStatus: 'hidden' }, - ], - }, - { - title: 'Machine Learning', - children: [ - { link: 'management:overview' }, - { link: 'management:anomaly_detection' }, - { link: 'management:analytics' }, - { link: 'management:trained_models' }, - { link: 'management:supplied_configurations' }, - ], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.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' }, - ], - }, - { - title: i18n.translate('xpack.serverlessObservability.nav.mngt.other', { - defaultMessage: 'Other', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:settings', breadcrumbStatus: 'hidden' }, { - link: 'management:observabilityAiAssistantManagement', + title: i18n.translate('xpack.serverlessObservability.nav.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' }, + { link: 'management:content_connectors', breadcrumbStatus: 'hidden' }, + ], + }, + { + title: i18n.translate('xpack.serverlessObservability.nav.mngt.access', { + defaultMessage: 'Access', + }), + breadcrumbStatus: 'hidden', + children: [{ link: 'management:api_keys', breadcrumbStatus: 'hidden' }], + }, + { + title: i18n.translate( + 'xpack.serverlessObservability.nav.mngt.alertsAndInsights', + { + defaultMessage: 'Alerts and insights', + } + ), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, + { link: 'management:maintenanceWindows', breadcrumbStatus: 'hidden' }, + ], + }, + { + title: 'Machine Learning', + children: [ + { link: 'management:overview' }, + { link: 'management:anomaly_detection' }, + { link: 'management:analytics' }, + { link: 'management:trained_models' }, + { link: 'management:supplied_configurations' }, + ], + }, + { + title: i18n.translate('xpack.serverlessObservability.nav.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' }, + ], + }, + { + title: i18n.translate('xpack.serverlessObservability.nav.mngt.other', { + defaultMessage: 'Other', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:settings', breadcrumbStatus: 'hidden' }, + { + link: 'management:observabilityAiAssistantManagement', + breadcrumbStatus: 'hidden', + }, + ], }, ], }, + { + link: 'integrations', + }, + { + link: 'fleet', + }, + { + id: 'cloudLinkUserAndRoles', + cloudLink: 'userAndRoles', + }, + { + id: 'cloudLinkBilling', + cloudLink: 'billingAndSub', + }, ], }, - { - link: 'integrations', - }, - { - link: 'fleet', - }, - { - id: 'cloudLinkUserAndRoles', - cloudLink: 'userAndRoles', - }, - { - id: 'cloudLinkBilling', - cloudLink: 'billingAndSub', - }, ], }, ], diff --git a/x-pack/solutions/search/plugins/enterprise_search/public/navigation_tree.ts b/x-pack/solutions/search/plugins/enterprise_search/public/navigation_tree.ts index a14414aaf5c1..c090202aa8af 100644 --- a/x-pack/solutions/search/plugins/enterprise_search/public/navigation_tree.ts +++ b/x-pack/solutions/search/plugins/enterprise_search/public/navigation_tree.ts @@ -234,104 +234,110 @@ export const getNavigationTreeDefinition = ({ }, ], footer: [ - { type: 'recentlyAccessed' }, { - breadcrumbStatus: 'hidden', children: [ { - link: 'management:trained_models', - title: i18n.translate( - 'xpack.enterpriseSearch.searchNav.management.trainedModels', - { - defaultMessage: 'Trained Models', - } - ), - }, - { + breadcrumbStatus: 'hidden', children: [ { - children: [ - { link: 'management:ingest_pipelines' }, - { link: 'management:pipelines' }, - ], - title: 'Ingest', + link: 'management:trained_models', + title: i18n.translate( + 'xpack.enterpriseSearch.searchNav.management.trainedModels', + { + defaultMessage: 'Trained Models', + } + ), }, { children: [ - { link: 'management:index_management' }, - { link: 'management:index_lifecycle_management' }, - { link: 'management:snapshot_restore' }, - { link: 'management:rollup_jobs' }, - { link: 'management:transform' }, - { link: 'management:cross_cluster_replication' }, - { link: 'management:remote_clusters' }, - { link: 'management:migrate_data' }, + { + children: [ + { link: 'management:ingest_pipelines' }, + { link: 'management:pipelines' }, + ], + title: 'Ingest', + }, + { + children: [ + { link: 'management:index_management' }, + { link: 'management:index_lifecycle_management' }, + { link: 'management:snapshot_restore' }, + { link: 'management:rollup_jobs' }, + { link: 'management:transform' }, + { link: 'management:cross_cluster_replication' }, + { link: 'management:remote_clusters' }, + { link: 'management:migrate_data' }, + ], + title: 'Data', + }, + { + children: [ + { link: 'management:triggersActions' }, + { link: 'management:cases' }, + { link: 'management:triggersActionsConnectors' }, + { link: 'management:reporting' }, + { link: 'management:jobsListLink' }, + { link: 'management:watcher' }, + { link: 'management:maintenanceWindows' }, + ], + title: 'Alerts and Insights', + }, + { + children: [{ link: 'management:trained_models' }], + title: 'Machine Learning', + }, + { + children: [ + { link: 'management:users' }, + { link: 'management:roles' }, + { link: 'management:api_keys' }, + { link: 'management:role_mappings' }, + ], + title: 'Security', + }, + { + children: [ + { link: 'management:dataViews' }, + { link: 'management:filesManagement' }, + { link: 'management:objects' }, + { link: 'management:tags' }, + { link: 'management:search_sessions' }, + { link: 'management:aiAssistantManagementSelection' }, + { link: 'management:spaces' }, + { link: 'management:settings' }, + ], + title: 'Kibana', + }, + { + children: [ + { link: 'management:license_management' }, + { link: 'management:upgrade_assistant' }, + ], + title: 'Stack', + }, ], - title: 'Data', + id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically + renderAs: 'panelOpener', + spaceBefore: null, + title: i18n.translate('xpack.enterpriseSearch.searchNav.mngt', { + defaultMessage: 'Stack Management', + }), }, { - children: [ - { link: 'management:triggersActions' }, - { link: 'management:cases' }, - { link: 'management:triggersActionsConnectors' }, - { link: 'management:reporting' }, - { link: 'management:jobsListLink' }, - { link: 'management:watcher' }, - { link: 'management:maintenanceWindows' }, - ], - title: 'Alerts and Insights', - }, - { - children: [{ link: 'management:trained_models' }], - title: 'Machine Learning', - }, - { - children: [ - { link: 'management:users' }, - { link: 'management:roles' }, - { link: 'management:api_keys' }, - { link: 'management:role_mappings' }, - ], - title: 'Security', - }, - { - children: [ - { link: 'management:dataViews' }, - { link: 'management:filesManagement' }, - { link: 'management:objects' }, - { link: 'management:tags' }, - { link: 'management:search_sessions' }, - { link: 'management:aiAssistantManagementSelection' }, - { link: 'management:spaces' }, - { link: 'management:settings' }, - ], - title: 'Kibana', - }, - { - children: [ - { link: 'management:license_management' }, - { link: 'management:upgrade_assistant' }, - ], - title: 'Stack', + id: 'monitoring', + link: 'monitoring', }, ], - id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically - renderAs: 'panelOpener', + icon: 'gear', + id: 'project_settings_project_nav', + renderAs: 'accordion', spaceBefore: null, - title: i18n.translate('xpack.enterpriseSearch.searchNav.mngt', { - defaultMessage: 'Stack Management', + title: i18n.translate('xpack.enterpriseSearch.searchNav.management', { + defaultMessage: 'Management', }), }, - { - id: 'monitoring', - link: 'monitoring', - }, ], - icon: 'gear', - id: 'project_settings_project_nav', - title: i18n.translate('xpack.enterpriseSearch.searchNav.management', { - defaultMessage: 'Management', - }), + id: 'search_project_nav_footer', type: 'navGroup', }, ], diff --git a/x-pack/solutions/search/plugins/serverless_search/public/navigation_tree.ts b/x-pack/solutions/search/plugins/serverless_search/public/navigation_tree.ts index 2aa424b9a4ba..2b744377f707 100644 --- a/x-pack/solutions/search/plugins/serverless_search/public/navigation_tree.ts +++ b/x-pack/solutions/search/plugins/serverless_search/public/navigation_tree.ts @@ -149,127 +149,136 @@ export const navigationTree = ({ isAppRegistered }: ApplicationStart): Navigatio }, ], footer: [ - { - id: 'gettingStarted', - type: 'navItem', - title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', { - defaultMessage: 'Getting Started', - }), - link: 'serverlessElasticsearch', - icon: 'launch', - }, { type: 'navGroup', - id: 'project_settings_project_nav', - title: i18n.translate('xpack.serverlessSearch.nav.projectSettings', { - defaultMessage: 'Project settings', - }), - icon: 'gear', - breadcrumbStatus: 'hidden', + id: 'search_project_nav_footer', children: [ { - link: 'management:trained_models', - title: i18n.translate('xpack.serverlessSearch.nav.trainedModels', { - defaultMessage: 'Trained Models', + id: 'gettingStarted', + title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', { + defaultMessage: 'Getting Started', }), + link: 'serverlessElasticsearch', + icon: 'launch', }, { - id: 'management', - title: i18n.translate('xpack.serverlessSearch.nav.mngt', { - defaultMessage: 'Management', + id: 'project_settings_project_nav', + title: i18n.translate('xpack.serverlessSearch.nav.projectSettings', { + defaultMessage: 'Project settings', }), + icon: 'gear', + breadcrumbStatus: 'hidden', + renderAs: 'accordion', spaceBefore: null, - renderAs: 'panelOpener', children: [ { - title: i18n.translate('xpack.serverlessSearch.nav.mngt.data', { - defaultMessage: 'Data', + link: 'management:trained_models', + title: i18n.translate('xpack.serverlessSearch.nav.trainedModels', { + defaultMessage: 'Trained Models', }), - 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.serverlessSearch.nav.mngt.access', { - defaultMessage: 'Access', + id: 'management', + title: i18n.translate('xpack.serverlessSearch.nav.mngt', { + defaultMessage: 'Management', }), - breadcrumbStatus: 'hidden', + spaceBefore: null, + renderAs: 'panelOpener', children: [ - { link: 'management:api_keys', breadcrumbStatus: 'hidden' }, - { link: 'management:roles', breadcrumbStatus: 'hidden' }, { - cloudLink: 'userAndRoles', - title: i18n.translate('xpack.serverlessSearch.nav.mngt.access.userAndRoles', { - defaultMessage: 'Manage Organization Members', + title: i18n.translate('xpack.serverlessSearch.nav.mngt.data', { + defaultMessage: 'Data', }), - }, - ], - }, - { - title: i18n.translate('xpack.serverlessSearch.nav.mngt.alertsAndInsights', { - defaultMessage: 'Alerts and insights', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:triggersActions', breadcrumbStatus: 'hidden' }, - { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, - ], - }, - { - title: 'Machine Learning', - children: [{ link: 'management:trained_models', breadcrumbStatus: 'hidden' }], - }, - { - title: i18n.translate('xpack.serverlessSearch.nav.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' }, - ], - }, - { - title: i18n.translate('xpack.serverlessSearch.nav.mngt.other', { - defaultMessage: 'Other', - }), - breadcrumbStatus: 'hidden', - children: [ - { link: 'management:settings', breadcrumbStatus: 'hidden' }, - { - link: 'management:observabilityAiAssistantManagement', breadcrumbStatus: 'hidden', - title: i18n.translate( - 'xpack.serverlessSearch.nav.mngt.other.aiAssistantSettings', - { defaultMessage: 'AI Assistant Settings' } - ), + 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.serverlessSearch.nav.mngt.access', { + defaultMessage: 'Access', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:api_keys', breadcrumbStatus: 'hidden' }, + { link: 'management:roles', breadcrumbStatus: 'hidden' }, + { + cloudLink: 'userAndRoles', + title: i18n.translate( + 'xpack.serverlessSearch.nav.mngt.access.userAndRoles', + { + defaultMessage: 'Manage Organization Members', + } + ), + }, + ], + }, + { + title: i18n.translate('xpack.serverlessSearch.nav.mngt.alertsAndInsights', { + defaultMessage: 'Alerts and insights', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:triggersActions', breadcrumbStatus: 'hidden' }, + { link: 'management:triggersActionsConnectors', breadcrumbStatus: 'hidden' }, + ], + }, + { + title: 'Machine Learning', + children: [{ link: 'management:trained_models', breadcrumbStatus: 'hidden' }], + }, + { + title: i18n.translate('xpack.serverlessSearch.nav.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' }, + ], + }, + { + title: i18n.translate('xpack.serverlessSearch.nav.mngt.other', { + defaultMessage: 'Other', + }), + breadcrumbStatus: 'hidden', + children: [ + { link: 'management:settings', breadcrumbStatus: 'hidden' }, + { + link: 'management:observabilityAiAssistantManagement', + breadcrumbStatus: 'hidden', + title: i18n.translate( + 'xpack.serverlessSearch.nav.mngt.other.aiAssistantSettings', + { defaultMessage: 'AI Assistant Settings' } + ), + }, + ], }, ], }, + { + id: 'cloudLinkDeployment', + cloudLink: 'deployment', + title: i18n.translate('xpack.serverlessSearch.nav.performance', { + defaultMessage: 'Performance', + }), + }, + { + id: 'cloudLinkBilling', + cloudLink: 'billingAndSub', + }, ], }, - { - id: 'cloudLinkDeployment', - cloudLink: 'deployment', - title: i18n.translate('xpack.serverlessSearch.nav.performance', { - defaultMessage: 'Performance', - }), - }, - { - id: 'cloudLinkBilling', - cloudLink: 'billingAndSub', - }, ], }, ], diff --git a/x-pack/solutions/security/packages/navigation/src/i18n_strings.ts b/x-pack/solutions/security/packages/navigation/src/i18n_strings.ts index 24cca089a321..8448a4bf2940 100644 --- a/x-pack/solutions/security/packages/navigation/src/i18n_strings.ts +++ b/x-pack/solutions/security/packages/navigation/src/i18n_strings.ts @@ -63,7 +63,7 @@ export const i18nStrings = { }, ml: { title: i18n.translate('securitySolutionPackages.navLinks.ml', { - defaultMessage: 'Machine learning', + defaultMessage: 'Machine Learning', }), overview: i18n.translate('securitySolutionPackages.navLinks.ml.overview', { defaultMessage: 'Overview', diff --git a/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/navigation_tree.ts b/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/navigation_tree.ts index f5db8751d603..a2151fae2ea1 100644 --- a/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/navigation_tree.ts +++ b/x-pack/solutions/security/plugins/security_solution_ess/public/navigation/navigation_tree.ts @@ -75,117 +75,125 @@ export const createNavigationTree = (services: Services): NavigationTreeDefiniti ], footer: [ { - id: SecurityPageName.landing, - link: securityLink(SecurityPageName.landing), - type: 'navItem', - icon: 'launch', - }, - { - type: 'navItem', - link: 'dev_tools', - title: i18nStrings.devTools, - icon: 'editorCodeBlock', - }, - { + id: 'security_solution_nav_footer', type: 'navGroup', - title: i18nStrings.management.title, - icon: 'gear', - breadcrumbStatus: 'hidden', children: [ { - id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically - title: i18nStrings.stackManagement.title, - renderAs: 'panelOpener', + id: SecurityPageName.landing, + link: securityLink(SecurityPageName.landing), + icon: 'launch', + }, + { + link: 'dev_tools', + title: i18nStrings.devTools, + icon: 'editorCodeBlock', + }, + { + title: i18nStrings.management.title, + icon: 'gear', + breadcrumbStatus: 'hidden', + renderAs: 'accordion', spaceBefore: null, children: [ { - title: i18nStrings.stackManagement.ingest.title, - children: [{ link: 'management:ingest_pipelines' }, { link: 'management:pipelines' }], - }, - { - title: i18nStrings.stackManagement.data.title, + id: 'stack_management', + title: i18nStrings.stackManagement.title, + renderAs: 'panelOpener', + spaceBefore: null, children: [ - { link: 'management:index_management' }, - { link: 'management:index_lifecycle_management' }, - { link: 'management:snapshot_restore' }, - { link: 'management:rollup_jobs' }, - { link: 'management:transform' }, - { link: 'management:cross_cluster_replication' }, - { link: 'management:remote_clusters' }, - { link: 'management:migrate_data' }, - ], - }, - { - title: i18nStrings.stackManagement.alertsAndInsights.title, - children: [ - { link: 'management:triggersActions' }, - { link: 'management:cases' }, - { link: 'management:triggersActionsConnectors' }, - { link: 'management:reporting' }, - { link: 'management:jobsListLink' }, - { link: 'management:watcher' }, - { link: 'management:maintenanceWindows' }, { - id: SecurityPageName.entityAnalyticsManagement, - link: securityLink(SecurityPageName.entityAnalyticsManagement), + title: i18nStrings.stackManagement.ingest.title, + children: [ + { link: 'management:ingest_pipelines' }, + { link: 'management:pipelines' }, + ], }, { - id: SecurityPageName.entityAnalyticsEntityStoreManagement, - link: securityLink(SecurityPageName.entityAnalyticsEntityStoreManagement), + title: i18nStrings.stackManagement.data.title, + children: [ + { link: 'management:index_management' }, + { link: 'management:index_lifecycle_management' }, + { link: 'management:snapshot_restore' }, + { link: 'management:rollup_jobs' }, + { link: 'management:transform' }, + { link: 'management:cross_cluster_replication' }, + { link: 'management:remote_clusters' }, + { link: 'management:migrate_data' }, + ], + }, + { + title: i18nStrings.stackManagement.alertsAndInsights.title, + children: [ + { link: 'management:triggersActions' }, + { link: 'management:cases' }, + { link: 'management:triggersActionsConnectors' }, + { link: 'management:reporting' }, + { link: 'management:jobsListLink' }, + { link: 'management:watcher' }, + { link: 'management:maintenanceWindows' }, + { + id: SecurityPageName.entityAnalyticsManagement, + link: securityLink(SecurityPageName.entityAnalyticsManagement), + }, + { + id: SecurityPageName.entityAnalyticsEntityStoreManagement, + link: securityLink(SecurityPageName.entityAnalyticsEntityStoreManagement), + }, + ], + }, + { + title: i18nStrings.ml.title, + children: [ + { link: 'management:overview' }, + { link: 'management:anomaly_detection' }, + { link: 'management:analytics' }, + { link: 'management:trained_models' }, + { link: 'management:supplied_configurations' }, + ], + }, + { + title: i18nStrings.stackManagement.security.title, + children: [ + { link: 'management:users' }, + { link: 'management:roles' }, + { link: 'management:api_keys' }, + { link: 'management:role_mappings' }, + ], + }, + { + title: i18nStrings.stackManagement.kibana.title, + children: [ + { link: 'management:dataViews' }, + { link: 'management:filesManagement' }, + { link: 'management:objects' }, + { link: 'management:tags' }, + { link: 'management:search_sessions' }, + { link: 'management:aiAssistantManagementSelection' }, + { link: 'management:spaces' }, + { link: 'maps' }, + { link: 'visualize' }, + { link: 'graph' }, + { link: 'canvas' }, + { link: 'management:settings' }, + ], + }, + { + title: i18nStrings.stackManagement.stack.title, + children: [ + { link: 'management:license_management' }, + { link: 'management:upgrade_assistant' }, + ], }, ], }, { - title: i18nStrings.ml.title, - children: [ - { link: 'management:overview' }, - { link: 'management:anomaly_detection' }, - { link: 'management:analytics' }, - { link: 'management:trained_models' }, - { link: 'management:supplied_configurations' }, - ], + link: 'monitoring', }, { - title: i18nStrings.stackManagement.security.title, - children: [ - { link: 'management:users' }, - { link: 'management:roles' }, - { link: 'management:api_keys' }, - { link: 'management:role_mappings' }, - ], - }, - { - title: i18nStrings.stackManagement.kibana.title, - children: [ - { link: 'management:dataViews' }, - { link: 'management:filesManagement' }, - { link: 'management:objects' }, - { link: 'management:tags' }, - { link: 'management:search_sessions' }, - { link: 'management:aiAssistantManagementSelection' }, - { link: 'management:spaces' }, - { link: 'maps' }, - { link: 'visualize' }, - { link: 'graph' }, - { link: 'canvas' }, - { link: 'management:settings' }, - ], - }, - { - title: i18nStrings.stackManagement.stack.title, - children: [ - { link: 'management:license_management' }, - { link: 'management:upgrade_assistant' }, - ], + link: 'integrations', }, ], }, - { - link: 'monitoring', - }, - { - link: 'integrations', - }, ], }, ], diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/ai_navigation/ai_navigation_tree.ts b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/ai_navigation/ai_navigation_tree.ts index ed5fc020a5fe..3abb0a25bc20 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/ai_navigation/ai_navigation_tree.ts +++ b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/ai_navigation/ai_navigation_tree.ts @@ -96,17 +96,21 @@ export const createAiNavigationTree = (): NavigationTreeDefinition => ({ ], footer: [ { - type: 'navItem', - id: SecurityPageName.landing, - link: securityLink(SecurityPageName.landing), - icon: 'launch', + id: 'security_solution_ai_nav_footer', + type: 'navGroup', + children: [ + { + id: SecurityPageName.landing, + link: securityLink(SecurityPageName.landing), + icon: 'launch', + }, + { + link: 'dev_tools', + title: i18nStrings.devTools, + icon: 'editorCodeBlock', + }, + createStackManagementNavigationTree(), + ], }, - { - type: 'navItem', - link: 'dev_tools', - title: i18nStrings.devTools, - icon: 'editorCodeBlock', - }, - createStackManagementNavigationTree(), ], }); diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/navigation_tree.ts b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/navigation_tree.ts index 342e9258d62d..5ab8f45351af 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/navigation_tree.ts +++ b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/navigation_tree.ts @@ -82,17 +82,21 @@ export const createNavigationTree = (services: Services): NavigationTreeDefiniti ], footer: [ { - type: 'navItem', - id: SecurityPageName.landing, - link: securityLink(SecurityPageName.landing), - icon: 'launch', + id: 'security_solution_nav_footer', + type: 'navGroup', + children: [ + { + id: SecurityPageName.landing, + link: securityLink(SecurityPageName.landing), + icon: 'launch', + }, + { + link: 'dev_tools', + title: i18nStrings.devTools, + icon: 'editorCodeBlock', + }, + createStackManagementNavigationTree(), + ], }, - { - type: 'navItem', - link: 'dev_tools', - title: i18nStrings.devTools, - icon: 'editorCodeBlock', - }, - createStackManagementNavigationTree(), ], }); diff --git a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/stack_management_navigation.ts b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/stack_management_navigation.ts index 39d534c962a3..4c6cdad1929f 100644 --- a/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/stack_management_navigation.ts +++ b/x-pack/solutions/security/plugins/security_solution_serverless/public/navigation/stack_management_navigation.ts @@ -5,16 +5,17 @@ * 2.0. */ -import type { GroupDefinition } from '@kbn/core-chrome-browser'; +import type { NodeDefinition } from '@kbn/core-chrome-browser'; import { SecurityPageName } from '@kbn/security-solution-navigation'; import { i18nStrings, securityLink } from '@kbn/security-solution-navigation/links'; -export const createStackManagementNavigationTree = (): GroupDefinition => ({ - type: 'navGroup', +export const createStackManagementNavigationTree = (): NodeDefinition => ({ id: 'category-management', title: i18nStrings.projectSettings.title, icon: 'gear', breadcrumbStatus: 'hidden', + renderAs: 'accordion', + spaceBefore: null, children: [ { id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically diff --git a/x-pack/test/functional_search/tests/solution_navigation.ts b/x-pack/test/functional_search/tests/solution_navigation.ts index 77cdbe00408a..d3b42cd989cd 100644 --- a/x-pack/test/functional_search/tests/solution_navigation.ts +++ b/x-pack/test/functional_search/tests/solution_navigation.ts @@ -241,9 +241,14 @@ export default function searchSolutionNavigation({ it('renders only expected items', async () => { await solutionNavigation.sidenav.openSection('search_project_nav.otherTools'); - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); await solutionNavigation.sidenav.expectSectionOpen('search_project_nav.otherTools'); - await solutionNavigation.sidenav.expectSectionOpen('project_settings_project_nav'); + + await solutionNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); + await solutionNavigation.sidenav.expectSectionOpen( + 'search_project_nav_footer.project_settings_project_nav' + ); await solutionNavigation.sidenav.expectOnlyDefinedLinks([ 'search_project_nav', @@ -265,6 +270,7 @@ export default function searchSolutionNavigation({ 'otherTools', 'maps', 'graph', + 'search_project_nav_footer', 'project_settings_project_nav', 'management:trained_models', 'stack_management', diff --git a/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts b/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts index 7bc49a1ecf08..6303fefc0cab 100644 --- a/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts +++ b/x-pack/test/functional_solution_sidenav/tests/observability_sidenav.ts @@ -79,7 +79,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { } // navigate to a different section - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await solutionNavigation.sidenav.clickLink({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.sidenav.clickPanelLink('management:tags'); diff --git a/x-pack/test/functional_solution_sidenav/tests/search_sidenav.ts b/x-pack/test/functional_solution_sidenav/tests/search_sidenav.ts index 7aa055fe06db..ee6aaaadfde0 100644 --- a/x-pack/test/functional_solution_sidenav/tests/search_sidenav.ts +++ b/x-pack/test/functional_solution_sidenav/tests/search_sidenav.ts @@ -60,7 +60,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); // navigate to a different section - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await solutionNavigation.sidenav.clickLink({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Data' }); diff --git a/x-pack/test/observability_functional/apps/observability/sidenav/sidenav.ts b/x-pack/test/observability_functional/apps/observability/sidenav/sidenav.ts index 92735bc0bd84..d8addf538c44 100644 --- a/x-pack/test/observability_functional/apps/observability/sidenav/sidenav.ts +++ b/x-pack/test/observability_functional/apps/observability/sidenav/sidenav.ts @@ -76,7 +76,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); // Supplied configurations is under Management -> Anomaly Detection Jobs -> Click button mlSuppliedConfigurationsButton - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await solutionNavigation.sidenav.clickLink({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.sidenav.clickPanelLink('management:anomaly_detection'); diff --git a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts index 2e30db4930f2..a3c333660685 100644 --- a/x-pack/test_serverless/functional/services/ml/observability_navigation.ts +++ b/x-pack/test_serverless/functional/services/ml/observability_navigation.ts @@ -16,7 +16,9 @@ export function MachineLearningNavigationProviderObservability({ const svlCommonNavigation = getPageObject('svlCommonNavigation'); async function navigateToArea(id: string, expectedTestSubject: string) { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await retry.tryForTime(5 * 1000, async () => { await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.clickPanelLink(id); diff --git a/x-pack/test_serverless/functional/services/ml/security_navigation.ts b/x-pack/test_serverless/functional/services/ml/security_navigation.ts index 0a7944b1aaf5..8f7e020018a5 100644 --- a/x-pack/test_serverless/functional/services/ml/security_navigation.ts +++ b/x-pack/test_serverless/functional/services/ml/security_navigation.ts @@ -16,7 +16,9 @@ export function MachineLearningNavigationProviderSecurity({ const retry = getService('retry'); async function navigateToArea(id: string, expectedTestSubject: string) { - await svlCommonNavigation.sidenav.openSection('category-management'); + await svlCommonNavigation.sidenav.openSection( + 'security_solution_nav_footer.category-management' + ); await retry.tryForTime(5 * 1000, async () => { await svlCommonNavigation.sidenav.clickLink({ navId: 'stack_management' }); await svlCommonNavigation.sidenav.clickPanelLink(id); diff --git a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts index e5205a86f2f3..ea64e8b8e855 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -32,7 +32,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'observabilityOnboarding', }); - await svlCommonNavigation.sidenav.expectSectionClosed('project_settings_project_nav'); + await svlCommonNavigation.sidenav.expectSectionClosed( + 'observability_project_nav_footer.project_settings_project_nav' + ); // navigate to the logs explorer tab by default await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'discover' }); @@ -48,7 +50,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.sidenav.clickLink({ navId: 'observabilityAIAssistant' }); // click on AI Assistant link await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI Assistant' }); // navigate to a different section - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.expectLinkActive({ navId: 'management' }); await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); @@ -59,18 +63,24 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'observabilityOnboarding', }); - await svlCommonNavigation.sidenav.expectSectionOpen(`project_settings_project_nav`); // remains open + await svlCommonNavigation.sidenav.expectSectionOpen( + 'observability_project_nav_footer.project_settings_project_nav' + ); // remains open await expectNoPageReload(); }); it('active sidenav section is auto opened on load', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); await browser.refresh(); await svlCommonNavigation.expectExists(); - await svlCommonNavigation.sidenav.expectSectionOpen('project_settings_project_nav'); + await svlCommonNavigation.sidenav.expectSectionOpen( + 'observability_project_nav_footer.project_settings_project_nav' + ); }); it('shows cases in sidebar navigation', async () => { @@ -120,7 +130,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); it('navigates to integrations', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'integrations' }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ 'Integrations', @@ -129,13 +141,17 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); it('navigates to fleet', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'fleet' }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Fleet', 'Agents']); }); it('navigates to maintenance windows', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'observability_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ diff --git a/x-pack/test_serverless/functional/test_suites/search/ml/trained_models_list.ts b/x-pack/test_serverless/functional/test_suites/search/ml/trained_models_list.ts index 519c3c303f38..1245ebc3a806 100644 --- a/x-pack/test_serverless/functional/test_suites/search/ml/trained_models_list.ts +++ b/x-pack/test_serverless/functional/test_suites/search/ml/trained_models_list.ts @@ -29,7 +29,9 @@ export default function ({ getService, getPageObjects, getPageObject }: FtrProvi describe('page navigation', () => { it('renders trained models list', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management:trained_models' }); await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'management:trained_models', diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index 5c91600bd43f..907d4d7ffaf2 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -127,7 +127,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { } // Open Project Settings - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); // check Project Settings // > Trained Models await solutionNavigation.sidenav.clickLink({ @@ -172,7 +174,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); it('navigate management', async () => { - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management', 'Tags']); @@ -206,7 +210,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { }); it('renders expected side navigation items', async () => { - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); // Verify all expected top-level links exist await solutionNavigation.sidenav.expectLinkExists({ text: 'Data' }); await solutionNavigation.sidenav.expectLinkExists({ text: 'Index Management' }); @@ -230,7 +236,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await solutionNavigation.sidenav.expectLinkExists({ text: 'Performance' }); await solutionNavigation.sidenav.expectLinkExists({ text: 'Billing and subscription' }); - await solutionNavigation.sidenav.openSection('project_settings_project_nav'); + await solutionNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await solutionNavigation.sidenav.expectOnlyDefinedLinks([ 'search_project_nav', 'data', @@ -249,6 +257,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { 'otherTools', 'maps', 'gettingStarted', + 'search_project_nav_footer', 'project_settings_project_nav', 'management:trained_models', 'management', diff --git a/x-pack/test_serverless/functional/test_suites/search/pipelines.ts b/x-pack/test_serverless/functional/test_suites/search/pipelines.ts index 2c9164926f82..8f90a32c747a 100644 --- a/x-pack/test_serverless/functional/test_suites/search/pipelines.ts +++ b/x-pack/test_serverless/functional/test_suites/search/pipelines.ts @@ -19,7 +19,9 @@ export default function ({ getPageObjects }: FtrProviderContext) { describe('ingest pipelines', function () { before(async () => { await pageObjects.svlCommonPage.loginWithRole('developer'); - await pageObjects.svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await pageObjects.svlCommonNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await pageObjects.svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await pageObjects.svlCommonNavigation.sidenav.clickPanelLink('management:ingest_pipelines'); }); diff --git a/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts index 4cf5664c3514..5016c6f2efd5 100644 --- a/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts +++ b/x-pack/test_serverless/functional/test_suites/search/rules/rule_details.ts @@ -43,7 +43,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const navigateToConnectors = async () => { await svlSearchNavigation.navigateToLandingPage(); - await svlCommonNavigation.sidenav.openSection('project_settings_project_nav'); + await svlCommonNavigation.sidenav.openSection( + 'search_project_nav_footer.project_settings_project_nav' + ); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' }); await testSubjects.click('app-card-triggersActionsConnectors'); }; 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 b5ecfa9e63a3..b4d4e98e4428 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 @@ -78,7 +78,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { it('navigates to maintenance windows', async () => { await svlCommonPage.loginAsAdmin(); await svlSecNavigation.navigateToLandingPage(); - await svlCommonNavigation.sidenav.openSection('category-management'); + await svlCommonNavigation.sidenav.openSection( + 'security_solution_nav_footer.category-management' + ); await svlCommonNavigation.sidenav.clickLink({ navId: 'stack_management' }); await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([