Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Serverless] Partially fix lens/maps/visualize breadcrumbs missing title #163476

Merged
merged 6 commits into from
Aug 11, 2023
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
3 changes: 2 additions & 1 deletion src/plugins/visualizations/kibana.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
"home",
"share",
"spaces",
"savedObjectsTaggingOss"
"savedObjectsTaggingOss",
"serverless"
],
"requiredBundles": [
"kibanaUtils",
Expand Down
3 changes: 3 additions & 0 deletions src/plugins/visualizations/public/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import type { SpacesPluginStart } from '@kbn/spaces-plugin/public';
import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public';
import { SavedObjectsManagementPluginStart } from '@kbn/saved-objects-management-plugin/public';
import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public';
import type { ServerlessPluginStart } from '@kbn/serverless/public';
import {
ContentManagementPublicSetup,
ContentManagementPublicStart,
Expand Down Expand Up @@ -164,6 +165,7 @@ export interface VisualizationsStartDeps {
usageCollection: UsageCollectionStart;
savedObjectsManagement: SavedObjectsManagementPluginStart;
contentManagement: ContentManagementPublicStart;
serverless?: ServerlessPluginStart;
}

/**
Expand Down Expand Up @@ -327,6 +329,7 @@ export class VisualizationsPlugin
visEditorsRegistry,
listingViewRegistry,
unifiedSearch: pluginsStart.unifiedSearch,
serverless: pluginsStart.serverless,
};

params.element.classList.add('visAppWrapper');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ export const VisualizeListing = () => {
uiSettings,
kbnUrlStateStorage,
listingViewRegistry,
serverless,
},
} = useKibana<VisualizeServices>();
const { pathname } = useLocation();
Expand Down Expand Up @@ -298,13 +299,20 @@ export const VisualizeListing = () => {
useMount(() => {
// Reset editor state for all apps if the visualize listing page is loaded.
stateTransferService.clearEditorState();
chrome.setBreadcrumbs([
{
text: i18n.translate('visualizations.visualizeListingBreadcrumbsTitle', {
defaultMessage: 'Visualize Library',
}),
},
]);
if (serverless?.setBreadcrumbs) {
// reset any deeper context breadcrumbs
// "Visualization" breadcrumb is set automatically by the serverless navigation
serverless.setBreadcrumbs([]);
} else {
chrome.setBreadcrumbs([
{
text: i18n.translate('visualizations.visualizeListingBreadcrumbsTitle', {
defaultMessage: 'Visualize Library',
}),
},
]);
}

chrome.docTitle.change(
i18n.translate('visualizations.listingPageTitle', { defaultMessage: 'Visualize Library' })
);
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/visualizations/public/visualize_app/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/
import type { SpacesPluginStart } from '@kbn/spaces-plugin/public';
import type { SavedObjectsTaggingApi } from '@kbn/saved-objects-tagging-oss-plugin/public';
import type { SavedSearch, SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public';
import type { ServerlessPluginStart } from '@kbn/serverless/public';
import type {
Vis,
VisualizeEmbeddableContract,
Expand Down Expand Up @@ -115,6 +116,7 @@ export interface VisualizeServices extends CoreStart {
visEditorsRegistry: VisEditorsRegistry;
listingViewRegistry: ListingViewRegistry;
unifiedSearch: UnifiedSearchPublicPluginStart;
serverless?: ServerlessPluginStart;
}

export interface VisInstance {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,28 @@ export function getCreateBreadcrumbs({
];
}

export function getCreateServerlessBreadcrumbs({
byValue,
originatingAppName,
redirectToOrigin,
}: {
byValue?: boolean;
originatingAppName?: string;
redirectToOrigin?: () => void;
}) {
// TODO: https://github.com/elastic/kibana/issues/163488
// for now, serverless breadcrumbs only set the title,
// the rest of the breadcrumbs are handled by the serverless navigation
// the serverless navigation is not yet aware of the byValue/originatingApp context
return [
{
text: i18n.translate('visualizations.editor.createBreadcrumb', {
defaultMessage: 'Create',
}),
},
];
}

export function getEditBreadcrumbs(
{
byValue,
Expand All @@ -65,3 +87,26 @@ export function getEditBreadcrumbs(
},
];
}

export function getEditServerlessBreadcrumbs(
{
byValue,
originatingAppName,
redirectToOrigin,
}: {
byValue?: boolean;
originatingAppName?: string;
redirectToOrigin?: () => void;
},
title: string = defaultEditText
) {
// TODO: https://github.com/elastic/kibana/issues/163488
// for now, serverless breadcrumbs only set the title,
// the rest of the breadcrumbs are handled by the serverless navigation
// the serverless navigation is not yet aware of the byValue/originatingApp context
return [
{
text: title,
},
];
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import {
VisualizeEditorVisInstance,
} from '../types';
import { VisualizeConstants } from '../../../common/constants';
import { getEditBreadcrumbs } from './breadcrumbs';
import { getEditBreadcrumbs, getEditServerlessBreadcrumbs } from './breadcrumbs';
import { VISUALIZE_APP_LOCATOR, VisualizeLocatorParams } from '../../../common/locator';
import { getUiActions } from '../../services';
import { VISUALIZE_EDITOR_TRIGGER, AGG_BASED_VISUALIZATION_TRIGGER } from '../../triggers';
Expand Down Expand Up @@ -117,6 +117,7 @@ export const getTopNavConfig = (
savedObjectsTagging,
presentationUtil,
getKibanaVersion,
serverless,
}: VisualizeServices
) => {
const { vis, embeddableHandler } = visInstance;
Expand Down Expand Up @@ -202,7 +203,11 @@ export const getTopNavConfig = (
stateTransfer.clearEditorState(VisualizeConstants.APP_ID);
}
chrome.docTitle.change(savedVis.lastSavedTitle);
chrome.setBreadcrumbs(getEditBreadcrumbs({}, savedVis.lastSavedTitle));
if (serverless?.setBreadcrumbs) {
serverless.setBreadcrumbs(getEditServerlessBreadcrumbs({}, savedVis.lastSavedTitle));
} else {
chrome.setBreadcrumbs(getEditBreadcrumbs({}, savedVis.lastSavedTitle));
}

if (id !== visualizationIdFromUrl) {
history.replace({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@ import { parse } from 'query-string';
import { i18n } from '@kbn/i18n';

import { getVisualizationInstance } from '../get_visualization_instance';
import { getEditBreadcrumbs, getCreateBreadcrumbs } from '../breadcrumbs';
import {
getEditBreadcrumbs,
getCreateBreadcrumbs,
getCreateServerlessBreadcrumbs,
getEditServerlessBreadcrumbs,
} from '../breadcrumbs';
import { SavedVisInstance, VisualizeServices, IEditorController } from '../../types';
import { VisualizeConstants } from '../../../../common/constants';
import { getTypes } from '../../../services';
Expand Down Expand Up @@ -46,6 +51,7 @@ export const useSavedVisInstance = (
stateTransferService,
visEditorsRegistry,
application: { navigateToApp },
serverless,
} = services;
const getSavedVisInstance = async () => {
try {
Expand Down Expand Up @@ -104,18 +110,35 @@ export const useSavedVisInstance = (
const redirectToOrigin = originatingApp ? () => navigateToApp(originatingApp) : undefined;

if (savedVis.id) {
chrome.setBreadcrumbs(
getEditBreadcrumbs({ originatingAppName, redirectToOrigin }, savedVis.title)
);
if (serverless?.setBreadcrumbs) {
serverless.setBreadcrumbs(
getEditServerlessBreadcrumbs({ originatingAppName, redirectToOrigin }, savedVis.title)
);
} else {
chrome.setBreadcrumbs(
getEditBreadcrumbs({ originatingAppName, redirectToOrigin }, savedVis.title)
);
}

chrome.docTitle.change(savedVis.title);
} else {
chrome.setBreadcrumbs(
getCreateBreadcrumbs({
byValue: Boolean(originatingApp),
originatingAppName,
redirectToOrigin,
})
);
if (serverless?.setBreadcrumbs) {
serverless.setBreadcrumbs(
getCreateServerlessBreadcrumbs({
byValue: Boolean(originatingApp),
originatingAppName,
redirectToOrigin,
})
);
} else {
chrome.setBreadcrumbs(
getCreateBreadcrumbs({
byValue: Boolean(originatingApp),
originatingAppName,
redirectToOrigin,
})
);
}
}

let visEditorController;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { useEffect, useRef, useState } from 'react';
import { VisualizeInput } from '../../..';
import { ByValueVisInstance, VisualizeServices, IEditorController } from '../../types';
import { getVisualizationInstanceFromInput } from '../get_visualization_instance';
import { getEditBreadcrumbs } from '../breadcrumbs';
import { getEditBreadcrumbs, getEditServerlessBreadcrumbs } from '../breadcrumbs';

export const useVisByValue = (
services: VisualizeServices,
Expand All @@ -33,6 +33,7 @@ export const useVisByValue = (
application: { navigateToApp },
stateTransferService,
visEditorsRegistry,
serverless,
} = services;
const getVisInstance = async () => {
if (!valueInput || loaded.current || !visEditorRef.current) {
Expand All @@ -59,9 +60,16 @@ export const useVisByValue = (
const redirectToOrigin = originatingApp
? () => navigateToApp(originatingApp, { path: originatingPath })
: undefined;
chrome?.setBreadcrumbs(
getEditBreadcrumbs({ byValue: true, originatingAppName, redirectToOrigin })
);

if (serverless?.setBreadcrumbs) {
serverless.setBreadcrumbs(
getEditServerlessBreadcrumbs({ byValue: true, originatingAppName, redirectToOrigin })
);
} else {
chrome?.setBreadcrumbs(
getEditBreadcrumbs({ byValue: true, originatingAppName, redirectToOrigin })
);
}

loaded.current = true;
setState({
Expand Down
3 changes: 2 additions & 1 deletion src/plugins/visualizations/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@
"@kbn/content-management-table-list-view-table",
"@kbn/content-management-tabbed-table-list-view",
"@kbn/content-management-table-list-view",
"@kbn/content-management-utils"
"@kbn/content-management-utils",
"@kbn/serverless"
],
"exclude": [
"target/**/*",
Expand Down
3 changes: 2 additions & 1 deletion x-pack/plugins/lens/kibana.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@
"taskManager",
"globalSearch",
"savedObjectsTagging",
"spaces"
"spaces",
"serverless"
],
"requiredBundles": [
"unifiedSearch",
Expand Down
25 changes: 25 additions & 0 deletions x-pack/plugins/lens/public/app_plugin/app.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import { TopNavMenuData } from '@kbn/navigation-plugin/public';
import { LensByValueInput } from '../embeddable/embeddable';
import { SavedObjectReference } from '@kbn/core/types';
import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { serverlessMock } from '@kbn/serverless/public/mocks';
import moment from 'moment';

import { setState, LensAppState } from '../state_management';
Expand Down Expand Up @@ -365,6 +366,30 @@ describe('Lens App', () => {
{ text: 'Daaaaaaadaumching!' },
]);
});

it('sets serverless breadcrumbs when the document title changes when serverless service is available', async () => {
const serverless = serverlessMock.createStart();
const { instance, services, lensStore } = await mountWith({
services: {
...makeDefaultServices(),
serverless,
},
});
expect(services.chrome.setBreadcrumbs).not.toHaveBeenCalled();
expect(serverless.setBreadcrumbs).toHaveBeenCalledWith({ text: 'Create' });

await act(async () => {
instance.setProps({ initialInput: { savedObjectId: breadcrumbDocSavedObjectId } });
lensStore.dispatch(
setState({
persistedDoc: breadcrumbDoc,
})
);
});

expect(services.chrome.setBreadcrumbs).not.toHaveBeenCalled();
expect(serverless.setBreadcrumbs).toHaveBeenCalledWith({ text: 'Daaaaaaadaumching!' });
});
});

describe('TopNavMenu#showDatePicker', () => {
Expand Down
16 changes: 14 additions & 2 deletions x-pack/plugins/lens/public/app_plugin/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export function App({
dashboardFeatureFlag,
locator,
share,
serverless,
} = lensAppServices;

const saveAndExit = useRef<() => void>();
Expand Down Expand Up @@ -288,8 +289,18 @@ export function App({
},
});
}
breadcrumbs.push({ text: currentDocTitle });
chrome.setBreadcrumbs(breadcrumbs);

const currentDocBreadcrumb: EuiBreadcrumb = { text: currentDocTitle };
breadcrumbs.push(currentDocBreadcrumb);
if (serverless?.setBreadcrumbs) {
// TODO: https://github.com/elastic/kibana/issues/163488
// for now, serverless breadcrumbs only set the title,
// the rest of the breadcrumbs are handled by the serverless navigation
// the serverless navigation is not yet aware of the byValue/originatingApp context
serverless.setBreadcrumbs(currentDocBreadcrumb);
} else {
chrome.setBreadcrumbs(breadcrumbs);
}
}, [
dashboardFeatureFlag.allowByValueEmbeddables,
getOriginatingAppName,
Expand All @@ -300,6 +311,7 @@ export function App({
isLinkedToOriginatingApp,
persistedDoc,
initialContext,
serverless,
]);

const switchDatasource = useCallback(() => {
Expand Down
2 changes: 2 additions & 0 deletions x-pack/plugins/lens/public/app_plugin/mounter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ export async function getLensServices(
spaces,
share,
unifiedSearch,
serverless,
} = startDependencies;

const storage = new Storage(localStorage);
Expand Down Expand Up @@ -147,6 +148,7 @@ export async function getLensServices(
unifiedSearch,
docLinks: coreStart.docLinks,
locator,
serverless,
};
}

Expand Down
Loading