Reorganize footer items for Solutions (#218050)

## Summary

Epic: https://github.com/elastic/kibana-team/issues/1439
~Depends on https://github.com/elastic/kibana/pull/218156~

Addresses footer issues and a few content issues


https://github.com/user-attachments/assets/07063aa7-8a49-4cb5-9fd2-a6e1cbd674b7


1. Footer item texts should not be bold
2. We should have the spacing of regular nav sub-items in the footer

Other fixes:
1. Fix text casing in "Machine Learning" (Note: [other casing issues
exist](https://github.com/elastic/kibana/issues/217352))
2. Remove `recentlyAccessed` sections

### Checklist

Check the PR satisfies following conditions. 

Reviewers should verify this PR satisfies this list as well.

- [x] Any text added follows [EUI's writing
guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses
sentence case text and includes [i18n
support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)
- [x] [Unit or functional
tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)
were updated or added to match the most common scenarios
This commit is contained in:
Tim Sullivan 2025-05-02 07:51:10 -07:00 committed by GitHub
parent c89c1ee30d
commit ee74bb4e65
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 779 additions and 657 deletions

View file

@ -42,14 +42,19 @@ const sectionStyles = {
paddingBlock: euiTheme.size.xs, paddingBlock: euiTheme.size.xs,
paddingInline: euiTheme.size.s, paddingInline: euiTheme.size.s,
}), }),
euiCollapsibleNavItem: ({ euiTheme }: Theme) => css` euiCollapsibleNavSection: ({ euiTheme }: Theme) => css`
.euiAccordion__childWrapper { .euiCollapsibleNavAccordion.isSelected {
transition: none; // Remove the transition as it does not play well with dynamic links added to the accordion .euiAccordion__triggerWrapper,
.euiCollapsibleNavLink {
background-color: ${euiTheme.colors.backgroundLightPrimary};
}
} }
.euiAccordion__children .euiCollapsibleNavItem__items { .euiAccordion__children .euiCollapsibleNavItem__items {
padding-inline-start: ${euiTheme.size.m}; padding-inline-start: ${euiTheme.size.m};
margin-inline-start: ${euiTheme.size.m}; margin-inline-start: ${euiTheme.size.m};
} }
&:only-child .euiCollapsibleNavItem__icon { &:only-child .euiCollapsibleNavItem__icon {
transform: scale(1.33); transform: scale(1.33);
} }
@ -60,15 +65,19 @@ const sectionStyles = {
:hover { :hover {
background-color: ${euiTheme.colors.backgroundBaseInteractiveHover}; background-color: ${euiTheme.colors.backgroundBaseInteractiveHover};
} }
&.isSelected { &.isSelected {
background-color: ${euiTheme.colors.backgroundLightPrimary};
:hover { :hover {
background-color: ${euiTheme.colors.backgroundLightPrimary}; background-color: ${euiTheme.colors.backgroundLightPrimary};
} }
} }
} }
`,
euiAccordionChildWrapper: ({ euiTheme }: Theme) => css`
.euiAccordion__childWrapper { .euiAccordion__childWrapper {
background-color: ${euiTheme.colors.backgroundBasePlain}; 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, path,
isSelected, isSelected,
onClick, onClick,
css: sectionStyles.euiCollapsibleNavSubItem, css: [sectionStyles.euiCollapsibleNavSubItem, sectionStyles.euiAccordionChildWrapper],
className: classnames([isSelected ? 'isSelected' : undefined]),
icon: navNode.icon, icon: navNode.icon,
// @ts-expect-error title accepts JSX elements and they render correctly but the type definition expects a string // @ts-expect-error title accepts JSX elements and they render correctly but the type definition expects a string
title: navNode.withBadge ? <SubItemTitle item={navNode} /> : navNode.title, title: navNode.withBadge ? <SubItemTitle item={navNode} /> : navNode.title,
@ -609,12 +619,12 @@ export const NavigationSectionUI: FC<Props> = React.memo(({ navNode: _navNode })
{items ? ( {items ? (
<EuiCollapsibleNavItem <EuiCollapsibleNavItem
{...rest} {...rest}
css={sectionStyles.euiCollapsibleNavItem} css={[sectionStyles.euiCollapsibleNavSection, sectionStyles.euiAccordionChildWrapper]}
items={items} items={items}
accordionProps={getAccordionProps(navNode.path)} accordionProps={getAccordionProps(navNode.path)}
/> />
) : ( ) : (
<EuiCollapsibleNavItem {...props} css={sectionStyles.euiCollapsibleNavItem} /> <EuiCollapsibleNavItem {...props} css={sectionStyles.euiCollapsibleNavSection} />
)} )}
</div> </div>
); );

View file

@ -87,7 +87,15 @@ const NavigationWrapper: FC<Props & Omit<Partial<EuiCollapsibleNavBetaProps>, 'c
{props.clickActionText ?? 'Click me'} {props.clickActionText ?? 'Click me'}
</EuiButton> </EuiButton>
) : ( ) : (
<p>Hello world</p> <>
<h1>Solution side nav</h1>
<br />
<p>There should be multiple &quot;selected&quot; nodes in the side nav:</p>
<ul>
<li>* Item 03 &raquo; Item 22</li>
<li>* Footer parent 1 &raquo; Item 35</li>
</ul>
</>
)} )}
</EuiPageTemplate.Section> </EuiPageTemplate.Section>
</EuiPageTemplate> </EuiPageTemplate>
@ -455,9 +463,49 @@ const generalLayoutNavTree: NavigationTreeDefinitionUI = {
id: 'example_project_footer', id: 'example_project_footer',
path: '', path: '',
children: [ 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', id: 'footer-section5',
title: 'Parent item, closed', title: 'Footer parent 2',
path: '', path: '',
renderAs: 'accordion', renderAs: 'accordion',
spaceBefore: null, 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' },
{ id: '', path: 'example_project.root-section1.item03.child-section4.sub3' }, { 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 ( return (

View file

@ -11,7 +11,6 @@ import type { NavigationTreeDefinition } from '@kbn/core-chrome-browser';
export const createNavigationTree = (): NavigationTreeDefinition => { export const createNavigationTree = (): NavigationTreeDefinition => {
return { return {
body: [ body: [
{ type: 'recentlyAccessed' },
{ {
type: 'navGroup', type: 'navGroup',
id: 'workchat_project_nav', id: 'workchat_project_nav',
@ -35,101 +34,109 @@ export const createNavigationTree = (): NavigationTreeDefinition => {
}, },
], ],
footer: [ footer: [
{
type: 'navItem',
id: 'devTools',
title: i18n.translate('xpack.serverlessObservability.nav.devTools', {
defaultMessage: 'Developer tools',
}),
link: 'dev_tools',
icon: 'editorCodeBlock',
},
{ {
type: 'navGroup', type: 'navGroup',
id: 'project_settings_project_nav', id: 'workchat_project_nav_footer',
title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', {
defaultMessage: 'Project settings',
}),
icon: 'gear',
breadcrumbStatus: 'hidden',
children: [ children: [
{ {
id: 'management', id: 'devTools',
title: i18n.translate('xpack.serverlessObservability.nav.mngt', { title: i18n.translate('xpack.serverlessObservability.nav.devTools', {
defaultMessage: 'Management', 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, spaceBefore: null,
renderAs: 'panelOpener',
children: [ children: [
{ {
title: i18n.translate('xpack.serverlessObservability.nav.mngt.data', { id: 'management',
defaultMessage: 'Data', title: i18n.translate('xpack.serverlessObservability.nav.mngt', {
defaultMessage: 'Management',
}), }),
breadcrumbStatus: 'hidden', renderAs: 'panelOpener',
children: [ 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', 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',
},
], ],
}, },
], ],

View file

@ -210,7 +210,7 @@ function createNavTree({ streamsAvailable }: { streamsAvailable?: boolean }) {
id: 'machine_learning-landing', id: 'machine_learning-landing',
renderAs: 'panelOpener', renderAs: 'panelOpener',
title: i18n.translate('xpack.observability.obltNav.machineLearning', { title: i18n.translate('xpack.observability.obltNav.machineLearning', {
defaultMessage: 'Machine learning', defaultMessage: 'Machine Learning',
}), }),
children: [ children: [
{ {
@ -325,133 +325,137 @@ function createNavTree({ streamsAvailable }: { streamsAvailable?: boolean }) {
}, },
], ],
footer: [ 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', type: 'navGroup',
id: 'project_settings_project_nav', id: 'observability_project_nav_footer',
title: i18n.translate('xpack.observability.obltNav.management', {
defaultMessage: 'Management',
}),
icon: 'gear',
breadcrumbStatus: 'hidden',
children: [ 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.addData', {
title: i18n.translate('xpack.observability.obltNav.stackManagement', { defaultMessage: 'Add data',
defaultMessage: 'Stack Management',
}), }),
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, spaceBefore: null,
children: [ 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: [ 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', id: 'monitoring',
children: [ link: 'monitoring',
{ 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', link: 'integrations',
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', link: 'fleet',
children: [
{ link: 'management:overview' },
{ link: 'management:anomaly_detection' },
{ link: 'management:analytics' },
{ link: 'management:trained_models' },
{ link: 'management:supplied_configurations' },
],
}, },
{ {
title: 'Security', id: 'cloudLinkUserAndRoles',
children: [ cloudLink: 'userAndRoles',
{ link: 'management:users' },
{ link: 'management:roles' },
{ link: 'management:api_keys' },
{ link: 'management:role_mappings' },
],
}, },
{ {
title: 'Kibana', id: 'cloudLinkBilling',
children: [ cloudLink: 'billingAndSub',
{ 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: 'monitoring',
link: 'monitoring',
},
{
link: 'integrations',
},
{
link: 'fleet',
},
{
id: 'cloudLinkUserAndRoles',
cloudLink: 'userAndRoles',
},
{
id: 'cloudLinkBilling',
cloudLink: 'billingAndSub',
},
], ],
}, },
], ],

View file

@ -15,7 +15,6 @@ export const createNavigationTree = ({
}): NavigationTreeDefinition => { }): NavigationTreeDefinition => {
return { return {
body: [ body: [
{ type: 'recentlyAccessed' },
{ {
type: 'navGroup', type: 'navGroup',
id: 'observability_project_nav', id: 'observability_project_nav',
@ -173,7 +172,7 @@ export const createNavigationTree = ({
id: 'machine_learning-landing', id: 'machine_learning-landing',
renderAs: 'panelOpener', renderAs: 'panelOpener',
title: i18n.translate('xpack.serverlessObservability.nav.machineLearning', { title: i18n.translate('xpack.serverlessObservability.nav.machineLearning', {
defaultMessage: 'Machine learning', defaultMessage: 'Machine Learning',
}), }),
children: [ children: [
{ {
@ -258,126 +257,134 @@ export const createNavigationTree = ({
}, },
], ],
footer: [ 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', type: 'navGroup',
id: 'project_settings_project_nav', id: 'observability_project_nav_footer',
title: i18n.translate('xpack.serverlessObservability.nav.projectSettings', {
defaultMessage: 'Project settings',
}),
icon: 'gear',
breadcrumbStatus: 'hidden',
children: [ children: [
{ {
id: 'management', title: i18n.translate('xpack.serverlessObservability.nav.getStarted', {
title: i18n.translate('xpack.serverlessObservability.nav.mngt', { defaultMessage: 'Add data',
defaultMessage: 'Management',
}), }),
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, spaceBefore: null,
renderAs: 'panelOpener',
children: [ children: [
{ {
title: i18n.translate('xpack.serverlessObservability.nav.mngt.data', { id: 'management',
defaultMessage: 'Data', title: i18n.translate('xpack.serverlessObservability.nav.mngt', {
defaultMessage: 'Management',
}), }),
breadcrumbStatus: 'hidden', spaceBefore: null,
renderAs: 'panelOpener',
children: [ 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', 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',
},
], ],
}, },
], ],

View file

@ -234,104 +234,110 @@ export const getNavigationTreeDefinition = ({
}, },
], ],
footer: [ footer: [
{ type: 'recentlyAccessed' },
{ {
breadcrumbStatus: 'hidden',
children: [ children: [
{ {
link: 'management:trained_models', breadcrumbStatus: 'hidden',
title: i18n.translate(
'xpack.enterpriseSearch.searchNav.management.trainedModels',
{
defaultMessage: 'Trained Models',
}
),
},
{
children: [ children: [
{ {
children: [ link: 'management:trained_models',
{ link: 'management:ingest_pipelines' }, title: i18n.translate(
{ link: 'management:pipelines' }, 'xpack.enterpriseSearch.searchNav.management.trainedModels',
], {
title: 'Ingest', defaultMessage: 'Trained Models',
}
),
}, },
{ {
children: [ children: [
{ link: 'management:index_management' }, {
{ link: 'management:index_lifecycle_management' }, children: [
{ link: 'management:snapshot_restore' }, { link: 'management:ingest_pipelines' },
{ link: 'management:rollup_jobs' }, { link: 'management:pipelines' },
{ link: 'management:transform' }, ],
{ link: 'management:cross_cluster_replication' }, title: 'Ingest',
{ link: 'management:remote_clusters' }, },
{ link: 'management:migrate_data' }, {
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: [ id: 'monitoring',
{ link: 'management:triggersActions' }, link: 'monitoring',
{ 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: 'stack_management', // This id can't be changed as we use it to open the panel programmatically icon: 'gear',
renderAs: 'panelOpener', id: 'project_settings_project_nav',
renderAs: 'accordion',
spaceBefore: null, spaceBefore: null,
title: i18n.translate('xpack.enterpriseSearch.searchNav.mngt', { title: i18n.translate('xpack.enterpriseSearch.searchNav.management', {
defaultMessage: 'Stack Management', defaultMessage: 'Management',
}), }),
}, },
{
id: 'monitoring',
link: 'monitoring',
},
], ],
icon: 'gear', id: 'search_project_nav_footer',
id: 'project_settings_project_nav',
title: i18n.translate('xpack.enterpriseSearch.searchNav.management', {
defaultMessage: 'Management',
}),
type: 'navGroup', type: 'navGroup',
}, },
], ],

View file

@ -149,127 +149,136 @@ export const navigationTree = ({ isAppRegistered }: ApplicationStart): Navigatio
}, },
], ],
footer: [ footer: [
{
id: 'gettingStarted',
type: 'navItem',
title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', {
defaultMessage: 'Getting Started',
}),
link: 'serverlessElasticsearch',
icon: 'launch',
},
{ {
type: 'navGroup', type: 'navGroup',
id: 'project_settings_project_nav', id: 'search_project_nav_footer',
title: i18n.translate('xpack.serverlessSearch.nav.projectSettings', {
defaultMessage: 'Project settings',
}),
icon: 'gear',
breadcrumbStatus: 'hidden',
children: [ children: [
{ {
link: 'management:trained_models', id: 'gettingStarted',
title: i18n.translate('xpack.serverlessSearch.nav.trainedModels', { title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', {
defaultMessage: 'Trained Models', defaultMessage: 'Getting Started',
}), }),
link: 'serverlessElasticsearch',
icon: 'launch',
}, },
{ {
id: 'management', id: 'project_settings_project_nav',
title: i18n.translate('xpack.serverlessSearch.nav.mngt', { title: i18n.translate('xpack.serverlessSearch.nav.projectSettings', {
defaultMessage: 'Management', defaultMessage: 'Project settings',
}), }),
icon: 'gear',
breadcrumbStatus: 'hidden',
renderAs: 'accordion',
spaceBefore: null, spaceBefore: null,
renderAs: 'panelOpener',
children: [ children: [
{ {
title: i18n.translate('xpack.serverlessSearch.nav.mngt.data', { link: 'management:trained_models',
defaultMessage: 'Data', 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', { id: 'management',
defaultMessage: 'Access', title: i18n.translate('xpack.serverlessSearch.nav.mngt', {
defaultMessage: 'Management',
}), }),
breadcrumbStatus: 'hidden', spaceBefore: null,
renderAs: 'panelOpener',
children: [ children: [
{ link: 'management:api_keys', breadcrumbStatus: 'hidden' },
{ link: 'management:roles', breadcrumbStatus: 'hidden' },
{ {
cloudLink: 'userAndRoles', title: i18n.translate('xpack.serverlessSearch.nav.mngt.data', {
title: i18n.translate('xpack.serverlessSearch.nav.mngt.access.userAndRoles', { defaultMessage: 'Data',
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', breadcrumbStatus: 'hidden',
title: i18n.translate( children: [
'xpack.serverlessSearch.nav.mngt.other.aiAssistantSettings', { link: 'management:index_management', breadcrumbStatus: 'hidden' },
{ defaultMessage: 'AI Assistant Settings' } { 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',
},
], ],
}, },
], ],

View file

@ -63,7 +63,7 @@ export const i18nStrings = {
}, },
ml: { ml: {
title: i18n.translate('securitySolutionPackages.navLinks.ml', { title: i18n.translate('securitySolutionPackages.navLinks.ml', {
defaultMessage: 'Machine learning', defaultMessage: 'Machine Learning',
}), }),
overview: i18n.translate('securitySolutionPackages.navLinks.ml.overview', { overview: i18n.translate('securitySolutionPackages.navLinks.ml.overview', {
defaultMessage: 'Overview', defaultMessage: 'Overview',

View file

@ -75,117 +75,125 @@ export const createNavigationTree = (services: Services): NavigationTreeDefiniti
], ],
footer: [ footer: [
{ {
id: SecurityPageName.landing, id: 'security_solution_nav_footer',
link: securityLink(SecurityPageName.landing),
type: 'navItem',
icon: 'launch',
},
{
type: 'navItem',
link: 'dev_tools',
title: i18nStrings.devTools,
icon: 'editorCodeBlock',
},
{
type: 'navGroup', type: 'navGroup',
title: i18nStrings.management.title,
icon: 'gear',
breadcrumbStatus: 'hidden',
children: [ children: [
{ {
id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically id: SecurityPageName.landing,
title: i18nStrings.stackManagement.title, link: securityLink(SecurityPageName.landing),
renderAs: 'panelOpener', icon: 'launch',
},
{
link: 'dev_tools',
title: i18nStrings.devTools,
icon: 'editorCodeBlock',
},
{
title: i18nStrings.management.title,
icon: 'gear',
breadcrumbStatus: 'hidden',
renderAs: 'accordion',
spaceBefore: null, spaceBefore: null,
children: [ children: [
{ {
title: i18nStrings.stackManagement.ingest.title, id: 'stack_management',
children: [{ link: 'management:ingest_pipelines' }, { link: 'management:pipelines' }], title: i18nStrings.stackManagement.title,
}, renderAs: 'panelOpener',
{ spaceBefore: null,
title: i18nStrings.stackManagement.data.title,
children: [ 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, title: i18nStrings.stackManagement.ingest.title,
link: securityLink(SecurityPageName.entityAnalyticsManagement), children: [
{ link: 'management:ingest_pipelines' },
{ link: 'management:pipelines' },
],
}, },
{ {
id: SecurityPageName.entityAnalyticsEntityStoreManagement, title: i18nStrings.stackManagement.data.title,
link: securityLink(SecurityPageName.entityAnalyticsEntityStoreManagement), 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, link: 'monitoring',
children: [
{ link: 'management:overview' },
{ link: 'management:anomaly_detection' },
{ link: 'management:analytics' },
{ link: 'management:trained_models' },
{ link: 'management:supplied_configurations' },
],
}, },
{ {
title: i18nStrings.stackManagement.security.title, link: 'integrations',
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: 'monitoring',
},
{
link: 'integrations',
},
], ],
}, },
], ],

View file

@ -96,17 +96,21 @@ export const createAiNavigationTree = (): NavigationTreeDefinition => ({
], ],
footer: [ footer: [
{ {
type: 'navItem', id: 'security_solution_ai_nav_footer',
id: SecurityPageName.landing, type: 'navGroup',
link: securityLink(SecurityPageName.landing), children: [
icon: 'launch', {
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(),
], ],
}); });

View file

@ -82,17 +82,21 @@ export const createNavigationTree = (services: Services): NavigationTreeDefiniti
], ],
footer: [ footer: [
{ {
type: 'navItem', id: 'security_solution_nav_footer',
id: SecurityPageName.landing, type: 'navGroup',
link: securityLink(SecurityPageName.landing), children: [
icon: 'launch', {
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(),
], ],
}); });

View file

@ -5,16 +5,17 @@
* 2.0. * 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 { SecurityPageName } from '@kbn/security-solution-navigation';
import { i18nStrings, securityLink } from '@kbn/security-solution-navigation/links'; import { i18nStrings, securityLink } from '@kbn/security-solution-navigation/links';
export const createStackManagementNavigationTree = (): GroupDefinition => ({ export const createStackManagementNavigationTree = (): NodeDefinition => ({
type: 'navGroup',
id: 'category-management', id: 'category-management',
title: i18nStrings.projectSettings.title, title: i18nStrings.projectSettings.title,
icon: 'gear', icon: 'gear',
breadcrumbStatus: 'hidden', breadcrumbStatus: 'hidden',
renderAs: 'accordion',
spaceBefore: null,
children: [ children: [
{ {
id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically

View file

@ -241,9 +241,14 @@ export default function searchSolutionNavigation({
it('renders only expected items', async () => { it('renders only expected items', async () => {
await solutionNavigation.sidenav.openSection('search_project_nav.otherTools'); 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('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([ await solutionNavigation.sidenav.expectOnlyDefinedLinks([
'search_project_nav', 'search_project_nav',
@ -265,6 +270,7 @@ export default function searchSolutionNavigation({
'otherTools', 'otherTools',
'maps', 'maps',
'graph', 'graph',
'search_project_nav_footer',
'project_settings_project_nav', 'project_settings_project_nav',
'management:trained_models', 'management:trained_models',
'stack_management', 'stack_management',

View file

@ -79,7 +79,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
} }
// navigate to a different section // 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.clickLink({ navId: 'stack_management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' });
await solutionNavigation.sidenav.clickPanelLink('management:tags'); await solutionNavigation.sidenav.clickPanelLink('management:tags');

View file

@ -60,7 +60,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
}); });
// navigate to a different section // 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.clickLink({ navId: 'stack_management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' });
await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Data' }); await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Data' });

View file

@ -76,7 +76,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
}); });
// Supplied configurations is under Management -> Anomaly Detection Jobs -> Click button mlSuppliedConfigurationsButton // 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.clickLink({ navId: 'stack_management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' }); await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' });
await solutionNavigation.sidenav.clickPanelLink('management:anomaly_detection'); await solutionNavigation.sidenav.clickPanelLink('management:anomaly_detection');

View file

@ -16,7 +16,9 @@ export function MachineLearningNavigationProviderObservability({
const svlCommonNavigation = getPageObject('svlCommonNavigation'); const svlCommonNavigation = getPageObject('svlCommonNavigation');
async function navigateToArea(id: string, expectedTestSubject: string) { 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 retry.tryForTime(5 * 1000, async () => {
await svlCommonNavigation.sidenav.clickLink({ navId: 'management' }); await svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink(id); await svlCommonNavigation.sidenav.clickPanelLink(id);

View file

@ -16,7 +16,9 @@ export function MachineLearningNavigationProviderSecurity({
const retry = getService('retry'); const retry = getService('retry');
async function navigateToArea(id: string, expectedTestSubject: string) { 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 retry.tryForTime(5 * 1000, async () => {
await svlCommonNavigation.sidenav.clickLink({ navId: 'stack_management' }); await svlCommonNavigation.sidenav.clickLink({ navId: 'stack_management' });
await svlCommonNavigation.sidenav.clickPanelLink(id); await svlCommonNavigation.sidenav.clickPanelLink(id);

View file

@ -32,7 +32,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({
deepLinkId: 'observabilityOnboarding', 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 // navigate to the logs explorer tab by default
await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'discover' }); 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.sidenav.clickLink({ navId: 'observabilityAIAssistant' }); // click on AI Assistant link
await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI Assistant' }); await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI Assistant' });
// navigate to a different section // 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.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.expectLinkActive({ navId: 'management' }); await svlCommonNavigation.sidenav.expectLinkActive({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
@ -59,18 +63,24 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({
deepLinkId: 'observabilityOnboarding', 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(); await expectNoPageReload();
}); });
it('active sidenav section is auto opened on load', async () => { 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.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
await browser.refresh(); await browser.refresh();
await svlCommonNavigation.expectExists(); 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 () => { it('shows cases in sidebar navigation', async () => {
@ -120,7 +130,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
}); });
it('navigates to integrations', async () => { 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.sidenav.clickLink({ deepLinkId: 'integrations' });
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([
'Integrations', 'Integrations',
@ -129,13 +141,17 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
}); });
it('navigates to fleet', async () => { 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.sidenav.clickLink({ deepLinkId: 'fleet' });
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Fleet', 'Agents']); await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Fleet', 'Agents']);
}); });
it('navigates to maintenance windows', async () => { 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.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows'); await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([

View file

@ -29,7 +29,9 @@ export default function ({ getService, getPageObjects, getPageObject }: FtrProvi
describe('page navigation', () => { describe('page navigation', () => {
it('renders trained models list', async () => { 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.clickLink({ deepLinkId: 'management:trained_models' });
await svlCommonNavigation.sidenav.expectLinkActive({ await svlCommonNavigation.sidenav.expectLinkActive({
deepLinkId: 'management:trained_models', deepLinkId: 'management:trained_models',

View file

@ -127,7 +127,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
} }
// Open Project Settings // 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 // check Project Settings
// > Trained Models // > Trained Models
await solutionNavigation.sidenav.clickLink({ await solutionNavigation.sidenav.clickLink({
@ -172,7 +174,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
}); });
it('navigate management', async () => { 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.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags'); await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['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 () => { 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 // Verify all expected top-level links exist
await solutionNavigation.sidenav.expectLinkExists({ text: 'Data' }); await solutionNavigation.sidenav.expectLinkExists({ text: 'Data' });
await solutionNavigation.sidenav.expectLinkExists({ text: 'Index Management' }); 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: 'Performance' });
await solutionNavigation.sidenav.expectLinkExists({ text: 'Billing and subscription' }); 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([ await solutionNavigation.sidenav.expectOnlyDefinedLinks([
'search_project_nav', 'search_project_nav',
'data', 'data',
@ -249,6 +257,7 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
'otherTools', 'otherTools',
'maps', 'maps',
'gettingStarted', 'gettingStarted',
'search_project_nav_footer',
'project_settings_project_nav', 'project_settings_project_nav',
'management:trained_models', 'management:trained_models',
'management', 'management',

View file

@ -19,7 +19,9 @@ export default function ({ getPageObjects }: FtrProviderContext) {
describe('ingest pipelines', function () { describe('ingest pipelines', function () {
before(async () => { before(async () => {
await pageObjects.svlCommonPage.loginWithRole('developer'); 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.clickLink({ navId: 'management' });
await pageObjects.svlCommonNavigation.sidenav.clickPanelLink('management:ingest_pipelines'); await pageObjects.svlCommonNavigation.sidenav.clickPanelLink('management:ingest_pipelines');
}); });

View file

@ -43,7 +43,9 @@ export default ({ getPageObject, getService }: FtrProviderContext) => {
const navigateToConnectors = async () => { const navigateToConnectors = async () => {
await svlSearchNavigation.navigateToLandingPage(); 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 svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await testSubjects.click('app-card-triggersActionsConnectors'); await testSubjects.click('app-card-triggersActionsConnectors');
}; };

View file

@ -78,7 +78,9 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
it('navigates to maintenance windows', async () => { it('navigates to maintenance windows', async () => {
await svlCommonPage.loginAsAdmin(); await svlCommonPage.loginAsAdmin();
await svlSecNavigation.navigateToLandingPage(); 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.clickLink({ navId: 'stack_management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows'); await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([ await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([