mirror of
https://github.com/elastic/kibana.git
synced 2025-04-25 02:09:32 -04:00
# Backport This will backport the following commits from `main` to `8.x`: - [[Discover] [Embeddable] Fix Discover session embeddable drilldown (#211678)](https://github.com/elastic/kibana/pull/211678) <!--- Backport version: 9.6.6 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sorenlouv/backport) <!--BACKPORT [{"author":{"name":"Davis McPhee","email":"davis.mcphee@elastic.co"},"sourceCommit":{"committedDate":"2025-02-21T17:26:22Z","message":"[Discover] [Embeddable] Fix Discover session embeddable drilldown (#211678)\n\n## Summary\n\nThis PR re-adds drilldown support to the Discover session embeddable\nafter it was accidentally removed during the refactoring in #180536\n(related PR where drilldowns / dynamic actions were refactored:\n#178896). A new functional test has also been added to prevent future\nregressions.\n\nFixes #211677.\n\n### Checklist\n\n- [ ] Any text added follows [EUI's writing\nguidelines](https://elastic.github.io/eui/#/guidelines/writing), uses\nsentence case text and includes [i18n\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\n- [ ]\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\nwas added for features that require explanation or tutorials\n- [ ] [Unit or functional\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\nwere updated or added to match the most common scenarios\n- [ ] If a plugin configuration key changed, check if it needs to be\nallowlisted in the cloud and added to the [docker\nlist](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)\n- [ ] This was checked for breaking HTTP API changes, and any breaking\nchanges have been approved by the breaking-change committee. The\n`release_note:breaking` label should be applied in these situations.\n- [ ] [Flaky Test\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was\nused on any tests changed\n- [ ] The PR description includes the appropriate Release Notes section,\nand the correct `release_note:*` label is applied per the\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\n\n---------\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by: Matthias Wilhelm <matthias.wilhelm@elastic.co>","sha":"257971d4c0f99c0da56b9b817cff731977f8891f","branchLabelMapping":{"^v9.1.0$":"main","^v8.19.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Feature:Discover","release_note:fix","Team:DataDiscovery","backport:prev-major","v9.1.0"],"title":"[Discover] [Embeddable] Fix Discover session embeddable drilldown","number":211678,"url":"https://github.com/elastic/kibana/pull/211678","mergeCommit":{"message":"[Discover] [Embeddable] Fix Discover session embeddable drilldown (#211678)\n\n## Summary\n\nThis PR re-adds drilldown support to the Discover session embeddable\nafter it was accidentally removed during the refactoring in #180536\n(related PR where drilldowns / dynamic actions were refactored:\n#178896). A new functional test has also been added to prevent future\nregressions.\n\nFixes #211677.\n\n### Checklist\n\n- [ ] Any text added follows [EUI's writing\nguidelines](https://elastic.github.io/eui/#/guidelines/writing), uses\nsentence case text and includes [i18n\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\n- [ ]\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\nwas added for features that require explanation or tutorials\n- [ ] [Unit or functional\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\nwere updated or added to match the most common scenarios\n- [ ] If a plugin configuration key changed, check if it needs to be\nallowlisted in the cloud and added to the [docker\nlist](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)\n- [ ] This was checked for breaking HTTP API changes, and any breaking\nchanges have been approved by the breaking-change committee. The\n`release_note:breaking` label should be applied in these situations.\n- [ ] [Flaky Test\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was\nused on any tests changed\n- [ ] The PR description includes the appropriate Release Notes section,\nand the correct `release_note:*` label is applied per the\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\n\n---------\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by: Matthias Wilhelm <matthias.wilhelm@elastic.co>","sha":"257971d4c0f99c0da56b9b817cff731977f8891f"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/211678","number":211678,"mergeCommit":{"message":"[Discover] [Embeddable] Fix Discover session embeddable drilldown (#211678)\n\n## Summary\n\nThis PR re-adds drilldown support to the Discover session embeddable\nafter it was accidentally removed during the refactoring in #180536\n(related PR where drilldowns / dynamic actions were refactored:\n#178896). A new functional test has also been added to prevent future\nregressions.\n\nFixes #211677.\n\n### Checklist\n\n- [ ] Any text added follows [EUI's writing\nguidelines](https://elastic.github.io/eui/#/guidelines/writing), uses\nsentence case text and includes [i18n\nsupport](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md)\n- [ ]\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\nwas added for features that require explanation or tutorials\n- [ ] [Unit or functional\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\nwere updated or added to match the most common scenarios\n- [ ] If a plugin configuration key changed, check if it needs to be\nallowlisted in the cloud and added to the [docker\nlist](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker)\n- [ ] This was checked for breaking HTTP API changes, and any breaking\nchanges have been approved by the breaking-change committee. The\n`release_note:breaking` label should be applied in these situations.\n- [ ] [Flaky Test\nRunner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was\nused on any tests changed\n- [ ] The PR description includes the appropriate Release Notes section,\nand the correct `release_note:*` label is applied per the\n[guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process)\n\n---------\n\nCo-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>\nCo-authored-by: Matthias Wilhelm <matthias.wilhelm@elastic.co>","sha":"257971d4c0f99c0da56b9b817cff731977f8891f"}},{"url":"https://github.com/elastic/kibana/pull/212142","number":212142,"branch":"8.17","state":"OPEN"}]}] BACKPORT--> --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
parent
a4a46f2dec
commit
10396d6bbd
11 changed files with 108 additions and 16 deletions
|
@ -47,7 +47,8 @@
|
||||||
"observabilityAIAssistant",
|
"observabilityAIAssistant",
|
||||||
"aiops",
|
"aiops",
|
||||||
"fieldsMetadata",
|
"fieldsMetadata",
|
||||||
"logsDataAccess"
|
"logsDataAccess",
|
||||||
|
"embeddableEnhanced"
|
||||||
],
|
],
|
||||||
"requiredBundles": [
|
"requiredBundles": [
|
||||||
"kibanaUtils",
|
"kibanaUtils",
|
||||||
|
|
|
@ -62,6 +62,7 @@ import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/publ
|
||||||
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
|
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
|
||||||
import { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
|
import { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
|
||||||
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
|
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
|
||||||
|
import type { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public';
|
||||||
import type { DiscoverStartPlugins } from './types';
|
import type { DiscoverStartPlugins } from './types';
|
||||||
import type { DiscoverContextAppLocator } from './application/context/services/locator';
|
import type { DiscoverContextAppLocator } from './application/context/services/locator';
|
||||||
import type { DiscoverSingleDocLocator } from './application/doc/locator';
|
import type { DiscoverSingleDocLocator } from './application/doc/locator';
|
||||||
|
@ -140,6 +141,7 @@ export interface DiscoverServices {
|
||||||
ebtManager: DiscoverEBTManager;
|
ebtManager: DiscoverEBTManager;
|
||||||
fieldsMetadata?: FieldsMetadataPublicStart;
|
fieldsMetadata?: FieldsMetadataPublicStart;
|
||||||
logsDataAccess?: LogsDataAccessPluginStart;
|
logsDataAccess?: LogsDataAccessPluginStart;
|
||||||
|
embeddableEnhanced?: EmbeddableEnhancedPluginStart;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const buildServices = memoize(
|
export const buildServices = memoize(
|
||||||
|
@ -233,6 +235,7 @@ export const buildServices = memoize(
|
||||||
ebtManager,
|
ebtManager,
|
||||||
fieldsMetadata: plugins.fieldsMetadata,
|
fieldsMetadata: plugins.fieldsMetadata,
|
||||||
logsDataAccess: plugins.logsDataAccess,
|
logsDataAccess: plugins.logsDataAccess,
|
||||||
|
embeddableEnhanced: plugins.embeddableEnhanced,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
* License v3.0 only", or the "Server Side Public License, v 1".
|
* License v3.0 only", or the "Server Side Public License, v 1".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { SavedSearchAttributes } from '@kbn/saved-search-plugin/common';
|
import type { SavedSearchAttributes } from '@kbn/saved-search-plugin/common';
|
||||||
import type { Trigger } from '@kbn/ui-actions-plugin/public';
|
import type { Trigger } from '@kbn/ui-actions-plugin/public';
|
||||||
|
import type { SearchEmbeddableSerializedState } from './types';
|
||||||
|
|
||||||
export { SEARCH_EMBEDDABLE_TYPE } from '@kbn/discover-utils';
|
export { SEARCH_EMBEDDABLE_TYPE } from '@kbn/discover-utils';
|
||||||
|
|
||||||
|
@ -37,9 +38,10 @@ export const EDITABLE_SAVED_SEARCH_KEYS: Readonly<Array<keyof SavedSearchAttribu
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
/** This constant refers to the dashboard panel specific state */
|
/** This constant refers to the dashboard panel specific state */
|
||||||
export const EDITABLE_PANEL_KEYS = [
|
export const EDITABLE_PANEL_KEYS: Readonly<Array<keyof SearchEmbeddableSerializedState>> = [
|
||||||
'title', // panel title
|
'title', // panel title
|
||||||
'description', // panel description
|
'description', // panel description
|
||||||
'timeRange', // panel custom time range
|
'timeRange', // panel custom time range
|
||||||
'hidePanelTitles', // panel hidden title
|
'hidePanelTitles', // panel hidden title
|
||||||
|
'enhancements', // panel enhancements (e.g. drilldowns)
|
||||||
] as const;
|
] as const;
|
||||||
|
|
|
@ -97,6 +97,13 @@ export const getSearchEmbeddableFactory = ({
|
||||||
/** Build API */
|
/** Build API */
|
||||||
const titleManager = initializeTitleManager(initialState);
|
const titleManager = initializeTitleManager(initialState);
|
||||||
const timeRange = initializeTimeRange(initialState);
|
const timeRange = initializeTimeRange(initialState);
|
||||||
|
const dynamicActionsApi =
|
||||||
|
discoverServices.embeddableEnhanced?.initializeReactEmbeddableDynamicActions(
|
||||||
|
uuid,
|
||||||
|
() => titleManager.api.title$.getValue(),
|
||||||
|
initialState
|
||||||
|
);
|
||||||
|
const maybeStopDynamicActions = dynamicActionsApi?.startDynamicActions();
|
||||||
const searchEmbeddable = await initializeSearchEmbeddableApi(initialState, {
|
const searchEmbeddable = await initializeSearchEmbeddableApi(initialState, {
|
||||||
discoverServices,
|
discoverServices,
|
||||||
});
|
});
|
||||||
|
@ -126,6 +133,7 @@ export const getSearchEmbeddableFactory = ({
|
||||||
savedSearch: searchEmbeddable.api.savedSearch$.getValue(),
|
savedSearch: searchEmbeddable.api.savedSearch$.getValue(),
|
||||||
serializeTitles: titleManager.serialize,
|
serializeTitles: titleManager.serialize,
|
||||||
serializeTimeRange: timeRange.serialize,
|
serializeTimeRange: timeRange.serialize,
|
||||||
|
serializeDynamicActions: dynamicActionsApi?.serializeDynamicActions,
|
||||||
savedObjectId,
|
savedObjectId,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -134,6 +142,7 @@ export const getSearchEmbeddableFactory = ({
|
||||||
...titleManager.api,
|
...titleManager.api,
|
||||||
...searchEmbeddable.api,
|
...searchEmbeddable.api,
|
||||||
...timeRange.api,
|
...timeRange.api,
|
||||||
|
...dynamicActionsApi?.dynamicActionsApi,
|
||||||
...initializeEditApi({
|
...initializeEditApi({
|
||||||
uuid,
|
uuid,
|
||||||
parentApi,
|
parentApi,
|
||||||
|
@ -178,10 +187,18 @@ export const getSearchEmbeddableFactory = ({
|
||||||
getSerializedStateByReference: (newId: string) => serialize(newId),
|
getSerializedStateByReference: (newId: string) => serialize(newId),
|
||||||
serializeState: () => serialize(savedObjectId$.getValue()),
|
serializeState: () => serialize(savedObjectId$.getValue()),
|
||||||
getInspectorAdapters: () => searchEmbeddable.stateManager.inspectorAdapters.getValue(),
|
getInspectorAdapters: () => searchEmbeddable.stateManager.inspectorAdapters.getValue(),
|
||||||
|
supportedTriggers: () => {
|
||||||
|
// No triggers are supported, but this is still required to pass the drilldown
|
||||||
|
// compatibilty check and ensure top-level drilldowns (e.g. URL) work as expected
|
||||||
|
return [];
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
...titleManager.comparators,
|
...titleManager.comparators,
|
||||||
...timeRange.comparators,
|
...timeRange.comparators,
|
||||||
|
...(dynamicActionsApi?.dynamicActionsComparator ?? {
|
||||||
|
enhancements: getUnchangingComparator(),
|
||||||
|
}),
|
||||||
...searchEmbeddable.comparators,
|
...searchEmbeddable.comparators,
|
||||||
rawSavedObjectAttributes: getUnchangingComparator(),
|
rawSavedObjectAttributes: getUnchangingComparator(),
|
||||||
savedObjectId: [savedObjectId$, (value) => savedObjectId$.next(value)],
|
savedObjectId: [savedObjectId$, (value) => savedObjectId$.next(value)],
|
||||||
|
@ -206,6 +223,7 @@ export const getSearchEmbeddableFactory = ({
|
||||||
return () => {
|
return () => {
|
||||||
searchEmbeddable.cleanup();
|
searchEmbeddable.cleanup();
|
||||||
unsubscribeFromFetch();
|
unsubscribeFromFetch();
|
||||||
|
maybeStopDynamicActions?.stopDynamicActions();
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
|
@ -7,13 +7,14 @@
|
||||||
* License v3.0 only", or the "Server Side Public License, v 1".
|
* License v3.0 only", or the "Server Side Public License, v 1".
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { DataTableRecord } from '@kbn/discover-utils/types';
|
import type { DataTableRecord } from '@kbn/discover-utils/types';
|
||||||
import type { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public';
|
import type { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public';
|
||||||
import { HasInspectorAdapters } from '@kbn/inspector-plugin/public';
|
import type { HasInspectorAdapters } from '@kbn/inspector-plugin/public';
|
||||||
import {
|
import type {
|
||||||
EmbeddableApiContext,
|
EmbeddableApiContext,
|
||||||
HasEditCapabilities,
|
HasEditCapabilities,
|
||||||
HasLibraryTransforms,
|
HasLibraryTransforms,
|
||||||
|
HasSupportedTriggers,
|
||||||
PublishesBlockingError,
|
PublishesBlockingError,
|
||||||
PublishesDataLoading,
|
PublishesDataLoading,
|
||||||
PublishesSavedObjectId,
|
PublishesSavedObjectId,
|
||||||
|
@ -23,15 +24,17 @@ import {
|
||||||
SerializedTimeRange,
|
SerializedTimeRange,
|
||||||
SerializedTitles,
|
SerializedTitles,
|
||||||
} from '@kbn/presentation-publishing';
|
} from '@kbn/presentation-publishing';
|
||||||
import {
|
import type {
|
||||||
SavedSearch,
|
SavedSearch,
|
||||||
SavedSearchAttributes,
|
SavedSearchAttributes,
|
||||||
SerializableSavedSearch,
|
SerializableSavedSearch,
|
||||||
} from '@kbn/saved-search-plugin/common/types';
|
} from '@kbn/saved-search-plugin/common/types';
|
||||||
import { DataTableColumnsMeta } from '@kbn/unified-data-table';
|
import type { DataTableColumnsMeta } from '@kbn/unified-data-table';
|
||||||
import { BehaviorSubject } from 'rxjs';
|
import type { BehaviorSubject } from 'rxjs';
|
||||||
import { PublishesWritableDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views';
|
import type { PublishesWritableDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views';
|
||||||
import { EDITABLE_SAVED_SEARCH_KEYS } from './constants';
|
import type { DynamicActionsSerializedState } from '@kbn/embeddable-enhanced-plugin/public/plugin';
|
||||||
|
import type { HasDynamicActions } from '@kbn/embeddable-enhanced-plugin/public';
|
||||||
|
import type { EDITABLE_SAVED_SEARCH_KEYS } from './constants';
|
||||||
|
|
||||||
export type SearchEmbeddableState = Pick<
|
export type SearchEmbeddableState = Pick<
|
||||||
SerializableSavedSearch,
|
SerializableSavedSearch,
|
||||||
|
@ -75,6 +78,7 @@ export type EditableSavedSearchAttributes = Partial<
|
||||||
|
|
||||||
export type SearchEmbeddableSerializedState = SerializedTitles &
|
export type SearchEmbeddableSerializedState = SerializedTitles &
|
||||||
SerializedTimeRange &
|
SerializedTimeRange &
|
||||||
|
Partial<DynamicActionsSerializedState> &
|
||||||
EditableSavedSearchAttributes & {
|
EditableSavedSearchAttributes & {
|
||||||
// by value
|
// by value
|
||||||
attributes?: SavedSearchAttributes & { references: SavedSearch['references'] };
|
attributes?: SavedSearchAttributes & { references: SavedSearch['references'] };
|
||||||
|
@ -85,7 +89,8 @@ export type SearchEmbeddableSerializedState = SerializedTitles &
|
||||||
|
|
||||||
export type SearchEmbeddableRuntimeState = SearchEmbeddableSerializedAttributes &
|
export type SearchEmbeddableRuntimeState = SearchEmbeddableSerializedAttributes &
|
||||||
SerializedTitles &
|
SerializedTitles &
|
||||||
SerializedTimeRange & {
|
SerializedTimeRange &
|
||||||
|
Partial<DynamicActionsSerializedState> & {
|
||||||
rawSavedObjectAttributes?: EditableSavedSearchAttributes;
|
rawSavedObjectAttributes?: EditableSavedSearchAttributes;
|
||||||
savedObjectTitle?: string;
|
savedObjectTitle?: string;
|
||||||
savedObjectId?: string;
|
savedObjectId?: string;
|
||||||
|
@ -107,7 +112,9 @@ export type SearchEmbeddableApi = DefaultEmbeddableApi<
|
||||||
HasLibraryTransforms &
|
HasLibraryTransforms &
|
||||||
HasTimeRange &
|
HasTimeRange &
|
||||||
HasInspectorAdapters &
|
HasInspectorAdapters &
|
||||||
Partial<HasEditCapabilities & PublishesSavedObjectId>;
|
Partial<HasEditCapabilities & PublishesSavedObjectId> &
|
||||||
|
HasDynamicActions &
|
||||||
|
HasSupportedTriggers;
|
||||||
|
|
||||||
export interface PublishesSavedSearch {
|
export interface PublishesSavedSearch {
|
||||||
savedSearch$: PublishingSubject<SavedSearch>;
|
savedSearch$: PublishingSubject<SavedSearch>;
|
||||||
|
|
|
@ -121,6 +121,7 @@ describe('Serialization utils', () => {
|
||||||
savedSearch,
|
savedSearch,
|
||||||
serializeTitles: jest.fn(),
|
serializeTitles: jest.fn(),
|
||||||
serializeTimeRange: jest.fn(),
|
serializeTimeRange: jest.fn(),
|
||||||
|
serializeDynamicActions: jest.fn(),
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(serializedState).toEqual({
|
expect(serializedState).toEqual({
|
||||||
|
@ -155,6 +156,7 @@ describe('Serialization utils', () => {
|
||||||
savedSearch,
|
savedSearch,
|
||||||
serializeTitles: jest.fn(),
|
serializeTitles: jest.fn(),
|
||||||
serializeTimeRange: jest.fn(),
|
serializeTimeRange: jest.fn(),
|
||||||
|
serializeDynamicActions: jest.fn(),
|
||||||
savedObjectId: 'test-id',
|
savedObjectId: 'test-id',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -175,6 +177,7 @@ describe('Serialization utils', () => {
|
||||||
savedSearch: { ...savedSearch, sampleSize: 500, sort: [['order_date', 'asc']] },
|
savedSearch: { ...savedSearch, sampleSize: 500, sort: [['order_date', 'asc']] },
|
||||||
serializeTitles: jest.fn(),
|
serializeTitles: jest.fn(),
|
||||||
serializeTimeRange: jest.fn(),
|
serializeTimeRange: jest.fn(),
|
||||||
|
serializeDynamicActions: jest.fn(),
|
||||||
savedObjectId: 'test-id',
|
savedObjectId: 'test-id',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ import {
|
||||||
} from '@kbn/saved-search-plugin/common';
|
} from '@kbn/saved-search-plugin/common';
|
||||||
import { SavedSearchUnwrapResult } from '@kbn/saved-search-plugin/public';
|
import { SavedSearchUnwrapResult } from '@kbn/saved-search-plugin/public';
|
||||||
|
|
||||||
|
import type { DynamicActionsSerializedState } from '@kbn/embeddable-enhanced-plugin/public/plugin';
|
||||||
import { extract, inject } from '../../../common/embeddable/search_inject_extract';
|
import { extract, inject } from '../../../common/embeddable/search_inject_extract';
|
||||||
import { DiscoverServices } from '../../build_services';
|
import { DiscoverServices } from '../../build_services';
|
||||||
import {
|
import {
|
||||||
|
@ -85,6 +86,7 @@ export const serializeState = ({
|
||||||
savedSearch,
|
savedSearch,
|
||||||
serializeTitles,
|
serializeTitles,
|
||||||
serializeTimeRange,
|
serializeTimeRange,
|
||||||
|
serializeDynamicActions,
|
||||||
savedObjectId,
|
savedObjectId,
|
||||||
}: {
|
}: {
|
||||||
uuid: string;
|
uuid: string;
|
||||||
|
@ -92,6 +94,7 @@ export const serializeState = ({
|
||||||
savedSearch: SavedSearch;
|
savedSearch: SavedSearch;
|
||||||
serializeTitles: () => SerializedTitles;
|
serializeTitles: () => SerializedTitles;
|
||||||
serializeTimeRange: () => SerializedTimeRange;
|
serializeTimeRange: () => SerializedTimeRange;
|
||||||
|
serializeDynamicActions: (() => DynamicActionsSerializedState) | undefined;
|
||||||
savedObjectId?: string;
|
savedObjectId?: string;
|
||||||
}): SerializedPanelState<SearchEmbeddableSerializedState> => {
|
}): SerializedPanelState<SearchEmbeddableSerializedState> => {
|
||||||
const searchSource = savedSearch.searchSource;
|
const searchSource = savedSearch.searchSource;
|
||||||
|
@ -115,6 +118,7 @@ export const serializeState = ({
|
||||||
// Serialize the current dashboard state into the panel state **without** updating the saved object
|
// Serialize the current dashboard state into the panel state **without** updating the saved object
|
||||||
...serializeTitles(),
|
...serializeTitles(),
|
||||||
...serializeTimeRange(),
|
...serializeTimeRange(),
|
||||||
|
...serializeDynamicActions?.(),
|
||||||
...overwriteState,
|
...overwriteState,
|
||||||
},
|
},
|
||||||
// No references to extract for by-reference embeddable since all references are stored with by-reference saved object
|
// No references to extract for by-reference embeddable since all references are stored with by-reference saved object
|
||||||
|
|
|
@ -43,6 +43,7 @@ import type { DataVisualizerPluginStart } from '@kbn/data-visualizer-plugin/publ
|
||||||
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
|
import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public';
|
||||||
import type { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
|
import type { LogsDataAccessPluginStart } from '@kbn/logs-data-access-plugin/public';
|
||||||
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
|
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
|
||||||
|
import type { EmbeddableEnhancedPluginStart } from '@kbn/embeddable-enhanced-plugin/public';
|
||||||
import { DiscoverAppLocator } from '../common';
|
import { DiscoverAppLocator } from '../common';
|
||||||
import { DiscoverCustomizationContext } from './customizations';
|
import { DiscoverCustomizationContext } from './customizations';
|
||||||
import { type DiscoverContainerProps } from './components/discover_container';
|
import { type DiscoverContainerProps } from './components/discover_container';
|
||||||
|
@ -174,4 +175,5 @@ export interface DiscoverStartPlugins {
|
||||||
unifiedSearch: UnifiedSearchPublicPluginStart;
|
unifiedSearch: UnifiedSearchPublicPluginStart;
|
||||||
urlForwarding: UrlForwardingStart;
|
urlForwarding: UrlForwardingStart;
|
||||||
usageCollection?: UsageCollectionSetup;
|
usageCollection?: UsageCollectionSetup;
|
||||||
|
embeddableEnhanced?: EmbeddableEnhancedPluginStart;
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"@kbn/discover-contextual-components",
|
"@kbn/discover-contextual-components",
|
||||||
"@kbn/esql-ast",
|
"@kbn/esql-ast",
|
||||||
"@kbn/discover-shared-plugin",
|
"@kbn/discover-shared-plugin",
|
||||||
|
"@kbn/embeddable-enhanced-plugin",
|
||||||
"@kbn/ui-theme"
|
"@kbn/ui-theme"
|
||||||
],
|
],
|
||||||
"exclude": ["target/**/*"]
|
"exclude": ["target/**/*"]
|
||||||
|
|
|
@ -78,7 +78,11 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon
|
||||||
}: {
|
}: {
|
||||||
drilldownName: string;
|
drilldownName: string;
|
||||||
destinationURLTemplate: string;
|
destinationURLTemplate: string;
|
||||||
trigger: 'VALUE_CLICK_TRIGGER' | 'SELECT_RANGE_TRIGGER' | 'IMAGE_CLICK_TRIGGER';
|
trigger:
|
||||||
|
| 'VALUE_CLICK_TRIGGER'
|
||||||
|
| 'SELECT_RANGE_TRIGGER'
|
||||||
|
| 'IMAGE_CLICK_TRIGGER'
|
||||||
|
| 'CONTEXT_MENU_TRIGGER';
|
||||||
}) {
|
}) {
|
||||||
await this.fillInDrilldownName(drilldownName);
|
await this.fillInDrilldownName(drilldownName);
|
||||||
await this.selectTriggerIfNeeded(trigger);
|
await this.selectTriggerIfNeeded(trigger);
|
||||||
|
@ -94,7 +98,11 @@ export function DashboardDrilldownsManageProvider({ getService }: FtrProviderCon
|
||||||
}
|
}
|
||||||
|
|
||||||
async selectTriggerIfNeeded(
|
async selectTriggerIfNeeded(
|
||||||
trigger: 'VALUE_CLICK_TRIGGER' | 'SELECT_RANGE_TRIGGER' | 'IMAGE_CLICK_TRIGGER'
|
trigger:
|
||||||
|
| 'VALUE_CLICK_TRIGGER'
|
||||||
|
| 'SELECT_RANGE_TRIGGER'
|
||||||
|
| 'IMAGE_CLICK_TRIGGER'
|
||||||
|
| 'CONTEXT_MENU_TRIGGER'
|
||||||
) {
|
) {
|
||||||
if (await testSubjects.exists(`triggerPicker`)) {
|
if (await testSubjects.exists(`triggerPicker`)) {
|
||||||
const container = await testSubjects.find(`triggerPicker-${trigger}`);
|
const container = await testSubjects.find(`triggerPicker-${trigger}`);
|
||||||
|
|
|
@ -13,11 +13,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
||||||
const dataGrid = getService('dataGrid');
|
const dataGrid = getService('dataGrid');
|
||||||
const dashboardAddPanel = getService('dashboardAddPanel');
|
const dashboardAddPanel = getService('dashboardAddPanel');
|
||||||
const dashboardPanelActions = getService('dashboardPanelActions');
|
const dashboardPanelActions = getService('dashboardPanelActions');
|
||||||
|
const dashboardDrilldownPanelActions = getService('dashboardDrilldownPanelActions');
|
||||||
|
const dashboardDrilldownsManage = getService('dashboardDrilldownsManage');
|
||||||
const filterBar = getService('filterBar');
|
const filterBar = getService('filterBar');
|
||||||
const esArchiver = getService('esArchiver');
|
const esArchiver = getService('esArchiver');
|
||||||
const kibanaServer = getService('kibanaServer');
|
const kibanaServer = getService('kibanaServer');
|
||||||
const testSubjects = getService('testSubjects');
|
const testSubjects = getService('testSubjects');
|
||||||
const { common, dashboard, header } = getPageObjects(['common', 'dashboard', 'header']);
|
const find = getService('find');
|
||||||
|
const queryBar = getService('queryBar');
|
||||||
|
const { common, dashboard, header, discover } = getPageObjects([
|
||||||
|
'common',
|
||||||
|
'dashboard',
|
||||||
|
'header',
|
||||||
|
'discover',
|
||||||
|
]);
|
||||||
|
|
||||||
describe('discover saved search embeddable', () => {
|
describe('discover saved search embeddable', () => {
|
||||||
before(async () => {
|
before(async () => {
|
||||||
|
@ -106,5 +115,39 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
|
||||||
await header.waitUntilLoadingHasFinished();
|
await header.waitUntilLoadingHasFinished();
|
||||||
await testSubjects.missingOrFail('embeddableError');
|
await testSubjects.missingOrFail('embeddableError');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support URL drilldown', async () => {
|
||||||
|
await addSearchEmbeddableToDashboard();
|
||||||
|
await dashboardDrilldownPanelActions.clickCreateDrilldown();
|
||||||
|
const drilldownName = 'URL drilldown';
|
||||||
|
const urlTemplate =
|
||||||
|
"{{kibanaUrl}}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time:(from:'{{context.panel.timeRange.from}}',to:'{{context.panel.timeRange.to}}'))" +
|
||||||
|
"&_a=(columns:!(_source),filters:{{rison context.panel.filters}},index:'{{context.panel.indexPatternId}}',interval:auto," +
|
||||||
|
"query:(language:{{context.panel.query.language}},query:'clientip:239.190.189.77'),sort:!())";
|
||||||
|
await testSubjects.click('actionFactoryItem-URL_DRILLDOWN');
|
||||||
|
await dashboardDrilldownsManage.fillInDashboardToURLDrilldownWizard({
|
||||||
|
drilldownName,
|
||||||
|
destinationURLTemplate: urlTemplate,
|
||||||
|
trigger: 'CONTEXT_MENU_TRIGGER',
|
||||||
|
});
|
||||||
|
await testSubjects.click('urlDrilldownAdditionalOptions');
|
||||||
|
await testSubjects.click('urlDrilldownOpenInNewTab');
|
||||||
|
await dashboardDrilldownsManage.saveChanges();
|
||||||
|
await dashboard.saveDashboard('Dashboard with URL drilldown', {
|
||||||
|
saveAsNew: true,
|
||||||
|
waitDialogIsClosed: true,
|
||||||
|
exitFromEditMode: true,
|
||||||
|
});
|
||||||
|
await browser.refresh();
|
||||||
|
await header.waitUntilLoadingHasFinished();
|
||||||
|
await dashboard.waitForRenderComplete();
|
||||||
|
await dashboardPanelActions.openContextMenu();
|
||||||
|
await find.clickByLinkText(drilldownName);
|
||||||
|
await discover.waitForDiscoverAppOnScreen();
|
||||||
|
await header.waitUntilLoadingHasFinished();
|
||||||
|
await discover.waitForDocTableLoadingComplete();
|
||||||
|
expect(await queryBar.getQueryString()).to.be('clientip:239.190.189.77');
|
||||||
|
expect(await discover.getHitCount()).to.be('6');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue