Pārlūkot izejas kodu

fix: Navigation on small screens when Grafana is installed in a sub directory (#10252) (#10261)

* ux: Add missing icon for login with grafana-com, fixes #10238

* fix: This fix potentially solves installations in sub directories, #10252
Johannes Schill 8 gadi atpakaļ
vecāks
revīzija
e569c8ea10

+ 19 - 3
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 <base href...> 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);
+      });
     });
   }
 }

+ 23 - 0
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/');
+    });
+  });
+});