From 11638e3f5a7115fe82c6d5a706358c793438b1a2 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 09:44:44 +0200 Subject: [PATCH 01/11] Enable right-click on visualizations listing page --- src/plugins/visualize/common/constants.ts | 2 + .../application/utils/get_table_columns.tsx | 9 +-- .../utils/get_visualize_list_item_link.ts | 67 +++++++++++++++++++ src/plugins/visualize/public/url_generator.ts | 43 +++--------- 4 files changed, 82 insertions(+), 39 deletions(-) create mode 100644 src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts diff --git a/src/plugins/visualize/common/constants.ts b/src/plugins/visualize/common/constants.ts index b37eadd9b67e5..7e353ca86698a 100644 --- a/src/plugins/visualize/common/constants.ts +++ b/src/plugins/visualize/common/constants.ts @@ -7,3 +7,5 @@ */ export const AGGS_TERMS_SIZE_SETTING = 'discover:aggs:terms:size'; +export const STATE_STORAGE_KEY = '_a'; +export const GLOBAL_STATE_STORAGE_KEY = '_g'; diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index daa419b5f31b4..67a9fecf714db 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -15,6 +15,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { ApplicationStart } from 'kibana/public'; import { VisualizationListItem } from 'src/plugins/visualizations/public'; import type { SavedObjectsTaggingApi } from 'src/plugins/saved_objects_tagging_oss/public'; +import { getVisualizeListItem } from './get_visualize_list_item_link'; const getBadge = (item: VisualizationListItem) => { if (item.stage === 'beta') { @@ -85,13 +86,7 @@ export const getTableColumns = ( // In case an error occurs i.e. the vis has wrong type, we render the vis but without the link !error ? ( { - if (editApp) { - application.navigateToApp(editApp, { path: editUrl }); - } else if (editUrl) { - history.push(editUrl); - } - }} + href={getVisualizeListItem(application, editApp, editUrl)} data-test-subj={`visListingTitleLink-${title.split(' ').join('-')}`} > {field} diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts new file mode 100644 index 0000000000000..24c7f548aab36 --- /dev/null +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * and the Server Side Public License, v 1; you may not use this file except in + * compliance with, at your election, the Elastic License or the Server Side + * Public License, v 1. + */ +import { ApplicationStart } from 'kibana/public'; +import { + Filter, + Query, + esFilters, + QueryState, + TimeRange, + RefreshInterval, +} from '../../../../data/public'; +import { setStateToKbnUrl } from '../../../../kibana_utils/public'; +import { getQueryService, getUISettings } from '../../services'; +import { STATE_STORAGE_KEY, GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; + +export const propagateUrlQueries = ( + url: string, + useHash: boolean, + query?: Query, + filters?: Filter[], + timeRange?: TimeRange, + vis?: unknown, + refreshInterval?: RefreshInterval +) => { + const appState: { + query?: Query; + filters?: Filter[]; + vis?: unknown; + } = {}; + const queryState: QueryState = {}; + + if (query) appState.query = query; + if (filters && filters.length) + appState.filters = filters?.filter((f) => !esFilters.isFilterPinned(f)); + if (vis) appState.vis = vis; + + if (timeRange) queryState.time = timeRange; + if (filters && filters.length) + queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); + if (refreshInterval) queryState.refreshInterval = refreshInterval; + + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + url = setStateToKbnUrl(STATE_STORAGE_KEY, appState, { useHash }, url); + + return url; +}; + +export const getVisualizeListItem = ( + application: ApplicationStart, + editApp: string | undefined, + editUrl: string +) => { + const url = application.getUrlForApp(editApp ?? 'visualize', { + path: editApp ? editUrl : `/#${editUrl}`, + }); + const query = getQueryService().queryString.getQuery(); + const filters = getQueryService().filterManager.getFilters(); + const timeRange = getQueryService().timefilter.timefilter.getTime(); + + const useHash = getUISettings().get('state:storeInSessionStorage'); + return propagateUrlQueries(url, useHash, query, filters, timeRange); +}; diff --git a/src/plugins/visualize/public/url_generator.ts b/src/plugins/visualize/public/url_generator.ts index 15f05106130de..c92669fd571e0 100644 --- a/src/plugins/visualize/public/url_generator.ts +++ b/src/plugins/visualize/public/url_generator.ts @@ -6,19 +6,9 @@ * Public License, v 1. */ -import { - TimeRange, - Filter, - Query, - esFilters, - QueryState, - RefreshInterval, -} from '../../data/public'; -import { setStateToKbnUrl } from '../../kibana_utils/public'; +import { TimeRange, Filter, Query, RefreshInterval } from '../../data/public'; import { UrlGeneratorsDefinition } from '../../share/public'; - -const STATE_STORAGE_KEY = '_a'; -const GLOBAL_STATE_STORAGE_KEY = '_g'; +import { propagateUrlQueries } from './application/utils/get_visualize_list_item_link'; export const VISUALIZE_APP_URL_GENERATOR = 'VISUALIZE_APP_URL_GENERATOR'; @@ -92,26 +82,15 @@ export const createVisualizeUrlGenerator = ( const appBasePath = startServices.appBasePath; const mode = visualizationId ? `edit/${visualizationId}` : `create`; - const appState: { - query?: Query; - filters?: Filter[]; - vis?: unknown; - } = {}; - const queryState: QueryState = {}; - - if (query) appState.query = query; - if (filters && filters.length) - appState.filters = filters?.filter((f) => !esFilters.isFilterPinned(f)); - if (vis) appState.vis = vis; - - if (timeRange) queryState.time = timeRange; - if (filters && filters.length) - queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); - if (refreshInterval) queryState.refreshInterval = refreshInterval; - - let url = `${appBasePath}#/${mode}`; - url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); - url = setStateToKbnUrl(STATE_STORAGE_KEY, appState, { useHash }, url); + let url = propagateUrlQueries( + `${appBasePath}#/${mode}`, + useHash, + query, + filters, + timeRange, + vis, + refreshInterval + ); if (indexPatternId) { url = `${url}&indexPattern=${indexPatternId}`; From 1ba96b730a0b0eb2c3b677f71008d9f44e512727 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 09:58:06 +0200 Subject: [PATCH 02/11] Make it simpler --- .../utils/get_visualize_list_item_link.ts | 52 +++---------------- src/plugins/visualize/public/url_generator.ts | 41 +++++++++++---- 2 files changed, 37 insertions(+), 56 deletions(-) diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index 24c7f548aab36..2900261993c1e 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -6,62 +6,24 @@ * Public License, v 1. */ import { ApplicationStart } from 'kibana/public'; -import { - Filter, - Query, - esFilters, - QueryState, - TimeRange, - RefreshInterval, -} from '../../../../data/public'; +import { QueryState } from '../../../../data/public'; import { setStateToKbnUrl } from '../../../../kibana_utils/public'; import { getQueryService, getUISettings } from '../../services'; -import { STATE_STORAGE_KEY, GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; - -export const propagateUrlQueries = ( - url: string, - useHash: boolean, - query?: Query, - filters?: Filter[], - timeRange?: TimeRange, - vis?: unknown, - refreshInterval?: RefreshInterval -) => { - const appState: { - query?: Query; - filters?: Filter[]; - vis?: unknown; - } = {}; - const queryState: QueryState = {}; - - if (query) appState.query = query; - if (filters && filters.length) - appState.filters = filters?.filter((f) => !esFilters.isFilterPinned(f)); - if (vis) appState.vis = vis; - - if (timeRange) queryState.time = timeRange; - if (filters && filters.length) - queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); - if (refreshInterval) queryState.refreshInterval = refreshInterval; - - url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); - url = setStateToKbnUrl(STATE_STORAGE_KEY, appState, { useHash }, url); - - return url; -}; +import { GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; export const getVisualizeListItem = ( application: ApplicationStart, editApp: string | undefined, editUrl: string ) => { - const url = application.getUrlForApp(editApp ?? 'visualize', { + let url = application.getUrlForApp(editApp ?? 'visualize', { path: editApp ? editUrl : `/#${editUrl}`, }); - const query = getQueryService().queryString.getQuery(); - const filters = getQueryService().filterManager.getFilters(); + const queryState: QueryState = {}; const timeRange = getQueryService().timefilter.timefilter.getTime(); + if (timeRange) queryState.time = timeRange; const useHash = getUISettings().get('state:storeInSessionStorage'); - return propagateUrlQueries(url, useHash, query, filters, timeRange); + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + return url; }; diff --git a/src/plugins/visualize/public/url_generator.ts b/src/plugins/visualize/public/url_generator.ts index c92669fd571e0..57fa9b2ae4801 100644 --- a/src/plugins/visualize/public/url_generator.ts +++ b/src/plugins/visualize/public/url_generator.ts @@ -6,9 +6,17 @@ * Public License, v 1. */ -import { TimeRange, Filter, Query, RefreshInterval } from '../../data/public'; +import { + TimeRange, + Filter, + Query, + esFilters, + QueryState, + RefreshInterval, +} from '../../data/public'; +import { setStateToKbnUrl } from '../../kibana_utils/public'; import { UrlGeneratorsDefinition } from '../../share/public'; -import { propagateUrlQueries } from './application/utils/get_visualize_list_item_link'; +import { STATE_STORAGE_KEY, GLOBAL_STATE_STORAGE_KEY } from '../common/constants'; export const VISUALIZE_APP_URL_GENERATOR = 'VISUALIZE_APP_URL_GENERATOR'; @@ -82,15 +90,26 @@ export const createVisualizeUrlGenerator = ( const appBasePath = startServices.appBasePath; const mode = visualizationId ? `edit/${visualizationId}` : `create`; - let url = propagateUrlQueries( - `${appBasePath}#/${mode}`, - useHash, - query, - filters, - timeRange, - vis, - refreshInterval - ); + const appState: { + query?: Query; + filters?: Filter[]; + vis?: unknown; + } = {}; + const queryState: QueryState = {}; + + if (query) appState.query = query; + if (filters && filters.length) + appState.filters = filters?.filter((f) => !esFilters.isFilterPinned(f)); + if (vis) appState.vis = vis; + + if (timeRange) queryState.time = timeRange; + if (filters && filters.length) + queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); + if (refreshInterval) queryState.refreshInterval = refreshInterval; + + let url = `${appBasePath}#/${mode}`; + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + url = setStateToKbnUrl(STATE_STORAGE_KEY, appState, { useHash }, url); if (indexPatternId) { url = `${url}&indexPattern=${indexPatternId}`; From db54a98aed62ebef7e8cfae25e61daa94b2ccf22 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 11:39:18 +0200 Subject: [PATCH 03/11] Enable right click to the dashboard listing --- .../application/listing/dashboard_listing.tsx | 28 ++++++++++----- .../listing/get_dashboard_list_item_link.ts | 34 +++++++++++++++++++ .../components/visualize_listing.tsx | 3 +- .../application/utils/get_table_columns.tsx | 1 - .../utils/get_visualize_list_item_link.ts | 1 + 5 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts diff --git a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx index cdf809e078b7b..c6e254603d8aa 100644 --- a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx +++ b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx @@ -9,16 +9,16 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiLink, EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import React, { Fragment, useCallback, useEffect, useMemo } from 'react'; - import { attemptLoadDashboardByTitle } from '../lib'; import { DashboardAppServices, DashboardRedirect } from '../types'; import { getDashboardBreadcrumb, dashboardListingTable } from '../../dashboard_strings'; import { ApplicationStart, SavedObjectsFindOptionsReference } from '../../../../../core/public'; - +import { DataPublicPluginStart } from '../../../../data/public'; import { syncQueryStateWithUrl } from '../../services/data'; import { IKbnUrlStateStorage } from '../../services/kibana_utils'; import { TableListView, useKibana } from '../../services/kibana_react'; import { SavedObjectsTaggingApi } from '../../services/saved_objects_tagging_oss'; +import { getDashboardListItem } from './get_dashboard_list_item_link'; export interface DashboardListingProps { kbnUrlStateStorage: IKbnUrlStateStorage; @@ -83,8 +83,13 @@ export const DashboardListing = ({ const tableColumns = useMemo( () => - getTableColumns((id) => redirectTo({ destination: 'dashboard', id }), savedObjectsTagging), - [savedObjectsTagging, redirectTo] + getTableColumns( + core.application, + data.query, + core.uiSettings.get('state:storeInSessionStorage'), + savedObjectsTagging + ), + [core.application, core.uiSettings, data.query, savedObjectsTagging] ); const noItemsFragment = useMemo( @@ -99,7 +104,6 @@ export const DashboardListing = ({ (filter: string) => { let searchTerm = filter; let references: SavedObjectsFindOptionsReference[] | undefined; - if (savedObjectsTagging) { const parsed = savedObjectsTagging.ui.parseSearchQuery(filter, { useName: true, @@ -164,7 +168,9 @@ export const DashboardListing = ({ }; const getTableColumns = ( - redirectTo: (id?: string) => void, + application: ApplicationStart, + queryService: DataPublicPluginStart['query'], + useHash: boolean, savedObjectsTagging?: SavedObjectsTaggingApi ) => { return [ @@ -172,9 +178,15 @@ const getTableColumns = ( field: 'title', name: dashboardListingTable.getTitleColumnName(), sortable: true, - render: (field: string, record: { id: string; title: string }) => ( + render: (field: string, record: { id: string; title: string; timeRestore: boolean }) => ( redirectTo(record.id)} + href={getDashboardListItem( + application, + queryService, + useHash, + record.id, + record.timeRestore + )} data-test-subj={`dashboardListingTitleLink-${record.title.split(' ').join('-')}`} > {field} diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts new file mode 100644 index 0000000000000..29dd5fce10bbb --- /dev/null +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * and the Server Side Public License, v 1; you may not use this file except in + * compliance with, at your election, the Elastic License or the Server Side + * Public License, v 1. + */ +import { ApplicationStart } from 'kibana/public'; +import { QueryState, DataPublicPluginStart } from '../../../../data/public'; + +import { setStateToKbnUrl } from '../../../../kibana_utils/public'; +import { createDashboardEditUrl, DashboardConstants } from '../../dashboard_constants'; + +const GLOBAL_STATE_STORAGE_KEY = '_g'; + +export const getDashboardListItem = ( + application: ApplicationStart, + queryService: DataPublicPluginStart['query'], + useHash: boolean, + id: string, + timeRestore: boolean +) => { + let url = application.getUrlForApp(DashboardConstants.DASHBOARDS_ID, { + path: `/#${createDashboardEditUrl(id)}`, + }); + const queryState: QueryState = {}; + const timeRange = queryService.timefilter.timefilter.getTime(); + // if time is not saved with the dashboard, add the time on the url query + if (!timeRestore) { + if (timeRange) queryState.time = timeRange; + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + } + return url; +}; diff --git a/src/plugins/visualize/public/application/components/visualize_listing.tsx b/src/plugins/visualize/public/application/components/visualize_listing.tsx index 38e2b59009b38..8d620dae05ee1 100644 --- a/src/plugins/visualize/public/application/components/visualize_listing.tsx +++ b/src/plugins/visualize/public/application/components/visualize_listing.tsx @@ -94,9 +94,8 @@ export const VisualizeListing = () => { ); const noItemsFragment = useMemo(() => getNoItemsMessage(createNewVis), [createNewVis]); - const tableColumns = useMemo(() => getTableColumns(application, history, savedObjectsTagging), [ + const tableColumns = useMemo(() => getTableColumns(application, savedObjectsTagging), [ application, - history, savedObjectsTagging, ]); diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index 67a9fecf714db..af605c677c078 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -73,7 +73,6 @@ const renderItemTypeIcon = (item: VisualizationListItem) => { export const getTableColumns = ( application: ApplicationStart, - history: History, taggingApi?: SavedObjectsTaggingApi ) => [ { diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index 2900261993c1e..c0078f29a38d8 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -16,6 +16,7 @@ export const getVisualizeListItem = ( editApp: string | undefined, editUrl: string ) => { + // for visualizations the editApp is undefined let url = application.getUrlForApp(editApp ?? 'visualize', { path: editApp ? editUrl : `/#${editUrl}`, }); From b428bbe6836bd995b20e1e076fc79a0f4dfb428c Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 14:05:52 +0200 Subject: [PATCH 04/11] Add unit tests --- .../listing/get_dashboard_list_item.test.ts | 75 +++++++++++++++++++ .../application/utils/get_table_columns.tsx | 1 - .../get_visualize_list_item_link.test.ts | 70 +++++++++++++++++ 3 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts create mode 100644 src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts new file mode 100644 index 0000000000000..62f0cd60c71e4 --- /dev/null +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * and the Server Side Public License, v 1; you may not use this file except in + * compliance with, at your election, the Elastic License or the Server Side + * Public License, v 1. + */ + +import { getDashboardListItem } from './get_dashboard_list_item_link'; +import { ApplicationStart } from 'kibana/public'; +import { DataPublicPluginStart } from '../../../../data/public'; + +const DASHBOARD_ID = '13823000-99b9-11ea-9eb6-d9e8adceb647'; + +const application = ({ + getUrlForApp: jest.fn((appId: string, options?: { path?: string; absolute?: boolean }) => { + return `/app/${appId}${options?.path}`; + }), +} as unknown) as ApplicationStart; + +const getQueryService = (timeFilter: { from: string; to: string }) => { + return ({ + timefilter: { + timefilter: { + getTime: jest.fn(() => timeFilter), + }, + }, + } as unknown) as DataPublicPluginStart['query']; +}; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('listing item link', () => { + test('creates a link to a dashboard without the timerange query if time is saved on the dashboard', async () => { + const url = getDashboardListItem( + application, + getQueryService({ from: 'now-7d', to: 'now' }), + false, + DASHBOARD_ID, + true + ); + expect(url).toMatchInlineSnapshot(`"/app/dashboards/#/view/${DASHBOARD_ID}"`); + }); + + test('creates a link to a dashboard with the timerange query if time is not saved on the dashboard', async () => { + const url = getDashboardListItem( + application, + getQueryService({ from: 'now-7d', to: 'now' }), + false, + DASHBOARD_ID, + false + ); + expect(url).toMatchInlineSnapshot( + `"/app/dashboards/#/view/${DASHBOARD_ID}?_g=(time:(from:now-7d,to:now))"` + ); + }); + + test('propagates the correct time on the query', async () => { + const url = getDashboardListItem( + application, + getQueryService({ + from: '2021-01-05T11:45:53.375Z', + to: '2021-01-21T11:46:00.990Z', + }), + false, + DASHBOARD_ID, + false + ); + expect(url).toMatchInlineSnapshot( + `"/app/dashboards/#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + ); + }); +}); diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index af605c677c078..9a168031ecc60 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -7,7 +7,6 @@ */ import React from 'react'; -import { History } from 'history'; import { EuiBetaBadge, EuiButton, EuiEmptyPrompt, EuiIcon, EuiLink, EuiBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts new file mode 100644 index 0000000000000..472a6d7664424 --- /dev/null +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * and the Server Side Public License, v 1; you may not use this file except in + * compliance with, at your election, the Elastic License or the Server Side + * Public License, v 1. + */ + +import { getVisualizeListItem } from './get_visualize_list_item_link'; +import { ApplicationStart } from 'kibana/public'; +import { getQueryService } from '../../services'; + +jest.mock('../../services', () => { + let timeFilter = { from: 'now-7d', to: 'now' }; + return { + getQueryService: () => ({ + timefilter: { + timefilter: { + getTime: jest.fn(() => timeFilter), + setTime: jest.fn((newTimeFilter) => { + timeFilter = newTimeFilter; + }), + }, + }, + }), + getUISettings: () => ({ + get: jest.fn(), + }), + }; +}); + +const application = ({ + getUrlForApp: jest.fn((appId: string, options?: { path?: string; absolute?: boolean }) => { + return `/app/${appId}${options?.path}`; + }), +} as unknown) as ApplicationStart; + +beforeEach(() => { + jest.clearAllMocks(); +}); + +describe('listing item link', () => { + test('creates a link to classic visualization if editApp is not defined', async () => { + const editUrl = 'edit/id'; + const url = getVisualizeListItem(application, undefined, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/visualize/#${editUrl}?_g=(time:(from:now-7d,to:now))"` + ); + }); + + test('creates a link for the app given if editApp is defined', async () => { + const editUrl = '/#/edit/id'; + const editApp = 'lens'; + const url = getVisualizeListItem(application, editApp, editUrl); + expect(url).toMatchInlineSnapshot(`"/app/${editApp}${editUrl}?_g=(time:(from:now-7d,to:now))"`); + }); + + test('propagates the correct time on the query', async () => { + const editUrl = '/#/edit/id'; + const editApp = 'lens'; + getQueryService().timefilter.timefilter.setTime({ + from: '2021-01-05T11:45:53.375Z', + to: '2021-01-21T11:46:00.990Z', + }); + const url = getVisualizeListItem(application, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + ); + }); +}); From c540dde74f47938fa2b216aef4b572eac5769e31 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 17:13:25 +0200 Subject: [PATCH 05/11] Fix link on dashboard --- .../application/listing/get_dashboard_list_item.test.ts | 6 +++--- .../application/listing/get_dashboard_list_item_link.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts index 62f0cd60c71e4..afb7111371641 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts @@ -41,7 +41,7 @@ describe('listing item link', () => { DASHBOARD_ID, true ); - expect(url).toMatchInlineSnapshot(`"/app/dashboards/#/view/${DASHBOARD_ID}"`); + expect(url).toMatchInlineSnapshot(`"/app/dashboards#/view/${DASHBOARD_ID}"`); }); test('creates a link to a dashboard with the timerange query if time is not saved on the dashboard', async () => { @@ -53,7 +53,7 @@ describe('listing item link', () => { false ); expect(url).toMatchInlineSnapshot( - `"/app/dashboards/#/view/${DASHBOARD_ID}?_g=(time:(from:now-7d,to:now))"` + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:now-7d,to:now))"` ); }); @@ -69,7 +69,7 @@ describe('listing item link', () => { false ); expect(url).toMatchInlineSnapshot( - `"/app/dashboards/#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); }); }); diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts index 29dd5fce10bbb..e4ce0c4d0feb5 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -21,7 +21,7 @@ export const getDashboardListItem = ( timeRestore: boolean ) => { let url = application.getUrlForApp(DashboardConstants.DASHBOARDS_ID, { - path: `/#${createDashboardEditUrl(id)}`, + path: `#${createDashboardEditUrl(id)}`, }); const queryState: QueryState = {}; const timeRange = queryService.timefilter.timefilter.getTime(); From 8a513501040d48266dc390c8bbf3b494cd026703 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 21 Jan 2021 17:28:24 +0200 Subject: [PATCH 06/11] Fix visualize link --- .../utils/get_visualize_list_item_link.test.ts | 8 +++----- .../application/utils/get_visualize_list_item_link.ts | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts index 472a6d7664424..15bea30dcad0e 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -43,20 +43,18 @@ describe('listing item link', () => { test('creates a link to classic visualization if editApp is not defined', async () => { const editUrl = 'edit/id'; const url = getVisualizeListItem(application, undefined, editUrl); - expect(url).toMatchInlineSnapshot( - `"/app/visualize/#${editUrl}?_g=(time:(from:now-7d,to:now))"` - ); + expect(url).toMatchInlineSnapshot(`"/app/visualize#${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); test('creates a link for the app given if editApp is defined', async () => { - const editUrl = '/#/edit/id'; + const editUrl = '#/edit/id'; const editApp = 'lens'; const url = getVisualizeListItem(application, editApp, editUrl); expect(url).toMatchInlineSnapshot(`"/app/${editApp}${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); test('propagates the correct time on the query', async () => { - const editUrl = '/#/edit/id'; + const editUrl = '#/edit/id'; const editApp = 'lens'; getQueryService().timefilter.timefilter.setTime({ from: '2021-01-05T11:45:53.375Z', diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index c0078f29a38d8..e8ae578107076 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -18,7 +18,7 @@ export const getVisualizeListItem = ( ) => { // for visualizations the editApp is undefined let url = application.getUrlForApp(editApp ?? 'visualize', { - path: editApp ? editUrl : `/#${editUrl}`, + path: editApp ? editUrl : `#${editUrl}`, }); const queryState: QueryState = {}; const timeRange = getQueryService().timefilter.timefilter.getTime(); From 392ed9a72aaf171f191cda7e0e10fa3d53d4b858 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 26 Jan 2021 14:12:11 +0200 Subject: [PATCH 07/11] Fix PR comments --- .../listing/get_dashboard_list_item.test.ts | 76 ++++++++++++++++--- .../listing/get_dashboard_list_item_link.ts | 10 ++- .../application/utils/get_table_columns.tsx | 16 ++-- .../get_visualize_list_item_link.test.ts | 54 +++++++++++++ .../utils/get_visualize_list_item_link.ts | 13 +++- 5 files changed, 148 insertions(+), 21 deletions(-) diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts index afb7111371641..d6a32d2f306cf 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item.test.ts @@ -8,7 +8,7 @@ import { getDashboardListItem } from './get_dashboard_list_item_link'; import { ApplicationStart } from 'kibana/public'; -import { DataPublicPluginStart } from '../../../../data/public'; +import { DataPublicPluginStart, RefreshInterval, esFilters, Filter } from '../../../../data/public'; const DASHBOARD_ID = '13823000-99b9-11ea-9eb6-d9e8adceb647'; @@ -18,13 +18,21 @@ const application = ({ }), } as unknown) as ApplicationStart; -const getQueryService = (timeFilter: { from: string; to: string }) => { +const getQueryService = ( + timeFilter: { from: string; to: string }, + filters: Filter[], + refreshInterval?: RefreshInterval +) => { return ({ timefilter: { timefilter: { getTime: jest.fn(() => timeFilter), + getRefreshInterval: jest.fn(() => refreshInterval), }, }, + filterManager: { + getFilters: jest.fn(() => filters), + }, } as unknown) as DataPublicPluginStart['query']; }; @@ -36,18 +44,18 @@ describe('listing item link', () => { test('creates a link to a dashboard without the timerange query if time is saved on the dashboard', async () => { const url = getDashboardListItem( application, - getQueryService({ from: 'now-7d', to: 'now' }), + getQueryService({ from: 'now-7d', to: 'now' }, []), false, DASHBOARD_ID, true ); - expect(url).toMatchInlineSnapshot(`"/app/dashboards#/view/${DASHBOARD_ID}"`); + expect(url).toMatchInlineSnapshot(`"/app/dashboards#/view/${DASHBOARD_ID}?_g=()"`); }); test('creates a link to a dashboard with the timerange query if time is not saved on the dashboard', async () => { const url = getDashboardListItem( application, - getQueryService({ from: 'now-7d', to: 'now' }), + getQueryService({ from: 'now-7d', to: 'now' }, []), false, DASHBOARD_ID, false @@ -60,10 +68,13 @@ describe('listing item link', () => { test('propagates the correct time on the query', async () => { const url = getDashboardListItem( application, - getQueryService({ - from: '2021-01-05T11:45:53.375Z', - to: '2021-01-21T11:46:00.990Z', - }), + getQueryService( + { + from: '2021-01-05T11:45:53.375Z', + to: '2021-01-21T11:46:00.990Z', + }, + [] + ), false, DASHBOARD_ID, false @@ -72,4 +83,51 @@ describe('listing item link', () => { `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); }); + + test('propagates the refreshInterval on the query', async () => { + const url = getDashboardListItem( + application, + getQueryService({ from: 'now-7d', to: 'now' }, [], { pause: false, value: 300 }), + false, + DASHBOARD_ID, + false + ); + expect(url).toMatchInlineSnapshot( + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(refreshInterval:(pause:!f,value:300),time:(from:now-7d,to:now))"` + ); + }); + + test('propagates the filters on the query', async () => { + const filters = [ + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, + }, + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, + $state: { + store: esFilters.FilterStateStore.GLOBAL_STATE, + }, + }, + ]; + const url = getDashboardListItem( + application, + getQueryService({ from: 'now-7d', to: 'now' }, filters), + false, + DASHBOARD_ID, + false + ); + expect(url).toMatchInlineSnapshot( + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))),time:(from:now-7d,to:now))"` + ); + }); }); diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts index e4ce0c4d0feb5..a137b049feda5 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -6,7 +6,7 @@ * Public License, v 1. */ import { ApplicationStart } from 'kibana/public'; -import { QueryState, DataPublicPluginStart } from '../../../../data/public'; +import { QueryState, esFilters, DataPublicPluginStart } from '../../../../data/public'; import { setStateToKbnUrl } from '../../../../kibana_utils/public'; import { createDashboardEditUrl, DashboardConstants } from '../../dashboard_constants'; @@ -25,10 +25,16 @@ export const getDashboardListItem = ( }); const queryState: QueryState = {}; const timeRange = queryService.timefilter.timefilter.getTime(); + const filters = queryService.filterManager.getFilters(); + const refreshInterval = queryService.timefilter.timefilter.getRefreshInterval(); + if (filters && filters.length) { + queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); + } + if (refreshInterval) queryState.refreshInterval = refreshInterval; // if time is not saved with the dashboard, add the time on the url query if (!timeRestore) { if (timeRange) queryState.time = timeRange; - url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); } + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); return url; }; diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index 9a168031ecc60..0bbd961c31536 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -10,10 +10,10 @@ import React from 'react'; import { EuiBetaBadge, EuiButton, EuiEmptyPrompt, EuiIcon, EuiLink, EuiBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; - import { ApplicationStart } from 'kibana/public'; import { VisualizationListItem } from 'src/plugins/visualizations/public'; import type { SavedObjectsTaggingApi } from 'src/plugins/saved_objects_tagging_oss/public'; +import { RedirectAppLinks } from '../../../../kibana_react/public'; import { getVisualizeListItem } from './get_visualize_list_item_link'; const getBadge = (item: VisualizationListItem) => { @@ -83,12 +83,14 @@ export const getTableColumns = ( render: (field: string, { editApp, editUrl, title, error }: VisualizationListItem) => // In case an error occurs i.e. the vis has wrong type, we render the vis but without the link !error ? ( - - {field} - + + + {field} + + ) : ( field ), diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts index 15bea30dcad0e..03e1707838f97 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -8,10 +8,13 @@ import { getVisualizeListItem } from './get_visualize_list_item_link'; import { ApplicationStart } from 'kibana/public'; +import { Filter, esFilters, RefreshInterval } from '../../../../data/public'; import { getQueryService } from '../../services'; jest.mock('../../services', () => { let timeFilter = { from: 'now-7d', to: 'now' }; + let filters: Filter[] = []; + let refreshInterval: RefreshInterval | null = null; return { getQueryService: () => ({ timefilter: { @@ -20,8 +23,18 @@ jest.mock('../../services', () => { setTime: jest.fn((newTimeFilter) => { timeFilter = newTimeFilter; }), + getRefreshInterval: jest.fn(() => refreshInterval), + setRefreshInterval: jest.fn((newInterval) => { + refreshInterval = newInterval; + }), }, }, + filterManager: { + getFilters: jest.fn(() => filters), + setFilters: jest.fn((newFilters) => { + filters = newFilters; + }), + }, }), getUISettings: () => ({ get: jest.fn(), @@ -65,4 +78,45 @@ describe('listing item link', () => { `"/app/${editApp}${editUrl}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); }); + + test('propagates the refreshInterval on the query', async () => { + const editUrl = '#/edit/id'; + const editApp = 'lens'; + getQueryService().timefilter.timefilter.setRefreshInterval({ pause: false, value: 300 }); + const url = getVisualizeListItem(application, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(refreshInterval:(pause:!f,value:300),time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + ); + }); + + test('propagates the filters on the query', async () => { + const editUrl = '#/edit/id'; + const editApp = 'lens'; + const filters = [ + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, + }, + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, + $state: { + store: esFilters.FilterStateStore.GLOBAL_STATE, + }, + }, + ]; + getQueryService().filterManager.setFilters(filters); + const url = getVisualizeListItem(application, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))),refreshInterval:(pause:!f,value:300),time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + ); + }); }); diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index e8ae578107076..a9e88eea43538 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -6,10 +6,11 @@ * Public License, v 1. */ import { ApplicationStart } from 'kibana/public'; -import { QueryState } from '../../../../data/public'; +import { QueryState, esFilters } from '../../../../data/public'; import { setStateToKbnUrl } from '../../../../kibana_utils/public'; import { getQueryService, getUISettings } from '../../services'; import { GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; +import { APP_NAME } from '../visualize_constants'; export const getVisualizeListItem = ( application: ApplicationStart, @@ -17,13 +18,19 @@ export const getVisualizeListItem = ( editUrl: string ) => { // for visualizations the editApp is undefined - let url = application.getUrlForApp(editApp ?? 'visualize', { + let url = application.getUrlForApp(editApp ?? APP_NAME, { path: editApp ? editUrl : `#${editUrl}`, }); const queryState: QueryState = {}; const timeRange = getQueryService().timefilter.timefilter.getTime(); - if (timeRange) queryState.time = timeRange; + const filters = getQueryService().filterManager.getFilters(); + const refreshInterval = getQueryService().timefilter.timefilter.getRefreshInterval(); + if (timeRange) queryState.time = timeRange; + if (filters && filters.length) { + queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); + } + if (refreshInterval) queryState.refreshInterval = refreshInterval; const useHash = getUISettings().get('state:storeInSessionStorage'); url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); return url; From 6c0b20750385f5ee9a3d3f2d1463ace67cedeebf Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 26 Jan 2021 16:13:37 +0200 Subject: [PATCH 08/11] Fix functional test failure --- .../public/application/listing/get_dashboard_list_item_link.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts index a137b049feda5..fbe40c0221949 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -30,10 +30,10 @@ export const getDashboardListItem = ( if (filters && filters.length) { queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); } - if (refreshInterval) queryState.refreshInterval = refreshInterval; // if time is not saved with the dashboard, add the time on the url query if (!timeRestore) { if (timeRange) queryState.time = timeRange; + if (refreshInterval) queryState.refreshInterval = refreshInterval; } url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); return url; From d70b110a1f0b39a171d0fa0caa99b203db35f14a Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 27 Jan 2021 12:58:15 +0200 Subject: [PATCH 09/11] Use kbnUrlStateStorage instead --- .../application/listing/dashboard_listing.tsx | 9 +- .../listing/get_dashboard_list_item.test.ts | 111 ++++++------- .../listing/get_dashboard_list_item_link.ts | 27 ++-- .../components/visualize_listing.tsx | 9 +- .../application/utils/get_table_columns.tsx | 4 +- .../get_visualize_list_item_link.test.ts | 153 +++++++++--------- .../utils/get_visualize_list_item_link.ts | 20 +-- 7 files changed, 152 insertions(+), 181 deletions(-) diff --git a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx index c6e254603d8aa..94284dbd4a873 100644 --- a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx +++ b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx @@ -13,7 +13,6 @@ import { attemptLoadDashboardByTitle } from '../lib'; import { DashboardAppServices, DashboardRedirect } from '../types'; import { getDashboardBreadcrumb, dashboardListingTable } from '../../dashboard_strings'; import { ApplicationStart, SavedObjectsFindOptionsReference } from '../../../../../core/public'; -import { DataPublicPluginStart } from '../../../../data/public'; import { syncQueryStateWithUrl } from '../../services/data'; import { IKbnUrlStateStorage } from '../../services/kibana_utils'; import { TableListView, useKibana } from '../../services/kibana_react'; @@ -85,11 +84,11 @@ export const DashboardListing = ({ () => getTableColumns( core.application, - data.query, + kbnUrlStateStorage, core.uiSettings.get('state:storeInSessionStorage'), savedObjectsTagging ), - [core.application, core.uiSettings, data.query, savedObjectsTagging] + [core.application, core.uiSettings, kbnUrlStateStorage, savedObjectsTagging] ); const noItemsFragment = useMemo( @@ -169,7 +168,7 @@ export const DashboardListing = ({ const getTableColumns = ( application: ApplicationStart, - queryService: DataPublicPluginStart['query'], + kbnUrlStateStorage: IKbnUrlStateStorage, useHash: boolean, savedObjectsTagging?: SavedObjectsTaggingApi ) => { @@ -182,7 +181,7 @@ const getTableColumns = ( { - return ({ - timefilter: { - timefilter: { - getTime: jest.fn(() => timeFilter), - getRefreshInterval: jest.fn(() => refreshInterval), - }, - }, - filterManager: { - getFilters: jest.fn(() => filters), - }, - } as unknown) as DataPublicPluginStart['query']; -}; - -beforeEach(() => { - jest.clearAllMocks(); +const history = createHashHistory(); +const kbnUrlStateStorage = createKbnUrlStateStorage({ + history, + useHash: false, }); +kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { time: { from: 'now-7d', to: 'now' } }); -describe('listing item link', () => { +describe('listing dashboard link', () => { test('creates a link to a dashboard without the timerange query if time is saved on the dashboard', async () => { - const url = getDashboardListItem( - application, - getQueryService({ from: 'now-7d', to: 'now' }, []), - false, - DASHBOARD_ID, - true - ); + const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, true); expect(url).toMatchInlineSnapshot(`"/app/dashboards#/view/${DASHBOARD_ID}?_g=()"`); }); test('creates a link to a dashboard with the timerange query if time is not saved on the dashboard', async () => { - const url = getDashboardListItem( - application, - getQueryService({ from: 'now-7d', to: 'now' }, []), - false, - DASHBOARD_ID, - false - ); + const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:now-7d,to:now))"` ); }); +}); + +describe('when global time changes', () => { + beforeEach(() => { + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + time: { + from: '2021-01-05T11:45:53.375Z', + to: '2021-01-21T11:46:00.990Z', + }, + }); + }); test('propagates the correct time on the query', async () => { - const url = getDashboardListItem( - application, - getQueryService( - { - from: '2021-01-05T11:45:53.375Z', - to: '2021-01-21T11:46:00.990Z', - }, - [] - ), - false, - DASHBOARD_ID, - false - ); + const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); }); +}); + +describe('when global refreshInterval changes', () => { + beforeEach(() => { + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + refreshInterval: { pause: false, value: 300 }, + }); + }); test('propagates the refreshInterval on the query', async () => { - const url = getDashboardListItem( - application, - getQueryService({ from: 'now-7d', to: 'now' }, [], { pause: false, value: 300 }), - false, - DASHBOARD_ID, - false - ); + const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); expect(url).toMatchInlineSnapshot( - `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(refreshInterval:(pause:!f,value:300),time:(from:now-7d,to:now))"` + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(refreshInterval:(pause:!f,value:300))"` ); }); +}); - test('propagates the filters on the query', async () => { +describe('when global filters change', () => { + beforeEach(() => { const filters = [ { meta: { @@ -119,15 +98,15 @@ describe('listing item link', () => { }, }, ]; - const url = getDashboardListItem( - application, - getQueryService({ from: 'now-7d', to: 'now' }, filters), - false, - DASHBOARD_ID, - false - ); + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + filters, + }); + }); + + test('propagates the filters on the query', async () => { + const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); expect(url).toMatchInlineSnapshot( - `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))),time:(from:now-7d,to:now))"` + `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(filters:!((meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1)),('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))))"` ); }); }); diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts index fbe40c0221949..05866b0ee2748 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -6,16 +6,15 @@ * Public License, v 1. */ import { ApplicationStart } from 'kibana/public'; -import { QueryState, esFilters, DataPublicPluginStart } from '../../../../data/public'; - +import { QueryState } from '../../../../data/public'; import { setStateToKbnUrl } from '../../../../kibana_utils/public'; import { createDashboardEditUrl, DashboardConstants } from '../../dashboard_constants'; - -const GLOBAL_STATE_STORAGE_KEY = '_g'; +import { GLOBAL_STATE_STORAGE_KEY } from '../../url_generator'; +import { IKbnUrlStateStorage } from '../../services/kibana_utils'; export const getDashboardListItem = ( application: ApplicationStart, - queryService: DataPublicPluginStart['query'], + kbnUrlStateStorage: IKbnUrlStateStorage, useHash: boolean, id: string, timeRestore: boolean @@ -23,18 +22,12 @@ export const getDashboardListItem = ( let url = application.getUrlForApp(DashboardConstants.DASHBOARDS_ID, { path: `#${createDashboardEditUrl(id)}`, }); - const queryState: QueryState = {}; - const timeRange = queryService.timefilter.timefilter.getTime(); - const filters = queryService.filterManager.getFilters(); - const refreshInterval = queryService.timefilter.timefilter.getRefreshInterval(); - if (filters && filters.length) { - queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); - } - // if time is not saved with the dashboard, add the time on the url query - if (!timeRestore) { - if (timeRange) queryState.time = timeRange; - if (refreshInterval) queryState.refreshInterval = refreshInterval; + const globalStateInUrl = kbnUrlStateStorage.get(GLOBAL_STATE_STORAGE_KEY) || {}; + + if (timeRestore) { + delete globalStateInUrl.time; + delete globalStateInUrl.refreshInterval; } - url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, globalStateInUrl, { useHash }, url); return url; }; diff --git a/src/plugins/visualize/public/application/components/visualize_listing.tsx b/src/plugins/visualize/public/application/components/visualize_listing.tsx index 8d620dae05ee1..34131ae2dc7fb 100644 --- a/src/plugins/visualize/public/application/components/visualize_listing.tsx +++ b/src/plugins/visualize/public/application/components/visualize_listing.tsx @@ -40,6 +40,7 @@ export const VisualizeListing = () => { savedObjectsTagging, uiSettings, visualizeCapabilities, + kbnUrlStateStorage, }, } = useKibana(); const { pathname } = useLocation(); @@ -94,10 +95,10 @@ export const VisualizeListing = () => { ); const noItemsFragment = useMemo(() => getNoItemsMessage(createNewVis), [createNewVis]); - const tableColumns = useMemo(() => getTableColumns(application, savedObjectsTagging), [ - application, - savedObjectsTagging, - ]); + const tableColumns = useMemo( + () => getTableColumns(application, kbnUrlStateStorage, savedObjectsTagging), + [application, kbnUrlStateStorage, savedObjectsTagging] + ); const fetchItems = useCallback( (filter) => { diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index 0bbd961c31536..51e811b928eca 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -11,6 +11,7 @@ import { EuiBetaBadge, EuiButton, EuiEmptyPrompt, EuiIcon, EuiLink, EuiBadge } f import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { ApplicationStart } from 'kibana/public'; +import { IKbnUrlStateStorage } from 'src/plugins/kibana_utils/public'; import { VisualizationListItem } from 'src/plugins/visualizations/public'; import type { SavedObjectsTaggingApi } from 'src/plugins/saved_objects_tagging_oss/public'; import { RedirectAppLinks } from '../../../../kibana_react/public'; @@ -72,6 +73,7 @@ const renderItemTypeIcon = (item: VisualizationListItem) => { export const getTableColumns = ( application: ApplicationStart, + kbnUrlStateStorage: IKbnUrlStateStorage, taggingApi?: SavedObjectsTaggingApi ) => [ { @@ -85,7 +87,7 @@ export const getTableColumns = ( !error ? ( {field} diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts index 03e1707838f97..90742493689d1 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -8,34 +8,13 @@ import { getVisualizeListItem } from './get_visualize_list_item_link'; import { ApplicationStart } from 'kibana/public'; -import { Filter, esFilters, RefreshInterval } from '../../../../data/public'; -import { getQueryService } from '../../services'; +import { createHashHistory } from 'history'; +import { createKbnUrlStateStorage } from '../../../../kibana_utils/public'; +import { esFilters } from '../../../../data/public'; +import { GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; jest.mock('../../services', () => { - let timeFilter = { from: 'now-7d', to: 'now' }; - let filters: Filter[] = []; - let refreshInterval: RefreshInterval | null = null; return { - getQueryService: () => ({ - timefilter: { - timefilter: { - getTime: jest.fn(() => timeFilter), - setTime: jest.fn((newTimeFilter) => { - timeFilter = newTimeFilter; - }), - getRefreshInterval: jest.fn(() => refreshInterval), - setRefreshInterval: jest.fn((newInterval) => { - refreshInterval = newInterval; - }), - }, - }, - filterManager: { - getFilters: jest.fn(() => filters), - setFilters: jest.fn((newFilters) => { - filters = newFilters; - }), - }, - }), getUISettings: () => ({ get: jest.fn(), }), @@ -48,75 +27,99 @@ const application = ({ }), } as unknown) as ApplicationStart; -beforeEach(() => { - jest.clearAllMocks(); +const history = createHashHistory(); +const kbnUrlStateStorage = createKbnUrlStateStorage({ + history, + useHash: false, }); +kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { time: { from: 'now-7d', to: 'now' } }); -describe('listing item link', () => { +describe('listing item link is correct for each app', () => { test('creates a link to classic visualization if editApp is not defined', async () => { const editUrl = 'edit/id'; - const url = getVisualizeListItem(application, undefined, editUrl); + const url = getVisualizeListItem(application, kbnUrlStateStorage, undefined, editUrl); expect(url).toMatchInlineSnapshot(`"/app/visualize#${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); test('creates a link for the app given if editApp is defined', async () => { const editUrl = '#/edit/id'; const editApp = 'lens'; - const url = getVisualizeListItem(application, editApp, editUrl); + const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); expect(url).toMatchInlineSnapshot(`"/app/${editApp}${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); - test('propagates the correct time on the query', async () => { - const editUrl = '#/edit/id'; - const editApp = 'lens'; - getQueryService().timefilter.timefilter.setTime({ - from: '2021-01-05T11:45:53.375Z', - to: '2021-01-21T11:46:00.990Z', + describe('when global time changes', () => { + beforeEach(() => { + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + time: { + from: '2021-01-05T11:45:53.375Z', + to: '2021-01-21T11:46:00.990Z', + }, + }); + }); + + test('it propagates the correct time on the query', async () => { + const editUrl = '#/edit/id'; + const editApp = 'lens'; + const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` + ); }); - const url = getVisualizeListItem(application, editApp, editUrl); - expect(url).toMatchInlineSnapshot( - `"/app/${editApp}${editUrl}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` - ); }); - test('propagates the refreshInterval on the query', async () => { - const editUrl = '#/edit/id'; - const editApp = 'lens'; - getQueryService().timefilter.timefilter.setRefreshInterval({ pause: false, value: 300 }); - const url = getVisualizeListItem(application, editApp, editUrl); - expect(url).toMatchInlineSnapshot( - `"/app/${editApp}${editUrl}?_g=(refreshInterval:(pause:!f,value:300),time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` - ); + describe('when global refreshInterval changes', () => { + beforeEach(() => { + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + refreshInterval: { pause: false, value: 300 }, + }); + }); + + test('it propagates the refreshInterval on the query', async () => { + const editUrl = '#/edit/id'; + const editApp = 'lens'; + const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(refreshInterval:(pause:!f,value:300))"` + ); + }); }); - test('propagates the filters on the query', async () => { - const editUrl = '#/edit/id'; - const editApp = 'lens'; - const filters = [ - { - meta: { - alias: null, - disabled: false, - negate: false, + describe('when global filters change', () => { + beforeEach(() => { + const filters = [ + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, }, - query: { query: 'q1' }, - }, - { - meta: { - alias: null, - disabled: false, - negate: false, + { + meta: { + alias: null, + disabled: false, + negate: false, + }, + query: { query: 'q1' }, + $state: { + store: esFilters.FilterStateStore.GLOBAL_STATE, + }, }, - query: { query: 'q1' }, - $state: { - store: esFilters.FilterStateStore.GLOBAL_STATE, - }, - }, - ]; - getQueryService().filterManager.setFilters(filters); - const url = getVisualizeListItem(application, editApp, editUrl); - expect(url).toMatchInlineSnapshot( - `"/app/${editApp}${editUrl}?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))),refreshInterval:(pause:!f,value:300),time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` - ); + ]; + kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { + filters, + }); + }); + + test('propagates the filters on the query', async () => { + const editUrl = '#/edit/id'; + const editApp = 'lens'; + const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + expect(url).toMatchInlineSnapshot( + `"/app/${editApp}${editUrl}?_g=(filters:!((meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1)),('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))))"` + ); + }); }); }); diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index a9e88eea43538..6ff7bb78c2211 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -6,14 +6,16 @@ * Public License, v 1. */ import { ApplicationStart } from 'kibana/public'; -import { QueryState, esFilters } from '../../../../data/public'; +import { IKbnUrlStateStorage } from 'src/plugins/kibana_utils/public'; +import { QueryState } from '../../../../data/public'; import { setStateToKbnUrl } from '../../../../kibana_utils/public'; -import { getQueryService, getUISettings } from '../../services'; +import { getUISettings } from '../../services'; import { GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; import { APP_NAME } from '../visualize_constants'; export const getVisualizeListItem = ( application: ApplicationStart, + kbnUrlStateStorage: IKbnUrlStateStorage, editApp: string | undefined, editUrl: string ) => { @@ -21,17 +23,9 @@ export const getVisualizeListItem = ( let url = application.getUrlForApp(editApp ?? APP_NAME, { path: editApp ? editUrl : `#${editUrl}`, }); - const queryState: QueryState = {}; - const timeRange = getQueryService().timefilter.timefilter.getTime(); - const filters = getQueryService().filterManager.getFilters(); - const refreshInterval = getQueryService().timefilter.timefilter.getRefreshInterval(); - - if (timeRange) queryState.time = timeRange; - if (filters && filters.length) { - queryState.filters = filters?.filter((f) => esFilters.isFilterPinned(f)); - } - if (refreshInterval) queryState.refreshInterval = refreshInterval; const useHash = getUISettings().get('state:storeInSessionStorage'); - url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, queryState, { useHash }, url); + const globalStateInUrl = kbnUrlStateStorage.get(GLOBAL_STATE_STORAGE_KEY) || {}; + + url = setStateToKbnUrl(GLOBAL_STATE_STORAGE_KEY, globalStateInUrl, { useHash }, url); return url; }; From 4b053ace9e41153d1683e68e0ad3cd5e9b96267b Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 28 Jan 2021 08:58:40 +0200 Subject: [PATCH 10/11] Change method to getDashboardListItemLink --- .../application/listing/dashboard_listing.tsx | 4 +- ...s => get_dashboard_list_item_link.test.ts} | 42 ++++++++++++++++--- .../listing/get_dashboard_list_item_link.ts | 2 +- 3 files changed, 39 insertions(+), 9 deletions(-) rename src/plugins/dashboard/public/application/listing/{get_dashboard_list_item.test.ts => get_dashboard_list_item_link.test.ts} (81%) diff --git a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx index 94284dbd4a873..07de4cd52bba6 100644 --- a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx +++ b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx @@ -17,7 +17,7 @@ import { syncQueryStateWithUrl } from '../../services/data'; import { IKbnUrlStateStorage } from '../../services/kibana_utils'; import { TableListView, useKibana } from '../../services/kibana_react'; import { SavedObjectsTaggingApi } from '../../services/saved_objects_tagging_oss'; -import { getDashboardListItem } from './get_dashboard_list_item_link'; +import { getDashboardListItemLink } from './get_dashboard_list_item_link'; export interface DashboardListingProps { kbnUrlStateStorage: IKbnUrlStateStorage; @@ -179,7 +179,7 @@ const getTableColumns = ( sortable: true, render: (field: string, record: { id: string; title: string; timeRestore: boolean }) => ( { test('creates a link to a dashboard without the timerange query if time is saved on the dashboard', async () => { - const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, true); + const url = getDashboardListItemLink( + application, + kbnUrlStateStorage, + false, + DASHBOARD_ID, + true + ); expect(url).toMatchInlineSnapshot(`"/app/dashboards#/view/${DASHBOARD_ID}?_g=()"`); }); test('creates a link to a dashboard with the timerange query if time is not saved on the dashboard', async () => { - const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); + const url = getDashboardListItemLink( + application, + kbnUrlStateStorage, + false, + DASHBOARD_ID, + false + ); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:now-7d,to:now))"` ); @@ -53,7 +65,13 @@ describe('when global time changes', () => { }); test('propagates the correct time on the query', async () => { - const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); + const url = getDashboardListItemLink( + application, + kbnUrlStateStorage, + false, + DASHBOARD_ID, + false + ); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); @@ -68,7 +86,13 @@ describe('when global refreshInterval changes', () => { }); test('propagates the refreshInterval on the query', async () => { - const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); + const url = getDashboardListItemLink( + application, + kbnUrlStateStorage, + false, + DASHBOARD_ID, + false + ); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(refreshInterval:(pause:!f,value:300))"` ); @@ -104,7 +128,13 @@ describe('when global filters change', () => { }); test('propagates the filters on the query', async () => { - const url = getDashboardListItem(application, kbnUrlStateStorage, false, DASHBOARD_ID, false); + const url = getDashboardListItemLink( + application, + kbnUrlStateStorage, + false, + DASHBOARD_ID, + false + ); expect(url).toMatchInlineSnapshot( `"/app/dashboards#/view/${DASHBOARD_ID}?_g=(filters:!((meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1)),('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))))"` ); diff --git a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts index 05866b0ee2748..d14638b9e231f 100644 --- a/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts +++ b/src/plugins/dashboard/public/application/listing/get_dashboard_list_item_link.ts @@ -12,7 +12,7 @@ import { createDashboardEditUrl, DashboardConstants } from '../../dashboard_cons import { GLOBAL_STATE_STORAGE_KEY } from '../../url_generator'; import { IKbnUrlStateStorage } from '../../services/kibana_utils'; -export const getDashboardListItem = ( +export const getDashboardListItemLink = ( application: ApplicationStart, kbnUrlStateStorage: IKbnUrlStateStorage, useHash: boolean, From 441814ff86374e5ad29bb05c60055fe2d8c38afb Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 28 Jan 2021 09:03:00 +0200 Subject: [PATCH 11/11] Change method to getVisualizeListItemLink --- .../public/application/utils/get_table_columns.tsx | 4 ++-- .../utils/get_visualize_list_item_link.test.ts | 12 ++++++------ .../utils/get_visualize_list_item_link.ts | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/plugins/visualize/public/application/utils/get_table_columns.tsx b/src/plugins/visualize/public/application/utils/get_table_columns.tsx index 51e811b928eca..d9dafa7335671 100644 --- a/src/plugins/visualize/public/application/utils/get_table_columns.tsx +++ b/src/plugins/visualize/public/application/utils/get_table_columns.tsx @@ -15,7 +15,7 @@ import { IKbnUrlStateStorage } from 'src/plugins/kibana_utils/public'; import { VisualizationListItem } from 'src/plugins/visualizations/public'; import type { SavedObjectsTaggingApi } from 'src/plugins/saved_objects_tagging_oss/public'; import { RedirectAppLinks } from '../../../../kibana_react/public'; -import { getVisualizeListItem } from './get_visualize_list_item_link'; +import { getVisualizeListItemLink } from './get_visualize_list_item_link'; const getBadge = (item: VisualizationListItem) => { if (item.stage === 'beta') { @@ -87,7 +87,7 @@ export const getTableColumns = ( !error ? ( {field} diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts index 90742493689d1..80fd1c8740f2c 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -6,7 +6,7 @@ * Public License, v 1. */ -import { getVisualizeListItem } from './get_visualize_list_item_link'; +import { getVisualizeListItemLink } from './get_visualize_list_item_link'; import { ApplicationStart } from 'kibana/public'; import { createHashHistory } from 'history'; import { createKbnUrlStateStorage } from '../../../../kibana_utils/public'; @@ -37,14 +37,14 @@ kbnUrlStateStorage.set(GLOBAL_STATE_STORAGE_KEY, { time: { from: 'now-7d', to: ' describe('listing item link is correct for each app', () => { test('creates a link to classic visualization if editApp is not defined', async () => { const editUrl = 'edit/id'; - const url = getVisualizeListItem(application, kbnUrlStateStorage, undefined, editUrl); + const url = getVisualizeListItemLink(application, kbnUrlStateStorage, undefined, editUrl); expect(url).toMatchInlineSnapshot(`"/app/visualize#${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); test('creates a link for the app given if editApp is defined', async () => { const editUrl = '#/edit/id'; const editApp = 'lens'; - const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + const url = getVisualizeListItemLink(application, kbnUrlStateStorage, editApp, editUrl); expect(url).toMatchInlineSnapshot(`"/app/${editApp}${editUrl}?_g=(time:(from:now-7d,to:now))"`); }); @@ -61,7 +61,7 @@ describe('listing item link is correct for each app', () => { test('it propagates the correct time on the query', async () => { const editUrl = '#/edit/id'; const editApp = 'lens'; - const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + const url = getVisualizeListItemLink(application, kbnUrlStateStorage, editApp, editUrl); expect(url).toMatchInlineSnapshot( `"/app/${editApp}${editUrl}?_g=(time:(from:'2021-01-05T11:45:53.375Z',to:'2021-01-21T11:46:00.990Z'))"` ); @@ -78,7 +78,7 @@ describe('listing item link is correct for each app', () => { test('it propagates the refreshInterval on the query', async () => { const editUrl = '#/edit/id'; const editApp = 'lens'; - const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + const url = getVisualizeListItemLink(application, kbnUrlStateStorage, editApp, editUrl); expect(url).toMatchInlineSnapshot( `"/app/${editApp}${editUrl}?_g=(refreshInterval:(pause:!f,value:300))"` ); @@ -116,7 +116,7 @@ describe('listing item link is correct for each app', () => { test('propagates the filters on the query', async () => { const editUrl = '#/edit/id'; const editApp = 'lens'; - const url = getVisualizeListItem(application, kbnUrlStateStorage, editApp, editUrl); + const url = getVisualizeListItemLink(application, kbnUrlStateStorage, editApp, editUrl); expect(url).toMatchInlineSnapshot( `"/app/${editApp}${editUrl}?_g=(filters:!((meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1)),('$state':(store:globalState),meta:(alias:!n,disabled:!f,negate:!f),query:(query:q1))))"` ); diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts index 6ff7bb78c2211..2ded3ce8c2745 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.ts @@ -13,7 +13,7 @@ import { getUISettings } from '../../services'; import { GLOBAL_STATE_STORAGE_KEY } from '../../../common/constants'; import { APP_NAME } from '../visualize_constants'; -export const getVisualizeListItem = ( +export const getVisualizeListItemLink = ( application: ApplicationStart, kbnUrlStateStorage: IKbnUrlStateStorage, editApp: string | undefined,