diff --git a/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx b/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx index f9f3efdd299f3..08911add0dc62 100644 --- a/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx +++ b/src/plugins/dashboard/public/dashboard_app/dashboard_app.tsx @@ -31,6 +31,7 @@ import { } from './url/search_sessions_integration'; import { DashboardAPI, DashboardRenderer } from '..'; import { type DashboardEmbedSettings } from './types'; +import { DASHBOARD_APP_LOCATOR } from './locator/locator'; import { DASHBOARD_APP_ID } from '../dashboard_constants'; import { pluginServices } from '../services/plugin_services'; import { DashboardTopNav } from './top_nav/dashboard_top_nav'; @@ -64,6 +65,12 @@ export function DashboardApp({ redirectTo, history, }: DashboardAppProps) { + const { + share: { + url: { locators }, + }, + } = pluginServices.getServices(); + const [showNoDataPage, setShowNoDataPage] = useState(false); useMount(() => { @@ -139,6 +146,7 @@ export function DashboardApp({ }; return Promise.resolve({ + locator: locators.get(DASHBOARD_APP_LOCATOR), getIncomingEmbeddable: () => getStateTransfer().getIncomingEmbeddablePackage(DASHBOARD_APP_ID, true), @@ -163,6 +171,7 @@ export function DashboardApp({ }); }, [ history, + locators, embedSettings, validateOutcome, getScopedHistory, diff --git a/src/plugins/dashboard/public/dashboard_container/component/panel_placement/place_new_panel_strategies.ts b/src/plugins/dashboard/public/dashboard_container/component/panel_placement/place_new_panel_strategies.ts index 626a68b433a6a..8a8c8a83193eb 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/panel_placement/place_new_panel_strategies.ts +++ b/src/plugins/dashboard/public/dashboard_container/component/panel_placement/place_new_panel_strategies.ts @@ -16,7 +16,6 @@ export const panelPlacementStrategies = { const otherPanels = { ...currentPanels }; for (const [id, panel] of Object.entries(currentPanels)) { const currentPanel = cloneDeep(panel); - console.log('MOVING PANEL', currentPanel.explicitInput.title); currentPanel.gridData.y = currentPanel.gridData.y + height; otherPanels[id] = currentPanel; } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 39611f244568c..3e5f94ac135c0 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -32,6 +32,7 @@ import { getDefaultControlGroupInput, persistableControlGroupInputIsEqual, } from '@kbn/controls-plugin/common'; +import { LocatorPublic } from '@kbn/share-plugin/common'; import { ExitFullScreenButtonKibanaProvider } from '@kbn/shared-ux-button-exit-full-screen'; import { @@ -44,12 +45,12 @@ import { addOrUpdateEmbeddable, } from './api'; -import { DASHBOARD_CONTAINER_TYPE } from '../..'; import { placePanel } from '../component/panel_placement'; import { pluginServices } from '../../services/plugin_services'; import { initializeDashboard } from './create/create_dashboard'; import { DashboardCreationOptions } from './dashboard_container_factory'; import { DashboardAnalyticsService } from '../../services/analytics/types'; +import { DashboardAppLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; import { DashboardViewport } from '../component/viewport/dashboard_viewport'; import { DashboardPanelState, DashboardContainerInput } from '../../../common'; import { DashboardReduxState, DashboardRenderPerformanceStats } from '../types'; @@ -102,6 +103,7 @@ export class DashboardContainer extends Container; // cleanup public stopSyncingWithUnifiedSearch?: () => void; @@ -155,6 +157,7 @@ export class DashboardContainer extends Container 'valid' | 'invalid' | 'redirected'; isEmbeddedExternally?: boolean; + + locator?: LocatorPublic; // TODO: Should this be a string and the `get` happens in the link embeddable? } export class DashboardContainerFactoryDefinition diff --git a/src/plugins/dashboard/public/services/share/share.stub.ts b/src/plugins/dashboard/public/services/share/share.stub.ts index 70c7e374a393e..74a9e143ebb97 100644 --- a/src/plugins/dashboard/public/services/share/share.stub.ts +++ b/src/plugins/dashboard/public/services/share/share.stub.ts @@ -15,6 +15,7 @@ export const shareServiceFactory: ShareServiceFactory = () => { const pluginMock = sharePluginMock.createStartContract(); return { + url: pluginMock.url, toggleShareContextMenu: pluginMock.toggleShareContextMenu, }; }; diff --git a/src/plugins/dashboard/public/services/share/share_services.ts b/src/plugins/dashboard/public/services/share/share_services.ts index b96ba0d8f412e..5349a1d6d32da 100644 --- a/src/plugins/dashboard/public/services/share/share_services.ts +++ b/src/plugins/dashboard/public/services/share/share_services.ts @@ -19,9 +19,10 @@ export const shareServiceFactory: ShareServiceFactory = ({ startPlugins }) => { const { share } = startPlugins; if (!share) return {}; - const { toggleShareContextMenu } = share; + const { toggleShareContextMenu, url } = share; return { + url, toggleShareContextMenu, }; }; diff --git a/src/plugins/dashboard/public/services/share/types.ts b/src/plugins/dashboard/public/services/share/types.ts index 5920b4b3bcbc4..e78719dc51c20 100644 --- a/src/plugins/dashboard/public/services/share/types.ts +++ b/src/plugins/dashboard/public/services/share/types.ts @@ -9,5 +9,6 @@ import { SharePluginStart } from '@kbn/share-plugin/public'; export interface DashboardShareService { + url: SharePluginStart['url']; toggleShareContextMenu?: SharePluginStart['toggleShareContextMenu']; } diff --git a/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_component.tsx b/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_component.tsx index 71627054ea430..f0eb3c70f07c0 100644 --- a/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_component.tsx +++ b/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_component.tsx @@ -17,16 +17,17 @@ import { } from '@kbn/presentation-util-plugin/public'; import { EuiButtonEmpty, EuiListGroupItem } from '@elastic/eui'; import { DashboardContainer } from '@kbn/dashboard-plugin/public/dashboard_container'; +import { DashboardAppLocatorParams, getEmbeddableParams } from '@kbn/dashboard-plugin/public'; import { NAV_VERTICAL_LAYOUT, NavigationLayoutType, NavigationEmbeddableLink, } from '../../../common/content_management'; -import { coreServices } from '../../services/kibana_services'; +import { fetchDashboard } from './dashboard_link_tools'; +import { dashboardServices } from '../../services/kibana_services'; import { DashboardLinkStrings } from './dashboard_link_strings'; import { useNavigationEmbeddable } from '../../embeddable/navigation_embeddable'; -import { fetchDashboard, getDashboardHref, getDashboardLocator } from './dashboard_link_tools'; export const DashboardLinkComponent = ({ link, @@ -103,13 +104,15 @@ export const DashboardLinkComponent = ({ ...link.options, } as DashboardDrilldownOptions; - const locator = await getDashboardLocator({ - link: { ...link, options: linkOptions }, - navEmbeddable, - }); + const params: DashboardAppLocatorParams = { + dashboardId: link.destination, + ...getEmbeddableParams(navEmbeddable, linkOptions), + }; + + const locator = dashboardServices.locator; if (!locator) return; - const href = getDashboardHref(locator); + const href = locator.getRedirectUrl(params); return { href, onClick: async (event: React.MouseEvent) => { @@ -127,11 +130,7 @@ export const DashboardLinkComponent = ({ if (linkOptions.openInNewTab) { window.open(href, '_blank'); } else { - const { app, path, state } = locator; - await coreServices.application.navigateToApp(app, { - path, - state, - }); + locator.navigate(params); } }, }; diff --git a/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_tools.ts b/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_tools.ts index a8a5eaa04b28d..9081b17815320 100644 --- a/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_tools.ts +++ b/src/plugins/navigation_embeddable/public/components/dashboard_link/dashboard_link_tools.ts @@ -8,20 +8,8 @@ import { isEmpty, filter } from 'lodash'; -import { - cleanEmptyKeys, - getEmbeddableParams, - DashboardAppLocatorParams, -} from '@kbn/dashboard-plugin/public'; -import { isFilterPinned } from '@kbn/es-query'; -import { KibanaLocation } from '@kbn/share-plugin/public'; -import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/public'; -import { DashboardDrilldownOptions } from '@kbn/presentation-util-plugin/public'; - import { DashboardItem } from '../../embeddable/types'; -import { NavigationEmbeddable } from '../../embeddable'; -import { NavigationEmbeddableLink } from '../../../common/content_management'; -import { coreServices, dashboardServices } from '../../services/kibana_services'; +import { dashboardServices } from '../../services/kibana_services'; /** * ---------------------------------- @@ -96,56 +84,3 @@ export const fetchDashboards = async ({ return simplifiedDashboardList; }; - -/** - * ---------------------------------- - * Navigate from one dashboard to another - * ---------------------------------- - */ - -interface GetDashboardLocatorProps { - link: NavigationEmbeddableLink & { options: DashboardDrilldownOptions }; - navEmbeddable: NavigationEmbeddable; -} - -/** - * Fetch the locator to use for dashboard navigation - * @param props `GetDashboardLocatorProps` - * @returns The locator to use for dashboard navigation - */ -export const getDashboardLocator = async ({ link, navEmbeddable }: GetDashboardLocatorProps) => { - const params: DashboardAppLocatorParams = { - dashboardId: link.destination, - ...getEmbeddableParams(navEmbeddable, link.options), - }; - - const locator = dashboardServices.locator; // TODO: Make this generic as part of https://github.com/elastic/kibana/issues/164748 - if (locator) { - const location: KibanaLocation = await locator.getLocation(params); - return location; - } -}; - -/** - * Get URL for dashboard app - should only be used when relying on native `href` functionality - * @param locator Locator that should be used to get the URL - * @returns A full URL to the dashboard, with all state included - */ -export const getDashboardHref = ({ - app, - path, - state, -}: KibanaLocation): string => { - return coreServices.application.getUrlForApp(app, { - path: setStateToKbnUrl( - '_a', - cleanEmptyKeys({ - query: state.query, - filters: state.filters?.filter((f) => !isFilterPinned(f)), - }), - { useHash: false, storeInHashQuery: true }, - path - ), - absolute: true, - }); -}; diff --git a/src/plugins/navigation_embeddable/tsconfig.json b/src/plugins/navigation_embeddable/tsconfig.json index e5c172f210048..c6613df8f3495 100644 --- a/src/plugins/navigation_embeddable/tsconfig.json +++ b/src/plugins/navigation_embeddable/tsconfig.json @@ -21,8 +21,6 @@ "@kbn/core-saved-objects-server", "@kbn/saved-objects-plugin", "@kbn/ui-actions-enhanced-plugin", - "@kbn/es-query", - "@kbn/share-plugin", "@kbn/kibana-utils-plugin", "@kbn/utility-types", "@kbn/ui-actions-plugin"