From 17a1e78754a036b2671437e9b59b0734385c74e4 Mon Sep 17 00:00:00 2001 From: Tiago Mota Santos Date: Thu, 24 Sep 2020 05:15:57 +0100 Subject: [PATCH] Dashboard: Honour root_url for Explore link (#27654) * Dashboard: Add subUrl to explore url Honour subUrl when opening explore in new window * Dashboard: Add tests to onNavigateToExplore * Dashboard: Remove condition from tests --- .../dashboard/utils/getPanelMenu.test.ts | 68 +++++++++++++++++++ .../features/dashboard/utils/getPanelMenu.ts | 4 +- 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/public/app/features/dashboard/utils/getPanelMenu.test.ts b/public/app/features/dashboard/utils/getPanelMenu.test.ts index c8f93b07a91..8e8b318b8c0 100644 --- a/public/app/features/dashboard/utils/getPanelMenu.test.ts +++ b/public/app/features/dashboard/utils/getPanelMenu.test.ts @@ -1,6 +1,16 @@ +import { PanelMenuItem } from '@grafana/data'; import { DashboardModel, PanelModel } from '../state'; import { getPanelMenu } from './getPanelMenu'; import { describe } from '../../../../test/lib/common'; +import { setStore } from 'app/store/store'; +import config from 'app/core/config'; +import * as actions from 'app/features/explore/state/actions'; + +jest.mock('app/core/services/context_srv', () => ({ + contextSrv: { + hasAccessToExplore: () => true, + }, +})); describe('getPanelMenu', () => { it('should return the correct panel menu items', () => { @@ -28,6 +38,12 @@ describe('getPanelMenu', () => { "shortcut": "p s", "text": "Share", }, + Object { + "iconClassName": "compass", + "onClick": [Function], + "shortcut": "x", + "text": "Explore", + }, Object { "iconClassName": "info-circle", "onClick": [Function], @@ -102,6 +118,12 @@ describe('getPanelMenu', () => { "shortcut": "p s", "text": "Share", }, + Object { + "iconClassName": "compass", + "onClick": [Function], + "shortcut": "x", + "text": "Explore", + }, Object { "iconClassName": "info-circle", "onClick": [Function], @@ -143,4 +165,50 @@ describe('getPanelMenu', () => { `); }); }); + + describe('onNavigateToExplore', () => { + const testSubUrl = '/testSubUrl'; + const testUrl = '/testUrl'; + const windowOpen = jest.fn(); + let event: any; + let explore: PanelMenuItem; + let navigateSpy: any; + + beforeAll(() => { + const panel = new PanelModel({}); + const dashboard = new DashboardModel({}); + const menuItems = getPanelMenu(dashboard, panel); + explore = menuItems.find(item => item.text === 'Explore') as PanelMenuItem; + navigateSpy = jest.spyOn(actions, 'navigateToExplore'); + window.open = windowOpen; + + event = { + ctrlKey: true, + preventDefault: jest.fn(), + }; + + setStore({ dispatch: jest.fn() } as any); + }); + + it('should navigate to url without subUrl', () => { + explore.onClick!(event); + + const openInNewWindow = navigateSpy.mock.calls[0][1].openInNewWindow; + + openInNewWindow(testUrl); + + expect(windowOpen).toHaveBeenLastCalledWith(testUrl); + }); + + it('should navigate to url with subUrl', () => { + config.appSubUrl = testSubUrl; + explore.onClick!(event); + + const openInNewWindow = navigateSpy.mock.calls[0][1].openInNewWindow; + + openInNewWindow(testUrl); + + expect(windowOpen).toHaveBeenLastCalledWith(`${testSubUrl}${testUrl}`); + }); + }); }); diff --git a/public/app/features/dashboard/utils/getPanelMenu.ts b/public/app/features/dashboard/utils/getPanelMenu.ts index 1fc36558e7e..3f97c8dabea 100644 --- a/public/app/features/dashboard/utils/getPanelMenu.ts +++ b/public/app/features/dashboard/utils/getPanelMenu.ts @@ -10,6 +10,7 @@ import { navigateToExplore } from '../../explore/state/actions'; import { getExploreUrl } from '../../../core/utils/explore'; import { getTimeSrv } from '../services/TimeSrv'; import { PanelCtrl } from '../../panel/panel_ctrl'; +import config from 'app/core/config'; export function getPanelMenu( dashboard: DashboardModel, @@ -76,7 +77,8 @@ export function getPanelMenu( const onNavigateToExplore = (event: React.MouseEvent) => { event.preventDefault(); - const openInNewWindow = event.ctrlKey || event.metaKey ? (url: string) => window.open(url) : undefined; + const openInNewWindow = + event.ctrlKey || event.metaKey ? (url: string) => window.open(`${config.appSubUrl}${url}`) : undefined; store.dispatch(navigateToExplore(panel, { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow }) as any); };