diff --git a/public/app/core/services/global_event_srv.ts b/public/app/core/services/global_event_srv.ts index a4d5865eb63..5cc21dc7b7a 100644 --- a/public/app/core/services/global_event_srv.ts +++ b/public/app/core/services/global_event_srv.ts @@ -1,19 +1,35 @@ import coreModule from 'app/core/core_module'; +import config from 'app/core/config'; import appEvents from 'app/core/app_events'; // This service is for registering global events. // Good for communication react > angular and vice verse export class GlobalEventSrv { + private appSubUrl; /** @ngInject */ constructor(private $location, private $timeout) { + this.appSubUrl = config.appSubUrl; + } + + // Angular's $location does not like and absolute urls + stripBaseFromUrl (url = '') { + const appSubUrl = this.appSubUrl; + const stripExtraChars = appSubUrl.endsWith('/') ? 1 : 0; + const urlWithoutBase = url.length > 0 && url.indexOf(appSubUrl) === 0 ? + url.slice(appSubUrl.length - stripExtraChars) + : url; + + return urlWithoutBase; } init() { appEvents.on('location-change', payload => { - this.$timeout(() => { // A hack to use timeout when we're changing things (in this case the url) from outside of Angular. - this.$location.path(payload.href); - }); + const urlWithoutBase = this.stripBaseFromUrl(payload.href); + + this.$timeout(() => { // A hack to use timeout when we're changing things (in this case the url) from outside of Angular. + this.$location.url(urlWithoutBase); + }); }); } } diff --git a/public/app/core/specs/global_event_srv.jest.ts b/public/app/core/specs/global_event_srv.jest.ts new file mode 100644 index 00000000000..0ecd5cbe40b --- /dev/null +++ b/public/app/core/specs/global_event_srv.jest.ts @@ -0,0 +1,23 @@ +import { GlobalEventSrv } from 'app/core/services/global_event_srv'; +import { beforeEach } from 'test/lib/common'; + +jest.mock('app/core/config', () => { + return { + appSubUrl: '/subUrl' + }; +}); + +describe('GlobalEventSrv', () => { + let searchSrv; + + beforeEach(() => { + searchSrv = new GlobalEventSrv(null, null); + }); + + describe('With /subUrl as appSubUrl', () => { + it('/subUrl should be stripped', () => { + const urlWithoutMaster = searchSrv.stripBaseFromUrl('/subUrl/grafana/'); + expect(urlWithoutMaster).toBe('/grafana/'); + }); + }); +});