From ccc8da1fdfb479e46a119267ea4c262f3de13111 Mon Sep 17 00:00:00 2001 From: Dzmitry Tamashevich Date: Mon, 5 Dec 2022 17:17:43 +0300 Subject: [PATCH 1/8] [Discover] fix discover navigation from lens embeddable --- .../public/dataview_picker/dataview_list.tsx | 2 +- .../page_objects/unified_search_page.ts | 7 ++++ .../lens/public/embeddable/embeddable.tsx | 17 +++++--- .../open_in_discover_helpers.ts | 2 +- .../apps/lens/group1/ad_hoc_data_view.ts | 42 +++++++++++++++++++ 5 files changed, 63 insertions(+), 7 deletions(-) diff --git a/src/plugins/unified_search/public/dataview_picker/dataview_list.tsx b/src/plugins/unified_search/public/dataview_picker/dataview_list.tsx index 108441954b53a..33fd7194ff871 100644 --- a/src/plugins/unified_search/public/dataview_picker/dataview_list.tsx +++ b/src/plugins/unified_search/public/dataview_picker/dataview_list.tsx @@ -50,7 +50,7 @@ export function DataViewsList({ value: id, checked: id === currentDataViewId && !Boolean(isTextBasedLangSelected) ? 'on' : undefined, append: isAdhoc ? ( - + {i18n.translate('unifiedSearch.query.queryBar.indexPattern.temporaryDataviewLabel', { defaultMessage: 'Temporary', })} diff --git a/test/functional/page_objects/unified_search_page.ts b/test/functional/page_objects/unified_search_page.ts index 6dc77ce91cc85..64f1aa666c738 100644 --- a/test/functional/page_objects/unified_search_page.ts +++ b/test/functional/page_objects/unified_search_page.ts @@ -75,6 +75,13 @@ export class UnifiedSearchPageObject extends FtrService { await this.testSubjects.click(adHoc ? 'exploreIndexPatternButton' : 'saveIndexPatternButton'); } + public async isAdHocDataView() { + const dataViewSwitcher = await this.testSubjects.find('discover-dataView-switch-link'); + const dataViewName = await dataViewSwitcher.getVisibleText(); + await dataViewSwitcher.click(); + return await this.testSubjects.exists(`dataViewItemTempBadge-${dataViewName}`); + } + public async selectTextBasedLanguage(language: string) { await this.find.clickByCssSelector( `[data-test-subj="text-based-languages-switcher"] [title="${language}"]` diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 5c75f76a39ac7..5117ca1583a77 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -64,7 +64,7 @@ import type { } from '@kbn/core/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import { BrushTriggerEvent, ClickTriggerEvent, Warnings } from '@kbn/charts-plugin/public'; -import { DataViewPersistableStateService } from '@kbn/data-views-plugin/common'; +import { DataViewPersistableStateService, DataViewSpec } from '@kbn/data-views-plugin/common'; import { getExecutionContextEvents, trackUiCounterEvents } from '../lens_ui_telemetry'; import { Document } from '../persistence'; import { ExpressionWrapper, ExpressionWrapperProps } from './expression_wrapper'; @@ -162,7 +162,7 @@ export interface LensEmbeddableDeps { } export interface ViewUnderlyingDataArgs { - indexPatternId: string; + dataViewSpec: DataViewSpec; timeRange: TimeRange; filters: Filter[]; query: Query | AggregateQuery | undefined; @@ -180,11 +180,12 @@ const getExpressionFromDocument = async ( }; }; -function getViewUnderlyingDataArgs({ +async function getViewUnderlyingDataArgs({ activeDatasource, activeDatasourceState, activeData, dataViews, + dataViewsService, capabilities, query, filters, @@ -196,6 +197,7 @@ function getViewUnderlyingDataArgs({ activeDatasourceState: unknown; activeData: TableInspectorAdapter | undefined; dataViews: DataViewBase[] | undefined; + dataViewsService: DataViewsContract; capabilities: LensEmbeddableDeps['capabilities']; query: ExecutionContextSearch['query']; filters: Filter[]; @@ -212,6 +214,9 @@ function getViewUnderlyingDataArgs({ capabilities ); + // eslint-disable-next-line no-console + console.log('meta', meta); + if (error || !meta) { return; } @@ -236,8 +241,9 @@ function getViewUnderlyingDataArgs({ esQueryConfig ); + const dataView = await dataViewsService.get(meta.id); return { - indexPatternId: meta.id, + dataViewSpec: dataView.toSpec(false), timeRange, filters: newFilters, query: aggregateQuery.length > 0 ? aggregateQuery[0] : newQuery, @@ -934,11 +940,12 @@ export class Embeddable ); } - const viewUnderlyingDataArgs = getViewUnderlyingDataArgs({ + const viewUnderlyingDataArgs = await getViewUnderlyingDataArgs({ activeDatasource: this.activeDataInfo.activeDatasource, activeDatasourceState: this.activeDataInfo.activeDatasourceState, activeData: this.activeDataInfo.activeData, dataViews: this.indexPatterns, + dataViewsService: this.deps.dataViews, capabilities: this.deps.capabilities, query: mergedSearchContext.query, filters: mergedSearchContext.filters || [], diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts index 677a7a4734b2e..f0c08d3c1b48b 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts @@ -53,7 +53,7 @@ async function getDiscoverLocationParams({ // shouldn't be executed because of the isCompatible check throw new Error('Underlying data is not ready'); } - const dataView = await dataViews.get(args.indexPatternId); + const dataView = await dataViews.get(args.dataViewSpec.id!); let filtersToApply = [...(filters || []), ...args.filters]; let timeRangeToApply = args.timeRange; // if the target data view is time based, attempt to split out a time range from the provided filters diff --git a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts index 2ea778c2b8d7f..1f58f6167f040 100644 --- a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts +++ b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts @@ -176,6 +176,48 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.discover.clickFieldListItemToggle('_bytes-runtimefield'); const newDataViewId = await PageObjects.discover.getCurrentDataViewId(); expect(newDataViewId).not.to.equal(prevDataViewId); + expect(await PageObjects.unifiedSearch.isAdHocDataView()).to.be(true); + + await browser.closeCurrentWindow(); + }); + + it('should navigate to discover from embeddable correctly', async () => { + const [lensHandle] = await browser.getAllWindowHandles(); + await browser.switchToWindow(lensHandle); + await PageObjects.header.waitUntilLoadingHasFinished(); + await setupAdHocDataView(); + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'bytes', + }); + + await PageObjects.lens.save( + 'embeddable-test-with-adhoc-data-view', + false, + false, + false, + 'new' + ); + + await testSubjects.click('embeddablePanelToggleMenuIcon'); + await testSubjects.click('embeddablePanelMore-mainMenu'); + await testSubjects.click('embeddablePanelAction-ACTION_OPEN_IN_DISCOVER'); + + const [, discoverHandle] = await browser.getAllWindowHandles(); + await browser.switchToWindow(discoverHandle); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const actualIndexPattern = await ( + await testSubjects.find('discover-dataView-switch-link') + ).getVisibleText(); + expect(actualIndexPattern).to.be('*stash*'); + + const actualDiscoverQueryHits = await testSubjects.getVisibleText( + 'unifiedHistogramQueryHits' + ); + expect(actualDiscoverQueryHits).to.be('14,005'); + expect(await PageObjects.unifiedSearch.isAdHocDataView()).to.be(true); }); }); } From aaaf34c529770b00b35b0a032217b266c45c0e62 Mon Sep 17 00:00:00 2001 From: Dzmitry Tamashevich Date: Mon, 5 Dec 2022 17:20:08 +0300 Subject: [PATCH 2/8] [Discover] remove console log --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 5117ca1583a77..a09a138bba669 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -214,9 +214,6 @@ async function getViewUnderlyingDataArgs({ capabilities ); - // eslint-disable-next-line no-console - console.log('meta', meta); - if (error || !meta) { return; } From 170035da5ba6b99998b635b1721d704041f479e5 Mon Sep 17 00:00:00 2001 From: Dzmitry Tamashevich Date: Tue, 6 Dec 2022 12:58:40 +0300 Subject: [PATCH 3/8] [Discover] --- .../trigger_actions/open_in_discover_action.test.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts index f9b4cd1a9f0e4..a583edbbb85e1 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts @@ -93,7 +93,7 @@ describe('open in discover action', () => { it('navigates to discover when executed', async () => { const viewUnderlyingDataArgs = { - indexPatternId: 'index-pattern-id', + dataViewSpec: { id: 'index-pattern-id' }, timeRange: {}, filters: [], query: undefined, @@ -116,7 +116,12 @@ describe('open in discover action', () => { await createOpenInDiscoverAction( discover, - { get: () => ({ isTimeBased: () => true }) } as unknown as DataViewsService, + { + get: () => ({ + isTimeBased: () => true, + toSpec: () => ({ id: 'index-pattern-id' }), + }), + } as unknown as DataViewsService, true ).execute({ embeddable, From fc06d7b067add5b91ff8ee69c833c76e599664ac Mon Sep 17 00:00:00 2001 From: Dzmitry Tamashevich Date: Wed, 7 Dec 2022 20:21:17 +0300 Subject: [PATCH 4/8] [Discover] apply suggestions, improve tests --- .../lens/public/embeddable/embeddable.tsx | 19 +++++---- .../apps/lens/group1/ad_hoc_data_view.ts | 42 ++++++++++++------- 2 files changed, 38 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 61b5a5ec40f33..163994f251a7d 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -180,7 +180,7 @@ const getExpressionFromDocument = async ( }; }; -async function getViewUnderlyingDataArgs({ +function getViewUnderlyingDataArgs({ activeDatasource, activeDatasourceState, activeData, @@ -238,9 +238,12 @@ async function getViewUnderlyingDataArgs({ esQueryConfig ); - const dataView = await dataViewsService.get(meta.id); + const dataViewSpec = Object.values(indexPatternsCache).find( + (value) => value.id === meta.id + )!.spec; + return { - dataViewSpec: dataView.toSpec(false), + dataViewSpec, timeRange, filters: newFilters, query: aggregateQuery.length > 0 ? aggregateQuery[0] : newQuery, @@ -909,10 +912,10 @@ export class Embeddable const adHocDataviews = await Promise.all( Object.values(this.savedVis?.state.adHocDataViews || {}) .map((persistedSpec) => { - return DataViewPersistableStateService.inject( - persistedSpec, - this.savedVis?.references || [] - ); + return DataViewPersistableStateService.inject(persistedSpec, [ + ...(this.savedVis?.references || []), + ...(this.savedVis?.state.internalReferences || []), + ]); }) .map((spec) => this.deps.dataViews.create(spec)) ); @@ -937,7 +940,7 @@ export class Embeddable ); } - const viewUnderlyingDataArgs = await getViewUnderlyingDataArgs({ + const viewUnderlyingDataArgs = getViewUnderlyingDataArgs({ activeDatasource: this.activeDataInfo.activeDatasource, activeDatasourceState: this.activeDataInfo.activeDatasourceState, activeData: this.activeDataInfo.activeData, diff --git a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts index 1f58f6167f040..af590ace3a0e5 100644 --- a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts +++ b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts @@ -54,6 +54,25 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); } + const checkDiscoverNavigationResult = async () => { + await testSubjects.click('embeddablePanelToggleMenuIcon'); + await testSubjects.click('embeddablePanelMore-mainMenu'); + await testSubjects.click('embeddablePanelAction-ACTION_OPEN_IN_DISCOVER'); + + const [, discoverHandle] = await browser.getAllWindowHandles(); + await browser.switchToWindow(discoverHandle); + await PageObjects.header.waitUntilLoadingHasFinished(); + + const actualIndexPattern = await ( + await testSubjects.find('discover-dataView-switch-link') + ).getVisibleText(); + expect(actualIndexPattern).to.be('*stash*'); + + const actualDiscoverQueryHits = await testSubjects.getVisibleText('unifiedHistogramQueryHits'); + expect(actualDiscoverQueryHits).to.be('14,005'); + expect(await PageObjects.unifiedSearch.isAdHocDataView()).to.be(true); + }; + describe('lens ad hoc data view tests', () => { it('should allow building a chart based on ad hoc data view', async () => { await setupAdHocDataView(); @@ -185,6 +204,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const [lensHandle] = await browser.getAllWindowHandles(); await browser.switchToWindow(lensHandle); await PageObjects.header.waitUntilLoadingHasFinished(); + await setupAdHocDataView(); await PageObjects.lens.configureDimension({ dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', @@ -200,24 +220,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'new' ); - await testSubjects.click('embeddablePanelToggleMenuIcon'); - await testSubjects.click('embeddablePanelMore-mainMenu'); - await testSubjects.click('embeddablePanelAction-ACTION_OPEN_IN_DISCOVER'); + await checkDiscoverNavigationResult(); - const [, discoverHandle] = await browser.getAllWindowHandles(); - await browser.switchToWindow(discoverHandle); + await browser.closeCurrentWindow(); + const [daashboardHandle] = await browser.getAllWindowHandles(); + await browser.switchToWindow(daashboardHandle); await PageObjects.header.waitUntilLoadingHasFinished(); - const actualIndexPattern = await ( - await testSubjects.find('discover-dataView-switch-link') - ).getVisibleText(); - expect(actualIndexPattern).to.be('*stash*'); - - const actualDiscoverQueryHits = await testSubjects.getVisibleText( - 'unifiedHistogramQueryHits' - ); - expect(actualDiscoverQueryHits).to.be('14,005'); - expect(await PageObjects.unifiedSearch.isAdHocDataView()).to.be(true); + // adhoc data view should be persisted after refresh + await browser.refresh(); + await checkDiscoverNavigationResult(); }); }); } From ce5ec3e2a0659f93cb114ffbee4614deedb1d361 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+dimaanj@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:10:44 +0300 Subject: [PATCH 5/8] Update x-pack/plugins/lens/public/embeddable/embeddable.tsx Co-authored-by: Marco Liberati --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 163994f251a7d..4e7e0d98ee0a8 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -238,9 +238,7 @@ function getViewUnderlyingDataArgs({ esQueryConfig ); - const dataViewSpec = Object.values(indexPatternsCache).find( - (value) => value.id === meta.id - )!.spec; + const dataViewSpec = indexPatternsCache[meta.id]!.spec; return { dataViewSpec, From 1a52ceab04f0df9669dd8fa0facc068c43922825 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+dimaanj@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:11:32 +0300 Subject: [PATCH 6/8] Update x-pack/plugins/lens/public/embeddable/embeddable.tsx Co-authored-by: Marco Liberati --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 4e7e0d98ee0a8..8ecfe5d66a0e0 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -197,7 +197,6 @@ function getViewUnderlyingDataArgs({ activeDatasourceState: unknown; activeData: TableInspectorAdapter | undefined; dataViews: DataViewBase[] | undefined; - dataViewsService: DataViewsContract; capabilities: LensEmbeddableDeps['capabilities']; query: ExecutionContextSearch['query']; filters: Filter[]; From cf9373947c8c829faae1f2bd51ec00dd6e5050e5 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+dimaanj@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:11:42 +0300 Subject: [PATCH 7/8] Update x-pack/plugins/lens/public/embeddable/embeddable.tsx Co-authored-by: Marco Liberati --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 8ecfe5d66a0e0..351e3e4961517 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -942,7 +942,6 @@ export class Embeddable activeDatasourceState: this.activeDataInfo.activeDatasourceState, activeData: this.activeDataInfo.activeData, dataViews: this.indexPatterns, - dataViewsService: this.deps.dataViews, capabilities: this.deps.capabilities, query: mergedSearchContext.query, filters: mergedSearchContext.filters || [], From b3a2be704a68b5f9c6abc5bac667b588879f8f3c Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+dimaanj@users.noreply.github.com> Date: Thu, 8 Dec 2022 16:11:49 +0300 Subject: [PATCH 8/8] Update x-pack/plugins/lens/public/embeddable/embeddable.tsx Co-authored-by: Marco Liberati --- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 351e3e4961517..aecb794efb8f2 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -185,7 +185,6 @@ function getViewUnderlyingDataArgs({ activeDatasourceState, activeData, dataViews, - dataViewsService, capabilities, query, filters,