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 2da02bb722b3f..aecb794efb8f2 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; @@ -236,8 +236,10 @@ function getViewUnderlyingDataArgs({ esQueryConfig ); + const dataViewSpec = indexPatternsCache[meta.id]!.spec; + return { - indexPatternId: meta.id, + dataViewSpec, timeRange, filters: newFilters, query: aggregateQuery.length > 0 ? aggregateQuery[0] : newQuery, @@ -906,10 +908,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)) ); 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 8a3b8d60629cf..2d8b8818c7660 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, @@ -114,7 +114,12 @@ describe('open in discover action', () => { await createOpenInDiscoverAction( locator, - { get: () => ({ isTimeBased: () => true }) } as unknown as DataViewsService, + { + get: () => ({ + isTimeBased: () => true, + toSpec: () => ({ id: 'index-pattern-id' }), + }), + } as unknown as DataViewsService, true ).execute({ embeddable, 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 7342b82109be9..cc638dc3579dc 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 @@ -64,7 +64,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..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(); @@ -176,6 +195,41 @@ 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 checkDiscoverNavigationResult(); + + await browser.closeCurrentWindow(); + const [daashboardHandle] = await browser.getAllWindowHandles(); + await browser.switchToWindow(daashboardHandle); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // adhoc data view should be persisted after refresh + await browser.refresh(); + await checkDiscoverNavigationResult(); }); }); }