Skip to content

Commit e152134

Browse files
Merge branch 'master' into nls/header-layout
2 parents ff8cd52 + 244ce85 commit e152134

File tree

60 files changed

+2040
-220
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+2040
-220
lines changed

docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchbar.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<b>Signature:</b>
88

99
```typescript
10-
SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, any> & {
11-
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated"> & ReactIntl.InjectedIntlProps>;
10+
SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, any> & {
11+
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated"> & ReactIntl.InjectedIntlProps>;
1212
}
1313
```

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,8 @@
577577
"angular-recursion": "^1.0.5",
578578
"angular-route": "^1.8.0",
579579
"angular-sortable-view": "^0.0.17",
580-
"apidoc": "^0.20.1",
581-
"apidoc-markdown": "^5.0.0",
580+
"apidoc": "^0.25.0",
581+
"apidoc-markdown": "^5.1.8",
582582
"apollo-link": "^1.2.3",
583583
"apollo-link-error": "^1.1.7",
584584
"apollo-link-state": "^0.4.1",

src/plugins/data/public/plugin.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ import {
7272

7373
import { SavedObjectsClientPublicToCommon } from './index_patterns';
7474
import { indexPatternLoad } from './index_patterns/expressions/load_index_pattern';
75+
import { UsageCollectionSetup } from '../../usage_collection/public';
7576

7677
declare module '../../ui_actions/public' {
7778
export interface ActionContextMapping {
@@ -94,6 +95,7 @@ export class DataPublicPlugin
9495
private readonly fieldFormatsService: FieldFormatsService;
9596
private readonly queryService: QueryService;
9697
private readonly storage: IStorageWrapper;
98+
private usageCollection: UsageCollectionSetup | undefined;
9799

98100
constructor(initializerContext: PluginInitializerContext<ConfigSchema>) {
99101
this.searchService = new SearchService(initializerContext);
@@ -112,6 +114,8 @@ export class DataPublicPlugin
112114
expressions.registerFunction(esaggs);
113115
expressions.registerFunction(indexPatternLoad);
114116

117+
this.usageCollection = usageCollection;
118+
115119
const queryService = this.queryService.setup({
116120
uiSettings: core.uiSettings,
117121
storage: this.storage,
@@ -208,6 +212,7 @@ export class DataPublicPlugin
208212
core,
209213
data: dataServices,
210214
storage: this.storage,
215+
trackUiMetric: this.usageCollection?.reportUiStats.bind(this.usageCollection, 'data_plugin'),
211216
});
212217

213218
return {

src/plugins/data/public/public.api.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport';
8484
import { TypeOf } from '@kbn/config-schema';
8585
import { UiActionsSetup } from 'src/plugins/ui_actions/public';
8686
import { UiActionsStart } from 'src/plugins/ui_actions/public';
87+
import { UiStatsMetricType } from '@kbn/analytics';
8788
import { Unit } from '@elastic/datemath';
8889
import { UnregisterCallback } from 'history';
8990
import { UserProvidedValues } from 'src/core/server/types';
@@ -1998,8 +1999,8 @@ export const search: {
19981999
// Warning: (ae-missing-release-tag) "SearchBar" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
19992000
//
20002001
// @public (undocumented)
2001-
export const SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, any> & {
2002-
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated"> & ReactIntl.InjectedIntlProps>;
2002+
export const SearchBar: React.ComponentClass<Pick<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated">, any> & {
2003+
WrappedComponent: React.ComponentType<Pick<SearchBarProps, "query" | "isLoading" | "filters" | "onRefresh" | "onRefreshChange" | "refreshInterval" | "intl" | "indexPatterns" | "dataTestSubj" | "screenTitle" | "showQueryInput" | "showDatePicker" | "showAutoRefreshOnly" | "dateRangeFrom" | "dateRangeTo" | "isRefreshPaused" | "customSubmitButton" | "timeHistory" | "indicateNoData" | "onFiltersUpdated" | "trackUiMetric" | "savedQuery" | "showSaveQuery" | "onClearSavedQuery" | "showQueryBar" | "showFilterBar" | "onQueryChange" | "onQuerySubmit" | "onSaved" | "onSavedQueryUpdated"> & ReactIntl.InjectedIntlProps>;
20032004
};
20042005

20052006
// Warning: (ae-forgotten-export) The symbol "SearchBarOwnProps" needs to be exported by the entry point index.d.ts

src/plugins/data/public/ui/filter_bar/filter_bar.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react';
2222
import classNames from 'classnames';
2323
import React, { useState } from 'react';
2424

25+
import { METRIC_TYPE, UiStatsMetricType } from '@kbn/analytics';
2526
import { FilterEditor } from './filter_editor';
2627
import { FILTER_EDITOR_WIDTH, FilterItem } from './filter_item';
2728
import { FilterOptions } from './filter_options';
@@ -45,6 +46,9 @@ interface Props {
4546
className: string;
4647
indexPatterns: IIndexPattern[];
4748
intl: InjectedIntl;
49+
appName: string;
50+
// Track UI Metrics
51+
trackUiMetric?: (metricType: UiStatsMetricType, eventName: string | string[]) => void;
4852
}
4953

5054
function FilterBarUI(props: Props) {
@@ -128,6 +132,9 @@ function FilterBarUI(props: Props) {
128132

129133
function onAdd(filter: Filter) {
130134
setIsAddFilterPopoverOpen(false);
135+
if (props.trackUiMetric) {
136+
props.trackUiMetric(METRIC_TYPE.CLICK, `${props.appName}:filter_added`);
137+
}
131138
const filters = [...props.filters, filter];
132139
onFiltersUpdated(filters);
133140
}
@@ -139,6 +146,9 @@ function FilterBarUI(props: Props) {
139146
}
140147

141148
function onUpdate(i: number, filter: Filter) {
149+
if (props.trackUiMetric) {
150+
props.trackUiMetric(METRIC_TYPE.CLICK, `${props.appName}:filter_edited`);
151+
}
142152
const filters = [...props.filters];
143153
filters[i] = filter;
144154
onFiltersUpdated(filters);
@@ -165,11 +175,17 @@ function FilterBarUI(props: Props) {
165175
}
166176

167177
function onToggleAllNegated() {
178+
if (props.trackUiMetric) {
179+
props.trackUiMetric(METRIC_TYPE.CLICK, `${props.appName}:filter_invertInclusion`);
180+
}
168181
const filters = props.filters.map(toggleFilterNegated);
169182
onFiltersUpdated(filters);
170183
}
171184

172185
function onToggleAllDisabled() {
186+
if (props.trackUiMetric) {
187+
props.trackUiMetric(METRIC_TYPE.CLICK, `${props.appName}:filter_toggleAllDisabled`);
188+
}
173189
const filters = props.filters.map(toggleFilterDisabled);
174190
onFiltersUpdated(filters);
175191
}

src/plugins/data/public/ui/search_bar/create_search_bar.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import _ from 'lodash';
2121
import React, { useEffect, useRef } from 'react';
2222
import { CoreStart } from 'src/core/public';
2323
import { IStorageWrapper } from 'src/plugins/kibana_utils/public';
24+
import { UiStatsMetricType } from '@kbn/analytics';
2425
import { KibanaContextProvider } from '../../../../kibana_react/public';
2526
import { QueryStart, SavedQuery } from '../../query';
2627
import { SearchBar, SearchBarOwnProps } from './';
@@ -35,6 +36,7 @@ interface StatefulSearchBarDeps {
3536
core: CoreStart;
3637
data: Omit<DataPublicPluginStart, 'ui'>;
3738
storage: IStorageWrapper;
39+
trackUiMetric?: (metricType: UiStatsMetricType, eventName: string | string[]) => void;
3840
}
3941

4042
export type StatefulSearchBarProps = SearchBarOwnProps & {
@@ -119,7 +121,7 @@ const overrideDefaultBehaviors = (props: StatefulSearchBarProps) => {
119121
return props.useDefaultBehaviors ? {} : props;
120122
};
121123

122-
export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps) {
124+
export function createSearchBar({ core, storage, data, trackUiMetric }: StatefulSearchBarDeps) {
123125
// App name should come from the core application service.
124126
// Until it's available, we'll ask the user to provide it for the pre-wired component.
125127
return (props: StatefulSearchBarProps) => {
@@ -197,6 +199,7 @@ export function createSearchBar({ core, storage, data }: StatefulSearchBarDeps)
197199
onClearSavedQuery={defaultOnClearSavedQuery(props, clearSavedQuery)}
198200
onSavedQueryUpdated={defaultOnSavedQueryUpdated(props, setSavedQuery)}
199201
onSaved={defaultOnSavedQueryUpdated(props, setSavedQuery)}
202+
trackUiMetric={trackUiMetric}
200203
{...overrideDefaultBehaviors(props)}
201204
/>
202205
</KibanaContextProvider>

src/plugins/data/public/ui/search_bar/search_bar.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import React, { Component } from 'react';
2424
import ResizeObserver from 'resize-observer-polyfill';
2525
import { get, isEqual } from 'lodash';
2626

27+
import { METRIC_TYPE, UiStatsMetricType } from '@kbn/analytics';
2728
import { withKibana, KibanaReactContextValue } from '../../../../kibana_react/public';
2829

2930
import QueryBarTopRow from '../query_string_input/query_bar_top_row';
@@ -78,6 +79,8 @@ export interface SearchBarOwnProps {
7879

7980
onRefresh?: (payload: { dateRange: TimeRange }) => void;
8081
indicateNoData?: boolean;
82+
// Track UI Metrics
83+
trackUiMetric?: (metricType: UiStatsMetricType, eventName: string | string[]) => void;
8184
}
8285

8386
export type SearchBarProps = SearchBarOwnProps & SearchBarInjectedDeps;
@@ -331,6 +334,9 @@ class SearchBarUI extends Component<SearchBarProps, State> {
331334
},
332335
});
333336
}
337+
if (this.props.trackUiMetric) {
338+
this.props.trackUiMetric(METRIC_TYPE.CLICK, `${this.services.appName}:query_submitted`);
339+
}
334340
}
335341
);
336342
};
@@ -432,6 +438,8 @@ class SearchBarUI extends Component<SearchBarProps, State> {
432438
filters={this.props.filters!}
433439
onFiltersUpdated={this.props.onFiltersUpdated}
434440
indexPatterns={this.props.indexPatterns!}
441+
appName={this.services.appName}
442+
trackUiMetric={this.props.trackUiMetric}
435443
/>
436444
</div>
437445
</div>

src/plugins/discover/public/application/angular/discover.js

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ import {
8383
MODIFY_COLUMNS_ON_SWITCH,
8484
} from '../../../common';
8585
import { METRIC_TYPE } from '@kbn/analytics';
86+
import { SEARCH_SESSION_ID_QUERY_PARAM } from '../../url_generator';
87+
import { removeQueryParam, getQueryParams } from '../../../../kibana_utils/public';
8688

8789
const fetchStatuses = {
8890
UNINITIALIZED: 'uninitialized',
@@ -91,6 +93,9 @@ const fetchStatuses = {
9193
ERROR: 'error',
9294
};
9395

96+
const getSearchSessionIdFromURL = (history) =>
97+
getQueryParams(history.location)[SEARCH_SESSION_ID_QUERY_PARAM];
98+
9499
const app = getAngularModule();
95100

96101
app.config(($routeProvider) => {
@@ -208,6 +213,8 @@ function discoverController($element, $route, $scope, $timeout, $window, Promise
208213
};
209214

210215
const history = getHistory();
216+
// used for restoring background session
217+
let isInitialSearch = true;
211218

212219
const {
213220
appStateContainer,
@@ -798,17 +805,30 @@ function discoverController($element, $route, $scope, $timeout, $window, Promise
798805
if (abortController) abortController.abort();
799806
abortController = new AbortController();
800807

801-
const sessionId = data.search.session.start();
808+
const searchSessionId = (() => {
809+
const searchSessionIdFromURL = getSearchSessionIdFromURL(history);
810+
if (searchSessionIdFromURL) {
811+
if (isInitialSearch) {
812+
data.search.session.restore(searchSessionIdFromURL);
813+
isInitialSearch = false;
814+
return searchSessionIdFromURL;
815+
} else {
816+
// navigating away from background search
817+
removeQueryParam(history, SEARCH_SESSION_ID_QUERY_PARAM);
818+
}
819+
}
820+
return data.search.session.start();
821+
})();
802822

803823
$scope
804824
.updateDataSource()
805825
.then(setupVisualization)
806826
.then(function () {
807827
$scope.fetchStatus = fetchStatuses.LOADING;
808-
logInspectorRequest();
828+
logInspectorRequest({ searchSessionId });
809829
return $scope.searchSource.fetch({
810830
abortSignal: abortController.signal,
811-
sessionId,
831+
sessionId: searchSessionId,
812832
});
813833
})
814834
.then(onResults)
@@ -900,15 +920,15 @@ function discoverController($element, $route, $scope, $timeout, $window, Promise
900920
$scope.fetchStatus = fetchStatuses.COMPLETE;
901921
}
902922

903-
function logInspectorRequest() {
923+
function logInspectorRequest({ searchSessionId = null } = { searchSessionId: null }) {
904924
inspectorAdapters.requests.reset();
905925
const title = i18n.translate('discover.inspectorRequestDataTitle', {
906926
defaultMessage: 'data',
907927
});
908928
const description = i18n.translate('discover.inspectorRequestDescription', {
909929
defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.',
910930
});
911-
inspectorRequest = inspectorAdapters.requests.start(title, { description });
931+
inspectorRequest = inspectorAdapters.requests.start(title, { description, searchSessionId });
912932
inspectorRequest.stats(getRequestInspectorStats($scope.searchSource));
913933
$scope.searchSource.getSearchRequestBody().then((body) => {
914934
inspectorRequest.json(body);

src/plugins/discover/public/url_generator.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,15 @@ describe('Discover url generator', () => {
212212
});
213213
});
214214

215+
test('can specify a search session id', async () => {
216+
const { generator } = await setup();
217+
const url = await generator.createUrl({
218+
searchSessionId: '__test__',
219+
});
220+
expect(url).toMatchInlineSnapshot(`"xyz/app/discover#/?_g=()&_a=()&searchSessionId=__test__"`);
221+
expect(url).toContain('__test__');
222+
});
223+
215224
describe('useHash property', () => {
216225
describe('when default useHash is set to false', () => {
217226
test('when using default, sets index pattern ID in the generated URL', async () => {

src/plugins/discover/public/url_generator.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,20 @@ export interface DiscoverUrlGeneratorState {
6767
* whether to hash the data in the url to avoid url length issues.
6868
*/
6969
useHash?: boolean;
70+
71+
/**
72+
* Background search session id
73+
*/
74+
searchSessionId?: string;
7075
}
7176

7277
interface Params {
7378
appBasePath: string;
7479
useHash: boolean;
7580
}
7681

82+
export const SEARCH_SESSION_ID_QUERY_PARAM = 'searchSessionId';
83+
7784
export class DiscoverUrlGenerator
7885
implements UrlGeneratorsDefinition<typeof DISCOVER_APP_URL_GENERATOR> {
7986
constructor(private readonly params: Params) {}
@@ -88,6 +95,7 @@ export class DiscoverUrlGenerator
8895
savedSearchId,
8996
timeRange,
9097
useHash = this.params.useHash,
98+
searchSessionId,
9199
}: DiscoverUrlGeneratorState): Promise<string> => {
92100
const savedSearchPath = savedSearchId ? encodeURIComponent(savedSearchId) : '';
93101
const appState: {
@@ -111,6 +119,10 @@ export class DiscoverUrlGenerator
111119
url = setStateToKbnUrl<QueryState>('_g', queryState, { useHash }, url);
112120
url = setStateToKbnUrl('_a', appState, { useHash }, url);
113121

122+
if (searchSessionId) {
123+
url = `${url}&${SEARCH_SESSION_ID_QUERY_PARAM}=${searchSessionId}`;
124+
}
125+
114126
return url;
115127
};
116128
}

0 commit comments

Comments
 (0)