From cea96a31d1fed11ca5b513f6adf38c5884219eb7 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Wed, 2 Feb 2022 11:39:55 +0200 Subject: [PATCH 01/13] Add DocView links pluggable injection capability Signed-off-by: sitbubu --- .../components/table_row/details.html | 28 +++------- .../application/angular/doc_viewer_links.tsx | 28 ++++++++++ .../doc_viewer_links.test.tsx.snap | 25 +++++++++ .../doc_viewer_links/doc_viewer_links.scss | 21 ++++++++ .../doc_viewer_links.test.tsx | 44 ++++++++++++++++ .../doc_viewer_links/doc_viewer_links.tsx | 25 +++++++++ .../doc_views_links_registry.ts | 18 +++++++ .../doc_views_links/doc_views_links_types.ts | 20 ++++++++ .../discover/public/get_inner_angular.ts | 4 +- .../public/opensearch_dashboards_services.ts | 5 ++ src/plugins/discover/public/plugin.ts | 51 ++++++++++++++++++- .../opensearch_dashboards.json | 8 +++ .../doc_views_links_plugin/package.json | 17 +++++++ .../doc_views_links_plugin/public/index.ts | 8 +++ .../doc_views_links_plugin/public/plugin.tsx | 39 ++++++++++++++ .../doc_views_links_plugin/tsconfig.json | 17 +++++++ 16 files changed, 334 insertions(+), 24 deletions(-) create mode 100644 src/plugins/discover/public/application/angular/doc_viewer_links.tsx create mode 100644 src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap create mode 100644 src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss create mode 100644 src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx create mode 100644 src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx create mode 100644 src/plugins/discover/public/application/doc_views_links/doc_views_links_registry.ts create mode 100644 src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts create mode 100644 test/plugin_functional/plugins/doc_views_links_plugin/opensearch_dashboards.json create mode 100644 test/plugin_functional/plugins/doc_views_links_plugin/package.json create mode 100644 test/plugin_functional/plugins/doc_views_links_plugin/public/index.ts create mode 100644 test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx create mode 100644 test/plugin_functional/plugins/doc_views_links_plugin/tsconfig.json 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 fd20bea8fb3d..a28f1b9906cb 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 @@ -15,28 +15,12 @@ -
-
-
- -
-
- -
-
+
+
diff --git a/src/plugins/discover/public/application/angular/doc_viewer_links.tsx b/src/plugins/discover/public/application/angular/doc_viewer_links.tsx new file mode 100644 index 000000000000..763a75e51300 --- /dev/null +++ b/src/plugins/discover/public/application/angular/doc_viewer_links.tsx @@ -0,0 +1,28 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { DocViewerLinks } from '../components/doc_viewer_links/doc_viewer_links'; + +export function createDocViewerLinksDirective(reactDirective: any) { + return reactDirective( + (props: any) => { + return ; + }, + [ + 'hit', + ['indexPattern', { watchDepth: 'reference' }], + ['columns', { watchDepth: 'collection' }], + ], + { + restrict: 'E', + scope: { + hit: '=', + indexPattern: '=', + columns: '=?', + }, + } + ); +} diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap new file mode 100644 index 000000000000..282d75bffab1 --- /dev/null +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Render with 2 different links 1`] = ` +
+ +
+`; diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss new file mode 100644 index 000000000000..d976fe912565 --- /dev/null +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss @@ -0,0 +1,21 @@ +.osdDocViewerLinks { + .euiListGroup { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + display: inline; + + .euiListGroupItem { + float: left; + padding: 0; + margin: 0 5px; + display: inline-block; + + a { + padding: 0; + margin: 0; + } + } + } +} \ No newline at end of file diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx new file mode 100644 index 000000000000..ab86883af6e6 --- /dev/null +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx @@ -0,0 +1,44 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import { DocViewerLinks } from './doc_viewer_links'; +import { getDocViewsLinksRegistry } from '../../../opensearch_dashboards_services'; +import { DocViewLinkRenderProps } from '../../doc_views_links/doc_views_links_types'; + +jest.mock('../../../opensearch_dashboards_services', () => { + let registry: any[] = []; + return { + getDocViewsLinksRegistry: () => ({ + addDocViewLink(view: any) { + registry.push(view); + }, + getDocViewsLinksSorted() { + return registry; + }, + resetRegistry: () => { + registry = []; + }, + }), + }; +}); + +beforeEach(() => { + (getDocViewsLinksRegistry() as any).resetRegistry(); + jest.clearAllMocks(); +}); + +test('Render with 2 different links', () => { + const registry = getDocViewsLinksRegistry(); + registry.addDocViewLink({ order: 10, label: 'generateUrlFn link', generateUrlFn: () => 'aaa' }); + registry.addDocViewLink({ order: 20, label: 'href link', href: 'bbb' }); + + const renderProps = { hit: {} } as DocViewLinkRenderProps; + + const wrapper = shallow(); + + expect(wrapper).toMatchSnapshot(); +}); diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx new file mode 100644 index 000000000000..19c028c8cb52 --- /dev/null +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -0,0 +1,25 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import './doc_viewer_links.scss'; +import React from 'react'; +import { EuiListGroup } from '@elastic/eui'; +import { getDocViewsLinksRegistry } from '../../../opensearch_dashboards_services'; +import { DocViewLinkRenderProps } from '../../doc_views_links/doc_views_links_types'; + +export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { + const listItems = getDocViewsLinksRegistry() + .getDocViewsLinksSorted() + .map((item) => { + item.href = item.generateUrlFn ? item.generateUrlFn(renderProps) : item.href; + return item; + }); + + return ( +
+ +
+ ); +} diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_registry.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_registry.ts new file mode 100644 index 000000000000..16653f5d5377 --- /dev/null +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_registry.ts @@ -0,0 +1,18 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { DocViewLink } from './doc_views_links_types'; + +export class DocViewsLinksRegistry { + private docViewsLinks: DocViewLink[] = []; + + addDocViewLink(docViewLink: DocViewLink) { + this.docViewsLinks.push(docViewLink); + } + + getDocViewsLinksSorted() { + return this.docViewsLinks.sort((a, b) => (Number(a.order) > Number(b.order) ? 1 : -1)); + } +} diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts new file mode 100644 index 000000000000..8df98e992d83 --- /dev/null +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts @@ -0,0 +1,20 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { EuiListGroupItemProps } from '@elastic/eui'; +import { OpenSearchSearchHit } from '../doc_views/doc_views_types'; +import { IndexPattern } from '../../../../data/public'; + +export interface DocViewLink extends EuiListGroupItemProps { + href?: string; + order: number; + generateUrlFn?(renderProps: any): string; +} + +export interface DocViewLinkRenderProps { + columns?: string[]; + hit: OpenSearchSearchHit; + indexPattern: IndexPattern; +} diff --git a/src/plugins/discover/public/get_inner_angular.ts b/src/plugins/discover/public/get_inner_angular.ts index 6764f6caccea..b4a7a17357ab 100644 --- a/src/plugins/discover/public/get_inner_angular.ts +++ b/src/plugins/discover/public/get_inner_angular.ts @@ -51,6 +51,7 @@ import { createTableRowDirective } from './application/angular/doc_table/compone import { createPagerFactory } from './application/angular/doc_table/lib/pager/pager_factory'; import { createInfiniteScrollDirective } from './application/angular/doc_table/infinite_scroll'; import { createDocViewerDirective } from './application/angular/doc_viewer'; +import { createDocViewerLinksDirective } from './application/angular/doc_viewer_links'; import { createRenderCompleteDirective } from './application/angular/directives/render_complete'; import { initAngularBootstrap, @@ -202,5 +203,6 @@ function createDocTableModule() { .directive('osdTableRow', createTableRowDirective) .directive('toolBarPagerButtons', createToolBarPagerButtonsDirective) .directive('osdInfiniteScroll', createInfiniteScrollDirective) - .directive('docViewer', createDocViewerDirective); + .directive('docViewer', createDocViewerDirective) + .directive('docViewerLinks', createDocViewerLinksDirective); } diff --git a/src/plugins/discover/public/opensearch_dashboards_services.ts b/src/plugins/discover/public/opensearch_dashboards_services.ts index eb06e88ecacf..8531564e0cc7 100644 --- a/src/plugins/discover/public/opensearch_dashboards_services.ts +++ b/src/plugins/discover/public/opensearch_dashboards_services.ts @@ -36,6 +36,7 @@ import { DiscoverServices } from './build_services'; import { createGetterSetter } from '../../opensearch_dashboards_utils/public'; import { search } from '../../data/public'; import { DocViewsRegistry } from './application/doc_views/doc_views_registry'; +import { DocViewsLinksRegistry } from './application/doc_views_links/doc_views_links_registry'; let angularModule: any = null; let services: DiscoverServices | null = null; @@ -81,6 +82,10 @@ export const [getUrlTracker, setUrlTracker] = createGetterSetter<{ export const [getDocViewsRegistry, setDocViewsRegistry] = createGetterSetter( 'DocViewsRegistry' ); + +export const [getDocViewsLinksRegistry, setDocViewsLinksRegistry] = createGetterSetter< + DocViewsLinksRegistry +>('DocViewsLinksRegistry'); /** * Makes sure discover and context are using one instance of history. */ diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index ea8659489d40..f5b500032e90 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -54,17 +54,22 @@ import { import { UrlForwardingSetup, UrlForwardingStart } from 'src/plugins/url_forwarding/public'; import { HomePublicPluginSetup } from 'src/plugins/home/public'; import { Start as InspectorPublicPluginStart } from 'src/plugins/inspector/public'; +import { stringify } from 'query-string'; +import rison from 'rison-node'; import { DataPublicPluginStart, DataPublicPluginSetup, opensearchFilters } from '../../data/public'; import { SavedObjectLoader } from '../../saved_objects/public'; -import { createOsdUrlTracker } from '../../opensearch_dashboards_utils/public'; +import { createOsdUrlTracker, url } from '../../opensearch_dashboards_utils/public'; import { DEFAULT_APP_CATEGORIES } from '../../../core/public'; import { UrlGeneratorState } from '../../share/public'; import { DocViewInput, DocViewInputFn } from './application/doc_views/doc_views_types'; +import { DocViewLink } from './application/doc_views_links/doc_views_links_types'; import { DocViewsRegistry } from './application/doc_views/doc_views_registry'; +import { DocViewsLinksRegistry } from './application/doc_views_links/doc_views_links_registry'; import { DocViewTable } from './application/components/table/table'; import { JsonCodeBlock } from './application/components/json_code_block/json_code_block'; import { setDocViewsRegistry, + setDocViewsLinksRegistry, setUrlTracker, setAngularModule, setServices, @@ -103,6 +108,10 @@ export interface DiscoverSetup { */ addDocView(docViewRaw: DocViewInput | DocViewInputFn): void; }; + + docViewsLinks: { + addDocViewLink(docViewLinkRaw: DocViewLink): void; + }; } export interface DiscoverStart { @@ -171,6 +180,7 @@ export class DiscoverPlugin private appStateUpdater = new BehaviorSubject(() => ({})); private docViewsRegistry: DocViewsRegistry | null = null; + private docViewsLinksRegistry: DocViewsLinksRegistry | null = null; private embeddableInjector: auto.IInjectorService | null = null; private stopUrlTracking: (() => void) | undefined = undefined; private servicesInitialized: boolean = false; @@ -205,6 +215,7 @@ export class DiscoverPlugin order: 10, component: DocViewTable, }); + this.docViewsRegistry.addDocView({ title: i18n.translate('discover.docViews.json.jsonTitle', { defaultMessage: 'JSON', @@ -213,6 +224,44 @@ export class DiscoverPlugin component: JsonCodeBlock, }); + this.docViewsLinksRegistry = new DocViewsLinksRegistry(); + setDocViewsLinksRegistry(this.docViewsLinksRegistry); + + this.docViewsLinksRegistry.addDocViewLink({ + label: 'View surrounding documents', + generateUrlFn: (renderProps: any) => { + const globalFilters: any = getServices().filterManager.getGlobalFilters(); + const appFilters: any = getServices().filterManager.getAppFilters(); + + const hash = stringify( + url.encodeQuery({ + _g: rison.encode({ + filters: globalFilters || [], + }), + _a: rison.encode({ + columns: renderProps.columns, + filters: (appFilters || []).map(opensearchFilters.disableFilter), + }), + }), + { encode: false, sort: false } + ); + + return `#/context/${encodeURIComponent(renderProps.indexPattern.id)}/${encodeURIComponent( + renderProps.hit._id + )}?${hash}`; + }, + order: 1, + }); + + this.docViewsLinksRegistry.addDocViewLink({ + label: 'View single document', + generateUrlFn: (renderProps) => + `#/doc/${renderProps.indexPattern.id}/${renderProps.hit._index}?id=${encodeURIComponent( + renderProps.hit._id + )}`, + order: 2, + }); + const { appMounted, appUnMounted, diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/opensearch_dashboards.json b/test/plugin_functional/plugins/doc_views_links_plugin/opensearch_dashboards.json new file mode 100644 index 000000000000..0cda322f6169 --- /dev/null +++ b/test/plugin_functional/plugins/doc_views_links_plugin/opensearch_dashboards.json @@ -0,0 +1,8 @@ +{ + "id": "docViewLinksPlugin", + "version": "0.0.1", + "opensearchDashboardsVersion": "opensearchDashboards", + "server": false, + "ui": true, + "requiredPlugins": ["discover"] +} \ No newline at end of file diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/package.json b/test/plugin_functional/plugins/doc_views_links_plugin/package.json new file mode 100644 index 000000000000..92cfca078156 --- /dev/null +++ b/test/plugin_functional/plugins/doc_views_links_plugin/package.json @@ -0,0 +1,17 @@ +{ + "name": "docViewLinksPlugin", + "version": "1.0.0", + "main": "target/test/plugin_functional/plugins/doc_views_links_plugin", + "opensearchDashboards": { + "version": "opensearchDashboards", + "templateVersion": "1.0.0" + }, + "license": "Apache-2.0", + "scripts": { + "osd": "node ../../../../scripts/osd.js", + "build": "rm -rf './target' && tsc" + }, + "devDependencies": { + "typescript": "4.0.2" + } +} \ No newline at end of file diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/index.ts b/test/plugin_functional/plugins/doc_views_links_plugin/public/index.ts new file mode 100644 index 000000000000..047330d37b3e --- /dev/null +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { DocViewsLinksPlugin } from './plugin'; + +export const plugin = () => new DocViewsLinksPlugin(); diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx new file mode 100644 index 000000000000..db92c69f4f4b --- /dev/null +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -0,0 +1,39 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import angular from 'angular'; +import React from 'react'; +import { Plugin, CoreSetup } from 'opensearch-dashboards/public'; +import { DiscoverSetup } from '../../../../../src/plugins/discover/public'; + +angular.module('myDocViewLink', []).directive('myHit', () => ({ + restrict: 'E', + scope: { + hit: '=hit', + }, + template: '

{{hit._index}}

', +})); + +function MyHit(props: { index: string }) { + return

{props.index}

; +} + +export class DocViewsLinksPlugin implements Plugin { + public setup(core: CoreSetup, { discover }: { discover: DiscoverSetup }) { + discover.docViewsLinks.addDocViewLink({ + href: 'http://locationHref', + order: 1, + label: 'href doc view link', + }); + + discover.docViewsLinks.addDocViewLink({ + generateUrlFn: (props) => 'http://locationHref', + order: 2, + label: 'generateUrlFn doc view link', + }); + } + + public start() {} +} diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/tsconfig.json b/test/plugin_functional/plugins/doc_views_links_plugin/tsconfig.json new file mode 100644 index 000000000000..8a481ba6e642 --- /dev/null +++ b/test/plugin_functional/plugins/doc_views_links_plugin/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./target", + "skipLibCheck": true + }, + "include": [ + "index.ts", + "public/**/*.ts", + "public/**/*.tsx", + "../../../../typings/**/*" + ], + "exclude": [], + "references": [ + { "path": "../../../../src/core/tsconfig.json" } + ] +} \ No newline at end of file From 0eeac1d172f4a4d6f56050a4fb235ab861830b7f Mon Sep 17 00:00:00 2001 From: sitbubu Date: Fri, 18 Feb 2022 15:59:42 +0200 Subject: [PATCH 02/13] Add proper e2e + bugfix Signed-off-by: sitbubu --- src/plugins/discover/public/mocks.ts | 3 ++ src/plugins/discover/public/plugin.ts | 3 ++ test/plugin_functional/config.ts | 1 + .../doc_views_links_plugin/public/plugin.tsx | 4 +- .../doc_views_links/doc_views_links.ts | 40 +++++++++++++++++++ .../test_suites/doc_views_links/index.ts | 18 +++++++++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts create mode 100644 test/plugin_functional/test_suites/doc_views_links/index.ts diff --git a/src/plugins/discover/public/mocks.ts b/src/plugins/discover/public/mocks.ts index 6f4d7b8ea4f7..4724ced290ff 100644 --- a/src/plugins/discover/public/mocks.ts +++ b/src/plugins/discover/public/mocks.ts @@ -38,6 +38,9 @@ const createSetupContract = (): Setup => { docViews: { addDocView: jest.fn(), }, + docViewsLinks: { + addDocViewLink: jest.fn(), + }, }; return setupContract; }; diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index f5b500032e90..3ae388e2de1e 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -368,6 +368,9 @@ export class DiscoverPlugin docViews: { addDocView: this.docViewsRegistry.addDocView.bind(this.docViewsRegistry), }, + docViewsLinks: { + addDocViewLink: this.docViewsLinksRegistry.addDocViewLink.bind(this.docViewsLinksRegistry), + }, }; } diff --git a/test/plugin_functional/config.ts b/test/plugin_functional/config.ts index e2f725c50bc9..e733a4e36368 100644 --- a/test/plugin_functional/config.ts +++ b/test/plugin_functional/config.ts @@ -49,6 +49,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('./test_suites/core_plugins'), require.resolve('./test_suites/management'), require.resolve('./test_suites/doc_views'), + require.resolve('./test_suites/doc_views_links'), require.resolve('./test_suites/application_links'), require.resolve('./test_suites/data_plugin'), ], diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx index db92c69f4f4b..034f12ea19ad 100644 --- a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -23,13 +23,13 @@ function MyHit(props: { index: string }) { export class DocViewsLinksPlugin implements Plugin { public setup(core: CoreSetup, { discover }: { discover: DiscoverSetup }) { discover.docViewsLinks.addDocViewLink({ - href: 'http://locationHref', + href: 'http://some-url/', order: 1, label: 'href doc view link', }); discover.docViewsLinks.addDocViewLink({ - generateUrlFn: (props) => 'http://locationHref', + generateUrlFn: (props) => 'http://some-url/', order: 2, label: 'generateUrlFn doc view link', }); diff --git a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts new file mode 100644 index 000000000000..7a2a880f8340 --- /dev/null +++ b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts @@ -0,0 +1,40 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import expect from '@osd/expect'; +import { PluginFunctionalProviderContext } from '../../services'; + +export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const browser = getService('browser'); + const PageObjects = getPageObjects(['common', 'discover', 'timePicker']); + + describe('custom doc views links', function () { + beforeEach(async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await testSubjects.click('docTableExpandToggleColumn'); + }); + + it('should show href doc views link', async () => { + const hrefLink = await find.byLinkText('href doc view link'); + await find.byLinkText('generateUrlFn doc view link'); + expect(await hrefLink.isDisplayed()).to.be(true); + }); + + it('should render href doc view link', async () => { + const hrefLink = await find.byLinkText('href doc view link'); + await hrefLink.click(); + expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); + }); + + it('should render react doc view', async () => { + const generateUrlFnLink = await find.byLinkText('generateUrlFn doc view link'); + await generateUrlFnLink.click(); + expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); + }); + }); +} diff --git a/test/plugin_functional/test_suites/doc_views_links/index.ts b/test/plugin_functional/test_suites/doc_views_links/index.ts new file mode 100644 index 000000000000..b894edb4db0a --- /dev/null +++ b/test/plugin_functional/test_suites/doc_views_links/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { PluginFunctionalProviderContext } from '../../services'; + +export default function ({ getService, loadTestFile }: PluginFunctionalProviderContext) { + const opensearchArchiver = getService('opensearchArchiver'); + + describe('doc views links', function () { + before(async () => { + await opensearchArchiver.loadIfNeeded('../functional/fixtures/opensearch_archiver/discover'); + }); + + loadTestFile(require.resolve('./doc_views_links')); + }); +} From 94106120b4195650283b8cd8c4395ecf85844de0 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 22 Feb 2022 11:08:09 +0200 Subject: [PATCH 03/13] set prop as lower case Signed-off-by: sitbubu --- .../__snapshots__/doc_viewer_links.test.tsx.snap | 4 ++-- .../components/doc_viewer_links/doc_viewer_links.test.tsx | 2 +- .../components/doc_viewer_links/doc_viewer_links.tsx | 2 +- .../application/doc_views_links/doc_views_links_types.ts | 2 +- src/plugins/discover/public/plugin.ts | 4 ++-- .../plugins/doc_views_links_plugin/public/plugin.tsx | 6 +++--- .../test_suites/doc_views_links/doc_views_links.ts | 7 ++++--- 7 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index 282d75bffab1..2f9afed1b379 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -8,9 +8,9 @@ exports[`Render with 2 different links 1`] = ` listItems={ Array [ Object { - "generateUrlFn": [Function], + "generateurlfn": [Function], "href": "aaa", - "label": "generateUrlFn link", + "label": "generateurlfn link", "order": 10, }, Object { diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx index ab86883af6e6..2ef2a90f5128 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx @@ -33,7 +33,7 @@ beforeEach(() => { test('Render with 2 different links', () => { const registry = getDocViewsLinksRegistry(); - registry.addDocViewLink({ order: 10, label: 'generateUrlFn link', generateUrlFn: () => 'aaa' }); + registry.addDocViewLink({ order: 10, label: 'generateurlfn link', generateurlfn: () => 'aaa' }); registry.addDocViewLink({ order: 20, label: 'href link', href: 'bbb' }); const renderProps = { hit: {} } as DocViewLinkRenderProps; diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 19c028c8cb52..2627b1e71529 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -13,7 +13,7 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { const listItems = getDocViewsLinksRegistry() .getDocViewsLinksSorted() .map((item) => { - item.href = item.generateUrlFn ? item.generateUrlFn(renderProps) : item.href; + item.href = item.generateurlfn ? item.generateurlfn(renderProps) : item.href; return item; }); diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts index 8df98e992d83..b760279bc623 100644 --- a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts @@ -10,7 +10,7 @@ import { IndexPattern } from '../../../../data/public'; export interface DocViewLink extends EuiListGroupItemProps { href?: string; order: number; - generateUrlFn?(renderProps: any): string; + generateurlfn?(renderProps: any): string; } export interface DocViewLinkRenderProps { diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index 3ae388e2de1e..b85e5ffa7cd0 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -229,7 +229,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View surrounding documents', - generateUrlFn: (renderProps: any) => { + generateurlfn: (renderProps: any) => { const globalFilters: any = getServices().filterManager.getGlobalFilters(); const appFilters: any = getServices().filterManager.getAppFilters(); @@ -255,7 +255,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View single document', - generateUrlFn: (renderProps) => + generateurlfn: (renderProps) => `#/doc/${renderProps.indexPattern.id}/${renderProps.hit._index}?id=${encodeURIComponent( renderProps.hit._id )}`, diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx index 034f12ea19ad..9a1e0cf02982 100644 --- a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -17,7 +17,7 @@ angular.module('myDocViewLink', []).directive('myHit', () => ({ })); function MyHit(props: { index: string }) { - return

{props.index}

; + return

{props.index}

; } export class DocViewsLinksPlugin implements Plugin { @@ -29,9 +29,9 @@ export class DocViewsLinksPlugin implements Plugin { }); discover.docViewsLinks.addDocViewLink({ - generateUrlFn: (props) => 'http://some-url/', + generateurlfn: () => 'http://some-url/', order: 2, - label: 'generateUrlFn doc view link', + label: 'generateurlfn doc view link', }); } diff --git a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts index 7a2a880f8340..a5e063c42c98 100644 --- a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts +++ b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts @@ -21,7 +21,8 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should show href doc views link', async () => { const hrefLink = await find.byLinkText('href doc view link'); - await find.byLinkText('generateUrlFn doc view link'); + await find.byLinkText('generateurlfn doc view link'); + expect(await hrefLink.isDisplayed()).to.be(true); }); @@ -32,8 +33,8 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); it('should render react doc view', async () => { - const generateUrlFnLink = await find.byLinkText('generateUrlFn doc view link'); - await generateUrlFnLink.click(); + const generateurlfnLink = await find.byLinkText('generateurlfn doc view link'); + await generateurlfnLink.click(); expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); }); From 09ba5ce2678259fbe64df7366722cf0d12dd6a9c Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 22 Feb 2022 11:11:19 +0200 Subject: [PATCH 04/13] Better name Signed-off-by: sitbubu --- .../__snapshots__/doc_viewer_links.test.tsx.snap | 4 ++-- .../components/doc_viewer_links/doc_viewer_links.test.tsx | 2 +- .../components/doc_viewer_links/doc_viewer_links.tsx | 2 +- .../application/doc_views_links/doc_views_links_types.ts | 2 +- src/plugins/discover/public/plugin.ts | 4 ++-- .../plugins/doc_views_links_plugin/public/plugin.tsx | 6 +++--- .../test_suites/doc_views_links/doc_views_links.ts | 6 +++--- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index 2f9afed1b379..76b1a68234e2 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -8,9 +8,9 @@ exports[`Render with 2 different links 1`] = ` listItems={ Array [ Object { - "generateurlfn": [Function], + "generateurlcb": [Function], "href": "aaa", - "label": "generateurlfn link", + "label": "generateurlcb link", "order": 10, }, Object { diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx index 2ef2a90f5128..a7c5406f2162 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx @@ -33,7 +33,7 @@ beforeEach(() => { test('Render with 2 different links', () => { const registry = getDocViewsLinksRegistry(); - registry.addDocViewLink({ order: 10, label: 'generateurlfn link', generateurlfn: () => 'aaa' }); + registry.addDocViewLink({ order: 10, label: 'generateurlcb link', generateurlcb: () => 'aaa' }); registry.addDocViewLink({ order: 20, label: 'href link', href: 'bbb' }); const renderProps = { hit: {} } as DocViewLinkRenderProps; diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 2627b1e71529..988718701c87 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -13,7 +13,7 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { const listItems = getDocViewsLinksRegistry() .getDocViewsLinksSorted() .map((item) => { - item.href = item.generateurlfn ? item.generateurlfn(renderProps) : item.href; + item.href = item.generateurlcb ? item.generateurlcb(renderProps) : item.href; return item; }); diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts index b760279bc623..2c755df047ef 100644 --- a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts @@ -10,7 +10,7 @@ import { IndexPattern } from '../../../../data/public'; export interface DocViewLink extends EuiListGroupItemProps { href?: string; order: number; - generateurlfn?(renderProps: any): string; + generateurlcb?(renderProps: any): string; } export interface DocViewLinkRenderProps { diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index b85e5ffa7cd0..7b09843be3ad 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -229,7 +229,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View surrounding documents', - generateurlfn: (renderProps: any) => { + generateurlcb: (renderProps: any) => { const globalFilters: any = getServices().filterManager.getGlobalFilters(); const appFilters: any = getServices().filterManager.getAppFilters(); @@ -255,7 +255,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View single document', - generateurlfn: (renderProps) => + generateurlcb: (renderProps) => `#/doc/${renderProps.indexPattern.id}/${renderProps.hit._index}?id=${encodeURIComponent( renderProps.hit._id )}`, diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx index 9a1e0cf02982..c5f6dbdec27a 100644 --- a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -17,7 +17,7 @@ angular.module('myDocViewLink', []).directive('myHit', () => ({ })); function MyHit(props: { index: string }) { - return

{props.index}

; + return

{props.index}

; } export class DocViewsLinksPlugin implements Plugin { @@ -29,9 +29,9 @@ export class DocViewsLinksPlugin implements Plugin { }); discover.docViewsLinks.addDocViewLink({ - generateurlfn: () => 'http://some-url/', + generateurlcb: () => 'http://some-url/', order: 2, - label: 'generateurlfn doc view link', + label: 'generateurlcb doc view link', }); } diff --git a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts index a5e063c42c98..c7325213bff6 100644 --- a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts +++ b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts @@ -21,7 +21,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should show href doc views link', async () => { const hrefLink = await find.byLinkText('href doc view link'); - await find.byLinkText('generateurlfn doc view link'); + await find.byLinkText('generateurlcb doc view link'); expect(await hrefLink.isDisplayed()).to.be(true); }); @@ -33,8 +33,8 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); it('should render react doc view', async () => { - const generateurlfnLink = await find.byLinkText('generateurlfn doc view link'); - await generateurlfnLink.click(); + const generateurlcbLink = await find.byLinkText('generateurlcb doc view link'); + await generateurlcbLink.click(); expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); }); From 7ffec20a5a068782c891c3f35099b52681da808e Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 22 Feb 2022 11:53:48 +0200 Subject: [PATCH 05/13] Delete prop after usage Signed-off-by: sitbubu --- .../components/doc_viewer_links/doc_viewer_links.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 988718701c87..e2db796a09b8 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -13,7 +13,11 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { const listItems = getDocViewsLinksRegistry() .getDocViewsLinksSorted() .map((item) => { - item.href = item.generateurlcb ? item.generateurlcb(renderProps) : item.href; + if (item.generateurlcb) { + item.href = item.generateurlcb(renderProps); + delete item.generateurlcb; + } + return item; }); From 353c2db130ef2e33977d5ba0234e7b4c5086b38d Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 22 Feb 2022 14:00:28 +0200 Subject: [PATCH 06/13] Camel case + avoid mutating Signed-off-by: sitbubu --- .../__snapshots__/doc_viewer_links.test.tsx.snap | 4 ++-- .../doc_viewer_links/doc_viewer_links.test.tsx | 2 +- .../doc_viewer_links/doc_viewer_links.tsx | 13 +++++++------ .../doc_views_links/doc_views_links_types.ts | 2 +- src/plugins/discover/public/plugin.ts | 4 ++-- .../doc_views_links_plugin/public/plugin.tsx | 6 +++--- .../test_suites/doc_views_links/doc_views_links.ts | 8 ++++---- 7 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index 76b1a68234e2..2e7e04c489cd 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -8,9 +8,9 @@ exports[`Render with 2 different links 1`] = ` listItems={ Array [ Object { - "generateurlcb": [Function], + "generateUrlCb": [Function], "href": "aaa", - "label": "generateurlcb link", + "label": "generateUrlCb link", "order": 10, }, Object { diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx index a7c5406f2162..b8bd6f0ecda5 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx @@ -33,7 +33,7 @@ beforeEach(() => { test('Render with 2 different links', () => { const registry = getDocViewsLinksRegistry(); - registry.addDocViewLink({ order: 10, label: 'generateurlcb link', generateurlcb: () => 'aaa' }); + registry.addDocViewLink({ order: 10, label: 'generateUrlCb link', generateUrlCb: () => 'aaa' }); registry.addDocViewLink({ order: 20, label: 'href link', href: 'bbb' }); const renderProps = { hit: {} } as DocViewLinkRenderProps; diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index e2db796a09b8..771315935a82 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -5,7 +5,7 @@ import './doc_viewer_links.scss'; import React from 'react'; -import { EuiListGroup } from '@elastic/eui'; +import { EuiListGroup, EuiListGroupItemProps } from '@elastic/eui'; import { getDocViewsLinksRegistry } from '../../../opensearch_dashboards_services'; import { DocViewLinkRenderProps } from '../../doc_views_links/doc_views_links_types'; @@ -13,12 +13,13 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { const listItems = getDocViewsLinksRegistry() .getDocViewsLinksSorted() .map((item) => { - if (item.generateurlcb) { - item.href = item.generateurlcb(renderProps); - delete item.generateurlcb; - } + const { generateUrlCb, href, ...props } = item; + const listItem: EuiListGroupItemProps = { + ...props, + href: generateUrlCb ? generateUrlCb(renderProps) : href, + }; - return item; + return listItem; }); return ( diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts index 2c755df047ef..944bc0229e4a 100644 --- a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts @@ -10,7 +10,7 @@ import { IndexPattern } from '../../../../data/public'; export interface DocViewLink extends EuiListGroupItemProps { href?: string; order: number; - generateurlcb?(renderProps: any): string; + generateUrlCb?(renderProps: any): string; } export interface DocViewLinkRenderProps { diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index 7b09843be3ad..034acceb870d 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -229,7 +229,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View surrounding documents', - generateurlcb: (renderProps: any) => { + generateUrlCb: (renderProps: any) => { const globalFilters: any = getServices().filterManager.getGlobalFilters(); const appFilters: any = getServices().filterManager.getAppFilters(); @@ -255,7 +255,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View single document', - generateurlcb: (renderProps) => + generateUrlCb: (renderProps) => `#/doc/${renderProps.indexPattern.id}/${renderProps.hit._index}?id=${encodeURIComponent( renderProps.hit._id )}`, diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx index c5f6dbdec27a..71ee43f9f283 100644 --- a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -17,7 +17,7 @@ angular.module('myDocViewLink', []).directive('myHit', () => ({ })); function MyHit(props: { index: string }) { - return

{props.index}

; + return

{props.index}

; } export class DocViewsLinksPlugin implements Plugin { @@ -29,9 +29,9 @@ export class DocViewsLinksPlugin implements Plugin { }); discover.docViewsLinks.addDocViewLink({ - generateurlcb: () => 'http://some-url/', + generateUrlCb: () => 'http://some-url/', order: 2, - label: 'generateurlcb doc view link', + label: 'generateUrlCb doc view link', }); } diff --git a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts index c7325213bff6..220b58fd445d 100644 --- a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts +++ b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts @@ -21,7 +21,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should show href doc views link', async () => { const hrefLink = await find.byLinkText('href doc view link'); - await find.byLinkText('generateurlcb doc view link'); + await find.byLinkText('generateUrlCb doc view link'); expect(await hrefLink.isDisplayed()).to.be(true); }); @@ -32,9 +32,9 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); - it('should render react doc view', async () => { - const generateurlcbLink = await find.byLinkText('generateurlcb doc view link'); - await generateurlcbLink.click(); + it('should render generateUrlCb doc view link', async () => { + const generateUrlCbLink = await find.byLinkText('generateUrlCb doc view link'); + await generateUrlCbLink.click(); expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); }); From 7dde376d5eab4942cc1a63d9db13817cd8c595f7 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Wed, 23 Feb 2022 12:06:45 +0200 Subject: [PATCH 07/13] Added right data-test-subj in order to fix tests Signed-off-by: sitbubu --- .../application/components/doc_viewer_links/doc_viewer_links.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 771315935a82..21b127253714 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -15,6 +15,7 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { .map((item) => { const { generateUrlCb, href, ...props } = item; const listItem: EuiListGroupItemProps = { + 'data-test-subj': 'docTableRowAction', ...props, href: generateUrlCb ? generateUrlCb(renderProps) : href, }; From 3298b42a0b7a47bf7c62498c76fd72827d8b518f Mon Sep 17 00:00:00 2001 From: sitbubu Date: Thu, 3 Mar 2022 22:49:20 +0200 Subject: [PATCH 08/13] update snapshot Signed-off-by: sitbubu --- .../__snapshots__/doc_viewer_links.test.tsx.snap | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index 2e7e04c489cd..c9b0e8fa4c27 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -8,12 +8,13 @@ exports[`Render with 2 different links 1`] = ` listItems={ Array [ Object { - "generateUrlCb": [Function], + "data-test-subj": "docTableRowAction", "href": "aaa", "label": "generateUrlCb link", "order": 10, }, Object { + "data-test-subj": "docTableRowAction", "href": "bbb", "label": "href link", "order": 20, From 983241cc67d7a0ee727787ff344cda3a8c91f779 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 8 Mar 2022 09:12:36 +0200 Subject: [PATCH 09/13] Add hide prop in order to mimic ng-if condition Signed-off-by: sitbubu --- .../doc_viewer_links.test.tsx.snap | 12 ++++++- .../doc_viewer_links/doc_viewer_links.scss | 32 +++++++++---------- .../doc_viewer_links.test.tsx | 26 ++++++++++++++- .../doc_viewer_links/doc_viewer_links.tsx | 5 +-- .../doc_views_links/doc_views_links_types.ts | 7 +++- src/plugins/discover/public/plugin.ts | 20 +++++++----- .../doc_views_links_plugin/public/plugin.tsx | 30 ++++++++--------- .../doc_views_links/doc_views_links.ts | 15 ++++++--- 8 files changed, 96 insertions(+), 51 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index c9b0e8fa4c27..b2bf9fc5109e 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -1,5 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`Dont Render if generateCb.hide 1`] = ` +
+ +
+`; + exports[`Render with 2 different links 1`] = `
with 2 different links 1`] = ` Object { "data-test-subj": "docTableRowAction", "href": "aaa", - "label": "generateUrlCb link", + "label": "generateCb link", "order": 10, }, Object { diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss index d976fe912565..ca465e774ed6 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss @@ -1,21 +1,21 @@ .osdDocViewerLinks { - .euiListGroup { - list-style-type: none; - margin: 0; - padding: 0; - overflow: hidden; - display: inline; + .euiListGroup { + list-style-type: none; + margin: 0; + padding: 0; + overflow: hidden; + display: inline; - .euiListGroupItem { - float: left; - padding: 0; - margin: 0 5px; - display: inline-block; + .euiListGroupItem { + float: left; + padding: 0; + margin: 0 5px; + display: inline-block; - a { - padding: 0; - margin: 0; - } - } + a { + padding: 0; + margin: 0; } + } + } } \ No newline at end of file diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx index b8bd6f0ecda5..8aba555b3a37 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.test.tsx @@ -33,7 +33,13 @@ beforeEach(() => { test('Render with 2 different links', () => { const registry = getDocViewsLinksRegistry(); - registry.addDocViewLink({ order: 10, label: 'generateUrlCb link', generateUrlCb: () => 'aaa' }); + registry.addDocViewLink({ + order: 10, + label: 'generateCb link', + generateCb: () => ({ + url: 'aaa', + }), + }); registry.addDocViewLink({ order: 20, label: 'href link', href: 'bbb' }); const renderProps = { hit: {} } as DocViewLinkRenderProps; @@ -42,3 +48,21 @@ test('Render with 2 different links', () => { expect(wrapper).toMatchSnapshot(); }); + +test('Dont Render if generateCb.hide', () => { + const registry = getDocViewsLinksRegistry(); + registry.addDocViewLink({ + order: 10, + label: 'generateCb link', + generateCb: () => ({ + url: 'aaa', + hide: true, + }), + }); + + const renderProps = { hit: {} } as DocViewLinkRenderProps; + + const wrapper = shallow(); + + expect(wrapper).toMatchSnapshot(); +}); diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 21b127253714..59045976fc19 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -12,12 +12,13 @@ import { DocViewLinkRenderProps } from '../../doc_views_links/doc_views_links_ty export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { const listItems = getDocViewsLinksRegistry() .getDocViewsLinksSorted() + .filter((item) => !(item.generateCb && item.generateCb(renderProps)?.hide)) .map((item) => { - const { generateUrlCb, href, ...props } = item; + const { generateCb, href, ...props } = item; const listItem: EuiListGroupItemProps = { 'data-test-subj': 'docTableRowAction', ...props, - href: generateUrlCb ? generateUrlCb(renderProps) : href, + href: generateCb ? generateCb(renderProps).url : href, }; return listItem; diff --git a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts index 944bc0229e4a..bbc5caadafcd 100644 --- a/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts +++ b/src/plugins/discover/public/application/doc_views_links/doc_views_links_types.ts @@ -10,7 +10,12 @@ import { IndexPattern } from '../../../../data/public'; export interface DocViewLink extends EuiListGroupItemProps { href?: string; order: number; - generateUrlCb?(renderProps: any): string; + generateCb?( + renderProps: any + ): { + url: string; + hide?: boolean; + }; } export interface DocViewLinkRenderProps { diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index 034acceb870d..68de7182f6c2 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -229,7 +229,7 @@ export class DiscoverPlugin this.docViewsLinksRegistry.addDocViewLink({ label: 'View surrounding documents', - generateUrlCb: (renderProps: any) => { + generateCb: (renderProps: any) => { const globalFilters: any = getServices().filterManager.getGlobalFilters(); const appFilters: any = getServices().filterManager.getAppFilters(); @@ -246,19 +246,23 @@ export class DiscoverPlugin { encode: false, sort: false } ); - return `#/context/${encodeURIComponent(renderProps.indexPattern.id)}/${encodeURIComponent( - renderProps.hit._id - )}?${hash}`; + return { + url: `#/context/${encodeURIComponent(renderProps.indexPattern.id)}/${encodeURIComponent( + renderProps.hit._id + )}?${hash}`, + hide: !renderProps.indexPattern.isTimeBased(), + }; }, order: 1, }); this.docViewsLinksRegistry.addDocViewLink({ label: 'View single document', - generateUrlCb: (renderProps) => - `#/doc/${renderProps.indexPattern.id}/${renderProps.hit._index}?id=${encodeURIComponent( - renderProps.hit._id - )}`, + generateCb: (renderProps) => ({ + url: `#/doc/${renderProps.indexPattern.id}/${ + renderProps.hit._index + }?id=${encodeURIComponent(renderProps.hit._id)}`, + }), order: 2, }); diff --git a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx index 71ee43f9f283..174e46a529a7 100644 --- a/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/doc_views_links_plugin/public/plugin.tsx @@ -2,24 +2,9 @@ * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ - -import angular from 'angular'; -import React from 'react'; import { Plugin, CoreSetup } from 'opensearch-dashboards/public'; import { DiscoverSetup } from '../../../../../src/plugins/discover/public'; -angular.module('myDocViewLink', []).directive('myHit', () => ({ - restrict: 'E', - scope: { - hit: '=hit', - }, - template: '

{{hit._index}}

', -})); - -function MyHit(props: { index: string }) { - return

{props.index}

; -} - export class DocViewsLinksPlugin implements Plugin { public setup(core: CoreSetup, { discover }: { discover: DiscoverSetup }) { discover.docViewsLinks.addDocViewLink({ @@ -29,9 +14,20 @@ export class DocViewsLinksPlugin implements Plugin { }); discover.docViewsLinks.addDocViewLink({ - generateUrlCb: () => 'http://some-url/', + generateCb: () => ({ + url: 'http://some-url/', + }), order: 2, - label: 'generateUrlCb doc view link', + label: 'generateCb doc view link', + }); + + discover.docViewsLinks.addDocViewLink({ + generateCb: () => ({ + url: 'http://some-url/', + hide: true, + }), + order: 3, + label: 'generateCbHidden doc view link', }); } diff --git a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts index 220b58fd445d..2933e0add118 100644 --- a/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts +++ b/test/plugin_functional/test_suites/doc_views_links/doc_views_links.ts @@ -19,11 +19,16 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide await testSubjects.click('docTableExpandToggleColumn'); }); - it('should show href doc views link', async () => { + it('should show href and generateCb doc views link', async () => { const hrefLink = await find.byLinkText('href doc view link'); - await find.byLinkText('generateUrlCb doc view link'); + const generateCbLink = await find.byLinkText('generateCb doc view link'); expect(await hrefLink.isDisplayed()).to.be(true); + expect(await generateCbLink.isDisplayed()).to.be(true); + }); + + it('should not render generateCbHidden doc views link', async () => { + expect(await find.existsByLinkText('generateCbHidden doc view link')).to.eql(false); }); it('should render href doc view link', async () => { @@ -32,9 +37,9 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); - it('should render generateUrlCb doc view link', async () => { - const generateUrlCbLink = await find.byLinkText('generateUrlCb doc view link'); - await generateUrlCbLink.click(); + it('should render generateCb doc view link', async () => { + const generateCbLink = await find.byLinkText('generateCb doc view link'); + await generateCbLink.click(); expect(await browser.getCurrentUrl()).to.eql('http://some-url/'); }); }); From 76d6dd4b3657c6333e42940f56728c45c73ed285 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Tue, 8 Mar 2022 09:25:03 +0200 Subject: [PATCH 10/13] Add i18n translation support Signed-off-by: sitbubu --- src/plugins/discover/public/plugin.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/discover/public/plugin.ts b/src/plugins/discover/public/plugin.ts index 68de7182f6c2..62f6e6908ba1 100644 --- a/src/plugins/discover/public/plugin.ts +++ b/src/plugins/discover/public/plugin.ts @@ -228,7 +228,9 @@ export class DiscoverPlugin setDocViewsLinksRegistry(this.docViewsLinksRegistry); this.docViewsLinksRegistry.addDocViewLink({ - label: 'View surrounding documents', + label: i18n.translate('discover.docTable.tableRow.viewSurroundingDocumentsLinkText', { + defaultMessage: 'View surrounding documents', + }), generateCb: (renderProps: any) => { const globalFilters: any = getServices().filterManager.getGlobalFilters(); const appFilters: any = getServices().filterManager.getAppFilters(); @@ -257,7 +259,9 @@ export class DiscoverPlugin }); this.docViewsLinksRegistry.addDocViewLink({ - label: 'View single document', + label: i18n.translate('discover.docTable.tableRow.viewSingleDocumentLinkText', { + defaultMessage: 'View single document', + }), generateCb: (renderProps) => ({ url: `#/doc/${renderProps.indexPattern.id}/${ renderProps.hit._index From 38934ef4c7f0faa07de0d707d7669521761c0e2a Mon Sep 17 00:00:00 2001 From: sitbubu Date: Wed, 9 Mar 2022 08:05:27 +0200 Subject: [PATCH 11/13] Fix tests Signed-off-by: sitbubu --- .i18nrc.json | 1 + .../doc_table/components/row_headers.test.js | 13 +++++++++++++ .../public/application/components/doc/doc.test.tsx | 11 +++++++++++ 3 files changed, 25 insertions(+) diff --git a/.i18nrc.json b/.i18nrc.json index 71c7970affa4..234aa8de0c25 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -22,6 +22,7 @@ "interpreter": "src/legacy/core_plugins/interpreter", "osd": "src/legacy/core_plugins/opensearch-dashboards", "osdDocViews": "src/legacy/core_plugins/osd_doc_views", + "osdDocViewsLinks": "src/legacy/core_plugins/osd_doc_views_links", "management": [ "src/legacy/core_plugins/management", "src/plugins/management" 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 5ece8659260d..1b0e03653d0d 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 @@ -41,6 +41,7 @@ import { setScopedHistory, setServices, setDocViewsRegistry, + setDocViewsLinksRegistry, } from '../../../../opensearch_dashboards_services'; import { coreMock } from '../../../../../../../core/public/mocks'; import { dataPluginMock } from '../../../../../../data/public/mocks'; @@ -98,6 +99,18 @@ describe('Doc Table', () => { }, }); + setDocViewsLinksRegistry({ + addDocViewLink(view) { + registry.push(view); + }, + getDocViewsLinksSorted() { + return registry; + }, + resetRegistry: () => { + registry = []; + }, + }); + getInnerAngularModule( 'app/discover', core, diff --git a/src/plugins/discover/public/application/components/doc/doc.test.tsx b/src/plugins/discover/public/application/components/doc/doc.test.tsx index b107ae46b37a..7385f0d360a1 100644 --- a/src/plugins/discover/public/application/components/doc/doc.test.tsx +++ b/src/plugins/discover/public/application/components/doc/doc.test.tsx @@ -63,6 +63,17 @@ jest.mock('../../../opensearch_dashboards_services', () => { registry = []; }, }), + getDocViewsLinksRegistry: () => ({ + addDocViewLink(view: any) { + registry.push(view); + }, + getDocViewsLinksSorted() { + return registry; + }, + resetRegistry: () => { + registry = []; + }, + }), }; }); From ab2b1b3241d024beb5400ce04450d2ceba2029e3 Mon Sep 17 00:00:00 2001 From: sitbubu Date: Wed, 20 Apr 2022 18:38:13 +0300 Subject: [PATCH 12/13] Made text smaller + used eui components instead of custom css Signed-off-by: sitbubu --- .../doc_viewer_links/doc_viewer_links.scss | 21 ------------------- .../doc_viewer_links/doc_viewer_links.tsx | 13 +++++++----- 2 files changed, 8 insertions(+), 26 deletions(-) delete mode 100644 src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss deleted file mode 100644 index ca465e774ed6..000000000000 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.scss +++ /dev/null @@ -1,21 +0,0 @@ -.osdDocViewerLinks { - .euiListGroup { - list-style-type: none; - margin: 0; - padding: 0; - overflow: hidden; - display: inline; - - .euiListGroupItem { - float: left; - padding: 0; - margin: 0 5px; - display: inline-block; - - a { - padding: 0; - margin: 0; - } - } - } -} \ No newline at end of file diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx index 59045976fc19..9efb0693fde6 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx +++ b/src/plugins/discover/public/application/components/doc_viewer_links/doc_viewer_links.tsx @@ -3,9 +3,8 @@ * SPDX-License-Identifier: Apache-2.0 */ -import './doc_viewer_links.scss'; import React from 'react'; -import { EuiListGroup, EuiListGroupItemProps } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiListGroupItem, EuiListGroupItemProps } from '@elastic/eui'; import { getDocViewsLinksRegistry } from '../../../opensearch_dashboards_services'; import { DocViewLinkRenderProps } from '../../doc_views_links/doc_views_links_types'; @@ -25,8 +24,12 @@ export function DocViewerLinks(renderProps: DocViewLinkRenderProps) { }); return ( -
- -
+ + {listItems.map((item, index) => ( + + + + ))} + ); } From 5ec302bc0f869a53ba8a51b3e9cec8d0762ba93d Mon Sep 17 00:00:00 2001 From: sitbubu Date: Fri, 22 Apr 2022 13:30:41 +0300 Subject: [PATCH 13/13] Snapshots Signed-off-by: sitbubu --- .../doc_viewer_links.test.tsx.snap | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap index b2bf9fc5109e..95fb0c377180 100644 --- a/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap +++ b/src/plugins/discover/public/application/components/doc_viewer_links/__snapshots__/doc_viewer_links.test.tsx.snap @@ -1,36 +1,34 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Dont Render if generateCb.hide 1`] = ` -
- -
+ `; exports[`Render with 2 different links 1`] = ` -
- -
+ + + + + + +
`;