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 1824110c85b1a..270f366bddbf2 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 12ec9445f4afc..cf6b507edc070 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 bb443b880e217..faa3d51c19fee 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 427893bd3e6fe..4f297643a28f7 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 a88cd239e2f04..5994892ca2d40 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 d02b484a06a49..b0f5dc98a801a 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 366432a6d6532..4856c98845669 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 caed16edabb1d..057f8bc2afc52 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 6152659e47f27..7756a915139e2 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 8f817dbea35c3..896cd4ad595c9 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 4763a12c29329..d4813d51b589e 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();