Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export type ManagementId =
| 'cross_cluster_replication'
| 'dataViews'
| 'data_quality'
| 'data_usage'
| 'filesManagement'
| 'license_management'
| 'index_lifecycle_management'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,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',
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -355,10 +355,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',
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@elastic/kibana-management it looks like this structure has a more official source of truth within the Management plugin, but it is not accessible to outside plugins [1]. Is there a chance we could update the public start contract of the Management plugin so I wouldn't need this declaration? I am worried this information could be missing a critical link, or become out of date.

[1] Per: https://github.com/elastic/kibana/blob/2fd8994/src/platform/plugins/shared/management/public/management_sections_service.ts#L51

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tsullivan I'm sure this can be improved but I think the code is a good representation of the group dynamics that produced it - stateful kibana has a way of expressing management app listing and solutions want to control their own listing completely independent of whatever stateful is doing. We could certainly expose some management content but its unclear to me how this would be helpful.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @mattkime. I have recently taken over this code and I wanted to make sure that there isn't an obvious alternative to this implementation that would be better. It sounds like keeping solutions in control of their own listing is what we should keep doing.

stateful kibana has a way of expressing management app listing

It could be pointed out that independent control isn't just an issue for serverless. The Solution Nav is used in stateful deployments when the Space uses a Solution view, and the listing of management apps is completely controlled by the solution there as well. That goes back prior to this PR, though.

}),
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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,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', {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,10 +167,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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Had to add this, because the breadcrumbs will not say Stack Management unless the user navigates to a management. The Tags app was chosen arbitrarily.

await solutionNavigation.breadcrumbs.expectBreadcrumbExists({ text: 'Stack Management' });

// navigate back to the home page using header logo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ 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.breadcrumbs.expectBreadcrumbExists({ text: 'Stack Management' });

// navigate back to the home page using header logo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,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();
Expand All @@ -65,7 +66,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');
Expand Down Expand Up @@ -134,8 +136,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',
Expand Down
23 changes: 10 additions & 13 deletions x-pack/test_serverless/functional/test_suites/search/navigation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,16 +164,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();
Expand Down Expand Up @@ -206,9 +200,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']);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down