From 97070957add59dd9a6552f24b0956801aa599e5d Mon Sep 17 00:00:00 2001 From: Nikita Karpukhin Date: Wed, 30 Nov 2022 11:26:47 +0100 Subject: [PATCH] add support for search category Signed-off-by: Nikita Karpukhin --- plugins/analytics-module-ga/README.md | 10 ++++++---- plugins/analytics-module-ga/config.d.ts | 10 ++++++++-- .../AnalyticsApi/GoogleAnalytics.test.ts | 12 +++++++----- .../implementations/AnalyticsApi/GoogleAnalytics.ts | 10 ++++++++-- .../src/util/VirtualSearchPageView.ts | 6 ++++-- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/plugins/analytics-module-ga/README.md b/plugins/analytics-module-ga/README.md index 605044f37c..c2d79aa45d 100644 --- a/plugins/analytics-module-ga/README.md +++ b/plugins/analytics-module-ga/README.md @@ -181,7 +181,8 @@ app: virtualSearchPageView: mode: only # Defaults to 'disabled' mountPath: /virtual-search # Defaults to '/search' - queryParam: term # Defaults to 'query' + searchQuery: term # Defaults to 'query' + categoryQuery: sc # Omitted by default ``` Available `mode`s are: @@ -190,9 +191,10 @@ Available `mode`s are: - `only` - sends virtual pageviews _instead_ of `search` events - `both` - sends both virtual pageviews _and_ `search` events -Virtual pageviews will be sent to the path specified in the `mountPath`, and the search term will be -set as the value for query parameter `queryParam`, e.g. the example config above will result in -virtual pageviews being sent to `/virtual-search?term=SearchTermHere`. +Virtual pageviews will be sent to the path specified in the `mountPath`, the search term will be +set as the value for query parameter `searchQuery` and category (if provided) will be set as the value for +query parameter `categoryQuery`, e.g. the example config above will result in +virtual pageviews being sent to `/virtual-search?term=SearchTermHere&sc=CategoryHere`. ### Debugging and Testing diff --git a/plugins/analytics-module-ga/config.d.ts b/plugins/analytics-module-ga/config.d.ts index bf9c3b304b..188727bf93 100644 --- a/plugins/analytics-module-ga/config.d.ts +++ b/plugins/analytics-module-ga/config.d.ts @@ -72,11 +72,17 @@ export interface Config { */ mountPath?: string; /** - * Specifies which query param is used in the virtual pageview URL. + * Specifies which query param is used for the term query in the virtual pageview URL. * Defaults to `query`. * @visibility frontend */ - queryParam?: string; + searchQuery?: string; + /** + * Specifies which query param is used for the category query in the virtual pageview URL. + * Skipped by default. + * @visibility frontend + */ + categoryQuery?: string; }; /** diff --git a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts index 072b155adc..65e9256aa8 100644 --- a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts +++ b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts @@ -25,6 +25,7 @@ describe('GoogleAnalytics', () => { pluginId: 'some-plugin', routeRef: 'unknown', releaseNum: 1337, + searchTypes: 'test category', }; const trackingId = 'UA-000000-0'; const basicValidConfig = new ConfigReader({ @@ -175,7 +176,7 @@ describe('GoogleAnalytics', () => { expect(command).toBe('send'); expect(data).toMatchObject({ hitType: 'pageview', - page: '/search?query=test search', + page: '/search?query=test+search', }); expect(ReactGA.testModeAPI.calls).toHaveLength(2); }); @@ -203,7 +204,7 @@ describe('GoogleAnalytics', () => { expect(pageviewCommand).toBe('send'); expect(pageViewData).toMatchObject({ hitType: 'pageview', - page: '/search?query=test search', + page: '/search?query=test+search', }); const [searchCommand, searchData] = ReactGA.testModeAPI.calls[2]; expect(searchCommand).toBe('send'); @@ -215,7 +216,7 @@ describe('GoogleAnalytics', () => { }); }); - it('captures virtual pageviews on custom route with custom query param', () => { + it('captures virtual pageviews on custom route with custom search query and custom category', () => { const config = new ConfigReader({ app: { analytics: { @@ -225,7 +226,8 @@ describe('GoogleAnalytics', () => { virtualSearchPageView: { mode: 'only', mountPath: '/custom', - queryParam: 'term', + searchQuery: 'term', + categoryQuery: 'sc', }, }, }, @@ -242,7 +244,7 @@ describe('GoogleAnalytics', () => { expect(command).toBe('send'); expect(data).toMatchObject({ hitType: 'pageview', - page: '/custom?term=test search', + page: '/custom?term=test+search&sc=test+category', }); }); diff --git a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts index 16e4807008..17c5b26be1 100644 --- a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts +++ b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts @@ -167,9 +167,15 @@ export class GoogleAnalytics implements AnalyticsApi { } if (this.virtualSearchPageView.mode !== 'disabled' && action === 'search') { - const { mountPath, queryParam } = this.virtualSearchPageView; + const { mountPath, searchQuery, categoryQuery } = + this.virtualSearchPageView; + const params = new URLSearchParams(); + params.set(searchQuery, subject); + if (categoryQuery) { + params.set(categoryQuery, context.searchTypes?.toString() ?? ''); + } this.capture.pageview( - `${mountPath}?${queryParam}=${subject}`, + `${mountPath}?${params.toString()}`, customMetadata, ); if (this.virtualSearchPageView.mode === 'only') { diff --git a/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts b/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts index 8da2eebca3..bb3d40afd3 100644 --- a/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts +++ b/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts @@ -20,7 +20,8 @@ type VirtualSearchPageViewType = 'disabled' | 'only' | 'both'; export type VirtualSearchPageViewConfig = { mode: VirtualSearchPageViewType; mountPath: string; - queryParam: string; + searchQuery: string; + categoryQuery?: string; }; function isVirtualSearchPageViewType( @@ -38,6 +39,7 @@ export function parseVirtualSearchPageViewConfig( ? vspvModeString : 'disabled', mountPath: config?.getOptionalString('mountPath') ?? '/search', - queryParam: config?.getOptionalString('queryParam') ?? 'query', + searchQuery: config?.getOptionalString('searchQuery') ?? 'query', + categoryQuery: config?.getOptionalString('categoryQuery'), }; }