From fbee5f402ec7b8c74356c85a2cccecbd5bfbdf17 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Fri, 28 May 2021 02:46:24 -0400 Subject: [PATCH] Dashboard: Fix multi-value variables in share links (#33216) (#33576) (#34868) (cherry picked from commit 48fe3feae74bd9e81512fa252529c4beab38fc30) Co-authored-by: MrSummat --- packages/grafana-data/src/utils/url.test.ts | 31 +++++++++++++++++++++ packages/grafana-data/src/utils/url.ts | 10 +++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/grafana-data/src/utils/url.test.ts b/packages/grafana-data/src/utils/url.test.ts index 27f93d2ff78..cbcfcb24359 100644 --- a/packages/grafana-data/src/utils/url.test.ts +++ b/packages/grafana-data/src/utils/url.test.ts @@ -55,3 +55,34 @@ describe('parseKeyValue', () => { expect(obj).toEqual({ custom: '', custom1: '001', custom2: '002', custom3: true }); }); }); + +describe('getUrlSearchParams', () => { + const { location } = window; + // @ts-ignore + delete window.location; + + window.location = { + ...location, + hash: '#hash', + host: 'www.domain.com:9877', + hostname: 'www.domain.com', + href: 'http://www.domain.com:9877/path/b?var1=a&var2=b&var2=c&var2=d&var3=a&var3=d&z#hash', + origin: 'http://www.domain.com:9877', + pathname: '/path/b', + port: '9877', + protocol: 'http:', + search: '?var1=a&var2=b&var2=c&var2=d&var3=a&var3=d&z', + }; + + let expectedParams = { + var1: ['a'], + var2: ['b', 'c', 'd'], + var3: ['a', 'd'], + z: true, + }; + + it('should take into account multi-value and boolean parameters', () => { + const params = urlUtil.getUrlSearchParams(); + expect(params).toStrictEqual(expectedParams); + }); +}); diff --git a/packages/grafana-data/src/utils/url.ts b/packages/grafana-data/src/utils/url.ts index 8d6de90e35e..545c440a762 100644 --- a/packages/grafana-data/src/utils/url.ts +++ b/packages/grafana-data/src/utils/url.ts @@ -105,17 +105,21 @@ function appendQueryToUrl(url: string, stringToAppend: string) { /** * Return search part (as object) of current url */ -function getUrlSearchParams() { +function getUrlSearchParams(): UrlQueryMap { const search = window.location.search.substring(1); const searchParamsSegments = search.split('&'); - const params: any = {}; + const params: UrlQueryMap = {}; for (const p of searchParamsSegments) { const keyValuePair = p.split('='); if (keyValuePair.length > 1) { // key-value param const key = decodeURIComponent(keyValuePair[0]); const value = decodeURIComponent(keyValuePair[1]); - params[key] = value; + if (key in params) { + params[key] = [...(params[key] as any[]), value]; + } else { + params[key] = [value]; + } } else if (keyValuePair.length === 1) { // boolean param const key = decodeURIComponent(keyValuePair[0]);