[8.x] [Solution nav] Use flyout for Stack Management in Search and Observability solutions (#208632) (#210630)

# Backport

This will backport the following commits from `main` to `8.x`:
- [[Solution nav] Use flyout for Stack Management in Search and
Observability solutions
(#208632)](https://github.com/elastic/kibana/pull/208632)

<!--- Backport version: 9.4.3 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Tim
Sullivan","email":"tsullivan@users.noreply.github.com"},"sourceCommit":{"committedDate":"2025-02-11T16:14:32Z","message":"[Solution
nav] Use flyout for Stack Management in Search and Observability
solutions (#208632)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/208636\r\nPart of
https://github.com/elastic/kibana-team/issues/1439\r\n\r\n###
Checklist\r\n\r\nCheck the PR satisfies following conditions.
\r\n\r\nReviewers should verify this PR satisfies this list as
well.\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n### Identify
risks\r\n\r\nDoes this PR introduce any risks? For example, consider
risks like hard\r\nto test bugs, performance regression, potential of
data loss.\r\n\r\nDescribe the risk, its severity, and mitigation for
each identified\r\nrisk. Invite stakeholders and evaluate how to proceed
before merging.\r\n\r\n- [ ] New lists of Stack Management navigation
items were added for\r\nflyout menus in serverless projects using static
declarations. There is\r\na risk that these lists have missing items,
which could hurt user\r\nexperience by making the pages harder to
navigate to.\r\n\r\n### Screenshots\r\n<details><summary>Observability /
Serverless</summary>\r\n\r\n![optimized-serverless-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/03d40840-385c-4a89-a181-a9b5ba82f820)\r\n\r\n</details>\r\n<details><summary>Observability
/ Stateful</summary>\r\n\r\n![optimized-stateful-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/e267e87a-584c-406d-8fea-99788fb2c0dd)\r\n\r\n</details>\r\n<details><summary>Search
/ Serverless</summary>\r\n\r\n![optimized-serverless-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/258da8ec-5144-4439-b29f-b894b28963ad)\r\n\r\n</details>\r\n<details><summary>Search
/ Stateful</summary>\r\n\r\n![optimized-stateful-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/fd6db7bb-536b-4804-950b-00f6716663ac)","sha":"f16446486c7695a13f564d53f7d630337a9a50e8","branchLabelMapping":{"^v9.1.0$":"main","^v8.19.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","Team:SharedUX","ci:project-deploy-observability","Team:obs-ux-management","backport:version","v8.18.0","v9.1.0","v8.19.0"],"title":"[Solution
nav] Use flyout for Stack Management in Search and Observability
solutions","number":208632,"url":"https://github.com/elastic/kibana/pull/208632","mergeCommit":{"message":"[Solution
nav] Use flyout for Stack Management in Search and Observability
solutions (#208632)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/208636\r\nPart of
https://github.com/elastic/kibana-team/issues/1439\r\n\r\n###
Checklist\r\n\r\nCheck the PR satisfies following conditions.
\r\n\r\nReviewers should verify this PR satisfies this list as
well.\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n### Identify
risks\r\n\r\nDoes this PR introduce any risks? For example, consider
risks like hard\r\nto test bugs, performance regression, potential of
data loss.\r\n\r\nDescribe the risk, its severity, and mitigation for
each identified\r\nrisk. Invite stakeholders and evaluate how to proceed
before merging.\r\n\r\n- [ ] New lists of Stack Management navigation
items were added for\r\nflyout menus in serverless projects using static
declarations. There is\r\na risk that these lists have missing items,
which could hurt user\r\nexperience by making the pages harder to
navigate to.\r\n\r\n### Screenshots\r\n<details><summary>Observability /
Serverless</summary>\r\n\r\n![optimized-serverless-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/03d40840-385c-4a89-a181-a9b5ba82f820)\r\n\r\n</details>\r\n<details><summary>Observability
/ Stateful</summary>\r\n\r\n![optimized-stateful-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/e267e87a-584c-406d-8fea-99788fb2c0dd)\r\n\r\n</details>\r\n<details><summary>Search
/ Serverless</summary>\r\n\r\n![optimized-serverless-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/258da8ec-5144-4439-b29f-b894b28963ad)\r\n\r\n</details>\r\n<details><summary>Search
/ Stateful</summary>\r\n\r\n![optimized-stateful-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/fd6db7bb-536b-4804-950b-00f6716663ac)","sha":"f16446486c7695a13f564d53f7d630337a9a50e8"}},"sourceBranch":"main","suggestedTargetBranches":["9.0","8.18","8.x"],"targetPullRequestStates":[{"branch":"9.0","label":"v9.0.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"8.18","label":"v8.18.0","branchLabelMappingKey":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/208632","number":208632,"mergeCommit":{"message":"[Solution
nav] Use flyout for Stack Management in Search and Observability
solutions (#208632)\n\n## Summary\r\n\r\nCloses
https://github.com/elastic/kibana/issues/208636\r\nPart of
https://github.com/elastic/kibana-team/issues/1439\r\n\r\n###
Checklist\r\n\r\nCheck the PR satisfies following conditions.
\r\n\r\nReviewers should verify this PR satisfies this list as
well.\r\n\r\n- [x] [Unit or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n### Identify
risks\r\n\r\nDoes this PR introduce any risks? For example, consider
risks like hard\r\nto test bugs, performance regression, potential of
data loss.\r\n\r\nDescribe the risk, its severity, and mitigation for
each identified\r\nrisk. Invite stakeholders and evaluate how to proceed
before merging.\r\n\r\n- [ ] New lists of Stack Management navigation
items were added for\r\nflyout menus in serverless projects using static
declarations. There is\r\na risk that these lists have missing items,
which could hurt user\r\nexperience by making the pages harder to
navigate to.\r\n\r\n### Screenshots\r\n<details><summary>Observability /
Serverless</summary>\r\n\r\n![optimized-serverless-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/03d40840-385c-4a89-a181-a9b5ba82f820)\r\n\r\n</details>\r\n<details><summary>Observability
/ Stateful</summary>\r\n\r\n![optimized-stateful-observability 4
48\r\n01 PM](https://github.com/user-attachments/assets/e267e87a-584c-406d-8fea-99788fb2c0dd)\r\n\r\n</details>\r\n<details><summary>Search
/ Serverless</summary>\r\n\r\n![optimized-serverless-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/258da8ec-5144-4439-b29f-b894b28963ad)\r\n\r\n</details>\r\n<details><summary>Search
/ Stateful</summary>\r\n\r\n![optimized-stateful-search 4
48\r\n01 PM](https://github.com/user-attachments/assets/fd6db7bb-536b-4804-950b-00f6716663ac)","sha":"f16446486c7695a13f564d53f7d630337a9a50e8"}},{"branch":"8.x","label":"v8.19.0","branchLabelMappingKey":"^v8.19.0$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

---------

Co-authored-by: Tim Sullivan <tsullivan@users.noreply.github.com>
Co-authored-by: Timothy Sullivan <tsullivan@elastic.co>
This commit is contained in:
Kibana Machine 2025-02-12 10:45:19 +11:00 committed by GitHub
parent fae24a980f
commit 530f5329c4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 168 additions and 29 deletions

View file

@ -36,6 +36,7 @@ export type ManagementId =
| 'cross_cluster_replication'
| 'dataViews'
| 'data_quality'
| 'data_usage'
| 'filesManagement'
| 'license_management'
| 'index_lifecycle_management'

View file

@ -465,7 +465,6 @@ function createNavTree({ streamsAvailable }: { streamsAvailable?: boolean }) {
children: [
{
id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically
link: 'management',
title: i18n.translate('xpack.observability.obltNav.stackManagement', {
defaultMessage: 'Stack Management',
}),

View file

@ -368,10 +368,73 @@ export const createNavigationTree = ({
breadcrumbStatus: 'hidden',
children: [
{
link: 'management',
id: 'management',
title: i18n.translate('xpack.serverlessObservability.nav.mngt', {
defaultMessage: 'Management',
}),
spaceBefore: null,
renderAs: 'panelOpener',
children: [
{
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',
},
],
},
],
},
{
link: 'integrations',

View file

@ -358,7 +358,6 @@ export const getNavigationTreeDefinition = ({
},
],
id: 'stack_management', // This id can't be changed as we use it to open the panel programmatically
link: 'management',
renderAs: 'panelOpener',
spaceBefore: null,
title: i18n.translate('xpack.enterpriseSearch.searchNav.mngt', {

View file

@ -163,10 +163,86 @@ export const navigationTree = ({ isAppRegistered }: ApplicationStart): Navigatio
}),
},
{
link: 'management',
id: 'management',
title: i18n.translate('xpack.serverlessSearch.nav.mngt', {
defaultMessage: 'Management',
}),
spaceBefore: null,
renderAs: 'panelOpener',
children: [
{
title: i18n.translate('xpack.serverlessSearch.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.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: 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',

View file

@ -80,8 +80,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
// navigate to a different section
await solutionNavigation.sidenav.openSection('project_settings_project_nav');
await solutionNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await solutionNavigation.sidenav.expectLinkActive({ deepLinkId: 'management' });
await solutionNavigation.sidenav.clickLink({ navId: 'stack_management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' });
await solutionNavigation.sidenav.clickPanelLink('management:tags');
await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Stack Management' });
// navigate back to the home page using header logo

View file

@ -62,8 +62,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) {
// navigate to a different section
await solutionNavigation.sidenav.openSection('project_settings_project_nav');
await solutionNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await solutionNavigation.sidenav.expectLinkActive({ deepLinkId: 'management' });
await solutionNavigation.sidenav.clickLink({ navId: 'stack_management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'stack_management' });
await solutionNavigation.sidenav.clickPanelLink('management:tags');
await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Stack Management' });
// navigate back to the home page using header logo

View file

@ -50,9 +50,10 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'AI Assistant' });
// navigate to a different section
await svlCommonNavigation.sidenav.openSection('project_settings_project_nav');
await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'management' });
await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'management' });
await svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.expectLinkActive({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management', 'Tags']);
// navigate back to serverless oblt overview
await svlCommonNavigation.clickLogo();
@ -66,7 +67,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
it('active sidenav section is auto opened on load', async () => {
await svlCommonNavigation.sidenav.openSection('project_settings_project_nav');
await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
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');
@ -135,8 +137,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
it('navigates to maintenance windows', async () => {
await svlCommonNavigation.sidenav.openSection('project_settings_project_nav');
await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await testSubjects.click('app-card-maintenanceWindows');
await svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:maintenanceWindows');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts([
'Management',
'Maintenance Windows',

View file

@ -184,16 +184,10 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
deepLinkId: 'ml:modelManagement',
});
// > Management
await solutionNavigation.sidenav.clickLink({
deepLinkId: 'management',
});
await solutionNavigation.sidenav.expectLinkActive({
deepLinkId: 'management',
});
await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Management' });
await solutionNavigation.breadcrumbs.expectBreadcrumbExists({
deepLinkId: 'management',
});
await solutionNavigation.sidenav.clickLink({ navId: 'management' });
await solutionNavigation.sidenav.expectLinkActive({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management', 'Tags']);
// navigate back to serverless search overview
await svlCommonNavigation.clickLogo();
@ -226,9 +220,12 @@ export default function ({ getPageObject, getService }: FtrProviderContext) {
it('navigate management', async () => {
await svlCommonNavigation.sidenav.openSection('project_settings_project_nav');
await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management']);
await testSubjects.click('app-card-dataViews');
await svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:tags');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management', 'Tags']);
await svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await svlCommonNavigation.sidenav.clickPanelLink('management:dataViews');
await svlCommonNavigation.breadcrumbs.expectBreadcrumbTexts(['Management', 'Data views']);
});

View file

@ -20,8 +20,8 @@ export default function ({ getPageObjects }: FtrProviderContext) {
before(async () => {
await pageObjects.svlCommonPage.loginWithRole('developer');
await pageObjects.svlCommonNavigation.sidenav.openSection('project_settings_project_nav');
await pageObjects.svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'management' });
await pageObjects.svlManagementPage.clickIngestPipelinesManagementCard();
await pageObjects.svlCommonNavigation.sidenav.clickLink({ navId: 'management' });
await pageObjects.svlCommonNavigation.sidenav.clickPanelLink('management:ingest_pipelines');
});
it('has embedded console', async () => {