Skip to content

Commit 257971d

Browse files
davismcpheekibanamachinekertal
authored
[Discover] [Embeddable] Fix Discover session embeddable drilldown (elastic#211678)
## Summary This PR re-adds drilldown support to the Discover session embeddable after it was accidentally removed during the refactoring in elastic#180536 (related PR where drilldowns / dynamic actions were refactored: elastic#178896). A new functional test has also been added to prevent future regressions. Fixes elastic#211677. ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This was checked for breaking HTTP API changes, and any breaking changes have been approved by the breaking-change committee. The `release_note:breaking` label should be applied in these situations. - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <[email protected]> Co-authored-by: Matthias Wilhelm <[email protected]>
1 parent dcca0ba commit 257971d

File tree

11 files changed

+109
-17
lines changed

11 files changed

+109
-17
lines changed

src/platform/plugins/shared/discover/kibana.jsonc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
"observabilityAIAssistant",
4949
"aiops",
5050
"fieldsMetadata",
51-
"logsDataAccess"
51+
"logsDataAccess",
52+
"embeddableEnhanced"
5253
],
5354
"requiredBundles": [
5455
"kibanaUtils",

src/platform/plugins/shared/discover/public/build_services.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/publ
6262
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
6363
import { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
6464
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
65+
import type { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public';
6566
import type { DiscoverStartPlugins } from './types';
6667
import type { DiscoverContextAppLocator } from './application/context/services/locator';
6768
import type { DiscoverSingleDocLocator } from './application/doc/locator';
@@ -140,6 +141,7 @@ export interface DiscoverServices {
140141
ebtManager: DiscoverEBTManager;
141142
fieldsMetadata?: FieldsMetadataPublicStart;
142143
logsDataAccess?: LogsDataAccessPluginStart;
144+
embeddableEnhanced?: EmbeddableEnhancedPluginStart;
143145
}
144146

145147
export const buildServices = memoize(
@@ -233,6 +235,7 @@ export const buildServices = memoize(
233235
ebtManager,
234236
fieldsMetadata: plugins.fieldsMetadata,
235237
logsDataAccess: plugins.logsDataAccess,
238+
embeddableEnhanced: plugins.embeddableEnhanced,
236239
};
237240
}
238241
);

src/platform/plugins/shared/discover/public/embeddable/constants.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
import { SavedSearchAttributes } from '@kbn/saved-search-plugin/common';
10+
import type { SavedSearchAttributes } from '@kbn/saved-search-plugin/common';
1111
import type { Trigger } from '@kbn/ui-actions-plugin/public';
12+
import type { SearchEmbeddableSerializedState } from './types';
1213

1314
export { SEARCH_EMBEDDABLE_TYPE } from '@kbn/discover-utils';
1415

@@ -37,9 +38,10 @@ export const EDITABLE_SAVED_SEARCH_KEYS: Readonly<Array<keyof SavedSearchAttribu
3738
] as const;
3839

3940
/** This constant refers to the dashboard panel specific state */
40-
export const EDITABLE_PANEL_KEYS = [
41+
export const EDITABLE_PANEL_KEYS: Readonly<Array<keyof SearchEmbeddableSerializedState>> = [
4142
'title', // panel title
4243
'description', // panel description
4344
'timeRange', // panel custom time range
4445
'hidePanelTitles', // panel hidden title
46+
'enhancements', // panel enhancements (e.g. drilldowns)
4547
] as const;

src/platform/plugins/shared/discover/public/embeddable/get_search_embeddable_factory.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ export const getSearchEmbeddableFactory = ({
9797
/** Build API */
9898
const titleManager = initializeTitleManager(initialState);
9999
const timeRange = initializeTimeRange(initialState);
100+
const dynamicActionsApi =
101+
discoverServices.embeddableEnhanced?.initializeReactEmbeddableDynamicActions(
102+
uuid,
103+
() => titleManager.api.title$.getValue(),
104+
initialState
105+
);
106+
const maybeStopDynamicActions = dynamicActionsApi?.startDynamicActions();
100107
const searchEmbeddable = await initializeSearchEmbeddableApi(initialState, {
101108
discoverServices,
102109
});
@@ -126,6 +133,7 @@ export const getSearchEmbeddableFactory = ({
126133
savedSearch: searchEmbeddable.api.savedSearch$.getValue(),
127134
serializeTitles: titleManager.serialize,
128135
serializeTimeRange: timeRange.serialize,
136+
serializeDynamicActions: dynamicActionsApi?.serializeDynamicActions,
129137
savedObjectId,
130138
});
131139

@@ -134,6 +142,7 @@ export const getSearchEmbeddableFactory = ({
134142
...titleManager.api,
135143
...searchEmbeddable.api,
136144
...timeRange.api,
145+
...dynamicActionsApi?.dynamicActionsApi,
137146
...initializeEditApi({
138147
uuid,
139148
parentApi,
@@ -178,10 +187,18 @@ export const getSearchEmbeddableFactory = ({
178187
getSerializedStateByReference: (newId: string) => serialize(newId),
179188
serializeState: () => serialize(savedObjectId$.getValue()),
180189
getInspectorAdapters: () => searchEmbeddable.stateManager.inspectorAdapters.getValue(),
190+
supportedTriggers: () => {
191+
// No triggers are supported, but this is still required to pass the drilldown
192+
// compatibilty check and ensure top-level drilldowns (e.g. URL) work as expected
193+
return [];
194+
},
181195
},
182196
{
183197
...titleManager.comparators,
184198
...timeRange.comparators,
199+
...(dynamicActionsApi?.dynamicActionsComparator ?? {
200+
enhancements: getUnchangingComparator(),
201+
}),
185202
...searchEmbeddable.comparators,
186203
rawSavedObjectAttributes: getUnchangingComparator(),
187204
savedObjectId: [savedObjectId$, (value) => savedObjectId$.next(value)],
@@ -206,6 +223,7 @@ export const getSearchEmbeddableFactory = ({
206223
return () => {
207224
searchEmbeddable.cleanup();
208225
unsubscribeFromFetch();
226+
maybeStopDynamicActions?.stopDynamicActions();
209227
};
210228
}, []);
211229

src/platform/plugins/shared/discover/public/embeddable/types.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
* License v3.0 only", or the "Server Side Public License, v 1".
88
*/
99

10-
import { DataTableRecord } from '@kbn/discover-utils/types';
10+
import type { DataTableRecord } from '@kbn/discover-utils/types';
1111
import type { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public';
12-
import { HasInspectorAdapters } from '@kbn/inspector-plugin/public';
13-
import {
12+
import type { HasInspectorAdapters } from '@kbn/inspector-plugin/public';
13+
import type {
1414
EmbeddableApiContext,
1515
HasEditCapabilities,
1616
HasLibraryTransforms,
17+
HasSupportedTriggers,
1718
PublishesBlockingError,
1819
PublishesDataLoading,
1920
PublishesSavedObjectId,
@@ -23,15 +24,17 @@ import {
2324
SerializedTimeRange,
2425
SerializedTitles,
2526
} from '@kbn/presentation-publishing';
26-
import {
27+
import type {
2728
SavedSearch,
2829
SavedSearchAttributes,
2930
SerializableSavedSearch,
3031
} from '@kbn/saved-search-plugin/common/types';
31-
import { DataTableColumnsMeta } from '@kbn/unified-data-table';
32-
import { BehaviorSubject } from 'rxjs';
33-
import { PublishesWritableDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views';
34-
import { EDITABLE_SAVED_SEARCH_KEYS } from './constants';
32+
import type { DataTableColumnsMeta } from '@kbn/unified-data-table';
33+
import type { BehaviorSubject } from 'rxjs';
34+
import type { PublishesWritableDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views';
35+
import type { DynamicActionsSerializedState } from '@kbn/embeddable-enhanced-plugin/public/plugin';
36+
import type { HasDynamicActions } from '@kbn/embeddable-enhanced-plugin/public';
37+
import type { EDITABLE_SAVED_SEARCH_KEYS } from './constants';
3538

3639
export type SearchEmbeddableState = Pick<
3740
SerializableSavedSearch,
@@ -75,6 +78,7 @@ export type EditableSavedSearchAttributes = Partial<
7578

7679
export type SearchEmbeddableSerializedState = SerializedTitles &
7780
SerializedTimeRange &
81+
Partial<DynamicActionsSerializedState> &
7882
EditableSavedSearchAttributes & {
7983
// by value
8084
attributes?: SavedSearchAttributes & { references: SavedSearch['references'] };
@@ -85,7 +89,8 @@ export type SearchEmbeddableSerializedState = SerializedTitles &
8589

8690
export type SearchEmbeddableRuntimeState = SearchEmbeddableSerializedAttributes &
8791
SerializedTitles &
88-
SerializedTimeRange & {
92+
SerializedTimeRange &
93+
Partial<DynamicActionsSerializedState> & {
8994
rawSavedObjectAttributes?: EditableSavedSearchAttributes;
9095
savedObjectTitle?: string;
9196
savedObjectId?: string;
@@ -107,7 +112,9 @@ export type SearchEmbeddableApi = DefaultEmbeddableApi<
107112
HasLibraryTransforms &
108113
HasTimeRange &
109114
HasInspectorAdapters &
110-
Partial<HasEditCapabilities & PublishesSavedObjectId>;
115+
Partial<HasEditCapabilities & PublishesSavedObjectId> &
116+
HasDynamicActions &
117+
HasSupportedTriggers;
111118

112119
export interface PublishesSavedSearch {
113120
savedSearch$: PublishingSubject<SavedSearch>;

src/platform/plugins/shared/discover/public/embeddable/utils/serialization_utils.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ describe('Serialization utils', () => {
121121
savedSearch,
122122
serializeTitles: jest.fn(),
123123
serializeTimeRange: jest.fn(),
124+
serializeDynamicActions: jest.fn(),
124125
});
125126

126127
expect(serializedState).toEqual({
@@ -155,6 +156,7 @@ describe('Serialization utils', () => {
155156
savedSearch,
156157
serializeTitles: jest.fn(),
157158
serializeTimeRange: jest.fn(),
159+
serializeDynamicActions: jest.fn(),
158160
savedObjectId: 'test-id',
159161
});
160162

@@ -175,6 +177,7 @@ describe('Serialization utils', () => {
175177
savedSearch: { ...savedSearch, sampleSize: 500, sort: [['order_date', 'asc']] },
176178
serializeTitles: jest.fn(),
177179
serializeTimeRange: jest.fn(),
180+
serializeDynamicActions: jest.fn(),
178181
savedObjectId: 'test-id',
179182
});
180183

src/platform/plugins/shared/discover/public/embeddable/utils/serialization_utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
} from '@kbn/saved-search-plugin/common';
2424
import { SavedSearchUnwrapResult } from '@kbn/saved-search-plugin/public';
2525

26+
import type { DynamicActionsSerializedState } from '@kbn/embeddable-enhanced-plugin/public/plugin';
2627
import { extract, inject } from '../../../common/embeddable/search_inject_extract';
2728
import { DiscoverServices } from '../../build_services';
2829
import {
@@ -85,13 +86,15 @@ export const serializeState = ({
8586
savedSearch,
8687
serializeTitles,
8788
serializeTimeRange,
89+
serializeDynamicActions,
8890
savedObjectId,
8991
}: {
9092
uuid: string;
9193
initialState: SearchEmbeddableRuntimeState;
9294
savedSearch: SavedSearch;
9395
serializeTitles: () => SerializedTitles;
9496
serializeTimeRange: () => SerializedTimeRange;
97+
serializeDynamicActions: (() => DynamicActionsSerializedState) | undefined;
9598
savedObjectId?: string;
9699
}): SerializedPanelState<SearchEmbeddableSerializedState> => {
97100
const searchSource = savedSearch.searchSource;
@@ -115,6 +118,7 @@ export const serializeState = ({
115118
// Serialize the current dashboard state into the panel state **without** updating the saved object
116119
...serializeTitles(),
117120
...serializeTimeRange(),
121+
...serializeDynamicActions?.(),
118122
...overwriteState,
119123
},
120124
// No references to extract for by-reference embeddable since all references are stored with by-reference saved object

src/platform/plugins/shared/discover/public/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/publ
4343
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
4444
import type { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
4545
import type { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
46+
import type { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public';
4647
import type { DiscoverAppLocator } from '../common';
4748
import { type DiscoverContainerProps } from './components/discover_container';
4849

@@ -168,4 +169,5 @@ export interface DiscoverStartPlugins {
168169
unifiedSearch: UnifiedSearchPublicPluginStart;
169170
urlForwarding: UrlForwardingStart;
170171
usageCollection?: UsageCollectionSetup;
172+
embeddableEnhanced?: EmbeddableEnhancedPluginStart;
171173
}

src/platform/plugins/shared/discover/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@
9898
"@kbn/logs-data-access-plugin",
9999
"@kbn/core-lifecycle-browser",
100100
"@kbn/esql-ast",
101-
"@kbn/discover-shared-plugin"
101+
"@kbn/discover-shared-plugin",
102+
"@kbn/embeddable-enhanced-plugin"
102103
],
103104
"exclude": ["target/**/*"]
104105
}

test/functional/services/dashboard/drilldowns_manage.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,11 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon
7878
}: {
7979
drilldownName: string;
8080
destinationURLTemplate: string;
81-
trigger: 'VALUE_CLICK_TRIGGER' | 'SELECT_RANGE_TRIGGER' | 'IMAGE_CLICK_TRIGGER';
81+
trigger:
82+
| 'VALUE_CLICK_TRIGGER'
83+
| 'SELECT_RANGE_TRIGGER'
84+
| 'IMAGE_CLICK_TRIGGER'
85+
| 'CONTEXT_MENU_TRIGGER';
8286
}) {
8387
await this.fillInDrilldownName(drilldownName);
8488
await this.selectTriggerIfNeeded(trigger);
@@ -94,7 +98,11 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon
9498
}
9599

96100
async selectTriggerIfNeeded(
97-
trigger: 'VALUE_CLICK_TRIGGER' | 'SELECT_RANGE_TRIGGER' | 'IMAGE_CLICK_TRIGGER'
101+
trigger:
102+
| 'VALUE_CLICK_TRIGGER'
103+
| 'SELECT_RANGE_TRIGGER'
104+
| 'IMAGE_CLICK_TRIGGER'
105+
| 'CONTEXT_MENU_TRIGGER'
98106
) {
99107
if (await testSubjects.exists(`triggerPicker`)) {
100108
const container = await testSubjects.find(`triggerPicker-${trigger}`);

0 commit comments

Comments
 (0)