From fd98aca6c341c28f19f35309501a033435889f22 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Wed, 3 Mar 2021 21:52:46 -0500 Subject: [PATCH] [Discover] Fix link from dashboard saved search to Discover (#92937) (#93499) * [Discover] Fix link from dashboard saved search to Discover * Fix tests that weren't fully testing the navigation * Fix snapshot * Fix test navigation to context app by reverting to previous * Unskip functional test and fix issue in data grid * Respond to review comments Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../doc_table/components/row_headers.test.js | 1 + .../angular/doc_table/components/table_row.ts | 11 +++++- .../components/table_row/details.html | 2 +- .../angular/doc_table/doc_table.html | 3 +- .../discover_grid_flyout.test.tsx | 18 +++++++--- .../discover_grid/discover_grid_flyout.tsx | 16 ++++++--- .../__snapshots__/doc_viewer.test.tsx.snap | 1 + .../components/doc_viewer/doc_viewer.tsx | 2 +- .../helpers/get_context_url.test.ts | 21 ++++++++--- .../application/helpers/get_context_url.tsx | 12 ++++--- .../apps/context/_discover_navigation.js | 35 ++++++++++++++++++- .../apps/discover/_data_grid_context.ts | 35 ++++++++++++++++++- test/functional/page_objects/discover_page.ts | 4 +++ 13 files changed, 139 insertions(+), 22 deletions(-) diff --git a/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js b/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js index 1824110c85b1..270f366bddbf 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js +++ b/src/plugins/discover/public/application/angular/doc_table/components/row_headers.test.js @@ -58,6 +58,7 @@ describe('Doc Table', () => { setServices({ uiSettings: core.uiSettings, filterManager: dataMock.query.filterManager, + addBasePath: (path) => path, }); setDocViewsRegistry({ diff --git a/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts b/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts index 12ec9445f4af..cf6b507edc07 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts +++ b/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts @@ -105,7 +105,16 @@ export function createTableRowDirective($compile: ng.ICompileService) { $scope.row._id, $scope.indexPattern.id, $scope.columns, - getServices().filterManager + getServices().filterManager, + getServices().addBasePath + ); + }; + + $scope.getSingleDocHref = () => { + return getServices().addBasePath( + `/app/discover#/doc/${$scope.indexPattern.id}/${ + $scope.row._index + }?id=${encodeURIComponent($scope.row._id)}` ); }; diff --git a/src/plugins/discover/public/application/angular/doc_table/components/table_row/details.html b/src/plugins/discover/public/application/angular/doc_table/components/table_row/details.html index bb443b880e21..faa3d51c19fe 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/table_row/details.html +++ b/src/plugins/discover/public/application/angular/doc_table/components/table_row/details.html @@ -31,7 +31,7 @@ diff --git a/src/plugins/discover/public/application/angular/doc_table/doc_table.html b/src/plugins/discover/public/application/angular/doc_table/doc_table.html index 427893bd3e6f..4f297643a28f 100644 --- a/src/plugins/discover/public/application/angular/doc_table/doc_table.html +++ b/src/plugins/discover/public/application/angular/doc_table/doc_table.html @@ -26,7 +26,7 @@
- +
path, + } as unknown) as DiscoverServices + } /> ); @@ -53,17 +58,22 @@ describe('Discover flyout', function () { onClose={onClose} onFilter={jest.fn()} onRemoveColumn={jest.fn()} - services={({ filterManager: createFilterManagerMock() } as unknown) as DiscoverServices} + services={ + ({ + filterManager: createFilterManagerMock(), + addBasePath: (path: string) => `/base${path}`, + } as unknown) as DiscoverServices + } /> ); const actions = findTestSubject(component, 'docTableRowAction'); expect(actions.length).toBe(2); expect(actions.first().prop('href')).toMatchInlineSnapshot( - `"#/doc/index-pattern-with-timefield-id/i?id=1"` + `"/base#/doc/index-pattern-with-timefield-id/i?id=1"` ); expect(actions.last().prop('href')).toMatchInlineSnapshot( - `"#/context/index-pattern-with-timefield-id/1?_g=(filters:!())&_a=(columns:!(date),filters:!())"` + `"/base/app/discover#/context/index-pattern-with-timefield-id/1?_g=(filters:!())&_a=(columns:!(date),filters:!())"` ); findTestSubject(component, 'euiFlyoutCloseButton').simulate('click'); expect(onClose).toHaveBeenCalled(); diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx index a88cd239e2f0..5994892ca2d4 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.tsx @@ -81,9 +81,11 @@ export function DiscoverGridFlyout({ {i18n.translate('discover.grid.tableRow.viewSingleDocumentLinkTextSimple', { @@ -96,7 +98,13 @@ export function DiscoverGridFlyout({ {i18n.translate('discover.grid.tableRow.viewSurroundingDocumentsLinkTextSimple', { diff --git a/src/plugins/discover/public/application/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap index d02b484a06a4..b0f5dc98a801 100644 --- a/src/plugins/discover/public/application/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer/__snapshots__/doc_viewer.test.tsx.snap @@ -3,6 +3,7 @@ exports[`Render with 3 different tabs 1`] = `
+
); diff --git a/src/plugins/discover/public/application/helpers/get_context_url.test.ts b/src/plugins/discover/public/application/helpers/get_context_url.test.ts index 366432a6d653..4856c9884566 100644 --- a/src/plugins/discover/public/application/helpers/get_context_url.test.ts +++ b/src/plugins/discover/public/application/helpers/get_context_url.test.ts @@ -12,19 +12,32 @@ const filterManager = ({ getGlobalFilters: () => [], getAppFilters: () => [], } as unknown) as FilterManager; +const addBasePath = (path: string) => `/base${path}`; describe('Get context url', () => { test('returning a valid context url', async () => { - const url = await getContextUrl('docId', 'ipId', ['test1', 'test2'], filterManager); + const url = await getContextUrl( + 'docId', + 'ipId', + ['test1', 'test2'], + filterManager, + addBasePath + ); expect(url).toMatchInlineSnapshot( - `"#/context/ipId/docId?_g=(filters:!())&_a=(columns:!(test1,test2),filters:!())"` + `"/base/app/discover#/context/ipId/docId?_g=(filters:!())&_a=(columns:!(test1,test2),filters:!())"` ); }); test('returning a valid context url when docId contains whitespace', async () => { - const url = await getContextUrl('doc Id', 'ipId', ['test1', 'test2'], filterManager); + const url = await getContextUrl( + 'doc Id', + 'ipId', + ['test1', 'test2'], + filterManager, + addBasePath + ); expect(url).toMatchInlineSnapshot( - `"#/context/ipId/doc%20Id?_g=(filters:!())&_a=(columns:!(test1,test2),filters:!())"` + `"/base/app/discover#/context/ipId/doc%20Id?_g=(filters:!())&_a=(columns:!(test1,test2),filters:!())"` ); }); }); diff --git a/src/plugins/discover/public/application/helpers/get_context_url.tsx b/src/plugins/discover/public/application/helpers/get_context_url.tsx index caed16edabb1..057f8bc2afc5 100644 --- a/src/plugins/discover/public/application/helpers/get_context_url.tsx +++ b/src/plugins/discover/public/application/helpers/get_context_url.tsx @@ -10,6 +10,7 @@ import { stringify } from 'query-string'; import rison from 'rison-node'; import { url } from '../../../../kibana_utils/common'; import { esFilters, FilterManager } from '../../../../data/public'; +import { DiscoverServices } from '../../build_services'; /** * Helper function to generate an URL to a document in Discover's context view @@ -18,7 +19,8 @@ export function getContextUrl( documentId: string, indexPatternId: string, columns: string[], - filterManager: FilterManager + filterManager: FilterManager, + addBasePath: DiscoverServices['addBasePath'] ) { const globalFilters = filterManager.getGlobalFilters(); const appFilters = filterManager.getAppFilters(); @@ -36,7 +38,9 @@ export function getContextUrl( { encode: false, sort: false } ); - return `#/context/${encodeURIComponent(indexPatternId)}/${encodeURIComponent( - documentId - )}?${hash}`; + return addBasePath( + `/app/discover#/context/${encodeURIComponent(indexPatternId)}/${encodeURIComponent( + documentId + )}?${hash}` + ); } diff --git a/test/functional/apps/context/_discover_navigation.js b/test/functional/apps/context/_discover_navigation.js index 6152659e47f2..7756a915139e 100644 --- a/test/functional/apps/context/_discover_navigation.js +++ b/test/functional/apps/context/_discover_navigation.js @@ -18,8 +18,18 @@ export default function ({ getService, getPageObjects }) { const retry = getService('retry'); const docTable = getService('docTable'); const filterBar = getService('filterBar'); - const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'context']); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'settings', + 'dashboard', + 'context', + 'header', + ]); const testSubjects = getService('testSubjects'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const browser = getService('browser'); describe('context link in discover', () => { before(async () => { @@ -94,5 +104,28 @@ export default function ({ getService, getPageObjects }) { await PageObjects.discover.waitForDiscoverAppOnScreen(); await PageObjects.discover.waitForDocTableLoadingComplete(); }); + + it('navigates to doc view from embeddable', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.saveSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + + await dashboardAddPanel.addSavedSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await docTable.clickRowToggle({ rowIndex: 0 }); + const rowActions = await docTable.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.common.sleep(250); + // accept alert if it pops up + const alert = await browser.getAlert(); + await alert?.accept(); + expect(await browser.getCurrentUrl()).to.contain('#/doc'); + expect(await PageObjects.discover.isShowingDocViewer()).to.be(true); + }); }); } diff --git a/test/functional/apps/discover/_data_grid_context.ts b/test/functional/apps/discover/_data_grid_context.ts index 8f817dbea35c..896cd4ad595c 100644 --- a/test/functional/apps/discover/_data_grid_context.ts +++ b/test/functional/apps/discover/_data_grid_context.ts @@ -20,10 +20,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const filterBar = getService('filterBar'); const dataGrid = getService('dataGrid'); const docTable = getService('docTable'); - const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'settings']); + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'timePicker', + 'settings', + 'dashboard', + 'header', + ]); const defaultSettings = { defaultIndex: 'logstash-*', 'doc_table:legacy': false }; const kibanaServer = getService('kibanaServer'); const esArchiver = getService('esArchiver'); + const dashboardAddPanel = getService('dashboardAddPanel'); + const browser = getService('browser'); describe('discover data grid context tests', () => { before(async () => { @@ -78,5 +87,29 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } expect(disabledFilterCounter).to.be(TEST_FILTER_COLUMN_NAMES.length); }); + + it('navigates to context view from embeddable', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.saveSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + + await dashboardAddPanel.addSavedSearch('my search'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.common.sleep(250); + // accept alert if it pops up + const alert = await browser.getAlert(); + await alert?.accept(); + expect(await browser.getCurrentUrl()).to.contain('#/context'); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await docTable.getRowsText()).to.have.length(6); + }); }); } diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index 4763a12c2932..d4813d51b589 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -229,6 +229,10 @@ export function DiscoverPageProvider({ getService, getPageObjects }: FtrProvider await find.clickByCssSelector('.fa-sort-up'); } + public async isShowingDocViewer() { + return await testSubjects.exists('kbnDocViewer'); + } + public async getMarks() { const table = await docTable.getTable(); const $ = await table.parseDomContent();