From 6ed0143ef82d7836f3d939363c473d71d991678e Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Thu, 25 Feb 2021 18:31:16 -0500 Subject: [PATCH] [Discover] Fix link from dashboard saved search to Discover --- .../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 | 16 ++++++++-- .../discover_grid/discover_grid_flyout.tsx | 8 ++++- .../helpers/get_context_url.test.ts | 21 ++++++++++--- .../application/helpers/get_context_url.tsx | 12 ++++--- .../apps/context/_discover_navigation.js | 31 ++++++++++++++++++- .../apps/discover/_data_grid_context.ts | 31 ++++++++++++++++++- 10 files changed, 119 insertions(+), 17 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 1824110c85b1a9..270f366bddbf24 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 12ec9445f4afcd..cf6b507edc070e 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 bb443b880e2171..faa3d51c19feef 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 427893bd3e6fe8..d3b1027198da45 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,7 +58,12 @@ 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) => path, + } as unknown) as DiscoverServices + } /> ); @@ -63,7 +73,7 @@ describe('Discover flyout', function () { `"#/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:!())"` + `"/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 a88cd239e2f04f..6d919188ba42fd 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 @@ -96,7 +96,13 @@ export function DiscoverGridFlyout({ {i18n.translate('discover.grid.tableRow.viewSurroundingDocumentsLinkTextSimple', { 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 366432a6d6532c..41c7a2a45ce9df 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 caed16edabb1d5..057f8bc2afc522 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 6152659e47f270..f5cc3a323c976e 100644 --- a/test/functional/apps/context/_discover_navigation.js +++ b/test/functional/apps/context/_discover_navigation.js @@ -18,8 +18,17 @@ 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'); describe('context link in discover', () => { before(async () => { @@ -94,5 +103,25 @@ export default function ({ getService, getPageObjects }) { await PageObjects.discover.waitForDiscoverAppOnScreen(); await PageObjects.discover.waitForDocTableLoadingComplete(); }); + + 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 docTable.clickRowToggle({ rowIndex: 0 }); + const rowActions = await docTable.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + const contextFields = await docTable.getFields(); + expect(contextFields.length).to.be.greaterThan(0); + }); }); } diff --git a/test/functional/apps/discover/_data_grid_context.ts b/test/functional/apps/discover/_data_grid_context.ts index 8f817dbea35c3d..4896d974321ea0 100644 --- a/test/functional/apps/discover/_data_grid_context.ts +++ b/test/functional/apps/discover/_data_grid_context.ts @@ -20,10 +20,18 @@ 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'); describe('discover data grid context tests', () => { before(async () => { @@ -78,5 +86,26 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } expect(disabledFilterCounter).to.be(TEST_FILTER_COLUMN_NAMES.length); }); + + // Skipped because there is a bug in the data grid row expansion + it.skip('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 docTable.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + const contextFields = await docTable.getFields(); + expect(contextFields.length).to.be.greaterThan(0); + }); }); }