From 6c328cc8e07c193308b1b9d6187345e1a04b489f Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Thu, 1 Jul 2021 11:12:20 +0200 Subject: [PATCH 01/43] [Security Solutions] Administration breadcrumbs shortened to be consistent with the rest (#103927) * Administration breadcrumbs shortened to bbe consistent with the rest * remove comment --- .../navigation/breadcrumbs/index.test.ts | 11 +++++++---- .../components/navigation/breadcrumbs/index.ts | 13 +------------ .../public/management/common/breadcrumbs.ts | 17 +---------------- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts index 6789d8e1d4524c..1f7e668b21b988 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.test.ts @@ -13,6 +13,7 @@ import { RouteSpyState, SiemRouteType } from '../../../utils/route/types'; import { TabNavigationProps } from '../tab_navigation/types'; import { NetworkRouteType } from '../../../../network/pages/navigation/types'; import { TimelineTabs } from '../../../../../common/types/timeline'; +import { AdministrationSubTab } from '../../../../management/types'; const setBreadcrumbsMock = jest.fn(); const chromeMock = { @@ -26,6 +27,8 @@ const mockDefaultTab = (pageName: string): SiemRouteType | undefined => { return HostsTableType.authentications; case 'network': return NetworkRouteType.flows; + case 'administration': + return AdministrationSubTab.endpoints; default: return undefined; } @@ -423,16 +426,16 @@ describe('Navigation Breadcrumbs', () => { }, ]); }); - test('should return Admin breadcrumbs when supplied admin pathname', () => { + test('should return Admin breadcrumbs when supplied endpoints pathname', () => { const breadcrumbs = getBreadcrumbsForRoute( - getMockObject('administration', '/', undefined), + getMockObject('administration', '/endpoints', undefined), getUrlForAppMock ); expect(breadcrumbs).toEqual([ { text: 'Security', href: 'securitySolution/overview' }, { - text: 'Administration', - href: 'securitySolution/endpoints', + text: 'Endpoints', + href: '', }, ]); }); diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts index 4578e16dc5540f..03ee38473e58d4 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts @@ -186,18 +186,7 @@ export const getBreadcrumbsForRoute = ( if (spyState.tabName != null) { urlStateKeys = [...urlStateKeys, getOr(tempNav, spyState.tabName, object.navTabs)]; } - - return [ - siemRootBreadcrumb, - ...getAdminBreadcrumbs( - spyState, - urlStateKeys.reduce( - (acc: string[], item: SearchNavTab) => [...acc, getSearch(item, object)], - [] - ), - getUrlForApp - ), - ]; + return [siemRootBreadcrumb, ...getAdminBreadcrumbs(spyState)]; } if ( diff --git a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts index d437c45792766b..9c3d781f514e92 100644 --- a/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts +++ b/x-pack/plugins/security_solution/public/management/common/breadcrumbs.ts @@ -6,13 +6,9 @@ */ import { ChromeBreadcrumb } from 'kibana/public'; -import { isEmpty } from 'lodash/fp'; import { AdministrationSubTab } from '../types'; import { ENDPOINTS_TAB, EVENT_FILTERS_TAB, POLICIES_TAB, TRUSTED_APPS_TAB } from './translations'; import { AdministrationRouteSpyState } from '../../common/utils/route/types'; -import { GetUrlForApp } from '../../common/components/navigation/types'; -import { ADMINISTRATION } from '../../app/translations'; -import { APP_ID, SecurityPageName } from '../../../common/constants'; const TabNameMappedToI18nKey: Record = { [AdministrationSubTab.endpoints]: ENDPOINTS_TAB, @@ -21,19 +17,8 @@ const TabNameMappedToI18nKey: Record = { [AdministrationSubTab.eventFilters]: EVENT_FILTERS_TAB, }; -export function getBreadcrumbs( - params: AdministrationRouteSpyState, - search: string[], - getUrlForApp: GetUrlForApp -): ChromeBreadcrumb[] { +export function getBreadcrumbs(params: AdministrationRouteSpyState): ChromeBreadcrumb[] { return [ - { - text: ADMINISTRATION, - href: getUrlForApp(APP_ID, { - deepLinkId: SecurityPageName.endpoints, - path: !isEmpty(search[0]) ? search[0] : '', - }), - }, ...(params?.tabName ? [params?.tabName] : []).map((tabName) => ({ text: TabNameMappedToI18nKey[tabName], href: '', From c52e0e12aa6575cbb2f968b76f683eaac2e0d6af Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 1 Jul 2021 12:34:28 +0300 Subject: [PATCH 02/43] [TSVB] Documents the new index pattern mode (#102880) * [TSVB] Document the new index pattern mode * Add a callout to TSVB to advertise the new index pattern mode * Conditionally render the callout, give capability to dismiss it * Fix i18n * Update the notification texts * Update notification text * Change callout storage key * add UseIndexPatternModeCallout component * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/user/dashboard/tsvb.asciidoc Co-authored-by: Kaarina Tungseth * Final docs changes * Remove TSVB from title Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Alexey Antonov Co-authored-by: Kaarina Tungseth --- .../tsvb_index_pattern_selection_mode.png | Bin 0 -> 130582 bytes docs/user/dashboard/tsvb.asciidoc | 25 ++++++- .../public/doc_links/doc_links_service.ts | 1 + .../use_index_patter_mode_callout.tsx | 69 ++++++++++++++++++ .../application/components/vis_editor.tsx | 3 +- 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 docs/user/dashboard/images/tsvb_index_pattern_selection_mode.png create mode 100644 src/plugins/vis_type_timeseries/public/application/components/use_index_patter_mode_callout.tsx diff --git a/docs/user/dashboard/images/tsvb_index_pattern_selection_mode.png b/docs/user/dashboard/images/tsvb_index_pattern_selection_mode.png new file mode 100644 index 0000000000000000000000000000000000000000..ef72f291850e48f9f5c9e943f6ba8e9d4e70e867 GIT binary patch literal 130582 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 P2Kc8Srz#7VF?#!d!GQ-w literal 0 HcmV?d00001 diff --git a/docs/user/dashboard/tsvb.asciidoc b/docs/user/dashboard/tsvb.asciidoc index 93ee3627bd8a0c..9320b062a8ba93 100644 --- a/docs/user/dashboard/tsvb.asciidoc +++ b/docs/user/dashboard/tsvb.asciidoc @@ -30,6 +30,29 @@ By default, *TSVB* drops the last bucket because the time filter intersects the .. In the *Panel filter* field, enter <> to view specific documents. +[float] +[[tsvb-index-pattern-mode]] +==== Index pattern mode +Create *TSVB* visualizations with {kib} index patterns. + +IMPORTANT: Creating *TSVB* visualizations with an {es} index string is deprecated and will be removed in a future release. +It is the default one for new visualizations but it can also be switched for the old implementations: + +. Click *Panel options*, then click the gear icon to open the *Index pattern selection mode* options. +. Select *Use only Kibana index patterns*. +. Reselect the index pattern from the dropdown, then select the *Time field*. + +image::images/tsvb_index_pattern_selection_mode.png[Change index pattern selection mode action] + +The index pattern mode unlocks many new features, such as: +* Runtime fields + +* URL drilldowns + +* Interactive filters for time series visualizations + +* Better performance + [float] [[configure-the-data-series]] ==== Configure the series @@ -177,4 +200,4 @@ To group with multiple fields, create runtime fields in the index pattern you ar [role="screenshot"] image::images/tsvb_group_by_multiple_fields.png[Group by multiple fields] -. Create a new TSVB visualization and group by this field. \ No newline at end of file +. Create a new TSVB visualization and group by this field. diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 9ab5480b809bce..6bb714e9138383 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -263,6 +263,7 @@ export class DocLinksService { lensPanels: `${KIBANA_DOCS}lens.html`, maps: `${ELASTIC_WEBSITE_URL}maps`, vega: `${KIBANA_DOCS}vega.html`, + tsvbIndexPatternMode: `${KIBANA_DOCS}tsvb.html#tsvb-index-pattern-mode`, }, observability: { guide: `${ELASTIC_WEBSITE_URL}guide/en/observability/${DOC_LINK_VERSION}/index.html`, diff --git a/src/plugins/vis_type_timeseries/public/application/components/use_index_patter_mode_callout.tsx b/src/plugins/vis_type_timeseries/public/application/components/use_index_patter_mode_callout.tsx new file mode 100644 index 00000000000000..6191df2ecce5b8 --- /dev/null +++ b/src/plugins/vis_type_timeseries/public/application/components/use_index_patter_mode_callout.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useMemo, useCallback } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; +import { EuiButton, EuiCallOut, EuiFlexGroup, EuiLink } from '@elastic/eui'; +import { getCoreStart } from '../../services'; + +const LOCAL_STORAGE_KEY = 'TSVB_INDEX_PATTERN_CALLOUT_HIDDEN'; + +export const UseIndexPatternModeCallout = () => { + const [dismissed, setDismissed] = useLocalStorage(LOCAL_STORAGE_KEY, false); + const indexPatternModeLink = useMemo( + () => getCoreStart().docLinks.links.visualize.tsvbIndexPatternMode, + [] + ); + + const dismissNotice = useCallback(() => { + setDismissed(true); + }, [setDismissed]); + + if (dismissed) { + return null; + } + + return ( + + } + iconType="cheer" + size="s" + > +

+ + + + ), + }} + /> +

+ + + + + +
+ ); +}; diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_editor.tsx b/src/plugins/vis_type_timeseries/public/application/components/vis_editor.tsx index d11b5a60b31b7d..424b39feff8364 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_editor.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_editor.tsx @@ -12,7 +12,6 @@ import uuid from 'uuid/v4'; import { share } from 'rxjs/operators'; import { isEqual, isEmpty, debounce } from 'lodash'; import { EventEmitter } from 'events'; - import type { IUiSettingsClient } from 'kibana/public'; import { Vis, @@ -35,6 +34,7 @@ import { VisPicker } from './vis_picker'; import { fetchFields, VisFields } from '../lib/fetch_fields'; import { getDataStart, getCoreStart } from '../../services'; import { TimeseriesVisParams } from '../../types'; +import { UseIndexPatternModeCallout } from './use_index_patter_mode_callout'; const VIS_STATE_DEBOUNCE_DELAY = 200; const APP_NAME = 'VisEditor'; @@ -182,6 +182,7 @@ export class VisEditor extends Component
+ {!this.props.vis.params.use_kibana_indexes && }
From 1b75ac5eb770031fc29ba6535dbca7e52256ba02 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:49:21 +0300 Subject: [PATCH 03/43] [Discover] fix sidebar content for old ff (#103424) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../apps/main/components/sidebar/discover_sidebar.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.scss b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.scss index 139230fbdb66ab..9ef123fa1a60f3 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.scss +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.scss @@ -1,4 +1,5 @@ .dscSidebar { + overflow: hidden; margin: 0 !important; flex-grow: 1; padding-left: $euiSize; From ba85f45014e61b654a08d1551e6f642afc7d1406 Mon Sep 17 00:00:00 2001 From: mgiota Date: Thu, 1 Jul 2021 12:13:33 +0200 Subject: [PATCH 04/43] [Logs & Metrics] refactor breadcrumbs (#103249) * [Logs & Metrics] refactor breadcrumbs * [Logs & Metrics] remove Header component, move translations and create readonly badge hook * add breadcrumb to metric detail page * fix check_file_casing ci issues * create separate breadcrumb hook for logs and metrics * fix metrics translation title * fix wrong imports and unused variables * fix translation imports * fix unused import * refactor use_breadcrumbs * remove Header component * fix linter exhaustive-deps error by wrapping into useMemo * refactor use_readonly_badge * remove commented out code Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/infra/common/constants.ts | 2 + .../infra/public/components/header/header.tsx | 56 ------------------- .../infra/public/components/header/index.ts | 8 --- .../infra/public/hooks/use_breadcrumbs.ts | 37 ++++++++++++ .../public/hooks/use_logs_breadcrumbs.tsx | 15 +++++ .../public/hooks/use_metrics_breadcrumbs.tsx | 15 +++++ .../infra/public/hooks/use_readonly_badge.tsx | 32 +++++++++++ x-pack/plugins/infra/public/pages/error.tsx | 2 - .../pages/logs/log_entry_categories/page.tsx | 8 +++ .../public/pages/logs/log_entry_rate/page.tsx | 7 +++ .../infra/public/pages/logs/page_content.tsx | 12 +--- .../source_configuration_settings.tsx | 12 ++-- .../infra/public/pages/logs/stream/page.tsx | 8 +++ .../infra/public/pages/metrics/index.tsx | 15 +---- .../pages/metrics/inventory_view/index.tsx | 13 +++-- .../pages/metrics/metric_detail/index.tsx | 24 ++++---- .../pages/metrics/metrics_explorer/index.tsx | 13 +++-- .../source_configuration_settings.tsx | 13 +++-- x-pack/plugins/infra/public/translations.ts | 47 ++++++++++++++++ 19 files changed, 222 insertions(+), 117 deletions(-) delete mode 100644 x-pack/plugins/infra/public/components/header/header.tsx delete mode 100644 x-pack/plugins/infra/public/components/header/index.ts create mode 100644 x-pack/plugins/infra/public/hooks/use_breadcrumbs.ts create mode 100644 x-pack/plugins/infra/public/hooks/use_logs_breadcrumbs.tsx create mode 100644 x-pack/plugins/infra/public/hooks/use_metrics_breadcrumbs.tsx create mode 100644 x-pack/plugins/infra/public/hooks/use_readonly_badge.tsx create mode 100644 x-pack/plugins/infra/public/translations.ts diff --git a/x-pack/plugins/infra/common/constants.ts b/x-pack/plugins/infra/common/constants.ts index 5361434302a7df..9362293fce82f5 100644 --- a/x-pack/plugins/infra/common/constants.ts +++ b/x-pack/plugins/infra/common/constants.ts @@ -9,3 +9,5 @@ export const DEFAULT_SOURCE_ID = 'default'; export const METRICS_INDEX_PATTERN = 'metrics-*,metricbeat-*'; export const LOGS_INDEX_PATTERN = 'logs-*,filebeat-*,kibana_sample_data_logs*'; export const TIMESTAMP_FIELD = '@timestamp'; +export const METRICS_APP = 'metrics'; +export const LOGS_APP = 'logs'; diff --git a/x-pack/plugins/infra/public/components/header/header.tsx b/x-pack/plugins/infra/public/components/header/header.tsx deleted file mode 100644 index 6196a0b1178790..00000000000000 --- a/x-pack/plugins/infra/public/components/header/header.tsx +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useCallback, useEffect } from 'react'; -import { i18n } from '@kbn/i18n'; -import { ChromeBreadcrumb } from 'src/core/public'; -import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; - -interface HeaderProps { - breadcrumbs?: ChromeBreadcrumb[]; - readOnlyBadge?: boolean; -} - -export const Header = ({ breadcrumbs = [], readOnlyBadge = false }: HeaderProps) => { - const chrome = useKibana().services.chrome; - - // eslint-disable-next-line react-hooks/exhaustive-deps - const badge = readOnlyBadge - ? { - text: i18n.translate('xpack.infra.header.badge.readOnly.text', { - defaultMessage: 'Read only', - }), - tooltip: i18n.translate('xpack.infra.header.badge.readOnly.tooltip', { - defaultMessage: 'Unable to change source configuration', - }), - iconType: 'glasses', - } - : undefined; - - const setBreadcrumbs = useCallback(() => { - return chrome?.setBreadcrumbs(breadcrumbs || []); - }, [breadcrumbs, chrome]); - - const setBadge = useCallback(() => { - return chrome?.setBadge(badge); - }, [badge, chrome]); - - useEffect(() => { - setBreadcrumbs(); - setBadge(); - }, [setBreadcrumbs, setBadge]); - - useEffect(() => { - setBreadcrumbs(); - }, [breadcrumbs, setBreadcrumbs]); - - useEffect(() => { - setBadge(); - }, [badge, setBadge]); - - return null; -}; diff --git a/x-pack/plugins/infra/public/components/header/index.ts b/x-pack/plugins/infra/public/components/header/index.ts deleted file mode 100644 index 37156e1b6cacd0..00000000000000 --- a/x-pack/plugins/infra/public/components/header/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { Header } from './header'; diff --git a/x-pack/plugins/infra/public/hooks/use_breadcrumbs.ts b/x-pack/plugins/infra/public/hooks/use_breadcrumbs.ts new file mode 100644 index 00000000000000..32127f21b75f5c --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_breadcrumbs.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ChromeBreadcrumb } from 'kibana/public'; +import { useEffect } from 'react'; +import { observabilityTitle } from '../translations'; +import { useKibanaContextForPlugin } from './use_kibana'; +import { useLinkProps } from './use_link_props'; + +type AppId = 'logs' | 'metrics'; + +export const useBreadcrumbs = (app: AppId, appTitle: string, extraCrumbs: ChromeBreadcrumb[]) => { + const { + services: { chrome }, + } = useKibanaContextForPlugin(); + + const observabilityLinkProps = useLinkProps({ app: 'observability-overview' }); + const appLinkProps = useLinkProps({ app }); + + useEffect(() => { + chrome?.setBreadcrumbs?.([ + { + ...observabilityLinkProps, + text: observabilityTitle, + }, + { + ...appLinkProps, + text: appTitle, + }, + ...extraCrumbs, + ]); + }, [appLinkProps, appTitle, chrome, extraCrumbs, observabilityLinkProps]); +}; diff --git a/x-pack/plugins/infra/public/hooks/use_logs_breadcrumbs.tsx b/x-pack/plugins/infra/public/hooks/use_logs_breadcrumbs.tsx new file mode 100644 index 00000000000000..e00e5b4818ba60 --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_logs_breadcrumbs.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ChromeBreadcrumb } from 'kibana/public'; +import { useBreadcrumbs } from './use_breadcrumbs'; +import { LOGS_APP } from '../../common/constants'; +import { logsTitle } from '../translations'; + +export const useLogsBreadcrumbs = (extraCrumbs: ChromeBreadcrumb[]) => { + useBreadcrumbs(LOGS_APP, logsTitle, extraCrumbs); +}; diff --git a/x-pack/plugins/infra/public/hooks/use_metrics_breadcrumbs.tsx b/x-pack/plugins/infra/public/hooks/use_metrics_breadcrumbs.tsx new file mode 100644 index 00000000000000..e55f65a97b63e7 --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_metrics_breadcrumbs.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ChromeBreadcrumb } from 'kibana/public'; +import { useBreadcrumbs } from './use_breadcrumbs'; +import { METRICS_APP } from '../../common/constants'; +import { metricsTitle } from '../translations'; + +export const useMetricsBreadcrumbs = (extraCrumbs: ChromeBreadcrumb[]) => { + useBreadcrumbs(METRICS_APP, metricsTitle, extraCrumbs); +}; diff --git a/x-pack/plugins/infra/public/hooks/use_readonly_badge.tsx b/x-pack/plugins/infra/public/hooks/use_readonly_badge.tsx new file mode 100644 index 00000000000000..a0b0558e0393df --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_readonly_badge.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '../../../../../src/plugins/kibana_react/public'; + +export const useReadOnlyBadge = (isReadOnly = false) => { + const chrome = useKibana().services.chrome; + + useEffect(() => { + chrome?.setBadge( + isReadOnly + ? { + text: i18n.translate('xpack.infra.header.badge.readOnly.text', { + defaultMessage: 'Read only', + }), + tooltip: i18n.translate('xpack.infra.header.badge.readOnly.tooltip', { + defaultMessage: 'Unable to change source configuration', + }), + iconType: 'glasses', + } + : undefined + ); + }, [chrome, isReadOnly]); + + return null; +}; diff --git a/x-pack/plugins/infra/public/pages/error.tsx b/x-pack/plugins/infra/public/pages/error.tsx index 6b6eaf98b1db61..18cb2a14a92149 100644 --- a/x-pack/plugins/infra/public/pages/error.tsx +++ b/x-pack/plugins/infra/public/pages/error.tsx @@ -18,7 +18,6 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import { euiStyled } from '../../../../../src/plugins/kibana_react/common'; -import { Header } from '../components/header'; import { ColumnarPage, PageContent } from '../components/page'; const DetailPageContent = euiStyled(PageContent)` @@ -33,7 +32,6 @@ interface Props { export const Error: React.FC = ({ message }) => { return ( -
diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx index 64dbcbdfe22580..34634b194cb859 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page.tsx @@ -7,10 +7,18 @@ import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; +import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; import { LogEntryCategoriesPageContent } from './page_content'; import { LogEntryCategoriesPageProviders } from './page_providers'; +import { logCategoriesTitle } from '../../../translations'; export const LogEntryCategoriesPage = () => { + useLogsBreadcrumbs([ + { + text: logCategoriesTitle, + }, + ]); + return ( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx index ff4cba731b6168..94950b24b1a94c 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page.tsx @@ -9,8 +9,15 @@ import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import { LogEntryRatePageContent } from './page_content'; import { LogEntryRatePageProviders } from './page_providers'; +import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; +import { anomaliesTitle } from '../../../translations'; export const LogEntryRatePage = () => { + useLogsBreadcrumbs([ + { + text: anomaliesTitle, + }, + ]); return ( diff --git a/x-pack/plugins/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/page_content.tsx index c7b145b4b01431..8175a95f6a0649 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_content.tsx @@ -14,7 +14,6 @@ import useMount from 'react-use/lib/useMount'; import { AlertDropdown } from '../../alerting/log_threshold'; import { useKibana } from '../../../../../../src/plugins/kibana_react/public'; import { DocumentTitle } from '../../components/document_title'; -import { Header } from '../../components/header'; import { HelpCenterContent } from '../../components/help_center_content'; import { useLogSourceContext } from '../../containers/logs/log_source'; import { RedirectWithQueryParams } from '../../utils/redirect_with_query_params'; @@ -25,6 +24,7 @@ import { StreamPage } from './stream'; import { HeaderMenuPortal } from '../../../../observability/public'; import { HeaderActionMenuContext } from '../../utils/header_action_menu_provider'; import { useLinkProps } from '../../hooks/use_link_props'; +import { useReadOnlyBadge } from '../../hooks/use_readonly_badge'; export const LogsPageContent: React.FunctionComponent = () => { const uiCapabilities = useKibana().services.application?.capabilities; @@ -34,6 +34,8 @@ export const LogsPageContent: React.FunctionComponent = () => { const kibana = useKibana(); + useReadOnlyBadge(!uiCapabilities?.logs?.save); + useMount(() => { initialize(); }); @@ -101,14 +103,6 @@ export const LogsPageContent: React.FunctionComponent = () => { )} -
diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx index 180949572b0869..a765cf074271c9 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx @@ -18,6 +18,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useMemo } from 'react'; import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { useTrackPageview } from '../../../../../observability/public'; +import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; import { SourceLoadingPage } from '../../../components/source_loading_page'; import { useLogSourceContext } from '../../../containers/logs/log_source'; import { Prompt } from '../../../utils/navigation_warning_prompt'; @@ -27,10 +28,7 @@ import { NameConfigurationPanel } from './name_configuration_panel'; import { LogSourceConfigurationFormErrors } from './source_configuration_form_errors'; import { useLogSourceConfigurationFormState } from './source_configuration_form_state'; import { LogsPageTemplate } from '../page_template'; - -const settingsTitle = i18n.translate('xpack.infra.logs.settingsTitle', { - defaultMessage: 'Settings', -}); +import { settingsTitle } from '../../../translations'; export const LogsSettingsPage = () => { const uiCapabilities = useKibana().services.application?.capabilities; @@ -43,6 +41,12 @@ export const LogsSettingsPage = () => { delay: 15000, }); + useLogsBreadcrumbs([ + { + text: settingsTitle, + }, + ]); + const { sourceConfiguration: source, hasFailedLoadingSource, diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page.tsx index 99b66d2d4ab7bd..2ac307570cc979 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page.tsx @@ -8,13 +8,21 @@ import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import { useTrackPageview } from '../../../../../observability/public'; +import { useLogsBreadcrumbs } from '../../../hooks/use_logs_breadcrumbs'; import { StreamPageContent } from './page_content'; import { StreamPageHeader } from './page_header'; import { LogsPageProviders } from './page_providers'; +import { streamTitle } from '../../../translations'; export const StreamPage = () => { useTrackPageview({ app: 'infra_logs', path: 'stream' }); useTrackPageview({ app: 'infra_logs', path: 'stream', delay: 15000 }); + + useLogsBreadcrumbs([ + { + text: streamTitle, + }, + ]); return ( diff --git a/x-pack/plugins/infra/public/pages/metrics/index.tsx b/x-pack/plugins/infra/public/pages/metrics/index.tsx index e52d1e90d7efd2..045fcb57ae9436 100644 --- a/x-pack/plugins/infra/public/pages/metrics/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/index.tsx @@ -15,7 +15,7 @@ import { IIndexPattern } from 'src/plugins/data/common'; import { MetricsSourceConfigurationProperties } from '../../../common/metrics_sources'; import { DocumentTitle } from '../../components/document_title'; import { HelpCenterContent } from '../../components/help_center_content'; -import { Header } from '../../components/header'; +import { useReadOnlyBadge } from '../../hooks/use_readonly_badge'; import { MetricsExplorerOptionsContainer, DEFAULT_METRICS_EXPLORER_VIEW_STATE, @@ -56,6 +56,8 @@ export const InfrastructurePage = ({ match }: RouteComponentProps) => { const kibana = useKibana(); + useReadOnlyBadge(!uiCapabilities?.infrastructure?.save); + const settingsLinkProps = useLinkProps({ app: 'metrics', pathname: 'settings', @@ -111,17 +113,6 @@ export const InfrastructurePage = ({ match }: RouteComponentProps) => { )} - -
{ const uiCapabilities = useKibana().services.application?.capabilities; @@ -52,6 +49,12 @@ export const SnapshotPage = () => { hash: '/tutorial_directory/metrics', }); + useMetricsBreadcrumbs([ + { + text: inventoryTitle, + }, + ]); + return ( { - const uiCapabilities = useKibana().services.application?.capabilities; const nodeId = match.params.node; const nodeType = match.params.type as InventoryItemType; const inventoryModel = findInventoryModel(nodeType); @@ -70,20 +69,20 @@ export const MetricDetail = withMetricPageProviders( [sideNav] ); - const metricsLinkProps = useLinkProps({ + const inventoryLinkProps = useLinkProps({ app: 'metrics', - pathname: '/', + pathname: '/inventory', }); - const breadcrumbs = [ + useMetricsBreadcrumbs([ { - ...metricsLinkProps, - text: i18n.translate('xpack.infra.header.infrastructureTitle', { - defaultMessage: 'Metrics', - }), + ...inventoryLinkProps, + text: inventoryTitle, }, - { text: name }, - ]; + { + text: name, + }, + ]); if (metadataLoading && !filteredRequiredMetrics.length) { return ( @@ -101,7 +100,6 @@ export const MetricDetail = withMetricPageProviders( return ( <> -
{ const { loading, @@ -66,6 +65,12 @@ export const MetricsExplorerPage = ({ source, derivedIndexPattern }: MetricsExpl /* eslint-disable-next-line react-hooks/exhaustive-deps */ }, [loadData, shouldLoadDefault]); + useMetricsBreadcrumbs([ + { + text: metricsExplorerTitle, + }, + ]); + return ( { + useMetricsBreadcrumbs([ + { + text: settingsTitle, + }, + ]); + const { createSourceConfiguration, source, diff --git a/x-pack/plugins/infra/public/translations.ts b/x-pack/plugins/infra/public/translations.ts new file mode 100644 index 00000000000000..4a9b19fde6ef29 --- /dev/null +++ b/x-pack/plugins/infra/public/translations.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const observabilityTitle = i18n.translate('xpack.infra.header.observabilityTitle', { + defaultMessage: 'Observability', +}); + +export const logsTitle = i18n.translate('xpack.infra.header.logsTitle', { + defaultMessage: 'Logs', +}); + +export const streamTitle = i18n.translate('xpack.infra.logs.index.streamTabTitle', { + defaultMessage: 'Stream', +}); + +export const anomaliesTitle = i18n.translate('xpack.infra.logs.index.anomaliesTabTitle', { + defaultMessage: 'Anomalies', +}); + +export const logCategoriesTitle = i18n.translate( + 'xpack.infra.logs.index.logCategoriesBetaBadgeTitle', + { + defaultMessage: 'Categories', + } +); + +export const settingsTitle = i18n.translate('xpack.infra.logs.index.settingsTabTitle', { + defaultMessage: 'Settings', +}); + +export const metricsTitle = i18n.translate('xpack.infra.header.infrastructureTitle', { + defaultMessage: 'Metrics', +}); + +export const inventoryTitle = i18n.translate('xpack.infra.metrics.inventoryPageTitle', { + defaultMessage: 'Inventory', +}); + +export const metricsExplorerTitle = i18n.translate('xpack.infra.metrics.metricsExplorerTitle', { + defaultMessage: 'Metrics Explorer', +}); From b352976b3bac1bb3e5f59514281624b8d7d940eb Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 1 Jul 2021 13:30:00 +0300 Subject: [PATCH 05/43] [Canvas] Expression reveal image. (#101987) * expression_reveal_image skeleton. * expression_functions added. * expression_renderers added. * Backup of daily work. * Fixed errors. * Added legacy support. Added button for legacy. * Added storybook. * Removed revealImage from canvas. * setState while rendering error fixed. * tsconfig.json added. * jest.config.js added. * Demo doc added. * Types fixed. * added limits. * Removed not used imports. * i18n namespaces fixed. * Fixed test suite error. * Some errors fixed. * Fixed eslint error. * Removed more unused translations. * Moved UI and elements, related to expressionRevealImage from canvas. * Fixed unused translations errors. * Moved type of element to types. * Fixed types and added service for representing elements, ui and supported renderers to canvas. * Added expression registration to canvas. * Fixed * Fixed mutiple call of the function. * Removed support of a legacy lib for revealImage chart. * Removed legacy presentation_utils plugin import. * Doc error fixed. * Removed useless translations and tried to fix error. * One more fix. * Small imports fix. * Fixed translations. * Made fixes based on nits. * Removed useless params. * fix. * Fixed errors, related to jest and __mocks__. * Removed useless type definition. * Replaced RendererHandlers with IInterpreterRendererHandlers. * fixed supported_shareable. * Moved elements back to canvas. * Moved views to canvas, removed expression service and imported renderer to canvas. * Fixed translations. * Types fix. * Moved libs to presentation utils. * Fixed one mistake. * removed dataurl lib. * Fixed jest files. * elasticLogo removed. * Removed elastic_outline. * removed httpurl. * Removed missing_asset. * removed url. * replaced mostly all tests. * Fixed types. * Fixed types and removed function_wrapper.ts * Fixed types of test helpers. * Changed limits of presentationUtil plugin. * Fixed imports. * One more fix. * Fixed huge size of bundle. * Reduced allow limit for presentationUtil * Updated limits for presentationUtil. * Fixed public API. * fixed type errors. * Moved css to component. * Fixed spaces at element. * Changed order of requiredPlugins. * Updated limits. * Removed unused plugin. * Added rule for allowing import from __stories__ directory. * removed useless comment. * Changed readme.md * Fixed docs error. * A possible of smoke test. * onResize changed to useResizeObserver. * Remove useless events and `useEffect` block. * Changed from passing handlers to separate functions. * `function` moved to `server`. * Fixed eslint error. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .eslintrc.js | 1 + .i18nrc.json | 1 + docs/developer/plugin-list.asciidoc | 4 + packages/kbn-optimizer/limits.yml | 3 +- src/dev/storybook/aliases.ts | 1 + .../expression_reveal_image/.i18nrc.json | 7 + .../.storybook/main.js | 10 ++ src/plugins/expression_reveal_image/README.md | 9 + .../common/constants.ts | 9 + .../common/expression_functions/index.ts | 13 ++ .../expression_functions/reveal_image.test.ts | 168 ++++++++++++++++++ .../reveal_image_function.ts | 41 +---- .../common/i18n/constants.ts | 10 ++ .../dict/reveal_image.ts | 39 ++-- .../expression_functions/function_errors.ts | 13 ++ .../expression_functions/function_help.ts | 21 +++ .../common/i18n/expression_functions/index.ts | 10 ++ .../i18n/expression_renderers/dict/index.ts | 9 + .../expression_renderers/dict/reveal_image.ts | 19 ++ .../common/i18n/expression_renderers/index.ts | 9 + .../expression_renderers/renderer_strings.ts | 21 +++ .../common/i18n/index.ts | 10 ++ .../expression_reveal_image/common/index.ts | 10 ++ .../common/types/expression_functions.ts | 42 +++++ .../common/types/expression_renderers.ts | 21 +++ .../common/types/index.ts | 9 + .../expression_reveal_image/jest.config.js | 13 ++ .../expression_reveal_image/kibana.json | 10 ++ .../public/components/index.ts | 9 + .../public/components}/reveal_image.scss | 0 .../components/reveal_image_component.tsx | 136 ++++++++++++++ .../reveal_image.stories.storyshot | 0 .../reveal_image_renderer.stories.tsx | 26 +++ .../public/expression_renderers/index.ts | 13 ++ .../reveal_image_renderer.tsx | 42 +++++ .../expression_reveal_image/public/index.ts | 17 ++ .../expression_reveal_image/public/plugin.ts | 39 ++++ .../expression_reveal_image/server/index.ts | 15 ++ .../expression_reveal_image/server/plugin.ts | 39 ++++ .../expression_reveal_image/tsconfig.json | 21 +++ .../presentation_util/common/lib/index.ts | 10 ++ .../lib/test_helpers/function_wrapper.ts | 27 +++ .../common/lib/test_helpers/index.ts | 9 + .../common/lib/utils}/dataurl.test.ts | 5 +- .../common/lib/utils}/dataurl.ts | 5 +- .../common/lib/utils}/elastic_logo.ts | 5 +- .../common/lib/utils/elastic_outline.ts | 10 ++ .../common/lib/utils}/httpurl.test.ts | 5 +- .../common/lib/utils}/httpurl.ts | 5 +- .../common/lib/utils/index.ts | 15 ++ .../common/lib/utils/missing_asset.ts | 11 ++ .../common/lib/utils/resolve_dataurl.test.ts | 7 +- .../common/lib/utils}/resolve_dataurl.ts | 9 +- .../common/lib/utils}/url.test.ts | 7 +- .../presentation_util/common/lib/utils/url.ts | 14 ++ src/plugins/presentation_util/jest.config.js | 13 ++ src/plugins/presentation_util/kibana.json | 3 + .../public/__stories__/index.tsx | 9 + .../public/__stories__/render.tsx | 61 +++++++ src/plugins/presentation_util/public/index.ts | 1 + src/plugins/presentation_util/tsconfig.json | 3 + .../public/finder/saved_object_finder.tsx | 4 +- .../saved_object/helpers/apply_es_resp.ts | 10 +- .../saved_object/helpers/create_source.ts | 4 +- .../helpers/initialize_saved_object.ts | 6 +- .../helpers/serialize_saved_object.ts | 4 +- .../functions/browser/markdown.test.js | 2 +- .../common/__fixtures__/test_styles.js | 2 +- .../functions/common/all.test.js | 2 +- .../functions/common/alterColumn.test.js | 2 +- .../functions/common/any.test.js | 3 +- .../functions/common/as.test.js | 2 +- .../functions/common/axis_config.test.js | 2 +- .../functions/common/case.test.js | 2 +- .../functions/common/clear.test.js | 3 +- .../functions/common/columns.test.js | 2 +- .../functions/common/compare.test.js | 2 +- .../functions/common/containerStyle.ts | 2 +- .../functions/common/container_style.test.js | 6 +- .../functions/common/context.test.js | 2 +- .../functions/common/csv.test.ts | 82 ++++++--- .../functions/common/date.test.js | 2 +- .../functions/common/do.test.js | 2 +- .../functions/common/dropdown_control.test.ts | 76 +++++--- .../functions/common/eq.test.js | 2 +- .../functions/common/exactly.test.js | 2 +- .../functions/common/filterrows.test.js | 2 +- .../functions/common/formatdate.test.js | 2 +- .../functions/common/formatnumber.test.js | 2 +- .../functions/common/getCell.test.js | 2 +- .../functions/common/gt.test.js | 2 +- .../functions/common/gte.test.js | 2 +- .../functions/common/head.test.js | 2 +- .../functions/common/if.test.js | 2 +- .../functions/common/image.test.js | 8 +- .../functions/common/image.ts | 7 +- .../functions/common/index.ts | 2 - .../functions/common/join_rows.test.js | 2 +- .../functions/common/lt.test.js | 2 +- .../functions/common/lte.test.js | 2 +- .../functions/common/metric.test.js | 2 +- .../functions/common/neq.test.js | 2 +- .../functions/common/ply.test.js | 2 +- .../functions/common/progress.test.js | 2 +- .../functions/common/render.test.js | 2 +- .../functions/common/render.ts | 1 - .../functions/common/repeat_image.test.js | 8 +- .../functions/common/repeat_image.ts | 6 +- .../functions/common/replace.test.js | 2 +- .../functions/common/reveal_image.test.js | 88 --------- .../functions/common/rounddate.test.js | 2 +- .../functions/common/rowCount.test.js | 2 +- .../functions/common/series_style.test.js | 2 +- .../functions/common/sort.test.js | 2 +- .../functions/common/staticColumn.test.js | 2 +- .../functions/common/string.test.js | 2 +- .../functions/common/switch.test.js | 2 +- .../functions/common/table.test.js | 2 +- .../functions/common/tail.test.js | 2 +- .../functions/common/timefilter.test.js | 2 +- .../common/timefilter_control.test.js | 2 +- .../canvas_plugin_src/lib/elastic_logo.ts | 2 - .../canvas_plugin_src/lib/elastic_outline.ts | 2 - .../renderers/__stories__/image.stories.tsx | 2 +- .../__stories__/repeat_image.stories.tsx | 6 +- .../canvas_plugin_src/renderers/core.ts | 2 - .../renderers/external.ts} | 8 +- .../canvas_plugin_src/renderers/image.tsx | 3 +- .../canvas_plugin_src/renderers/index.ts | 14 +- .../renderers/repeat_image.ts | 6 +- .../__stories__/reveal_image.stories.tsx | 25 --- .../renderers/reveal_image/index.ts | 88 --------- .../uis/arguments/image_upload/index.js | 10 +- .../canvas_plugin_src/uis/views/image.js | 6 +- .../uis/views/revealImage.js | 1 - x-pack/plugins/canvas/common/lib/index.ts | 5 - .../canvas/common/lib/missing_asset.ts | 3 - .../canvas/i18n/functions/function_errors.ts | 2 - .../canvas/i18n/functions/function_help.ts | 2 - x-pack/plugins/canvas/i18n/renderers.ts | 10 -- x-pack/plugins/canvas/kibana.json | 1 + .../components/asset_manager/asset_manager.ts | 2 +- .../custom_element_modal.stories.tsx | 2 +- .../custom_element_modal.tsx | 2 +- .../public/components/download/download.tsx | 2 +- .../__stories__/element_card.stories.tsx | 2 +- .../generate_function_reference.ts | 3 +- .../__stories__/fixtures/test_elements.tsx | 2 +- .../__stories__/element_menu.stories.tsx | 11 -- .../canvas/public/functions/pie.test.js | 2 +- .../canvas/public/functions/plot.test.js | 2 +- .../canvas/public/lib/elastic_outline.js | 2 - x-pack/plugins/canvas/public/style/index.scss | 3 - .../shareable_runtime/supported_renderers.js | 2 +- .../canvas/test_helpers/function_wrapper.js | 19 -- x-pack/plugins/canvas/tsconfig.json | 1 + x-pack/plugins/canvas/types/renderers.ts | 10 +- .../translations/translations/ja-JP.json | 14 +- .../translations/translations/zh-CN.json | 16 +- 159 files changed, 1311 insertions(+), 512 deletions(-) create mode 100755 src/plugins/expression_reveal_image/.i18nrc.json create mode 100644 src/plugins/expression_reveal_image/.storybook/main.js create mode 100755 src/plugins/expression_reveal_image/README.md create mode 100644 src/plugins/expression_reveal_image/common/constants.ts create mode 100644 src/plugins/expression_reveal_image/common/expression_functions/index.ts create mode 100644 src/plugins/expression_reveal_image/common/expression_functions/reveal_image.test.ts rename x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts => src/plugins/expression_reveal_image/common/expression_functions/reveal_image_function.ts (59%) create mode 100644 src/plugins/expression_reveal_image/common/i18n/constants.ts rename {x-pack/plugins/canvas/i18n/functions => src/plugins/expression_reveal_image/common/i18n/expression_functions}/dict/reveal_image.ts (52%) create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_functions/function_errors.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_functions/function_help.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_functions/index.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/index.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/reveal_image.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_renderers/index.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/expression_renderers/renderer_strings.ts create mode 100644 src/plugins/expression_reveal_image/common/i18n/index.ts create mode 100755 src/plugins/expression_reveal_image/common/index.ts create mode 100644 src/plugins/expression_reveal_image/common/types/expression_functions.ts create mode 100644 src/plugins/expression_reveal_image/common/types/expression_renderers.ts create mode 100644 src/plugins/expression_reveal_image/common/types/index.ts create mode 100644 src/plugins/expression_reveal_image/jest.config.js create mode 100755 src/plugins/expression_reveal_image/kibana.json create mode 100644 src/plugins/expression_reveal_image/public/components/index.ts rename {x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image => src/plugins/expression_reveal_image/public/components}/reveal_image.scss (100%) create mode 100644 src/plugins/expression_reveal_image/public/components/reveal_image_component.tsx rename {x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image => src/plugins/expression_reveal_image/public/expression_renderers}/__stories__/__snapshots__/reveal_image.stories.storyshot (100%) create mode 100644 src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx create mode 100644 src/plugins/expression_reveal_image/public/expression_renderers/index.ts create mode 100644 src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx create mode 100755 src/plugins/expression_reveal_image/public/index.ts create mode 100755 src/plugins/expression_reveal_image/public/plugin.ts create mode 100644 src/plugins/expression_reveal_image/server/index.ts create mode 100644 src/plugins/expression_reveal_image/server/plugin.ts create mode 100644 src/plugins/expression_reveal_image/tsconfig.json create mode 100644 src/plugins/presentation_util/common/lib/index.ts create mode 100644 src/plugins/presentation_util/common/lib/test_helpers/function_wrapper.ts create mode 100644 src/plugins/presentation_util/common/lib/test_helpers/index.ts rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/dataurl.test.ts (94%) rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/dataurl.ts (90%) rename {x-pack/plugins/canvas/public/lib => src/plugins/presentation_util/common/lib/utils}/elastic_logo.ts (96%) create mode 100644 src/plugins/presentation_util/common/lib/utils/elastic_outline.ts rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/httpurl.test.ts (89%) rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/httpurl.ts (67%) create mode 100644 src/plugins/presentation_util/common/lib/utils/index.ts create mode 100644 src/plugins/presentation_util/common/lib/utils/missing_asset.ts rename x-pack/plugins/canvas/common/lib/resolve_dataurl.test.js => src/plugins/presentation_util/common/lib/utils/resolve_dataurl.test.ts (84%) rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/resolve_dataurl.ts (75%) rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/common/lib/utils}/url.test.ts (70%) create mode 100644 src/plugins/presentation_util/common/lib/utils/url.ts create mode 100644 src/plugins/presentation_util/jest.config.js create mode 100644 src/plugins/presentation_util/public/__stories__/index.tsx create mode 100644 src/plugins/presentation_util/public/__stories__/render.tsx delete mode 100644 x-pack/plugins/canvas/canvas_plugin_src/functions/common/reveal_image.test.js delete mode 100644 x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts delete mode 100644 x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts rename x-pack/plugins/canvas/{common/lib/url.ts => canvas_plugin_src/renderers/external.ts} (54%) delete mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/reveal_image.stories.tsx delete mode 100644 x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts delete mode 100644 x-pack/plugins/canvas/common/lib/missing_asset.ts delete mode 100644 x-pack/plugins/canvas/public/lib/elastic_outline.js delete mode 100644 x-pack/plugins/canvas/test_helpers/function_wrapper.js diff --git a/.eslintrc.js b/.eslintrc.js index 2eea41984b30e8..09de32a91bca3c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -445,6 +445,7 @@ module.exports = { '(src|x-pack)/plugins/**/(public|server)/**/*', '!(src|x-pack)/plugins/**/(public|server)/mocks/index.{js,mjs,ts}', '!(src|x-pack)/plugins/**/(public|server)/(index|mocks).{js,mjs,ts,tsx}', + '!(src|x-pack)/plugins/**/__stories__/index.{js,mjs,ts,tsx}', ], allowSameFolder: true, errorMessage: 'Plugins may only import from top-level public and server modules.', diff --git a/.i18nrc.json b/.i18nrc.json index 0926f737227315..390e5e917d08e7 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -16,6 +16,7 @@ "esUi": "src/plugins/es_ui_shared", "devTools": "src/plugins/dev_tools", "expressions": "src/plugins/expressions", + "expressionRevealImage": "src/plugins/expression_reveal_image", "inputControl": "src/plugins/input_control_vis", "inspector": "src/plugins/inspector", "inspectorViews": "src/legacy/core_plugins/inspector_views", diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 231e089950a28e..b4be27eee5ed2d 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -72,6 +72,10 @@ This API doesn't support angular, for registering angular dev tools, bootstrap a |This plugin contains reusable code in the form of self-contained modules (or libraries). Each of these modules exports a set of functionality relevant to the domain of the module. +|{kib-repo}blob/{branch}/src/plugins/expression_reveal_image/README.md[expressionRevealImage] +|Expression Reveal Image plugin adds a revealImage function to the expression plugin and an associated renderer. The renderer will display the given percentage of a given image. + + |<> |Expression pipeline is a chain of functions that *pipe* its output to the input of the next function. Functions can be configured using arguments provided diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index c6960621359c78..6627b644daec76 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -99,7 +99,7 @@ pageLoadAssetSize: watcher: 43598 runtimeFields: 41752 stackAlerts: 29684 - presentationUtil: 49767 + presentationUtil: 94301 spacesOss: 18817 indexPatternFieldEditor: 90489 osquery: 107090 @@ -110,4 +110,5 @@ pageLoadAssetSize: timelines: 230410 screenshotMode: 17856 visTypePie: 35583 + expressionRevealImage: 25675 cases: 144442 diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index e0f0432c614636..6fc0841551fad8 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -17,6 +17,7 @@ export const storybookAliases = { dashboard_enhanced: 'x-pack/plugins/dashboard_enhanced/.storybook', data_enhanced: 'x-pack/plugins/data_enhanced/.storybook', embeddable: 'src/plugins/embeddable/.storybook', + expression_reveal_image: 'src/plugins/expression_reveal_image/.storybook', infra: 'x-pack/plugins/infra/.storybook', security_solution: 'x-pack/plugins/security_solution/.storybook', ui_actions_enhanced: 'x-pack/plugins/ui_actions_enhanced/.storybook', diff --git a/src/plugins/expression_reveal_image/.i18nrc.json b/src/plugins/expression_reveal_image/.i18nrc.json new file mode 100755 index 00000000000000..5b073e4374519c --- /dev/null +++ b/src/plugins/expression_reveal_image/.i18nrc.json @@ -0,0 +1,7 @@ +{ + "prefix": "expressionRevealImage", + "paths": { + "expressionRevealImage": "." + }, + "translations": ["translations/ja-JP.json"] +} diff --git a/src/plugins/expression_reveal_image/.storybook/main.js b/src/plugins/expression_reveal_image/.storybook/main.js new file mode 100644 index 00000000000000..742239e638b8ac --- /dev/null +++ b/src/plugins/expression_reveal_image/.storybook/main.js @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// eslint-disable-next-line import/no-commonjs +module.exports = require('@kbn/storybook').defaultConfig; diff --git a/src/plugins/expression_reveal_image/README.md b/src/plugins/expression_reveal_image/README.md new file mode 100755 index 00000000000000..21c27a6eee05b5 --- /dev/null +++ b/src/plugins/expression_reveal_image/README.md @@ -0,0 +1,9 @@ +# expressionRevealImage + +Expression Reveal Image plugin adds a `revealImage` function to the expression plugin and an associated renderer. The renderer will display the given percentage of a given image. + +--- + +## Development + +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/src/plugins/expression_reveal_image/common/constants.ts b/src/plugins/expression_reveal_image/common/constants.ts new file mode 100644 index 00000000000000..68ac53171ee7f1 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +export const PLUGIN_ID = 'expressionRevealImage'; +export const PLUGIN_NAME = 'expressionRevealImage'; diff --git a/src/plugins/expression_reveal_image/common/expression_functions/index.ts b/src/plugins/expression_reveal_image/common/expression_functions/index.ts new file mode 100644 index 00000000000000..dba24e8a0cb0ac --- /dev/null +++ b/src/plugins/expression_reveal_image/common/expression_functions/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { revealImageFunction } from './reveal_image_function'; + +export const functions = [revealImageFunction]; + +export { revealImageFunction }; diff --git a/src/plugins/expression_reveal_image/common/expression_functions/reveal_image.test.ts b/src/plugins/expression_reveal_image/common/expression_functions/reveal_image.test.ts new file mode 100644 index 00000000000000..633a132fea5e37 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/expression_functions/reveal_image.test.ts @@ -0,0 +1,168 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + functionWrapper, + elasticOutline, + elasticLogo, +} from '../../../presentation_util/common/lib'; +import { getFunctionErrors } from '../i18n'; +import { revealImageFunction } from './reveal_image_function'; +import { Origin } from '../types'; +import { ExecutionContext } from 'src/plugins/expressions'; + +const errors = getFunctionErrors().revealImage; + +describe('revealImageFunction', () => { + const fn = functionWrapper(revealImageFunction); + + it('returns a render as revealImage', () => { + const result = fn( + 0.5, + { + image: null, + emptyImage: null, + origin: Origin.BOTTOM, + }, + {} as ExecutionContext + ); + expect(result).toHaveProperty('type', 'render'); + expect(result).toHaveProperty('as', 'revealImage'); + }); + + describe('context', () => { + it('throws when context is not a number between 0 and 1', () => { + expect(() => { + fn( + 10, + { + image: elasticLogo, + emptyImage: elasticOutline, + origin: Origin.TOP, + }, + {} as ExecutionContext + ); + }).toThrow(new RegExp(errors.invalidPercent(10).message)); + + expect(() => { + fn( + -0.1, + { + image: elasticLogo, + emptyImage: elasticOutline, + origin: Origin.TOP, + }, + {} as ExecutionContext + ); + }).toThrow(new RegExp(errors.invalidPercent(-0.1).message)); + }); + }); + + describe('args', () => { + describe('image', () => { + it('sets the image', () => { + const result = fn( + 0.89, + { + emptyImage: null, + origin: Origin.TOP, + image: elasticLogo, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('image', elasticLogo); + }); + + it('defaults to the Elastic outline logo', () => { + const result = fn( + 0.89, + { + emptyImage: null, + origin: Origin.TOP, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('image', elasticOutline); + }); + }); + + describe('emptyImage', () => { + it('sets the background image', () => { + const result = fn( + 0, + { + emptyImage: elasticLogo, + origin: Origin.TOP, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('emptyImage', elasticLogo); + }); + + it('sets emptyImage to null', () => { + const result = fn( + 0, + { + emptyImage: null, + origin: Origin.TOP, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('emptyImage', null); + }); + }); + + describe('origin', () => { + it('sets which side to start the reveal from', () => { + let result = fn( + 1, + { + emptyImage: null, + origin: Origin.TOP, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('origin', 'top'); + result = fn( + 1, + { + emptyImage: null, + origin: Origin.LEFT, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('origin', 'left'); + result = fn( + 1, + { + emptyImage: null, + origin: Origin.BOTTOM, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('origin', 'bottom'); + result = fn( + 1, + { + emptyImage: null, + origin: Origin.RIGHT, + image: null, + }, + {} as ExecutionContext + ).value; + expect(result).toHaveProperty('origin', 'right'); + }); + }); + }); +}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts b/src/plugins/expression_reveal_image/common/expression_functions/reveal_image_function.ts similarity index 59% rename from x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts rename to src/plugins/expression_reveal_image/common/expression_functions/reveal_image_function.ts index 91d70609ab7088..33e61e85f95315 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/revealImage.ts +++ b/src/plugins/expression_reveal_image/common/expression_functions/reveal_image_function.ts @@ -1,41 +1,16 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { ExpressionFunctionDefinition, ExpressionValueRender } from 'src/plugins/expressions'; -import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -import { elasticOutline } from '../../lib/elastic_outline'; -import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; +import { resolveWithMissingImage, elasticOutline } from '../../../presentation_util/common/lib'; +import { getFunctionHelp, getFunctionErrors } from '../i18n'; +import { ExpressionRevealImageFunction, Origin } from '../types'; -export enum Origin { - TOP = 'top', - LEFT = 'left', - BOTTOM = 'bottom', - RIGHT = 'right', -} - -interface Arguments { - image: string | null; - emptyImage: string | null; - origin: Origin; -} - -export interface Output { - image: string; - emptyImage: string; - origin: Origin; - percent: number; -} - -export function revealImage(): ExpressionFunctionDefinition< - 'revealImage', - number, - Arguments, - ExpressionValueRender -> { +export const revealImageFunction: ExpressionRevealImageFunction = () => { const { help, args: argHelp } = getFunctionHelp().revealImage; const errors = getFunctionErrors().revealImage; @@ -80,4 +55,4 @@ export function revealImage(): ExpressionFunctionDefinition< }; }, }; -} +}; diff --git a/src/plugins/expression_reveal_image/common/i18n/constants.ts b/src/plugins/expression_reveal_image/common/i18n/constants.ts new file mode 100644 index 00000000000000..413f376515a335 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const BASE64 = '`base64`'; +export const URL = 'URL'; diff --git a/x-pack/plugins/canvas/i18n/functions/dict/reveal_image.ts b/src/plugins/expression_reveal_image/common/i18n/expression_functions/dict/reveal_image.ts similarity index 52% rename from x-pack/plugins/canvas/i18n/functions/dict/reveal_image.ts rename to src/plugins/expression_reveal_image/common/i18n/expression_functions/dict/reveal_image.ts index 374334824d61ab..ccf9967bd6a65c 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/reveal_image.ts +++ b/src/plugins/expression_reveal_image/common/i18n/expression_functions/dict/reveal_image.ts @@ -1,23 +1,21 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { i18n } from '@kbn/i18n'; -import { revealImage } from '../../../canvas_plugin_src/functions/common/revealImage'; -import { FunctionHelp } from '../function_help'; -import { FunctionFactory } from '../../../types'; import { Position } from '../../../types'; import { BASE64, URL } from '../../constants'; -export const help: FunctionHelp> = { - help: i18n.translate('xpack.canvas.functions.revealImageHelpText', { +export const help = { + help: i18n.translate('expressionRevealImage.functions.revealImageHelpText', { defaultMessage: 'Configures an image reveal element.', }), args: { - image: i18n.translate('xpack.canvas.functions.revealImage.args.imageHelpText', { + image: i18n.translate('expressionRevealImage.functions.revealImage.args.imageHelpText', { defaultMessage: 'The image to reveal. Provide an image asset as a {BASE64} data {URL}, ' + 'or pass in a sub-expression.', @@ -26,16 +24,19 @@ export const help: FunctionHelp> = { URL, }, }), - emptyImage: i18n.translate('xpack.canvas.functions.revealImage.args.emptyImageHelpText', { - defaultMessage: - 'An optional background image to reveal over. ' + - 'Provide an image asset as a `{BASE64}` data {URL}, or pass in a sub-expression.', - values: { - BASE64, - URL, - }, - }), - origin: i18n.translate('xpack.canvas.functions.revealImage.args.originHelpText', { + emptyImage: i18n.translate( + 'expressionRevealImage.functions.revealImage.args.emptyImageHelpText', + { + defaultMessage: + 'An optional background image to reveal over. ' + + 'Provide an image asset as a `{BASE64}` data {URL}, or pass in a sub-expression.', + values: { + BASE64, + URL, + }, + } + ), + origin: i18n.translate('expressionRevealImage.functions.revealImage.args.originHelpText', { defaultMessage: 'The position to start the image fill. For example, {list}, or {end}.', values: { list: Object.values(Position) @@ -50,7 +51,7 @@ export const help: FunctionHelp> = { export const errors = { invalidPercent: (percent: number) => new Error( - i18n.translate('xpack.canvas.functions.revealImage.invalidPercentErrorMessage', { + i18n.translate('expressionRevealImage.functions.revealImage.invalidPercentErrorMessage', { defaultMessage: "Invalid value: '{percent}'. Percentage must be between 0 and 1", values: { percent, diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_errors.ts b/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_errors.ts new file mode 100644 index 00000000000000..09cd26c9e620b9 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_errors.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { errors as revealImage } from './dict/reveal_image'; + +export const getFunctionErrors = () => ({ + revealImage, +}); diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_help.ts b/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_help.ts new file mode 100644 index 00000000000000..30e79b120771b7 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_functions/function_help.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { help as revealImage } from './dict/reveal_image'; + +/** + * Help text for Canvas Functions should be properly localized. This function will + * return a dictionary of help strings, organized by `ExpressionFunctionDefinition` + * specification and then by available arguments within each `ExpressionFunctionDefinition`. + * + * This a function, rather than an object, to future-proof string initialization, + * if ever necessary. + */ +export const getFunctionHelp = () => ({ + revealImage, +}); diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_functions/index.ts b/src/plugins/expression_reveal_image/common/i18n/expression_functions/index.ts new file mode 100644 index 00000000000000..3d36b123421f48 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_functions/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './function_help'; +export * from './function_errors'; diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/index.ts b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/index.ts new file mode 100644 index 00000000000000..4f70f9d30b74bb --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { strings as revealImage } from './reveal_image'; diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/reveal_image.ts b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/reveal_image.ts new file mode 100644 index 00000000000000..a32fdbd4c0b50f --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/dict/reveal_image.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { i18n } from '@kbn/i18n'; + +export const strings = { + getDisplayName: () => + i18n.translate('expressionRevealImage.renderer.revealImage.displayName', { + defaultMessage: 'Image reveal', + }), + getHelpDescription: () => + i18n.translate('expressionRevealImage.renderer.revealImage.helpDescription', { + defaultMessage: 'Reveal a percentage of an image to make a custom gauge-style chart', + }), +}; diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_renderers/index.ts b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/index.ts new file mode 100644 index 00000000000000..7e637f240d15c9 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './renderer_strings'; diff --git a/src/plugins/expression_reveal_image/common/i18n/expression_renderers/renderer_strings.ts b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/renderer_strings.ts new file mode 100644 index 00000000000000..b74230a2a5d76e --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/expression_renderers/renderer_strings.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { revealImage } from './dict'; + +/** + * Help text for Canvas Functions should be properly localized. This function will + * return a dictionary of help strings, organized by `ExpressionFunctionDefinition` + * specification and then by available arguments within each `ExpressionFunctionDefinition`. + * + * This a function, rather than an object, to future-proof string initialization, + * if ever necessary. + */ +export const getRendererStrings = () => ({ + revealImage, +}); diff --git a/src/plugins/expression_reveal_image/common/i18n/index.ts b/src/plugins/expression_reveal_image/common/i18n/index.ts new file mode 100644 index 00000000000000..9c50bfab1305d3 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/i18n/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './expression_functions'; +export * from './expression_renderers'; diff --git a/src/plugins/expression_reveal_image/common/index.ts b/src/plugins/expression_reveal_image/common/index.ts new file mode 100755 index 00000000000000..95503b36acdb62 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './constants'; +export * from './expression_functions'; diff --git a/src/plugins/expression_reveal_image/common/types/expression_functions.ts b/src/plugins/expression_reveal_image/common/types/expression_functions.ts new file mode 100644 index 00000000000000..ee291e204acfb8 --- /dev/null +++ b/src/plugins/expression_reveal_image/common/types/expression_functions.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { ExpressionFunctionDefinition, ExpressionValueRender } from 'src/plugins/expressions'; + +export enum Origin { + TOP = 'top', + LEFT = 'left', + BOTTOM = 'bottom', + RIGHT = 'right', +} + +interface Arguments { + image: string | null; + emptyImage: string | null; + origin: Origin; +} + +export interface Output { + image: string; + emptyImage: string; + origin: Origin; + percent: number; +} + +export type ExpressionRevealImageFunction = () => ExpressionFunctionDefinition< + 'revealImage', + number, + Arguments, + ExpressionValueRender +>; + +export enum Position { + TOP = 'top', + BOTTOM = 'bottom', + LEFT = 'left', + RIGHT = 'right', +} diff --git a/src/plugins/expression_reveal_image/common/types/expression_renderers.ts b/src/plugins/expression_reveal_image/common/types/expression_renderers.ts new file mode 100644 index 00000000000000..77dacaefc1bd1f --- /dev/null +++ b/src/plugins/expression_reveal_image/common/types/expression_renderers.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export type OriginString = 'bottom' | 'left' | 'top' | 'right'; + +export interface RevealImageRendererConfig { + percent: number; + origin?: OriginString; + image?: string; + emptyImage?: string; +} + +export interface NodeDimensions { + width: number; + height: number; +} diff --git a/src/plugins/expression_reveal_image/common/types/index.ts b/src/plugins/expression_reveal_image/common/types/index.ts new file mode 100644 index 00000000000000..ec934e7affe88b --- /dev/null +++ b/src/plugins/expression_reveal_image/common/types/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +export * from './expression_functions'; +export * from './expression_renderers'; diff --git a/src/plugins/expression_reveal_image/jest.config.js b/src/plugins/expression_reveal_image/jest.config.js new file mode 100644 index 00000000000000..aac5fad293846b --- /dev/null +++ b/src/plugins/expression_reveal_image/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/src/plugins/expression_reveal_image'], +}; diff --git a/src/plugins/expression_reveal_image/kibana.json b/src/plugins/expression_reveal_image/kibana.json new file mode 100755 index 00000000000000..9af9a5857dcfb9 --- /dev/null +++ b/src/plugins/expression_reveal_image/kibana.json @@ -0,0 +1,10 @@ +{ + "id": "expressionRevealImage", + "version": "1.0.0", + "kibanaVersion": "kibana", + "server": true, + "ui": true, + "requiredPlugins": ["expressions", "presentationUtil"], + "optionalPlugins": [], + "requiredBundles": [] +} diff --git a/src/plugins/expression_reveal_image/public/components/index.ts b/src/plugins/expression_reveal_image/public/components/index.ts new file mode 100644 index 00000000000000..23cb4d7a20cb8e --- /dev/null +++ b/src/plugins/expression_reveal_image/public/components/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './reveal_image_component'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/reveal_image.scss b/src/plugins/expression_reveal_image/public/components/reveal_image.scss similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/reveal_image.scss rename to src/plugins/expression_reveal_image/public/components/reveal_image.scss diff --git a/src/plugins/expression_reveal_image/public/components/reveal_image_component.tsx b/src/plugins/expression_reveal_image/public/components/reveal_image_component.tsx new file mode 100644 index 00000000000000..a9c24fca78d9b6 --- /dev/null +++ b/src/plugins/expression_reveal_image/public/components/reveal_image_component.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useRef, useState, useEffect, useCallback } from 'react'; +import { useResizeObserver } from '@elastic/eui'; +import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { NodeDimensions, RevealImageRendererConfig, OriginString } from '../../common/types'; +import { isValidUrl, elasticOutline } from '../../../presentation_util/public'; +import './reveal_image.scss'; + +interface RevealImageComponentProps extends RevealImageRendererConfig { + onLoaded: IInterpreterRenderHandlers['done']; + parentNode: HTMLElement; +} + +interface ImageStyles { + width?: string; + height?: string; + clipPath?: string; +} + +interface AlignerStyles { + backgroundImage?: string; +} + +function RevealImageComponent({ + onLoaded, + parentNode, + percent, + origin, + image, + emptyImage, +}: RevealImageComponentProps) { + const [loaded, setLoaded] = useState(false); + const [dimensions, setDimensions] = useState({ + width: 1, + height: 1, + }); + + const imgRef = useRef(null); + + const parentNodeDimensions = useResizeObserver(parentNode); + + // modify the top-level container class + parentNode.className = 'revealImage'; + + // set up the overlay image + const updateImageView = useCallback(() => { + if (imgRef.current) { + setDimensions({ + height: imgRef.current.naturalHeight, + width: imgRef.current.naturalWidth, + }); + + setLoaded(true); + onLoaded(); + } + }, [imgRef, onLoaded]); + + useEffect(() => { + updateImageView(); + }, [parentNodeDimensions, updateImageView]); + + function getClipPath(percentParam: number, originParam: OriginString = 'bottom') { + const directions: Record = { bottom: 0, left: 1, top: 2, right: 3 }; + const values: Array = [0, 0, 0, 0]; + values[directions[originParam]] = `${100 - percentParam * 100}%`; + return `inset(${values.join(' ')})`; + } + + function getImageSizeStyle() { + const imgStyles: ImageStyles = {}; + + const imgDimensions = { + height: dimensions.height, + width: dimensions.width, + ratio: dimensions.height / dimensions.width, + }; + + const domNodeDimensions = { + width: parentNode.clientWidth, + height: parentNode.clientHeight, + ratio: parentNode.clientHeight / parentNode.clientWidth, + }; + + if (imgDimensions.ratio > domNodeDimensions.ratio) { + imgStyles.height = `${domNodeDimensions.height}px`; + imgStyles.width = 'initial'; + } else { + imgStyles.width = `${domNodeDimensions.width}px`; + imgStyles.height = 'initial'; + } + + return imgStyles; + } + + const imgSrc = isValidUrl(image ?? '') ? image : elasticOutline; + + const alignerStyles: AlignerStyles = {}; + + if (isValidUrl(emptyImage ?? '')) { + // only use empty image if one is provided + alignerStyles.backgroundImage = `url(${emptyImage})`; + } + + let imgStyles: ImageStyles = {}; + if (imgRef.current && loaded) imgStyles = getImageSizeStyle(); + + imgStyles.clipPath = getClipPath(percent, origin); + if (imgRef.current && loaded) { + imgRef.current.style.setProperty('-webkit-clip-path', getClipPath(percent, origin)); + } + + return ( +
+ +
+ ); +} + +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { RevealImageComponent as default }; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/__snapshots__/reveal_image.stories.storyshot b/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/__snapshots__/reveal_image.stories.storyshot similarity index 100% rename from x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/__snapshots__/reveal_image.stories.storyshot rename to src/plugins/expression_reveal_image/public/expression_renderers/__stories__/__snapshots__/reveal_image.stories.storyshot diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx b/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx new file mode 100644 index 00000000000000..bc70b3685e24e1 --- /dev/null +++ b/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { storiesOf } from '@storybook/react'; +import { revealImageRenderer } from '../'; +import { elasticOutline, elasticLogo } from '../../../../presentation_util/public'; +import { Render } from '../../../../presentation_util/public/__stories__'; + +import { Origin } from '../../../common/types/expression_functions'; + +storiesOf('renderers/revealImage', module).add('default', () => { + const config = { + image: elasticLogo, + emptyImage: elasticOutline, + origin: Origin.LEFT, + percent: 0.45, + }; + + return ; +}); diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/index.ts b/src/plugins/expression_reveal_image/public/expression_renderers/index.ts new file mode 100644 index 00000000000000..433a81884f157e --- /dev/null +++ b/src/plugins/expression_reveal_image/public/expression_renderers/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { revealImageRenderer } from './reveal_image_renderer'; + +export const renderers = [revealImageRenderer]; + +export { revealImageRenderer }; diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx b/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx new file mode 100644 index 00000000000000..4d84de3da994ca --- /dev/null +++ b/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import React, { lazy } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { I18nProvider } from '@kbn/i18n/react'; +import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { withSuspense } from '../../../presentation_util/public'; +import { getRendererStrings } from '../../common/i18n'; +import { RevealImageRendererConfig } from '../../common/types'; + +const { revealImage: revealImageStrings } = getRendererStrings(); + +const LazyRevealImageComponent = lazy(() => import('../components/reveal_image_component')); +const RevealImageComponent = withSuspense(LazyRevealImageComponent, null); + +export const revealImageRenderer = (): ExpressionRenderDefinition => ({ + name: 'revealImage', + displayName: revealImageStrings.getDisplayName(), + help: revealImageStrings.getHelpDescription(), + reuseDomNode: true, + render: async ( + domNode: HTMLElement, + config: RevealImageRendererConfig, + handlers: IInterpreterRenderHandlers + ) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); + + render( + + + , + domNode + ); + }, +}); diff --git a/src/plugins/expression_reveal_image/public/index.ts b/src/plugins/expression_reveal_image/public/index.ts new file mode 100755 index 00000000000000..00cb14e0fc064c --- /dev/null +++ b/src/plugins/expression_reveal_image/public/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ExpressionRevealImagePlugin } from './plugin'; + +export type { ExpressionRevealImagePluginSetup, ExpressionRevealImagePluginStart } from './plugin'; + +export function plugin() { + return new ExpressionRevealImagePlugin(); +} + +export * from './expression_renderers'; diff --git a/src/plugins/expression_reveal_image/public/plugin.ts b/src/plugins/expression_reveal_image/public/plugin.ts new file mode 100755 index 00000000000000..5f6496a25f820a --- /dev/null +++ b/src/plugins/expression_reveal_image/public/plugin.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; +import { ExpressionsStart, ExpressionsSetup } from '../../expressions/public'; +import { revealImageRenderer } from './expression_renderers'; + +interface SetupDeps { + expressions: ExpressionsSetup; +} + +interface StartDeps { + expression: ExpressionsStart; +} + +export type ExpressionRevealImagePluginSetup = void; +export type ExpressionRevealImagePluginStart = void; + +export class ExpressionRevealImagePlugin + implements + Plugin< + ExpressionRevealImagePluginSetup, + ExpressionRevealImagePluginStart, + SetupDeps, + StartDeps + > { + public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRevealImagePluginSetup { + expressions.registerRenderer(revealImageRenderer); + } + + public start(core: CoreStart): ExpressionRevealImagePluginStart {} + + public stop() {} +} diff --git a/src/plugins/expression_reveal_image/server/index.ts b/src/plugins/expression_reveal_image/server/index.ts new file mode 100644 index 00000000000000..b86c356974321d --- /dev/null +++ b/src/plugins/expression_reveal_image/server/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { ExpressionRevealImagePlugin } from './plugin'; + +export type { ExpressionRevealImagePluginSetup, ExpressionRevealImagePluginStart } from './plugin'; + +export function plugin() { + return new ExpressionRevealImagePlugin(); +} diff --git a/src/plugins/expression_reveal_image/server/plugin.ts b/src/plugins/expression_reveal_image/server/plugin.ts new file mode 100644 index 00000000000000..446ef018eb7d3e --- /dev/null +++ b/src/plugins/expression_reveal_image/server/plugin.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; +import { ExpressionsServerStart, ExpressionsServerSetup } from '../../expressions/server'; +import { revealImageFunction } from '../common'; + +interface SetupDeps { + expressions: ExpressionsServerSetup; +} + +interface StartDeps { + expression: ExpressionsServerStart; +} + +export type ExpressionRevealImagePluginSetup = void; +export type ExpressionRevealImagePluginStart = void; + +export class ExpressionRevealImagePlugin + implements + Plugin< + ExpressionRevealImagePluginSetup, + ExpressionRevealImagePluginStart, + SetupDeps, + StartDeps + > { + public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRevealImagePluginSetup { + expressions.registerFunction(revealImageFunction); + } + + public start(core: CoreStart): ExpressionRevealImagePluginStart {} + + public stop() {} +} diff --git a/src/plugins/expression_reveal_image/tsconfig.json b/src/plugins/expression_reveal_image/tsconfig.json new file mode 100644 index 00000000000000..aa4562ec735765 --- /dev/null +++ b/src/plugins/expression_reveal_image/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "outDir": "./target/types", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "isolatedModules": true + }, + "include": [ + "common/**/*", + "public/**/*", + "server/**/*", + ], + "references": [ + { "path": "../../core/tsconfig.json" }, + { "path": "../presentation_util/tsconfig.json" }, + { "path": "../expressions/tsconfig.json" }, + ] +} diff --git a/src/plugins/presentation_util/common/lib/index.ts b/src/plugins/presentation_util/common/lib/index.ts new file mode 100644 index 00000000000000..3fe90009ad8dff --- /dev/null +++ b/src/plugins/presentation_util/common/lib/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './utils'; +export * from './test_helpers'; diff --git a/src/plugins/presentation_util/common/lib/test_helpers/function_wrapper.ts b/src/plugins/presentation_util/common/lib/test_helpers/function_wrapper.ts new file mode 100644 index 00000000000000..4ec02fd622cf74 --- /dev/null +++ b/src/plugins/presentation_util/common/lib/test_helpers/function_wrapper.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { mapValues } from 'lodash'; +import { + ExpressionValueBoxed, + typeSpecs, + ExpressionFunctionDefinition, +} from '../../../../expressions/common'; + +type FnType = () => typeof typeSpecs[number] & + ExpressionFunctionDefinition, ExpressionValueBoxed>; + +// It takes a function spec and passes in default args into the spec fn +export const functionWrapper = (fnSpec: FnType): ReturnType['fn'] => { + const spec = fnSpec(); + const defaultArgs = mapValues(spec.args, (argSpec) => { + return argSpec.default; + }); + + return (context, args, handlers) => spec.fn(context, { ...defaultArgs, ...args }, handlers); +}; diff --git a/src/plugins/presentation_util/common/lib/test_helpers/index.ts b/src/plugins/presentation_util/common/lib/test_helpers/index.ts new file mode 100644 index 00000000000000..a6ea8da6ac6e91 --- /dev/null +++ b/src/plugins/presentation_util/common/lib/test_helpers/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './function_wrapper'; diff --git a/x-pack/plugins/canvas/common/lib/dataurl.test.ts b/src/plugins/presentation_util/common/lib/utils/dataurl.test.ts similarity index 94% rename from x-pack/plugins/canvas/common/lib/dataurl.test.ts rename to src/plugins/presentation_util/common/lib/utils/dataurl.test.ts index 9ddd0a50ea9d5c..5820b10f589fe0 100644 --- a/x-pack/plugins/canvas/common/lib/dataurl.test.ts +++ b/src/plugins/presentation_util/common/lib/utils/dataurl.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { isValidDataUrl, parseDataUrl } from './dataurl'; diff --git a/x-pack/plugins/canvas/common/lib/dataurl.ts b/src/plugins/presentation_util/common/lib/utils/dataurl.ts similarity index 90% rename from x-pack/plugins/canvas/common/lib/dataurl.ts rename to src/plugins/presentation_util/common/lib/utils/dataurl.ts index 2ae28b621c425f..9ac232369cdc1f 100644 --- a/x-pack/plugins/canvas/common/lib/dataurl.ts +++ b/src/plugins/presentation_util/common/lib/utils/dataurl.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { fromByteArray } from 'base64-js'; diff --git a/x-pack/plugins/canvas/public/lib/elastic_logo.ts b/src/plugins/presentation_util/common/lib/utils/elastic_logo.ts similarity index 96% rename from x-pack/plugins/canvas/public/lib/elastic_logo.ts rename to src/plugins/presentation_util/common/lib/utils/elastic_logo.ts index 81c79c39143d6e..9a789d1a5fb03e 100644 --- a/x-pack/plugins/canvas/public/lib/elastic_logo.ts +++ b/src/plugins/presentation_util/common/lib/utils/elastic_logo.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ export const elasticLogo = diff --git a/src/plugins/presentation_util/common/lib/utils/elastic_outline.ts b/src/plugins/presentation_util/common/lib/utils/elastic_outline.ts new file mode 100644 index 00000000000000..4747be58127f75 --- /dev/null +++ b/src/plugins/presentation_util/common/lib/utils/elastic_outline.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export const elasticOutline = + 'data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20viewBox%3D%22-3.948730230331421%20-1.7549896240234375%20245.25946044921875%20241.40370178222656%22%20width%3D%22245.25946044921875%22%20height%3D%22241.40370178222656%22%20style%3D%22enable-background%3Anew%200%200%20686.2%20235.7%3B%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%232D2D2D%3B%7D%0A%3C%2Fstyle%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cg%20transform%3D%22matrix%281%2C%200%2C%200%2C%201%2C%200%2C%200%29%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M329.4%2C160.3l4.7-0.5l0.3%2C9.6c-12.4%2C1.7-23%2C2.6-31.8%2C2.6c-11.7%2C0-20-3.4-24.9-10.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-4.9-6.8-7.3-17.4-7.3-31.7c0-28.6%2C11.4-42.9%2C34.1-42.9c11%2C0%2C19.2%2C3.1%2C24.6%2C9.2c5.4%2C6.1%2C8.1%2C15.8%2C8.1%2C28.9l-0.7%2C9.3h-53.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0%2C9%2C1.6%2C15.7%2C4.9%2C20c3.3%2C4.3%2C8.9%2C6.5%2C17%2C6.5C312.8%2C161.2%2C321.1%2C160.9%2C329.4%2C160.3z%20M325%2C124.9c0-10-1.6-17.1-4.8-21.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.2-4.1-8.4-6.2-15.6-6.2c-7.2%2C0-12.7%2C2.2-16.3%2C6.5c-3.6%2C4.3-5.5%2C11.3-5.6%2C20.9H325z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M354.3%2C171.4V64h12.2v107.4H354.3z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M443.5%2C113.5v41.1c0%2C4.1%2C10.1%2C3.9%2C10.1%2C3.9l-0.6%2C10.8c-8.6%2C0-15.7%2C0.7-20-3.4c-9.8%2C4.3-19.5%2C6.1-29.3%2C6.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.5%2C0-13.2-2.1-17.1-6.4c-3.9-4.2-5.9-10.3-5.9-18.3c0-7.9%2C2-13.8%2C6-17.5c4-3.7%2C10.3-6.1%2C18.9-6.9l25.6-2.4v-7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0-5.5-1.2-9.5-3.6-11.9c-2.4-2.4-5.7-3.6-9.8-3.6l-32.1%2C0V87.2h31.3c9.2%2C0%2C15.9%2C2.1%2C20.1%2C6.4C441.4%2C97.8%2C443.5%2C104.5%2C443.5%2C113.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bz%20M393.3%2C146.7c0%2C10%2C4.1%2C15%2C12.4%2C15c7.4%2C0%2C14.7-1.2%2C21.8-3.7l3.7-1.3v-26.9l-24.1%2C2.3c-4.9%2C0.4-8.4%2C1.8-10.6%2C4.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3BC394.4%2C138.7%2C393.3%2C142.2%2C393.3%2C146.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M491.2%2C98.2c-11.8%2C0-17.8%2C4.1-17.8%2C12.4c0%2C3.8%2C1.4%2C6.5%2C4.1%2C8.1c2.7%2C1.6%2C8.9%2C3.2%2C18.6%2C4.9%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc9.7%2C1.7%2C16.5%2C4%2C20.5%2C7.1c4%2C3%2C6%2C8.7%2C6%2C17.1c0%2C8.4-2.7%2C14.5-8.1%2C18.4c-5.4%2C3.9-13.2%2C5.9-23.6%2C5.9c-6.7%2C0-29.2-2.5-29.2-2.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bl0.7-10.6c12.9%2C1.2%2C22.3%2C2.2%2C28.6%2C2.2c6.3%2C0%2C11.1-1%2C14.4-3c3.3-2%2C5-5.4%2C5-10.1c0-4.7-1.4-7.9-4.2-9.6c-2.8-1.7-9-3.3-18.6-4.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-9.6-1.5-16.4-3.7-20.4-6.7c-4-2.9-6-8.4-6-16.3c0-7.9%2C2.8-13.8%2C8.4-17.6c5.6-3.8%2C12.6-5.7%2C20.9-5.7c6.6%2C0%2C29.6%2C1.7%2C29.6%2C1.7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bv10.7C508.1%2C99%2C498.2%2C98.2%2C491.2%2C98.2z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M581.7%2C99.5h-25.9v39c0%2C9.3%2C0.7%2C15.5%2C2%2C18.4c1.4%2C2.9%2C4.6%2C4.4%2C9.7%2C4.4l14.5-1l0.8%2C10.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.3%2C1.2-12.8%2C1.8-16.6%2C1.8c-8.5%2C0-14.3-2.1-17.6-6.2c-3.3-4.1-4.9-12-4.9-23.6V99.5h-11.6V88.9h11.6V63.9h12.1v24.9h25.9V99.5z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M598.7%2C78.4V64.3h12.2v14.2H598.7z%20M598.7%2C171.4V88.9h12.2v82.5H598.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M663.8%2C87.2c3.6%2C0%2C9.7%2C0.7%2C18.3%2C2l3.9%2C0.5l-0.5%2C9.9c-8.7-1-15.1-1.5-19.2-1.5c-9.2%2C0-15.5%2C2.2-18.8%2C6.6%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.3%2C4.4-5%2C12.6-5%2C24.5c0%2C11.9%2C1.5%2C20.2%2C4.6%2C24.9c3.1%2C4.7%2C9.5%2C7%2C19.3%2C7l19.2-1.5l0.5%2C10.1c-10.1%2C1.5-17.7%2C2.3-22.7%2C2.3%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-12.7%2C0-21.5-3.3-26.3-9.8c-4.8-6.5-7.3-17.5-7.3-33c0-15.5%2C2.6-26.4%2C7.8-32.6C643%2C90.4%2C651.7%2C87.2%2C663.8%2C87.2z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M236.6%2C123.5c0-19.8-12.3-37.2-30.8-43.9c0.8-4.2%2C1.2-8.4%2C1.2-12.7C207%2C30%2C177%2C0%2C140.2%2C0%26%2310%3B%26%239%3B%26%239%3BC118.6%2C0%2C98.6%2C10.3%2C86%2C27.7c-6.2-4.8-13.8-7.4-21.7-7.4c-19.6%2C0-35.5%2C15.9-35.5%2C35.5c0%2C4.3%2C0.8%2C8.5%2C2.2%2C12.4%26%2310%3B%26%239%3B%26%239%3BC12.6%2C74.8%2C0%2C92.5%2C0%2C112.2c0%2C19.9%2C12.4%2C37.3%2C30.9%2C44c-0.8%2C4.1-1.2%2C8.4-1.2%2C12.7c0%2C36.8%2C29.9%2C66.7%2C66.7%2C66.7%26%2310%3B%26%239%3B%26%239%3Bc21.6%2C0%2C41.6-10.4%2C54.1-27.8c6.2%2C4.9%2C13.8%2C7.6%2C21.7%2C7.6c19.6%2C0%2C35.5-15.9%2C35.5-35.5c0-4.3-0.8-8.5-2.2-12.4%26%2310%3B%26%239%3B%26%239%3BC223.9%2C160.9%2C236.6%2C143.2%2C236.6%2C123.5z%20M91.6%2C34.8c10.9-15.9%2C28.9-25.4%2C48.1-25.4c32.2%2C0%2C58.4%2C26.2%2C58.4%2C58.4%26%2310%3B%26%239%3B%26%239%3Bc0%2C3.9-0.4%2C7.7-1.1%2C11.5l-52.2%2C45.8L93%2C101.5L82.9%2C79.9L91.6%2C34.8z%20M65.4%2C29c6.2%2C0%2C12.1%2C2%2C17%2C5.7l-7.8%2C40.3l-35.5-8.4%26%2310%3B%26%239%3B%26%239%3Bc-1.1-3.1-1.7-6.3-1.7-9.7C37.4%2C41.6%2C49.9%2C29%2C65.4%2C29z%20M9.1%2C112.3c0-16.7%2C11-31.9%2C26.9-37.2L75%2C84.4l9.1%2C19.5l-49.8%2C45%26%2310%3B%26%239%3B%26%239%3BC19.2%2C143.1%2C9.1%2C128.6%2C9.1%2C112.3z%20M145.2%2C200.9c-10.9%2C16.1-29%2C25.6-48.4%2C25.6c-32.3%2C0-58.6-26.3-58.6-58.5c0-4%2C0.4-7.9%2C1.1-11.7%26%2310%3B%26%239%3B%26%239%3Bl50.9-46l52%2C23.7l11.5%2C22L145.2%2C200.9z%20M171.2%2C206.6c-6.1%2C0-12-2-16.9-5.8l7.7-40.2l35.4%2C8.3c1.1%2C3.1%2C1.7%2C6.3%2C1.7%2C9.7%26%2310%3B%26%239%3B%26%239%3BC199.2%2C194.1%2C186.6%2C206.6%2C171.2%2C206.6z%20M200.5%2C160.5l-39-9.1l-10.4-19.8l51-44.7c15.1%2C5.7%2C25.2%2C20.2%2C25.2%2C36.5%26%2310%3B%26%239%3B%26%239%3BC227.4%2C140.1%2C216.4%2C155.3%2C200.5%2C160.5z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E'; diff --git a/x-pack/plugins/canvas/common/lib/httpurl.test.ts b/src/plugins/presentation_util/common/lib/utils/httpurl.test.ts similarity index 89% rename from x-pack/plugins/canvas/common/lib/httpurl.test.ts rename to src/plugins/presentation_util/common/lib/utils/httpurl.test.ts index 1cd00114bf7ca0..20cd40480691d8 100644 --- a/x-pack/plugins/canvas/common/lib/httpurl.test.ts +++ b/src/plugins/presentation_util/common/lib/utils/httpurl.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { isValidHttpUrl } from './httpurl'; diff --git a/x-pack/plugins/canvas/common/lib/httpurl.ts b/src/plugins/presentation_util/common/lib/utils/httpurl.ts similarity index 67% rename from x-pack/plugins/canvas/common/lib/httpurl.ts rename to src/plugins/presentation_util/common/lib/utils/httpurl.ts index 4f8b03aa2a0622..4777eb4c8128d5 100644 --- a/x-pack/plugins/canvas/common/lib/httpurl.ts +++ b/src/plugins/presentation_util/common/lib/utils/httpurl.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ // A cheap regex to distinguish an HTTP URL string from a data URL string diff --git a/src/plugins/presentation_util/common/lib/utils/index.ts b/src/plugins/presentation_util/common/lib/utils/index.ts new file mode 100644 index 00000000000000..eed4acf78b2bef --- /dev/null +++ b/src/plugins/presentation_util/common/lib/utils/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './dataurl'; +export * from './elastic_logo'; +export * from './elastic_outline'; +export * from './httpurl'; +export * from './missing_asset'; +export * from './resolve_dataurl'; +export * from './url'; diff --git a/src/plugins/presentation_util/common/lib/utils/missing_asset.ts b/src/plugins/presentation_util/common/lib/utils/missing_asset.ts new file mode 100644 index 00000000000000..10d429870c88c1 --- /dev/null +++ b/src/plugins/presentation_util/common/lib/utils/missing_asset.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// CC0, source: https://pixabay.com/en/question-mark-confirmation-question-838656/ +export const missingImage = + 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMSAzMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48ZmlsdGVyIGlkPSJiIiB4PSItLjM2IiB5PSItLjM2IiB3aWR0aD0iMS43MiIgaGVpZ2h0PSIxLjcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuNDY0Ii8+PC9maWx0ZXI+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTU5LjM0IiB4Mj0iMTg0LjQ4IiB5MT0iNzI3LjM2IiB5Mj0iNzQ5Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuNTMgLTU0OS42OCkgc2NhbGUoLjc3MDAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlYmYwZWQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmYWZhZmEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Ik0xNS40MzcgMi42OTVsMTQuNTA2IDI0LjQ3NkgxLjI4N2wxNC4xNS0yNC40NzZ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2U9InJlZCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIi8+PHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjgzMTk3IDAgMCAuNTU0NjYgLTc4LjU4MyAtMzgzLjUxKSIgZD0iTTExMS4zMSA3MzEuMmMtMy4yODMtMy45MjUtMy41OTUtNi4xNDgtMi4wMjQtMTAuNDM4IDMuMzM2LTYuMTQ1IDQuNDk2LTguMDY4IDUuNDEtOS40MDUgMS45MDEgNS4xNjIgMi4xMjYgMTkuMTQtMy4zODYgMTkuODQzeiIgZmlsbD0iI2ZmZiIgZmlsbC1vcGFjaXR5PSIuODc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNiKSIvPjxnIGZpbGwtb3BhY2l0eT0iLjgyIj48cGF0aCBkPSJNMTUuMDQ2IDIwLjIyN2gtLjQxNWMtLjAxMy0uNzQ4LjAyLTEuMzA4LjEwMS0xLjY3OC4wODgtLjM3MS4zMDctLjg4LjY1OC0xLjUyOC4zNTctLjY1NC41OS0xLjE3Ni42OTctMS41NjcuMTE1LS4zOTguMTcyLS44ODcuMTcyLTEuNDY3IDAtLjg5Ni0uMTc1LTEuNTU3LS41MjYtMS45ODItLjM1LS40MjUtLjc2NS0uNjM3LTEuMjQ0LS42MzctLjM2NCAwLS42Ny4wOTgtLjkyLjI5My0uMTg5LjE0OS0uMjgzLjMwNC0uMjgzLjQ2NiAwIC4xMDcuMDY0LjI3Ni4xOTIuNTA1LjI5LjUyLjQzNS45NjEuNDM1IDEuMzI1IDAgLjMzLS4xMTUuNjA3LS4zNDQuODNhMS4xMzggMS4xMzggMCAwIDEtLjg0LjMzM2MtLjM3NyAwLS42OTQtLjEzMS0uOTUtLjM5NC0uMjU2LS4yNy0uMzg0LS42MjQtLjM4NC0xLjA2MiAwLS43OTYuMzQ0LTEuNDk0IDEuMDMxLTIuMDk0LjY4OC0uNiAxLjY0OS0uOSAyLjg4My0uOSAxLjMwOCAwIDIuMzAyLjMxNCAyLjk4My45NC42ODguNjIxIDEuMDMyIDEuMzczIDEuMDMyIDIuMjU2IDAgLjY0LS4xNzYgMS4yMzQtLjUyNiAxLjc4LS4zNTEuNTQtMS4wMjkgMS4xNC0yLjAzMyAxLjgtLjY3NC40NDUtMS4xMi44NDMtMS4zMzUgMS4xOTQtLjIxLjM0My0uMzM3Ljg3My0uMzg0IDEuNTg3bS0uMTEyIDEuNDc3Yy40NTIgMCAuODM2LjE1OCAxLjE1My40NzUuMzE3LjMxNy40NzYuNzAxLjQ3NiAxLjE1MyAwIC40NTItLjE1OS44NC0uNDc2IDEuMTYzYTEuNTcgMS41NyAwIDAgMS0xLjE1My40NzUgMS41NyAxLjU3IDAgMCAxLTEuMTUzLS40NzUgMS42MDQgMS42MDQgMCAwIDEtLjQ3NS0xLjE2M2MwLS40NTIuMTU5LS44MzYuNDc1LTEuMTUzYTEuNTcgMS41NyAwIDAgMSAxLjE1My0uNDc1IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii40ODYiLz48cGF0aCBkPSJNMTUuMzI3IDIwLjUwOGgtLjQxNWMtLjAxMy0uNzQ4LjAyLTEuMzA4LjEwMS0xLjY3OC4wODgtLjM3MS4zMDctLjg4LjY1OC0xLjUyOC4zNTctLjY1NC41OS0xLjE3Ni42OTctMS41NjcuMTE1LS4zOTguMTcyLS44ODcuMTcyLTEuNDY2IDAtLjg5Ny0uMTc1LTEuNTU4LS41MjYtMS45ODMtLjM1LS40MjQtLjc2NS0uNjM3LTEuMjQzLS42MzctLjM2NSAwLS42NzEuMDk4LS45Mi4yOTMtLjE5LjE0OS0uMjg0LjMwNC0uMjg0LjQ2NiAwIC4xMDguMDY0LjI3Ni4xOTIuNTA1LjI5LjUyLjQzNS45NjEuNDM1IDEuMzI1IDAgLjMzLS4xMTUuNjA3LS4zNDQuODNhMS4xMzggMS4xMzggMCAwIDEtLjg0LjMzM2MtLjM3NyAwLS42OTQtLjEzMS0uOTUtLjM5NC0uMjU2LS4yNy0uMzg0LS42MjQtLjM4NC0xLjA2MiAwLS43OTYuMzQ0LTEuNDkzIDEuMDMxLTIuMDk0LjY4OC0uNiAxLjY0OS0uOSAyLjg4My0uOSAxLjMwOCAwIDIuMzAyLjMxNCAyLjk4My45NC42ODguNjIxIDEuMDMyIDEuMzczIDEuMDMyIDIuMjU2IDAgLjY0LS4xNzYgMS4yMzQtLjUyNiAxLjc4LS4zNS41NC0xLjAyOCAxLjE0LTIuMDMzIDEuOC0uNjc0LjQ0NS0uODUzLjg0My0xLjA2OCAxLjE5NC0uMjEuMzQzLS4zMzcuODczLS4zODUgMS41ODdtLS4zNzggMS40NzdjLjQ1MiAwIC44MzYuMTU4IDEuMTUzLjQ3NS4zMTcuMzE3LjQ3Ni43MDEuNDc2IDEuMTUzIDAgLjQ1Mi0uMTU5Ljg0LS40NzYgMS4xNjNhMS41NyAxLjU3IDAgMCAxLTEuMTUzLjQ3NiAxLjU3IDEuNTcgMCAwIDEtMS4xNTMtLjQ3NiAxLjYwNCAxLjYwNCAwIDAgMS0uNDc1LTEuMTYzYzAtLjQ1Mi4xNTktLjgzNi40NzUtMS4xNTNhMS41NyAxLjU3IDAgMCAxIDEuMTUzLS40NzUiIGZpbGwtb3BhY2l0eT0iLjgyIi8+PC9nPjwvc3ZnPg=='; diff --git a/x-pack/plugins/canvas/common/lib/resolve_dataurl.test.js b/src/plugins/presentation_util/common/lib/utils/resolve_dataurl.test.ts similarity index 84% rename from x-pack/plugins/canvas/common/lib/resolve_dataurl.test.js rename to src/plugins/presentation_util/common/lib/utils/resolve_dataurl.test.ts index 72aaa1dfbd5029..c2b9a444d20ef2 100644 --- a/x-pack/plugins/canvas/common/lib/resolve_dataurl.test.js +++ b/src/plugins/presentation_util/common/lib/utils/resolve_dataurl.test.ts @@ -1,11 +1,12 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { missingImage } from '../../common/lib/missing_asset'; +import { missingImage } from './missing_asset'; import { resolveFromArgs, resolveWithMissingImage } from './resolve_dataurl'; describe('resolve_dataurl', () => { diff --git a/x-pack/plugins/canvas/common/lib/resolve_dataurl.ts b/src/plugins/presentation_util/common/lib/utils/resolve_dataurl.ts similarity index 75% rename from x-pack/plugins/canvas/common/lib/resolve_dataurl.ts rename to src/plugins/presentation_util/common/lib/utils/resolve_dataurl.ts index 79e49c0595355f..db94bdf04c32bf 100644 --- a/x-pack/plugins/canvas/common/lib/resolve_dataurl.ts +++ b/src/plugins/presentation_util/common/lib/utils/resolve_dataurl.ts @@ -1,13 +1,14 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { get } from 'lodash'; -import { isValidUrl } from '../../common/lib/url'; -import { missingImage } from '../../common/lib/missing_asset'; +import { isValidUrl } from './url'; +import { missingImage } from './missing_asset'; /* * NOTE: args.dataurl can come as an expression here. diff --git a/x-pack/plugins/canvas/common/lib/url.test.ts b/src/plugins/presentation_util/common/lib/utils/url.test.ts similarity index 70% rename from x-pack/plugins/canvas/common/lib/url.test.ts rename to src/plugins/presentation_util/common/lib/utils/url.test.ts index 654602eea2093a..4599e776a62661 100644 --- a/x-pack/plugins/canvas/common/lib/url.test.ts +++ b/src/plugins/presentation_util/common/lib/utils/url.test.ts @@ -1,11 +1,12 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ -import { missingImage } from '../../common/lib/missing_asset'; +import { missingImage } from './missing_asset'; import { isValidUrl } from './url'; describe('resolve_dataurl', () => { diff --git a/src/plugins/presentation_util/common/lib/utils/url.ts b/src/plugins/presentation_util/common/lib/utils/url.ts new file mode 100644 index 00000000000000..e6a1064200cc15 --- /dev/null +++ b/src/plugins/presentation_util/common/lib/utils/url.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { isValidDataUrl } from './dataurl'; +import { isValidHttpUrl } from './httpurl'; + +export function isValidUrl(url: string) { + return isValidDataUrl(url) || isValidHttpUrl(url); +} diff --git a/src/plugins/presentation_util/jest.config.js b/src/plugins/presentation_util/jest.config.js new file mode 100644 index 00000000000000..2250d70acb4755 --- /dev/null +++ b/src/plugins/presentation_util/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/src/plugins/presentation_util'], +}; diff --git a/src/plugins/presentation_util/kibana.json b/src/plugins/presentation_util/kibana.json index c7d272dcd02a1c..22ec919457cce4 100644 --- a/src/plugins/presentation_util/kibana.json +++ b/src/plugins/presentation_util/kibana.json @@ -4,6 +4,9 @@ "kibanaVersion": "kibana", "server": true, "ui": true, + "extraPublicDirs": [ + "common/lib" + ], "requiredPlugins": [ "savedObjects" ], diff --git a/src/plugins/presentation_util/public/__stories__/index.tsx b/src/plugins/presentation_util/public/__stories__/index.tsx new file mode 100644 index 00000000000000..078a16cb8cab24 --- /dev/null +++ b/src/plugins/presentation_util/public/__stories__/index.tsx @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './render'; diff --git a/src/plugins/presentation_util/public/__stories__/render.tsx b/src/plugins/presentation_util/public/__stories__/render.tsx new file mode 100644 index 00000000000000..29d95e6bf28191 --- /dev/null +++ b/src/plugins/presentation_util/public/__stories__/render.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { action } from '@storybook/addon-actions'; +import React, { useRef, useEffect } from 'react'; +import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; + +export const defaultHandlers: IInterpreterRenderHandlers = { + getRenderMode: () => 'display', + isSyncColorsEnabled: () => false, + done: action('done'), + onDestroy: action('onDestroy'), + reload: action('reload'), + update: action('update'), + event: action('event'), +}; + +/* + Uses a RenderDefinitionFactory and Config to render into an element. + + Intended to be used for stories for RenderDefinitionFactory +*/ +interface RenderAdditionalProps { + height?: string; + width?: string; + handlers?: IInterpreterRenderHandlers; +} + +export const Render = ({ + renderer, + config, + ...rest +}: Renderer extends () => ExpressionRenderDefinition + ? { renderer: Renderer; config: Config } & RenderAdditionalProps + : { renderer: undefined; config: undefined } & RenderAdditionalProps) => { + const { height, width, handlers } = { + height: '200px', + width: '200px', + handlers: defaultHandlers, + ...rest, + }; + + const containerRef = useRef(null); + + useEffect(() => { + if (renderer && containerRef.current !== null) { + renderer().render(containerRef.current, config, handlers); + } + }, [renderer, config, handlers]); + + return ( +
+ {' '} +
+ ); +}; diff --git a/src/plugins/presentation_util/public/index.ts b/src/plugins/presentation_util/public/index.ts index 9f17133c5b35ab..1e26011ff58ae6 100644 --- a/src/plugins/presentation_util/public/index.ts +++ b/src/plugins/presentation_util/public/index.ts @@ -28,6 +28,7 @@ export { export { PresentationUtilPluginSetup, PresentationUtilPluginStart } from './types'; export { SaveModalDashboardProps } from './components/types'; export { projectIDs, ProjectID, Project } from '../common/labs'; +export * from '../common/lib'; export { LazyLabsBeakerButton, diff --git a/src/plugins/presentation_util/tsconfig.json b/src/plugins/presentation_util/tsconfig.json index c0fafe8c3aabad..b389d94b194136 100644 --- a/src/plugins/presentation_util/tsconfig.json +++ b/src/plugins/presentation_util/tsconfig.json @@ -7,6 +7,9 @@ "declaration": true, "declarationMap": true }, + "extraPublicDirs": [ + "common" + ], "include": [ "common/**/*", "public/**/*", diff --git a/src/plugins/saved_objects/public/finder/saved_object_finder.tsx b/src/plugins/saved_objects/public/finder/saved_object_finder.tsx index da65b5b9fdda8c..0a2e4ff78be26f 100644 --- a/src/plugins/saved_objects/public/finder/saved_object_finder.tsx +++ b/src/plugins/saved_objects/public/finder/saved_object_finder.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import _ from 'lodash'; +import { debounce } from 'lodash'; import PropTypes from 'prop-types'; import React from 'react'; @@ -116,7 +116,7 @@ class SavedObjectFinderUi extends React.Component< private isComponentMounted: boolean = false; - private debouncedFetch = _.debounce(async (query: string) => { + private debouncedFetch = debounce(async (query: string) => { const metaDataMap = this.getSavedObjectMetaDataMap(); const fields = Object.values(metaDataMap) diff --git a/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts b/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts index 1f2f7dc573dc74..40baff22f52c8f 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/apply_es_resp.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import _ from 'lodash'; +import { cloneDeep, defaults, forOwn, assign } from 'lodash'; import { EsResponse, SavedObject, SavedObjectConfig, SavedObjectKibanaServices } from '../../types'; import { SavedObjectNotFound } from '../../../../kibana_utils/public'; import { @@ -28,7 +28,7 @@ export async function applyESResp( ) { const mapping = expandShorthand(config.mapping ?? {}); const savedObjectType = config.type || ''; - savedObject._source = _.cloneDeep(resp._source); + savedObject._source = cloneDeep(resp._source); if (typeof resp.found === 'boolean' && !resp.found) { throw new SavedObjectNotFound(savedObjectType, savedObject.id || ''); } @@ -42,10 +42,10 @@ export async function applyESResp( } // assign the defaults to the response - _.defaults(savedObject._source, savedObject.defaults); + defaults(savedObject._source, savedObject.defaults); // transform the source using _deserializers - _.forOwn(mapping, (fieldMapping, fieldName) => { + forOwn(mapping, (fieldMapping, fieldName) => { if (fieldMapping._deserialize && typeof fieldName === 'string') { savedObject._source[fieldName] = fieldMapping._deserialize( savedObject._source[fieldName] as string @@ -54,7 +54,7 @@ export async function applyESResp( }); // Give obj all of the values in _source.fields - _.assign(savedObject, savedObject._source); + assign(savedObject, savedObject._source); savedObject.lastSavedTitle = savedObject.title; if (meta.searchSourceJSON) { diff --git a/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts b/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts index f1bc614dd11972..7ed729b4b7a0f6 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/create_source.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import _ from 'lodash'; +import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; import { SavedObjectAttributes } from 'kibana/public'; import { SavedObject, SavedObjectKibanaServices } from '../../types'; @@ -40,7 +40,7 @@ export async function createSource( return await savedObjectsClient.create(esType, source, options); } catch (err) { // record exists, confirm overwriting - if (_.get(err, 'res.status') === 409) { + if (get(err, 'res.status') === 409) { const confirmMessage = i18n.translate( 'savedObjects.confirmModal.overwriteConfirmationMessage', { diff --git a/src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts b/src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts index cf0cea8d368da9..b6dddf8d82b725 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/initialize_saved_object.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import _ from 'lodash'; +import { cloneDeep, assign } from 'lodash'; import { SavedObjectsClientContract } from 'kibana/public'; import { SavedObject, SavedObjectConfig } from '../../types'; @@ -24,7 +24,7 @@ export async function intializeSavedObject( if (!savedObject.id) { // just assign the defaults and be done - _.assign(savedObject, savedObject.defaults); + assign(savedObject, savedObject.defaults); await savedObject.hydrateIndexPattern!(); if (typeof config.afterESResp === 'function') { savedObject = await config.afterESResp(savedObject); @@ -36,7 +36,7 @@ export async function intializeSavedObject( const respMapped = { _id: resp.id, _type: resp.type, - _source: _.cloneDeep(resp.attributes), + _source: cloneDeep(resp.attributes), references: resp.references, found: !!resp._version, }; diff --git a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts index eb9bef788fcdc6..efe7a85f8f1e13 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import _ from 'lodash'; +import { forOwn } from 'lodash'; import { SavedObject, SavedObjectConfig } from '../../types'; import { extractSearchSourceReferences } from '../../../../data/public'; import { expandShorthand } from './field_mapping'; @@ -17,7 +17,7 @@ export function serializeSavedObject(savedObject: SavedObject, config: SavedObje const attributes = {} as Record; const references = []; - _.forOwn(mapping, (fieldMapping, fieldName) => { + forOwn(mapping, (fieldMapping, fieldName) => { if (typeof fieldName !== 'string') { return; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js index 0e7a1afb0dbb1c..dcb6035dbb687b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable } from '../common/__fixtures__/test_tables'; import { fontStyle } from '../common/__fixtures__/test_styles'; import { markdown } from './markdown'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js index d61fef7abced8d..fa831cacbcb18e 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js @@ -5,7 +5,7 @@ * 2.0. */ -import { elasticLogo } from '../../../lib/elastic_logo'; +import { elasticLogo } from '../../../../../../../src/plugins/presentation_util/common/lib'; export const fontStyle = { type: 'style', diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/all.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/all.test.js index c09c3ff99d89c3..7d983e02f1123b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/all.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/all.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { all } from './all'; describe('all', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/alterColumn.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/alterColumn.test.js index 7e018427dc4c7f..85e062f454bc5c 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/alterColumn.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/alterColumn.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { alterColumn } from './alterColumn'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/any.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/any.test.js index d95029fef8144e..b691595409c624 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/any.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/any.test.js @@ -4,8 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { any } from './any'; describe('any', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/as.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/as.test.js index e7c2d3047bb91b..fe297e00e7b353 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/as.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/as.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { asFn } from './as'; describe('as', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/axis_config.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/axis_config.test.js index 491558486eb441..1538ee8254ec3c 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/axis_config.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/axis_config.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { testTable } from './__fixtures__/test_tables'; import { axisConfig } from './axisConfig'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/case.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/case.test.js index adee8a56dea494..d5621943bccafc 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/case.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/case.test.js @@ -7,7 +7,7 @@ import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { caseFn } from './case'; describe('case', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/clear.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/clear.test.js index 43c24f10c04653..0834dc27d321bf 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/clear.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/clear.test.js @@ -4,8 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable } from './__fixtures__/test_tables'; import { clear } from './clear'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/columns.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/columns.test.js index d76c7a9174b81a..d7f28559ee0ef2 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/columns.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/columns.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { columns } from './columns'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/compare.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/compare.test.js index b0d80debf4ec34..c04f132a577fd8 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/compare.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/compare.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { compare } from './compare'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts index d30324e0e2bfeb..12aad5d609414b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts @@ -8,7 +8,7 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { ContainerStyle, Overflow, BackgroundRepeat, BackgroundSize } from '../../../types'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; -import { isValidUrl } from '../../../common/lib/url'; +import { isValidUrl } from '../../../../../../src/plugins/presentation_util/common/lib'; interface Output extends ContainerStyle { type: 'containerStyle'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js index b0a6ddf2caa74a..7a3599f47ec861 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js @@ -5,8 +5,10 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; -import { elasticLogo } from '../../lib/elastic_logo'; +import { + elasticLogo, + functionWrapper, +} from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { containerStyle } from './containerStyle'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/context.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/context.test.js index 7cefb41754fd42..e4c45f228aa174 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/context.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/context.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable, emptyTable } from './__fixtures__/test_tables'; import { context } from './context'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/csv.test.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/csv.test.ts index 93cf07a9dd5dd8..cfef618bee39d0 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/csv.test.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/csv.test.ts @@ -5,11 +5,11 @@ * 2.0. */ -// @ts-expect-error untyped lib -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { csv } from './csv'; -import { Datatable } from 'src/plugins/expressions'; +import { Datatable, ExecutionContext, SerializableState } from 'src/plugins/expressions'; +import { Adapters } from 'src/plugins/inspector'; const errors = getFunctionErrors().csv; @@ -30,43 +30,59 @@ describe('csv', () => { it('should return a datatable', () => { expect( - fn(null, { - data: `name,number + fn( + null, + { + data: `name,number one,1 two,2 fourty two,42`, - }) + }, + {} as ExecutionContext + ) ).toEqual(expected); }); it('should allow custom delimiter', () => { expect( - fn(null, { - data: `name\tnumber + fn( + null, + { + data: `name\tnumber one\t1 two\t2 fourty two\t42`, - delimiter: '\t', - }) + delimiter: '\t', + }, + {} as ExecutionContext + ) ).toEqual(expected); expect( - fn(null, { - data: `name%SPLIT%number + fn( + null, + { + data: `name%SPLIT%number one%SPLIT%1 two%SPLIT%2 fourty two%SPLIT%42`, - delimiter: '%SPLIT%', - }) + delimiter: '%SPLIT%', + }, + {} as ExecutionContext + ) ).toEqual(expected); }); it('should allow custom newline', () => { expect( - fn(null, { - data: `name,number\rone,1\rtwo,2\rfourty two,42`, - newline: '\r', - }) + fn( + null, + { + data: `name,number\rone,1\rtwo,2\rfourty two,42`, + newline: '\r', + }, + {} as ExecutionContext + ) ).toEqual(expected); }); @@ -83,10 +99,14 @@ fourty two%SPLIT%42`, }; expect( - fn(null, { - data: `foo," bar ", baz, " buz " + fn( + null, + { + data: `foo," bar ", baz, " buz " 1,2,3,4`, - }) + }, + {} as ExecutionContext + ) ).toEqual(expectedResult); }); @@ -106,22 +126,30 @@ fourty two%SPLIT%42`, }; expect( - fn(null, { - data: `foo," bar ", baz, " buz " + fn( + null, + { + data: `foo," bar ", baz, " buz " 1," best ",3, " ok" " good", bad, better , " worst " `, - }) + }, + {} as ExecutionContext + ) ).toEqual(expectedResult); }); it('throws when given invalid csv', () => { expect(() => { - fn(null, { - data: `name,number + fn( + null, + { + data: `name,number one|1 two.2 fourty two,42`, - }); + }, + {} as ExecutionContext + ); }).toThrow(new RegExp(errors.invalidInputCSV().message)); }); }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/date.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/date.test.js index 08c43caaf8b9e4..cd06ce5fbb463a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/date.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/date.test.js @@ -6,7 +6,7 @@ */ import sinon from 'sinon'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { date } from './date'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/do.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/do.test.js index f19318753611c9..00429779e2ff11 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/do.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/do.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { doFn } from './do'; describe('do', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/dropdown_control.test.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/dropdown_control.test.ts index d8f2e8518daf08..254efd9f5f0d9d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/dropdown_control.test.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/dropdown_control.test.ts @@ -5,23 +5,30 @@ * 2.0. */ -// @ts-expect-error untyped local -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable, relationalTable } from './__fixtures__/test_tables'; import { dropdownControl } from './dropdownControl'; +import { ExecutionContext, SerializableState } from 'src/plugins/expressions'; +import { Adapters } from 'src/plugins/inspector'; describe('dropdownControl', () => { const fn = functionWrapper(dropdownControl); it('returns a render as dropdown_filter', () => { - expect(fn(testTable, { filterColumn: 'name', valueColumn: 'name' })).toHaveProperty( - 'type', - 'render' - ); - expect(fn(testTable, { filterColumn: 'name', valueColumn: 'name' })).toHaveProperty( - 'as', - 'dropdown_filter' - ); + expect( + fn( + testTable, + { filterColumn: 'name', valueColumn: 'name' }, + {} as ExecutionContext + ) + ).toHaveProperty('type', 'render'); + expect( + fn( + testTable, + { filterColumn: 'name', valueColumn: 'name' }, + {} as ExecutionContext + ) + ).toHaveProperty('as', 'dropdown_filter'); }); describe('args', () => { @@ -32,12 +39,24 @@ describe('dropdownControl', () => { unique.find(([value, label]) => value === name) ? unique : [...unique, [name, name]], [] ); - expect(fn(testTable, { valueColumn: 'name' }).value.choices).toEqual(uniqueNames); + expect( + fn( + testTable, + { valueColumn: 'name' }, + {} as ExecutionContext + )?.value?.choices + ).toEqual(uniqueNames); }); it('returns an empty array when provided an invalid column', () => { - expect(fn(testTable, { valueColumn: 'foo' }).value.choices).toEqual([]); - expect(fn(testTable, { valueColumn: '' }).value.choices).toEqual([]); + expect( + fn(testTable, { valueColumn: 'foo' }, {} as ExecutionContext) + ?.value?.choices + ).toEqual([]); + expect( + fn(testTable, { valueColumn: '' }, {} as ExecutionContext) + ?.value?.choices + ).toEqual([]); }); }); @@ -45,7 +64,11 @@ describe('dropdownControl', () => { it('populates dropdown choices with labels from label column', () => { const expectedChoices = relationalTable.rows.map((row) => [row.id, row.name]); expect( - fn(relationalTable, { valueColumn: 'id', labelColumn: 'name' }).value.choices + fn( + relationalTable, + { valueColumn: 'id', labelColumn: 'name' }, + {} as ExecutionContext + )?.value?.choices ).toEqual(expectedChoices); }); }); @@ -53,19 +76,30 @@ describe('dropdownControl', () => { describe('filterColumn', () => { it('sets which column the filter is applied to', () => { - expect(fn(testTable, { filterColumn: 'name' }).value).toHaveProperty('column', 'name'); - expect(fn(testTable, { filterColumn: 'name', valueColumn: 'price' }).value).toHaveProperty( - 'column', - 'name' - ); + expect( + fn(testTable, { filterColumn: 'name' }, {} as ExecutionContext) + ?.value + ).toHaveProperty('column', 'name'); + expect( + fn( + testTable, + { filterColumn: 'name', valueColumn: 'price' }, + {} as ExecutionContext + )?.value + ).toHaveProperty('column', 'name'); }); it('defaults to valueColumn if not provided', () => { - expect(fn(testTable, { valueColumn: 'price' }).value).toHaveProperty('column', 'price'); + expect( + fn(testTable, { valueColumn: 'price' }, {} as ExecutionContext) + ?.value + ).toHaveProperty('column', 'price'); }); it('sets column to undefined if no args are provided', () => { - expect(fn(testTable).value).toHaveProperty('column', undefined); + expect( + fn(testTable, {}, {} as ExecutionContext)?.value + ).toHaveProperty('column', undefined); }); }); }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/eq.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/eq.test.js index 5f8d9e042125f8..5e710fc109396a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/eq.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/eq.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { eq } from './eq'; describe('eq', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/exactly.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/exactly.test.js index 10781a7af452da..9d3dcb6a991671 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/exactly.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/exactly.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { emptyFilter } from './__fixtures__/test_filters'; import { exactly } from './exactly'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/filterrows.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/filterrows.test.js index 8c328e3d8adf6e..edc2c1db18f640 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/filterrows.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/filterrows.test.js @@ -7,7 +7,7 @@ import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable } from './__fixtures__/test_tables'; import { filterrows } from './filterrows'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatdate.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatdate.test.js index 6fda32dfef51a2..e725dccc8ca34b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatdate.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatdate.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { formatdate } from './formatdate'; describe('formatdate', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatnumber.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatnumber.test.js index 37d3d2d905e675..e957bf115198fe 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatnumber.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/formatnumber.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { formatnumber } from './formatnumber'; describe('formatnumber', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/getCell.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/getCell.test.js index 2dda4d8f4258e3..a556c2ddeb48ae 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/getCell.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/getCell.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { getCell } from './getCell'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gt.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gt.test.js index 576d2a54dd59ba..53675fca2b3aee 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gt.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gt.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { gt } from './gt'; describe('gt', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gte.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gte.test.js index 174f617f47a8c5..aefb2ccf926aec 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gte.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/gte.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { gte } from './gte'; describe('gte', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/head.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/head.test.js index c25d0f7ae727fb..4721eaf6cb5309 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/head.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/head.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { head } from './head'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js index cab331807e44c8..df576a6a2507f6 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js @@ -7,7 +7,7 @@ import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { ifFn } from './if'; describe('if', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.test.js index cd0809d9b30a2e..45b26cd25937da 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.test.js @@ -6,14 +6,14 @@ */ import expect from '@kbn/expect'; -// import { functionWrapper } from '../../../test_helpers/function_wrapper'; -import { elasticLogo } from '../../lib/elastic_logo'; -import { elasticOutline } from '../../lib/elastic_outline'; +import { + elasticLogo, + elasticOutline, +} from '../../../../../../src/plugins/presentation_util/common/lib'; // import { image } from './image'; // TODO: the test was not running and is not up to date describe.skip('image', () => { - // const fn = functionWrapper(image); const fn = jest.fn(); it('returns an image object using a dataUrl', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts index b4d067280cb69f..c3e64e48b23fc8 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/image.ts @@ -7,9 +7,10 @@ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { getFunctionHelp, getFunctionErrors } from '../../../i18n'; - -import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -import { elasticLogo } from '../../lib/elastic_logo'; +import { + elasticLogo, + resolveWithMissingImage, +} from '../../../../../../src/plugins/presentation_util/common/lib'; export enum ImageMode { CONTAIN = 'contain', diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts index 5c4d1d55cff04e..9da646e6958612 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/index.ts @@ -43,7 +43,6 @@ import { replace } from './replace'; import { rounddate } from './rounddate'; import { rowCount } from './rowCount'; import { repeatImage } from './repeat_image'; -import { revealImage } from './revealImage'; import { seriesStyle } from './seriesStyle'; import { shape } from './shape'; import { sort } from './sort'; @@ -94,7 +93,6 @@ export const functions = [ render, repeatImage, replace, - revealImage, rounddate, rowCount, seriesStyle, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/join_rows.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/join_rows.test.js index 12b1002d1e3772..94fef857983bc3 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/join_rows.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/join_rows.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { testTable } from './__fixtures__/test_tables'; import { joinRows } from './join_rows'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lt.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lt.test.js index 8f16e446997eaa..1ecfca9fc2f945 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lt.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lt.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { lt } from './lt'; describe('lt', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lte.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lte.test.js index 954b30e8c3c92a..f32d2d23027c37 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lte.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/lte.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { lte } from './lte'; describe('lte', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/metric.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/metric.test.js index a99d4823e5930a..3f2d0ad2cb76e7 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/metric.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/metric.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { fontStyle } from './__fixtures__/test_styles'; import { metric } from './metric'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.test.js index 0a1980760cd092..88c7a5c18bc7ac 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { neq } from './neq'; describe('neq', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.test.js index 5bf100eb90f4ca..282cb2460d61cd 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.test.js @@ -7,7 +7,7 @@ import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { testTable } from './__fixtures__/test_tables'; import { ply } from './ply'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.test.js index f516cbbe5258f9..6438e2a4d19c0d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/progress.test.js @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { progress } from './progress'; import { fontStyle } from './__fixtures__/test_styles'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.test.js index 6a91f4c280692c..3248af55040939 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { DEFAULT_ELEMENT_CSS } from '../../../common/lib/constants'; import { testTable } from './__fixtures__/test_tables'; import { fontStyle, containerStyle } from './__fixtures__/test_styles'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.ts index cc7fc00a5df1f0..7a52833693cc60 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/render.ts @@ -49,7 +49,6 @@ export function render(): ExpressionFunctionDefinition< 'plot', 'progress', 'repeatImage', - 'revealImage', 'shape', 'table', 'time_filter', diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js index f95d3d0ec03d09..97f0552721ccfb 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.test.js @@ -5,9 +5,11 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; -import { elasticOutline } from '../../lib/elastic_outline'; -import { elasticLogo } from '../../lib/elastic_logo'; +import { + elasticLogo, + elasticOutline, + functionWrapper, +} from '../../../../../../src/plugins/presentation_util/common/lib'; import { repeatImage } from './repeat_image'; describe('repeatImage', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts index 6e62139e4da0d9..904b2478760abb 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/repeat_image.ts @@ -6,8 +6,10 @@ */ import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; -import { resolveWithMissingImage } from '../../../common/lib/resolve_dataurl'; -import { elasticOutline } from '../../lib/elastic_outline'; +import { + elasticOutline, + resolveWithMissingImage, +} from '../../../../../../src/plugins/presentation_util/common/lib'; import { Render } from '../../../types'; import { getFunctionHelp } from '../../../i18n'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/replace.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/replace.test.js index 26e44f48f685d8..6025ff354cd8d8 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/replace.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/replace.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { replace } from './replace'; describe('replace', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/reveal_image.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/reveal_image.test.js deleted file mode 100644 index d97168c3aacc18..00000000000000 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/reveal_image.test.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { functionWrapper } from '../../../test_helpers/function_wrapper'; -import { elasticOutline } from '../../lib/elastic_outline'; -import { elasticLogo } from '../../lib/elastic_logo'; -import { getFunctionErrors } from '../../../i18n'; -import { revealImage } from './revealImage'; - -const errors = getFunctionErrors().revealImage; - -describe('revealImage', () => { - const fn = functionWrapper(revealImage); - - it('returns a render as revealImage', () => { - const result = fn(0.5); - expect(result).toHaveProperty('type', 'render'); - expect(result).toHaveProperty('as', 'revealImage'); - }); - - describe('context', () => { - it('throws when context is not a number between 0 and 1', () => { - expect(() => { - fn(10, { - image: elasticLogo, - emptyImage: elasticOutline, - origin: 'top', - }); - }).toThrow(new RegExp(errors.invalidPercent(10).message)); - - expect(() => { - fn(-0.1, { - image: elasticLogo, - emptyImage: elasticOutline, - origin: 'top', - }); - }).toThrow(new RegExp(errors.invalidPercent(-0.1).message)); - }); - }); - - describe('args', () => { - describe('image', () => { - it('sets the image', () => { - const result = fn(0.89, { image: elasticLogo }).value; - expect(result).toHaveProperty('image', elasticLogo); - }); - - it('defaults to the Elastic outline logo', () => { - const result = fn(0.89).value; - expect(result).toHaveProperty('image', elasticOutline); - }); - }); - - describe('emptyImage', () => { - it('sets the background image', () => { - const result = fn(0, { emptyImage: elasticLogo }).value; - expect(result).toHaveProperty('emptyImage', elasticLogo); - }); - - it('sets emptyImage to null', () => { - const result = fn(0).value; - expect(result).toHaveProperty('emptyImage', null); - }); - }); - - describe('origin', () => { - it('sets which side to start the reveal from', () => { - let result = fn(1, { origin: 'top' }).value; - expect(result).toHaveProperty('origin', 'top'); - result = fn(1, { origin: 'left' }).value; - expect(result).toHaveProperty('origin', 'left'); - result = fn(1, { origin: 'bottom' }).value; - expect(result).toHaveProperty('origin', 'bottom'); - result = fn(1, { origin: 'right' }).value; - expect(result).toHaveProperty('origin', 'right'); - }); - - it('defaults to bottom', () => { - const result = fn(1).value; - expect(result).toHaveProperty('origin', 'bottom'); - }); - }); - }); -}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rounddate.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rounddate.test.js index f2c2f8af50a81b..0ef832d9732711 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rounddate.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rounddate.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { rounddate } from './rounddate'; describe('rounddate', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rowCount.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rowCount.test.js index b47bb662f43d45..7a32849e9161a5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rowCount.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/rowCount.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { rowCount } from './rowCount'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/series_style.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/series_style.test.js index ebd1f370db3437..6e91b84d82b6f9 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/series_style.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/series_style.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { seriesStyle } from './seriesStyle'; describe('seriesStyle', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/sort.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/sort.test.js index 97f8b20c57efa0..f59c517c91d888 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/sort.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/sort.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable } from './__fixtures__/test_tables'; import { sort } from './sort'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/staticColumn.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/staticColumn.test.js index 3a3bb46e4d395b..0260c9e77c424a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/staticColumn.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/staticColumn.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable, emptyTable } from './__fixtures__/test_tables'; import { staticColumn } from './staticColumn'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/string.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/string.test.js index c598c036bcaa9a..48af07b7cd880a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/string.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/string.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { string } from './string'; describe('string', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/switch.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/switch.test.js index 7a6d483d6c72bc..c6f592889c9912 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/switch.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/switch.test.js @@ -7,7 +7,7 @@ import { of } from 'rxjs'; import { TestScheduler } from 'rxjs/testing'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { switchFn } from './switch'; describe('switch', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.test.js index 2eff610ac8ee5f..42e5150b03637b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/table.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { testTable } from './__fixtures__/test_tables'; import { fontStyle } from './__fixtures__/test_styles'; import { table } from './table'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/tail.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/tail.test.js index 93461a2ef4575b..420489754d20e0 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/tail.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/tail.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { emptyTable, testTable } from './__fixtures__/test_tables'; import { tail } from './tail'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter.test.js index e45a11b786d19c..f45ec981b1a8a8 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter.test.js @@ -6,7 +6,7 @@ */ import sinon from 'sinon'; -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { getFunctionErrors } from '../../../i18n'; import { emptyFilter } from './__fixtures__/test_filters'; import { timefilter } from './timefilter'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter_control.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter_control.test.js index cf2c316507c352..b4a476807b7ee0 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter_control.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilter_control.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../../src/plugins/presentation_util/common/lib'; import { timefilterControl } from './timefilterControl'; describe('timefilterControl', () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts deleted file mode 100644 index 1ade7f1f269c01..00000000000000 --- a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_logo.ts +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -export const elasticLogo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDI3MC42MDAwMSAyNjkuNTQ2NjYiCiAgIGhlaWdodD0iMjY5LjU0NjY2IgogICB3aWR0aD0iMjcwLjYwMDAxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE4Ij48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNiIgLz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDI2OS41NDY2NykiCiAgICAgaWQ9ImcxMCI+PGcKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC4xKSIKICAgICAgIGlkPSJnMTIiPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTQiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMjAyOS40OCw5NjIuNDQxIGMgMCwxNzAuMDk5IC0xMDUuNDYsMzE4Ljc5OSAtMjY0LjE3LDM3Ni42NTkgNi45OCwzNS44NiAxMC42Miw3MS43MSAxMC42MiwxMDkuMDUgMCwzMTYuMTkgLTI1Ny4yNCw1NzMuNDMgLTU3My40Nyw1NzMuNDMgLTE4NC43MiwwIC0zNTYuNTU4LC04OC41OSAtNDY0LjUzLC0yMzcuODUgLTUzLjA5LDQxLjE4IC0xMTguMjg1LDYzLjc1IC0xODYuMzA1LDYzLjc1IC0xNjcuODM2LDAgLTMwNC4zODMsLTEzNi41NCAtMzA0LjM4MywtMzA0LjM4IDAsLTM3LjA4IDYuNjE3LC03Mi41OCAxOS4wMzEsLTEwNi4wOCBDIDEwOC40ODgsMTM4MC4wOSAwLDEyMjcuODkgMCwxMDU4Ljg4IDAsODg3LjkxIDEwNS45NzcsNzM4LjUzOSAyNjUuMzk4LDY4MS4wOSBjIC02Ljc2OSwtMzUuNDQyIC0xMC40NiwtNzIuMDIgLTEwLjQ2LC0xMDkgQyAyNTQuOTM4LDI1Ni42MjEgNTExLjU2NiwwIDgyNy4wMjcsMCAxMDEyLjIsMCAxMTgzLjk0LDg4Ljk0MTQgMTI5MS4zLDIzOC44MzIgYyA1My40NSwtNDEuOTYxIDExOC44LC02NC45OTIgMTg2LjU2LC02NC45OTIgMTY3LjgzLDAgMzA0LjM4LDEzNi40OTIgMzA0LjM4LDMwNC4zMzIgMCwzNy4wNzggLTYuNjIsNzIuNjI5IC0xOS4wMywxMDYuMTI5IDE1Ny43OCw1Ni44NzkgMjY2LjI3LDIwOS4xMjkgMjY2LjI3LDM3OC4xNCIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDE2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmFjZjA5O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDc5Ny44OTgsMTE1MC45MyA0NDQuMDcyLC0yMDIuNDUgNDQ4LjA1LDM5Mi41OCBjIDYuNDksMzIuMzkgOS42Niw2NC42NyA5LjY2LDk4LjQ2IDAsMjc2LjIzIC0yMjQuNjgsNTAwLjk1IC01MDAuOSw1MDAuOTUgLTE2NS4yNCwwIC0zMTkuMzcsLTgxLjM2IC00MTMuMDUzLC0yMTcuNzkgbCAtNzQuNTI0LC0zODYuNjQgODYuNjk1LC0xODUuMTEiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgxOCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ5YzFhZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgZD0ibSAzMzguMjIzLDY4MC42NzIgYyAtNi40ODksLTMyLjM4MyAtOS44MDksLTY1Ljk4MSAtOS44MDksLTk5Ljk3MyAwLC0yNzYuOTI5IDIyNS4zMzYsLTUwMi4yNTc2IDUwMi4zMTMsLTUwMi4yNTc2IDE2Ni41OTMsMCAzMjEuNDczLDgyLjExNzYgNDE1LjAxMywyMTkuOTQ5NiBsIDczLjk3LDM4NS4zNDcgLTk4LjcyLDE4OC42MjEgTCA3NzUuMTU2LDEwNzUuNTcgMzM4LjIyMyw2ODAuNjcyIiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNlZjI5OWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMzM1LjQxLDE0NDkuMTggMzA0LjMzMiwtNzEuODYgNjYuNjgsMzQ2LjAyIGMgLTQxLjU4NiwzMS43OCAtOTIuOTMsNDkuMTggLTE0NS43MzEsNDkuMTggLTEzMi4yNSwwIC0yMzkuODEyLC0xMDcuNjEgLTIzOS44MTIsLTIzOS44NyAwLC0yOS4yMSA0Ljg3OSwtNTcuMjIgMTQuNTMxLC04My40NyIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDIyIgogICAgICAgICBzdHlsZT0iZmlsbDojNGNhYmU0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJNIDMwOC45OTIsMTM3Ni43IEMgMTczLjAyLDEzMzEuNjQgNzguNDgwNSwxMjAxLjMgNzguNDgwNSwxMDU3LjkzIDc4LjQ4MDUsOTE4LjM0IDE2NC44Miw3OTMuNjggMjk0LjQwNiw3NDQuMzUyIGwgNDI2Ljk4MSwzODUuOTM4IC03OC4zOTUsMTY3LjUxIC0zMzQsNzguOSIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICBzdHlsZT0iZmlsbDojODVjZTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDEzMjMuOCwyOTguNDEgYyA0MS43NCwtMzIuMDkgOTIuODMsLTQ5LjU5IDE0NC45OCwtNDkuNTkgMTMyLjI1LDAgMjM5LjgxLDEwNy41NTkgMjM5LjgxLDIzOS44MjEgMCwyOS4xNiAtNC44OCw1Ny4xNjggLTE0LjUzLDgzLjQxOCBsIC0zMDQuMDgsNzEuMTYgLTY2LjE4LC0zNDQuODA5IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzMTc3YTc7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMTM4NS42Nyw3MjIuOTMgMzM0Ljc2LC03OC4zMDEgYyAxMzYuMDIsNDQuOTYxIDIzMC41NiwxNzUuMzUxIDIzMC41NiwzMTguNzYyIDAsMTM5LjMzOSAtODYuNTQsMjYzLjg1OSAtMjE2LjM4LDMxMy4wMzkgbCAtNDM3Ljg0LC0zODMuNTkgODguOSwtMTY5LjkxIiAvPjwvZz48L2c+PC9zdmc+'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts b/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts deleted file mode 100644 index 7271f5b32d5478..00000000000000 --- a/x-pack/plugins/canvas/canvas_plugin_src/lib/elastic_outline.ts +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -export const elasticOutline = 'data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20viewBox%3D%22-3.948730230331421%20-1.7549896240234375%20245.25946044921875%20241.40370178222656%22%20width%3D%22245.25946044921875%22%20height%3D%22241.40370178222656%22%20style%3D%22enable-background%3Anew%200%200%20686.2%20235.7%3B%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%232D2D2D%3B%7D%0A%3C%2Fstyle%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cg%20transform%3D%22matrix%281%2C%200%2C%200%2C%201%2C%200%2C%200%29%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M329.4%2C160.3l4.7-0.5l0.3%2C9.6c-12.4%2C1.7-23%2C2.6-31.8%2C2.6c-11.7%2C0-20-3.4-24.9-10.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-4.9-6.8-7.3-17.4-7.3-31.7c0-28.6%2C11.4-42.9%2C34.1-42.9c11%2C0%2C19.2%2C3.1%2C24.6%2C9.2c5.4%2C6.1%2C8.1%2C15.8%2C8.1%2C28.9l-0.7%2C9.3h-53.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0%2C9%2C1.6%2C15.7%2C4.9%2C20c3.3%2C4.3%2C8.9%2C6.5%2C17%2C6.5C312.8%2C161.2%2C321.1%2C160.9%2C329.4%2C160.3z%20M325%2C124.9c0-10-1.6-17.1-4.8-21.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.2-4.1-8.4-6.2-15.6-6.2c-7.2%2C0-12.7%2C2.2-16.3%2C6.5c-3.6%2C4.3-5.5%2C11.3-5.6%2C20.9H325z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M354.3%2C171.4V64h12.2v107.4H354.3z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M443.5%2C113.5v41.1c0%2C4.1%2C10.1%2C3.9%2C10.1%2C3.9l-0.6%2C10.8c-8.6%2C0-15.7%2C0.7-20-3.4c-9.8%2C4.3-19.5%2C6.1-29.3%2C6.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.5%2C0-13.2-2.1-17.1-6.4c-3.9-4.2-5.9-10.3-5.9-18.3c0-7.9%2C2-13.8%2C6-17.5c4-3.7%2C10.3-6.1%2C18.9-6.9l25.6-2.4v-7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0-5.5-1.2-9.5-3.6-11.9c-2.4-2.4-5.7-3.6-9.8-3.6l-32.1%2C0V87.2h31.3c9.2%2C0%2C15.9%2C2.1%2C20.1%2C6.4C441.4%2C97.8%2C443.5%2C104.5%2C443.5%2C113.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bz%20M393.3%2C146.7c0%2C10%2C4.1%2C15%2C12.4%2C15c7.4%2C0%2C14.7-1.2%2C21.8-3.7l3.7-1.3v-26.9l-24.1%2C2.3c-4.9%2C0.4-8.4%2C1.8-10.6%2C4.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3BC394.4%2C138.7%2C393.3%2C142.2%2C393.3%2C146.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M491.2%2C98.2c-11.8%2C0-17.8%2C4.1-17.8%2C12.4c0%2C3.8%2C1.4%2C6.5%2C4.1%2C8.1c2.7%2C1.6%2C8.9%2C3.2%2C18.6%2C4.9%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc9.7%2C1.7%2C16.5%2C4%2C20.5%2C7.1c4%2C3%2C6%2C8.7%2C6%2C17.1c0%2C8.4-2.7%2C14.5-8.1%2C18.4c-5.4%2C3.9-13.2%2C5.9-23.6%2C5.9c-6.7%2C0-29.2-2.5-29.2-2.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bl0.7-10.6c12.9%2C1.2%2C22.3%2C2.2%2C28.6%2C2.2c6.3%2C0%2C11.1-1%2C14.4-3c3.3-2%2C5-5.4%2C5-10.1c0-4.7-1.4-7.9-4.2-9.6c-2.8-1.7-9-3.3-18.6-4.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-9.6-1.5-16.4-3.7-20.4-6.7c-4-2.9-6-8.4-6-16.3c0-7.9%2C2.8-13.8%2C8.4-17.6c5.6-3.8%2C12.6-5.7%2C20.9-5.7c6.6%2C0%2C29.6%2C1.7%2C29.6%2C1.7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bv10.7C508.1%2C99%2C498.2%2C98.2%2C491.2%2C98.2z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M581.7%2C99.5h-25.9v39c0%2C9.3%2C0.7%2C15.5%2C2%2C18.4c1.4%2C2.9%2C4.6%2C4.4%2C9.7%2C4.4l14.5-1l0.8%2C10.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.3%2C1.2-12.8%2C1.8-16.6%2C1.8c-8.5%2C0-14.3-2.1-17.6-6.2c-3.3-4.1-4.9-12-4.9-23.6V99.5h-11.6V88.9h11.6V63.9h12.1v24.9h25.9V99.5z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M598.7%2C78.4V64.3h12.2v14.2H598.7z%20M598.7%2C171.4V88.9h12.2v82.5H598.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M663.8%2C87.2c3.6%2C0%2C9.7%2C0.7%2C18.3%2C2l3.9%2C0.5l-0.5%2C9.9c-8.7-1-15.1-1.5-19.2-1.5c-9.2%2C0-15.5%2C2.2-18.8%2C6.6%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.3%2C4.4-5%2C12.6-5%2C24.5c0%2C11.9%2C1.5%2C20.2%2C4.6%2C24.9c3.1%2C4.7%2C9.5%2C7%2C19.3%2C7l19.2-1.5l0.5%2C10.1c-10.1%2C1.5-17.7%2C2.3-22.7%2C2.3%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-12.7%2C0-21.5-3.3-26.3-9.8c-4.8-6.5-7.3-17.5-7.3-33c0-15.5%2C2.6-26.4%2C7.8-32.6C643%2C90.4%2C651.7%2C87.2%2C663.8%2C87.2z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M236.6%2C123.5c0-19.8-12.3-37.2-30.8-43.9c0.8-4.2%2C1.2-8.4%2C1.2-12.7C207%2C30%2C177%2C0%2C140.2%2C0%26%2310%3B%26%239%3B%26%239%3BC118.6%2C0%2C98.6%2C10.3%2C86%2C27.7c-6.2-4.8-13.8-7.4-21.7-7.4c-19.6%2C0-35.5%2C15.9-35.5%2C35.5c0%2C4.3%2C0.8%2C8.5%2C2.2%2C12.4%26%2310%3B%26%239%3B%26%239%3BC12.6%2C74.8%2C0%2C92.5%2C0%2C112.2c0%2C19.9%2C12.4%2C37.3%2C30.9%2C44c-0.8%2C4.1-1.2%2C8.4-1.2%2C12.7c0%2C36.8%2C29.9%2C66.7%2C66.7%2C66.7%26%2310%3B%26%239%3B%26%239%3Bc21.6%2C0%2C41.6-10.4%2C54.1-27.8c6.2%2C4.9%2C13.8%2C7.6%2C21.7%2C7.6c19.6%2C0%2C35.5-15.9%2C35.5-35.5c0-4.3-0.8-8.5-2.2-12.4%26%2310%3B%26%239%3B%26%239%3BC223.9%2C160.9%2C236.6%2C143.2%2C236.6%2C123.5z%20M91.6%2C34.8c10.9-15.9%2C28.9-25.4%2C48.1-25.4c32.2%2C0%2C58.4%2C26.2%2C58.4%2C58.4%26%2310%3B%26%239%3B%26%239%3Bc0%2C3.9-0.4%2C7.7-1.1%2C11.5l-52.2%2C45.8L93%2C101.5L82.9%2C79.9L91.6%2C34.8z%20M65.4%2C29c6.2%2C0%2C12.1%2C2%2C17%2C5.7l-7.8%2C40.3l-35.5-8.4%26%2310%3B%26%239%3B%26%239%3Bc-1.1-3.1-1.7-6.3-1.7-9.7C37.4%2C41.6%2C49.9%2C29%2C65.4%2C29z%20M9.1%2C112.3c0-16.7%2C11-31.9%2C26.9-37.2L75%2C84.4l9.1%2C19.5l-49.8%2C45%26%2310%3B%26%239%3B%26%239%3BC19.2%2C143.1%2C9.1%2C128.6%2C9.1%2C112.3z%20M145.2%2C200.9c-10.9%2C16.1-29%2C25.6-48.4%2C25.6c-32.3%2C0-58.6-26.3-58.6-58.5c0-4%2C0.4-7.9%2C1.1-11.7%26%2310%3B%26%239%3B%26%239%3Bl50.9-46l52%2C23.7l11.5%2C22L145.2%2C200.9z%20M171.2%2C206.6c-6.1%2C0-12-2-16.9-5.8l7.7-40.2l35.4%2C8.3c1.1%2C3.1%2C1.7%2C6.3%2C1.7%2C9.7%26%2310%3B%26%239%3B%26%239%3BC199.2%2C194.1%2C186.6%2C206.6%2C171.2%2C206.6z%20M200.5%2C160.5l-39-9.1l-10.4-19.8l51-44.7c15.1%2C5.7%2C25.2%2C20.2%2C25.2%2C36.5%26%2310%3B%26%239%3B%26%239%3BC227.4%2C140.1%2C216.4%2C155.3%2C200.5%2C160.5z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/image.stories.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/image.stories.tsx index 7276a55bdf49dd..8839910d78e0d5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/image.stories.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/image.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { image } from '../image'; import { Render } from './render'; -import { elasticLogo } from '../../lib/elastic_logo'; +import { elasticLogo } from '../../../../../../src/plugins/presentation_util/common/lib'; storiesOf('renderers/image', module).add('default', () => { const config = { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/repeat_image.stories.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/repeat_image.stories.tsx index 8dd059cf7a32f8..ed2706389d83d1 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/repeat_image.stories.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/__stories__/repeat_image.stories.tsx @@ -9,8 +9,10 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { repeatImage } from '../repeat_image'; import { Render } from './render'; -import { elasticLogo } from '../../lib/elastic_logo'; -import { elasticOutline } from '../../lib/elastic_outline'; +import { + elasticLogo, + elasticOutline, +} from '../../../../../../src/plugins/presentation_util/common/lib'; storiesOf('renderers/repeatImage', module).add('default', () => { const config = { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts index c6b40936c288a5..3295332bb63165 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/core.ts @@ -14,7 +14,6 @@ import { pie } from './pie'; import { plot } from './plot'; import { progress } from './progress'; import { repeatImage } from './repeat_image'; -import { revealImage } from './reveal_image'; import { shape } from './shape'; import { table } from './table'; import { text } from './text'; @@ -29,7 +28,6 @@ export const renderFunctions = [ plot, progress, repeatImage, - revealImage, shape, table, text, diff --git a/x-pack/plugins/canvas/common/lib/url.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts similarity index 54% rename from x-pack/plugins/canvas/common/lib/url.ts rename to x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts index 5018abc0277130..bf9b6a744e686e 100644 --- a/x-pack/plugins/canvas/common/lib/url.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { isValidDataUrl } from '../../common/lib/dataurl'; -import { isValidHttpUrl } from '../../common/lib/httpurl'; +import { revealImageRenderer } from '../../../../../src/plugins/expression_reveal_image/public'; -export function isValidUrl(url: string) { - return isValidDataUrl(url) || isValidHttpUrl(url); -} +export const renderFunctions = [revealImageRenderer]; +export const renderFunctionFactories = []; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx index 8c88fe820d5d3d..86e9daed105db2 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/image.tsx @@ -7,8 +7,7 @@ import ReactDOM from 'react-dom'; import React from 'react'; -import { elasticLogo } from '../lib/elastic_logo'; -import { isValidUrl } from '../../common/lib/url'; +import { elasticLogo, isValidUrl } from '../../../../../src/plugins/presentation_util/common/lib'; import { Return as Arguments } from '../functions/common/image'; import { RendererStrings } from '../../i18n'; import { RendererFactory } from '../../types'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts index 3c2d90f81eedc7..16a052edbbe825 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/index.ts @@ -15,11 +15,23 @@ import { renderFunctionFactories as filterFactories, } from './filters'; +import { + renderFunctions as externalFunctions, + renderFunctionFactories as externalFactories, +} from './external'; + import { renderFunctions as coreFunctions, renderFunctionFactories as coreFactories } from './core'; -export const renderFunctions = [...coreFunctions, ...filterFunctions, ...embeddableFunctions]; +export const renderFunctions = [ + ...coreFunctions, + ...filterFunctions, + ...embeddableFunctions, + ...externalFunctions, +]; + export const renderFunctionFactories = [ ...coreFactories, ...embeddableFactories, ...filterFactories, + ...externalFactories, ]; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts index 8286609aa334fe..149a8876834132 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/repeat_image.ts @@ -7,8 +7,10 @@ import $ from 'jquery'; import { times } from 'lodash'; -import { elasticOutline } from '../lib/elastic_outline'; -import { isValidUrl } from '../../common/lib/url'; +import { + elasticOutline, + isValidUrl, +} from '../../../../../src/plugins/presentation_util/common/lib'; import { RendererStrings, ErrorStrings } from '../../i18n'; import { Return as Arguments } from '../functions/common/repeat_image'; import { RendererFactory } from '../../types'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/reveal_image.stories.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/reveal_image.stories.tsx deleted file mode 100644 index 672cecca1beadd..00000000000000 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/__stories__/reveal_image.stories.tsx +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { storiesOf } from '@storybook/react'; -import { revealImage } from '../'; -import { Render } from '../../__stories__/render'; -import { elasticOutline } from '../../../lib/elastic_outline'; -import { elasticLogo } from '../../../lib/elastic_logo'; -import { Origin } from '../../../functions/common/revealImage'; - -storiesOf('renderers/revealImage', module).add('default', () => { - const config = { - image: elasticLogo, - emptyImage: elasticOutline, - origin: Origin.LEFT, - percent: 0.45, - }; - - return ; -}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts deleted file mode 100644 index 8d9ceb70f17a6b..00000000000000 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/reveal_image/index.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { elasticOutline } from '../../lib/elastic_outline'; -import { isValidUrl } from '../../../common/lib/url'; -import { RendererStrings } from '../../../i18n'; -import { RendererFactory } from '../../../types'; -import { Output as Arguments } from '../../functions/common/revealImage'; - -const { revealImage: strings } = RendererStrings; - -export const revealImage: RendererFactory = () => ({ - name: 'revealImage', - displayName: strings.getDisplayName(), - help: strings.getHelpDescription(), - reuseDomNode: true, - render(domNode, config, handlers) { - const aligner = document.createElement('div'); - const img = new Image(); - - // modify the top-level container class - domNode.className = 'revealImage'; - - // set up the overlay image - function onLoad() { - setSize(); - finish(); - } - img.onload = onLoad; - - img.className = 'revealImage__image'; - img.style.clipPath = getClipPath(config.percent, config.origin); - img.style.setProperty('-webkit-clip-path', getClipPath(config.percent, config.origin)); - img.src = isValidUrl(config.image) ? config.image : elasticOutline; - handlers.onResize(onLoad); - - // set up the underlay, "empty" image - aligner.className = 'revealImageAligner'; - aligner.appendChild(img); - if (isValidUrl(config.emptyImage)) { - // only use empty image if one is provided - aligner.style.backgroundImage = `url(${config.emptyImage})`; - } - - function finish() { - const firstChild = domNode.firstChild; - if (firstChild) { - domNode.replaceChild(aligner, firstChild); - } else { - domNode.appendChild(aligner); - } - handlers.done(); - } - - function getClipPath(percent: number, origin = 'bottom') { - const directions: Record = { bottom: 0, left: 1, top: 2, right: 3 }; - const values: Array = [0, 0, 0, 0]; - values[directions[origin]] = `${100 - percent * 100}%`; - return `inset(${values.join(' ')})`; - } - - function setSize() { - const imgDimensions = { - height: img.naturalHeight, - width: img.naturalWidth, - ratio: img.naturalHeight / img.naturalWidth, - }; - - const domNodeDimensions = { - height: domNode.clientHeight, - width: domNode.clientWidth, - ratio: domNode.clientHeight / domNode.clientWidth, - }; - - if (imgDimensions.ratio > domNodeDimensions.ratio) { - img.style.height = `${domNodeDimensions.height}px`; - img.style.width = 'initial'; - } else { - img.style.width = `${domNodeDimensions.width}px`; - img.style.height = 'initial'; - } - } - }, -}); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js index 2caf41f0777e14..480d8ea364c427 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/image_upload/index.js @@ -10,10 +10,12 @@ import PropTypes from 'prop-types'; import { EuiSpacer, EuiFormRow, EuiButtonGroup } from '@elastic/eui'; import { get } from 'lodash'; import { AssetPicker } from '../../../../public/components/asset_picker'; -import { elasticOutline } from '../../../lib/elastic_outline'; -import { resolveFromArgs } from '../../../../common/lib/resolve_dataurl'; -import { isValidHttpUrl } from '../../../../common/lib/httpurl'; -import { encode } from '../../../../common/lib/dataurl'; +import { + encode, + elasticOutline, + isValidHttpUrl, + resolveFromArgs, +} from '../../../../../../../src/plugins/presentation_util/public'; import { templateFromReactComponent } from '../../../../public/lib/template_from_react_component'; import { VALID_IMAGE_TYPES } from '../../../../common/lib/constants'; import { ArgumentStrings } from '../../../../i18n'; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/image.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/image.js index 37b22e376141fe..f974667b7fad99 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/image.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/image.js @@ -5,8 +5,10 @@ * 2.0. */ -import { elasticLogo } from '../../lib/elastic_logo'; -import { resolveFromArgs } from '../../../common/lib/resolve_dataurl'; +import { + elasticLogo, + resolveFromArgs, +} from '../../../../../../src/plugins/presentation_util/common/lib'; import { ViewStrings } from '../../../i18n'; const { Image: strings } = ViewStrings; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/revealImage.js b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/revealImage.js index 30e0b9a640f921..f9bba68c569497 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/views/revealImage.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/views/revealImage.js @@ -6,7 +6,6 @@ */ import { ViewStrings } from '../../../i18n'; - const { RevealImage: strings } = ViewStrings; export const revealImage = () => ({ diff --git a/x-pack/plugins/canvas/common/lib/index.ts b/x-pack/plugins/canvas/common/lib/index.ts index afce09c6d5ee93..a23b569640f5af 100644 --- a/x-pack/plugins/canvas/common/lib/index.ts +++ b/x-pack/plugins/canvas/common/lib/index.ts @@ -8,7 +8,6 @@ export * from './datatable'; export * from './autocomplete'; export * from './constants'; -export * from './dataurl'; export * from './errors'; export * from './expression_form_handlers'; export * from './fetch'; @@ -16,10 +15,6 @@ export * from './fonts'; export * from './get_field_type'; export * from './get_legend_config'; export * from './hex_to_rgb'; -export * from './httpurl'; -export * from './missing_asset'; export * from './palettes'; export * from './pivot_object_array'; -export * from './resolve_dataurl'; export * from './unquote_string'; -export * from './url'; diff --git a/x-pack/plugins/canvas/common/lib/missing_asset.ts b/x-pack/plugins/canvas/common/lib/missing_asset.ts deleted file mode 100644 index d47648b44059c2..00000000000000 --- a/x-pack/plugins/canvas/common/lib/missing_asset.ts +++ /dev/null @@ -1,3 +0,0 @@ -/* eslint-disable */ -// CC0, source: https://pixabay.com/en/question-mark-confirmation-question-838656/ -export const missingImage = 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAzMSAzMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48ZmlsdGVyIGlkPSJiIiB4PSItLjM2IiB5PSItLjM2IiB3aWR0aD0iMS43MiIgaGVpZ2h0PSIxLjcyIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIuNDY0Ii8+PC9maWx0ZXI+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMTU5LjM0IiB4Mj0iMTg0LjQ4IiB5MT0iNzI3LjM2IiB5Mj0iNzQ5Ljg5IiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMTEuNTMgLTU0OS42OCkgc2NhbGUoLjc3MDAyKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNlYmYwZWQiIG9mZnNldD0iMCIvPjxzdG9wIHN0b3AtY29sb3I9IiNmYWZhZmEiIG9mZnNldD0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxwYXRoIGQ9Ik0xNS40MzcgMi42OTVsMTQuNTA2IDI0LjQ3NkgxLjI4N2wxNC4xNS0yNC40NzZ6IiBmaWxsPSJ1cmwoI2EpIiBzdHJva2U9InJlZCIgc3Ryb2tlLWxpbmVjYXA9InNxdWFyZSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLXdpZHRoPSIyIi8+PHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoLjgzMTk3IDAgMCAuNTU0NjYgLTc4LjU4MyAtMzgzLjUxKSIgZD0iTTExMS4zMSA3MzEuMmMtMy4yODMtMy45MjUtMy41OTUtNi4xNDgtMi4wMjQtMTAuNDM4IDMuMzM2LTYuMTQ1IDQuNDk2LTguMDY4IDUuNDEtOS40MDUgMS45MDEgNS4xNjIgMi4xMjYgMTkuMTQtMy4zODYgMTkuODQzeiIgZmlsbD0iI2ZmZiIgZmlsbC1vcGFjaXR5PSIuODc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGZpbHRlcj0idXJsKCNiKSIvPjxnIGZpbGwtb3BhY2l0eT0iLjgyIj48cGF0aCBkPSJNMTUuMDQ2IDIwLjIyN2gtLjQxNWMtLjAxMy0uNzQ4LjAyLTEuMzA4LjEwMS0xLjY3OC4wODgtLjM3MS4zMDctLjg4LjY1OC0xLjUyOC4zNTctLjY1NC41OS0xLjE3Ni42OTctMS41NjcuMTE1LS4zOTguMTcyLS44ODcuMTcyLTEuNDY3IDAtLjg5Ni0uMTc1LTEuNTU3LS41MjYtMS45ODItLjM1LS40MjUtLjc2NS0uNjM3LTEuMjQ0LS42MzctLjM2NCAwLS42Ny4wOTgtLjkyLjI5My0uMTg5LjE0OS0uMjgzLjMwNC0uMjgzLjQ2NiAwIC4xMDcuMDY0LjI3Ni4xOTIuNTA1LjI5LjUyLjQzNS45NjEuNDM1IDEuMzI1IDAgLjMzLS4xMTUuNjA3LS4zNDQuODNhMS4xMzggMS4xMzggMCAwIDEtLjg0LjMzM2MtLjM3NyAwLS42OTQtLjEzMS0uOTUtLjM5NC0uMjU2LS4yNy0uMzg0LS42MjQtLjM4NC0xLjA2MiAwLS43OTYuMzQ0LTEuNDk0IDEuMDMxLTIuMDk0LjY4OC0uNiAxLjY0OS0uOSAyLjg4My0uOSAxLjMwOCAwIDIuMzAyLjMxNCAyLjk4My45NC42ODguNjIxIDEuMDMyIDEuMzczIDEuMDMyIDIuMjU2IDAgLjY0LS4xNzYgMS4yMzQtLjUyNiAxLjc4LS4zNTEuNTQtMS4wMjkgMS4xNC0yLjAzMyAxLjgtLjY3NC40NDUtMS4xMi44NDMtMS4zMzUgMS4xOTQtLjIxLjM0My0uMzM3Ljg3My0uMzg0IDEuNTg3bS0uMTEyIDEuNDc3Yy40NTIgMCAuODM2LjE1OCAxLjE1My40NzUuMzE3LjMxNy40NzYuNzAxLjQ3NiAxLjE1MyAwIC40NTItLjE1OS44NC0uNDc2IDEuMTYzYTEuNTcgMS41NyAwIDAgMS0xLjE1My40NzUgMS41NyAxLjU3IDAgMCAxLTEuMTUzLS40NzUgMS42MDQgMS42MDQgMCAwIDEtLjQ3NS0xLjE2M2MwLS40NTIuMTU5LS44MzYuNDc1LTEuMTUzYTEuNTcgMS41NyAwIDAgMSAxLjE1My0uNDc1IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9Ii40ODYiLz48cGF0aCBkPSJNMTUuMzI3IDIwLjUwOGgtLjQxNWMtLjAxMy0uNzQ4LjAyLTEuMzA4LjEwMS0xLjY3OC4wODgtLjM3MS4zMDctLjg4LjY1OC0xLjUyOC4zNTctLjY1NC41OS0xLjE3Ni42OTctMS41NjcuMTE1LS4zOTguMTcyLS44ODcuMTcyLTEuNDY2IDAtLjg5Ny0uMTc1LTEuNTU4LS41MjYtMS45ODMtLjM1LS40MjQtLjc2NS0uNjM3LTEuMjQzLS42MzctLjM2NSAwLS42NzEuMDk4LS45Mi4yOTMtLjE5LjE0OS0uMjg0LjMwNC0uMjg0LjQ2NiAwIC4xMDguMDY0LjI3Ni4xOTIuNTA1LjI5LjUyLjQzNS45NjEuNDM1IDEuMzI1IDAgLjMzLS4xMTUuNjA3LS4zNDQuODNhMS4xMzggMS4xMzggMCAwIDEtLjg0LjMzM2MtLjM3NyAwLS42OTQtLjEzMS0uOTUtLjM5NC0uMjU2LS4yNy0uMzg0LS42MjQtLjM4NC0xLjA2MiAwLS43OTYuMzQ0LTEuNDkzIDEuMDMxLTIuMDk0LjY4OC0uNiAxLjY0OS0uOSAyLjg4My0uOSAxLjMwOCAwIDIuMzAyLjMxNCAyLjk4My45NC42ODguNjIxIDEuMDMyIDEuMzczIDEuMDMyIDIuMjU2IDAgLjY0LS4xNzYgMS4yMzQtLjUyNiAxLjc4LS4zNS41NC0xLjAyOCAxLjE0LTIuMDMzIDEuOC0uNjc0LjQ0NS0uODUzLjg0My0xLjA2OCAxLjE5NC0uMjEuMzQzLS4zMzcuODczLS4zODUgMS41ODdtLS4zNzggMS40NzdjLjQ1MiAwIC44MzYuMTU4IDEuMTUzLjQ3NS4zMTcuMzE3LjQ3Ni43MDEuNDc2IDEuMTUzIDAgLjQ1Mi0uMTU5Ljg0LS40NzYgMS4xNjNhMS41NyAxLjU3IDAgMCAxLTEuMTUzLjQ3NiAxLjU3IDEuNTcgMCAwIDEtMS4xNTMtLjQ3NiAxLjYwNCAxLjYwNCAwIDAgMS0uNDc1LTEuMTYzYzAtLjQ1Mi4xNTktLjgzNi40NzUtMS4xNTNhMS41NyAxLjU3IDAgMCAxIDEuMTUzLS40NzUiIGZpbGwtb3BhY2l0eT0iLjgyIi8+PC9nPjwvc3ZnPg=='; diff --git a/x-pack/plugins/canvas/i18n/functions/function_errors.ts b/x-pack/plugins/canvas/i18n/functions/function_errors.ts index 4a85018c1b4aca..a01cb09a38347f 100644 --- a/x-pack/plugins/canvas/i18n/functions/function_errors.ts +++ b/x-pack/plugins/canvas/i18n/functions/function_errors.ts @@ -19,7 +19,6 @@ import { errors as joinRows } from './dict/join_rows'; import { errors as ply } from './dict/ply'; import { errors as pointseries } from './dict/pointseries'; import { errors as progress } from './dict/progress'; -import { errors as revealImage } from './dict/reveal_image'; import { errors as timefilter } from './dict/timefilter'; import { errors as to } from './dict/to'; @@ -38,7 +37,6 @@ export const getFunctionErrors = () => ({ ply, pointseries, progress, - revealImage, timefilter, to, }); diff --git a/x-pack/plugins/canvas/i18n/functions/function_help.ts b/x-pack/plugins/canvas/i18n/functions/function_help.ts index 512ebc4ff8c935..b72d410ddd63f4 100644 --- a/x-pack/plugins/canvas/i18n/functions/function_help.ts +++ b/x-pack/plugins/canvas/i18n/functions/function_help.ts @@ -57,7 +57,6 @@ import { help as progress } from './dict/progress'; import { help as render } from './dict/render'; import { help as repeatImage } from './dict/repeat_image'; import { help as replace } from './dict/replace'; -import { help as revealImage } from './dict/reveal_image'; import { help as rounddate } from './dict/rounddate'; import { help as rowCount } from './dict/row_count'; import { help as savedLens } from './dict/saved_lens'; @@ -218,7 +217,6 @@ export const getFunctionHelp = (): FunctionHelpDict => ({ render, repeatImage, replace, - revealImage, rounddate, rowCount, savedLens, diff --git a/x-pack/plugins/canvas/i18n/renderers.ts b/x-pack/plugins/canvas/i18n/renderers.ts index f74516433f9246..29687155818e7b 100644 --- a/x-pack/plugins/canvas/i18n/renderers.ts +++ b/x-pack/plugins/canvas/i18n/renderers.ts @@ -139,16 +139,6 @@ export const RendererStrings = { defaultMessage: 'Repeat an image a given number of times', }), }, - revealImage: { - getDisplayName: () => - i18n.translate('xpack.canvas.renderer.revealImage.displayName', { - defaultMessage: 'Image reveal', - }), - getHelpDescription: () => - i18n.translate('xpack.canvas.renderer.revealImage.helpDescription', { - defaultMessage: 'Reveal a percentage of an image to make a custom gauge-style chart', - }), - }, shape: { getDisplayName: () => i18n.translate('xpack.canvas.renderer.shape.displayName', { diff --git a/x-pack/plugins/canvas/kibana.json b/x-pack/plugins/canvas/kibana.json index 5faeaefc9e3922..85d2e0709cb3e7 100644 --- a/x-pack/plugins/canvas/kibana.json +++ b/x-pack/plugins/canvas/kibana.json @@ -10,6 +10,7 @@ "charts", "data", "embeddable", + "expressionRevealImage", "expressions", "features", "inspector", diff --git a/x-pack/plugins/canvas/public/components/asset_manager/asset_manager.ts b/x-pack/plugins/canvas/public/components/asset_manager/asset_manager.ts index f8c6354d3935f5..e3824798d1df10 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/asset_manager.ts +++ b/x-pack/plugins/canvas/public/components/asset_manager/asset_manager.ts @@ -13,7 +13,7 @@ import { getId } from '../../lib/get_id'; // @ts-expect-error untyped local import { findExistingAsset } from '../../lib/find_existing_asset'; import { VALID_IMAGE_TYPES } from '../../../common/lib/constants'; -import { encode } from '../../../common/lib/dataurl'; +import { encode } from '../../../../../../src/plugins/presentation_util/public'; // @ts-expect-error untyped local import { elementsRegistry } from '../../lib/elements_registry'; // @ts-expect-error untyped local diff --git a/x-pack/plugins/canvas/public/components/custom_element_modal/__stories__/custom_element_modal.stories.tsx b/x-pack/plugins/canvas/public/components/custom_element_modal/__stories__/custom_element_modal.stories.tsx index 2e6d83cb1c8ace..93574270757f6d 100644 --- a/x-pack/plugins/canvas/public/components/custom_element_modal/__stories__/custom_element_modal.stories.tsx +++ b/x-pack/plugins/canvas/public/components/custom_element_modal/__stories__/custom_element_modal.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { CustomElementModal } from '../custom_element_modal'; -import { elasticLogo } from '../../../lib/elastic_logo'; +import { elasticLogo } from '../../../../../../../src/plugins/presentation_util/public'; storiesOf('components/Elements/CustomElementModal', module) .add('with title', () => ( diff --git a/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx b/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx index 86d9cab4eeea16..51ffe57fe5e762 100644 --- a/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx +++ b/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx @@ -29,7 +29,7 @@ import { import { i18n } from '@kbn/i18n'; import { VALID_IMAGE_TYPES } from '../../../common/lib/constants'; -import { encode } from '../../../common/lib/dataurl'; +import { encode } from '../../../../../../src/plugins/presentation_util/public'; import { ElementCard } from '../element_card'; const MAX_NAME_LENGTH = 40; diff --git a/x-pack/plugins/canvas/public/components/download/download.tsx b/x-pack/plugins/canvas/public/components/download/download.tsx index 856d6cb7e080ee..89cd9994810072 100644 --- a/x-pack/plugins/canvas/public/components/download/download.tsx +++ b/x-pack/plugins/canvas/public/components/download/download.tsx @@ -9,7 +9,7 @@ import { toByteArray } from 'base64-js'; import fileSaver from 'file-saver'; import PropTypes from 'prop-types'; import React, { ReactElement } from 'react'; -import { parseDataUrl } from '../../../common/lib/dataurl'; +import { parseDataUrl } from '../../../../../../src/plugins/presentation_util/public'; interface Props { children: ReactElement; diff --git a/x-pack/plugins/canvas/public/components/element_card/__stories__/element_card.stories.tsx b/x-pack/plugins/canvas/public/components/element_card/__stories__/element_card.stories.tsx index ae0d4328aa98de..4c68f185b196f0 100644 --- a/x-pack/plugins/canvas/public/components/element_card/__stories__/element_card.stories.tsx +++ b/x-pack/plugins/canvas/public/components/element_card/__stories__/element_card.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; import { ElementCard } from '../element_card'; -import { elasticLogo } from '../../../lib/elastic_logo'; +import { elasticLogo } from '../../../../../../../src/plugins/presentation_util/public'; storiesOf('components/Elements/ElementCard', module) .addDecorator((story) => ( diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts index 8f9b3923ff120c..075e65bc24dab5 100644 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts +++ b/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts @@ -10,7 +10,8 @@ import pluralize from 'pluralize'; import { ExpressionFunction, ExpressionFunctionParameter } from 'src/plugins/expressions'; import { functions as browserFunctions } from '../../../canvas_plugin_src/functions/browser'; import { functions as serverFunctions } from '../../../canvas_plugin_src/functions/server'; -import { isValidDataUrl, DATATABLE_COLUMN_TYPES } from '../../../common/lib'; +import { DATATABLE_COLUMN_TYPES } from '../../../common/lib'; +import { isValidDataUrl } from '../../../../../../src/plugins/presentation_util/public'; import { getFunctionExamples, FunctionExample } from './function_examples'; const ALPHABET = 'abcdefghijklmnopqrstuvwxyz'.split(''); diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx b/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx index 17d6a3d11b60fc..ef48b9815062c0 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { elasticLogo } from '../../../../lib/elastic_logo'; +import { elasticLogo } from '../../../../../../../../src/plugins/presentation_util/public'; export const testCustomElements = [ { diff --git a/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/element_menu.stories.tsx b/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/element_menu.stories.tsx index 6f4b6661ded532..80280d55a4e1c8 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/element_menu.stories.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/element_menu/__stories__/element_menu.stories.tsx @@ -95,17 +95,6 @@ You can use standard Markdown in here, but you can also access your piped-in dat | progress shape="gauge" label={formatnumber 0%} font={font size=24 family="Helvetica" color="#000000" align=center} | render`, }, - revealImage: { - name: 'revealImage', - displayName: 'Image reveal', - type: 'image', - help: 'Reveals a percentage of an image', - expression: `filters - | demodata - | math "mean(percent_uptime)" - | revealImage origin=bottom image=null - | render`, - }, shape: { name: 'shape', displayName: 'Shape', diff --git a/x-pack/plugins/canvas/public/functions/pie.test.js b/x-pack/plugins/canvas/public/functions/pie.test.js index b1c17463408928..5e35cc3bf523ce 100644 --- a/x-pack/plugins/canvas/public/functions/pie.test.js +++ b/x-pack/plugins/canvas/public/functions/pie.test.js @@ -5,8 +5,8 @@ * 2.0. */ -import { functionWrapper } from '../../test_helpers/function_wrapper'; import { testPie } from '../../canvas_plugin_src/functions/common/__fixtures__/test_pointseries'; +import { functionWrapper } from '../../../../../src/plugins/presentation_util/public'; import { fontStyle, grayscalePalette, diff --git a/x-pack/plugins/canvas/public/functions/plot.test.js b/x-pack/plugins/canvas/public/functions/plot.test.js index 5ed858961d7980..8dd2470ea17dcb 100644 --- a/x-pack/plugins/canvas/public/functions/plot.test.js +++ b/x-pack/plugins/canvas/public/functions/plot.test.js @@ -5,7 +5,7 @@ * 2.0. */ -import { functionWrapper } from '../../test_helpers/function_wrapper'; +import { functionWrapper } from '../../../../../src/plugins/presentation_util/public'; import { testPlot } from '../../canvas_plugin_src/functions/common/__fixtures__/test_pointseries'; import { fontStyle, diff --git a/x-pack/plugins/canvas/public/lib/elastic_outline.js b/x-pack/plugins/canvas/public/lib/elastic_outline.js deleted file mode 100644 index 7271f5b32d5478..00000000000000 --- a/x-pack/plugins/canvas/public/lib/elastic_outline.js +++ /dev/null @@ -1,2 +0,0 @@ -/* eslint-disable */ -export const elasticOutline = 'data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3Csvg%20viewBox%3D%22-3.948730230331421%20-1.7549896240234375%20245.25946044921875%20241.40370178222656%22%20width%3D%22245.25946044921875%22%20height%3D%22241.40370178222656%22%20style%3D%22enable-background%3Anew%200%200%20686.2%20235.7%3B%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cdefs%3E%0A%20%20%20%20%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%09.st0%7Bfill%3A%232D2D2D%3B%7D%0A%3C%2Fstyle%3E%0A%20%20%3C%2Fdefs%3E%0A%20%20%3Cg%20transform%3D%22matrix%281%2C%200%2C%200%2C%201%2C%200%2C%200%29%22%3E%0A%20%20%20%20%3Cg%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M329.4%2C160.3l4.7-0.5l0.3%2C9.6c-12.4%2C1.7-23%2C2.6-31.8%2C2.6c-11.7%2C0-20-3.4-24.9-10.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-4.9-6.8-7.3-17.4-7.3-31.7c0-28.6%2C11.4-42.9%2C34.1-42.9c11%2C0%2C19.2%2C3.1%2C24.6%2C9.2c5.4%2C6.1%2C8.1%2C15.8%2C8.1%2C28.9l-0.7%2C9.3h-53.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0%2C9%2C1.6%2C15.7%2C4.9%2C20c3.3%2C4.3%2C8.9%2C6.5%2C17%2C6.5C312.8%2C161.2%2C321.1%2C160.9%2C329.4%2C160.3z%20M325%2C124.9c0-10-1.6-17.1-4.8-21.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.2-4.1-8.4-6.2-15.6-6.2c-7.2%2C0-12.7%2C2.2-16.3%2C6.5c-3.6%2C4.3-5.5%2C11.3-5.6%2C20.9H325z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M354.3%2C171.4V64h12.2v107.4H354.3z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M443.5%2C113.5v41.1c0%2C4.1%2C10.1%2C3.9%2C10.1%2C3.9l-0.6%2C10.8c-8.6%2C0-15.7%2C0.7-20-3.4c-9.8%2C4.3-19.5%2C6.1-29.3%2C6.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.5%2C0-13.2-2.1-17.1-6.4c-3.9-4.2-5.9-10.3-5.9-18.3c0-7.9%2C2-13.8%2C6-17.5c4-3.7%2C10.3-6.1%2C18.9-6.9l25.6-2.4v-7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc0-5.5-1.2-9.5-3.6-11.9c-2.4-2.4-5.7-3.6-9.8-3.6l-32.1%2C0V87.2h31.3c9.2%2C0%2C15.9%2C2.1%2C20.1%2C6.4C441.4%2C97.8%2C443.5%2C104.5%2C443.5%2C113.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bz%20M393.3%2C146.7c0%2C10%2C4.1%2C15%2C12.4%2C15c7.4%2C0%2C14.7-1.2%2C21.8-3.7l3.7-1.3v-26.9l-24.1%2C2.3c-4.9%2C0.4-8.4%2C1.8-10.6%2C4.2%26%2310%3B%26%239%3B%26%239%3B%26%239%3BC394.4%2C138.7%2C393.3%2C142.2%2C393.3%2C146.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M491.2%2C98.2c-11.8%2C0-17.8%2C4.1-17.8%2C12.4c0%2C3.8%2C1.4%2C6.5%2C4.1%2C8.1c2.7%2C1.6%2C8.9%2C3.2%2C18.6%2C4.9%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc9.7%2C1.7%2C16.5%2C4%2C20.5%2C7.1c4%2C3%2C6%2C8.7%2C6%2C17.1c0%2C8.4-2.7%2C14.5-8.1%2C18.4c-5.4%2C3.9-13.2%2C5.9-23.6%2C5.9c-6.7%2C0-29.2-2.5-29.2-2.5%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bl0.7-10.6c12.9%2C1.2%2C22.3%2C2.2%2C28.6%2C2.2c6.3%2C0%2C11.1-1%2C14.4-3c3.3-2%2C5-5.4%2C5-10.1c0-4.7-1.4-7.9-4.2-9.6c-2.8-1.7-9-3.3-18.6-4.8%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-9.6-1.5-16.4-3.7-20.4-6.7c-4-2.9-6-8.4-6-16.3c0-7.9%2C2.8-13.8%2C8.4-17.6c5.6-3.8%2C12.6-5.7%2C20.9-5.7c6.6%2C0%2C29.6%2C1.7%2C29.6%2C1.7%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bv10.7C508.1%2C99%2C498.2%2C98.2%2C491.2%2C98.2z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M581.7%2C99.5h-25.9v39c0%2C9.3%2C0.7%2C15.5%2C2%2C18.4c1.4%2C2.9%2C4.6%2C4.4%2C9.7%2C4.4l14.5-1l0.8%2C10.1%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-7.3%2C1.2-12.8%2C1.8-16.6%2C1.8c-8.5%2C0-14.3-2.1-17.6-6.2c-3.3-4.1-4.9-12-4.9-23.6V99.5h-11.6V88.9h11.6V63.9h12.1v24.9h25.9V99.5z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M598.7%2C78.4V64.3h12.2v14.2H598.7z%20M598.7%2C171.4V88.9h12.2v82.5H598.7z%22%2F%3E%0A%20%20%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M663.8%2C87.2c3.6%2C0%2C9.7%2C0.7%2C18.3%2C2l3.9%2C0.5l-0.5%2C9.9c-8.7-1-15.1-1.5-19.2-1.5c-9.2%2C0-15.5%2C2.2-18.8%2C6.6%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-3.3%2C4.4-5%2C12.6-5%2C24.5c0%2C11.9%2C1.5%2C20.2%2C4.6%2C24.9c3.1%2C4.7%2C9.5%2C7%2C19.3%2C7l19.2-1.5l0.5%2C10.1c-10.1%2C1.5-17.7%2C2.3-22.7%2C2.3%26%2310%3B%26%239%3B%26%239%3B%26%239%3Bc-12.7%2C0-21.5-3.3-26.3-9.8c-4.8-6.5-7.3-17.5-7.3-33c0-15.5%2C2.6-26.4%2C7.8-32.6C643%2C90.4%2C651.7%2C87.2%2C663.8%2C87.2z%22%2F%3E%0A%20%20%20%20%3C%2Fg%3E%0A%20%20%20%20%3Cpath%20class%3D%22st0%22%20d%3D%22M236.6%2C123.5c0-19.8-12.3-37.2-30.8-43.9c0.8-4.2%2C1.2-8.4%2C1.2-12.7C207%2C30%2C177%2C0%2C140.2%2C0%26%2310%3B%26%239%3B%26%239%3BC118.6%2C0%2C98.6%2C10.3%2C86%2C27.7c-6.2-4.8-13.8-7.4-21.7-7.4c-19.6%2C0-35.5%2C15.9-35.5%2C35.5c0%2C4.3%2C0.8%2C8.5%2C2.2%2C12.4%26%2310%3B%26%239%3B%26%239%3BC12.6%2C74.8%2C0%2C92.5%2C0%2C112.2c0%2C19.9%2C12.4%2C37.3%2C30.9%2C44c-0.8%2C4.1-1.2%2C8.4-1.2%2C12.7c0%2C36.8%2C29.9%2C66.7%2C66.7%2C66.7%26%2310%3B%26%239%3B%26%239%3Bc21.6%2C0%2C41.6-10.4%2C54.1-27.8c6.2%2C4.9%2C13.8%2C7.6%2C21.7%2C7.6c19.6%2C0%2C35.5-15.9%2C35.5-35.5c0-4.3-0.8-8.5-2.2-12.4%26%2310%3B%26%239%3B%26%239%3BC223.9%2C160.9%2C236.6%2C143.2%2C236.6%2C123.5z%20M91.6%2C34.8c10.9-15.9%2C28.9-25.4%2C48.1-25.4c32.2%2C0%2C58.4%2C26.2%2C58.4%2C58.4%26%2310%3B%26%239%3B%26%239%3Bc0%2C3.9-0.4%2C7.7-1.1%2C11.5l-52.2%2C45.8L93%2C101.5L82.9%2C79.9L91.6%2C34.8z%20M65.4%2C29c6.2%2C0%2C12.1%2C2%2C17%2C5.7l-7.8%2C40.3l-35.5-8.4%26%2310%3B%26%239%3B%26%239%3Bc-1.1-3.1-1.7-6.3-1.7-9.7C37.4%2C41.6%2C49.9%2C29%2C65.4%2C29z%20M9.1%2C112.3c0-16.7%2C11-31.9%2C26.9-37.2L75%2C84.4l9.1%2C19.5l-49.8%2C45%26%2310%3B%26%239%3B%26%239%3BC19.2%2C143.1%2C9.1%2C128.6%2C9.1%2C112.3z%20M145.2%2C200.9c-10.9%2C16.1-29%2C25.6-48.4%2C25.6c-32.3%2C0-58.6-26.3-58.6-58.5c0-4%2C0.4-7.9%2C1.1-11.7%26%2310%3B%26%239%3B%26%239%3Bl50.9-46l52%2C23.7l11.5%2C22L145.2%2C200.9z%20M171.2%2C206.6c-6.1%2C0-12-2-16.9-5.8l7.7-40.2l35.4%2C8.3c1.1%2C3.1%2C1.7%2C6.3%2C1.7%2C9.7%26%2310%3B%26%239%3B%26%239%3BC199.2%2C194.1%2C186.6%2C206.6%2C171.2%2C206.6z%20M200.5%2C160.5l-39-9.1l-10.4-19.8l51-44.7c15.1%2C5.7%2C25.2%2C20.2%2C25.2%2C36.5%26%2310%3B%26%239%3B%26%239%3BC227.4%2C140.1%2C216.4%2C155.3%2C200.5%2C160.5z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E'; diff --git a/x-pack/plugins/canvas/public/style/index.scss b/x-pack/plugins/canvas/public/style/index.scss index e866eada1f85fd..aac898c3dd374b 100644 --- a/x-pack/plugins/canvas/public/style/index.scss +++ b/x-pack/plugins/canvas/public/style/index.scss @@ -45,16 +45,13 @@ @import '../components/workpad_page/workpad_static_page/workpad_static_page'; @import '../components/var_config/edit_var'; @import '../components/var_config/var_config'; - @import '../transitions/fade/fade'; @import '../transitions/rotate/rotate'; @import '../transitions/slide/slide'; @import '../transitions/zoom/zoom'; - @import '../../canvas_plugin_src/renderers/filters/advanced_filter/component/advanced_filter.scss'; @import '../../canvas_plugin_src/renderers/filters/dropdown_filter/component/dropdown_filter.scss'; @import '../../canvas_plugin_src/renderers/embeddable/embeddable.scss'; @import '../../canvas_plugin_src/renderers/plot/plot.scss'; -@import '../../canvas_plugin_src/renderers/reveal_image/reveal_image.scss'; @import '../../canvas_plugin_src/renderers/filters/time_filter/time_filter.scss'; @import '../../canvas_plugin_src/uis/arguments/image_upload/image_upload.scss'; diff --git a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js index 8ee96aeec29512..60987e987f63ac 100644 --- a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js +++ b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js @@ -9,7 +9,6 @@ import { debug } from '../canvas_plugin_src/renderers/debug'; import { error } from '../canvas_plugin_src/renderers/error'; import { image } from '../canvas_plugin_src/renderers/image'; import { repeatImage } from '../canvas_plugin_src/renderers/repeat_image'; -import { revealImage } from '../canvas_plugin_src/renderers/reveal_image'; import { markdown } from '../canvas_plugin_src/renderers/markdown'; import { metric } from '../canvas_plugin_src/renderers/metric'; import { pie } from '../canvas_plugin_src/renderers/pie'; @@ -18,6 +17,7 @@ import { progress } from '../canvas_plugin_src/renderers/progress'; import { shape } from '../canvas_plugin_src/renderers/shape'; import { table } from '../canvas_plugin_src/renderers/table'; import { text } from '../canvas_plugin_src/renderers/text'; +import { revealImageRenderer as revealImage } from '../../../../src/plugins/expression_reveal_image/public'; /** * This is a collection of renderers which are bundled with the runtime. If diff --git a/x-pack/plugins/canvas/test_helpers/function_wrapper.js b/x-pack/plugins/canvas/test_helpers/function_wrapper.js deleted file mode 100644 index d20cac18cbb54f..00000000000000 --- a/x-pack/plugins/canvas/test_helpers/function_wrapper.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { mapValues } from 'lodash'; - -// It takes a function spec and passes in default args into the spec fn -export const functionWrapper = (fnSpec, mockReduxStore) => { - const spec = fnSpec(); - const defaultArgs = mapValues(spec.args, (argSpec) => { - return argSpec.default; - }); - - return (context, args, handlers) => - spec.fn(context, { ...defaultArgs, ...args }, handlers, mockReduxStore); -}; diff --git a/x-pack/plugins/canvas/tsconfig.json b/x-pack/plugins/canvas/tsconfig.json index 487b68ba3542ba..84581d7be85a37 100644 --- a/x-pack/plugins/canvas/tsconfig.json +++ b/x-pack/plugins/canvas/tsconfig.json @@ -31,6 +31,7 @@ { "path": "../../../src/plugins/discover/tsconfig.json" }, { "path": "../../../src/plugins/embeddable/tsconfig.json" }, { "path": "../../../src/plugins/expressions/tsconfig.json" }, + { "path": "../../../src/plugins/expression_reveal_image/tsconfig.json" }, { "path": "../../../src/plugins/home/tsconfig.json" }, { "path": "../../../src/plugins/inspector/tsconfig.json" }, { "path": "../../../src/plugins/kibana_legacy/tsconfig.json" }, diff --git a/x-pack/plugins/canvas/types/renderers.ts b/x-pack/plugins/canvas/types/renderers.ts index e840ebee43ed37..2c3931485757de 100644 --- a/x-pack/plugins/canvas/types/renderers.ts +++ b/x-pack/plugins/canvas/types/renderers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; +import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; type GenericRendererCallback = (callback: () => void) => void; @@ -35,9 +35,9 @@ export interface RendererSpec { /** The render type */ name: string; /** The name to display */ - displayName: string; + displayName?: string; /** A description of what is rendered */ - help: string; + help?: string; /** Indicate whether the element should reuse the existing DOM element when re-rendering */ reuseDomNode: boolean; /** The default width of the element in pixels */ @@ -50,5 +50,7 @@ export interface RendererSpec { export type RendererFactory = () => RendererSpec; -export type AnyRendererFactory = RendererFactory; +export type AnyRendererFactory = + | RendererFactory + | Array<() => ExpressionRenderDefinition>; export type AnyRendererSpec = RendererSpec; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 69553fd53ffc57..c0c14ef4cc6eb5 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6340,15 +6340,15 @@ "xpack.canvas.functions.repeatImage.args.maxHelpText": "画像が繰り返される最高回数です。", "xpack.canvas.functions.repeatImage.args.sizeHelpText": "画像の高さまたは幅のピクセル単位での最高値です。画像が縦長の場合、この関数は高さを制限します。", "xpack.canvas.functions.repeatImageHelpText": "繰り返し画像エレメントを構成します。", + "expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "表示される背景画像です。画像アセットは「{BASE64}」データ {URL} として提供するか、部分式で渡します。", + "expressionRevealImage.functions.revealImage.args.imageHelpText": "表示する画像です。画像アセットは{BASE64}データ{URL}として提供するか、部分式で渡します。", + "expressionRevealImage.functions.revealImage.args.originHelpText": "画像で埋め始める位置です。たとえば、{list}、または {end}です。", + "expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "無効な値:「{percent}」。パーセンテージは 0 と 1 の間でなければなりません ", + "expressionRevealImage.functions.revealImageHelpText": "画像表示エレメントを構成します。", "xpack.canvas.functions.replace.args.flagsHelpText": "フラグを指定します。{url}を参照してください。", "xpack.canvas.functions.replace.args.patternHelpText": "{JS} 正規表現のテキストまたはパターンです。例:{example}。ここではキャプチャグループを使用できます。", "xpack.canvas.functions.replace.args.replacementHelpText": "文字列の一致する部分の代わりです。キャプチャグループはノードによってアクセス可能です。例:{example}。", "xpack.canvas.functions.replaceImageHelpText": "正規表現で文字列の一部を置き換えます。", - "xpack.canvas.functions.revealImage.args.emptyImageHelpText": "表示される背景画像です。画像アセットは「{BASE64}」データ {URL} として提供するか、部分式で渡します。", - "xpack.canvas.functions.revealImage.args.imageHelpText": "表示する画像です。画像アセットは{BASE64}データ{URL}として提供するか、部分式で渡します。", - "xpack.canvas.functions.revealImage.args.originHelpText": "画像で埋め始める位置です。たとえば、{list}、または {end}です。", - "xpack.canvas.functions.revealImage.invalidPercentErrorMessage": "無効な値:「{percent}」。パーセンテージは 0 と 1 の間でなければなりません ", - "xpack.canvas.functions.revealImageHelpText": "画像表示エレメントを構成します。", "xpack.canvas.functions.rounddate.args.formatHelpText": "バケットに使用する{MOMENTJS}フォーマットです。たとえば、{example}は月単位に端数処理されます。{url}を参照してください。", "xpack.canvas.functions.rounddateHelpText": "新世紀からのミリ秒の繰り上げ・繰り下げに {MOMENTJS} を使用し、新世紀からのミリ秒を戻します。", "xpack.canvas.functions.rowCountHelpText": "行数を返します。{plyFn}と組み合わせて、固有の列値の数、または固有の列値の組み合わせを求めます。", @@ -6543,8 +6543,8 @@ "xpack.canvas.renderer.progress.helpDescription": "エレメントのパーセンテージを示す進捗インジケーターをレンダリングします", "xpack.canvas.renderer.repeatImage.displayName": "画像の繰り返し", "xpack.canvas.renderer.repeatImage.helpDescription": "画像を指定回数繰り返し表示します", - "xpack.canvas.renderer.revealImage.displayName": "画像の部分表示", - "xpack.canvas.renderer.revealImage.helpDescription": "カスタムゲージスタイルチャートを作成するため、画像のパーセンテージを表示します", + "expressionRevealImage.renderer.revealImage.displayName": "画像の部分表示", + "expressionRevealImage.renderer.revealImage.helpDescription": "カスタムゲージスタイルチャートを作成するため、画像のパーセンテージを表示します", "xpack.canvas.renderer.shape.displayName": "形状", "xpack.canvas.renderer.shape.helpDescription": "基本的な図形をレンダリングします", "xpack.canvas.renderer.table.displayName": "データテーブル", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 261f68c2e629a2..68bd84f6ae757f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6383,13 +6383,13 @@ "xpack.canvas.functions.replace.args.flagsHelpText": "指定标志。请参见 {url}。", "xpack.canvas.functions.replace.args.patternHelpText": "{JS} 正则表达式的文本或模式。例如,{example}。您可以在此处使用捕获组。", "xpack.canvas.functions.replace.args.replacementHelpText": "字符串匹配部分的替代。捕获组可以通过其索引进行访问。例如,{example}。", - "xpack.canvas.functions.replaceImageHelpText": "使用正则表达式替换字符串的各部分。", - "xpack.canvas.functions.revealImage.args.emptyImageHelpText": "要显示的可选背景图像。以 `{BASE64}` 数据 {URL} 的形式提供图像资产或传入子表达式。", - "xpack.canvas.functions.revealImage.args.imageHelpText": "要显示的图像。以 {BASE64} 数据 {URL} 的形式提供图像资产或传入子表达式。", - "xpack.canvas.functions.revealImage.args.originHelpText": "要开始图像填充的位置。例如 {list} 或 {end}。", - "xpack.canvas.functions.revealImage.invalidPercentErrorMessage": "无效值:“{percent}”。百分比必须介于 0 和 1 之间", - "xpack.canvas.functions.revealImageHelpText": "配置图像显示元素。", "xpack.canvas.functions.rounddate.args.formatHelpText": "用于存储桶存储的 {MOMENTJS} 格式。例如,{example} 四舍五入到月份。请参见 {url}。", + "xpack.canvas.functions.replaceImageHelpText": "使用正则表达式替换字符串的各部分。", + "expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "要显示的可选背景图像。以 `{BASE64}` 数据 {URL} 的形式提供图像资产或传入子表达式。", + "expressionRevealImage.functions.revealImage.args.imageHelpText": "要显示的图像。以 {BASE64} 数据 {URL} 的形式提供图像资产或传入子表达式。", + "expressionRevealImage.functions.revealImage.args.originHelpText": "要开始图像填充的位置。例如 {list} 或 {end}。", + "expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "无效值:“{percent}”。百分比必须介于 0 和 1 之间", + "expressionRevealImage.functions.revealImageHelpText": "配置图像显示元素。", "xpack.canvas.functions.rounddateHelpText": "使用 {MOMENTJS} 格式字符串舍入自 Epoch 起毫秒数,并返回自 Epoch 起毫秒数。", "xpack.canvas.functions.rowCountHelpText": "返回行数。与 {plyFn} 搭配使用,可获取唯一列值的计数或唯一列值的组合。", "xpack.canvas.functions.savedLens.args.idHelpText": "已保存 Lens 可视化对象的 ID", @@ -6583,8 +6583,8 @@ "xpack.canvas.renderer.progress.helpDescription": "呈现显示元素百分比的进度指示", "xpack.canvas.renderer.repeatImage.displayName": "图像重复", "xpack.canvas.renderer.repeatImage.helpDescription": "重复图像给定次数", - "xpack.canvas.renderer.revealImage.displayName": "图像显示", - "xpack.canvas.renderer.revealImage.helpDescription": "显示一定百分比的图像,以制作定制的仪表样式图表", + "expressionRevealImage.renderer.revealImage.displayName": "图像显示", + "expressionRevealImage.renderer.revealImage.helpDescription": "显示一定百分比的图像,以制作定制的仪表样式图表", "xpack.canvas.renderer.shape.displayName": "形状", "xpack.canvas.renderer.shape.helpDescription": "呈现基本形状", "xpack.canvas.renderer.table.displayName": "数据表", From 2f25c26abccfd0ab54073cb186c6e0a6e9c8af09 Mon Sep 17 00:00:00 2001 From: Michael Olorunnisola Date: Thu, 1 Jul 2021 07:33:42 -0400 Subject: [PATCH 06/43] [Security Solution] External alerts and Modal bug fix (#103933) --- .../public/common/mock/global_state.ts | 4 +- .../hosts/pages/details/details_tabs.test.tsx | 13 +- .../public/hosts/store/helpers.test.ts | 24 +- .../public/hosts/store/model.ts | 2 +- .../__snapshots__/index.test.tsx.snap | 253 +----------------- .../timelines/components/side_panel/index.tsx | 15 +- 6 files changed, 32 insertions(+), 279 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 316f8b6214d1e7..ffbfd1a5123ad5 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -59,7 +59,7 @@ export const mockGlobalState: State = { events: { activePage: 0, limit: 10 }, uncommonProcesses: { activePage: 0, limit: 10 }, anomalies: null, - alerts: { activePage: 0, limit: 10 }, + externalAlerts: { activePage: 0, limit: 10 }, }, }, details: { @@ -74,7 +74,7 @@ export const mockGlobalState: State = { events: { activePage: 0, limit: 10 }, uncommonProcesses: { activePage: 0, limit: 10 }, anomalies: null, - alerts: { activePage: 0, limit: 10 }, + externalAlerts: { activePage: 0, limit: 10 }, }, }, }, diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx b/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx index 3b76ec8a0d13f5..5be29a94b53308 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/details_tabs.test.tsx @@ -18,6 +18,7 @@ import { hostDetailsPagePath } from '../types'; import { type } from './utils'; import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { getHostDetailsPageFilters } from './helpers'; +import { HostsTableType } from '../../store/model'; jest.mock('../../../common/lib/kibana'); @@ -51,12 +52,12 @@ mockUseResizeObserver.mockImplementation(() => ({})); describe('body', () => { const scenariosMap = { - authentications: 'AuthenticationsQueryTabBody', - allHosts: 'HostsQueryTabBody', - uncommonProcesses: 'UncommonProcessQueryTabBody', - anomalies: 'AnomaliesQueryTabBody', - events: 'EventsQueryTabBody', - alerts: 'HostAlertsQueryTabBody', + [HostsTableType.authentications]: 'AuthenticationsQueryTabBody', + [HostsTableType.hosts]: 'HostsQueryTabBody', + [HostsTableType.uncommonProcesses]: 'UncommonProcessQueryTabBody', + [HostsTableType.anomalies]: 'AnomaliesQueryTabBody', + [HostsTableType.events]: 'EventsQueryTabBody', + [HostsTableType.alerts]: 'HostAlertsQueryTabBody', }; const mockHostDetailsPageFilters = getHostDetailsPageFilters('host-1'); diff --git a/x-pack/plugins/security_solution/public/hosts/store/helpers.test.ts b/x-pack/plugins/security_solution/public/hosts/store/helpers.test.ts index c9dcc3a60b4a93..8c3a3e27ffb38b 100644 --- a/x-pack/plugins/security_solution/public/hosts/store/helpers.test.ts +++ b/x-pack/plugins/security_solution/public/hosts/store/helpers.test.ts @@ -71,26 +71,26 @@ describe('Hosts redux store', () => { describe('#setHostsQueriesActivePageToZero', () => { test('set activePage to zero for all queries in hosts page ', () => { expect(setHostsQueriesActivePageToZero(mockHostsState, HostsType.page)).toEqual({ - allHosts: { + [HostsTableType.hosts]: { activePage: 0, direction: 'desc', limit: 10, sortField: 'lastSeen', }, - anomalies: null, - authentications: { + [HostsTableType.anomalies]: null, + [HostsTableType.authentications]: { activePage: 0, limit: 10, }, - events: { + [HostsTableType.events]: { activePage: 0, limit: 10, }, - uncommonProcesses: { + [HostsTableType.uncommonProcesses]: { activePage: 0, limit: 10, }, - alerts: { + [HostsTableType.alerts]: { activePage: 0, limit: 10, }, @@ -99,26 +99,26 @@ describe('Hosts redux store', () => { test('set activePage to zero for all queries in host details ', () => { expect(setHostsQueriesActivePageToZero(mockHostsState, HostsType.details)).toEqual({ - allHosts: { + [HostsTableType.hosts]: { activePage: 0, direction: 'desc', limit: 10, sortField: 'lastSeen', }, - anomalies: null, - authentications: { + [HostsTableType.anomalies]: null, + [HostsTableType.authentications]: { activePage: 0, limit: 10, }, - events: { + [HostsTableType.events]: { activePage: 0, limit: 10, }, - uncommonProcesses: { + [HostsTableType.uncommonProcesses]: { activePage: 0, limit: 10, }, - alerts: { + [HostsTableType.alerts]: { activePage: 0, limit: 10, }, diff --git a/x-pack/plugins/security_solution/public/hosts/store/model.ts b/x-pack/plugins/security_solution/public/hosts/store/model.ts index 2060d462067231..ea168e965fa233 100644 --- a/x-pack/plugins/security_solution/public/hosts/store/model.ts +++ b/x-pack/plugins/security_solution/public/hosts/store/model.ts @@ -19,7 +19,7 @@ export enum HostsTableType { events = 'events', uncommonProcesses = 'uncommonProcesses', anomalies = 'anomalies', - alerts = 'alerts', + alerts = 'externalAlerts', } export interface BasicQueryPaginated { diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap index 06db698a91a6da..edf1a50787a578 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/__snapshots__/index.test.tsx.snap @@ -241,248 +241,14 @@ exports[`Details Panel Component DetailsPanel:EventDetails: rendering it should exports[`Details Panel Component DetailsPanel:EventDetails: rendering it should render the Event Details view of the Details Panel in the flyout when the panelView is eventDetail and the eventId is set 1`] = ` Array [ - .c1 { - -webkit-flex: 0 1 auto; - -ms-flex: 0 1 auto; - flex: 0 1 auto; - margin-top: 8px; -} - -.c2 .euiFlyoutBody__overflow { - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; -} - -.c2 .euiFlyoutBody__overflow .euiFlyoutBody__overflowContent { - -webkit-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: hidden; - padding: 4px 16px 50px; -} - -.c0 { - z-index: 7000; -} - - - -
-
-
-
, - .c1 { + .c0 { -webkit-flex: 0 1 auto; -ms-flex: 0 1 auto; flex: 0 1 auto; margin-top: 8px; } -.c2 .euiFlyoutBody__overflow { +.c1 .euiFlyoutBody__overflow { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; @@ -493,7 +259,7 @@ Array [ overflow: hidden; } -.c2 .euiFlyoutBody__overflow .euiFlyoutBody__overflowContent { +.c1 .euiFlyoutBody__overflow .euiFlyoutBody__overflowContent { -webkit-flex: 1; -ms-flex: 1; flex: 1; @@ -501,12 +267,7 @@ Array [ padding: 4px 16px 50px; } -.c0 { - z-index: 7000; -} -
= styled( - EuiFlyout -)` - z-index: ${({ theme }) => theme.eui.euiZLevel7}; -`; - interface DetailsPanelProps { browserFields: BrowserFields; docValueFields: DocValueFields[]; @@ -113,14 +104,14 @@ export const DetailsPanel = React.memo( } return isFlyoutView ? ( - {visiblePanel} - + ) : ( visiblePanel ); From 16da1a6dbeed0b63409c3cd259f4ffeef738c4df Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Thu, 1 Jul 2021 08:13:17 -0400 Subject: [PATCH 07/43] Adding alerts and connectors so to import between versions test (#103968) * adding alerts and connectors to import/export test * removing beforeEach Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../_7.14_import_alerts_actions.ndjson | 24 +++++++++++++++++++ .../import_saved_objects_between_versions.ts | 18 +++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 x-pack/test/functional/apps/saved_objects_management/exports/_7.14_import_alerts_actions.ndjson diff --git a/x-pack/test/functional/apps/saved_objects_management/exports/_7.14_import_alerts_actions.ndjson b/x-pack/test/functional/apps/saved_objects_management/exports/_7.14_import_alerts_actions.ndjson new file mode 100644 index 00000000000000..f0215db3cda694 --- /dev/null +++ b/x-pack/test/functional/apps/saved_objects_management/exports/_7.14_import_alerts_actions.ndjson @@ -0,0 +1,24 @@ +{"attributes":{"actionTypeId":".server-log","config":{},"isMissingSecrets":false,"name":"Monitoring: Write to Kibana log"},"coreMigrationVersion":"7.14.0","id":"f1cf69c0-d9a7-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:34:50.470Z","version":"WzEzODksMV0="} +{"attributes":{"actionTypeId":".email","config":{"from":"user2@company.com","hasAuth":true,"host":"securehost","port":465,"secure":null,"service":null},"isMissingSecrets":true,"name":"email connector with auth"},"coreMigrationVersion":"7.14.0","id":"7eec9570-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:10:09.234Z","version":"WzI2LDFd"} +{"attributes":{"actionTypeId":".resilient","config":{"apiUrl":"https://resilienttest","orgId":"test"},"isMissingSecrets":true,"name":"ibm resilient connector"},"coreMigrationVersion":"7.14.0","id":"8e08afd0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:10:34.583Z","version":"WzI3LDFd"} +{"attributes":{"actionTypeId":".email","config":{"from":"user@company.com","hasAuth":false,"host":"host","port":22,"secure":null,"service":null},"isMissingSecrets":false,"name":"email connector no auth"},"coreMigrationVersion":"7.14.0","id":"711e30c0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:09:46.078Z","version":"WzI1LDFd"} +{"attributes":{"actionTypeId":".index","config":{"executionTimeField":null,"index":"test-index","refresh":false},"isMissingSecrets":false,"name":"index connector"},"coreMigrationVersion":"7.14.0","id":"95d329c0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:10:47.653Z","version":"WzI5LDFd"} +{"attributes":{"actionTypeId":".webhook","config":{"hasAuth":true,"headers":null,"method":"post","url":"https://webhook"},"isMissingSecrets":true,"name":"webhook with auth"},"coreMigrationVersion":"7.14.0","id":"07f32aa0-d9a5-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:13:59.125Z","version":"WzM5LDFd"} +{"attributes":{"actionTypeId":".servicenow-sir","config":{"apiUrl":"https://servicenowtestsecops"},"isMissingSecrets":true,"name":"servicenow secops connector"},"coreMigrationVersion":"7.14.0","id":"ca974fb0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:12:16.181Z","version":"WzM1LDFd"} +{"attributes":{"actionTypeId":".servicenow","config":{"apiUrl":"https://servicenowtest"},"isMissingSecrets":true,"name":"servicenow itsm connector"},"coreMigrationVersion":"7.14.0","id":"be5c5c40-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:11:55.662Z","version":"WzM0LDFd"} +{"attributes":{"actionTypeId":".webhook","config":{"hasAuth":false,"headers":null,"method":"post","url":"https://openwebhook"},"isMissingSecrets":false,"name":"webhook no auth"},"coreMigrationVersion":"7.14.0","id":"ff8c70b0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:13:45.031Z","version":"WzM3LDFd"} +{"attributes":{"actionTypeId":".pagerduty","config":{"apiUrl":""},"isMissingSecrets":true,"name":"pagerduty connector"},"coreMigrationVersion":"7.14.0","id":"b0bc3380-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:11:32.802Z","version":"WzMyLDFd"} +{"attributes":{"actionTypeId":".jira","config":{"apiUrl":"https://testjira","projectKey":"myproject"},"isMissingSecrets":true,"name":"jira connector"},"coreMigrationVersion":"7.14.0","id":"a081d7e0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:11:05.577Z","version":"WzMwLDFd"} +{"attributes":{"actionTypeId":".server-log","config":{},"isMissingSecrets":false,"name":"server log connector"},"coreMigrationVersion":"7.14.0","id":"b5442ca0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:11:40.404Z","version":"WzMzLDFd"} +{"attributes":{"actionTypeId":".teams","config":{},"isMissingSecrets":true,"name":"teams connector"},"coreMigrationVersion":"7.14.0","id":"a94be780-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:11:20.321Z","version":"WzMxLDFd"} +{"attributes":{"actionTypeId":".slack","config":{},"isMissingSecrets":true,"name":"slack connector"},"coreMigrationVersion":"7.14.0","id":"d6d1cdf0-d9a4-11eb-881a-218d2e96295d","migrationVersion":{"action":"7.14.0"},"references":[],"type":"action","updated_at":"2021-06-30T13:12:36.697Z","version":"WzM2LDFd"} +{"attributes":{"actions":[],"alertTypeId":".geo-containment","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:30:28.418Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"geo rule","notifyWhen":"onActionGroupChange","params":{"boundaryGeoField":"coordinates","boundaryIndexId":"c2a20a50-d9a6-11eb-881a-218d2e96295d","boundaryIndexTitle":"manhattan_boundaries","boundaryNameField":"","boundaryType":"entireIndex","dateField":"@timestamp","entity":"azimuth","geoField":"location","index":"tracks*","indexId":"f653fcf0-d9a6-11eb-881a-218d2e96295d"},"schedule":{"interval":"5m"},"scheduledTaskId":null,"tags":["manhattan"],"throttle":null,"updatedAt":"2021-06-30T13:30:28.418Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"55626650-d9a7-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[],"type":"alert","updated_at":"2021-06-30T13:40:37.967Z","version":"WzE1MDksMV0="} +{"attributes":{"actions":[],"alertTypeId":"logs.alert.document.count","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:20:56.718Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"logs threshold rule","notifyWhen":"onActiveAlert","params":{"count":{"comparator":"more than","value":75},"criteria":[{"comparator":"equals","field":"host.keyword","value":"host1"}],"timeSize":5,"timeUnit":"m"},"schedule":{"interval":"1m"},"scheduledTaskId":null,"tags":["logs","test"],"throttle":null,"updatedAt":"2021-06-30T13:20:56.718Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"00b51cc0-d9a6-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[],"type":"alert","updated_at":"2021-06-30T13:42:01.071Z","version":"WzE1MjYsMV0="} +{"attributes":{"actions":[{"actionRef":"action_0","actionTypeId":".server-log","group":"query matched","params":{"level":"info","message":"Elasticsearch query alert '{{alertName}}' is active:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}"}}],"alertTypeId":".es-query","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:19:13.441Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"es query rule","notifyWhen":"onActionGroupChange","params":{"esQuery":"{\n \"query\":{\n \"match_all\" : {}\n }\n}","index":[".kibana"],"size":100,"threshold":[1000],"thresholdComparator":">","timeField":"updated_at","timeWindowSize":5,"timeWindowUnit":"m"},"schedule":{"interval":"1m"},"scheduledTaskId":null,"tags":["es","query"],"throttle":null,"updatedAt":"2021-06-30T13:19:13.441Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"c3172fc0-d9a5-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[{"id":"b5442ca0-d9a4-11eb-881a-218d2e96295d","name":"action_0","type":"action"}],"type":"alert","updated_at":"2021-06-30T13:41:19.057Z","version":"WzE1MjAsMV0="} +{"attributes":{"actions":[],"alertTypeId":"xpack.uptime.alerts.monitorStatus","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:22:48.241Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"uptime status","notifyWhen":"onActiveAlert","params":{"availability":{"range":30,"rangeUnit":"d","threshold":"99"},"numTimes":5,"search":"","shouldCheckAvailability":true,"shouldCheckStatus":true,"timerangeCount":15,"timerangeUnit":"m"},"schedule":{"interval":"1d"},"scheduledTaskId":null,"tags":[],"throttle":null,"updatedAt":"2021-06-30T13:22:48.241Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"432dddd0-d9a6-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[],"type":"alert","updated_at":"2021-06-30T13:22:51.893Z","version":"WzEwMywxXQ=="} +{"attributes":{"actions":[],"alertTypeId":"metrics.alert.threshold","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:22:25.161Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"metric threshold rule","notifyWhen":"onActionGroupChange","params":{"criteria":[{"aggType":"avg","comparator":">","metric":"_score","threshold":[0.5],"timeSize":1,"timeUnit":"m"}],"sourceId":"default"},"schedule":{"interval":"1h"},"scheduledTaskId":null,"tags":[],"throttle":null,"updatedAt":"2021-06-30T13:22:25.161Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"34dba320-d9a6-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[],"type":"alert","updated_at":"2021-06-30T13:22:27.874Z","version":"Wzk5LDFd"} +{"attributes":{"actions":[],"alertTypeId":"xpack.uptime.alerts.tlsCertificate","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:23:14.340Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"tls rule","notifyWhen":"onThrottleInterval","params":{},"schedule":{"interval":"1d"},"scheduledTaskId":null,"tags":["certificate"],"throttle":"1h","updatedAt":"2021-06-30T13:23:14.340Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"52990290-d9a6-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[],"type":"alert","updated_at":"2021-06-30T13:23:15.928Z","version":"WzEwNywxXQ=="} +{"attributes":{"actions":[{"actionRef":"action_0","actionTypeId":".index","group":"metrics.inventory_threshold.fired","params":{"documents":[{"alert_triggered":"{{rule.id}}"}]}}],"alertTypeId":"metrics.alert.inventory.threshold","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:21:53.897Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"inventory rule","notifyWhen":"onActionGroupChange","params":{"criteria":[{"comparator":">","customMetric":{"aggregation":"avg","field":"","id":"alert-custom-metric","type":"custom"},"metric":"cpu","threshold":[90],"timeSize":1,"timeUnit":"m"}],"nodeType":"host","sourceId":"default"},"schedule":{"interval":"10m"},"scheduledTaskId":null,"tags":["inventory"],"throttle":null,"updatedAt":"2021-06-30T13:21:53.897Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"22e0f9e0-d9a6-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[{"id":"95d329c0-d9a4-11eb-881a-218d2e96295d","name":"action_0","type":"action"}],"type":"alert","updated_at":"2021-06-30T13:42:01.078Z","version":"WzE1MjcsMV0="} +{"attributes":{"actions":[{"actionRef":"action_0","actionTypeId":".server-log","group":"anomaly_score_match","params":{"level":"info","message":"Elastic Stack Machine Learning Alert:\n- Job IDs: {{context.jobIds}}\n- Time: {{context.timestampIso8601}}\n- Anomaly score: {{context.score}}\n\n{{context.message}}\n\n{{#context.topInfluencers.length}}\n Top influencers:\n {{#context.topInfluencers}}\n {{influencer_field_name}} = {{influencer_field_value}} [{{score}}]\n {{/context.topInfluencers}}\n{{/context.topInfluencers.length}}\n\n{{#context.topRecords.length}}\n Top records:\n {{#context.topRecords}}\n {{function}}({{field_name}}) {{by_field_value}} {{over_field_value}} {{partition_field_value}} [{{score}}]\n {{/context.topRecords}}\n{{/context.topRecords.length}}\n\n{{! Replace kibanaBaseUrl if not configured in Kibana }}\n[Open in Anomaly Explorer]({{{kibanaBaseUrl}}}{{{context.anomalyExplorerUrl}}})\n"}}],"alertTypeId":"xpack.ml.anomaly_detection_alert","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:32:13.689Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"ecommerce ml","notifyWhen":"onActionGroupChange","params":{"includeInterim":false,"jobSelection":{"groupIds":[],"jobIds":["high_sum_total_sales"]},"lookbackInterval":null,"resultType":"bucket","severity":75,"topNBuckets":null},"schedule":{"interval":"1h"},"scheduledTaskId":null,"tags":[],"throttle":null,"updatedAt":"2021-06-30T13:32:13.689Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"93ea6530-d9a7-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[{"id":"b5442ca0-d9a4-11eb-881a-218d2e96295d","name":"action_0","type":"action"}],"type":"alert","updated_at":"2021-06-30T13:32:15.978Z","version":"WzI0NiwxXQ=="} +{"attributes":{"actions":[{"actionRef":"action_0","actionTypeId":".email","group":"threshold met","params":{"message":"alert '{{alertName}}' is active for group '{{context.group}}':\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}","subject":"alert fired!","to":["user@company.com"]}},{"actionRef":"action_1","actionTypeId":".email","group":"threshold met","params":{"message":"alert '{{alertName}}' is active for group '{{context.group}}':\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}","subject":"alert triggered!","to":["user2@company.com"]}},{"actionRef":"action_2","actionTypeId":".index","group":"threshold met","params":{"documents":[{"alert_triggered":"{{rule.id}}"}]}},{"actionRef":"action_3","actionTypeId":".teams","group":"threshold met","params":{"message":"alert '{{alertName}}' is active for group '{{context.group}}':\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}"}},{"actionRef":"action_4","actionTypeId":".pagerduty","group":"threshold met","params":{"dedupKey":"{{rule.id}}:{{alert.id}}","eventAction":"trigger","summary":"triggered"}},{"actionRef":"action_5","actionTypeId":".server-log","group":"threshold met","params":{"level":"info","message":"alert '{{alertName}}' is active for group '{{context.group}}':\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}"}},{"actionRef":"action_6","actionTypeId":".slack","group":"threshold met","params":{"message":"alert '{{alertName}}' is active for group '{{context.group}}':\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}"}},{"actionRef":"action_7","actionTypeId":".webhook","group":"threshold met","params":{"body":"{\n \"alert_triggered\": \"{{rule.id}}\"\n}"}},{"actionRef":"action_8","actionTypeId":".webhook","group":"threshold met","params":{"body":"{\n \"alert_triggered\": \"{{rule.id}}\"\n}"}}],"alertTypeId":".index-threshold","apiKey":null,"apiKeyOwner":null,"consumer":"alerts","createdAt":"2021-06-30T13:18:16.273Z","createdBy":"elastic","enabled":false,"executionStatus":{"error":null,"lastExecutionDate":"2021-06-30T13:42:03.746Z","status":"pending"},"meta":{"versionApiKeyLastmodified":"8.0.0"},"muteAll":false,"mutedInstanceIds":[],"name":"index threshold rule with actions","notifyWhen":"onActionGroupChange","params":{"aggType":"count","groupBy":"all","index":[".kibana"],"termSize":5,"threshold":[1000],"thresholdComparator":">","timeField":"updated_at","timeWindowSize":5,"timeWindowUnit":"m"},"schedule":{"interval":"1m"},"scheduledTaskId":null,"tags":[],"throttle":null,"updatedAt":"2021-06-30T13:41:45.350Z","updatedBy":"elastic"},"coreMigrationVersion":"7.14.0","id":"a0bfd5d0-d9a5-11eb-881a-218d2e96295d","migrationVersion":{"alert":"7.13.0"},"references":[{"id":"711e30c0-d9a4-11eb-881a-218d2e96295d","name":"action_0","type":"action"},{"id":"7eec9570-d9a4-11eb-881a-218d2e96295d","name":"action_1","type":"action"},{"id":"95d329c0-d9a4-11eb-881a-218d2e96295d","name":"action_2","type":"action"},{"id":"a94be780-d9a4-11eb-881a-218d2e96295d","name":"action_3","type":"action"},{"id":"b0bc3380-d9a4-11eb-881a-218d2e96295d","name":"action_4","type":"action"},{"id":"b5442ca0-d9a4-11eb-881a-218d2e96295d","name":"action_5","type":"action"},{"id":"d6d1cdf0-d9a4-11eb-881a-218d2e96295d","name":"action_6","type":"action"},{"id":"ff8c70b0-d9a4-11eb-881a-218d2e96295d","name":"action_7","type":"action"},{"id":"07f32aa0-d9a5-11eb-881a-218d2e96295d","name":"action_8","type":"action"}],"type":"alert","updated_at":"2021-06-30T13:41:45.359Z","version":"WzE1MjQsMV0="} +{"excludedObjects":[{"id":"f27594d0-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f2756dc0-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f2751fa0-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f275bbe0-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"bf522690-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f2771b70-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f276f460-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f274f890-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f27594d1-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f276cd50-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f274aa70-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f27546b0-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f27546b1-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f274d180-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"},{"id":"f2774280-d9a7-11eb-881a-218d2e96295d","reason":"excluded","type":"alert"}],"excludedObjectsCount":15,"exportedCount":23,"missingRefCount":0,"missingReferences":[]} diff --git a/x-pack/test/functional/apps/saved_objects_management/import_saved_objects_between_versions.ts b/x-pack/test/functional/apps/saved_objects_management/import_saved_objects_between_versions.ts index 47fc2b756e8e86..427e42b7b7a657 100644 --- a/x-pack/test/functional/apps/saved_objects_management/import_saved_objects_between_versions.ts +++ b/x-pack/test/functional/apps/saved_objects_management/import_saved_objects_between_versions.ts @@ -21,7 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); describe('Export import saved objects between versions', function () { - beforeEach(async function () { + before(async function () { await esArchiver.load('x-pack/test/functional/es_archives/logstash_functional'); await esArchiver.load('x-pack/test/functional/es_archives/getting_started/shakespeare'); await kibanaServer.uiSettings.replace({}); @@ -50,5 +50,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // verifying the count of saved objects after importing .ndjson await expect(importedSavedObjects).to.be('Export 88 objects'); }); + + it('should be able to import alerts and actions saved objects from 7.14 into 8.0.0', async function () { + await retry.tryForTime(10000, async () => { + const existingSavedObjects = await testSubjects.getVisibleText('exportAllObjects'); + // Kibana always has 1 advanced setting as a saved object + await expect(existingSavedObjects).to.be('Export 88 objects'); + }); + await PageObjects.savedObjects.importFile( + path.join(__dirname, 'exports', '_7.14_import_alerts_actions.ndjson') + ); + await PageObjects.savedObjects.checkImportSucceeded(); + await PageObjects.savedObjects.clickImportDone(); + const importedSavedObjects = await testSubjects.getVisibleText('exportAllObjects'); + // verifying the count of saved objects after importing .ndjson + await expect(importedSavedObjects).to.be('Export 111 objects'); + }); }); } From 5df129aaad941639ff2246ec0864674349437c1e Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 1 Jul 2021 08:39:44 -0400 Subject: [PATCH 08/43] [Upgrade Assistant] Auto upgrade ML job model snapshots (#100066) --- .../client_integration/cluster.test.ts | 360 +++++++++++++++++ .../helpers/cluster.helpers.ts | 67 ++++ .../helpers/http_requests.ts | 24 ++ .../client_integration/helpers/index.ts | 1 + .../helpers/setup_environment.tsx | 1 - .../client_integration/indices.test.ts | 12 +- .../client_integration/overview.test.ts | 1 - .../plugins/upgrade_assistant/common/types.ts | 32 +- x-pack/plugins/upgrade_assistant/kibana.json | 2 +- .../public/application/app_context.tsx | 1 - .../es_deprecations/deprecations/cell.tsx | 83 ++-- .../deprecations/index_table.test.tsx | 18 +- .../deprecations/index_table.tsx | 20 +- .../deprecations/list.test.tsx | 8 +- .../es_deprecations/deprecations/list.tsx | 14 +- .../deprecations/ml_snapshots/button.tsx | 125 ++++++ .../ml_snapshots/fix_snapshots_flyout.tsx | 181 +++++++++ .../deprecations/ml_snapshots/index.ts | 8 + .../ml_snapshots/use_snapshot_state.tsx | 151 ++++++++ .../deprecations/reindex/button.tsx | 8 +- .../deprecations/reindex/flyout/container.tsx | 4 +- .../public/application/lib/api.ts | 32 ++ .../application/mount_management_section.ts | 2 - .../upgrade_assistant/public/plugin.ts | 6 +- .../lib/__fixtures__/fake_deprecations.json | 35 +- .../es_migration_apis.test.ts.snap | 75 +++- .../server/lib/es_migration_apis.test.ts | 39 +- .../server/lib/es_migration_apis.ts | 125 +++--- .../upgrade_assistant/server/plugin.ts | 26 +- .../server/routes/__mocks__/routes.mock.ts | 1 + .../server/routes/cluster_checkup.test.ts | 21 - .../server/routes/cluster_checkup.ts | 6 +- .../server/routes/ml_snapshots.test.ts | 365 ++++++++++++++++++ .../server/routes/ml_snapshots.ts | 348 +++++++++++++++++ .../server/routes/register_routes.ts | 25 ++ .../server/saved_object_types/index.ts | 1 + .../ml_upgrade_operation_saved_object_type.ts | 56 +++ .../server/shared_imports.ts | 8 + .../plugins/upgrade_assistant/server/types.ts | 2 - .../plugins/upgrade_assistant/tsconfig.json | 2 +- 40 files changed, 2081 insertions(+), 215 deletions(-) create mode 100644 x-pack/plugins/upgrade_assistant/__jest__/client_integration/cluster.test.ts create mode 100644 x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/cluster.helpers.ts create mode 100644 x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/button.tsx create mode 100644 x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/fix_snapshots_flyout.tsx create mode 100644 x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/index.ts create mode 100644 x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/use_snapshot_state.tsx create mode 100644 x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.test.ts create mode 100644 x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.ts create mode 100644 x-pack/plugins/upgrade_assistant/server/routes/register_routes.ts create mode 100644 x-pack/plugins/upgrade_assistant/server/saved_object_types/ml_upgrade_operation_saved_object_type.ts create mode 100644 x-pack/plugins/upgrade_assistant/server/shared_imports.ts diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/cluster.test.ts b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/cluster.test.ts new file mode 100644 index 00000000000000..412ce348d56e35 --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/cluster.test.ts @@ -0,0 +1,360 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { act } from 'react-dom/test-utils'; +import { MlAction, UpgradeAssistantStatus } from '../../common/types'; + +import { ClusterTestBed, setupClusterPage, setupEnvironment } from './helpers'; + +describe('Cluster tab', () => { + let testBed: ClusterTestBed; + const { server, httpRequestsMockHelpers } = setupEnvironment(); + + afterAll(() => { + server.restore(); + }); + + describe('with deprecations', () => { + const snapshotId = '1'; + const jobId = 'deprecation_check_job'; + const upgradeStatusMockResponse: UpgradeAssistantStatus = { + readyForUpgrade: false, + cluster: [ + { + level: 'critical', + message: + 'model snapshot [1] for job [deprecation_check_job] needs to be deleted or upgraded', + details: + 'model snapshot [%s] for job [%s] supports minimum version [%s] and needs to be at least [%s]', + url: 'doc_url', + correctiveAction: { + type: 'mlSnapshot', + snapshotId, + jobId, + }, + }, + ], + indices: [], + }; + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(upgradeStatusMockResponse); + httpRequestsMockHelpers.setLoadDeprecationLoggingResponse({ isEnabled: true }); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { actions, component } = testBed; + + component.update(); + + // Navigate to the cluster tab + await act(async () => { + actions.clickTab('cluster'); + }); + + component.update(); + }); + + test('renders deprecations', () => { + const { exists } = testBed; + expect(exists('clusterTabContent')).toBe(true); + expect(exists('deprecationsContainer')).toBe(true); + }); + + describe('fix ml snapshots button', () => { + let flyout: Element | null; + + beforeEach(async () => { + const { component, actions, exists, find } = testBed; + + expect(exists('deprecationsContainer')).toBe(true); + + // Open all deprecations + actions.clickExpandAll(); + + // The data-test-subj is derived from the deprecation message + const accordionTestSubj = `depgroup_${upgradeStatusMockResponse.cluster[0].message + .split(' ') + .join('_')}`; + + await act(async () => { + find(`${accordionTestSubj}.fixMlSnapshotsButton`).simulate('click'); + }); + + component.update(); + + // We need to read the document "body" as the flyout is added there and not inside + // the component DOM tree. + flyout = document.body.querySelector('[data-test-subj="fixSnapshotsFlyout"]'); + + expect(flyout).not.toBe(null); + expect(flyout!.textContent).toContain('Upgrade or delete model snapshot'); + }); + + test('upgrades snapshots', async () => { + const { component } = testBed; + + const upgradeButton: HTMLButtonElement | null = flyout!.querySelector( + '[data-test-subj="upgradeSnapshotButton"]' + ); + + httpRequestsMockHelpers.setUpgradeMlSnapshotResponse({ + nodeId: 'my_node', + snapshotId, + jobId, + status: 'in_progress', + }); + + await act(async () => { + upgradeButton!.click(); + }); + + component.update(); + + // First, we expect a POST request to upgrade the snapshot + const upgradeRequest = server.requests[server.requests.length - 2]; + expect(upgradeRequest.method).toBe('POST'); + expect(upgradeRequest.url).toBe('/api/upgrade_assistant/ml_snapshots'); + + // Next, we expect a GET request to check the status of the upgrade + const statusRequest = server.requests[server.requests.length - 1]; + expect(statusRequest.method).toBe('GET'); + expect(statusRequest.url).toBe( + `/api/upgrade_assistant/ml_snapshots/${jobId}/${snapshotId}` + ); + }); + + test('handles upgrade failure', async () => { + const { component, find } = testBed; + + const upgradeButton: HTMLButtonElement | null = flyout!.querySelector( + '[data-test-subj="upgradeSnapshotButton"]' + ); + + const error = { + statusCode: 500, + error: 'Upgrade snapshot error', + message: 'Upgrade snapshot error', + }; + + httpRequestsMockHelpers.setUpgradeMlSnapshotResponse(undefined, error); + + await act(async () => { + upgradeButton!.click(); + }); + + component.update(); + + const upgradeRequest = server.requests[server.requests.length - 1]; + expect(upgradeRequest.method).toBe('POST'); + expect(upgradeRequest.url).toBe('/api/upgrade_assistant/ml_snapshots'); + + const accordionTestSubj = `depgroup_${upgradeStatusMockResponse.cluster[0].message + .split(' ') + .join('_')}`; + + expect(find(`${accordionTestSubj}.fixMlSnapshotsButton`).text()).toEqual('Failed'); + }); + + test('deletes snapshots', async () => { + const { component } = testBed; + + const deleteButton: HTMLButtonElement | null = flyout!.querySelector( + '[data-test-subj="deleteSnapshotButton"]' + ); + + httpRequestsMockHelpers.setDeleteMlSnapshotResponse({ + acknowledged: true, + }); + + await act(async () => { + deleteButton!.click(); + }); + + component.update(); + + const request = server.requests[server.requests.length - 1]; + const mlDeprecation = upgradeStatusMockResponse.cluster[0]; + + expect(request.method).toBe('DELETE'); + expect(request.url).toBe( + `/api/upgrade_assistant/ml_snapshots/${ + (mlDeprecation.correctiveAction! as MlAction).jobId + }/${(mlDeprecation.correctiveAction! as MlAction).snapshotId}` + ); + }); + + test('handles delete failure', async () => { + const { component, find } = testBed; + + const deleteButton: HTMLButtonElement | null = flyout!.querySelector( + '[data-test-subj="deleteSnapshotButton"]' + ); + + const error = { + statusCode: 500, + error: 'Upgrade snapshot error', + message: 'Upgrade snapshot error', + }; + + httpRequestsMockHelpers.setDeleteMlSnapshotResponse(undefined, error); + + await act(async () => { + deleteButton!.click(); + }); + + component.update(); + + const request = server.requests[server.requests.length - 1]; + const mlDeprecation = upgradeStatusMockResponse.cluster[0]; + + expect(request.method).toBe('DELETE'); + expect(request.url).toBe( + `/api/upgrade_assistant/ml_snapshots/${ + (mlDeprecation.correctiveAction! as MlAction).jobId + }/${(mlDeprecation.correctiveAction! as MlAction).snapshotId}` + ); + + const accordionTestSubj = `depgroup_${upgradeStatusMockResponse.cluster[0].message + .split(' ') + .join('_')}`; + + expect(find(`${accordionTestSubj}.fixMlSnapshotsButton`).text()).toEqual('Failed'); + }); + }); + }); + + describe('no deprecations', () => { + beforeEach(async () => { + const noDeprecationsResponse = { + readyForUpgrade: false, + cluster: [], + indices: [], + }; + + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(noDeprecationsResponse); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { component } = testBed; + + component.update(); + }); + + test('renders prompt', () => { + const { exists, find } = testBed; + expect(exists('noDeprecationsPrompt')).toBe(true); + expect(find('noDeprecationsPrompt').text()).toContain('Ready to upgrade!'); + }); + }); + + describe('error handling', () => { + test('handles 403', async () => { + const error = { + statusCode: 403, + error: 'Forbidden', + message: 'Forbidden', + }; + + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(undefined, error); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { component, exists, find } = testBed; + + component.update(); + + expect(exists('permissionsError')).toBe(true); + expect(find('permissionsError').text()).toContain( + 'You are not authorized to view Elasticsearch deprecations.' + ); + }); + + test('shows upgraded message when all nodes have been upgraded', async () => { + const error = { + statusCode: 426, + error: 'Upgrade required', + message: 'There are some nodes running a different version of Elasticsearch', + attributes: { + // This is marked true in the scenario where none of the nodes have the same major version of Kibana, + // and therefore we assume all have been upgraded + allNodesUpgraded: true, + }, + }; + + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(undefined, error); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { component, exists, find } = testBed; + + component.update(); + + expect(exists('upgradedCallout')).toBe(true); + expect(find('upgradedCallout').text()).toContain( + 'Your configuration is up to date. Kibana and all Elasticsearch nodes are running the same version.' + ); + }); + + test('shows partially upgrade error when nodes are running different versions', async () => { + const error = { + statusCode: 426, + error: 'Upgrade required', + message: 'There are some nodes running a different version of Elasticsearch', + attributes: { + allNodesUpgraded: false, + }, + }; + + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(undefined, error); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { component, exists, find } = testBed; + + component.update(); + + expect(exists('partiallyUpgradedWarning')).toBe(true); + expect(find('partiallyUpgradedWarning').text()).toContain( + 'Upgrade Kibana to the same version as your Elasticsearch cluster. One or more nodes in the cluster is running a different version than Kibana.' + ); + }); + + test('handles generic error', async () => { + const error = { + statusCode: 500, + error: 'Internal server error', + message: 'Internal server error', + }; + + httpRequestsMockHelpers.setLoadEsDeprecationsResponse(undefined, error); + + await act(async () => { + testBed = await setupClusterPage({ isReadOnlyMode: false }); + }); + + const { component, exists, find } = testBed; + + component.update(); + + expect(exists('requestError')).toBe(true); + expect(find('requestError').text()).toContain( + 'Could not retrieve Elasticsearch deprecations.' + ); + }); + }); +}); diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/cluster.helpers.ts b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/cluster.helpers.ts new file mode 100644 index 00000000000000..2aedface1e32ba --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/cluster.helpers.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { registerTestBed, TestBed, TestBedConfig } from '@kbn/test/jest'; +import { EsDeprecationsContent } from '../../../public/application/components/es_deprecations'; +import { WithAppDependencies } from './setup_environment'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: ['/es_deprecations/cluster'], + componentRoutePath: '/es_deprecations/:tabName', + }, + doMountAsync: true, +}; + +export type ClusterTestBed = TestBed & { + actions: ReturnType; +}; + +const createActions = (testBed: TestBed) => { + /** + * User Actions + */ + const clickTab = (tabName: string) => { + const { find } = testBed; + const camelcaseTabName = tabName.charAt(0).toUpperCase() + tabName.slice(1); + + find(`upgradeAssistant${camelcaseTabName}Tab`).simulate('click'); + }; + + const clickExpandAll = () => { + const { find } = testBed; + find('expandAll').simulate('click'); + }; + + return { + clickTab, + clickExpandAll, + }; +}; + +export const setup = async (overrides?: Record): Promise => { + const initTestBed = registerTestBed( + WithAppDependencies(EsDeprecationsContent, overrides), + testBedConfig + ); + const testBed = await initTestBed(); + + return { + ...testBed, + actions: createActions(testBed), + }; +}; + +export type ClusterTestSubjects = + | 'expandAll' + | 'deprecationsContainer' + | 'permissionsError' + | 'requestError' + | 'upgradedCallout' + | 'partiallyUpgradedWarning' + | 'noDeprecationsPrompt' + | string; diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/http_requests.ts index e3f6df54db60e4..3fd8b7279c0739 100644 --- a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/http_requests.ts @@ -62,11 +62,35 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ]); }; + const setUpgradeMlSnapshotResponse = (response?: object, error?: ResponseError) => { + const status = error ? error.statusCode || 400 : 200; + const body = error ? error : response; + + server.respondWith('POST', `${API_BASE_PATH}/ml_snapshots`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setDeleteMlSnapshotResponse = (response?: object, error?: ResponseError) => { + const status = error ? error.statusCode || 400 : 200; + const body = error ? error : response; + + server.respondWith('DELETE', `${API_BASE_PATH}/ml_snapshots/:jobId/:snapshotId`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + return { setLoadEsDeprecationsResponse, setLoadDeprecationLoggingResponse, setUpdateDeprecationLoggingResponse, setUpdateIndexSettingsResponse, + setUpgradeMlSnapshotResponse, + setDeleteMlSnapshotResponse, }; }; diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/index.ts index ddf5787af1037c..8e256680253beb 100644 --- a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/index.ts +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/index.ts @@ -7,6 +7,7 @@ export { setup as setupOverviewPage, OverviewTestBed } from './overview.helpers'; export { setup as setupIndicesPage, IndicesTestBed } from './indices.helpers'; +export { setup as setupClusterPage, ClusterTestBed } from './cluster.helpers'; export { setup as setupKibanaPage, KibanaTestBed } from './kibana.helpers'; export { setupEnvironment } from './setup_environment'; diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/setup_environment.tsx index faeb0e4a40abd4..aae55004033224 100644 --- a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/helpers/setup_environment.tsx @@ -33,7 +33,6 @@ export const WithAppDependencies = (Comp: any, overrides: Record { }); describe('with deprecations', () => { - const upgradeStatusMockResponse = { + const upgradeStatusMockResponse: UpgradeAssistantStatus = { readyForUpgrade: false, cluster: [], indices: [ { - level: 'warning' as MIGRATION_DEPRECATION_LEVEL, + level: 'warning', message: indexSettingDeprecations.translog.deprecationMessage, url: 'doc_url', index: 'my_index', - deprecatedIndexSettings: indexSettingDeprecations.translog.settings, + correctiveAction: { + type: 'indexSetting', + deprecatedSettings: indexSettingDeprecations.translog.settings, + }, }, ], }; @@ -56,6 +59,7 @@ describe('Indices tab', () => { test('renders deprecations', () => { const { exists, find } = testBed; + expect(exists('indexTabContent')).toBe(true); expect(exists('deprecationsContainer')).toBe(true); expect(find('indexCount').text()).toEqual('1'); }); diff --git a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview.test.ts b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview.test.ts index 85efaf38f32a73..9b65b493a74c40 100644 --- a/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview.test.ts +++ b/x-pack/plugins/upgrade_assistant/__jest__/client_integration/overview.test.ts @@ -38,7 +38,6 @@ describe('Overview page', () => { details: 'translog retention settings [index.translog.retention.size] and [index.translog.retention.age] are ignored because translog is no longer used in peer recoveries with soft-deletes enabled (default in 7.0 or later)', index: 'settings', - reindex: false, }, ], }; diff --git a/x-pack/plugins/upgrade_assistant/common/types.ts b/x-pack/plugins/upgrade_assistant/common/types.ts index 0471fc30f28eaf..88fa103bace894 100644 --- a/x-pack/plugins/upgrade_assistant/common/types.ts +++ b/x-pack/plugins/upgrade_assistant/common/types.ts @@ -28,7 +28,6 @@ export enum ReindexStatus { } export const REINDEX_OP_TYPE = 'upgrade-assistant-reindex-operation'; - export interface QueueSettings extends SavedObjectAttributes { /** * A Unix timestamp of when the reindex operation was enqueued. @@ -190,11 +189,9 @@ export interface DeprecationAPIResponse { node_settings: DeprecationInfo[]; index_settings: IndexSettingsDeprecationInfo; } -export interface EnrichedDeprecationInfo extends DeprecationInfo { - index?: string; - node?: string; - reindex?: boolean; - deprecatedIndexSettings?: string[]; + +export interface ReindexAction { + type: 'reindex'; /** * Indicate what blockers have been detected for calling reindex * against this index. @@ -205,6 +202,21 @@ export interface EnrichedDeprecationInfo extends DeprecationInfo { blockerForReindexing?: 'index-closed'; // 'index-closed' can be handled automatically, but requires more resources, user should be warned } +export interface MlAction { + type: 'mlSnapshot'; + snapshotId: string; + jobId: string; +} + +export interface IndexSettingAction { + type: 'indexSetting'; + deprecatedSettings: string[]; +} +export interface EnrichedDeprecationInfo extends DeprecationInfo { + index?: string; + correctiveAction?: ReindexAction | MlAction | IndexSettingAction; +} + export interface UpgradeAssistantStatus { readyForUpgrade: boolean; cluster: EnrichedDeprecationInfo[]; @@ -225,3 +237,11 @@ export interface ResolveIndexResponseFromES { }>; data_streams: Array<{ name: string; backing_indices: string[]; timestamp_field: string }>; } + +export const ML_UPGRADE_OP_TYPE = 'upgrade-assistant-ml-upgrade-operation'; + +export interface MlOperation extends SavedObjectAttributes { + nodeId: string; + snapshotId: string; + jobId: string; +} diff --git a/x-pack/plugins/upgrade_assistant/kibana.json b/x-pack/plugins/upgrade_assistant/kibana.json index d9f4917fa0a6cd..d013c16837b776 100644 --- a/x-pack/plugins/upgrade_assistant/kibana.json +++ b/x-pack/plugins/upgrade_assistant/kibana.json @@ -5,6 +5,6 @@ "ui": true, "configPath": ["xpack", "upgrade_assistant"], "requiredPlugins": ["management", "licensing", "features"], - "optionalPlugins": ["cloud", "usageCollection"], + "optionalPlugins": ["usageCollection"], "requiredBundles": ["esUiShared", "kibanaReact"] } diff --git a/x-pack/plugins/upgrade_assistant/public/application/app_context.tsx b/x-pack/plugins/upgrade_assistant/public/application/app_context.tsx index 049318f5b78d9e..88b5bd4721c36b 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/app_context.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/app_context.tsx @@ -24,7 +24,6 @@ export interface KibanaVersionContext { export interface ContextValue { http: HttpSetup; - isCloudEnabled: boolean; docLinks: DocLinksStart; kibanaVersionInfo: KibanaVersionContext; notifications: NotificationsStart; diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/cell.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/cell.tsx index b7d3247ffbf21a..4324379f456eaf 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/cell.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/cell.tsx @@ -17,34 +17,84 @@ import { EuiTitle, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EnrichedDeprecationInfo } from '../../../../../common/types'; +import { + EnrichedDeprecationInfo, + MlAction, + ReindexAction, + IndexSettingAction, +} from '../../../../../common/types'; import { AppContext } from '../../../app_context'; import { ReindexButton } from './reindex'; import { FixIndexSettingsButton } from './index_settings'; +import { FixMlSnapshotsButton } from './ml_snapshots'; interface DeprecationCellProps { items?: Array<{ title?: string; body: string }>; - reindexIndexName?: string; - deprecatedIndexSettings?: string[]; docUrl?: string; headline?: string; healthColor?: string; children?: ReactNode; - reindexBlocker?: EnrichedDeprecationInfo['blockerForReindexing']; + correctiveAction?: EnrichedDeprecationInfo['correctiveAction']; + indexName?: string; +} + +interface CellActionProps { + correctiveAction: EnrichedDeprecationInfo['correctiveAction']; + indexName?: string; + items: Array<{ title?: string; body: string }>; } +const CellAction: FunctionComponent = ({ correctiveAction, indexName, items }) => { + const { type: correctiveActionType } = correctiveAction!; + switch (correctiveActionType) { + case 'mlSnapshot': + const { jobId, snapshotId } = correctiveAction as MlAction; + return ( + + ); + + case 'reindex': + const { blockerForReindexing } = correctiveAction as ReindexAction; + + return ( + + {({ http, docLinks }) => ( + + )} + + ); + + case 'indexSetting': + const { deprecatedSettings } = correctiveAction as IndexSettingAction; + + return ; + + default: + throw new Error(`No UI defined for corrective action: ${correctiveActionType}`); + } +}; + /** * Used to display a deprecation with links to docs, a health indicator, and other descriptive information. */ export const DeprecationCell: FunctionComponent = ({ headline, healthColor, - reindexIndexName, - deprecatedIndexSettings, + correctiveAction, + indexName, docUrl, items = [], children, - reindexBlocker, }) => (
@@ -82,24 +132,9 @@ export const DeprecationCell: FunctionComponent = ({ )} - {reindexIndexName && ( - - - {({ http, docLinks }) => ( - - )} - - - )} - - {deprecatedIndexSettings?.length && ( + {correctiveAction && ( - + )} diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.test.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.test.tsx index 188e70b64ce6aa..f4ac573d86b111 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.test.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.test.tsx @@ -13,9 +13,9 @@ import { IndexDeprecationTableProps, IndexDeprecationTable } from './index_table describe('IndexDeprecationTable', () => { const defaultProps = { indices: [ - { index: 'index1', details: 'Index 1 deets', reindex: true }, - { index: 'index2', details: 'Index 2 deets', reindex: true }, - { index: 'index3', details: 'Index 3 deets', reindex: true }, + { index: 'index1', details: 'Index 1 deets', correctiveAction: { type: 'reindex' } }, + { index: 'index2', details: 'Index 2 deets', correctiveAction: { type: 'reindex' } }, + { index: 'index3', details: 'Index 3 deets', correctiveAction: { type: 'reindex' } }, ], } as IndexDeprecationTableProps; @@ -49,19 +49,25 @@ describe('IndexDeprecationTable', () => { items={ Array [ Object { + "correctiveAction": Object { + "type": "reindex", + }, "details": "Index 1 deets", "index": "index1", - "reindex": true, }, Object { + "correctiveAction": Object { + "type": "reindex", + }, "details": "Index 2 deets", "index": "index2", - "reindex": true, }, Object { + "correctiveAction": Object { + "type": "reindex", + }, "details": "Index 3 deets", "index": "index3", - "reindex": true, }, ] } diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.tsx index 216884d547eebb..6b0f94ea24bc7b 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/index_table.tsx @@ -10,7 +10,11 @@ import React from 'react'; import { EuiBasicTable } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { EnrichedDeprecationInfo } from '../../../../../common/types'; +import { + EnrichedDeprecationInfo, + IndexSettingAction, + ReindexAction, +} from '../../../../../common/types'; import { AppContext } from '../../../app_context'; import { ReindexButton } from './reindex'; import { FixIndexSettingsButton } from './index_settings'; @@ -19,9 +23,7 @@ const PAGE_SIZES = [10, 25, 50, 100, 250, 500, 1000]; export interface IndexDeprecationDetails { index: string; - reindex: boolean; - deprecatedIndexSettings?: string[]; - blockerForReindexing?: EnrichedDeprecationInfo['blockerForReindexing']; + correctiveAction?: EnrichedDeprecationInfo['correctiveAction']; details?: string; } @@ -152,9 +154,9 @@ export class IndexDeprecationTable extends React.Component< // NOTE: this naive implementation assumes all indices in the table // should show the reindex button or fix indices button. This should work for known use cases. const { indices } = this.props; - const showReindexButton = Boolean(indices.find((i) => i.reindex === true)); + const showReindexButton = Boolean(indices.find((i) => i.correctiveAction?.type === 'reindex')); const showFixSettingsButton = Boolean( - indices.find((i) => i.deprecatedIndexSettings && i.deprecatedIndexSettings.length > 0) + indices.find((i) => i.correctiveAction?.type === 'indexSetting') ); if (showReindexButton === false && showFixSettingsButton === false) { @@ -172,7 +174,9 @@ export class IndexDeprecationTable extends React.Component< return ( @@ -184,7 +188,7 @@ export class IndexDeprecationTable extends React.Component< return ( ); diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.test.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.test.tsx index 579cf1f4a55bbd..2bfa8119e41bcd 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.test.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.test.tsx @@ -72,18 +72,14 @@ describe('EsDeprecationList', () => { indices={ Array [ Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": undefined, + "correctiveAction": undefined, "details": undefined, "index": "0", - "reindex": false, }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": undefined, + "correctiveAction": undefined, "details": undefined, "index": "1", - "reindex": false, }, ] } diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.tsx index cb9f238d0e4dd1..7b543a7e94b33f 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/list.tsx @@ -32,11 +32,10 @@ const MessageDeprecation: FunctionComponent<{ return ( @@ -57,10 +56,10 @@ const SimpleMessageDeprecation: FunctionComponent<{ deprecation: EnrichedDepreca return ( ); }; @@ -94,12 +93,11 @@ export const EsDeprecationList: FunctionComponent<{ if (currentGroupBy === GroupByOption.message && deprecations[0].index !== undefined) { // We assume that every deprecation message is the same issue (since they have the same // message) and that each deprecation will have an index associated with it. + const indices = deprecations.map((dep) => ({ index: dep.index!, details: dep.details, - reindex: dep.reindex === true, - deprecatedIndexSettings: dep.deprecatedIndexSettings, - blockerForReindexing: dep.blockerForReindexing, + correctiveAction: dep.correctiveAction, })); return ; } else if (currentGroupBy === GroupByOption.index) { diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/button.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/button.tsx new file mode 100644 index 00000000000000..13b7dacc3b598d --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/button.tsx @@ -0,0 +1,125 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; + +import { ButtonSize, EuiButton } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { FixSnapshotsFlyout } from './fix_snapshots_flyout'; +import { useAppContext } from '../../../../app_context'; +import { useSnapshotState } from './use_snapshot_state'; + +const i18nTexts = { + fixButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.fixButtonLabel', + { + defaultMessage: 'Fix', + } + ), + upgradingButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.upgradingButtonLabel', + { + defaultMessage: 'Upgrading…', + } + ), + deletingButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.deletingButtonLabel', + { + defaultMessage: 'Deleting…', + } + ), + doneButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.doneButtonLabel', + { + defaultMessage: 'Done', + } + ), + failedButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.failedButtonLabel', + { + defaultMessage: 'Failed', + } + ), +}; + +interface Props { + snapshotId: string; + jobId: string; + description: string; +} + +export const FixMlSnapshotsButton: React.FunctionComponent = ({ + snapshotId, + jobId, + description, +}) => { + const { api } = useAppContext(); + const { snapshotState, upgradeSnapshot, deleteSnapshot, updateSnapshotStatus } = useSnapshotState( + { + jobId, + snapshotId, + api, + } + ); + + const [showFlyout, setShowFlyout] = useState(false); + + useEffect(() => { + updateSnapshotStatus(); + }, [updateSnapshotStatus]); + + const commonButtonProps = { + size: 's' as ButtonSize, + onClick: () => setShowFlyout(true), + 'data-test-subj': 'fixMlSnapshotsButton', + }; + + let button = {i18nTexts.fixButtonLabel}; + + switch (snapshotState.status) { + case 'in_progress': + button = ( + + {snapshotState.action === 'delete' + ? i18nTexts.deletingButtonLabel + : i18nTexts.upgradingButtonLabel} + + ); + break; + case 'complete': + button = ( + + {i18nTexts.doneButtonLabel} + + ); + break; + case 'error': + button = ( + + {i18nTexts.failedButtonLabel} + + ); + break; + } + + return ( + <> + {button} + + {showFlyout && ( + setShowFlyout(false)} + /> + )} + + ); +}; diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/fix_snapshots_flyout.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/fix_snapshots_flyout.tsx new file mode 100644 index 00000000000000..7dafab011a69a3 --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/fix_snapshots_flyout.tsx @@ -0,0 +1,181 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiPortal, + EuiTitle, + EuiText, + EuiCallOut, + EuiSpacer, +} from '@elastic/eui'; +import { SnapshotStatus } from './use_snapshot_state'; +import { ResponseError } from '../../../../lib/api'; + +interface SnapshotState extends SnapshotStatus { + error?: ResponseError; +} +interface Props { + upgradeSnapshot: () => Promise; + deleteSnapshot: () => Promise; + description: string; + closeFlyout: () => void; + snapshotState: SnapshotState; +} + +const i18nTexts = { + upgradeButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.upgradeButtonLabel', + { + defaultMessage: 'Upgrade', + } + ), + retryUpgradeButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.retryUpgradeButtonLabel', + { + defaultMessage: 'Retry upgrade', + } + ), + closeButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.cancelButtonLabel', + { + defaultMessage: 'Close', + } + ), + deleteButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.deleteButtonLabel', + { + defaultMessage: 'Delete', + } + ), + retryDeleteButtonLabel: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.retryDeleteButtonLabel', + { + defaultMessage: 'Retry delete', + } + ), + flyoutTitle: i18n.translate('xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.title', { + defaultMessage: 'Upgrade or delete model snapshot', + }), + deleteSnapshotErrorTitle: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.deleteSnapshotErrorTitle', + { + defaultMessage: 'Error deleting snapshot', + } + ), + upgradeSnapshotErrorTitle: i18n.translate( + 'xpack.upgradeAssistant.esDeprecations.mlSnapshots.flyout.upgradeSnapshotErrorTitle', + { + defaultMessage: 'Error upgrading snapshot', + } + ), +}; + +export const FixSnapshotsFlyout = ({ + upgradeSnapshot, + deleteSnapshot, + description, + closeFlyout, + snapshotState, +}: Props) => { + const onUpgradeSnapshot = () => { + upgradeSnapshot(); + closeFlyout(); + }; + + const onDeleteSnapshot = () => { + deleteSnapshot(); + closeFlyout(); + }; + + return ( + + + + +

{i18nTexts.flyoutTitle}

+
+
+ + {snapshotState.error && ( + <> + + {snapshotState.error.message} + + + + )} + +

{description}

+
+
+ + + + + {i18nTexts.closeButtonLabel} + + + + + + + {snapshotState.action === 'delete' && snapshotState.error + ? i18nTexts.retryDeleteButtonLabel + : i18nTexts.deleteButtonLabel} + + + + + {snapshotState.action === 'upgrade' && snapshotState.error + ? i18nTexts.retryUpgradeButtonLabel + : i18nTexts.upgradeButtonLabel} + + + + + + +
+
+ ); +}; diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/index.ts b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/index.ts new file mode 100644 index 00000000000000..d537c94cf67aed --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { FixMlSnapshotsButton } from './button'; diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/use_snapshot_state.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/use_snapshot_state.tsx new file mode 100644 index 00000000000000..2dd4638c772b3a --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/ml_snapshots/use_snapshot_state.tsx @@ -0,0 +1,151 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useRef, useCallback, useState, useEffect } from 'react'; + +import { ApiService, ResponseError } from '../../../../lib/api'; + +const POLL_INTERVAL_MS = 1000; + +export interface SnapshotStatus { + snapshotId: string; + jobId: string; + status: 'complete' | 'in_progress' | 'error' | 'idle'; + action?: 'upgrade' | 'delete'; +} + +export const useSnapshotState = ({ + jobId, + snapshotId, + api, +}: { + jobId: string; + snapshotId: string; + api: ApiService; +}) => { + const [requestError, setRequestError] = useState(undefined); + const [snapshotState, setSnapshotState] = useState({ + status: 'idle', + jobId, + snapshotId, + }); + + const pollIntervalIdRef = useRef | null>(null); + const isMounted = useRef(false); + + const clearPollInterval = useCallback(() => { + if (pollIntervalIdRef.current) { + clearTimeout(pollIntervalIdRef.current); + pollIntervalIdRef.current = null; + } + }, []); + + const updateSnapshotStatus = useCallback(async () => { + clearPollInterval(); + + const { data, error: updateStatusError } = await api.getMlSnapshotUpgradeStatus({ + jobId, + snapshotId, + }); + + if (updateStatusError) { + setSnapshotState({ + snapshotId, + jobId, + action: 'upgrade', + status: 'error', + }); + setRequestError(updateStatusError); + return; + } + + setSnapshotState(data); + + // Only keep polling if it exists and is in progress. + if (data?.status === 'in_progress') { + pollIntervalIdRef.current = setTimeout(updateSnapshotStatus, POLL_INTERVAL_MS); + } + }, [api, clearPollInterval, jobId, snapshotId]); + + const upgradeSnapshot = useCallback(async () => { + setSnapshotState({ + snapshotId, + jobId, + action: 'upgrade', + status: 'in_progress', + }); + + const { data, error: upgradeError } = await api.upgradeMlSnapshot({ jobId, snapshotId }); + + if (upgradeError) { + setRequestError(upgradeError); + setSnapshotState({ + snapshotId, + jobId, + action: 'upgrade', + status: 'error', + }); + return; + } + + setSnapshotState(data); + updateSnapshotStatus(); + }, [api, jobId, snapshotId, updateSnapshotStatus]); + + const deleteSnapshot = useCallback(async () => { + setSnapshotState({ + snapshotId, + jobId, + action: 'delete', + status: 'in_progress', + }); + + const { error: deleteError } = await api.deleteMlSnapshot({ + snapshotId, + jobId, + }); + + if (deleteError) { + setRequestError(deleteError); + setSnapshotState({ + snapshotId, + jobId, + action: 'delete', + status: 'error', + }); + return; + } + + setSnapshotState({ + snapshotId, + jobId, + action: 'delete', + status: 'complete', + }); + }, [api, jobId, snapshotId]); + + useEffect(() => { + isMounted.current = true; + + return () => { + isMounted.current = false; + + // Clean up on unmount. + clearPollInterval(); + }; + }, [clearPollInterval]); + + return { + snapshotState: { + ...snapshotState, + error: requestError, + }, + upgradeSnapshot, + updateSnapshotStatus, + deleteSnapshot, + }; +}; diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/button.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/button.tsx index 34c1328459cdb7..646f2539316640 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/button.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/button.tsx @@ -14,11 +14,7 @@ import { EuiButton, EuiLoadingSpinner, EuiText, EuiToolTip } from '@elastic/eui' import { FormattedMessage } from '@kbn/i18n/react'; import { DocLinksStart, HttpSetup } from 'src/core/public'; import { API_BASE_PATH } from '../../../../../../common/constants'; -import { - EnrichedDeprecationInfo, - ReindexStatus, - UIReindexOption, -} from '../../../../../../common/types'; +import { ReindexAction, ReindexStatus, UIReindexOption } from '../../../../../../common/types'; import { LoadingState } from '../../../types'; import { ReindexFlyout } from './flyout'; import { ReindexPollingService, ReindexState } from './polling_service'; @@ -27,7 +23,7 @@ interface ReindexButtonProps { indexName: string; http: HttpSetup; docLinks: DocLinksStart; - reindexBlocker?: EnrichedDeprecationInfo['blockerForReindexing']; + reindexBlocker?: ReindexAction['blockerForReindexing']; } interface ReindexButtonState { diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/flyout/container.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/flyout/container.tsx index 3e7b931452566e..97031dd08ee2ab 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/flyout/container.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecations/deprecations/reindex/flyout/container.tsx @@ -19,7 +19,7 @@ import { EuiTitle, } from '@elastic/eui'; -import { EnrichedDeprecationInfo, ReindexStatus } from '../../../../../../../common/types'; +import { ReindexAction, ReindexStatus } from '../../../../../../../common/types'; import { ReindexState } from '../polling_service'; import { ChecklistFlyoutStep } from './checklist_step'; @@ -37,7 +37,7 @@ interface ReindexFlyoutProps { startReindex: () => void; cancelReindex: () => void; docLinks: DocLinksStart; - reindexBlocker?: EnrichedDeprecationInfo['blockerForReindexing']; + reindexBlocker?: ReindexAction['blockerForReindexing']; } interface ReindexFlyoutState { diff --git a/x-pack/plugins/upgrade_assistant/public/application/lib/api.ts b/x-pack/plugins/upgrade_assistant/public/application/lib/api.ts index 1c42c249e9d545..c4d9128baa56a3 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/lib/api.ts +++ b/x-pack/plugins/upgrade_assistant/public/application/lib/api.ts @@ -90,6 +90,38 @@ export class ApiService { return result; } + + public async upgradeMlSnapshot(body: { jobId: string; snapshotId: string }) { + const result = await this.sendRequest({ + path: `${API_BASE_PATH}/ml_snapshots`, + method: 'post', + body, + }); + + return result; + } + + public async deleteMlSnapshot({ jobId, snapshotId }: { jobId: string; snapshotId: string }) { + const result = await this.sendRequest({ + path: `${API_BASE_PATH}/ml_snapshots/${jobId}/${snapshotId}`, + method: 'delete', + }); + + return result; + } + + public async getMlSnapshotUpgradeStatus({ + jobId, + snapshotId, + }: { + jobId: string; + snapshotId: string; + }) { + return await this.sendRequest({ + path: `${API_BASE_PATH}/ml_snapshots/${jobId}/${snapshotId}`, + method: 'get', + }); + } } export const apiService = new ApiService(); diff --git a/x-pack/plugins/upgrade_assistant/public/application/mount_management_section.ts b/x-pack/plugins/upgrade_assistant/public/application/mount_management_section.ts index 73e5d33e6c968e..8cd9f8b6591e35 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/mount_management_section.ts +++ b/x-pack/plugins/upgrade_assistant/public/application/mount_management_section.ts @@ -14,7 +14,6 @@ import { breadcrumbService } from './lib/breadcrumbs'; export async function mountManagementSection( coreSetup: CoreSetup, - isCloudEnabled: boolean, params: ManagementAppMountParams, kibanaVersionInfo: KibanaVersionContext, readonly: boolean @@ -31,7 +30,6 @@ export async function mountManagementSection( return renderApp({ element, - isCloudEnabled, http, i18n, docLinks, diff --git a/x-pack/plugins/upgrade_assistant/public/plugin.ts b/x-pack/plugins/upgrade_assistant/public/plugin.ts index 4f5429201f3041..4cffd40faf3800 100644 --- a/x-pack/plugins/upgrade_assistant/public/plugin.ts +++ b/x-pack/plugins/upgrade_assistant/public/plugin.ts @@ -9,19 +9,17 @@ import SemVer from 'semver/classes/semver'; import { i18n } from '@kbn/i18n'; import { Plugin, CoreSetup, PluginInitializerContext } from 'src/core/public'; -import { CloudSetup } from '../../cloud/public'; import { ManagementSetup } from '../../../../src/plugins/management/public'; import { Config } from '../common/config'; interface Dependencies { - cloud: CloudSetup; management: ManagementSetup; } export class UpgradeAssistantUIPlugin implements Plugin { constructor(private ctx: PluginInitializerContext) {} - setup(coreSetup: CoreSetup, { cloud, management }: Dependencies) { + setup(coreSetup: CoreSetup, { management }: Dependencies) { const { enabled, readonly } = this.ctx.config.get(); if (!enabled) { @@ -29,7 +27,6 @@ export class UpgradeAssistantUIPlugin implements Plugin { } const appRegistrar = management.sections.section.stack; - const isCloudEnabled = Boolean(cloud?.isCloudEnabled); const kibanaVersion = new SemVer(this.ctx.env.packageInfo.version); const kibanaVersionInfo = { @@ -59,7 +56,6 @@ export class UpgradeAssistantUIPlugin implements Plugin { const { mountManagementSection } = await import('./application/mount_management_section'); const unmountAppCallback = await mountManagementSection( coreSetup, - isCloudEnabled, params, kibanaVersionInfo, readonly diff --git a/x-pack/plugins/upgrade_assistant/server/lib/__fixtures__/fake_deprecations.json b/x-pack/plugins/upgrade_assistant/server/lib/__fixtures__/fake_deprecations.json index 10a5d39f5cece7..2b8519d75cb2ff 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/__fixtures__/fake_deprecations.json +++ b/x-pack/plugins/upgrade_assistant/server/lib/__fixtures__/fake_deprecations.json @@ -19,6 +19,12 @@ "message": "Datafeed [deprecation-datafeed] uses deprecated query options", "url": "https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-7.0.html#breaking_70_search_changes", "details": "[Deprecated field [use_dis_max] used, replaced by [Set [tie_breaker] to 1 instead]]" + }, + { + "level": "critical", + "message": "model snapshot [1] for job [deprecation_check_job] needs to be deleted or upgraded", + "url": "", + "details": "details" } ], "node_settings": [ @@ -46,6 +52,33 @@ "details": "[[type: tweet, field: liked]]" } ], + "old_index": [ + { + "level": "critical", + "message": "Index created before 7.0", + "url": + "https: //www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html", + "details": "This index was created using version: 6.8.13" + } + ], + "closed_index": [ + { + "level": "critical", + "message": "Index created before 7.0", + "url": "https: //www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html", + "details": "This index was created using version: 6.8.13" + } + ], + "deprecated_settings": [ + { + "level": "warning", + "message": "translog retention settings are ignored", + "url": + "https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html", + "details": + "translog retention settings [index.translog.retention.size] and [index.translog.retention.age] are ignored because translog is no longer used in peer recoveries with soft-deletes enabled (default in 7.0 or later)" + } + ], ".kibana": [ { "level": "warning", @@ -79,4 +112,4 @@ } ] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/upgrade_assistant/server/lib/__snapshots__/es_migration_apis.test.ts.snap b/x-pack/plugins/upgrade_assistant/server/lib/__snapshots__/es_migration_apis.test.ts.snap index aefac2b4c63f6d..a7890adf1f0ebd 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/__snapshots__/es_migration_apis.test.ts.snap +++ b/x-pack/plugins/upgrade_assistant/server/lib/__snapshots__/es_migration_apis.test.ts.snap @@ -4,24 +4,39 @@ exports[`getUpgradeAssistantStatus returns the correct shape of data 1`] = ` Object { "cluster": Array [ Object { + "correctiveAction": undefined, "details": "templates using \`template\` field: security_audit_log,watches,.monitoring-alerts,triggered_watches,.ml-anomalies-,.ml-notifications,.ml-meta,.monitoring-kibana,.monitoring-es,.monitoring-logstash,.watch-history-6,.ml-state,security-index-template", "level": "warning", "message": "Template patterns are no longer using \`template\` field, but \`index_patterns\` instead", "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_indices_changes.html#_index_templates_use_literal_index_patterns_literal_instead_of_literal_template_literal", }, Object { + "correctiveAction": undefined, "details": "{.monitoring-logstash=[Coercion of boolean fields], .monitoring-es=[Coercion of boolean fields], .ml-anomalies-=[Coercion of boolean fields], .watch-history-6=[Coercion of boolean fields], .monitoring-kibana=[Coercion of boolean fields], security-index-template=[Coercion of boolean fields]}", "level": "warning", "message": "one or more templates use deprecated mapping settings", "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_indices_changes.html", }, Object { + "correctiveAction": undefined, "details": "[Deprecated field [use_dis_max] used, replaced by [Set [tie_breaker] to 1 instead]]", "level": "warning", "message": "Datafeed [deprecation-datafeed] uses deprecated query options", "url": "https://www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-7.0.html#breaking_70_search_changes", }, Object { + "correctiveAction": Object { + "jobId": "deprecation_check_job", + "snapshotId": "1", + "type": "mlSnapshot", + }, + "details": "details", + "level": "critical", + "message": "model snapshot [1] for job [deprecation_check_job] needs to be deleted or upgraded", + "url": "", + }, + Object { + "correctiveAction": undefined, "details": "This node thing is wrong", "level": "critical", "message": "A node-level issue", @@ -30,63 +45,87 @@ Object { ], "indices": Array [ Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": undefined, "details": "[[type: doc, field: spins], [type: doc, field: mlockall], [type: doc, field: node_master], [type: doc, field: primary]]", "index": ".monitoring-es-6-2018.11.07", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": undefined, "details": "[[type: tweet, field: liked]]", "index": "twitter", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": Object { + "blockerForReindexing": undefined, + "type": "reindex", + }, + "details": "This index was created using version: 6.8.13", + "index": "old_index", + "level": "critical", + "message": "Index created before 7.0", + "url": "https: //www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html", + }, + Object { + "correctiveAction": Object { + "blockerForReindexing": "index-closed", + "type": "reindex", + }, + "details": "This index was created using version: 6.8.13", + "index": "closed_index", + "level": "critical", + "message": "Index created before 7.0", + "url": "https: //www.elastic.co/guide/en/elasticsearch/reference/master/breaking-changes-8.0.html", + }, + Object { + "correctiveAction": Object { + "deprecatedSettings": Array [ + "translog.retention.size", + "translog.retention.age", + ], + "type": "indexSetting", + }, + "details": "translog retention settings [index.translog.retention.size] and [index.translog.retention.age] are ignored because translog is no longer used in peer recoveries with soft-deletes enabled (default in 7.0 or later)", + "index": "deprecated_settings", + "level": "warning", + "message": "translog retention settings are ignored", + "url": "https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html", + }, + Object { + "correctiveAction": undefined, "details": "[[type: index-pattern, field: notExpandable], [type: config, field: xPackMonitoring:allowReport], [type: config, field: xPackMonitoring:showBanner], [type: dashboard, field: pause], [type: dashboard, field: timeRestore]]", "index": ".kibana", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": undefined, "details": "[[type: doc, field: notify], [type: doc, field: created], [type: doc, field: attach_payload], [type: doc, field: met]]", "index": ".watcher-history-6-2018.11.07", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": undefined, "details": "[[type: doc, field: snapshot]]", "index": ".monitoring-kibana-6-2018.11.07", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, Object { - "blockerForReindexing": undefined, - "deprecatedIndexSettings": Array [], + "correctiveAction": undefined, "details": "[[type: tweet, field: liked]]", "index": "twitter2", "level": "warning", "message": "Coercion of boolean fields", - "reindex": false, "url": "https://www.elastic.co/guide/en/elasticsearch/reference/6.0/breaking_60_mappings_changes.html#_coercion_of_boolean_fields", }, ], diff --git a/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.test.ts index d78af9162e9242..6477ce738c084b 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.test.ts @@ -22,7 +22,13 @@ const asApiResponse = (body: T): RequestEvent => describe('getUpgradeAssistantStatus', () => { const resolvedIndices = { - indices: fakeIndexNames.map((f) => ({ name: f, attributes: ['open'] })), + indices: fakeIndexNames.map((indexName) => { + // mark one index as closed to test blockerForReindexing flag + if (indexName === 'closed_index') { + return { name: indexName, attributes: ['closed'] }; + } + return { name: indexName, attributes: ['open'] }; + }), }; // @ts-expect-error mock data is too loosely typed @@ -39,12 +45,12 @@ describe('getUpgradeAssistantStatus', () => { esClient.asCurrentUser.indices.resolveIndex.mockResolvedValue(asApiResponse(resolvedIndices)); it('calls /_migration/deprecations', async () => { - await getUpgradeAssistantStatus(esClient, false); + await getUpgradeAssistantStatus(esClient); expect(esClient.asCurrentUser.migration.deprecations).toHaveBeenCalled(); }); it('returns the correct shape of data', async () => { - const resp = await getUpgradeAssistantStatus(esClient, false); + const resp = await getUpgradeAssistantStatus(esClient); expect(resp).toMatchSnapshot(); }); @@ -59,7 +65,7 @@ describe('getUpgradeAssistantStatus', () => { }) ); - await expect(getUpgradeAssistantStatus(esClient, false)).resolves.toHaveProperty( + await expect(getUpgradeAssistantStatus(esClient)).resolves.toHaveProperty( 'readyForUpgrade', false ); @@ -76,32 +82,9 @@ describe('getUpgradeAssistantStatus', () => { }) ); - await expect(getUpgradeAssistantStatus(esClient, false)).resolves.toHaveProperty( + await expect(getUpgradeAssistantStatus(esClient)).resolves.toHaveProperty( 'readyForUpgrade', true ); }); - - it('filters out security realm deprecation on Cloud', async () => { - esClient.asCurrentUser.migration.deprecations.mockResolvedValue( - // @ts-expect-error not full interface - asApiResponse({ - cluster_settings: [ - { - level: 'critical', - message: 'Security realm settings structure changed', - url: 'https://...', - }, - ], - node_settings: [], - ml_settings: [], - index_settings: {}, - }) - ); - - const result = await getUpgradeAssistantStatus(esClient, true); - - expect(result).toHaveProperty('readyForUpgrade', true); - expect(result).toHaveProperty('cluster', []); - }); }); diff --git a/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.ts b/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.ts index e775190d426dfd..85cde9069d60f5 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/es_migration_apis.ts @@ -16,26 +16,12 @@ import { import { esIndicesStateCheck } from './es_indices_state_check'; export async function getUpgradeAssistantStatus( - dataClient: IScopedClusterClient, - isCloudEnabled: boolean + dataClient: IScopedClusterClient ): Promise { const { body: deprecations } = await dataClient.asCurrentUser.migration.deprecations(); - const cluster = getClusterDeprecations(deprecations, isCloudEnabled); - const indices = getCombinedIndexInfos(deprecations); - - const indexNames = indices.map(({ index }) => index!); - - // If we have found deprecation information for index/indices check whether the index is - // open or closed. - if (indexNames.length) { - const indexStates = await esIndicesStateCheck(dataClient.asCurrentUser, indexNames); - - indices.forEach((indexData) => { - indexData.blockerForReindexing = - indexStates[indexData.index!] === 'closed' ? 'index-closed' : undefined; - }); - } + const cluster = getClusterDeprecations(deprecations); + const indices = await getCombinedIndexInfos(deprecations, dataClient); const criticalWarnings = cluster.concat(indices).filter((d) => d.level === 'critical'); @@ -47,38 +33,91 @@ export async function getUpgradeAssistantStatus( } // Reformats the index deprecations to an array of deprecation warnings extended with an index field. -const getCombinedIndexInfos = (deprecations: DeprecationAPIResponse) => - Object.keys(deprecations.index_settings).reduce((indexDeprecations, indexName) => { - return indexDeprecations.concat( - deprecations.index_settings[indexName].map( - (d) => - ({ - ...d, - index: indexName, - reindex: /Index created before/.test(d.message), - deprecatedIndexSettings: getIndexSettingDeprecations(d.message), - } as EnrichedDeprecationInfo) - ) - ); - }, [] as EnrichedDeprecationInfo[]); - -const getClusterDeprecations = (deprecations: DeprecationAPIResponse, isCloudEnabled: boolean) => { - const combined = deprecations.cluster_settings +const getCombinedIndexInfos = async ( + deprecations: DeprecationAPIResponse, + dataClient: IScopedClusterClient +) => { + const indices = Object.keys(deprecations.index_settings).reduce( + (indexDeprecations, indexName) => { + return indexDeprecations.concat( + deprecations.index_settings[indexName].map( + (d) => + ({ + ...d, + index: indexName, + correctiveAction: getCorrectiveAction(d.message), + } as EnrichedDeprecationInfo) + ) + ); + }, + [] as EnrichedDeprecationInfo[] + ); + + const indexNames = indices.map(({ index }) => index!); + + // If we have found deprecation information for index/indices + // check whether the index is open or closed. + if (indexNames.length) { + const indexStates = await esIndicesStateCheck(dataClient.asCurrentUser, indexNames); + + indices.forEach((indexData) => { + if (indexData.correctiveAction?.type === 'reindex') { + indexData.correctiveAction.blockerForReindexing = + indexStates[indexData.index!] === 'closed' ? 'index-closed' : undefined; + } + }); + } + return indices as EnrichedDeprecationInfo[]; +}; + +const getClusterDeprecations = (deprecations: DeprecationAPIResponse) => { + const combinedDeprecations = deprecations.cluster_settings .concat(deprecations.ml_settings) .concat(deprecations.node_settings); - if (isCloudEnabled) { - // In Cloud, this is changed at upgrade time. Filter it out to improve upgrade UX. - return combined.filter((d) => d.message !== 'Security realm settings structure changed'); - } else { - return combined; - } + return combinedDeprecations.map((deprecation) => { + return { + ...deprecation, + correctiveAction: getCorrectiveAction(deprecation.message), + }; + }) as EnrichedDeprecationInfo[]; }; -const getIndexSettingDeprecations = (message: string) => { - const indexDeprecation = Object.values(indexSettingDeprecations).find( +const getCorrectiveAction = (message: string) => { + const indexSettingDeprecation = Object.values(indexSettingDeprecations).find( ({ deprecationMessage }) => deprecationMessage === message ); + const requiresReindexAction = /Index created before/.test(message); + const requiresIndexSettingsAction = Boolean(indexSettingDeprecation); + const requiresMlAction = /model snapshot/.test(message); + + if (requiresReindexAction) { + return { + type: 'reindex', + }; + } + + if (requiresIndexSettingsAction) { + return { + type: 'indexSetting', + deprecatedSettings: indexSettingDeprecation!.settings, + }; + } + + if (requiresMlAction) { + // This logic is brittle, as we are expecting the message to be in a particular format to extract the snapshot ID and job ID + // Implementing https://github.com/elastic/elasticsearch/issues/73089 in ES should address this concern + const regex = /(?<=\[).*?(?=\])/g; + const matches = message.match(regex); + + if (matches?.length === 2) { + return { + type: 'mlSnapshot', + snapshotId: matches[0], + jobId: matches[1], + }; + } + } - return indexDeprecation?.settings || []; + return undefined; }; diff --git a/x-pack/plugins/upgrade_assistant/server/plugin.ts b/x-pack/plugins/upgrade_assistant/server/plugin.ts index ae5975c2bc8a74..50b7330b4d466f 100644 --- a/x-pack/plugins/upgrade_assistant/server/plugin.ts +++ b/x-pack/plugins/upgrade_assistant/server/plugin.ts @@ -17,7 +17,6 @@ import { SavedObjectsServiceStart, } from '../../../../src/core/server'; -import { CloudSetup } from '../../cloud/server'; import { PluginSetupContract as FeaturesPluginSetup } from '../../features/server'; import { LicensingPluginSetup } from '../../licensing/server'; @@ -25,12 +24,13 @@ import { CredentialStore, credentialStoreFactory } from './lib/reindexing/creden import { ReindexWorker } from './lib/reindexing'; import { registerUpgradeAssistantUsageCollector } from './lib/telemetry'; import { versionService } from './lib/version'; -import { registerClusterCheckupRoutes } from './routes/cluster_checkup'; -import { registerDeprecationLoggingRoutes } from './routes/deprecation_logging'; -import { registerReindexIndicesRoutes, createReindexWorker } from './routes/reindex_indices'; -import { registerTelemetryRoutes } from './routes/telemetry'; -import { registerUpdateSettingsRoute } from './routes/update_index_settings'; -import { telemetrySavedObjectType, reindexOperationSavedObjectType } from './saved_object_types'; +import { createReindexWorker } from './routes/reindex_indices'; +import { registerRoutes } from './routes/register_routes'; +import { + telemetrySavedObjectType, + reindexOperationSavedObjectType, + mlSavedObjectType, +} from './saved_object_types'; import { RouteDependencies } from './types'; @@ -38,7 +38,6 @@ interface PluginsSetup { usageCollection: UsageCollectionSetup; licensing: LicensingPluginSetup; features: FeaturesPluginSetup; - cloud?: CloudSetup; } export class UpgradeAssistantServerPlugin implements Plugin { @@ -68,12 +67,13 @@ export class UpgradeAssistantServerPlugin implements Plugin { setup( { http, getStartServices, capabilities, savedObjects }: CoreSetup, - { usageCollection, cloud, features, licensing }: PluginsSetup + { usageCollection, features, licensing }: PluginsSetup ) { this.licensing = licensing; savedObjects.registerType(reindexOperationSavedObjectType); savedObjects.registerType(telemetrySavedObjectType); + savedObjects.registerType(mlSavedObjectType); features.registerElasticsearchFeature({ id: 'upgrade_assistant', @@ -91,7 +91,6 @@ export class UpgradeAssistantServerPlugin implements Plugin { const router = http.createRouter(); const dependencies: RouteDependencies = { - cloud, router, credentialStore: this.credentialStore, log: this.logger, @@ -107,12 +106,7 @@ export class UpgradeAssistantServerPlugin implements Plugin { // Initialize version service with current kibana version versionService.setup(this.kibanaVersion); - registerClusterCheckupRoutes(dependencies); - registerDeprecationLoggingRoutes(dependencies); - registerReindexIndicesRoutes(dependencies, this.getWorker.bind(this)); - // Bootstrap the needed routes and the collector for the telemetry - registerTelemetryRoutes(dependencies); - registerUpdateSettingsRoute(dependencies); + registerRoutes(dependencies, this.getWorker.bind(this)); if (usageCollection) { getStartServices().then(([{ savedObjects: savedObjectsService, elasticsearch }]) => { diff --git a/x-pack/plugins/upgrade_assistant/server/routes/__mocks__/routes.mock.ts b/x-pack/plugins/upgrade_assistant/server/routes/__mocks__/routes.mock.ts index 3aabae87c06b1b..09da52e4b6ffd3 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/__mocks__/routes.mock.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/__mocks__/routes.mock.ts @@ -49,6 +49,7 @@ export const createMockRouter = () => { post: assign('post'), put: assign('put'), patch: assign('patch'), + delete: assign('delete'), }; }; diff --git a/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.test.ts b/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.test.ts index a5da4741b10eb0..934fdb1c4eb37a 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.test.ts @@ -32,9 +32,6 @@ describe('cluster checkup API', () => { beforeEach(() => { mockRouter = createMockRouter(); routeDependencies = { - cloud: { - isCloudEnabled: true, - }, router: mockRouter, }; registerClusterCheckupRoutes(routeDependencies); @@ -44,24 +41,6 @@ describe('cluster checkup API', () => { jest.resetAllMocks(); }); - describe('with cloud enabled', () => { - it('is provided to getUpgradeAssistantStatus', async () => { - const spy = jest.spyOn(MigrationApis, 'getUpgradeAssistantStatus'); - - MigrationApis.getUpgradeAssistantStatus.mockResolvedValue({ - cluster: [], - indices: [], - nodes: [], - }); - - await routeDependencies.router.getHandler({ - method: 'get', - pathPattern: '/api/upgrade_assistant/status', - })(routeHandlerContextMock, createRequestMock(), kibanaResponseFactory); - expect(spy.mock.calls[0][1]).toBe(true); - }); - }); - describe('GET /api/upgrade_assistant/reindex/{indexName}.json', () => { it('returns state', async () => { MigrationApis.getUpgradeAssistantStatus.mockResolvedValue({ diff --git a/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.ts b/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.ts index fe5b9baef6c8dd..31026be55fa30d 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/cluster_checkup.ts @@ -12,9 +12,7 @@ import { RouteDependencies } from '../types'; import { reindexActionsFactory } from '../lib/reindexing/reindex_actions'; import { reindexServiceFactory } from '../lib/reindexing'; -export function registerClusterCheckupRoutes({ cloud, router, licensing, log }: RouteDependencies) { - const isCloudEnabled = Boolean(cloud?.isCloudEnabled); - +export function registerClusterCheckupRoutes({ router, licensing, log }: RouteDependencies) { router.get( { path: `${API_BASE_PATH}/status`, @@ -32,7 +30,7 @@ export function registerClusterCheckupRoutes({ cloud, router, licensing, log }: response ) => { try { - const status = await getUpgradeAssistantStatus(client, isCloudEnabled); + const status = await getUpgradeAssistantStatus(client); const asCurrentUser = client.asCurrentUser; const reindexActions = reindexActionsFactory(savedObjectsClient, asCurrentUser); diff --git a/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.test.ts b/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.test.ts new file mode 100644 index 00000000000000..741f704adac905 --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.test.ts @@ -0,0 +1,365 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; +import { createMockRouter, MockRouter, routeHandlerContextMock } from './__mocks__/routes.mock'; +import { createRequestMock } from './__mocks__/request.mock'; +import { registerMlSnapshotRoutes } from './ml_snapshots'; + +jest.mock('../lib/es_version_precheck', () => ({ + versionCheckHandlerWrapper: (handler: RequestHandler) => handler, +})); + +const JOB_ID = 'job_id'; +const SNAPSHOT_ID = 'snapshot_id'; +const NODE_ID = 'node_id'; + +describe('ML snapshots APIs', () => { + let mockRouter: MockRouter; + let routeDependencies: any; + + beforeEach(() => { + mockRouter = createMockRouter(); + routeDependencies = { + router: mockRouter, + }; + registerMlSnapshotRoutes(routeDependencies); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + describe('POST /api/upgrade_assistant/ml_snapshots', () => { + it('returns 200 status and in_progress status', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .upgradeJobSnapshot as jest.Mock).mockResolvedValue({ + body: { + node: NODE_ID, + completed: false, + }, + }); + + const resp = await routeDependencies.router.getHandler({ + method: 'post', + pathPattern: '/api/upgrade_assistant/ml_snapshots', + })( + routeHandlerContextMock, + createRequestMock({ + body: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + jobId: JOB_ID, + nodeId: NODE_ID, + snapshotId: SNAPSHOT_ID, + status: 'in_progress', + }); + }); + + it('returns 200 status and complete status', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .upgradeJobSnapshot as jest.Mock).mockResolvedValue({ + body: { + node: NODE_ID, + completed: true, + }, + }); + + const resp = await routeDependencies.router.getHandler({ + method: 'post', + pathPattern: '/api/upgrade_assistant/ml_snapshots', + })( + routeHandlerContextMock, + createRequestMock({ + body: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + jobId: JOB_ID, + nodeId: NODE_ID, + snapshotId: SNAPSHOT_ID, + status: 'complete', + }); + }); + + it('returns an error if it throws', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .upgradeJobSnapshot as jest.Mock).mockRejectedValue(new Error('scary error!')); + await expect( + routeDependencies.router.getHandler({ + method: 'post', + pathPattern: '/api/upgrade_assistant/ml_snapshots', + })( + routeHandlerContextMock, + createRequestMock({ + body: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ) + ).rejects.toThrow('scary error!'); + }); + }); + + describe('DELETE /api/upgrade_assistant/ml_snapshots/:jobId/:snapshotId', () => { + it('returns 200 status', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .deleteModelSnapshot as jest.Mock).mockResolvedValue({ + body: { acknowledged: true }, + }); + + const resp = await routeDependencies.router.getHandler({ + method: 'delete', + pathPattern: '/api/upgrade_assistant/ml_snapshots/{jobId}/{snapshotId}', + })( + routeHandlerContextMock, + createRequestMock({ + params: { snapshotId: 'snapshot_id1', jobId: 'job_id1' }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + acknowledged: true, + }); + }); + + it('returns an error if it throws', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .deleteModelSnapshot as jest.Mock).mockRejectedValue(new Error('scary error!')); + await expect( + routeDependencies.router.getHandler({ + method: 'delete', + pathPattern: '/api/upgrade_assistant/ml_snapshots/{jobId}/{snapshotId}', + })( + routeHandlerContextMock, + createRequestMock({ + params: { snapshotId: 'snapshot_id1', jobId: 'job_id1' }, + }), + kibanaResponseFactory + ) + ).rejects.toThrow('scary error!'); + }); + }); + + describe('GET /api/upgrade_assistant/ml_snapshots/:jobId/:snapshotId', () => { + it('returns "idle" status if saved object does not exist', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .getModelSnapshots as jest.Mock).mockResolvedValue({ + body: { + count: 1, + model_snapshots: [ + { + job_id: JOB_ID, + min_version: '6.4.0', + timestamp: 1575402237000, + description: 'State persisted due to job close at 2019-12-03T19:43:57+0000', + snapshot_id: SNAPSHOT_ID, + snapshot_doc_count: 1, + model_size_stats: {}, + latest_record_time_stamp: 1576971072000, + latest_result_time_stamp: 1576965600000, + retain: false, + }, + ], + }, + }); + + const resp = await routeDependencies.router.getHandler({ + method: 'get', + pathPattern: '/api/upgrade_assistant/ml_snapshots/{jobId}/{snapshotId}', + })( + routeHandlerContextMock, + createRequestMock({ + params: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + jobId: JOB_ID, + nodeId: undefined, + snapshotId: SNAPSHOT_ID, + status: 'idle', + }); + }); + + it('returns "in_progress" status if snapshot upgrade is in progress', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .getModelSnapshots as jest.Mock).mockResolvedValue({ + body: { + count: 1, + model_snapshots: [ + { + job_id: JOB_ID, + min_version: '6.4.0', + timestamp: 1575402237000, + description: 'State persisted due to job close at 2019-12-03T19:43:57+0000', + snapshot_id: SNAPSHOT_ID, + snapshot_doc_count: 1, + model_size_stats: {}, + latest_record_time_stamp: 1576971072000, + latest_result_time_stamp: 1576965600000, + retain: false, + }, + ], + }, + }); + + (routeHandlerContextMock.core.savedObjects.client.find as jest.Mock).mockResolvedValue({ + total: 1, + saved_objects: [ + { + attributes: { + nodeId: NODE_ID, + jobId: JOB_ID, + snapshotId: SNAPSHOT_ID, + }, + }, + ], + }); + + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.tasks + .list as jest.Mock).mockResolvedValue({ + body: { + nodes: { + [NODE_ID]: { + tasks: { + [`${NODE_ID}:12345`]: { + description: `job-snapshot-upgrade-${JOB_ID}-${SNAPSHOT_ID}`, + }, + }, + }, + }, + }, + }); + + const resp = await routeDependencies.router.getHandler({ + method: 'get', + pathPattern: '/api/upgrade_assistant/ml_snapshots/{jobId}/{snapshotId}', + })( + routeHandlerContextMock, + createRequestMock({ + params: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + jobId: JOB_ID, + nodeId: NODE_ID, + snapshotId: SNAPSHOT_ID, + status: 'in_progress', + }); + }); + + it('returns "complete" status if snapshot upgrade has completed', async () => { + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.ml + .getModelSnapshots as jest.Mock).mockResolvedValue({ + body: { + count: 1, + model_snapshots: [ + { + job_id: JOB_ID, + min_version: '6.4.0', + timestamp: 1575402237000, + description: 'State persisted due to job close at 2019-12-03T19:43:57+0000', + snapshot_id: SNAPSHOT_ID, + snapshot_doc_count: 1, + model_size_stats: {}, + latest_record_time_stamp: 1576971072000, + latest_result_time_stamp: 1576965600000, + retain: false, + }, + ], + }, + }); + + (routeHandlerContextMock.core.savedObjects.client.find as jest.Mock).mockResolvedValue({ + total: 1, + saved_objects: [ + { + attributes: { + nodeId: NODE_ID, + jobId: JOB_ID, + snapshotId: SNAPSHOT_ID, + }, + }, + ], + }); + + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.tasks + .list as jest.Mock).mockResolvedValue({ + body: { + nodes: { + [NODE_ID]: { + tasks: {}, + }, + }, + }, + }); + + (routeHandlerContextMock.core.elasticsearch.client.asCurrentUser.migration + .deprecations as jest.Mock).mockResolvedValue({ + body: { + cluster_settings: [], + ml_settings: [], + node_settings: [], + index_settings: {}, + }, + }); + + (routeHandlerContextMock.core.savedObjects.client.delete as jest.Mock).mockResolvedValue({}); + + const resp = await routeDependencies.router.getHandler({ + method: 'get', + pathPattern: '/api/upgrade_assistant/ml_snapshots/{jobId}/{snapshotId}', + })( + routeHandlerContextMock, + createRequestMock({ + params: { + snapshotId: SNAPSHOT_ID, + jobId: JOB_ID, + }, + }), + kibanaResponseFactory + ); + + expect(resp.status).toEqual(200); + expect(resp.payload).toEqual({ + jobId: JOB_ID, + nodeId: NODE_ID, + snapshotId: SNAPSHOT_ID, + status: 'complete', + }); + }); + }); +}); diff --git a/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.ts b/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.ts new file mode 100644 index 00000000000000..80f5f2eb60e09e --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/server/routes/ml_snapshots.ts @@ -0,0 +1,348 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ResponseError } from '@elastic/elasticsearch/lib/errors'; +import { schema } from '@kbn/config-schema'; +import { IScopedClusterClient, SavedObjectsClientContract } from 'kibana/server'; +import { API_BASE_PATH } from '../../common/constants'; +import { MlOperation, ML_UPGRADE_OP_TYPE } from '../../common/types'; +import { versionCheckHandlerWrapper } from '../lib/es_version_precheck'; +import { handleEsError } from '../shared_imports'; +import { RouteDependencies } from '../types'; + +const findMlOperation = async ( + savedObjectsClient: SavedObjectsClientContract, + snapshotId: string +) => { + return savedObjectsClient.find({ + type: ML_UPGRADE_OP_TYPE, + search: `"${snapshotId}"`, + searchFields: ['snapshotId'], + }); +}; + +const createMlOperation = async ( + savedObjectsClient: SavedObjectsClientContract, + attributes: MlOperation +) => { + const foundSnapshots = await findMlOperation(savedObjectsClient, attributes.snapshotId); + + if (foundSnapshots?.total > 0) { + throw new Error(`A ML operation is already in progress for snapshot: ${attributes.snapshotId}`); + } + + return savedObjectsClient.create(ML_UPGRADE_OP_TYPE, attributes); +}; + +const deleteMlOperation = (savedObjectsClient: SavedObjectsClientContract, id: string) => { + return savedObjectsClient.delete(ML_UPGRADE_OP_TYPE, id); +}; + +/* + * The tasks API can only tell us if the snapshot upgrade is in progress. + * We cannot rely on it to determine if a snapshot was upgraded successfully. + * If the task does not exist, it can mean one of two things: + * 1. The snapshot was upgraded successfully. + * 2. There was a failure upgrading the snapshot. + * In order to verify it was successful, we need to recheck the deprecation info API + * and verify the deprecation no longer exists. If it still exists, we assume there was a failure. + */ +const verifySnapshotUpgrade = async ( + esClient: IScopedClusterClient, + snapshot: { snapshotId: string; jobId: string } +): Promise<{ + isSuccessful: boolean; + error?: ResponseError; +}> => { + const { snapshotId, jobId } = snapshot; + + try { + const { body: deprecations } = await esClient.asCurrentUser.migration.deprecations(); + + const mlSnapshotDeprecations = deprecations.ml_settings.filter((deprecation) => { + return /model snapshot/.test(deprecation.message); + }); + + // If there are no ML deprecations, we assume the deprecation was resolved successfully + if (typeof mlSnapshotDeprecations === 'undefined' || mlSnapshotDeprecations.length === 0) { + return { + isSuccessful: true, + }; + } + + const isSuccessful = Boolean( + mlSnapshotDeprecations.find((snapshotDeprecation) => { + const regex = /(?<=\[).*?(?=\])/g; + const matches = snapshotDeprecation.message.match(regex); + + if (matches?.length === 2) { + // If there is no matching snapshot, we assume the deprecation was resolved successfully + return matches[0] === snapshotId && matches[1] === jobId ? false : true; + } + + return false; + }) + ); + + return { + isSuccessful, + }; + } catch (e) { + return { + isSuccessful: false, + error: e, + }; + } +}; + +export function registerMlSnapshotRoutes({ router }: RouteDependencies) { + // Upgrade ML model snapshot + router.post( + { + path: `${API_BASE_PATH}/ml_snapshots`, + validate: { + body: schema.object({ + snapshotId: schema.string(), + jobId: schema.string(), + }), + }, + }, + versionCheckHandlerWrapper( + async ( + { + core: { + savedObjects: { client: savedObjectsClient }, + elasticsearch: { client: esClient }, + }, + }, + request, + response + ) => { + try { + const { snapshotId, jobId } = request.body; + + const { body } = await esClient.asCurrentUser.ml.upgradeJobSnapshot({ + job_id: jobId, + snapshot_id: snapshotId, + }); + + const snapshotInfo: MlOperation = { + nodeId: body.node, + snapshotId, + jobId, + }; + + // Store snapshot in saved object if upgrade not complete + if (body.completed !== true) { + await createMlOperation(savedObjectsClient, snapshotInfo); + } + + return response.ok({ + body: { + ...snapshotInfo, + status: body.completed === true ? 'complete' : 'in_progress', + }, + }); + } catch (e) { + return handleEsError({ error: e, response }); + } + } + ) + ); + + // Get the status of the upgrade snapshot task + router.get( + { + path: `${API_BASE_PATH}/ml_snapshots/{jobId}/{snapshotId}`, + validate: { + params: schema.object({ + snapshotId: schema.string(), + jobId: schema.string(), + }), + }, + }, + versionCheckHandlerWrapper( + async ( + { + core: { + savedObjects: { client: savedObjectsClient }, + elasticsearch: { client: esClient }, + }, + }, + request, + response + ) => { + try { + const { snapshotId, jobId } = request.params; + + // Verify snapshot exists + await esClient.asCurrentUser.ml.getModelSnapshots({ + job_id: jobId, + snapshot_id: snapshotId, + }); + + const foundSnapshots = await findMlOperation(savedObjectsClient, snapshotId); + + // If snapshot is *not* found in SO, assume there has not been an upgrade operation started + if (typeof foundSnapshots === 'undefined' || foundSnapshots.total === 0) { + return response.ok({ + body: { + snapshotId, + jobId, + nodeId: undefined, + status: 'idle', + }, + }); + } + + const snapshotOp = foundSnapshots.saved_objects[0]; + const { nodeId } = snapshotOp.attributes; + + // Now that we have the node ID, check the upgrade snapshot task progress + const { body: taskResponse } = await esClient.asCurrentUser.tasks.list({ + nodes: [nodeId], + actions: 'xpack/ml/job/snapshot/upgrade', + detailed: true, // necessary in order to filter if there are more than 1 snapshot upgrades in progress + }); + + const nodeTaskInfo = taskResponse?.nodes && taskResponse!.nodes[nodeId]; + const snapshotInfo: MlOperation = { + ...snapshotOp.attributes, + }; + + if (nodeTaskInfo) { + // Find the correct snapshot task ID based on the task description + const snapshotTaskId = Object.keys(nodeTaskInfo.tasks).find((task) => { + // The description is in the format of "job-snapshot-upgrade--" + const taskDescription = nodeTaskInfo.tasks[task].description; + const taskSnapshotAndJobIds = taskDescription!.replace('job-snapshot-upgrade-', ''); + const taskSnapshotAndJobIdParts = taskSnapshotAndJobIds.split('-'); + const taskSnapshotId = + taskSnapshotAndJobIdParts[taskSnapshotAndJobIdParts.length - 1]; + const taskJobId = taskSnapshotAndJobIdParts.slice(0, 1).join('-'); + + return taskSnapshotId === snapshotId && taskJobId === jobId; + }); + + // If the snapshot task exists, assume the upgrade is in progress + if (snapshotTaskId && nodeTaskInfo.tasks[snapshotTaskId]) { + return response.ok({ + body: { + ...snapshotInfo, + status: 'in_progress', + }, + }); + } else { + // The task ID was not found; verify the deprecation was resolved + const { + isSuccessful: isSnapshotDeprecationResolved, + error: upgradeSnapshotError, + } = await verifySnapshotUpgrade(esClient, { + snapshotId, + jobId, + }); + + // Delete the SO; if it's complete, no need to store it anymore. If there's an error, this will give the user a chance to retry + await deleteMlOperation(savedObjectsClient, snapshotOp.id); + + if (isSnapshotDeprecationResolved) { + return response.ok({ + body: { + ...snapshotInfo, + status: 'complete', + }, + }); + } + + return response.customError({ + statusCode: upgradeSnapshotError ? upgradeSnapshotError.statusCode : 500, + body: { + message: + upgradeSnapshotError?.body?.error?.reason || + 'There was an error upgrading your snapshot. Check the Elasticsearch logs for more details.', + }, + }); + } + } else { + // No tasks found; verify the deprecation was resolved + const { + isSuccessful: isSnapshotDeprecationResolved, + error: upgradeSnapshotError, + } = await verifySnapshotUpgrade(esClient, { + snapshotId, + jobId, + }); + + // Delete the SO; if it's complete, no need to store it anymore. If there's an error, this will give the user a chance to retry + await deleteMlOperation(savedObjectsClient, snapshotOp.id); + + if (isSnapshotDeprecationResolved) { + return response.ok({ + body: { + ...snapshotInfo, + status: 'complete', + }, + }); + } + + return response.customError({ + statusCode: upgradeSnapshotError ? upgradeSnapshotError.statusCode : 500, + body: { + message: + upgradeSnapshotError?.body?.error?.reason || + 'There was an error upgrading your snapshot. Check the Elasticsearch logs for more details.', + }, + }); + } + } catch (e) { + return handleEsError({ error: e, response }); + } + } + ) + ); + + // Delete ML model snapshot + router.delete( + { + path: `${API_BASE_PATH}/ml_snapshots/{jobId}/{snapshotId}`, + validate: { + params: schema.object({ + snapshotId: schema.string(), + jobId: schema.string(), + }), + }, + }, + versionCheckHandlerWrapper( + async ( + { + core: { + elasticsearch: { client }, + }, + }, + request, + response + ) => { + try { + const { snapshotId, jobId } = request.params; + + const { + body: deleteSnapshotResponse, + } = await client.asCurrentUser.ml.deleteModelSnapshot({ + job_id: jobId, + snapshot_id: snapshotId, + }); + + return response.ok({ + body: deleteSnapshotResponse, + }); + } catch (e) { + return handleEsError({ error: e, response }); + } + } + ) + ); +} diff --git a/x-pack/plugins/upgrade_assistant/server/routes/register_routes.ts b/x-pack/plugins/upgrade_assistant/server/routes/register_routes.ts new file mode 100644 index 00000000000000..50cb9257462b9f --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/server/routes/register_routes.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RouteDependencies } from '../types'; + +import { registerClusterCheckupRoutes } from './cluster_checkup'; +import { registerDeprecationLoggingRoutes } from './deprecation_logging'; +import { registerReindexIndicesRoutes } from './reindex_indices'; +import { registerTelemetryRoutes } from './telemetry'; +import { registerUpdateSettingsRoute } from './update_index_settings'; +import { registerMlSnapshotRoutes } from './ml_snapshots'; +import { ReindexWorker } from '../lib/reindexing'; + +export function registerRoutes(dependencies: RouteDependencies, getWorker: () => ReindexWorker) { + registerClusterCheckupRoutes(dependencies); + registerDeprecationLoggingRoutes(dependencies); + registerReindexIndicesRoutes(dependencies, getWorker); + registerTelemetryRoutes(dependencies); + registerUpdateSettingsRoute(dependencies); + registerMlSnapshotRoutes(dependencies); +} diff --git a/x-pack/plugins/upgrade_assistant/server/saved_object_types/index.ts b/x-pack/plugins/upgrade_assistant/server/saved_object_types/index.ts index 91779bd4224b8d..e394cac5100f95 100644 --- a/x-pack/plugins/upgrade_assistant/server/saved_object_types/index.ts +++ b/x-pack/plugins/upgrade_assistant/server/saved_object_types/index.ts @@ -7,3 +7,4 @@ export { reindexOperationSavedObjectType } from './reindex_operation_saved_object_type'; export { telemetrySavedObjectType } from './telemetry_saved_object_type'; +export { mlSavedObjectType } from './ml_upgrade_operation_saved_object_type'; diff --git a/x-pack/plugins/upgrade_assistant/server/saved_object_types/ml_upgrade_operation_saved_object_type.ts b/x-pack/plugins/upgrade_assistant/server/saved_object_types/ml_upgrade_operation_saved_object_type.ts new file mode 100644 index 00000000000000..6dc70fab1203fd --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/server/saved_object_types/ml_upgrade_operation_saved_object_type.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsType } from 'src/core/server'; + +import { ML_UPGRADE_OP_TYPE } from '../../common/types'; + +export const mlSavedObjectType: SavedObjectsType = { + name: ML_UPGRADE_OP_TYPE, + hidden: false, + namespaceType: 'agnostic', + mappings: { + properties: { + nodeId: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + snapshotId: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + jobId: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + status: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 256, + }, + }, + }, + }, + }, +}; diff --git a/x-pack/plugins/upgrade_assistant/server/shared_imports.ts b/x-pack/plugins/upgrade_assistant/server/shared_imports.ts new file mode 100644 index 00000000000000..7f55d189457c70 --- /dev/null +++ b/x-pack/plugins/upgrade_assistant/server/shared_imports.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { handleEsError } from '../../../../src/plugins/es_ui_shared/server'; diff --git a/x-pack/plugins/upgrade_assistant/server/types.ts b/x-pack/plugins/upgrade_assistant/server/types.ts index 80c60e3f310bce..b25b73070e4cf7 100644 --- a/x-pack/plugins/upgrade_assistant/server/types.ts +++ b/x-pack/plugins/upgrade_assistant/server/types.ts @@ -6,7 +6,6 @@ */ import { IRouter, Logger, SavedObjectsServiceStart } from 'src/core/server'; -import { CloudSetup } from '../../cloud/server'; import { CredentialStore } from './lib/reindexing/credential_store'; import { LicensingPluginSetup } from '../../licensing/server'; @@ -16,5 +15,4 @@ export interface RouteDependencies { log: Logger; getSavedObjectsService: () => SavedObjectsServiceStart; licensing: LicensingPluginSetup; - cloud?: CloudSetup; } diff --git a/x-pack/plugins/upgrade_assistant/tsconfig.json b/x-pack/plugins/upgrade_assistant/tsconfig.json index 6303b06c0d8998..750bea75c6656d 100644 --- a/x-pack/plugins/upgrade_assistant/tsconfig.json +++ b/x-pack/plugins/upgrade_assistant/tsconfig.json @@ -20,8 +20,8 @@ { "path": "../../../src/core/tsconfig.json" }, { "path": "../../../src/plugins/management/tsconfig.json" }, { "path": "../../../src/plugins/usage_collection/tsconfig.json" }, - { "path": "../cloud/tsconfig.json" }, { "path": "../features/tsconfig.json" }, { "path": "../licensing/tsconfig.json" }, + { "path": "../../../src/plugins/es_ui_shared/tsconfig.json" }, ] } From 5d95e2e0cd59438e76e7a585eed7ac382f78b057 Mon Sep 17 00:00:00 2001 From: Esteban Beltran Date: Thu, 1 Jul 2021 14:56:21 +0200 Subject: [PATCH 09/43] [Security Solution] Add advance policy keys for memory signature and shellcode protection (#101721) Co-authored-by: Gabriel Landau <42078554+gabriellandau@users.noreply.github.com> --- .../policy/models/advanced_policy_schema.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts index 166d3f3b98a859..62d51c3630db75 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts @@ -658,4 +658,37 @@ export const AdvancedPolicySchema: AdvancedPolicySchemaType[] = [ } ), }, + { + key: 'windows.advanced.memory_protection.shellcode_enhanced_pe_parsing', + first_supported_version: '7.15', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.memory_protection.shellcode_enhanced_pe_parsing', + { + defaultMessage: + "A value of 'false' disables enhanced parsing of PEs found within shellcode payloads. Default: true.", + } + ), + }, + { + key: 'windows.advanced.memory_protection.shellcode', + first_supported_version: '7.15', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.memory_protection.shellcode', + { + defaultMessage: + "A value of 'false' disables Shellcode Injection Protection, a feature of Memory Protection. Default: true.", + } + ), + }, + { + key: 'windows.advanced.memory_protection.memory_scan', + first_supported_version: '7.15', + documentation: i18n.translate( + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.memory_protection.signature', + { + defaultMessage: + "A value of 'false' disables Memory Signature Scanning, a feature of Memory Protection. Default: true.", + } + ), + }, ]; From b612fca2e7e32299cfd721cfe2b369b286ec3068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 1 Jul 2021 09:52:26 -0400 Subject: [PATCH 10/43] Add minimum bucket size when using metric powered ui (#103773) * Add minimum bucket size when using metric powered ui * addressing PR comments * addressing comments Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lib/helpers/get_bucket_size/index.ts | 14 ++---- .../index.test.ts | 44 +++++++++++++++++++ .../index.ts | 23 ++++++++++ ...ervice_instances_transaction_statistics.ts | 15 ++++--- ...e_transaction_group_detailed_statistics.ts | 13 ++++-- .../get_service_transaction_stats.ts | 7 +-- .../apm/server/lib/services/get_throughput.ts | 10 +++-- .../lib/transaction_groups/get_error_rate.ts | 15 ++++--- .../transactions/get_latency_charts/index.ts | 12 +++-- .../get_throughput_charts/index.ts | 11 +++-- 10 files changed, 125 insertions(+), 39 deletions(-) create mode 100644 x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.test.ts create mode 100644 x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.ts diff --git a/x-pack/plugins/apm/server/lib/helpers/get_bucket_size/index.ts b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size/index.ts index 3f36515e72a7a5..eb82a898110877 100644 --- a/x-pack/plugins/apm/server/lib/helpers/get_bucket_size/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size/index.ts @@ -13,24 +13,18 @@ export function getBucketSize({ start, end, numBuckets = 100, + minBucketSize, }: { start: number; end: number; numBuckets?: number; + minBucketSize?: number; }) { const duration = moment.duration(end - start, 'ms'); const bucketSize = Math.max( calculateAuto.near(numBuckets, duration).asSeconds(), - 1 + minBucketSize || 1 ); - const intervalString = `${bucketSize}s`; - if (bucketSize < 0) { - return { - bucketSize: 0, - intervalString: 'auto', - }; - } - - return { bucketSize, intervalString }; + return { bucketSize, intervalString: `${bucketSize}s` }; } diff --git a/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.test.ts b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.test.ts new file mode 100644 index 00000000000000..6af6d3342986ca --- /dev/null +++ b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getBucketSizeForAggregatedTransactions } from './'; + +describe('getBucketSizeForAggregatedTransactions', () => { + describe('when searchAggregatedTransactions is enabled', () => { + it('returns min bucket size when date difference is lower than 60s', () => { + expect( + getBucketSizeForAggregatedTransactions({ + start: new Date('2021-06-30T15:00:00.000Z').valueOf(), + end: new Date('2021-06-30T15:00:30.000Z').valueOf(), + numBuckets: 10, + searchAggregatedTransactions: true, + }) + ).toEqual({ bucketSize: 60, intervalString: '60s' }); + }); + it('returns bucket size when date difference is greater than 60s', () => { + expect( + getBucketSizeForAggregatedTransactions({ + start: new Date('2021-06-30T15:00:00.000Z').valueOf(), + end: new Date('2021-06-30T15:30:00.000Z').valueOf(), + numBuckets: 10, + searchAggregatedTransactions: true, + }) + ).toEqual({ bucketSize: 300, intervalString: '300s' }); + }); + }); + describe('when searchAggregatedTransactions is disabled', () => { + it('returns 1s as bucket size', () => { + expect( + getBucketSizeForAggregatedTransactions({ + start: new Date('2021-06-30T15:00:00.000Z').valueOf(), + end: new Date('2021-06-30T15:00:30.000Z').valueOf(), + numBuckets: 10, + searchAggregatedTransactions: false, + }) + ).toEqual({ bucketSize: 1, intervalString: '1s' }); + }); + }); +}); diff --git a/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.ts b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.ts new file mode 100644 index 00000000000000..b475e518ce9825 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/helpers/get_bucket_size_for_aggregated_transactions/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getBucketSize } from '../get_bucket_size'; + +export function getBucketSizeForAggregatedTransactions({ + start, + end, + numBuckets = 100, + searchAggregatedTransactions, +}: { + start: number; + end: number; + numBuckets?: number; + searchAggregatedTransactions?: boolean; +}) { + const minBucketSize = searchAggregatedTransactions ? 60 : undefined; + return getBucketSize({ start, end, numBuckets, minBucketSize }); +} diff --git a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instances_transaction_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instances_transaction_statistics.ts index 7d9dca9b2a7061..6110ad34599111 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instances_transaction_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_instances/get_service_instances_transaction_statistics.ts @@ -20,7 +20,7 @@ import { getTransactionDurationFieldForAggregatedTransactions, } from '../../helpers/aggregated_transactions'; import { calculateThroughput } from '../../helpers/calculate_throughput'; -import { getBucketSize } from '../../helpers/get_bucket_size'; +import { getBucketSizeForAggregatedTransactions } from '../../helpers/get_bucket_size_for_aggregated_transactions'; import { getLatencyAggregation, getLatencyValue, @@ -78,11 +78,14 @@ export async function getServiceInstancesTransactionStatistics< }): Promise>> { const { apmEventClient } = setup; - const { intervalString, bucketSize } = getBucketSize({ - start, - end, - numBuckets, - }); + const { intervalString, bucketSize } = getBucketSizeForAggregatedTransactions( + { + start, + end, + numBuckets, + searchAggregatedTransactions, + } + ); const field = getTransactionDurationFieldForAggregatedTransactions( searchAggregatedTransactions diff --git a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts index 36d372e322cbc4..ea33c942cfc3bc 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_transaction_group_detailed_statistics.ts @@ -6,7 +6,6 @@ */ import { keyBy } from 'lodash'; -import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { EVENT_OUTCOME, SERVICE_NAME, @@ -15,10 +14,11 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { EventOutcome } from '../../../common/event_outcome'; import { LatencyAggregationType } from '../../../common/latency_aggregation_types'; +import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../server/utils/queries'; import { Coordinate } from '../../../typings/timeseries'; import { @@ -26,7 +26,7 @@ import { getProcessorEventForAggregatedTransactions, getTransactionDurationFieldForAggregatedTransactions, } from '../helpers/aggregated_transactions'; -import { getBucketSize } from '../helpers/get_bucket_size'; +import { getBucketSizeForAggregatedTransactions } from '../helpers/get_bucket_size_for_aggregated_transactions'; import { getLatencyAggregation, getLatencyValue, @@ -68,7 +68,12 @@ export async function getServiceTransactionGroupDetailedStatistics({ }> > { const { apmEventClient } = setup; - const { intervalString } = getBucketSize({ start, end, numBuckets }); + const { intervalString } = getBucketSizeForAggregatedTransactions({ + start, + end, + numBuckets, + searchAggregatedTransactions, + }); const field = getTransactionDurationFieldForAggregatedTransactions( searchAggregatedTransactions diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts index 019ab8770887ae..7f48c591521e71 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_service_transaction_stats.ts @@ -17,8 +17,8 @@ import { } from '../../../../common/transaction_types'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../../server/utils/queries'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { @@ -26,8 +26,8 @@ import { getProcessorEventForAggregatedTransactions, getTransactionDurationFieldForAggregatedTransactions, } from '../../helpers/aggregated_transactions'; -import { getBucketSize } from '../../helpers/get_bucket_size'; import { calculateThroughput } from '../../helpers/calculate_throughput'; +import { getBucketSizeForAggregatedTransactions } from '../../helpers/get_bucket_size_for_aggregated_transactions'; import { calculateTransactionErrorPercentage, getOutcomeAggregation, @@ -117,10 +117,11 @@ export async function getServiceTransactionStats({ timeseries: { date_histogram: { field: '@timestamp', - fixed_interval: getBucketSize({ + fixed_interval: getBucketSizeForAggregatedTransactions({ start, end, numBuckets: 20, + searchAggregatedTransactions, }).intervalString, min_doc_count: 0, extended_bounds: { min: start, max: end }, diff --git a/x-pack/plugins/apm/server/lib/services/get_throughput.ts b/x-pack/plugins/apm/server/lib/services/get_throughput.ts index 0490c31e7c63d3..7eacf47f15b7ab 100644 --- a/x-pack/plugins/apm/server/lib/services/get_throughput.ts +++ b/x-pack/plugins/apm/server/lib/services/get_throughput.ts @@ -12,14 +12,14 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, } from '../helpers/aggregated_transactions'; -import { getBucketSize } from '../helpers/get_bucket_size'; +import { getBucketSizeForAggregatedTransactions } from '../helpers/get_bucket_size_for_aggregated_transactions'; import { Setup } from '../helpers/setup_request'; interface Options { @@ -44,7 +44,11 @@ function fetcher({ end, }: Options) { const { apmEventClient } = setup; - const { intervalString } = getBucketSize({ start, end }); + const { intervalString } = getBucketSizeForAggregatedTransactions({ + start, + end, + searchAggregatedTransactions, + }); const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, { term: { [TRANSACTION_TYPE]: transactionType } }, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts index 6499e80be93027..cc3a13ef5c648f 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts @@ -5,9 +5,6 @@ * 2.0. */ -import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; -import { Coordinate } from '../../../typings/timeseries'; - import { EVENT_OUTCOME, SERVICE_NAME, @@ -15,16 +12,18 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { EventOutcome } from '../../../common/event_outcome'; +import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_previous_period_coordinate'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../server/utils/queries'; +import { Coordinate } from '../../../typings/timeseries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, } from '../helpers/aggregated_transactions'; -import { getBucketSize } from '../helpers/get_bucket_size'; +import { getBucketSizeForAggregatedTransactions } from '../helpers/get_bucket_size_for_aggregated_transactions'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; import { calculateTransactionErrorPercentage, @@ -101,7 +100,11 @@ export async function getErrorRate({ timeseries: { date_histogram: { field: '@timestamp', - fixed_interval: getBucketSize({ start, end }).intervalString, + fixed_interval: getBucketSizeForAggregatedTransactions({ + start, + end, + searchAggregatedTransactions, + }).intervalString, min_doc_count: 0, extended_bounds: { min: start, max: end }, }, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts index 1f8170921aac3c..e3f59ca2e43280 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { offsetPreviousPeriodCoordinates } from '../../../../common/utils/offset_previous_period_coordinate'; import { ESFilter } from '../../../../../../../src/core/types/elasticsearch'; import { PromiseReturnType } from '../../../../../observability/typings/common'; import { @@ -14,18 +13,19 @@ import { TRANSACTION_TYPE, } from '../../../../common/elasticsearch_fieldnames'; import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; +import { offsetPreviousPeriodCoordinates } from '../../../../common/utils/offset_previous_period_coordinate'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, getTransactionDurationFieldForAggregatedTransactions, } from '../../../lib/helpers/aggregated_transactions'; -import { getBucketSize } from '../../../lib/helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../../lib/helpers/setup_request'; +import { getBucketSizeForAggregatedTransactions } from '../../helpers/get_bucket_size_for_aggregated_transactions'; import { getLatencyAggregation, getLatencyValue, @@ -58,7 +58,11 @@ function searchLatency({ end: number; }) { const { apmEventClient } = setup; - const { intervalString } = getBucketSize({ start, end }); + const { intervalString } = getBucketSizeForAggregatedTransactions({ + start, + end, + searchAggregatedTransactions, + }); const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, diff --git a/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts index ed85e700c3473f..ff3534159d19b6 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_throughput_charts/index.ts @@ -15,15 +15,15 @@ import { } from '../../../../common/elasticsearch_fieldnames'; import { environmentQuery, - rangeQuery, kqlQuery, + rangeQuery, } from '../../../../server/utils/queries'; import { getDocumentTypeFilterForAggregatedTransactions, getProcessorEventForAggregatedTransactions, } from '../../../lib/helpers/aggregated_transactions'; -import { getBucketSize } from '../../../lib/helpers/get_bucket_size'; import { Setup, SetupTimeRange } from '../../../lib/helpers/setup_request'; +import { getBucketSizeForAggregatedTransactions } from '../../helpers/get_bucket_size_for_aggregated_transactions'; import { getThroughputBuckets } from './transform'; export type ThroughputChartsResponse = PromiseReturnType< @@ -115,7 +115,12 @@ export async function getThroughputCharts({ setup: Setup & SetupTimeRange; searchAggregatedTransactions: boolean; }) { - const { bucketSize, intervalString } = getBucketSize(setup); + const { bucketSize, intervalString } = getBucketSizeForAggregatedTransactions( + { + ...setup, + searchAggregatedTransactions, + } + ); const response = await searchThroughput({ environment, From a842a731e80d9142c1bf9ed1d94eb55e233fe433 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Thu, 1 Jul 2021 08:58:57 -0500 Subject: [PATCH 11/43] [Security Solution] fix failed packages call infinite retry (#103998) --- .../pages/endpoint_hosts/store/middleware.ts | 5 ++--- .../management/pages/endpoint_hosts/store/selectors.ts | 10 +++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index 1a431ea88ad6a0..2f8ced9d2a771f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -36,8 +36,7 @@ import { getLastLoadedActivityLogData, detailsData, getEndpointDetailsFlyoutView, - getIsEndpointPackageInfoPending, - getIsEndpointPackageInfoSuccessful, + getIsEndpointPackageInfoUninitialized, } from './selectors'; import { AgentIdsPendingActions, EndpointState, PolicyIds } from '../types'; import { @@ -598,7 +597,7 @@ async function getEndpointPackageInfo( dispatch: Dispatch, coreStart: CoreStart ) { - if (getIsEndpointPackageInfoPending(state) || getIsEndpointPackageInfoSuccessful(state)) return; + if (!getIsEndpointPackageInfoUninitialized(state)) return; dispatch({ type: 'endpointPackageInfoStateChanged', diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index c09e4032d6222f..5771fbac957d8b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -33,6 +33,7 @@ import { isFailedResourceState, isLoadedResourceState, isLoadingResourceState, + isUninitialisedResourceState, } from '../../../state'; import { ServerApiError } from '../../../../common/types'; @@ -69,15 +70,10 @@ export const policyItemsLoading = (state: Immutable) => state.pol export const selectedPolicyId = (state: Immutable) => state.selectedPolicyId; export const endpointPackageInfo = (state: Immutable) => state.endpointPackageInfo; -export const getIsEndpointPackageInfoPending: ( +export const getIsEndpointPackageInfoUninitialized: ( state: Immutable ) => boolean = createSelector(endpointPackageInfo, (packageInfo) => - isLoadingResourceState(packageInfo) -); -export const getIsEndpointPackageInfoSuccessful: ( - state: Immutable -) => boolean = createSelector(endpointPackageInfo, (packageInfo) => - isLoadedResourceState(packageInfo) + isUninitialisedResourceState(packageInfo) ); export const isAutoRefreshEnabled = (state: Immutable) => state.isAutoRefreshEnabled; From ff3b5231c6f0e36eacb2c47049435954e61e3f8b Mon Sep 17 00:00:00 2001 From: ymao1 Date: Thu, 1 Jul 2021 10:23:44 -0400 Subject: [PATCH 12/43] Aligning logger contexts (#103741) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/actions/server/plugin.ts | 2 +- x-pack/plugins/alerting/server/plugin.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index 65b28015f7f932..2c5287525c5974 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -152,7 +152,7 @@ export class ActionsPlugin implements Plugin()) diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts index df63625bf242d2..b906983017ff60 100644 --- a/x-pack/plugins/alerting/server/plugin.ts +++ b/x-pack/plugins/alerting/server/plugin.ts @@ -153,7 +153,7 @@ export class AlertingPlugin { constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.create().pipe(first()).toPromise(); - this.logger = initializerContext.logger.get('plugins', 'alerting'); + this.logger = initializerContext.logger.get(); this.taskRunnerFactory = new TaskRunnerFactory(); this.alertsClientFactory = new AlertsClientFactory(); this.alertingAuthorizationClientFactory = new AlertingAuthorizationClientFactory(); From dd3a80669043ada55784aa8852e9a8e103d118cc Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Thu, 1 Jul 2021 10:24:24 -0400 Subject: [PATCH 13/43] switch to using internal user (#103931) --- .../components/job_details/job_messages_pane.tsx | 2 +- .../models/job_audit_messages/job_audit_messages.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx index a78a832fdb6e92..9a4d6036428f84 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx @@ -102,7 +102,7 @@ export const JobMessagesPane: FC = React.memo( return ( <> - + {canCreateJob && showClearButton ? : null} {canCreateJob && showClearButton ? ( diff --git a/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js b/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js index 318c103b39636e..137df3a6f3151e 100644 --- a/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js +++ b/x-pack/plugins/ml/server/models/job_audit_messages/job_audit_messages.js @@ -39,7 +39,7 @@ const anomalyDetectorTypeFilter = { }, }; -export function jobAuditMessagesProvider({ asInternalUser, asCurrentUser }, mlClient) { +export function jobAuditMessagesProvider({ asInternalUser }, mlClient) { // search for audit messages, // jobId is optional. without it, all jobs will be listed. // from is optional and should be a string formatted in ES time units. e.g. 12h, 1d, 7d @@ -310,10 +310,10 @@ export function jobAuditMessagesProvider({ asInternalUser, asCurrentUser }, mlCl }; await Promise.all([ - asCurrentUser.updateByQuery({ + asInternalUser.updateByQuery({ index: ML_NOTIFICATION_INDEX_02, ignore_unavailable: true, - refresh: true, + refresh: false, conflicts: 'proceed', body: { query, @@ -323,7 +323,7 @@ export function jobAuditMessagesProvider({ asInternalUser, asCurrentUser }, mlCl }, }, }), - asCurrentUser.index({ + asInternalUser.index({ index: ML_NOTIFICATION_INDEX_02, body: newClearedMessage, refresh: 'wait_for', From 7cc112d245c8bee34814a44c378a2cfcec34c285 Mon Sep 17 00:00:00 2001 From: ymao1 Date: Thu, 1 Jul 2021 10:39:21 -0400 Subject: [PATCH 14/43] [Task Manager] Fixing typo in field name (#103948) * Fixing typo * Fixing typo Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../task-manager-troubleshooting.asciidoc | 6 ++-- .../server/lib/log_health_metrics.test.ts | 2 +- .../monitoring/capacity_estimation.test.ts | 28 +++++++++---------- .../server/monitoring/capacity_estimation.ts | 8 +++--- .../monitoring/workload_statistics.test.ts | 2 +- .../server/monitoring/workload_statistics.ts | 6 ++-- .../task_manager/server/routes/health.test.ts | 2 +- .../test_suites/task_manager/health_route.ts | 8 +++--- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/user/production-considerations/task-manager-troubleshooting.asciidoc b/docs/user/production-considerations/task-manager-troubleshooting.asciidoc index 363562d4cd1937..98201087b9aae1 100644 --- a/docs/user/production-considerations/task-manager-troubleshooting.asciidoc +++ b/docs/user/production-considerations/task-manager-troubleshooting.asciidoc @@ -248,7 +248,7 @@ The API returns the following: "overdue": 10, "overdue_non_recurring": 10, "estimated_schedule_density": [0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0], - "capacity_requirments": { + "capacity_requirements": { "per_minute": 6, "per_hour": 28, "per_day": 2 @@ -737,7 +737,7 @@ Evaluating the preceding health stats in the previous example, you see the follo 0, 3, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0 ], - "capacity_requirments": { # <10> + "capacity_requirements": { # <10> "per_minute": 14, "per_hour": 240, "per_day": 0 @@ -819,7 +819,7 @@ Suppose the output of `stats.workload.value` looked something like this: 0, 31, 0, 12, 16, 31, 0, 10, 0, 10, 3, 22, 0, 10, 0, 2, 10, 10, 1, 0 ], - "capacity_requirments": { + "capacity_requirements": { "per_minute": 329, # <4> "per_hour": 4272, # <5> "per_day": 61 # <6> diff --git a/x-pack/plugins/task_manager/server/lib/log_health_metrics.test.ts b/x-pack/plugins/task_manager/server/lib/log_health_metrics.test.ts index f5163f4ca5ed8e..aca73a4b774341 100644 --- a/x-pack/plugins/task_manager/server/lib/log_health_metrics.test.ts +++ b/x-pack/plugins/task_manager/server/lib/log_health_metrics.test.ts @@ -360,7 +360,7 @@ function getMockMonitoredHealth(overrides = {}): MonitoredHealth { non_recurring: 20, owner_ids: 2, estimated_schedule_density: [], - capacity_requirments: { + capacity_requirements: { per_minute: 150, per_hour: 360, per_day: 820, diff --git a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts index c68e307dbec03f..bd8ecf0cc6d93e 100644 --- a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts +++ b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.test.ts @@ -17,7 +17,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 60, per_hour: 0, per_day: 0, @@ -72,7 +72,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 60, per_hour: 0, per_day: 0, @@ -129,7 +129,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 60, per_hour: 0, per_day: 0, @@ -165,7 +165,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 0, per_hour: 12000, per_day: 200, @@ -221,7 +221,7 @@ describe('estimateCapacity', () => { // 0 active tasks at this moment in time, so no owners identifiable owner_ids: 0, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 60, per_hour: 0, per_day: 0, @@ -276,7 +276,7 @@ describe('estimateCapacity', () => { { owner_ids: 3, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 150, per_hour: 60, per_day: 0, @@ -337,7 +337,7 @@ describe('estimateCapacity', () => { { owner_ids: provisionedKibanaInstances, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 150, per_hour: 60, per_day: 0, @@ -417,7 +417,7 @@ describe('estimateCapacity', () => { { owner_ids: provisionedKibanaInstances, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: recurringTasksPerMinute, per_hour: 0, per_day: 0, @@ -498,7 +498,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 170, per_hour: 0, per_day: 0, @@ -562,7 +562,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 175, per_hour: 0, per_day: 0, @@ -623,7 +623,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 210, per_hour: 0, per_day: 0, @@ -684,7 +684,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 28, per_hour: 27, per_day: 2, @@ -759,7 +759,7 @@ describe('estimateCapacity', () => { { owner_ids: 1, overdue_non_recurring: 0, - capacity_requirments: { + capacity_requirements: { per_minute: 210, per_hour: 0, per_day: 0, @@ -871,7 +871,7 @@ function mockStats( estimated_schedule_density: [], non_recurring: 20, owner_ids: 2, - capacity_requirments: { + capacity_requirements: { per_minute: 150, per_hour: 360, per_day: 820, diff --git a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts index 073112f94e049b..90f564152c8c7f 100644 --- a/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts +++ b/x-pack/plugins/task_manager/server/monitoring/capacity_estimation.ts @@ -58,7 +58,7 @@ export function estimateCapacity( recurring: percentageOfExecutionsUsedByRecurringTasks, non_recurring: percentageOfExecutionsUsedByNonRecurringTasks, } = capacityStats.runtime.value.execution.persistence; - const { overdue, capacity_requirments: capacityRequirments } = workload; + const { overdue, capacity_requirements: capacityRequirements } = workload; const { poll_interval: pollInterval, max_workers: maxWorkers, @@ -130,9 +130,9 @@ export function estimateCapacity( * On average, how many tasks per minute does this cluster need to execute? */ const averageRecurringRequiredPerMinute = - capacityRequirments.per_minute + - capacityRequirments.per_hour / 60 + - capacityRequirments.per_day / 24 / 60; + capacityRequirements.per_minute + + capacityRequirements.per_hour / 60 + + capacityRequirements.per_day / 24 / 60; /** * how many Kibana are needed solely for the recurring tasks diff --git a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts index 3fe003ebc6591e..9125bca8f5b05c 100644 --- a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts +++ b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.test.ts @@ -624,7 +624,7 @@ describe('Workload Statistics Aggregator', () => { expect(result.key).toEqual('workload'); expect(result.value).toMatchObject({ - capacity_requirments: { + capacity_requirements: { // these are buckets of required capacity, rather than aggregated requirmenets. per_minute: 150, per_hour: 360, diff --git a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts index 64c1c661401963..5c4e7d6cbe2cf3 100644 --- a/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts +++ b/x-pack/plugins/task_manager/server/monitoring/workload_statistics.ts @@ -36,7 +36,7 @@ interface RawWorkloadStat extends JsonObject { overdue: number; overdue_non_recurring: number; estimated_schedule_density: number[]; - capacity_requirments: CapacityRequirments; + capacity_requirements: CapacityRequirements; } export interface WorkloadStat extends RawWorkloadStat { @@ -45,7 +45,7 @@ export interface WorkloadStat extends RawWorkloadStat { export interface SummarizedWorkloadStat extends RawWorkloadStat { owner_ids: number; } -export interface CapacityRequirments extends JsonObject { +export interface CapacityRequirements extends JsonObject { per_minute: number; per_hour: number; per_day: number; @@ -277,7 +277,7 @@ export function createWorkloadAggregator( pollInterval, scheduleDensity ), - capacity_requirments: { + capacity_requirements: { per_minute: cadence.perMinute, per_hour: cadence.perHour, per_day: cadence.perDay, diff --git a/x-pack/plugins/task_manager/server/routes/health.test.ts b/x-pack/plugins/task_manager/server/routes/health.test.ts index 735029e90c2d32..ece91ed571f880 100644 --- a/x-pack/plugins/task_manager/server/routes/health.test.ts +++ b/x-pack/plugins/task_manager/server/routes/health.test.ts @@ -464,7 +464,7 @@ function mockHealthStats(overrides = {}) { non_recurring: 20, owner_ids: [0, 0, 0, 1, 2, 0, 0, 2, 2, 2, 1, 2, 1, 1], estimated_schedule_density: [], - capacity_requirments: { + capacity_requirements: { per_minute: 150, per_hour: 360, per_day: 820, diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts index 2626ef2421f0b8..fd3a5abc0e4bf2 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts @@ -30,7 +30,7 @@ interface MonitoringStats { non_recurring: number; owner_ids: number; estimated_schedule_density: number[]; - capacity_requirments: { + capacity_requirements: { per_minute: number; per_hour: number; per_day: number; @@ -218,9 +218,9 @@ export default function ({ getService }: FtrProviderContext) { expect(typeof workload.non_recurring).to.eql('number'); expect(typeof workload.owner_ids).to.eql('number'); - expect(typeof workload.capacity_requirments.per_minute).to.eql('number'); - expect(typeof workload.capacity_requirments.per_hour).to.eql('number'); - expect(typeof workload.capacity_requirments.per_day).to.eql('number'); + expect(typeof workload.capacity_requirements.per_minute).to.eql('number'); + expect(typeof workload.capacity_requirements.per_hour).to.eql('number'); + expect(typeof workload.capacity_requirements.per_day).to.eql('number'); expect(Array.isArray(workload.estimated_schedule_density)).to.eql(true); From 027446634e896165295cf2999437380a5fd4a4ff Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Thu, 1 Jul 2021 17:27:36 +0200 Subject: [PATCH 15/43] [ML] Fix missing script aggs on the transform preview table (#103913) * [ML] get field type from sampled doc for script fields * [ML] refactor, unit tests --- .../public/app/hooks/use_pivot_data.test.ts | 78 +++++++++++++++++++ .../public/app/hooks/use_pivot_data.ts | 24 +++++- 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 x-pack/plugins/transform/public/app/hooks/use_pivot_data.test.ts diff --git a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.test.ts b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.test.ts new file mode 100644 index 00000000000000..aa8f5421184e58 --- /dev/null +++ b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getCombinedProperties } from './use_pivot_data'; +import { ES_FIELD_TYPES } from '../../../../../../src/plugins/data/common'; + +describe('getCombinedProperties', () => { + test('extracts missing mappings from docs', () => { + const mappingProps = { + testProp: { + type: ES_FIELD_TYPES.STRING, + }, + }; + + const docs = [ + { + testProp: 'test_value1', + scriptProp: 1, + }, + { + testProp: 'test_value2', + scriptProp: 2, + }, + { + testProp: 'test_value3', + scriptProp: 3, + }, + ]; + + expect(getCombinedProperties(mappingProps, docs)).toEqual({ + testProp: { + type: 'string', + }, + scriptProp: { + type: 'number', + }, + }); + }); + + test('does not override defined mappings', () => { + const mappingProps = { + testProp: { + type: ES_FIELD_TYPES.STRING, + }, + scriptProp: { + type: ES_FIELD_TYPES.LONG, + }, + }; + + const docs = [ + { + testProp: 'test_value1', + scriptProp: 1, + }, + { + testProp: 'test_value2', + scriptProp: 2, + }, + { + testProp: 'test_value3', + scriptProp: 3, + }, + ]; + + expect(getCombinedProperties(mappingProps, docs)).toEqual({ + testProp: { + type: 'string', + }, + scriptProp: { + type: 'long', + }, + }); + }); +}); diff --git a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts index 9a49ed94803599..329e2d5f871315 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_pivot_data.ts @@ -13,6 +13,7 @@ import { EuiDataGridColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { getFlattenedObject } from '@kbn/std'; +import { sample, difference } from 'lodash'; import { ES_FIELD_TYPES } from '../../../../../../src/plugins/data/common'; import type { PreviewMappingsProperties } from '../../../common/api_schemas/transforms'; @@ -71,6 +72,25 @@ function sortColumnsForLatest(sortField: string) { }; } +/** + * Extracts missing mappings from docs. + */ +export function getCombinedProperties( + populatedProperties: PreviewMappingsProperties, + docs: Array> +): PreviewMappingsProperties { + // Take a sample from docs and resolve missing mappings + const sampleDoc = sample(docs) ?? {}; + const missingMappings = difference(Object.keys(sampleDoc), Object.keys(populatedProperties)); + return { + ...populatedProperties, + ...missingMappings.reduce((acc, curr) => { + acc[curr] = { type: typeof sampleDoc[curr] as ES_FIELD_TYPES }; + return acc; + }, {} as PreviewMappingsProperties), + }; +} + export const usePivotData = ( indexPatternTitle: SearchItems['indexPattern']['title'], query: PivotQuery, @@ -170,7 +190,7 @@ export const usePivotData = ( const populatedFields = [...new Set(docs.map(Object.keys).flat(1))]; // 3. Filter mapping properties by populated fields - const populatedProperties: PreviewMappingsProperties = Object.entries( + let populatedProperties: PreviewMappingsProperties = Object.entries( resp.generated_dest_index.mappings.properties ) .filter(([key]) => populatedFields.includes(key)) @@ -182,6 +202,8 @@ export const usePivotData = ( {} ); + populatedProperties = getCombinedProperties(populatedProperties, docs); + setTableItems(docs); setRowCount(docs.length); setRowCountRelation(ES_CLIENT_TOTAL_HITS_RELATION.EQ); From 0fe301d083137399069c96fa1a3af53c13bd296e Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Thu, 1 Jul 2021 11:30:13 -0400 Subject: [PATCH 16/43] Search integrations for all substrings + don't search on description (#104099) --- .../applications/integrations/hooks/use_local_search.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_local_search.tsx b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_local_search.tsx index 43db5657b06155..fc2966697418aa 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/hooks/use_local_search.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/hooks/use_local_search.tsx @@ -5,19 +5,20 @@ * 2.0. */ -import { Search as LocalSearch } from 'js-search'; +import { Search as LocalSearch, AllSubstringsIndexStrategy } from 'js-search'; import { useEffect, useRef } from 'react'; import type { PackageList } from '../../../types'; export const searchIdField = 'id'; -export const fieldsToSearch = ['description', 'name', 'title']; +export const fieldsToSearch = ['name', 'title']; export function useLocalSearch(packageList: PackageList) { const localSearchRef = useRef(null); useEffect(() => { const localSearch = new LocalSearch(searchIdField); + localSearch.indexStrategy = new AllSubstringsIndexStrategy(); fieldsToSearch.forEach((field) => localSearch.addIndex(field)); localSearch.addDocuments(packageList); localSearchRef.current = localSearch; From b8747bde686e16bfbbb4d2df49df589fb7b68b79 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 1 Jul 2021 11:47:06 -0400 Subject: [PATCH 17/43] [Ingest pipelines] Support output_format in date processor (#103729) --- .../__jest__/processors/date.test.tsx | 10 ++-- .../__jest__/processors/processor.helpers.tsx | 1 + .../processor_form/processors/date.tsx | 48 +++++++++++++++++-- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx index 555ed7a09fe4f8..390f8e0191ce9a 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/date.test.tsx @@ -95,22 +95,19 @@ describe('Processor: Date', () => { component, } = testBed; + // Set required parameters form.setInputValue('fieldNameField.input', 'field_1'); - // Set optional parameteres await act(async () => { find('formatsValueField.input').simulate('change', [{ label: 'ISO8601' }]); }); component.update(); - // Set target field + // Set optional parameters form.setInputValue('targetField.input', 'target_field'); - - // Set locale field form.setInputValue('localeField.input', 'SPANISH'); - - // Set timezone field. form.setInputValue('timezoneField.input', 'EST'); + form.setInputValue('outputFormatField.input', 'yyyy-MM-dd'); // Save the field with new changes await saveNewProcessor(); @@ -122,6 +119,7 @@ describe('Processor: Date', () => { target_field: 'target_field', locale: 'SPANISH', timezone: 'EST', + output_format: 'yyyy-MM-dd', }); }); }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx index d50189167a2ff4..24e1ddce008ea6 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/processors/processor.helpers.tsx @@ -140,6 +140,7 @@ type TestSubject = | 'appendValueField.input' | 'formatsValueField.input' | 'timezoneField.input' + | 'outputFormatField.input' | 'localeField.input' | 'processorTypeSelector.input' | 'fieldNameField.input' diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx index b1e42d067e56e2..90138757c97aa7 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/date.tsx @@ -32,10 +32,20 @@ const fieldsConfig: FieldsConfig = { label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldLabel', { defaultMessage: 'Formats', }), - helpText: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldHelpText', { - defaultMessage: - 'Expected date formats. Provided formats are applied sequentially. Accepts a Java time pattern, ISO8601, UNIX, UNIX_MS, or TAI64N formats.', - }), + helpText: ( + + {'ISO8601'},{'UNIX'}, + {'UNIX_MS'},{'TAI64N'} + + ), + }} + /> + ), validations: [ { validator: minLengthField({ @@ -79,6 +89,29 @@ const fieldsConfig: FieldsConfig = { /> ), }, + output_format: { + type: FIELD_TYPES.TEXT, + serializer: from.emptyStringToUndefined, + label: i18n.translate('xpack.ingestPipelines.pipelineEditor.dateForm.outputFormatFieldLabel', { + defaultMessage: 'Output format (optional)', + }), + helpText: ( + {'target_field'}, + allowedFormats: ( + <> + {'ISO8601'},{'UNIX'}, + {'UNIX_MS'},{'TAI64N'} + + ), + defaultFormat: {`yyyy-MM-dd'T'HH:mm:ss.SSSXXX`}, + }} + /> + ), + }, }; /** @@ -126,6 +159,13 @@ export const DateProcessor: FunctionComponent = () => { component={Field} path="fields.locale" /> + + ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c0c14ef4cc6eb5..a32ea7b53f6eec 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11946,7 +11946,6 @@ "xpack.ingestPipelines.pipelineEditor.customForm.optionsFieldAriaLabel": "構成JSONエディター", "xpack.ingestPipelines.pipelineEditor.customForm.optionsFieldLabel": "構成", "xpack.ingestPipelines.pipelineEditor.dateForm.fieldNameHelpText": "変換するフィールド。", - "xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldHelpText": "想定されるデータ形式。指定された形式は連続で適用されます。Java時刻パターン、ISO8601、UNIX、UNIX_MS、TAI64Nを使用できます。", "xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldLabel": "形式", "xpack.ingestPipelines.pipelineEditor.dateForm.formatsRequiredError": "形式の値は必須です。", "xpack.ingestPipelines.pipelineEditor.dateForm.localeFieldLabel": "ロケール (任意) ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 68bd84f6ae757f..eb96616c53053d 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12110,7 +12110,6 @@ "xpack.ingestPipelines.pipelineEditor.customForm.optionsFieldAriaLabel": "配置 JSON 编辑器", "xpack.ingestPipelines.pipelineEditor.customForm.optionsFieldLabel": "配置", "xpack.ingestPipelines.pipelineEditor.dateForm.fieldNameHelpText": "要转换的字段。", - "xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldHelpText": "预期的日期格式。提供的格式按顺序应用。接受 Java 时间模式、ISO8601、UNIX、UNIX_MS 或 TAI64N 格式。", "xpack.ingestPipelines.pipelineEditor.dateForm.formatsFieldLabel": "格式", "xpack.ingestPipelines.pipelineEditor.dateForm.formatsRequiredError": "需要格式的值。", "xpack.ingestPipelines.pipelineEditor.dateForm.localeFieldLabel": "区域设置 (可选) ", From 644d2ce9189e120554001f94020972629f2f1593 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Thu, 1 Jul 2021 19:02:11 +0300 Subject: [PATCH 18/43] [Detections] Truncate case title in toaster when attaching an alert to case (#103228) --- x-pack/plugins/cases/common/constants.ts | 6 ++ .../cases/public/common/translations.ts | 6 ++ .../public/components/all_cases/columns.tsx | 5 +- .../components/create/form_context.test.tsx | 30 ++++++ .../cases/public/components/create/schema.tsx | 10 +- .../__snapshots__/title.test.tsx.snap | 18 +++- .../header_page/editable_title.test.tsx | 29 ++++++ .../components/header_page/editable_title.tsx | 96 +++++++++++-------- .../components/header_page/title.test.tsx | 6 ++ .../public/components/header_page/title.tsx | 4 +- .../components/header_page/translations.ts | 2 + .../components/recent_cases/recent_cases.tsx | 3 +- .../components/truncated_text/index.tsx | 29 ++++++ .../cases/server/client/cases/create.ts | 7 ++ .../cases/server/client/cases/update.ts | 20 ++++ .../timeline_actions/helpers.test.tsx | 25 ++++- .../components/timeline_actions/helpers.tsx | 13 ++- .../tests/common/cases/patch_cases.ts | 20 ++++ .../tests/common/cases/post_case.ts | 7 ++ 19 files changed, 286 insertions(+), 50 deletions(-) create mode 100644 x-pack/plugins/cases/public/components/truncated_text/index.tsx diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 5d7ee47bb8ea0e..fb3a0475d627ad 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -94,3 +94,9 @@ if (ENABLE_CASE_CONNECTOR) { export const MAX_DOCS_PER_PAGE = 10000; export const MAX_CONCURRENT_SEARCHES = 10; + +/** + * Validation + */ + +export const MAX_TITLE_LENGTH = 64; diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index 020d301c8e30e1..c81ec1c25d84f0 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -228,3 +228,9 @@ export const SELECTABLE_MESSAGE_COLLECTIONS = i18n.translate( export const SELECT_CASE_TITLE = i18n.translate('xpack.cases.common.allCases.caseModal.title', { defaultMessage: 'Select case', }); + +export const MAX_LENGTH_ERROR = (field: string, length: number) => + i18n.translate('xpack.cases.createCase.maxLengthError', { + values: { field, length }, + defaultMessage: 'The length of the {field} is too long. The maximum length is {length}.', + }); diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx index ad4447223837c2..140dbf2f53c25c 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -34,6 +34,7 @@ import { useDeleteCases } from '../../containers/use_delete_cases'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; import { useKibana } from '../../common/lib/kibana'; import { StatusContextMenu } from '../case_action_bar/status_context_menu'; +import { TruncatedText } from '../truncated_text'; export type CasesColumns = | EuiTableActionsColumnType @@ -145,10 +146,10 @@ export const useCasesColumns = ({ subCaseId={isSubCase(theCase) ? theCase.id : undefined} title={theCase.title} > - {theCase.title} + ) : ( - {theCase.title} + ); return theCase.status !== CaseStatuses.closed ? ( caseDetailsLinkComponent diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index e083f11ced7770..0ddab55c621d38 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -183,6 +183,36 @@ describe('Create case', () => { await waitFor(() => expect(postCase).toBeCalledWith(sampleData)); }); + it('it does not submits the title when the length is longer than 64 characters', async () => { + const longTitle = + 'This is a title that should not be saved as it is longer than 64 characters.'; + + const wrapper = mount( + + + + + + + ); + + act(() => { + wrapper + .find(`[data-test-subj="caseTitle"] input`) + .first() + .simulate('change', { target: { value: longTitle } }); + wrapper.find(`[data-test-subj="create-case-submit"]`).first().simulate('click'); + }); + + await waitFor(() => { + wrapper.update(); + expect(wrapper.find('[data-test-subj="caseTitle"] .euiFormErrorText').text()).toBe( + 'The length of the title is too long. The maximum length is 64.' + ); + }); + expect(postCase).not.toHaveBeenCalled(); + }); + it('should toggle sync settings', async () => { useConnectorsMock.mockReturnValue({ ...sampleConnectorData, diff --git a/x-pack/plugins/cases/public/components/create/schema.tsx b/x-pack/plugins/cases/public/components/create/schema.tsx index bea1a46d93760c..41709a74d2fa53 100644 --- a/x-pack/plugins/cases/public/components/create/schema.tsx +++ b/x-pack/plugins/cases/public/components/create/schema.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import { CasePostRequest, ConnectorTypeFields } from '../../../common'; +import { CasePostRequest, ConnectorTypeFields, MAX_TITLE_LENGTH } from '../../../common'; import { FIELD_TYPES, fieldValidators, FormSchema } from '../../common/shared_imports'; import * as i18n from './translations'; import { OptionalFieldLabel } from './optional_field_label'; -const { emptyField } = fieldValidators; +const { emptyField, maxLengthField } = fieldValidators; export const schemaTags = { type: FIELD_TYPES.COMBO_BOX, @@ -33,6 +33,12 @@ export const schema: FormSchema = { { validator: emptyField(i18n.TITLE_REQUIRED), }, + { + validator: maxLengthField({ + length: MAX_TITLE_LENGTH, + message: i18n.MAX_LENGTH_ERROR('title', MAX_TITLE_LENGTH), + }), + }, ], }, description: { diff --git a/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap b/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap index 05af2fee2c2a28..9ff9b0616c57e5 100644 --- a/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap +++ b/x-pack/plugins/cases/public/components/header_page/__snapshots__/title.test.tsx.snap @@ -7,7 +7,9 @@ exports[`Title it renders 1`] = `

- Test title + `; + +exports[`Title it renders the title if is not a string 1`] = ` + +

+ + Test title + +

+
+`; diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx index babfeb584677b3..19aea39f1f793b 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx @@ -187,4 +187,33 @@ describe('EditableTitle', () => { expect(submitTitle.mock.calls[0][0]).toEqual(newTitle); expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe(true); }); + + test('it does not submits the title when the length is longer than 64 characters', () => { + const longTitle = + 'This is a title that should not be saved as it is longer than 64 characters.'; + + const wrapper = mount( + + + + ); + + wrapper.find('button[data-test-subj="editable-title-edit-icon"]').simulate('click'); + wrapper.update(); + + wrapper + .find('input[data-test-subj="editable-title-input-field"]') + .simulate('change', { target: { value: longTitle } }); + + wrapper.find('button[data-test-subj="editable-title-submit-btn"]').simulate('click'); + wrapper.update(); + expect(wrapper.find('.euiFormErrorText').text()).toBe( + 'The length of the title is too long. The maximum length is 64.' + ); + + expect(submitTitle).not.toHaveBeenCalled(); + expect(wrapper.find('[data-test-subj="editable-title-edit-icon"]').first().exists()).toBe( + false + ); + }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx index 7856a77332275b..4dcfa9ad98fdec 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.tsx @@ -16,10 +16,11 @@ import { EuiFieldText, EuiButtonIcon, EuiLoadingSpinner, + EuiFormRow, } from '@elastic/eui'; +import { MAX_TITLE_LENGTH } from '../../../common'; import * as i18n from './translations'; - import { Title } from './title'; const MyEuiButtonIcon = styled(EuiButtonIcon)` @@ -37,7 +38,7 @@ const MySpinner = styled(EuiLoadingSpinner)` export interface EditableTitleProps { userCanCrud: boolean; isLoading: boolean; - title: string | React.ReactNode; + title: string; onSubmit: (title: string) => void; } @@ -48,57 +49,72 @@ const EditableTitleComponent: React.FC = ({ title, }) => { const [editMode, setEditMode] = useState(false); - const [changedTitle, onTitleChange] = useState(typeof title === 'string' ? title : ''); + const [errors, setErrors] = useState([]); + const [newTitle, setNewTitle] = useState(title); - const onCancel = useCallback(() => setEditMode(false), []); - const onClickEditIcon = useCallback(() => setEditMode(true), []); + const onCancel = useCallback(() => { + setEditMode(false); + setErrors([]); + setNewTitle(title); + }, [title]); + const onClickEditIcon = useCallback(() => setEditMode(true), []); const onClickSubmit = useCallback((): void => { - if (changedTitle !== title) { - onSubmit(changedTitle); + if (newTitle.length > MAX_TITLE_LENGTH) { + setErrors([i18n.MAX_LENGTH_ERROR('title', MAX_TITLE_LENGTH)]); + return; + } + + if (newTitle !== title) { + onSubmit(newTitle); } setEditMode(false); - }, [changedTitle, onSubmit, title]); + }, [newTitle, onSubmit, title]); const handleOnChange = useCallback( - (e: ChangeEvent) => onTitleChange(e.target.value), + (e: ChangeEvent) => setNewTitle(e.target.value), [] ); + + const hasErrors = errors.length > 0; + return editMode ? ( - - - - - + + - - {i18n.SAVE} - - - - - {i18n.CANCEL} - + + + + + {i18n.SAVE} + + + + + {i18n.CANCEL} + + + + - - + ) : ( diff --git a/x-pack/plugins/cases/public/components/header_page/title.test.tsx b/x-pack/plugins/cases/public/components/header_page/title.test.tsx index 2423104eb8819d..063b21e4d89066 100644 --- a/x-pack/plugins/cases/public/components/header_page/title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/title.test.tsx @@ -36,4 +36,10 @@ describe('Title', () => { expect(wrapper.find('[data-test-subj="header-page-title"]').first().exists()).toBe(true); }); + + test('it renders the title if is not a string', () => { + const wrapper = shallow({'Test title'}</span>} />); + + expect(wrapper).toMatchSnapshot(); + }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/title.tsx b/x-pack/plugins/cases/public/components/header_page/title.tsx index 3a0390a436e1ca..629aa612610eee 100644 --- a/x-pack/plugins/cases/public/components/header_page/title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/title.tsx @@ -6,10 +6,12 @@ */ import React from 'react'; +import { isString } from 'lodash'; import { EuiBetaBadge, EuiBadge, EuiTitle } from '@elastic/eui'; import styled from 'styled-components'; import { BadgeOptions, TitleProp } from './types'; +import { TruncatedText } from '../truncated_text'; const StyledEuiBetaBadge = styled(EuiBetaBadge)` vertical-align: middle; @@ -30,7 +32,7 @@ interface Props { const TitleComponent: React.FC<Props> = ({ title, badgeOptions }) => ( <EuiTitle size="l"> <h1 data-test-subj="header-page-title"> - {title} + {isString(title) ? <TruncatedText text={title} /> : title} {badgeOptions && ( <> {' '} diff --git a/x-pack/plugins/cases/public/components/header_page/translations.ts b/x-pack/plugins/cases/public/components/header_page/translations.ts index b24c347857a6ce..ba987d1f45f157 100644 --- a/x-pack/plugins/cases/public/components/header_page/translations.ts +++ b/x-pack/plugins/cases/public/components/header_page/translations.ts @@ -7,6 +7,8 @@ import { i18n } from '@kbn/i18n'; +export * from '../../common/translations'; + export const SAVE = i18n.translate('xpack.cases.header.editableTitle.save', { defaultMessage: 'Save', }); diff --git a/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx index bfe44dda6c6efc..e08c6299132585 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/recent_cases.tsx @@ -19,6 +19,7 @@ import { NoCases } from './no_cases'; import { isSubCase } from '../all_cases/helpers'; import { MarkdownRenderer } from '../markdown_editor'; import { FilterOptions } from '../../containers/types'; +import { TruncatedText } from '../truncated_text'; const MarkdownContainer = styled.div` max-height: 150px; @@ -80,7 +81,7 @@ export const RecentCasesComp = ({ title={c.title} subCaseId={isSubCase(c) ? c.id : undefined} > - {c.title} + <TruncatedText text={c.title} /> </CaseDetailsLink> </EuiText> diff --git a/x-pack/plugins/cases/public/components/truncated_text/index.tsx b/x-pack/plugins/cases/public/components/truncated_text/index.tsx new file mode 100644 index 00000000000000..8a480ed9dbdd18 --- /dev/null +++ b/x-pack/plugins/cases/public/components/truncated_text/index.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import styled from 'styled-components'; + +const LINE_CLAMP = 3; + +const Text = styled.span` + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: ${LINE_CLAMP}; + -webkit-box-orient: vertical; + overflow: hidden; +`; + +interface Props { + text: string; +} + +const TruncatedTextComponent: React.FC<Props> = ({ text }) => { + return <Text title={text}>{text}</Text>; +}; + +export const TruncatedText = React.memo(TruncatedTextComponent); diff --git a/x-pack/plugins/cases/server/client/cases/create.ts b/x-pack/plugins/cases/server/client/cases/create.ts index 0eebeb343e814e..03ea76ede5c2ed 100644 --- a/x-pack/plugins/cases/server/client/cases/create.ts +++ b/x-pack/plugins/cases/server/client/cases/create.ts @@ -22,6 +22,7 @@ import { CaseType, OWNER_FIELD, ENABLE_CASE_CONNECTOR, + MAX_TITLE_LENGTH, } from '../../../common'; import { buildCaseUserActionItem } from '../../services/user_actions/helpers'; import { getConnectorFromConfiguration } from '../utils'; @@ -72,6 +73,12 @@ export const create = async ( fold(throwErrors(Boom.badRequest), identity) ); + if (query.title.length > MAX_TITLE_LENGTH) { + throw Boom.badRequest( + `The length of the title is too long. The maximum length is ${MAX_TITLE_LENGTH}.` + ); + } + try { const savedObjectID = SavedObjectsUtils.generateId(); diff --git a/x-pack/plugins/cases/server/client/cases/update.ts b/x-pack/plugins/cases/server/client/cases/update.ts index e5d9e1cddeee67..afe43171563cee 100644 --- a/x-pack/plugins/cases/server/client/cases/update.ts +++ b/x-pack/plugins/cases/server/client/cases/update.ts @@ -40,6 +40,7 @@ import { MAX_CONCURRENT_SEARCHES, SUB_CASE_SAVED_OBJECT, throwErrors, + MAX_TITLE_LENGTH, } from '../../../common'; import { buildCaseUserActions } from '../../services/user_actions/helpers'; import { getCaseToUpdate } from '../utils'; @@ -181,6 +182,24 @@ async function throwIfInvalidUpdateOfTypeWithAlerts({ } } +/** + * Throws an error if any of the requests updates a title and the length is over MAX_TITLE_LENGTH. + */ +function throwIfTitleIsInvalid(requests: ESCasePatchRequest[]) { + const requestsInvalidTitle = requests.filter( + (req) => req.title !== undefined && req.title.length > MAX_TITLE_LENGTH + ); + + if (requestsInvalidTitle.length > 0) { + const ids = requestsInvalidTitle.map((req) => req.id); + throw Boom.badRequest( + `The length of the title is too long. The maximum length is ${MAX_TITLE_LENGTH}, ids: [${ids.join( + ', ' + )}]` + ); + } +} + /** * Get the id from a reference in a comment for a specific type. */ @@ -477,6 +496,7 @@ export const update = async ( } throwIfUpdateOwner(updateFilterCases); + throwIfTitleIsInvalid(updateFilterCases); throwIfUpdateStatusOfCollection(updateFilterCases, casesMap); throwIfUpdateTypeCollectionToIndividual(updateFilterCases, casesMap); await throwIfInvalidUpdateOfTypeWithAlerts({ diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx index 9722447b96ad5a..3e0aa17a3830e9 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.test.tsx @@ -5,6 +5,9 @@ * 2.0. */ +import React from 'react'; +import { mount } from 'enzyme'; +import 'jest-styled-components'; import { createUpdateSuccessToaster } from './helpers'; import { Case } from '../../../../../cases/common'; @@ -23,12 +26,30 @@ describe('helpers', () => { it('creates the correct toast when the sync alerts is on', () => { // We remove the id as is randomly generated and the text as it is a React component // which is being test on toaster_content.test.tsx - const { id, text, ...toast } = createUpdateSuccessToaster(theCase, onViewCaseClick); + const { id, text, title, ...toast } = createUpdateSuccessToaster(theCase, onViewCaseClick); + const mountedTitle = mount(<>{title}</>); + expect(toast).toEqual({ color: 'success', iconType: 'check', - title: 'An alert has been added to "My case"', }); + expect(mountedTitle).toMatchInlineSnapshot(` + .c0 { + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; + } + + <styled.span> + <span + className="c0" + > + An alert has been added to "My case" + </span> + </styled.span> + `); }); }); }); diff --git a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx index 8682b6680830d8..93e1f0499893e6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/timeline_actions/helpers.tsx @@ -7,11 +7,22 @@ import React from 'react'; import uuid from 'uuid'; +import styled from 'styled-components'; import { AppToast } from '../../../common/components/toasters'; import { ToasterContent } from './toaster_content'; import * as i18n from './translations'; import { Case } from '../../../../../cases/common'; +const LINE_CLAMP = 3; + +const Title = styled.span` + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: ${LINE_CLAMP}; + -webkit-box-orient: vertical; + overflow: hidden; +`; + export const createUpdateSuccessToaster = ( theCase: Case, onViewCaseClick: (id: string) => void @@ -20,7 +31,7 @@ export const createUpdateSuccessToaster = ( id: uuid.v4(), color: 'success', iconType: 'check', - title: i18n.CASE_CREATED_SUCCESS_TOAST(theCase.title), + title: <Title>{i18n.CASE_CREATED_SUCCESS_TOAST(theCase.title)}, text: ( { expectedHttpCode: 400, }); }); + + it('400s if the title is too long', async () => { + const longTitle = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nulla enim, rutrum sit amet euismod venenatis, blandit et massa. Nulla id consectetur enim.'; + + const postedCase = await createCase(supertest, postCaseReq); + await updateCase({ + supertest, + params: { + cases: [ + { + id: postedCase.id, + version: postedCase.version, + title: longTitle, + }, + ], + }, + expectedHttpCode: 400, + }); + }); }); describe('alerts', () => { diff --git a/x-pack/test/case_api_integration/security_and_spaces/tests/common/cases/post_case.ts b/x-pack/test/case_api_integration/security_and_spaces/tests/common/cases/post_case.ts index e8337fa9db5023..2fe5a4c0165c09 100644 --- a/x-pack/test/case_api_integration/security_and_spaces/tests/common/cases/post_case.ts +++ b/x-pack/test/case_api_integration/security_and_spaces/tests/common/cases/post_case.ts @@ -238,6 +238,13 @@ export default ({ getService }: FtrProviderContext): void => { .send({ ...req, status: CaseStatuses.open }) .expect(400); }); + + it('400s if the title is too long', async () => { + const longTitle = + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed nulla enim, rutrum sit amet euismod venenatis, blandit et massa. Nulla id consectetur enim.'; + + await createCase(supertest, getPostCaseRequest({ title: longTitle }), 400); + }); }); describe('rbac', () => { From 8bb13a97179e4a0e21a9efb746232956355ba4e4 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Thu, 1 Jul 2021 12:09:21 -0400 Subject: [PATCH 19/43] [canvas] Create Notify Service; remove legacy service (#103821) --- .../function_reference_generator.tsx | 13 ++++----- .../saved_elements_modal.ts | 9 +++--- .../share_menu/flyout/flyout.ts | 5 ++-- .../canvas/public/lib/download_workpad.ts | 23 ++++++++------- .../public/lib/element_handler_creators.ts | 28 ++++++++++-------- .../plugins/canvas/public/lib/es_service.ts | 29 ++++++++++--------- .../canvas/public/lib/run_interpreter.ts | 5 ++-- .../public/routes/workpad/workpad_route.tsx | 8 ++--- .../plugins/canvas/public/services/index.ts | 3 ++ .../canvas/public/services/kibana/index.ts | 3 ++ .../services/{legacy => kibana}/notify.ts | 21 +++++++------- .../canvas/public/services/legacy/context.tsx | 3 -- .../canvas/public/services/legacy/index.ts | 5 ---- .../public/services/legacy/stubs/index.ts | 2 -- .../plugins/canvas/public/services/notify.ts | 15 ++++++++++ .../canvas/public/services/storybook/index.ts | 2 ++ .../public/services/storybook/notify.ts | 22 ++++++++++++++ .../canvas/public/services/stubs/index.ts | 3 ++ .../services/{legacy => }/stubs/notify.ts | 10 +++++-- .../plugins/canvas/public/services/workpad.ts | 1 - .../canvas/public/state/actions/elements.js | 11 ++++--- .../public/state/middleware/es_persist.js | 10 ++++--- x-pack/plugins/canvas/storybook/preview.ts | 10 +------ 23 files changed, 145 insertions(+), 96 deletions(-) rename x-pack/plugins/canvas/public/services/{legacy => kibana}/notify.ts (74%) create mode 100644 x-pack/plugins/canvas/public/services/notify.ts create mode 100644 x-pack/plugins/canvas/public/services/storybook/notify.ts rename x-pack/plugins/canvas/public/services/{legacy => }/stubs/notify.ts (54%) diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx b/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx index 6f98baf944bacf..81532816d9c830 100644 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx +++ b/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx @@ -9,7 +9,7 @@ import React, { FC } from 'react'; import { ExpressionFunction } from 'src/plugins/expressions'; import { EuiButtonEmpty } from '@elastic/eui'; import copy from 'copy-to-clipboard'; -import { notifyService } from '../../services'; +import { useNotifyService } from '../../services'; import { generateFunctionReference } from './generate_function_reference'; interface Props { @@ -17,16 +17,15 @@ interface Props { } export const FunctionReferenceGenerator: FC = ({ functionRegistry }) => { + const notifyService = useNotifyService(); const functionDefinitions = Object.values(functionRegistry); const copyDocs = () => { copy(generateFunctionReference(functionDefinitions)); - notifyService - .getService() - .success( - `Please paste updated docs into '/kibana/docs/canvas/canvas-function-reference.asciidoc' and commit your changes.`, - { title: 'Copied function docs to clipboard' } - ); + notifyService.success( + `Please paste updated docs into '/kibana/docs/canvas/canvas-function-reference.asciidoc' and commit your changes.`, + { title: 'Copied function docs to clipboard' } + ); }; return ( diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.ts b/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.ts index 9b592d402f84c4..524c1a48b6ceed 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.ts +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/saved_elements_modal.ts @@ -11,7 +11,7 @@ import { compose, withState } from 'recompose'; import { camelCase } from 'lodash'; import { cloneSubgraphs } from '../../lib/clone_subgraphs'; import * as customElementService from '../../lib/custom_element_service'; -import { withServices, WithServicesProps } from '../../services'; +import { withServices, WithServicesProps, pluginServices } from '../../services'; // @ts-expect-error untyped local import { selectToplevelNodes } from '../../state/actions/transient'; // @ts-expect-error untyped local @@ -68,6 +68,7 @@ const mergeProps = ( dispatchProps: DispatchProps, ownProps: OwnPropsWithState & WithServicesProps ): ComponentProps => { + const notifyService = pluginServices.getServices().notify; const { pageId } = stateProps; const { onClose, search, setCustomElements } = ownProps; @@ -94,7 +95,7 @@ const mergeProps = ( try { await findCustomElements(); } catch (err) { - ownProps.services.notify.error(err, { + notifyService.error(err, { title: `Couldn't find custom elements`, }); } @@ -105,7 +106,7 @@ const mergeProps = ( await customElementService.remove(id); await findCustomElements(); } catch (err) { - ownProps.services.notify.error(err, { + notifyService.error(err, { title: `Couldn't delete custom elements`, }); } @@ -121,7 +122,7 @@ const mergeProps = ( }); await findCustomElements(); } catch (err) { - ownProps.services.notify.error(err, { + notifyService.error(err, { title: `Couldn't update custom elements`, }); } diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.ts b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.ts index 65c9d6598578d1..9b9c3d3dfee9f6 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.ts @@ -30,6 +30,7 @@ import { withKibana } from '../../../../../../../../src/plugins/kibana_react/pub import { OnCloseFn } from '../share_menu.component'; import { ZIP } from '../../../../../i18n/constants'; import { WithKibanaProps } from '../../../../index'; +import { pluginServices } from '../../../../services'; export { OnDownloadFn, OnCopyFn } from './flyout.component'; @@ -95,7 +96,7 @@ export const ShareWebsiteFlyout = compose unsupportedRenderers, onClose, onCopy: () => { - kibana.services.canvas.notify.info(strings.getCopyShareConfigMessage()); + pluginServices.getServices().notify.info(strings.getCopyShareConfigMessage()); }, onDownload: (type) => { switch (type) { @@ -111,7 +112,7 @@ export const ShareWebsiteFlyout = compose .post(`${basePath}${API_ROUTE_SHAREABLE_ZIP}`, JSON.stringify(renderedWorkpad)) .then((blob) => downloadZippedRuntime(blob.data)) .catch((err: Error) => { - kibana.services.canvas.notify.error(err, { + pluginServices.getServices().notify.error(err, { title: strings.getShareableZipErrorTitle(workpad.name), }); }); diff --git a/x-pack/plugins/canvas/public/lib/download_workpad.ts b/x-pack/plugins/canvas/public/lib/download_workpad.ts index 8deda818a43d3a..a346de3322d09f 100644 --- a/x-pack/plugins/canvas/public/lib/download_workpad.ts +++ b/x-pack/plugins/canvas/public/lib/download_workpad.ts @@ -8,7 +8,10 @@ import fileSaver from 'file-saver'; import { API_ROUTE_SHAREABLE_RUNTIME_DOWNLOAD } from '../../common/lib/constants'; import { ErrorStrings } from '../../i18n'; -import { notifyService } from '../services'; + +// TODO: clint - convert this whole file to hooks +import { pluginServices } from '../services'; + // @ts-expect-error untyped local import * as workpadService from './workpad_service'; import { CanvasRenderedWorkpad } from '../../shareable_runtime/types'; @@ -21,7 +24,8 @@ export const downloadWorkpad = async (workpadId: string) => { const jsonBlob = new Blob([JSON.stringify(workpad)], { type: 'application/json' }); fileSaver.saveAs(jsonBlob, `canvas-workpad-${workpad.name}-${workpad.id}.json`); } catch (err) { - notifyService.getService().error(err, { title: strings.getDownloadFailureErrorMessage() }); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getDownloadFailureErrorMessage() }); } }; @@ -33,9 +37,8 @@ export const downloadRenderedWorkpad = async (renderedWorkpad: CanvasRenderedWor `canvas-embed-workpad-${renderedWorkpad.name}-${renderedWorkpad.id}.json` ); } catch (err) { - notifyService - .getService() - .error(err, { title: strings.getDownloadRenderedWorkpadFailureErrorMessage() }); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getDownloadRenderedWorkpadFailureErrorMessage() }); } }; @@ -45,9 +48,8 @@ export const downloadRuntime = async (basePath: string) => { window.open(path); return; } catch (err) { - notifyService - .getService() - .error(err, { title: strings.getDownloadRuntimeFailureErrorMessage() }); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getDownloadRuntimeFailureErrorMessage() }); } }; @@ -56,8 +58,7 @@ export const downloadZippedRuntime = async (data: any) => { const zip = new Blob([data], { type: 'octet/stream' }); fileSaver.saveAs(zip, 'canvas-workpad-embed.zip'); } catch (err) { - notifyService - .getService() - .error(err, { title: strings.getDownloadZippedRuntimeFailureErrorMessage() }); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getDownloadZippedRuntimeFailureErrorMessage() }); } }; diff --git a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts index cdf9324e947da7..a46252081e6729 100644 --- a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts +++ b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts @@ -8,7 +8,7 @@ import { camelCase } from 'lodash'; import { getClipboardData, setClipboardData } from './clipboard'; import { cloneSubgraphs } from './clone_subgraphs'; -import { notifyService } from '../services'; +import { pluginServices } from '../services'; import * as customElementService from './custom_element_service'; import { getId } from './get_id'; import { PositionedElement } from '../../types'; @@ -70,6 +70,8 @@ export const basicHandlerCreators = { description = '', image = '' ): void => { + const notifyService = pluginServices.getServices().notify; + if (selectedNodes.length) { const content = JSON.stringify({ selectedNodes }); const customElement = { @@ -83,17 +85,15 @@ export const basicHandlerCreators = { customElementService .create(customElement) .then(() => - notifyService - .getService() - .success( - `Custom element '${customElement.displayName || customElement.id}' was saved`, - { - 'data-test-subj': 'canvasCustomElementCreate-success', - } - ) + notifyService.success( + `Custom element '${customElement.displayName || customElement.id}' was saved`, + { + 'data-test-subj': 'canvasCustomElementCreate-success', + } + ) ) .catch((error: Error) => - notifyService.getService().warning(error, { + notifyService.warning(error, { title: `Custom element '${ customElement.displayName || customElement.id }' was not saved`, @@ -135,16 +135,20 @@ export const groupHandlerCreators = { // handlers for cut/copy/paste export const clipboardHandlerCreators = { cutNodes: ({ pageId, removeNodes, selectedNodes }: Props) => (): void => { + const notifyService = pluginServices.getServices().notify; + if (selectedNodes.length) { setClipboardData({ selectedNodes }); removeNodes(selectedNodes.map(extractId), pageId); - notifyService.getService().success('Cut element to clipboard'); + notifyService.success('Cut element to clipboard'); } }, copyNodes: ({ selectedNodes }: Props) => (): void => { + const notifyService = pluginServices.getServices().notify; + if (selectedNodes.length) { setClipboardData({ selectedNodes }); - notifyService.getService().success('Copied element to clipboard'); + notifyService.success('Copied element to clipboard'); } }, pasteNodes: ({ insertNodes, pageId, selectToplevelNodes }: Props) => (): void => { diff --git a/x-pack/plugins/canvas/public/lib/es_service.ts b/x-pack/plugins/canvas/public/lib/es_service.ts index 25b63bf26c5bbe..c1a4a17970ffa7 100644 --- a/x-pack/plugins/canvas/public/lib/es_service.ts +++ b/x-pack/plugins/canvas/public/lib/es_service.ts @@ -5,12 +5,14 @@ * 2.0. */ +// TODO - clint: convert to service abstraction + import { IndexPatternAttributes } from 'src/plugins/data/public'; import { API_ROUTE } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; import { ErrorStrings } from '../../i18n'; -import { notifyService } from '../services'; +import { pluginServices } from '../services'; import { platformService } from '../services'; const { esService: strings } = ErrorStrings; @@ -36,11 +38,12 @@ export const getFields = (index = '_all') => { .filter((field) => !field.startsWith('_')) // filters out meta fields .sort() ) - .catch((err: Error) => - notifyService.getService().error(err, { + .catch((err: Error) => { + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getFieldsFetchErrorMessage(index), - }) - ); + }); + }); }; export const getIndices = () => @@ -56,9 +59,10 @@ export const getIndices = () => return savedObject.attributes.title; }); }) - .catch((err: Error) => - notifyService.getService().error(err, { title: strings.getIndicesFetchErrorMessage() }) - ); + .catch((err: Error) => { + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getIndicesFetchErrorMessage() }); + }); export const getDefaultIndex = () => { const defaultIndexId = getAdvancedSettings().get('defaultIndex'); @@ -67,10 +71,9 @@ export const getDefaultIndex = () => { ? getSavedObjectsClient() .get('index-pattern', defaultIndexId) .then((defaultIndex) => defaultIndex.attributes.title) - .catch((err) => - notifyService - .getService() - .error(err, { title: strings.getDefaultIndexFetchErrorMessage() }) - ) + .catch((err) => { + const notifyService = pluginServices.getServices().notify; + notifyService.error(err, { title: strings.getDefaultIndexFetchErrorMessage() }); + }) : Promise.resolve(''); }; diff --git a/x-pack/plugins/canvas/public/lib/run_interpreter.ts b/x-pack/plugins/canvas/public/lib/run_interpreter.ts index eb9be96c5367b8..149e90a8f6b730 100644 --- a/x-pack/plugins/canvas/public/lib/run_interpreter.ts +++ b/x-pack/plugins/canvas/public/lib/run_interpreter.ts @@ -7,7 +7,7 @@ import { fromExpression, getType } from '@kbn/interpreter/common'; import { ExpressionValue, ExpressionAstExpression } from 'src/plugins/expressions/public'; -import { notifyService, expressionsService } from '../services'; +import { pluginServices, expressionsService } from '../services'; interface Options { castToRender?: boolean; @@ -57,7 +57,8 @@ export async function runInterpreter( throw new Error(`Ack! I don't know how to render a '${getType(renderable)}'`); } catch (err) { - notifyService.getService().error(err); + const { error: displayError } = pluginServices.getServices().notify; + displayError(err); throw err; } } diff --git a/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx b/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx index 7683b3413f6818..95caba08517ee6 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/workpad_route.tsx @@ -13,7 +13,7 @@ import { ExportApp } from '../../components/export_app'; import { CanvasLoading } from '../../components/canvas_loading'; // @ts-expect-error import { fetchAllRenderables } from '../../state/actions/elements'; -import { useServices } from '../../services'; +import { useNotifyService } from '../../services'; import { CanvasWorkpad } from '../../../types'; import { ErrorStrings } from '../../../i18n'; import { useWorkpad } from './hooks/use_workpad'; @@ -98,13 +98,13 @@ const WorkpadLoaderComponent: FC<{ children: (workpad: CanvasWorkpad) => JSX.Element; }> = ({ params, children, loadPages }) => { const [workpad, error] = useWorkpad(params.id, loadPages); - const services = useServices(); + const notifyService = useNotifyService(); useEffect(() => { if (error) { - services.notify.error(error, { title: strings.getLoadFailureErrorMessage() }); + notifyService.error(error, { title: strings.getLoadFailureErrorMessage() }); } - }, [error, services.notify]); + }, [error, notifyService]); if (error) { return ; diff --git a/x-pack/plugins/canvas/public/services/index.ts b/x-pack/plugins/canvas/public/services/index.ts index 49408fcec1ec4f..83a54a8a673a1b 100644 --- a/x-pack/plugins/canvas/public/services/index.ts +++ b/x-pack/plugins/canvas/public/services/index.ts @@ -9,11 +9,14 @@ export * from './legacy'; import { PluginServices } from '../../../../../src/plugins/presentation_util/public'; import { CanvasWorkpadService } from './workpad'; +import { CanvasNotifyService } from './notify'; export interface CanvasPluginServices { workpad: CanvasWorkpadService; + notify: CanvasNotifyService; } export const pluginServices = new PluginServices(); export const useWorkpadService = () => (() => pluginServices.getHooks().workpad.useService())(); +export const useNotifyService = () => (() => pluginServices.getHooks().notify.useService())(); diff --git a/x-pack/plugins/canvas/public/services/kibana/index.ts b/x-pack/plugins/canvas/public/services/kibana/index.ts index 99012003b3a159..7bb2be3f77e27e 100644 --- a/x-pack/plugins/canvas/public/services/kibana/index.ts +++ b/x-pack/plugins/canvas/public/services/kibana/index.ts @@ -13,16 +13,19 @@ import { } from '../../../../../../src/plugins/presentation_util/public'; import { workpadServiceFactory } from './workpad'; +import { notifyServiceFactory } from './notify'; import { CanvasPluginServices } from '..'; import { CanvasStartDeps } from '../../plugin'; export { workpadServiceFactory } from './workpad'; +export { notifyServiceFactory } from './notify'; export const pluginServiceProviders: PluginServiceProviders< CanvasPluginServices, KibanaPluginServiceParams > = { workpad: new PluginServiceProvider(workpadServiceFactory), + notify: new PluginServiceProvider(notifyServiceFactory), }; export const pluginServiceRegistry = new PluginServiceRegistry< diff --git a/x-pack/plugins/canvas/public/services/legacy/notify.ts b/x-pack/plugins/canvas/public/services/kibana/notify.ts similarity index 74% rename from x-pack/plugins/canvas/public/services/legacy/notify.ts rename to x-pack/plugins/canvas/public/services/kibana/notify.ts index 22dcfa671d0b51..0082b523d050e2 100644 --- a/x-pack/plugins/canvas/public/services/legacy/notify.ts +++ b/x-pack/plugins/canvas/public/services/kibana/notify.ts @@ -6,9 +6,17 @@ */ import { get } from 'lodash'; -import { CanvasServiceFactory } from '.'; +import { KibanaPluginServiceFactory } from '../../../../../../src/plugins/presentation_util/public'; + import { formatMsg } from '../../../../../../src/plugins/kibana_legacy/public'; import { ToastInputFields } from '../../../../../../src/core/public'; +import { CanvasStartDeps } from '../../plugin'; +import { CanvasNotifyService } from '../notify'; + +export type CanvasNotifyServiceFactory = KibanaPluginServiceFactory< + CanvasNotifyService, + CanvasStartDeps +>; const getToast = (err: Error | string, opts: ToastInputFields = {}) => { const errData = (get(err, 'response') || err) as Error | string; @@ -28,15 +36,8 @@ const getToast = (err: Error | string, opts: ToastInputFields = {}) => { }; }; -export interface NotifyService { - error: (err: string | Error, opts?: ToastInputFields) => void; - warning: (err: string | Error, opts?: ToastInputFields) => void; - info: (err: string | Error, opts?: ToastInputFields) => void; - success: (err: string | Error, opts?: ToastInputFields) => void; -} - -export const notifyServiceFactory: CanvasServiceFactory = (setup, start) => { - const toasts = start.notifications.toasts; +export const notifyServiceFactory: CanvasNotifyServiceFactory = ({ coreStart }) => { + const toasts = coreStart.notifications.toasts; return { /* diff --git a/x-pack/plugins/canvas/public/services/legacy/context.tsx b/x-pack/plugins/canvas/public/services/legacy/context.tsx index 7a90c6870df4af..dd2e45740f041b 100644 --- a/x-pack/plugins/canvas/public/services/legacy/context.tsx +++ b/x-pack/plugins/canvas/public/services/legacy/context.tsx @@ -22,7 +22,6 @@ export interface WithServicesProps { const defaultContextValue = { embeddables: {}, expressions: {}, - notify: {}, platform: {}, navLink: {}, search: {}, @@ -34,7 +33,6 @@ export const useServices = () => useContext(context); export const usePlatformService = () => useServices().platform; export const useEmbeddablesService = () => useServices().embeddables; export const useExpressionsService = () => useServices().expressions; -export const useNotifyService = () => useServices().notify; export const useNavLinkService = () => useServices().navLink; export const useLabsService = () => useServices().labs; @@ -52,7 +50,6 @@ export const LegacyServicesProvider: FC<{ const value = { embeddables: specifiedProviders.embeddables.getService(), expressions: specifiedProviders.expressions.getService(), - notify: specifiedProviders.notify.getService(), platform: specifiedProviders.platform.getService(), navLink: specifiedProviders.navLink.getService(), search: specifiedProviders.search.getService(), diff --git a/x-pack/plugins/canvas/public/services/legacy/index.ts b/x-pack/plugins/canvas/public/services/legacy/index.ts index e23057daa7359e..763fd657ad8004 100644 --- a/x-pack/plugins/canvas/public/services/legacy/index.ts +++ b/x-pack/plugins/canvas/public/services/legacy/index.ts @@ -8,7 +8,6 @@ import { BehaviorSubject } from 'rxjs'; import { CoreSetup, CoreStart, AppUpdater } from '../../../../../../src/core/public'; import { CanvasSetupDeps, CanvasStartDeps } from '../../plugin'; -import { notifyServiceFactory } from './notify'; import { platformServiceFactory } from './platform'; import { navLinkServiceFactory } from './nav_link'; import { embeddablesServiceFactory } from './embeddables'; @@ -17,7 +16,6 @@ import { searchServiceFactory } from './search'; import { labsServiceFactory } from './labs'; import { reportingServiceFactory } from './reporting'; -export { NotifyService } from './notify'; export { SearchService } from './search'; export { PlatformService } from './platform'; export { NavLinkService } from './nav_link'; @@ -79,7 +77,6 @@ export type ServiceFromProvider

= P extends CanvasServiceProvider ? export const services = { embeddables: new CanvasServiceProvider(embeddablesServiceFactory), expressions: new CanvasServiceProvider(expressionsServiceFactory), - notify: new CanvasServiceProvider(notifyServiceFactory), platform: new CanvasServiceProvider(platformServiceFactory), navLink: new CanvasServiceProvider(navLinkServiceFactory), search: new CanvasServiceProvider(searchServiceFactory), @@ -92,7 +89,6 @@ export type CanvasServiceProviders = typeof services; export interface CanvasServices { embeddables: ServiceFromProvider; expressions: ServiceFromProvider; - notify: ServiceFromProvider; platform: ServiceFromProvider; navLink: ServiceFromProvider; search: ServiceFromProvider; @@ -120,7 +116,6 @@ export const stopServices = () => { export const { embeddables: embeddableService, - notify: notifyService, platform: platformService, navLink: navLinkService, expressions: expressionsService, diff --git a/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts b/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts index 7246a34d7f4916..cebefdd7682cc9 100644 --- a/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts +++ b/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts @@ -10,7 +10,6 @@ import { embeddablesService } from './embeddables'; import { expressionsService } from './expressions'; import { reportingService } from './reporting'; import { navLinkService } from './nav_link'; -import { notifyService } from './notify'; import { labsService } from './labs'; import { platformService } from './platform'; import { searchService } from './search'; @@ -20,7 +19,6 @@ export const stubs: CanvasServices = { expressions: expressionsService, reporting: reportingService, navLink: navLinkService, - notify: notifyService, platform: platformService, search: searchService, labs: labsService, diff --git a/x-pack/plugins/canvas/public/services/notify.ts b/x-pack/plugins/canvas/public/services/notify.ts new file mode 100644 index 00000000000000..67c5cb6bf79c47 --- /dev/null +++ b/x-pack/plugins/canvas/public/services/notify.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ToastInputFields } from '../../../../../src/core/public'; + +export interface CanvasNotifyService { + error: (err: string | Error, opts?: ToastInputFields) => void; + warning: (err: string | Error, opts?: ToastInputFields) => void; + info: (err: string | Error, opts?: ToastInputFields) => void; + success: (err: string | Error, opts?: ToastInputFields) => void; +} diff --git a/x-pack/plugins/canvas/public/services/storybook/index.ts b/x-pack/plugins/canvas/public/services/storybook/index.ts index de231f730faf50..86ff52155a0bf7 100644 --- a/x-pack/plugins/canvas/public/services/storybook/index.ts +++ b/x-pack/plugins/canvas/public/services/storybook/index.ts @@ -13,6 +13,7 @@ import { import { CanvasPluginServices } from '..'; import { pluginServiceProviders as stubProviders } from '../stubs'; import { workpadServiceFactory } from './workpad'; +import { notifyServiceFactory } from './notify'; export interface StorybookParams { hasTemplates?: boolean; @@ -26,6 +27,7 @@ export const pluginServiceProviders: PluginServiceProviders< > = { ...stubProviders, workpad: new PluginServiceProvider(workpadServiceFactory), + notify: new PluginServiceProvider(notifyServiceFactory), }; export const argTypes = { diff --git a/x-pack/plugins/canvas/public/services/storybook/notify.ts b/x-pack/plugins/canvas/public/services/storybook/notify.ts new file mode 100644 index 00000000000000..7ffd2ef9d14530 --- /dev/null +++ b/x-pack/plugins/canvas/public/services/storybook/notify.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { action } from '@storybook/addon-actions'; + +import { PluginServiceFactory } from '../../../../../../src/plugins/presentation_util/public'; + +import { StorybookParams } from '.'; +import { CanvasNotifyService } from '../notify'; + +type CanvasNotifyServiceFactory = PluginServiceFactory; + +export const notifyServiceFactory: CanvasNotifyServiceFactory = () => ({ + success: (message) => action(`success: ${message}`)(), + error: (message) => action(`error: ${message}`)(), + info: (message) => action(`info: ${message}`)(), + warning: (message) => action(`warning: ${message}`)(), +}); diff --git a/x-pack/plugins/canvas/public/services/stubs/index.ts b/x-pack/plugins/canvas/public/services/stubs/index.ts index 586007201db819..5c3440cc4cdbce 100644 --- a/x-pack/plugins/canvas/public/services/stubs/index.ts +++ b/x-pack/plugins/canvas/public/services/stubs/index.ts @@ -15,11 +15,14 @@ import { import { CanvasPluginServices } from '..'; import { workpadServiceFactory } from './workpad'; +import { notifyServiceFactory } from './notify'; export { workpadServiceFactory } from './workpad'; +export { notifyServiceFactory } from './notify'; export const pluginServiceProviders: PluginServiceProviders = { workpad: new PluginServiceProvider(workpadServiceFactory), + notify: new PluginServiceProvider(notifyServiceFactory), }; export const pluginServiceRegistry = new PluginServiceRegistry( diff --git a/x-pack/plugins/canvas/public/services/legacy/stubs/notify.ts b/x-pack/plugins/canvas/public/services/stubs/notify.ts similarity index 54% rename from x-pack/plugins/canvas/public/services/legacy/stubs/notify.ts rename to x-pack/plugins/canvas/public/services/stubs/notify.ts index 866da3d459ed3a..0ad322a414f0d6 100644 --- a/x-pack/plugins/canvas/public/services/legacy/stubs/notify.ts +++ b/x-pack/plugins/canvas/public/services/stubs/notify.ts @@ -5,13 +5,17 @@ * 2.0. */ -import { NotifyService } from '../notify'; +import { PluginServiceFactory } from '../../../../../../src/plugins/presentation_util/public'; + +import { CanvasNotifyService } from '../notify'; + +type CanvasNotifyServiceFactory = PluginServiceFactory; const noop = (..._args: any[]): any => {}; -export const notifyService: NotifyService = { +export const notifyServiceFactory: CanvasNotifyServiceFactory = () => ({ error: noop, info: noop, success: noop, warning: noop, -}; +}); diff --git a/x-pack/plugins/canvas/public/services/workpad.ts b/x-pack/plugins/canvas/public/services/workpad.ts index 37664244b2d55b..6b90cc346834b0 100644 --- a/x-pack/plugins/canvas/public/services/workpad.ts +++ b/x-pack/plugins/canvas/public/services/workpad.ts @@ -17,7 +17,6 @@ export interface WorkpadFindResponse { export interface TemplateFindResponse { templates: CanvasTemplate[]; } - export interface CanvasWorkpadService { get: (id: string) => Promise; create: (workpad: CanvasWorkpad) => Promise; diff --git a/x-pack/plugins/canvas/public/state/actions/elements.js b/x-pack/plugins/canvas/public/state/actions/elements.js index ac5d768de53b98..a8302cf0940161 100644 --- a/x-pack/plugins/canvas/public/state/actions/elements.js +++ b/x-pack/plugins/canvas/public/state/actions/elements.js @@ -22,7 +22,7 @@ import { getDefaultElement } from '../defaults'; import { ErrorStrings } from '../../../i18n'; import { runInterpreter, interpretAst } from '../../lib/run_interpreter'; import { subMultitree } from '../../lib/aeroelastic/functional'; -import { services } from '../../services'; +import { pluginServices } from '../../services'; import { selectToplevelNodes } from './transient'; import * as args from './resolved_args'; @@ -144,7 +144,8 @@ const fetchRenderableWithContextFn = ({ dispatch, getState }, element, ast, cont dispatch(getAction(renderable)); }) .catch((err) => { - services.notify.getService().error(err); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err); dispatch(getAction(err)); }); }; @@ -188,7 +189,8 @@ export const fetchAllRenderables = createThunk( return runInterpreter(ast, null, variables, { castToRender: true }) .then((renderable) => ({ path: argumentPath, value: renderable })) .catch((err) => { - services.notify.getService().error(err); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err); return { path: argumentPath, value: err }; }); }); @@ -307,7 +309,8 @@ const setAst = createThunk('setAst', ({ dispatch }, ast, element, pageId, doRend const expression = toExpression(ast); dispatch(setExpression(expression, element.id, pageId, doRender)); } catch (err) { - services.notify.getService().error(err); + const notifyService = pluginServices.getServices().notify; + notifyService.error(err); // TODO: remove this, may have been added just to cause a re-render, but why? dispatch(setExpression(element.expression, element.id, pageId, doRender)); diff --git a/x-pack/plugins/canvas/public/state/middleware/es_persist.js b/x-pack/plugins/canvas/public/state/middleware/es_persist.js index 61a2e612215b5b..17d0c9649b9121 100644 --- a/x-pack/plugins/canvas/public/state/middleware/es_persist.js +++ b/x-pack/plugins/canvas/public/state/middleware/es_persist.js @@ -15,7 +15,7 @@ import { setAssets, resetAssets } from '../actions/assets'; import * as transientActions from '../actions/transient'; import * as resolvedArgsActions from '../actions/resolved_args'; import { update, updateAssets, updateWorkpad } from '../../lib/workpad_service'; -import { services } from '../../services'; +import { pluginServices } from '../../services'; import { canUserWrite } from '../selectors/app'; const { esPersist: strings } = ErrorStrings; @@ -61,17 +61,19 @@ export const esPersistMiddleware = ({ getState }) => { const notifyError = (err) => { const statusCode = err.response && err.response.status; + const notifyService = pluginServices.getServices().notify; + switch (statusCode) { case 400: - return services.notify.getService().error(err.response, { + return notifyService.error(err.response, { title: strings.getSaveFailureTitle(), }); case 413: - return services.notify.getService().error(strings.getTooLargeErrorMessage(), { + return notifyService.error(strings.getTooLargeErrorMessage(), { title: strings.getSaveFailureTitle(), }); default: - return services.notify.getService().error(err, { + return notifyService.error(err, { title: strings.getUpdateFailureTitle(), }); } diff --git a/x-pack/plugins/canvas/storybook/preview.ts b/x-pack/plugins/canvas/storybook/preview.ts index 266ff767c566af..8eae76abaf4154 100644 --- a/x-pack/plugins/canvas/storybook/preview.ts +++ b/x-pack/plugins/canvas/storybook/preview.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { action } from '@storybook/addon-actions'; import { addParameters } from '@storybook/react'; import { startServices } from '../public/services/stubs'; @@ -14,14 +13,7 @@ import { addDecorators } from './decorators'; // Import Canvas CSS import '../public/style/index.scss'; -startServices({ - notify: { - success: (message) => action(`success: ${message}`)(), - error: (message) => action(`error: ${message}`)(), - info: (message) => action(`info: ${message}`)(), - warning: (message) => action(`warning: ${message}`)(), - }, -}); +startServices(); addDecorators(); addParameters({ From 9dc303a4c6eda6d8957eb29fafacfefee5ec8c81 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:12:00 -0400 Subject: [PATCH 20/43] Addressing feedback for the migrations (#104104) --- .../tests/common/configure/migrations.ts | 15 ++++++- .../tests/common/connectors/migrations.ts | 39 ------------------- .../tests/common/migrations.ts | 1 - 3 files changed, 13 insertions(+), 42 deletions(-) delete mode 100644 x-pack/test/case_api_integration/security_and_spaces/tests/common/connectors/migrations.ts diff --git a/x-pack/test/case_api_integration/security_and_spaces/tests/common/configure/migrations.ts b/x-pack/test/case_api_integration/security_and_spaces/tests/common/configure/migrations.ts index bf64500a880689..67eb23a43f397a 100644 --- a/x-pack/test/case_api_integration/security_and_spaces/tests/common/configure/migrations.ts +++ b/x-pack/test/case_api_integration/security_and_spaces/tests/common/configure/migrations.ts @@ -11,12 +11,13 @@ import { CASE_CONFIGURE_URL, SECURITY_SOLUTION_OWNER, } from '../../../../../../plugins/cases/common/constants'; -import { getConfiguration } from '../../../../common/lib/utils'; +import { getConfiguration, getConnectorMappingsFromES } from '../../../../common/lib/utils'; // eslint-disable-next-line import/no-default-export -export default function createGetTests({ getService }: FtrProviderContext) { +export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); + const es = getService('es'); describe('migrations', () => { describe('7.10.0', () => { @@ -64,6 +65,16 @@ export default function createGetTests({ getService }: FtrProviderContext) { expect(configuration[0].owner).to.be(SECURITY_SOLUTION_OWNER); }); + + it('adds the owner field to the connector mapping', async () => { + // We don't get the owner field back from the mappings when we retrieve the configuration so the only way to + // check that the migration worked is by checking the saved object stored in Elasticsearch directly + const mappings = await getConnectorMappingsFromES({ es }); + expect(mappings.body.hits.hits.length).to.be(1); + expect(mappings.body.hits.hits[0]._source?.['cases-connector-mappings'].owner).to.eql( + SECURITY_SOLUTION_OWNER + ); + }); }); }); } diff --git a/x-pack/test/case_api_integration/security_and_spaces/tests/common/connectors/migrations.ts b/x-pack/test/case_api_integration/security_and_spaces/tests/common/connectors/migrations.ts deleted file mode 100644 index 863c565b4ab085..00000000000000 --- a/x-pack/test/case_api_integration/security_and_spaces/tests/common/connectors/migrations.ts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; -import { SECURITY_SOLUTION_OWNER } from '../../../../../../plugins/cases/common/constants'; -import { getConnectorMappingsFromES } from '../../../../common/lib/utils'; - -// eslint-disable-next-line import/no-default-export -export default function createGetTests({ getService }: FtrProviderContext) { - const es = getService('es'); - const esArchiver = getService('esArchiver'); - - describe('migrations', () => { - describe('7.13.2', () => { - before(async () => { - await esArchiver.load('x-pack/test/functional/es_archives/cases/migrations/7.13.2'); - }); - - after(async () => { - await esArchiver.unload('x-pack/test/functional/es_archives/cases/migrations/7.13.2'); - }); - - it('adds the owner field', async () => { - // We don't get the owner field back from the mappings when we retrieve the configuration so the only way to - // check that the migration worked is by checking the saved object stored in Elasticsearch directly - const mappings = await getConnectorMappingsFromES({ es }); - expect(mappings.body.hits.hits.length).to.be(1); - expect(mappings.body.hits.hits[0]._source?.['cases-connector-mappings'].owner).to.eql( - SECURITY_SOLUTION_OWNER - ); - }); - }); - }); -} diff --git a/x-pack/test/case_api_integration/security_and_spaces/tests/common/migrations.ts b/x-pack/test/case_api_integration/security_and_spaces/tests/common/migrations.ts index 810fecc127d082..122eeee4114316 100644 --- a/x-pack/test/case_api_integration/security_and_spaces/tests/common/migrations.ts +++ b/x-pack/test/case_api_integration/security_and_spaces/tests/common/migrations.ts @@ -15,6 +15,5 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./comments/migrations')); loadTestFile(require.resolve('./configure/migrations')); loadTestFile(require.resolve('./user_actions/migrations')); - loadTestFile(require.resolve('./connectors/migrations')); }); }; From bc99bb03997157be32ba6020fbb8adf68d190db0 Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Thu, 1 Jul 2021 12:46:45 -0400 Subject: [PATCH 21/43] [Uptime] update panels with hasBorder prop (#103752) * update panels with hasBorder prop * remove panels where unnecessary --- .../responsive_wrapper.test.tsx.snap | 221 ------------------ .../higher_order/responsive_wrapper.test.tsx | 10 +- .../higher_order/responsive_wrapper.tsx | 4 +- .../monitor_duration/monitor_duration.tsx | 2 +- .../monitor/ping_list/ping_list.tsx | 2 +- .../monitor/status_details/status_details.tsx | 2 +- .../step_detail/step_detail_container.tsx | 6 +- .../data_or_index_missing.test.tsx.snap | 92 -------- .../data_or_index_missing.test.tsx | 7 +- .../empty_state/data_or_index_missing.tsx | 2 +- .../empty_state/empty_state_error.tsx | 2 +- .../__snapshots__/monitor_list.test.tsx.snap | 2 +- .../overview/monitor_list/monitor_list.tsx | 2 +- .../components/overview/status_panel.tsx | 2 +- .../synthetics/check_steps/steps_list.tsx | 12 +- .../plugins/uptime/public/pages/settings.tsx | 5 +- 16 files changed, 27 insertions(+), 346 deletions(-) delete mode 100644 x-pack/plugins/uptime/public/components/common/higher_order/__snapshots__/responsive_wrapper.test.tsx.snap delete mode 100644 x-pack/plugins/uptime/public/components/overview/empty_state/__snapshots__/data_or_index_missing.test.tsx.snap diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/__snapshots__/responsive_wrapper.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/higher_order/__snapshots__/responsive_wrapper.test.tsx.snap deleted file mode 100644 index 65b6d7cc39e558..00000000000000 --- a/x-pack/plugins/uptime/public/components/common/higher_order/__snapshots__/responsive_wrapper.test.tsx.snap +++ /dev/null @@ -1,221 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ResponsiveWrapper HOC is not responsive when prop is false 1`] = ` - - - -`; - -exports[`ResponsiveWrapper HOC renders a responsive wrapper 1`] = ` - - - -`; diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx b/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx index 5a3dca171b206e..db254fcb56081d 100644 --- a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { shallowWithIntl } from '@kbn/test/jest'; +import { render } from '../../../lib/helper/rtl_helpers'; import { withResponsiveWrapper } from './responsive_wrapper'; interface Prop { @@ -20,12 +20,12 @@ describe('ResponsiveWrapper HOC', () => { }); it('renders a responsive wrapper', () => { - const component = shallowWithIntl(); - expect(component).toMatchSnapshot(); + const { getByTestId } = render(); + expect(getByTestId('uptimeWithResponsiveWrapper--wrapper')).toBeInTheDocument(); }); it('is not responsive when prop is false', () => { - const component = shallowWithIntl(); - expect(component).toMatchSnapshot(); + const { getByTestId } = render(); + expect(getByTestId('uptimeWithResponsiveWrapper--panel')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx b/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx index 6802682db5f56c..0e33cc3e38f031 100644 --- a/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx +++ b/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx @@ -32,11 +32,11 @@ export const withResponsiveWrapper =

( Component: FC

): FC => ({ isResponsive, ...rest }: ResponsiveWrapperProps) => isResponsive ? ( - + ) : ( - + ); diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx index 86602a064b9d43..9ce5a509bdd520 100644 --- a/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx @@ -34,7 +34,7 @@ export const MonitorDurationComponent = ({ hasMLJob, }: DurationChartProps) => { return ( - + diff --git a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx index b9ad176b8ed761..06c7ab7bff843c 100644 --- a/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx @@ -251,7 +251,7 @@ export const PingList = () => { }; return ( - + + diff --git a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx b/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx index df8f5dff59dc22..610107f406306a 100644 --- a/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/synthetics/step_detail/step_detail_container.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiText, EuiLoadingSpinner } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiText, EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useEffect, useCallback, useMemo } from 'react'; import { useSelector, useDispatch } from 'react-redux'; @@ -104,7 +104,7 @@ export const StepDetailContainer: React.FC = ({ checkGroup, stepIndex }) : [], }} > - + <> {(!journey || journey.loading) && ( @@ -124,7 +124,7 @@ export const StepDetailContainer: React.FC = ({ checkGroup, stepIndex }) {journey && activeStep && !journey.loading && ( )} - + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/__snapshots__/data_or_index_missing.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/empty_state/__snapshots__/data_or_index_missing.test.tsx.snap deleted file mode 100644 index 45e40f71c0fdef..00000000000000 --- a/x-pack/plugins/uptime/public/components/overview/empty_state/__snapshots__/data_or_index_missing.test.tsx.snap +++ /dev/null @@ -1,92 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`DataOrIndexMissing component renders headingMessage 1`] = ` - - - - - - - - - - - - - - - - - } - body={ - -

- -

-

- -

- - } - iconType="logoUptime" - title={ - -

- - heartbeat-* - , - } - } - /> -

-
- } - /> - -
-
-`; diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.test.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.test.tsx index c6898971a693eb..caff055ce987ca 100644 --- a/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.test.tsx @@ -6,8 +6,9 @@ */ import React from 'react'; -import { shallowWithIntl } from '@kbn/test/jest'; +import { screen } from '@testing-library/react'; import { FormattedMessage } from '@kbn/i18n/react'; +import { render } from '../../../lib/helper/rtl_helpers'; import { DataOrIndexMissing } from './data_or_index_missing'; describe('DataOrIndexMissing component', () => { @@ -19,7 +20,7 @@ describe('DataOrIndexMissing component', () => { values={{ indexName: heartbeat-* }} /> ); - const component = shallowWithIntl(); - expect(component).toMatchSnapshot(); + render(); + expect(screen.getByText(/heartbeat-*/)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx index 7f9839ff94dbe8..44e55de990bbf6 100644 --- a/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx +++ b/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx @@ -30,7 +30,7 @@ export const DataOrIndexMissing = ({ headingMessage, settings }: DataMissingProp - + { return ( - +
+ ( - + diff --git a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx index 47b89e82dc5c7c..0da6f034e53bbf 100644 --- a/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx +++ b/x-pack/plugins/uptime/public/components/synthetics/check_steps/steps_list.tsx @@ -5,13 +5,7 @@ * 2.0. */ -import { - EuiBasicTable, - EuiBasicTableColumn, - EuiButtonIcon, - EuiPanel, - EuiTitle, -} from '@elastic/eui'; +import { EuiBasicTable, EuiBasicTableColumn, EuiButtonIcon, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { MouseEvent } from 'react'; import styled from 'styled-components'; @@ -147,7 +141,7 @@ export const StepsList = ({ data, error, loading }: Props) => { }; return ( - + <>

{statusMessage( @@ -176,6 +170,6 @@ export const StepsList = ({ data, error, loading }: Props) => { tableLayout={'auto'} rowProps={getRowProps} /> - + ); }; diff --git a/x-pack/plugins/uptime/public/pages/settings.tsx b/x-pack/plugins/uptime/public/pages/settings.tsx index 5f2699240425a6..88bae5536c05f4 100644 --- a/x-pack/plugins/uptime/public/pages/settings.tsx +++ b/x-pack/plugins/uptime/public/pages/settings.tsx @@ -13,7 +13,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiForm, - EuiPanel, EuiSpacer, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -148,7 +147,7 @@ export const SettingsPage: React.FC = () => { ); return ( - + <> {cannotEditNotice} @@ -213,6 +212,6 @@ export const SettingsPage: React.FC = () => {

-
+ ); }; From 03c713123c027f54af4f535c2ef41c988035d8a5 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Thu, 1 Jul 2021 17:57:33 +0100 Subject: [PATCH 22/43] [ML] Data visualizer: Removes experimental badge from file data visualizer (#104075) * [ML] Data visualizer: Removes experimental badge from file data visualizer * [ML] Remove experimental badge scss import --- .../application/common/components/_index.scss | 1 - .../_experimental_badge.scss | 7 --- .../components/experimental_badge/_index.scss | 1 - .../experimental_badge/experimental_badge.tsx | 28 ------------ .../components/experimental_badge/index.ts | 8 ---- .../about_panel/welcome_content.tsx | 44 +------------------ .../components/import_view/import_view.js | 10 ----- .../datavisualizer_selector.tsx | 13 ------ .../translations/translations/ja-JP.json | 7 --- .../translations/translations/zh-CN.json | 7 --- 10 files changed, 2 insertions(+), 124 deletions(-) delete mode 100644 x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_experimental_badge.scss delete mode 100644 x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_index.scss delete mode 100644 x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/experimental_badge.tsx delete mode 100644 x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/index.ts diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/_index.scss b/x-pack/plugins/data_visualizer/public/application/common/components/_index.scss index f57abbbe6396b4..02a8766b3d24c4 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/_index.scss +++ b/x-pack/plugins/data_visualizer/public/application/common/components/_index.scss @@ -1,4 +1,3 @@ @import 'embedded_map/index'; -@import 'experimental_badge/index'; @import 'stats_table/index'; @import 'top_values/top_values'; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_experimental_badge.scss b/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_experimental_badge.scss deleted file mode 100644 index 8b21620542ff75..00000000000000 --- a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_experimental_badge.scss +++ /dev/null @@ -1,7 +0,0 @@ -.experimental-badge.euiBetaBadge { - font-size: 10px; - vertical-align: middle; - margin-bottom: 5px; - padding: 0 20px; - line-height: 20px; -} diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_index.scss b/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_index.scss deleted file mode 100644 index 9e25affd5e5f60..00000000000000 --- a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'experimental_badge' diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/experimental_badge.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/experimental_badge.tsx deleted file mode 100644 index 9c39ee54a2a868..00000000000000 --- a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/experimental_badge.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FormattedMessage } from '@kbn/i18n/react'; -import React, { FC } from 'react'; - -import { EuiBetaBadge } from '@elastic/eui'; - -export const ExperimentalBadge: FC<{ tooltipContent: string }> = ({ tooltipContent }) => { - return ( - - - } - tooltipContent={tooltipContent} - /> - - ); -}; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/index.ts b/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/index.ts deleted file mode 100644 index 94203c2b156af2..00000000000000 --- a/x-pack/plugins/data_visualizer/public/application/common/components/experimental_badge/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { ExperimentalBadge } from './experimental_badge'; diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/about_panel/welcome_content.tsx b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/about_panel/welcome_content.tsx index 86b869fe06fa18..7b091e699b6172 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/about_panel/welcome_content.tsx +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/about_panel/welcome_content.tsx @@ -7,30 +7,12 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC } from 'react'; -import { i18n } from '@kbn/i18n'; -import { - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiLink, - EuiSpacer, - EuiText, - EuiTitle, -} from '@elastic/eui'; - -import { ExperimentalBadge } from '../../../common/components/experimental_badge'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { useDataVisualizerKibana } from '../../../kibana_context'; export const WelcomeContent: FC = () => { - const toolTipContent = i18n.translate( - 'xpack.dataVisualizer.file.welcomeContent.experimentalFeatureTooltip', - { - defaultMessage: "Experimental feature. We'd love to hear your feedback.", - } - ); - const { services: { fileUpload: { getMaxBytesFormatted }, @@ -48,10 +30,7 @@ export const WelcomeContent: FC = () => {

, - }} + defaultMessage="Visualize data from a log file" />

@@ -132,25 +111,6 @@ export const WelcomeContent: FC = () => { />

- - -

- - GitHub - - ), - }} - /> -

-
); diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js index 74a3638f555d02..232a32c75dc291 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/import_view/import_view.js @@ -31,7 +31,6 @@ import { addCombinedFieldsToMappings, getDefaultCombinedFields, } from '../../../common/components/combined_fields'; -import { ExperimentalBadge } from '../../../common/components/experimental_badge'; const DEFAULT_TIME_FIELD = '@timestamp'; const DEFAULT_INDEX_SETTINGS = { number_of_shards: 1 }; @@ -510,15 +509,6 @@ export class ImportView extends Component { id="xpack.dataVisualizer.file.importView.importDataTitle" defaultMessage="Import data" /> -   - - } - />

diff --git a/x-pack/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx b/x-pack/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx index 3b3b1af30610d6..f9df1b452f4753 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/datavisualizer_selector.tsx @@ -20,7 +20,6 @@ import { EuiText, EuiTitle, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { isFullLicense } from '../license'; @@ -122,18 +121,6 @@ export const DatavisualizerSelector: FC = () => { values={{ maxFileSize }} /> } - betaBadgeLabel={i18n.translate( - 'xpack.ml.datavisualizer.selector.experimentalBadgeLabel', - { - defaultMessage: 'Experimental', - } - )} - betaBadgeTooltipContent={ - - } footer={ Date: Thu, 1 Jul 2021 13:07:08 -0400 Subject: [PATCH 23/43] [Docs] Add documentation on multiple tenants (#103125) --- docs/spaces/index.asciidoc | 2 ++ docs/user/security/authorization/index.asciidoc | 16 +++++++++++++++- .../how-to-secure-access-to-kibana.asciidoc | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/spaces/index.asciidoc b/docs/spaces/index.asciidoc index 81f39457795035..8eea3b1ee45523 100644 --- a/docs/spaces/index.asciidoc +++ b/docs/spaces/index.asciidoc @@ -30,6 +30,8 @@ Kibana supports spaces in several ways. You can: The `kibana_admin` role or equivilent is required to manage **Spaces**. +TIP: Looking to support multiple tenants? See <> for more information. + [float] [[spaces-managing]] === View, create, and delete spaces diff --git a/docs/user/security/authorization/index.asciidoc b/docs/user/security/authorization/index.asciidoc index c62f137f985281..523a90bdf07ce4 100644 --- a/docs/user/security/authorization/index.asciidoc +++ b/docs/user/security/authorization/index.asciidoc @@ -6,7 +6,21 @@ The Elastic Stack comes with the `kibana_admin` {ref}/built-in-roles.html[built- When you assign a user multiple roles, the user receives a union of the roles’ privileges. Therefore, assigning the `kibana_admin` role in addition to a custom role that grants {kib} privileges is ineffective because `kibana_admin` has access to all the features in all spaces. -NOTE: When running multiple tenants of {kib} by changing the `kibana.index` in your `kibana.yml`, you cannot use `kibana_admin` to grant access. You must create custom roles that authorize the user for that specific tenant. Although multi-tenant installations are supported, the recommended approach to securing access to {kib} segments is to grant users access to specific spaces. +[[xpack-security-multiple-tenants]] +==== Supporting multiple tenants + +There are two approaches to supporting multi-tenancy in {kib}: + +1. *Recommended:* Create a space and a limited role for each tenant, and configure each user with the appropriate role. See +<> for more details. +2. deprecated:[7.13.0,"In 8.0 and later, the `kibana.index` setting will no longer be supported."] Set up separate {kib} instances to work +with a single {es} cluster by changing the `kibana.index` setting in your `kibana.yml` file. ++ +NOTE: When using multiple {kib} instances this way, you cannot use the `kibana_admin` role to grant access. You must create custom roles +that authorize the user for each specific instance. + +Whichever approach you use, be careful when granting cluster privileges and index privileges. Both of these approaches share the same {es} +cluster, and {kib} spaces do not prevent you from granting users of two different tenants access to the same index. [role="xpack"] [[xpack-kibana-role-management]] diff --git a/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc b/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc index 63b83712e3e6e1..199f138347fa02 100644 --- a/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc +++ b/docs/user/security/tutorials/how-to-secure-access-to-kibana.asciidoc @@ -11,7 +11,7 @@ This guide introduces you to three of {kib}'s security features: spaces, roles, [float] === Spaces -Do you have multiple teams using {kib}? Do you want a “playground” to experiment with new visualizations or alerts? If so, then <> can help. +Do you have multiple teams or tenants using {kib}? Do you want a “playground” to experiment with new visualizations or alerts? If so, then <> can help. Think of a space as another instance of {kib}. A space allows you to organize your <>, <>, <>, and much more into their own categories. For example, you might have a Marketing space for your marketeers to track the results of their campaigns, and an Engineering space for your developers to {apm-get-started-ref}/overview.html[monitor application performance]. From ec75f71d4c89e3493f8899879c9b930275eb85e5 Mon Sep 17 00:00:00 2001 From: Rashmi Kulkarni Date: Thu, 1 Jul 2021 11:18:14 -0700 Subject: [PATCH 24/43] Timelion tests- migrate to kbnArchiver from esArchiver (#103969) * Timelion tests- migrate to kbnArchiver * added the logic to handle custom space * paths and version changed --- .../feature_controls/timelion_security.ts | 12 ++++- .../feature_controls/timelion_spaces.ts | 38 ++++++++++++-- .../timelion/feature_controls.json | 52 +++++++++++++++++++ .../timelion/timelion_custom_space.json | 20 +++++++ 4 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json create mode 100644 x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json diff --git a/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts b/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts index e83eabfb05f44a..ff6103f16e4944 100644 --- a/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts +++ b/x-pack/test/functional/apps/timelion/feature_controls/timelion_security.ts @@ -11,6 +11,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects, getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const security = getService('security'); + const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects([ 'common', 'error', @@ -24,10 +25,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('feature controls security', () => { before(async () => { - await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/timelion/feature_controls'); + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); }); + after(async () => { + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); + await esArchiver.unload('x-pack/test/functional/es_archives/logstash_functional'); + }); + describe('global timelion all privileges', () => { before(async () => { await security.role.create('global_timelion_all_role', { diff --git a/x-pack/test/functional/apps/timelion/feature_controls/timelion_spaces.ts b/x-pack/test/functional/apps/timelion/feature_controls/timelion_spaces.ts index 91c357f37085e7..a1dea695fce86a 100644 --- a/x-pack/test/functional/apps/timelion/feature_controls/timelion_spaces.ts +++ b/x-pack/test/functional/apps/timelion/feature_controls/timelion_spaces.ts @@ -13,6 +13,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const spacesService = getService('spaces'); const PageObjects = getPageObjects(['common', 'timelion', 'security', 'spaceSelector']); const appsMenu = getService('appsMenu'); + const kibanaServer = getService('kibanaServer'); describe('timelion', () => { before(async () => { @@ -23,29 +24,44 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { before(async () => { // we need to load the following in every situation as deleting // a space deletes all of the associated saved objects - await esArchiver.load('x-pack/test/functional/es_archives/timelion/feature_controls'); + // await esArchiver.load('x-pack/test/functional/es_archives/timelion/feature_controls'); + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); + await spacesService.create({ id: 'custom_space', name: 'custom_space', disabledFeatures: [], }); + + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json', + { space: 'custom_space' } + ); }); after(async () => { await spacesService.delete('custom_space'); - await esArchiver.unload('x-pack/test/functional/es_archives/timelion/feature_controls'); + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); }); it('shows timelion navlink', async () => { await PageObjects.common.navigateToApp('home', { basePath: '/s/custom_space', }); + const navLinks = (await appsMenu.readLinks()).map((link) => link.text); expect(navLinks).to.contain('Timelion'); }); it(`allows a timelion sheet to be created`, async () => { - await PageObjects.common.navigateToApp('timelion'); + await PageObjects.common.navigateToApp('timelion', { + basePath: '/s/custom_space', + }); + await PageObjects.timelion.saveTimelionSheet(); }); }); @@ -54,17 +70,29 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { before(async () => { // we need to load the following in every situation as deleting // a space deletes all of the associated saved objects - await esArchiver.load('x-pack/test/functional/es_archives/timelion/feature_controls'); + // await esArchiver.load('x-pack/test/functional/es_archives/timelion/feature_controls'); + + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); + await spacesService.create({ id: 'custom_space', name: 'custom_space', disabledFeatures: ['timelion'], }); + + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json', + { space: 'custom_space' } + ); }); after(async () => { await spacesService.delete('custom_space'); - await esArchiver.unload('x-pack/test/functional/es_archives/timelion/feature_controls'); + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json' + ); }); it(`doesn't show timelion navlink`, async () => { diff --git a/x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json b/x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json new file mode 100644 index 00000000000000..323dbb67d54b87 --- /dev/null +++ b/x-pack/test/functional/fixtures/kbn_archiver/timelion/feature_controls.json @@ -0,0 +1,52 @@ +{ + "attributes": { + "buildNum": 9007199254740991, + "defaultIndex": "logstash-*" + }, + "coreMigrationVersion": "7.14.0", + "id": "7.0.0", + "migrationVersion": { + "config": "7.13.0" + }, + "references": [], + "type": "config", + "updated_at": "2019-01-22T19:32:02.235Z", + "version": "WzQsMl0=" +} + +{ + "attributes": { + "description": "", + "hits": 0, + "timelion_chart_height": 275, + "timelion_columns": 2, + "timelion_interval": "auto", + "timelion_rows": 2, + "timelion_sheet": [ + ".es(*)" + ], + "title": "i-exist", + "version": 1 + }, + "coreMigrationVersion": "7.14.0", + "id": "i-exist", + "references": [], + "type": "timelion-sheet", + "version": "WzYsMl0=" +} + +{ + "attributes": { + "fields": "[{\"name\":\"@message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@message.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@tags\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@tags.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"agent\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"agent.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"bytes\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"clientip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"extension\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"extension.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.coordinates\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.dest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.src\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.srcdest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"headings\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"headings.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"host\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"host.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"id\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"index.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"links\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"links.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"machine.os\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"machine.os.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"machine.ram\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"memory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.char\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.related\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.firstname\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.lastname\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"phpmemory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"referer\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:modified_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:published_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:section\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:section.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:tag\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:tag.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image:height\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:height.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image:width\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:width.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:site_name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:site_name.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:type.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:card\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:card.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:site\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:site.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"request\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"request.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"response\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"response.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"spaces\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"spaces.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"utc_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"xss\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"xss.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"kilobytes\",\"type\":\"number\",\"count\":0,\"scripted\":true,\"script\":\"doc['bytes'].value / 1000\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"machine os raw\",\"type\":\"string\",\"count\":0,\"scripted\":true,\"script\":\"doc['machine.os.raw'].value\",\"lang\":\"painless\",\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false}]", + "timeFieldName": "@timestamp", + "title": "logstash-*" + }, + "coreMigrationVersion": "7.14.0", + "id": "logstash-*", + "migrationVersion": { + "index-pattern": "7.11.0" + }, + "references": [], + "type": "index-pattern", + "version": "WzUsMl0=" +} \ No newline at end of file diff --git a/x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json b/x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json new file mode 100644 index 00000000000000..f27149f9d7eb65 --- /dev/null +++ b/x-pack/test/functional/fixtures/kbn_archiver/timelion/timelion_custom_space.json @@ -0,0 +1,20 @@ +{ + "attributes": { + "description": "", + "hits": 0, + "timelion_chart_height": 275, + "timelion_columns": 2, + "timelion_interval": "auto", + "timelion_rows": 2, + "timelion_sheet": [ + ".es(*).label('custom space sheet')" + ], + "title": "i-exist", + "version": 1 + }, + "coreMigrationVersion": "7.14.0", + "id": "i-exist", + "references": [], + "type": "timelion-sheet", + "version": "WzcsMl0=" +} \ No newline at end of file From 23d900eb56e1a5765136d2b7f0212681eb09bc97 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Thu, 1 Jul 2021 21:27:49 +0200 Subject: [PATCH 25/43] Bump Node.js from version 14.17.0 to 14.17.2 (#104148) --- .node-version | 2 +- .nvmrc | 2 +- WORKSPACE.bazel | 12 ++++++------ package.json | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.node-version b/.node-version index 62df50f1eefe19..0a9f3027ffc44e 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -14.17.0 +14.17.2 diff --git a/.nvmrc b/.nvmrc index 62df50f1eefe19..0a9f3027ffc44e 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14.17.0 +14.17.2 diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index ebf7bbc8488ac8..7bb0861256d233 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -27,13 +27,13 @@ check_rules_nodejs_version(minimum_version_string = "3.6.0") # we can update that rule. node_repositories( node_repositories = { - "14.17.0-darwin_amd64": ("node-v14.17.0-darwin-x64.tar.gz", "node-v14.17.0-darwin-x64", "7b210652e11d1ee25650c164cf32381895e1dcb3e0ff1d0841d8abc1f47ac73e"), - "14.17.0-linux_arm64": ("node-v14.17.0-linux-arm64.tar.xz", "node-v14.17.0-linux-arm64", "712e5575cee20570a0a56f4d4b4572cb0f2ee2f4bce49433de18be0393e7df22"), - "14.17.0-linux_s390x": ("node-v14.17.0-linux-s390x.tar.xz", "node-v14.17.0-linux-s390x", "6419372b9e9ad37e0bce188dc5740f2f060aaa44454418e462b4088a310a1c0b"), - "14.17.0-linux_amd64": ("node-v14.17.0-linux-x64.tar.xz", "node-v14.17.0-linux-x64", "494b161759a3d19c70e3172d33ce1918dd8df9ad20d29d1652a8387a84e2d308"), - "14.17.0-windows_amd64": ("node-v14.17.0-win-x64.zip", "node-v14.17.0-win-x64", "6582a7259c433e9f667dcc4ed3e5d68bc514caba2eed40e4626c8b4c7e5ecd5c"), + "14.17.2-darwin_amd64": ("node-v14.17.2-darwin-x64.tar.gz", "node-v14.17.2-darwin-x64", "e45db91fc2136202868a5eb7c6d08b0a2b75394fafdf8538f650fa945b7dee16"), + "14.17.2-linux_arm64": ("node-v14.17.2-linux-arm64.tar.xz", "node-v14.17.2-linux-arm64", "3aff08c49b8c0c3443e7a9ea9bfe607867d79e6e5ccf204a5c8f13fb92a48abd"), + "14.17.2-linux_s390x": ("node-v14.17.2-linux-s390x.tar.xz", "node-v14.17.2-linux-s390x", "76f955856626a3e596b438855fdfe438937623dc71af9a25a8466409be470877"), + "14.17.2-linux_amd64": ("node-v14.17.2-linux-x64.tar.xz", "node-v14.17.2-linux-x64", "6cf9db7349407c177b36205feec949729d0ee9db485e19b10b0b1ffca65a3a46"), + "14.17.2-windows_amd64": ("node-v14.17.2-win-x64.zip", "node-v14.17.2-win-x64", "0e27897578752865fa61546d75b20f7cd62957726caab3c03f82c57a4aef5636"), }, - node_version = "14.17.0", + node_version = "14.17.2", node_urls = [ "https://nodejs.org/dist/v{version}/{filename}", ], diff --git a/package.json b/package.json index 1cc379fb807d07..de7df7fea3d8df 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "**/underscore": "^1.13.1" }, "engines": { - "node": "14.17.0", + "node": "14.17.2", "yarn": "^1.21.1" }, "dependencies": { From 9e60da5b4621a8143c5e7bf4be48653f7a2c2940 Mon Sep 17 00:00:00 2001 From: "Christiane (Tina) Heiligers" Date: Thu, 1 Jul 2021 12:28:48 -0700 Subject: [PATCH 26/43] [Localization] Adds guidelines about markdown and long paragraphs (#104171) --- packages/kbn-i18n/GUIDELINE.md | 108 ++++++++++++++++++++++++++++++++- 1 file changed, 107 insertions(+), 1 deletion(-) diff --git a/packages/kbn-i18n/GUIDELINE.md b/packages/kbn-i18n/GUIDELINE.md index 437e73bb270199..806e799bd1106f 100644 --- a/packages/kbn-i18n/GUIDELINE.md +++ b/packages/kbn-i18n/GUIDELINE.md @@ -19,6 +19,7 @@ Ids should end with: - ErrorMessage (if it's an error message), - LinkText (if it's `` tag), - ToggleSwitch and etc. +- `.markdown` (if it's markdown) There is one more complex case, when we have to divide a single expression into different labels. @@ -110,7 +111,7 @@ Currently, we support the following AngluarJS `i18n` tools, but they will be rem ### Naming convention The message ids chosen for message keys should always be descriptive of the string, and its role in the interface (button label, title, etc.). Think of them as long variable names. When you have to change a message id, adding a progressive number to the existing key should always be used as a last resort. -Here's a rule of id maning: +Here's a rule of id naming: `{plugin}.{area}.[{sub-area}].{element}` @@ -138,6 +139,7 @@ Here's a rule of id maning: 'kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch' 'kbn.management.editIndexPattern.wrongTypeErrorMessage' 'kbn.management.editIndexPattern.scripted.table.nameDescription' + 'xpack.lens.formulaDocumentation.filterRatioDescription.markdown' ``` - For complex messages, which are divided into several parts, use the following approach: @@ -192,6 +194,7 @@ Each message id should end with a type of the message. | tooltip | `kbn.management.editIndexPattern.removeTooltip` | | error message | `kbn.management.createIndexPattern.step.invalidCharactersErrorMessage` | | toggleSwitch | `kbn.management.createIndexPattern.includeSystemIndicesToggleSwitch` | +| markdown | `xpack.lens.formulaDocumentation.filterRatioDescription.markdown` | For example: @@ -281,6 +284,27 @@ For example: /> ``` +- for markdown + ```js + import { Markdown } from '@elastic/eui'; + + + ``` + ### Variety of `values` - Variables @@ -372,6 +396,82 @@ Here is an example of message translation depending on a plural category: When `conflictFieldsLength` equals 1, the result string will be `"A field is defined as several types (string, integer, etc) across the indices that match this pattern."`. In cases when `conflictFieldsLength` has value of 2 or more, the result string - `"2 fields are defined as several types (string, integer, etc) across the indices that match this pattern."`. +### Text with markdown + +There is some support for using markdown and you can use any of the following syntax: + +#### Headers + +```md +# This is an

tag +## This is an

tag +###### This is an

tag +``` + +#### Emphasis + +```md +*This text will be italic* +_This will also be italic_ + +**This text will be bold** +__This will also be bold__ + +_You **can** combine them_ +``` + +#### Lists + ##### Unordered + +```md +* Item 1 +* Item 2 + * Item 2a + * Item 2b +``` + ##### Ordered + +```md +1. Item 1 +1. Item 2 +1. Item 3 + 1. Item 3a + 1. Item 3b +``` +#### Images + +```md +![Github Logo](/images/logo.png) +Format: ![Alt Text](url) +``` + +#### Links + +```md +http://github.com - automatic! +[GitHub](http://github.com) +``` + +#### Blockquotes + +```md +As Kanye West said: + +> We're living the future so +> the present is our past. +``` +#### Code Blocks + +```md +var a = 13; +``` + +#### Inline code + +```md +I think you should use an +`` element here instead +``` ### Splitting Splitting sentences into several keys often inadvertently presumes a grammar, a sentence structure, and such composite strings are often very difficult to translate. @@ -385,6 +485,12 @@ Splitting sentences into several keys often inadvertently presumes a grammar, a If this group of sentences is separated it’s possible that the context of the `'it'` in `'close it'` will be lost. +### Large paragraphs + +Try to avoid using large paragraphs of text. They are difficult to maintain and often need small changes when the information becomes out of date. + +If you have no other choice, you can split paragraphs into a _few_ i18n chunks. Chunks should be split at logical points to ensure they contain enough context to be intelligible on their own. + ### Unit tests #### How to test `FormattedMessage` and `i18n.translate()` components. From b7dc2c1d8ca0b194d0593652b75ea8294e9b89f6 Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Thu, 1 Jul 2021 15:58:52 -0400 Subject: [PATCH 27/43] [Uptime] Fix uptime amsterdam UI issues (#103683) * Uptime - update monitor type format in StatusBar and update UI for define connectors switch * update define_connectors * Resolve type error. * Add tests for `renderMonitorType`. * remove unnecessary async specifier * update i18n * remove unused imports * update i18n Co-authored-by: Justin Kambic Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../translations/translations/ja-JP.json | 3 +- .../translations/translations/zh-CN.json | 3 +- .../components/monitor/monitor_title.tsx | 15 +-- .../status_bar/status_bar.test.ts | 32 +++++++ .../status_details/status_bar/status_bar.tsx | 26 ++++- .../__snapshots__/monitor_list.test.tsx.snap | 94 +++++++++++-------- .../columns/define_connectors.test.tsx | 44 +++++++++ .../columns/define_connectors.tsx | 80 +++++++++++----- .../columns/enable_alert.test.tsx | 7 +- .../monitor_list/columns/enable_alert.tsx | 6 +- .../monitor_list/columns/translations.ts | 4 +- 11 files changed, 231 insertions(+), 83 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts create mode 100644 x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f52589732df99e..70b6d766fe7868 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -23592,7 +23592,6 @@ "xpack.uptime.monitorDetails.title.pingType.icmp": "ICMP ping", "xpack.uptime.monitorDetails.title.pingType.tcp": "TCP ping", "xpack.uptime.monitorList.anomalyColumn.label": "レスポンス異常スコア", - "xpack.uptime.monitorList.defineConnector.description": "アラートを有効にするには、デフォルトのアラートアクションコネクターを定義してください。", "xpack.uptime.monitorList.downLineSeries.downLabel": "ダウン", "xpack.uptime.monitorList.drawer.missingLocation": "一部の Heartbeat インスタンスには位置情報が定義されていません。Heartbeat 構成への{link}。", "xpack.uptime.monitorList.drawer.mostRecentRun": "直近のテスト実行", @@ -24216,4 +24215,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d4b87d1b123902..02e17eaac3f574 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -23960,7 +23960,6 @@ "xpack.uptime.monitorDetails.title.pingType.icmp": "ICMP ping", "xpack.uptime.monitorDetails.title.pingType.tcp": "TCP ping", "xpack.uptime.monitorList.anomalyColumn.label": "响应异常分数", - "xpack.uptime.monitorList.defineConnector.description": "要开始启用告警,请在以下位置定义默认告警操作连接器", "xpack.uptime.monitorList.downLineSeries.downLabel": "关闭检查", "xpack.uptime.monitorList.drawer.missingLocation": "某些 Heartbeat 实例未定义位置。{link}到您的 Heartbeat 配置。", "xpack.uptime.monitorList.drawer.mostRecentRun": "最新测试运行", @@ -24594,4 +24593,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "此字段必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx index 8cb1c49cbd9743..2112af06536695 100644 --- a/x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/monitor_title.tsx @@ -89,17 +89,9 @@ export const MonitorPageTitle: React.FC = () => { return ( <> - - - -

{nameOrId}

-
- -
- - - -
+ +

{nameOrId}

+
@@ -126,6 +118,7 @@ export const MonitorPageTitle: React.FC = () => { )} + ); }; diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts new file mode 100644 index 00000000000000..82e7dfd2d0ced9 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { renderMonitorType } from './status_bar'; + +describe('StatusBar component', () => { + describe('renderMonitorType', () => { + it('handles http type', () => { + expect(renderMonitorType('http')).toBe('HTTP'); + }); + + it('handles tcp type', () => { + expect(renderMonitorType('tcp')).toBe('TCP'); + }); + + it('handles icmp type', () => { + expect(renderMonitorType('icmp')).toBe('ICMP'); + }); + + it('handles browser type', () => { + expect(renderMonitorType('browser')).toBe('Browser'); + }); + + it('returns empty string for `undefined`', () => { + expect(renderMonitorType(undefined)).toBe(''); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx index 18049a9de5c5c3..e8374d3792bfe5 100644 --- a/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx +++ b/x-pack/plugins/uptime/public/components/monitor/status_details/status_bar/status_bar.tsx @@ -15,6 +15,7 @@ import { EuiDescriptionListDescription, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; import { MonitorSSLCertificate } from './ssl_certificate'; import * as labels from '../translations'; import { StatusByLocations } from './status_by_location'; @@ -40,6 +41,29 @@ export const MonListDescription = styled(EuiDescriptionListDescription)` } `; +export const renderMonitorType = (type: string | undefined) => { + switch (type) { + case 'http': + return i18n.translate('xpack.uptime.monitorDetails.statusBar.pingType.http', { + defaultMessage: 'HTTP', + }); + case 'tcp': + return i18n.translate('xpack.uptime.monitorDetails.statusBar.pingType.tcp', { + defaultMessage: 'TCP', + }); + case 'icmp': + return i18n.translate('xpack.uptime.monitorDetails.statusBar.pingType.icmp', { + defaultMessage: 'ICMP', + }); + case 'browser': + return i18n.translate('xpack.uptime.monitorDetails.statusBar.pingType.browser', { + defaultMessage: 'Browser', + }); + default: + return ''; + } +}; + export const MonitorStatusBar: React.FC = () => { const { monitorId, monitorStatus, monitorLocations = {} } = useStatusBar(); @@ -77,7 +101,7 @@ export const MonitorStatusBar: React.FC = () => { <> {labels.typeLabel} - {monitorStatus.monitor.type} + {renderMonitorType(monitorStatus?.monitor?.type)} )} diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/monitor_list.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/monitor_list.test.tsx.snap index 8ecadcf19f4efb..a4fcb141d454b9 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/monitor_list.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/__snapshots__/monitor_list.test.tsx.snap @@ -1299,28 +1299,37 @@ exports[`MonitorList component renders the monitor list 1`] = ` class="euiPopover__anchor" >
- + +
+
@@ -1552,28 +1561,37 @@ exports[`MonitorList component renders the monitor list 1`] = ` class="euiPopover__anchor" >
- + +
+
diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx new file mode 100644 index 00000000000000..aa257177970a18 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.test.tsx @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { DefineAlertConnectors } from './define_connectors'; +import { screen } from '@testing-library/react'; +import { fireEvent } from '@testing-library/dom'; +import { ENABLE_STATUS_ALERT } from './translations'; +import { render } from '../../../../lib/helper/rtl_helpers'; + +describe('EnableAlertComponent', () => { + it('does not showHelpText or render popover when showHelpText and renderPopOver are false', () => { + render(); + expect(screen.getByTestId('uptimeDisplayDefineConnector')).toBeInTheDocument(); + expect(screen.queryByText(ENABLE_STATUS_ALERT)).not.toBeInTheDocument(); + expect(screen.queryByText(/Define a default connector/)).not.toBeInTheDocument(); + + fireEvent.click(screen.getByTestId('uptimeDisplayDefineConnector')); + + expect(screen.queryByTestId('uptimeSettingsDefineConnector')).not.toBeInTheDocument(); + }); + + it('shows label when showLabel is true', () => { + render(); + expect(screen.getByText(ENABLE_STATUS_ALERT)).toBeInTheDocument(); + }); + + it('shows helpText when showHelpText is true', () => { + render(); + expect(screen.getByText(/Define a default connector/)).toBeInTheDocument(); + }); + + it('renders popover on click when showPopover is true', () => { + render(); + + fireEvent.click(screen.getByTestId('uptimeDisplayDefineConnector')); + + expect(screen.getByTestId('uptimeSettingsDefineConnector')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx index 956e18f3d7cc34..dcc70c16e920be 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/define_connectors.tsx @@ -6,41 +6,72 @@ */ import React, { useState } from 'react'; -import { EuiPopover, EuiSwitch, EuiText } from '@elastic/eui'; -import { useRouteMatch } from 'react-router-dom'; -import { i18n } from '@kbn/i18n'; +import { EuiSwitch, EuiPopover, EuiText, EuiFormRow } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { ReactRouterEuiLink } from '../../../common/react_router_helpers'; -import { MONITOR_ROUTE, SETTINGS_ROUTE } from '../../../../../common/constants'; +import { SETTINGS_ROUTE } from '../../../../../common/constants'; import { ENABLE_STATUS_ALERT } from './translations'; -const SETTINGS_LINK_TEXT = i18n.translate('xpack.uptime.page_header.defineConnector', { - defaultMessage: 'Define a default connector', -}); +interface Props { + showPopover?: boolean; + showHelpText?: boolean; + showLabel?: boolean; +} -export const DefineAlertConnectors = () => { +export const DefineAlertConnectors = ({ + showPopover = false, + showHelpText = false, + showLabel = false, +}: Props) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const onButtonClick = () => setIsPopoverOpen((val) => !val); const closePopover = () => setIsPopoverOpen(false); - const isMonitorPage = useRouteMatch(MONITOR_ROUTE); - return ( + <> + + + + ), + }} + /> + ) : undefined + } + > + {}} + checked={false} + compressed={true} + disabled={!showPopover} + data-test-subj={'uptimeDisplayDefineConnector'} + /> + + } - isOpen={isPopoverOpen} + isOpen={showPopover ? isPopoverOpen : false} closePopover={closePopover} > @@ -48,10 +79,13 @@ export const DefineAlertConnectors = () => { to={SETTINGS_ROUTE + '?focusConnectorField=true'} data-test-subj={'uptimeSettingsLink'} > - {SETTINGS_LINK_TEXT} + {' '} diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx index 427985839ba892..53ba1b8ed57eb5 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.test.tsx @@ -18,7 +18,7 @@ import { AlertsResult } from '../../../../state/actions/types'; describe('EnableAlertComponent', () => { it('it displays define connectors when there is none', () => { - const { getByTestId, getByLabelText, getByText } = render( + const { getByTestId, getByLabelText, getByText, getByRole } = render( { fireEvent.click(getByTestId('uptimeDisplayDefineConnector')); - expect(getByTestId('uptimeSettingsLink')).toHaveAttribute( + expect(getByRole('link', { name: 'Define a default connector' })).toHaveAttribute( 'href', '/settings?focusConnectorField=true' ); - expect(getByText('to receive status alerts.')); + expect(getByText(/Define a default connector/)); + expect(getByText(/to receive status alerts./)); }); it('does not displays define connectors when there is connector', () => { diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx index f0f7c4d91c4f5d..9db6c3b4b0acb8 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/enable_alert.tsx @@ -125,6 +125,10 @@ export const EnableMonitorAlert = ({ monitorId, selectedMonitor }: Props) => { ) : ( - + ); }; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts index eadf8febebcf26..ce6708abf9ade8 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/columns/translations.ts @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; export const ENABLE_STATUS_ALERT = i18n.translate('xpack.uptime.monitorList.enableDownAlert', { - defaultMessage: 'Enable rule', + defaultMessage: 'Enable status alerts', }); export const DISABLE_STATUS_ALERT = i18n.translate('xpack.uptime.monitorList.disableDownAlert', { - defaultMessage: 'Disable rule', + defaultMessage: 'Disable status alerts', }); export const EXPAND_TAGS_LABEL = i18n.translate('xpack.uptime.monitorList.tags.expand', { From 17443d0701f4f3e7dbbb95b54bda2275c7d849bc Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Thu, 1 Jul 2021 15:59:31 -0400 Subject: [PATCH 28/43] [Uptime] Fix synthetics integration flaky tests (#103691) * focus uptime synthetics integration tests * unfocus tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/test/functional/apps/uptime/synthetics_integration.ts | 2 +- .../functional/page_objects/synthetics_integration_page.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/functional/apps/uptime/synthetics_integration.ts b/x-pack/test/functional/apps/uptime/synthetics_integration.ts index a4740de8e9a2b0..c4996299f0d43a 100644 --- a/x-pack/test/functional/apps/uptime/synthetics_integration.ts +++ b/x-pack/test/functional/apps/uptime/synthetics_integration.ts @@ -253,7 +253,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ]); }); - it.skip('allows configuring http advanced options', async () => { + it('allows configuring http advanced options', async () => { // This test ensures that updates made to the Synthetics Policy are carried all the way through // to the generated Agent Policy that is dispatch down to the Elastic Agent. const config = generateHTTPConfig('http://elastic.co'); diff --git a/x-pack/test/functional/page_objects/synthetics_integration_page.ts b/x-pack/test/functional/page_objects/synthetics_integration_page.ts index 56a67d9e6fbd43..3321234a345e4a 100644 --- a/x-pack/test/functional/page_objects/synthetics_integration_page.ts +++ b/x-pack/test/functional/page_objects/synthetics_integration_page.ts @@ -86,7 +86,7 @@ export function SyntheticsIntegrationPageProvider({ * @params {value} the value of the input */ async fillTextInputByTestSubj(testSubj: string, value: string) { - const field = await testSubjects.find(testSubj, 5000); + const field = await testSubjects.find(testSubj); await field.scrollIntoViewIfNecessary({ bottomOffset: fixedFooterHeight }); await field.click(); await field.clearValue(); @@ -118,7 +118,7 @@ export function SyntheticsIntegrationPageProvider({ */ async findHTTPAdvancedOptionsAccordion() { await this.ensureIsOnPackagePage(); - const accordion = await testSubjects.find('syntheticsHTTPAdvancedFieldsAccordion', 5000); + const accordion = await testSubjects.find('syntheticsHTTPAdvancedFieldsAccordion'); return accordion; }, From 5e71cad5c74e04afa23ae049a483a21ccfb472c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ece=20=C3=96zalp?= Date: Thu, 1 Jul 2021 16:24:23 -0400 Subject: [PATCH 29/43] =?UTF-8?q?[CTI]=20fixes=20undefined=20selectedTab?= =?UTF-8?q?=20when=20AlertSummaryView=20displays=20an=20e=E2=80=A6=20(#103?= =?UTF-8?q?970)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [CTI] fixes undefined selectedTab when AlertSummaryView displays an event after an alert * updates data type * updates data type * updates data type Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/common/components/event_details/event_details.tsx | 4 ++-- .../components/side_panel/event_details/expandable_event.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx index d07cdd81aa5f45..9afaaef61b17a4 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx @@ -104,7 +104,7 @@ const EventDetailsComponent: React.FC = ({ setSelectedTabId, ]); - const eventFields = useMemo(() => getEnrichmentFields(data ?? []), [data]); + const eventFields = useMemo(() => getEnrichmentFields(data), [data]); const existingEnrichments = useMemo( () => isAlert @@ -242,7 +242,7 @@ const EventDetailsComponent: React.FC = ({ ); }, [summaryTab, threatIntelTab, tableTab, jsonTab]); - const selectedTab = useMemo(() => tabs.find((tab) => tab.id === selectedTabId), [ + const selectedTab = useMemo(() => tabs.find((tab) => tab.id === selectedTabId) ?? tabs[0], [ tabs, selectedTabId, ]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx index fff2d4559c8dfc..47f6fe6606d3db 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/expandable_event.tsx @@ -122,7 +122,7 @@ export const ExpandableEvent = React.memo( Date: Thu, 1 Jul 2021 15:25:33 -0500 Subject: [PATCH 30/43] Use EUI variables in favor of APM style variables (#104016) Remove many of the variables in style/variables and replace them with EUI theme equivalents. * Remove all the `units.x` (double, triple, etc.) variables. They were used in few places. * Remove `px(x)` and just use `${x}px`. Many of its uses were not necessary. * Remove `pct(x)`; it was only used in one place. * Allow `truncate` to take a string or number and use `px` when given a number. * Move the remaining helpers (`unit` and `truncate`) to `utils/style`. * Some very contrived unit-based constants (`${px(units.unit + units.half + units.quarter)}`) replaced with hard-coded pixel values (`28px`). * Move shared/charts/Legend to shared/charts/Timeline/legend since that's the only place it's used. * Import organization and file renaming according to conventions. * Rename `WaterfallWithSummmary` to `WaterfallWithSummary`. * Remove unused `HttpContext` component from span flyout directory. * Clean up some Storybook path names There should be no visible style changes anywhere in the app; it's all refactoring. Fixes #90930. --- x-pack/plugins/apm/kibana.json | 10 +--- .../index.stories.tsx | 4 +- .../ServicePage/FormRowSelect.tsx | 0 .../ServicePage/ServicePage.tsx | 0 .../SettingsPage/SettingFormRow.tsx | 0 .../SettingsPage/SettingsPage.tsx | 0 .../SettingsPage/saveConfig.ts | 0 .../index.stories.tsx | 0 .../AgentConfigurationCreateEdit/index.tsx | 0 .../List/ConfirmDeleteModal.tsx | 0 .../List/index.tsx | 9 ++- .../index.tsx | 0 .../Settings/anomaly_detection/jobs_list.tsx | 2 +- .../custom_link}/CreateCustomLinkButton.tsx | 0 .../custom_link}/EmptyPrompt.tsx | 0 .../DeleteButton.test.tsx | 21 +++++-- .../DeleteButton.tsx | 5 +- .../Documentation.tsx | 0 .../FiltersSection.tsx | 0 .../FlyoutFooter.tsx | 0 .../LinkSection.tsx | 0 .../helper.test.ts | 2 +- .../create_edit_custom_link_flyout}/helper.ts | 0 .../create_edit_custom_link_flyout}/index.tsx | 0 .../link_preview.stories.tsx | 0 .../link_preview.test.tsx | 0 .../link_preview.tsx | 0 .../saveCustomLink.ts | 0 .../custom_link/custom_link_table.tsx} | 17 +++--- .../custom_link}/index.test.tsx | 2 +- .../custom_link}/index.tsx | 10 ++-- .../{CustomizeUI => customize_ui}/index.tsx | 2 +- .../app/correlations/error_correlations.tsx | 23 ++++---- .../components/app/correlations/index.tsx | 2 +- .../Distribution/index.stories.tsx | 0 .../Distribution/index.tsx | 0 .../detail_view}/ErrorTabs.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../exception_stacktrace.stories.tsx | 0 .../exception_stacktrace.test.tsx | 0 .../detail_view}/exception_stacktrace.tsx | 4 +- .../detail_view}/index.test.tsx | 0 .../detail_view}/index.tsx | 7 +-- .../index.tsx | 21 ++++--- .../error_group_overview/List/List.test.tsx | 20 ++++--- .../List/__snapshots__/List.test.tsx.snap | 8 +-- .../app/error_group_overview/List/index.tsx | 27 ++++----- .../app/error_group_overview/index.tsx | 2 +- .../app/service_inventory/index.tsx | 4 +- .../HealthBadge.tsx | 0 .../MLCallout.tsx | 0 .../ServiceListMetric.tsx | 0 .../__fixtures__/service_api_mock_data.ts | 0 .../{ServiceList => service_list}/index.tsx | 40 +++++++------ .../service_list.test.tsx | 0 .../service_map/Popover/Popover.stories.tsx | 2 +- .../Popover/ServiceStatsFetcher.tsx | 2 +- ...alyDetection.tsx => anomaly_detection.tsx} | 25 ++++----- .../Popover/service_stats_list.stories.tsx | 2 +- .../__stories__/Cytoscape.stories.tsx | 2 +- .../cytoscape_example_data.stories.tsx | 4 +- .../app/service_node_metrics/index.tsx | 8 +-- .../app/service_node_overview/index.tsx | 6 +- .../index.tsx | 14 ++--- .../get_column.tsx | 8 +-- .../get_columns.tsx | 14 ++--- .../instance_actions_menu/index.tsx | 5 +- .../intance_details.tsx | 5 +- .../get_columns.tsx | 10 ++-- .../service_profiling_flamegraph.tsx | 12 ++-- .../components/app/trace_overview/index.tsx | 2 +- .../{TraceList.tsx => trace_list.tsx} | 10 ++-- .../Distribution/index.tsx | 2 +- .../Waterfall/SpanFlyout/HttpContext.tsx | 51 ----------------- .../app/transaction_details/index.tsx | 4 +- .../use_waterfall_fetcher.ts | 2 +- .../ErrorCount.test.tsx | 0 .../ErrorCount.tsx | 0 .../MaybeViewTraceLink.tsx | 2 +- .../PercentOfParent.tsx | 0 .../TransactionTabs.tsx | 4 +- .../index.tsx | 6 +- .../Marks/get_agent_marks.test.ts | 0 .../Marks/get_agent_marks.ts | 0 .../Marks/get_error_marks.test.ts | 0 .../Marks/get_error_marks.ts | 0 .../waterfall_container}/Marks/index.ts | 0 .../Waterfall/FlyoutTopLevelProperties.tsx | 2 +- .../Waterfall/ResponsiveFlyout.tsx | 0 .../TransactionFlyout/DroppedSpansWarning.tsx | 0 .../Waterfall/TransactionFlyout/index.tsx | 2 +- .../Waterfall/WaterfallFlyout.tsx | 2 +- .../Waterfall/accordion_waterfall.tsx | 2 +- .../waterfall_container}/Waterfall/index.tsx | 0 .../span_flyout}/StickySpanProperties.tsx | 2 +- .../span_flyout/database_context.tsx} | 32 +++++------ .../Waterfall/span_flyout}/index.tsx | 21 ++++--- .../span_flyout/truncate_height_section.tsx} | 5 +- .../Waterfall/sync_badge.stories.tsx} | 2 +- .../Waterfall/sync_badge.tsx} | 3 +- .../waterfall_helpers.test.ts.snap | 0 .../mock_responses/spans.json | 0 .../mock_responses/transaction.json | 0 .../waterfall_helpers.test.ts | 0 .../waterfall_helpers/waterfall_helpers.ts | 0 .../Waterfall/waterfall_item.tsx} | 28 +++++----- .../WaterfallContainer.stories.tsx | 0 .../waterfall_container}/WaterfallLegends.tsx | 2 +- .../waterfall_container}/index.tsx | 0 .../waterfallContainer.stories.data.ts | 0 .../app/transaction_overview/index.tsx | 2 +- .../index.tsx | 6 +- .../transaction_list.stories.tsx} | 0 .../components/routing/apm_route_config.tsx | 8 +-- .../components/shared/Stacktrace/Context.tsx | 31 +++++----- .../shared/Stacktrace/Stackframe.tsx | 16 ++---- .../shared/Stacktrace/Variables.tsx | 7 ++- ...ace.test.tsx => cause_stacktrace.test.tsx} | 4 +- ...useStacktrace.tsx => cause_stacktrace.tsx} | 11 ++-- ...eading.test.tsx => frame_heading.test.tsx} | 2 +- .../{FrameHeading.tsx => frame_heading.tsx} | 7 +-- .../components/shared/Stacktrace/index.tsx | 2 +- ...e.test.tsx => library_stacktrace.test.tsx} | 2 +- ...yStacktrace.tsx => library_stacktrace.tsx} | 3 +- .../shared/Summary/DurationSummaryItem.tsx | 2 +- .../shared/Summary/TransactionSummary.tsx | 4 +- ...> error_count_summary_item_badge.test.tsx} | 2 +- ...tsx => error_count_summary_item_badge.tsx} | 4 +- .../http_info_summary_item.test.tsx} | 33 ++++++++--- .../index.tsx | 10 ++-- .../components/shared/Summary/index.tsx | 5 +- .../anomaly_detection_setup_link.tsx | 7 ++- ...st.tsx.snap => agent_marker.test.tsx.snap} | 0 .../Marker/__snapshots__/index.test.tsx.snap | 4 +- ...tMarker.test.tsx => agent_marker.test.tsx} | 4 +- .../{AgentMarker.tsx => agent_marker.tsx} | 11 ++-- ...rMarker.test.tsx => error_marker.test.tsx} | 4 +- .../{ErrorMarker.tsx => error_marker.tsx} | 19 +++---- .../charts/Timeline/Marker/index.test.tsx | 4 +- .../shared/charts/Timeline/Marker/index.tsx | 11 ++-- .../shared/charts/Timeline/VerticalLines.tsx | 2 +- .../shared/charts/Timeline/index.tsx | 6 +- .../{Legend/index.tsx => Timeline/legend.tsx} | 25 +++------ .../{TimelineAxis.tsx => timeline_axis.tsx} | 5 +- .../shared/charts/spark_plot/index.tsx | 13 ++--- .../shared/charts/timeseries_chart.tsx | 2 +- .../transaction_breakdown_chart_contents.tsx | 2 +- .../shared/key_value_filter_list/index.tsx | 4 +- .../Typeahead/ClickOutside.js | 0 .../Typeahead/Suggestion.js | 26 ++++----- .../Typeahead/Suggestions.js | 19 ++++--- .../Typeahead/index.js | 0 .../get_bool_filter.ts | 0 .../shared/{KueryBar => kuery_bar}/index.tsx | 0 .../use_processor_event.ts | 0 .../shared/{KueryBar => kuery_bar}/utils.ts | 0 .../managed_table.test.tsx.snap} | 4 +- .../{ManagedTable => managed_table}/index.tsx | 2 +- .../managed_table.test.tsx} | 46 +++++++-------- .../public/components/shared/search_bar.tsx | 5 +- .../shared/service_icons/icon_popover.tsx | 3 +- .../sticky_properties.test.tsx.snap} | 0 .../index.tsx | 14 ++--- .../sticky_properties.test.tsx} | 25 +-------- .../shared/time_comparison/index.tsx | 7 +-- .../TransactionActionMenu.test.tsx | 0 .../TransactionActionMenu.tsx | 2 +- .../__fixtures__/mockData.ts | 0 .../TransactionActionMenu.test.tsx.snap | 0 .../CustomLinkToolbar.test.tsx | 0 .../CustomLinkToolbar.tsx | 0 .../custom_link_list.test.tsx} | 8 +-- .../custom_link_list.tsx} | 6 +- .../custom_link_menu_section}/index.test.tsx | 0 .../custom_link_menu_section}/index.tsx | 29 +++++----- .../sections.test.ts | 0 .../sections.ts | 0 .../shared/truncate_with_tooltip/index.tsx | 2 +- x-pack/plugins/apm/public/style/variables.ts | 56 ------------------- x-pack/plugins/apm/public/utils/style.ts | 17 ++++++ 180 files changed, 482 insertions(+), 620 deletions(-) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/ServicePage/FormRowSelect.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/ServicePage/ServicePage.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/SettingsPage/SettingFormRow.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/SettingsPage/SettingsPage.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/SettingsPage/saveConfig.ts (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/index.stories.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/AgentConfigurationCreateEdit/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/List/ConfirmDeleteModal.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/List/index.tsx (96%) rename x-pack/plugins/apm/public/components/app/Settings/{AgentConfigurations => agent_configurations}/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink => customize_ui/custom_link}/CreateCustomLinkButton.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink => customize_ui/custom_link}/EmptyPrompt.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/DeleteButton.test.tsx (66%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/DeleteButton.tsx (93%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/Documentation.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/FiltersSection.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/FlyoutFooter.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/LinkSection.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/helper.test.ts (98%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/helper.ts (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/link_preview.stories.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/link_preview.test.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/link_preview.tsx (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CreateEditCustomLinkFlyout => customize_ui/custom_link/create_edit_custom_link_flyout}/saveCustomLink.ts (100%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink/CustomLinkTable.tsx => customize_ui/custom_link/custom_link_table.tsx} (95%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink => customize_ui/custom_link}/index.test.tsx (99%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI/CustomLink => customize_ui/custom_link}/index.tsx (96%) rename x-pack/plugins/apm/public/components/app/Settings/{CustomizeUI => customize_ui}/index.tsx (87%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails => error_group_details}/Distribution/index.stories.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails => error_group_details}/Distribution/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/ErrorTabs.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/exception_stacktrace.stories.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/exception_stacktrace.test.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/exception_stacktrace.tsx (94%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/index.test.tsx (100%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails/DetailView => error_group_details/detail_view}/index.tsx (96%) rename x-pack/plugins/apm/public/components/app/{ErrorGroupDetails => error_group_details}/index.tsx (92%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/HealthBadge.tsx (100%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/MLCallout.tsx (100%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/ServiceListMetric.tsx (100%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/__fixtures__/service_api_mock_data.ts (100%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/index.tsx (95%) rename x-pack/plugins/apm/public/components/app/service_inventory/{ServiceList => service_list}/service_list.test.tsx (100%) rename x-pack/plugins/apm/public/components/app/service_map/Popover/{AnomalyDetection.tsx => anomaly_detection.tsx} (96%) rename x-pack/plugins/apm/public/components/app/trace_overview/{TraceList.tsx => trace_list.tsx} (95%) delete mode 100644 x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/HttpContext.tsx rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/ErrorCount.test.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/ErrorCount.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/MaybeViewTraceLink.tsx (97%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/PercentOfParent.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/TransactionTabs.tsx (96%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary => waterfall_with_summary}/index.tsx (94%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Marks/get_agent_marks.test.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Marks/get_agent_marks.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Marks/get_error_marks.test.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Marks/get_error_marks.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Marks/index.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/FlyoutTopLevelProperties.tsx (97%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/ResponsiveFlyout.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/TransactionFlyout/DroppedSpansWarning.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/TransactionFlyout/index.tsx (98%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/WaterfallFlyout.tsx (97%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/accordion_waterfall.tsx (98%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout => waterfall_with_summary/waterfall_container/Waterfall/span_flyout}/StickySpanProperties.tsx (97%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/DatabaseContext.tsx => waterfall_with_summary/waterfall_container/Waterfall/span_flyout/database_context.tsx} (76%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout => waterfall_with_summary/waterfall_container/Waterfall/span_flyout}/index.tsx (96%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx => waterfall_with_summary/waterfall_container/Waterfall/span_flyout/truncate_height_section.tsx} (92%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.stories.tsx => waterfall_with_summary/waterfall_container/Waterfall/sync_badge.stories.tsx} (91%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.tsx => waterfall_with_summary/waterfall_container/Waterfall/sync_badge.tsx} (92%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/waterfall_helpers/__snapshots__/waterfall_helpers.test.ts.snap (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/waterfall_helpers/mock_responses/spans.json (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/waterfall_helpers/mock_responses/transaction.json (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/waterfall_helpers/waterfall_helpers.test.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/Waterfall/waterfall_helpers/waterfall_helpers.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx => waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx} (93%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/WaterfallContainer.stories.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/WaterfallLegends.tsx (95%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/index.tsx (100%) rename x-pack/plugins/apm/public/components/app/transaction_details/{WaterfallWithSummmary/WaterfallContainer => waterfall_with_summary/waterfall_container}/waterfallContainer.stories.data.ts (100%) rename x-pack/plugins/apm/public/components/app/transaction_overview/{TransactionList => transaction_list}/index.tsx (96%) rename x-pack/plugins/apm/public/components/app/transaction_overview/{TransactionList/TransactionList.stories.tsx => transaction_list/transaction_list.stories.tsx} (100%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{CauseStacktrace.test.tsx => cause_stacktrace.test.tsx} (96%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{CauseStacktrace.tsx => cause_stacktrace.tsx} (94%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{FrameHeading.test.tsx => frame_heading.test.tsx} (99%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{FrameHeading.tsx => frame_heading.tsx} (92%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{LibraryStacktrace.test.tsx => library_stacktrace.test.tsx} (95%) rename x-pack/plugins/apm/public/components/shared/Stacktrace/{LibraryStacktrace.tsx => library_stacktrace.tsx} (94%) rename x-pack/plugins/apm/public/components/shared/Summary/{ErrorCountSummaryItemBadge.test.tsx => error_count_summary_item_badge.test.tsx} (90%) rename x-pack/plugins/apm/public/components/shared/Summary/{ErrorCountSummaryItemBadge.tsx => error_count_summary_item_badge.tsx} (87%) rename x-pack/plugins/apm/public/components/shared/Summary/{HttpInfoSummaryItem/HttpInfoSummaryItem.test.tsx => http_info_summary_item/http_info_summary_item.test.tsx} (69%) rename x-pack/plugins/apm/public/components/shared/Summary/{HttpInfoSummaryItem => http_info_summary_item}/index.tsx (87%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/{AgentMarker.test.tsx.snap => agent_marker.test.tsx.snap} (100%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/{AgentMarker.test.tsx => agent_marker.test.tsx} (81%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/{AgentMarker.tsx => agent_marker.tsx} (80%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/{ErrorMarker.test.tsx => error_marker.test.tsx} (96%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/{ErrorMarker.tsx => error_marker.tsx} (88%) rename x-pack/plugins/apm/public/components/shared/charts/{Legend/index.tsx => Timeline/legend.tsx} (75%) rename x-pack/plugins/apm/public/components/shared/charts/Timeline/{TimelineAxis.tsx => timeline_axis.tsx} (97%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/Typeahead/ClickOutside.js (100%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/Typeahead/Suggestion.js (84%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/Typeahead/Suggestions.js (88%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/Typeahead/index.js (100%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/get_bool_filter.ts (100%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/index.tsx (100%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/use_processor_event.ts (100%) rename x-pack/plugins/apm/public/components/shared/{KueryBar => kuery_bar}/utils.ts (100%) rename x-pack/plugins/apm/public/components/shared/{ManagedTable/__snapshots__/ManagedTable.test.js.snap => managed_table/__snapshots__/managed_table.test.tsx.snap} (90%) rename x-pack/plugins/apm/public/components/shared/{ManagedTable => managed_table}/index.tsx (99%) rename x-pack/plugins/apm/public/components/shared/{ManagedTable/ManagedTable.test.js => managed_table/managed_table.test.tsx} (54%) rename x-pack/plugins/apm/public/components/shared/{StickyProperties/__snapshots__/StickyProperties.test.js.snap => sticky_properties/__snapshots__/sticky_properties.test.tsx.snap} (100%) rename x-pack/plugins/apm/public/components/shared/{StickyProperties => sticky_properties}/index.tsx (93%) rename x-pack/plugins/apm/public/components/shared/{StickyProperties/StickyProperties.test.js => sticky_properties/sticky_properties.test.tsx} (80%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/TransactionActionMenu.test.tsx (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/TransactionActionMenu.tsx (98%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/__fixtures__/mockData.ts (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/__snapshots__/TransactionActionMenu.test.tsx.snap (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection => transaction_action_menu/custom_link_menu_section}/CustomLinkToolbar.test.tsx (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection => transaction_action_menu/custom_link_menu_section}/CustomLinkToolbar.tsx (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.test.tsx => transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx} (96%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.tsx => transaction_action_menu/custom_link_menu_section/custom_link_list.tsx} (89%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection => transaction_action_menu/custom_link_menu_section}/index.test.tsx (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu/CustomLinkMenuSection => transaction_action_menu/custom_link_menu_section}/index.tsx (94%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/sections.test.ts (100%) rename x-pack/plugins/apm/public/components/shared/{TransactionActionMenu => transaction_action_menu}/sections.ts (100%) delete mode 100644 x-pack/plugins/apm/public/style/variables.ts create mode 100644 x-pack/plugins/apm/public/utils/style.ts diff --git a/x-pack/plugins/apm/kibana.json b/x-pack/plugins/apm/kibana.json index 21aef379715c7d..700e27ee7659d9 100644 --- a/x-pack/plugins/apm/kibana.json +++ b/x-pack/plugins/apm/kibana.json @@ -28,13 +28,7 @@ ], "server": true, "ui": true, - "configPath": [ - "xpack", - "apm" - ], - "extraPublicDirs": [ - "public/style/variables" - ], + "configPath": ["xpack", "apm"], "requiredBundles": [ "home", "kibanaReact", @@ -43,4 +37,4 @@ "ml", "observability" ] -} \ No newline at end of file +} diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx index d069d4a11b4942..16b8cc34e97527 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx @@ -17,7 +17,7 @@ import { import { MockUrlParamsContextProvider } from '../../../context/url_params_context/mock_url_params_context_provider'; export default { - title: 'app/TransactionDurationAlertTrigger', + title: 'alerting/TransactionDurationAlertTrigger', component: TransactionDurationAlertTrigger, decorators: [ (Story: ComponentType) => { @@ -26,7 +26,7 @@ export default { http: { get: (endpoint: string) => { if (endpoint === '/api/apm/environments') { - return Promise.resolve(['production']); + return Promise.resolve({ environments: ['production'] }); } else { return Promise.resolve({ transactionTypes: ['request'], diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/ServicePage/FormRowSelect.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/ServicePage/FormRowSelect.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/ServicePage/FormRowSelect.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/ServicePage/FormRowSelect.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/ServicePage/ServicePage.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/ServicePage/ServicePage.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/ServicePage/ServicePage.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/ServicePage/ServicePage.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/SettingFormRow.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/SettingFormRow.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/SettingFormRow.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/SettingFormRow.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/SettingsPage.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/SettingsPage.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/SettingsPage.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/SettingsPage.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/saveConfig.ts b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/saveConfig.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/SettingsPage/saveConfig.ts rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/SettingsPage/saveConfig.ts diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/index.stories.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/index.stories.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/AgentConfigurationCreateEdit/index.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/ConfirmDeleteModal.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/ConfirmDeleteModal.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx rename to x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx index c098be41968dd2..93ae8b270b5de1 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/AgentConfigurations/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx @@ -22,13 +22,12 @@ import { getOptionLabel } from '../../../../../../common/agent_configuration/all import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; import { FETCH_STATUS } from '../../../../../hooks/use_fetcher'; import { useTheme } from '../../../../../hooks/use_theme'; -import { px, units } from '../../../../../style/variables'; import { createAgentConfigurationHref, editAgentConfigurationHref, } from '../../../../shared/Links/apm/agentConfigurationLinks'; import { LoadingStatePrompt } from '../../../../shared/LoadingStatePrompt'; -import { ITableColumn, ManagedTable } from '../../../../shared/ManagedTable'; +import { ITableColumn, ManagedTable } from '../../../../shared/managed_table'; import { TimestampTooltip } from '../../../../shared/TimestampTooltip'; import { ConfirmDeleteModal } from './ConfirmDeleteModal'; @@ -125,7 +124,7 @@ export function AgentConfigurationList({ { field: 'applied_by_agent', align: 'center', - width: px(units.double), + width: theme.eui.euiSizeXL, name: '', sortable: true, render: (isApplied: boolean) => ( @@ -190,7 +189,7 @@ export function AgentConfigurationList({ ...(canSave ? [ { - width: px(units.double), + width: theme.eui.euiSizeXL, name: '', render: (config: Config) => ( ( { +function Wrapper({ children }: { children?: ReactNode }) { + return ( + + {children} + + ); +} + +describe('DeleteButton', () => { beforeAll(() => { jest.spyOn(apmApi, 'callApmApi').mockResolvedValue({}); }); + it('deletes a custom link', async () => { const onDeleteMock = jest.fn(); const { getByText } = render( - - - + , + { wrapper: Wrapper } ); + await act(async () => { fireEvent.click(getByText('Delete')); }); + expect(onDeleteMock).toHaveBeenCalledTimes(1); }); }); diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/DeleteButton.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/DeleteButton.tsx similarity index 93% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/DeleteButton.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/DeleteButton.tsx index eb6dfdd763ac4e..c6547aaff06710 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/DeleteButton.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/DeleteButton.tsx @@ -9,9 +9,9 @@ import { EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { NotificationsStart } from 'kibana/public'; import React, { useState } from 'react'; -import { px, unit } from '../../../../../../style/variables'; import { callApmApi } from '../../../../../../services/rest/createCallApmApi'; import { useApmPluginContext } from '../../../../../../context/apm_plugin/use_apm_plugin_context'; +import { useTheme } from '../../../../../../hooks/use_theme'; interface Props { onDelete: () => void; @@ -21,6 +21,7 @@ interface Props { export function DeleteButton({ onDelete, customLinkId }: Props) { const [isDeleting, setIsDeleting] = useState(false); const { toasts } = useApmPluginContext().core.notifications; + const theme = useTheme(); return ( {i18n.translate('xpack.apm.settings.customizeUI.customLink.delete', { defaultMessage: 'Delete', diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/Documentation.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/Documentation.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/Documentation.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/Documentation.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/FiltersSection.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/FiltersSection.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/FiltersSection.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/FiltersSection.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/FlyoutFooter.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/FlyoutFooter.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/FlyoutFooter.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/FlyoutFooter.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/LinkSection.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/LinkSection.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/LinkSection.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/LinkSection.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper.test.ts b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts similarity index 98% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper.test.ts rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts index c4420f3a59c813..449968b82943fa 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper.test.ts +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts @@ -8,7 +8,7 @@ import { getSelectOptions, replaceTemplateVariables, -} from '../CreateEditCustomLinkFlyout/helper'; +} from '../create_edit_custom_link_flyout/helper'; import { Transaction } from '../../../../../../../typings/es_schemas/ui/transaction'; describe('Custom link helper', () => { diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper.ts b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper.ts rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.ts diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/index.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/index.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.stories.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.stories.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.test.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/link_preview.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.tsx diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/saveCustomLink.ts b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/saveCustomLink.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/saveCustomLink.ts rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/saveCustomLink.ts diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/custom_link_table.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/custom_link_table.tsx index bb948ea665b1e7..9593802407193d 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkTable.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/custom_link_table.tsx @@ -5,22 +5,21 @@ * 2.0. */ -import React, { useState } from 'react'; -import { i18n } from '@kbn/i18n'; import { EuiFieldSearch, EuiFlexGroup, EuiFlexItem, - EuiText, EuiSpacer, + EuiText, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; -import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; +import React, { useState } from 'react'; import { CustomLink } from '../../../../../../common/custom_link/custom_link_types'; -import { units, px } from '../../../../../style/variables'; -import { ManagedTable } from '../../../../shared/ManagedTable'; -import { TimestampTooltip } from '../../../../shared/TimestampTooltip'; +import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; import { LoadingStatePrompt } from '../../../../shared/LoadingStatePrompt'; +import { ManagedTable } from '../../../../shared/managed_table'; +import { TimestampTooltip } from '../../../../shared/TimestampTooltip'; interface Props { items: CustomLink[]; @@ -50,7 +49,7 @@ export function CustomLinkTable({ items = [], onCustomLinkSelected }: Props) { truncateText: true, }, { - width: px(160), + width: 160, align: 'right', field: '@timestamp', name: i18n.translate( @@ -63,7 +62,7 @@ export function CustomLinkTable({ items = [], onCustomLinkSelected }: Props) { ), }, { - width: px(units.triple), + width: '48px', name: '', actions: [ ...(canSave diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx similarity index 99% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx index 7d119b8c406da2..22fbfb04734bae 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx @@ -22,7 +22,7 @@ import { expectTextsInDocument, expectTextsNotInDocument, } from '../../../../../utils/testHelpers'; -import * as saveCustomLink from './CreateEditCustomLinkFlyout/saveCustomLink'; +import * as saveCustomLink from './create_edit_custom_link_flyout/saveCustomLink'; const data = { customLinks: [ diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.tsx index c1315f165abdb2..beea1d8276846c 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.tsx @@ -8,21 +8,21 @@ import { EuiFlexGroup, EuiFlexItem, - EuiTitle, - EuiText, EuiSpacer, + EuiText, + EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; import React, { useEffect, useState } from 'react'; import { INVALID_LICENSE } from '../../../../../../common/custom_link'; import { CustomLink } from '../../../../../../common/custom_link/custom_link_types'; -import { FETCH_STATUS, useFetcher } from '../../../../../hooks/use_fetcher'; import { useLicenseContext } from '../../../../../context/license/use_license_context'; +import { FETCH_STATUS, useFetcher } from '../../../../../hooks/use_fetcher'; import { LicensePrompt } from '../../../../shared/license_prompt'; import { CreateCustomLinkButton } from './CreateCustomLinkButton'; -import { CreateEditCustomLinkFlyout } from './CreateEditCustomLinkFlyout'; -import { CustomLinkTable } from './CustomLinkTable'; +import { CreateEditCustomLinkFlyout } from './create_edit_custom_link_flyout'; +import { CustomLinkTable } from './custom_link_table'; import { EmptyPrompt } from './EmptyPrompt'; export function CustomLinkOverview() { diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/index.tsx similarity index 87% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx rename to x-pack/plugins/apm/public/components/app/Settings/customize_ui/index.tsx index 9ce1f1325bb2c4..9d3ee3fa47c1ac 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/index.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { CustomLinkOverview } from './CustomLink'; +import { CustomLinkOverview } from './custom_link'; export function CustomizeUI() { return ; diff --git a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx index 526aad56e743ec..f0d7f8d60eb6ca 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/error_correlations.tsx @@ -6,33 +6,32 @@ */ import { - ScaleType, - Chart, - LineSeries, Axis, + Chart, CurveType, + LineSeries, Position, - timeFormatter, + ScaleType, Settings, + timeFormatter, } from '@elastic/charts'; +import { EuiFlexGroup, EuiFlexItem, EuiText, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React, { useState } from 'react'; import { useParams } from 'react-router-dom'; -import { EuiTitle, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; +import { useUiTracker } from '../../../../../observability/public'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; +import { useLocalStorage } from '../../../hooks/useLocalStorage'; import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; +import { useTheme } from '../../../hooks/use_theme'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; -import { px } from '../../../style/variables'; +import { ChartContainer } from '../../shared/charts/chart_container'; import { CorrelationsTable, SelectedSignificantTerm, } from './correlations_table'; -import { ChartContainer } from '../../shared/charts/chart_container'; -import { useTheme } from '../../../hooks/use_theme'; import { CustomFields } from './custom_fields'; import { useFieldNames } from './use_field_names'; -import { useLocalStorage } from '../../../hooks/useLocalStorage'; -import { useUiTracker } from '../../../../../observability/public'; type OverallErrorsApiResponse = NonNullable< APIReturnType<'GET /api/apm/correlations/errors/overall_timeseries'> @@ -221,7 +220,7 @@ function ErrorTimeseriesChart({ return ( - + theme.eui.euiSize}; `; const TransactionLinkName = euiStyled.div` - margin-left: ${px(units.half)}; + margin-left: ${({ theme }) => theme.eui.euiSizeS}; display: inline-block; vertical-align: middle; `; diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx similarity index 92% rename from x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx rename to x-pack/plugins/apm/public/components/app/error_group_details/index.tsx index 3d22c3863c1007..344393d42506fe 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupDetails/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/index.tsx @@ -19,32 +19,31 @@ import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { useTrackPageview } from '../../../../../observability/public'; import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; -import { useFetcher } from '../../../hooks/use_fetcher'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; -import { fontFamilyCode, fontSizes, px, units } from '../../../style/variables'; -import { DetailView } from './DetailView'; -import { ErrorDistribution } from './Distribution'; import { useErrorGroupDistributionFetcher } from '../../../hooks/use_error_group_distribution_fetcher'; +import { useFetcher } from '../../../hooks/use_fetcher'; +import { DetailView } from './detail_view'; +import { ErrorDistribution } from './Distribution'; const Titles = euiStyled.div` - margin-bottom: ${px(units.plus)}; + margin-bottom: ${({ theme }) => theme.eui.euiSizeL}; `; const Label = euiStyled.div` - margin-bottom: ${px(units.quarter)}; - font-size: ${fontSizes.small}; + margin-bottom: ${({ theme }) => theme.eui.euiSizeXS}; + font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; color: ${({ theme }) => theme.eui.euiColorDarkShade}; `; const Message = euiStyled.div` - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; font-weight: bold; - font-size: ${fontSizes.large}; - margin-bottom: ${px(units.half)}; + font-size: ${({ theme }) => theme.eui.euiFontSizeM}; + margin-bottom: ${({ theme }) => theme.eui.euiSizeS}; `; const Culprit = euiStyled.div` - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; function getShortGroupId(errorGroupId?: string) { diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/List.test.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/List/List.test.tsx index e368230fbc77e4..a2a92b7e16f8ea 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/List/List.test.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/List/List.test.tsx @@ -13,6 +13,7 @@ import { mockMoment, toJson } from '../../../../utils/testHelpers'; import { ErrorGroupList } from './index'; import props from './__fixtures__/props.json'; import { MemoryRouter } from 'react-router-dom'; +import { EuiThemeProvider } from '../../../../../../../../src/plugins/kibana_react/common'; jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => { return { @@ -41,13 +42,18 @@ describe('ErrorGroupOverview -> List', () => { it('should render with data', () => { const wrapper = mount( - - - - - - - + + + + + + + + + ); expect(toJson(wrapper)).toMatchSnapshot(); diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap index 92337a97573e45..2b85d6bb3c229c 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/List/__snapshots__/List.test.tsx.snap @@ -268,7 +268,7 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` exports[`ErrorGroupOverview -> List should render with data 1`] = ` .c0 { - font-family: "Roboto Mono",Consolas,Menlo,Courier,monospace; + font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; } .c2 { @@ -286,8 +286,8 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } .c3 { - font-family: "Roboto Mono",Consolas,Menlo,Courier,monospace; - font-size: 16px; + font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; + font-size: 18px; max-width: 100%; white-space: nowrap; overflow: hidden; @@ -295,7 +295,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } .c4 { - font-family: "Roboto Mono",Consolas,Menlo,Courier,monospace; + font-family: 'Roboto Mono','Consolas','Menlo','Courier',monospace; }
theme.eui.euiCodeFontFamily}; `; const MessageAndCulpritCell = euiStyled.div` @@ -40,13 +33,13 @@ const ErrorLink = euiStyled(ErrorOverviewLink)` `; const MessageLink = euiStyled(ErrorDetailLink)` - font-family: ${fontFamilyCode}; - font-size: ${fontSizes.large}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; + font-size: ${({ theme }) => theme.eui.euiFontSizeM}; ${truncate('100%')}; `; const Culprit = euiStyled.div` - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; type ErrorGroupItem = APIReturnType<'GET /api/apm/services/{serviceName}/errors'>['errorGroups'][0]; @@ -86,7 +79,7 @@ function ErrorGroupList({ items, serviceName }: Props) { ), field: 'groupId', sortable: false, - width: px(unit * 6), + width: unit * 6, render: (groupId: string) => { return ( diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx index 886ef8412f35b9..4c622758e6c8bf 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx @@ -18,7 +18,7 @@ import { useTrackPageview } from '../../../../../observability/public'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { useErrorGroupDistributionFetcher } from '../../../hooks/use_error_group_distribution_fetcher'; import { useFetcher } from '../../../hooks/use_fetcher'; -import { ErrorDistribution } from '../ErrorGroupDetails/Distribution'; +import { ErrorDistribution } from '../error_group_details/Distribution'; import { ErrorGroupList } from './List'; interface ErrorGroupOverviewProps { diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index e4a0ef3ef09f1b..cac94885511c10 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -18,8 +18,8 @@ import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { useUpgradeAssistantHref } from '../../shared/Links/kibana'; import { SearchBar } from '../../shared/search_bar'; import { NoServicesMessage } from './no_services_message'; -import { ServiceList } from './ServiceList'; -import { MLCallout } from './ServiceList/MLCallout'; +import { ServiceList } from './service_list'; +import { MLCallout } from './service_list/MLCallout'; const initialData = { items: [], diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/HealthBadge.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/HealthBadge.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/HealthBadge.tsx rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/HealthBadge.tsx diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/MLCallout.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/MLCallout.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/MLCallout.tsx rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/MLCallout.tsx diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/ServiceListMetric.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/ServiceListMetric.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/ServiceListMetric.tsx rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/ServiceListMetric.tsx diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/__fixtures__/service_api_mock_data.ts b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/__fixtures__/service_api_mock_data.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/__fixtures__/service_api_mock_data.ts rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/__fixtures__/service_api_mock_data.ts diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/index.tsx rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx index 6c40639594adf5..b4644068fd782a 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx @@ -5,31 +5,35 @@ * 2.0. */ -import { EuiFlexItem, EuiFlexGroup, EuiToolTip } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiText, + EuiToolTip, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { orderBy } from 'lodash'; import React, { useMemo } from 'react'; import { ValuesType } from 'utility-types'; -import { orderBy } from 'lodash'; -import { EuiIcon } from '@elastic/eui'; -import { EuiText } from '@elastic/eui'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; +import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; +import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { TRANSACTION_PAGE_LOAD, TRANSACTION_REQUEST, } from '../../../../../common/transaction_types'; -import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { ServiceHealthStatus } from '../../../../../common/service_health_status'; import { - asPercent, asMillisecondDuration, + asPercent, asTransactionRate, } from '../../../../../common/utils/formatters'; -import { NOT_AVAILABLE_LABEL } from '../../../../../common/i18n'; -import { fontSizes, px, truncate, unit } from '../../../../style/variables'; -import { ManagedTable, ITableColumn } from '../../../shared/ManagedTable'; +import { APIReturnType } from '../../../../services/rest/createCallApmApi'; +import { truncate, unit } from '../../../../utils/style'; +import { AgentIcon } from '../../../shared/agent_icon'; import { EnvironmentBadge } from '../../../shared/EnvironmentBadge'; import { ServiceOrTransactionsOverviewLink } from '../../../shared/Links/apm/service_transactions_overview_link'; -import { AgentIcon } from '../../../shared/agent_icon'; +import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; import { HealthBadge } from './HealthBadge'; import { ServiceListMetric } from './ServiceListMetric'; @@ -47,7 +51,7 @@ function formatString(value?: string | null) { } const AppLink = euiStyled(ServiceOrTransactionsOverviewLink)` - font-size: ${fontSizes.large}; + font-size: ${({ theme }) => theme.eui.euiFontSizeM} ${truncate('100%')}; `; @@ -80,7 +84,7 @@ export function getServiceColumns({ name: i18n.translate('xpack.apm.servicesTable.healthColumnLabel', { defaultMessage: 'Health', }), - width: px(unit * 6), + width: unit * 6, sortable: true, render: (_, { healthStatus }) => { return ( @@ -130,7 +134,7 @@ export function getServiceColumns({ name: i18n.translate('xpack.apm.servicesTable.environmentColumnLabel', { defaultMessage: 'Environment', }), - width: px(unit * 10), + width: unit * 10, sortable: true, render: (_, { environments }) => ( @@ -144,7 +148,7 @@ export function getServiceColumns({ 'xpack.apm.servicesTable.transactionColumnLabel', { defaultMessage: 'Transaction type' } ), - width: px(unit * 10), + width: unit * 10, sortable: true, }, ] @@ -164,7 +168,7 @@ export function getServiceColumns({ /> ), align: 'left', - width: px(unit * 10), + width: unit * 10, }, { field: 'transactionsPerMinute', @@ -181,7 +185,7 @@ export function getServiceColumns({ /> ), align: 'left', - width: px(unit * 10), + width: unit * 10, }, { field: 'transactionErrorRate', @@ -204,7 +208,7 @@ export function getServiceColumns({ ); }, align: 'left', - width: px(unit * 10), + width: unit * 10, }, ]; } diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/service_list.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/service_inventory/ServiceList/service_list.test.tsx rename to x-pack/plugins/apm/public/components/app/service_inventory/service_list/service_list.test.tsx diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx index fe3922060533a9..6b7626514d03fb 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx @@ -17,7 +17,7 @@ import { Popover } from '.'; import exampleGroupedConnectionsData from '../__stories__/example_grouped_connections.json'; export default { - title: 'app/service_map/Popover', + title: 'app/ServiceMap/Popover', component: Popover, decorators: [ (Story: ComponentType) => { diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/ServiceStatsFetcher.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/ServiceStatsFetcher.tsx index a71f299ab296c8..3155a65b06aca9 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/ServiceStatsFetcher.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/ServiceStatsFetcher.tsx @@ -18,7 +18,7 @@ import { ServiceNodeStats } from '../../../../../common/service_map'; import { ServiceStatsList } from './ServiceStatsList'; import { useFetcher, FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; -import { AnomalyDetection } from './AnomalyDetection'; +import { AnomalyDetection } from './anomaly_detection'; import { ServiceAnomalyStats } from '../../../../../common/anomaly_detection'; interface ServiceStatsFetcherProps { diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/AnomalyDetection.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/anomaly_detection.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/app/service_map/Popover/AnomalyDetection.tsx rename to x-pack/plugins/apm/public/components/app/service_map/Popover/anomaly_detection.tsx index c98116a69da667..1ceb90ff838ad1 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/AnomalyDetection.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/anomaly_detection.tsx @@ -5,30 +5,29 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -import React from 'react'; import { EuiFlexGroup, EuiFlexItem, - EuiTitle, - EuiIconTip, EuiHealth, + EuiIconTip, + EuiTitle, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; +import { + getSeverity, + ServiceAnomalyStats, +} from '../../../../../common/anomaly_detection'; import { getServiceHealthStatus, getServiceHealthStatusColor, } from '../../../../../common/service_health_status'; +import { TRANSACTION_REQUEST } from '../../../../../common/transaction_types'; +import { asDuration, asInteger } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; -import { fontSize, px } from '../../../../style/variables'; -import { asInteger, asDuration } from '../../../../../common/utils/formatters'; import { MLSingleMetricLink } from '../../../shared/Links/MachineLearningLinks/MLSingleMetricLink'; import { popoverWidth } from '../cytoscape_options'; -import { TRANSACTION_REQUEST } from '../../../../../common/transaction_types'; -import { - getSeverity, - ServiceAnomalyStats, -} from '../../../../../common/anomaly_detection'; const HealthStatusTitle = euiStyled(EuiTitle)` display: inline; @@ -47,8 +46,8 @@ const SubduedText = euiStyled.span` const EnableText = euiStyled.section` color: ${({ theme }) => theme.eui.euiTextSubduedColor}; line-height: 1.4; - font-size: ${fontSize}; - width: ${px(popoverWidth)}; + font-size: ${({ theme }) => theme.eui.euiFontSizeS}; + width: ${popoverWidth}px; `; export const ContentLine = euiStyled.section` diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/service_stats_list.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/service_stats_list.stories.tsx index 83f0a3ea7e4b9e..a8f004a7295d90 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/service_stats_list.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/service_stats_list.stories.tsx @@ -10,7 +10,7 @@ import { EuiThemeProvider } from '../../../../../../../../src/plugins/kibana_rea import { ServiceStatsList } from './ServiceStatsList'; export default { - title: 'app/service_map/Popover/ServiceStatsList', + title: 'app/ServiceMap/Popover/ServiceStatsList', component: ServiceStatsList, decorators: [ (Story: ComponentType) => ( diff --git a/x-pack/plugins/apm/public/components/app/service_map/__stories__/Cytoscape.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/__stories__/Cytoscape.stories.tsx index dbab10d7b93b60..8bc0d7239e9c52 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/__stories__/Cytoscape.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/__stories__/Cytoscape.stories.tsx @@ -12,7 +12,7 @@ import { Cytoscape } from '../Cytoscape'; import { Centerer } from './centerer'; export default { - title: 'app/service_map/Cytoscape', + title: 'app/ServiceMap/Cytoscape', component: Cytoscape, decorators: [ (Story: ComponentType) => ( diff --git a/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx index 84351d5716edb2..45de632a152d41 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx @@ -25,7 +25,7 @@ import exampleResponseOpbeansBeats from './example_response_opbeans_beats.json'; import exampleResponseTodo from './example_response_todo.json'; import { generateServiceMapElements } from './generate_service_map_elements'; -const STORYBOOK_PATH = 'app/service_map/Cytoscape/Example data'; +const STORYBOOK_PATH = 'app/ServiceMap/Example data'; const SESSION_STORAGE_KEY = `${STORYBOOK_PATH}/pre-loaded map`; function getSessionJson() { @@ -40,7 +40,7 @@ function getHeight() { } export default { - title: 'app/service_map/Cytoscape/Example data', + title: 'app/ServiceMap/Example data', component: Cytoscape, decorators: [ (Story: ComponentType) => ( diff --git a/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx b/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx index a147528d42caec..07afcbc9c4682f 100644 --- a/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_node_metrics/index.tsx @@ -20,12 +20,12 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { SERVICE_NODE_NAME_MISSING } from '../../../../common/service_nodes'; +import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; +import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { useServiceMetricChartsFetcher } from '../../../hooks/use_service_metric_charts_fetcher'; -import { useUrlParams } from '../../../context/url_params_context/use_url_params'; -import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; -import { px, truncate, unit } from '../../../style/variables'; +import { truncate, unit } from '../../../utils/style'; import { MetricsChart } from '../../shared/charts/metrics_chart'; import { ElasticDocsLink } from '../../shared/Links/ElasticDocsLink'; @@ -36,7 +36,7 @@ const INITIAL_DATA = { const Truncate = euiStyled.span` display: block; - ${truncate(px(unit * 12))} + ${truncate(unit * 12)} `; interface ServiceNodeMetricsProps { diff --git a/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx b/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx index 1a432f90f1e3a4..58541e2c5501b5 100644 --- a/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_node_overview/index.tsx @@ -19,16 +19,16 @@ import { } from '../../../../common/utils/formatters'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { useFetcher } from '../../../hooks/use_fetcher'; -import { px, truncate, unit } from '../../../style/variables'; +import { truncate, unit } from '../../../utils/style'; import { ServiceNodeMetricOverviewLink } from '../../shared/Links/apm/ServiceNodeMetricOverviewLink'; -import { ITableColumn, ManagedTable } from '../../shared/ManagedTable'; +import { ITableColumn, ManagedTable } from '../../shared/managed_table'; const INITIAL_PAGE_SIZE = 25; const INITIAL_SORT_FIELD = 'cpu'; const INITIAL_SORT_DIRECTION = 'desc'; const ServiceNodeName = euiStyled.div` - ${truncate(px(8 * unit))} + ${truncate(8 * unit)} `; interface ServiceNodeOverviewProps { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_dependencies_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_dependencies_table/index.tsx index b1a4d5ca5fda78..0067558865bd6d 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_dependencies_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_dependencies_table/index.tsx @@ -15,19 +15,19 @@ import { import { i18n } from '@kbn/i18n'; import { keyBy } from 'lodash'; import React from 'react'; -import { offsetPreviousPeriodCoordinates } from '../../../../../common/utils/offset_previous_period_coordinate'; -import { Coordinate } from '../../../../../typings/timeseries'; import { getNextEnvironmentUrlParam } from '../../../../../common/environment_filter_values'; import { asMillisecondDuration, asPercent, asTransactionRate, } from '../../../../../common/utils/formatters'; +import { offsetPreviousPeriodCoordinates } from '../../../../../common/utils/offset_previous_period_coordinate'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ServiceDependencyItem } from '../../../../../server/lib/services/get_service_dependencies'; +import { Coordinate } from '../../../../../typings/timeseries'; import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { px, unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { AgentIcon } from '../../../shared/agent_icon'; import { SparkPlot } from '../../../shared/charts/spark_plot'; import { ImpactBar } from '../../../shared/ImpactBar'; @@ -156,7 +156,7 @@ export function ServiceOverviewDependenciesTable({ serviceName }: Props) { defaultMessage: 'Latency (avg.)', } ), - width: px(unit * 10), + width: `${unit * 10}px`, render: (_, { latency }) => { return ( { return ( { return ( { return ( diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx index 4ad83f7d87426c..b458f6147b3f11 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_column.tsx @@ -9,12 +9,12 @@ import { EuiBasicTableColumn } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { asInteger } from '../../../../../common/utils/formatters'; -import { px, unit } from '../../../../style/variables'; +import { APIReturnType } from '../../../../services/rest/createCallApmApi'; +import { unit } from '../../../../utils/style'; import { SparkPlot } from '../../../shared/charts/spark_plot'; import { ErrorDetailLink } from '../../../shared/Links/apm/ErrorDetailLink'; import { TimestampTooltip } from '../../../shared/TimestampTooltip'; import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; -import { APIReturnType } from '../../../../services/rest/createCallApmApi'; type ErrorGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; type ErrorGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; @@ -61,7 +61,7 @@ export function getColumns({ render: (_, { last_seen: lastSeen }) => { return ; }, - width: px(unit * 9), + width: `${unit * 9}px`, }, { field: 'occurrences', @@ -71,7 +71,7 @@ export function getColumns({ defaultMessage: 'Occurrences', } ), - width: px(unit * 12), + width: `${unit * 12}px`, render: (_, { occurrences, group_id: errorGroupId }) => { const currentPeriodTimeseries = errorGroupDetailedStatistics?.currentPeriod?.[errorGroupId] diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx index a92efff1039104..f9600b9d7f4183 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx @@ -25,14 +25,14 @@ import { asTransactionRate, } from '../../../../../common/utils/formatters'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { px, unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { SparkPlot } from '../../../shared/charts/spark_plot'; import { MetricOverviewLink } from '../../../shared/Links/apm/MetricOverviewLink'; import { ServiceNodeMetricOverviewLink } from '../../../shared/Links/apm/ServiceNodeMetricOverviewLink'; import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; import { getLatencyColumnLabel } from '../get_latency_column_label'; -import { InstanceActionsMenu } from './instance_actions_menu'; import { MainStatsServiceInstanceItem } from '../service_overview_instances_chart_and_table'; +import { InstanceActionsMenu } from './instance_actions_menu'; type ServiceInstanceDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; @@ -98,7 +98,7 @@ export function getColumns({ { field: 'latency', name: getLatencyColumnLabel(latencyAggregationType), - width: px(unit * 10), + width: `${unit * 10}px`, render: (_, { serviceNodeName, latency }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.latency; @@ -123,7 +123,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.instancesTableColumnThroughput', { defaultMessage: 'Throughput' } ), - width: px(unit * 10), + width: `${unit * 10}px`, render: (_, { serviceNodeName, throughput }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.throughput; @@ -149,7 +149,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.instancesTableColumnErrorRate', { defaultMessage: 'Error rate' } ), - width: px(unit * 8), + width: `${unit * 8}px`, render: (_, { serviceNodeName, errorRate }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.errorRate; @@ -175,7 +175,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.instancesTableColumnCpuUsage', { defaultMessage: 'CPU usage (avg.)' } ), - width: px(unit * 8), + width: `${unit * 8}px`, render: (_, { serviceNodeName, cpuUsage }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.cpuUsage; @@ -201,7 +201,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.instancesTableColumnMemoryUsage', { defaultMessage: 'Memory usage (avg.)' } ), - width: px(unit * 9), + width: `${unit * 9}px`, render: (_, { serviceNodeName, memoryUsage }) => { const currentPeriodTimestamp = detailedStatsData?.currentPeriod?.[serviceNodeName]?.memoryUsage; diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/index.tsx index f03c2b2fc9091a..a2aaa61e8a6614 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/index.tsx @@ -20,8 +20,7 @@ import { SERVICE_NODE_NAME } from '../../../../../../common/elasticsearch_fieldn import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; import { useUrlParams } from '../../../../../context/url_params_context/use_url_params'; import { FETCH_STATUS } from '../../../../../hooks/use_fetcher'; -import { px } from '../../../../../style/variables'; -import { pushNewItemToKueryBar } from '../../../../shared/KueryBar/utils'; +import { pushNewItemToKueryBar } from '../../../../shared/kuery_bar/utils'; import { useMetricOverviewHref } from '../../../../shared/Links/apm/MetricOverviewLink'; import { useServiceNodeMetricOverviewHref } from '../../../../shared/Links/apm/ServiceNodeMetricOverviewLink'; import { useInstanceDetailsFetcher } from '../use_instance_details_fetcher'; @@ -33,7 +32,7 @@ interface Props { onClose: () => void; } -const POPOVER_WIDTH = px(305); +const POPOVER_WIDTH = '305px'; export function InstanceActionsMenu({ serviceName, diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx index 35cecc49e293b7..0c77051bea293e 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx @@ -28,10 +28,9 @@ import { useUrlParams } from '../../../../context/url_params_context/use_url_par import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { useTheme } from '../../../../hooks/use_theme'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { pct } from '../../../../style/variables'; import { getAgentIcon } from '../../../shared/agent_icon/get_agent_icon'; import { KeyValueFilterList } from '../../../shared/key_value_filter_list'; -import { pushNewItemToKueryBar } from '../../../shared/KueryBar/utils'; +import { pushNewItemToKueryBar } from '../../../shared/kuery_bar/utils'; import { getCloudIcon, getContainerIcon } from '../../../shared/service_icons'; import { useInstanceDetailsFetcher } from './use_instance_details_fetcher'; @@ -78,7 +77,7 @@ export function InstanceDetails({ serviceName, serviceNodeName }: Props) { status === FETCH_STATUS.NOT_INITIATED ) { return ( -
+
); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/get_columns.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/get_columns.tsx index 9ac1c7d64d8b23..2e46e23ccaa42e 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_transactions_table/get_columns.tsx @@ -16,7 +16,7 @@ import { asTransactionRate, } from '../../../../../common/utils/formatters'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { px, unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { SparkPlot } from '../../../shared/charts/spark_plot'; import { ImpactBar } from '../../../shared/ImpactBar'; import { TransactionDetailLink } from '../../../shared/Links/apm/transaction_detail_link'; @@ -71,7 +71,7 @@ export function getColumns({ field: 'latency', sortable: true, name: getLatencyColumnLabel(latencyAggregationType), - width: px(unit * 10), + width: `${unit * 10}px`, render: (_, { latency, name }) => { const currentTimeseries = transactionGroupDetailedStatistics?.currentPeriod?.[name]?.latency; @@ -97,7 +97,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.transactionsTableColumnThroughput', { defaultMessage: 'Throughput' } ), - width: px(unit * 10), + width: `${unit * 10}px`, render: (_, { throughput, name }) => { const currentTimeseries = transactionGroupDetailedStatistics?.currentPeriod?.[name]?.throughput; @@ -124,7 +124,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.transactionsTableColumnErrorRate', { defaultMessage: 'Error rate' } ), - width: px(unit * 8), + width: `${unit * 8}px`, render: (_, { errorRate, name }) => { const currentTimeseries = transactionGroupDetailedStatistics?.currentPeriod?.[name]?.errorRate; @@ -150,7 +150,7 @@ export function getColumns({ 'xpack.apm.serviceOverview.transactionsTableColumnImpact', { defaultMessage: 'Impact' } ), - width: px(unit * 5), + width: `${unit * 5}px`, render: (_, { name }) => { const currentImpact = transactionGroupDetailedStatistics?.currentPeriod?.[name]?.impact ?? diff --git a/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx b/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx index 1adf58d0394c60..82ac3a04f63f14 100644 --- a/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx +++ b/x-pack/plugins/apm/public/components/app/service_profiling/service_profiling_flamegraph.tsx @@ -13,16 +13,16 @@ import { Settings, TooltipInfo, } from '@elastic/charts'; -import { EuiInMemoryTable } from '@elastic/eui'; -import { EuiFieldText } from '@elastic/eui'; -import { EuiToolTip } from '@elastic/eui'; import { EuiCheckbox, + EuiFieldText, EuiFlexGroup, EuiFlexItem, EuiIcon, + EuiInMemoryTable, euiPaletteForTemperature, EuiText, + EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { find, sumBy } from 'lodash'; @@ -44,7 +44,7 @@ import { } from '../../../../common/utils/formatters'; import { useFetcher } from '../../../hooks/use_fetcher'; import { useTheme } from '../../../hooks/use_theme'; -import { px, unit } from '../../../style/variables'; +import { unit } from '../../../utils/style'; const colors = euiPaletteForTemperature(100).slice(50, 85); @@ -335,7 +335,7 @@ export function ServiceProfilingFlamegraph({ /> - + formatValue(item.value, valueUnit), - width: px(unit * 6), + width: `${unit * 6}px`, }, ]} /> diff --git a/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx b/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx index bf60463255d64c..d280b36a603bab 100644 --- a/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/trace_overview/index.tsx @@ -11,7 +11,7 @@ import { useUrlParams } from '../../../context/url_params_context/use_url_params import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; import { SearchBar } from '../../shared/search_bar'; -import { TraceList } from './TraceList'; +import { TraceList } from './trace_list'; type TracesAPIResponse = APIReturnType<'GET /api/apm/traces'>; const DEFAULT_RESPONSE: TracesAPIResponse = { diff --git a/x-pack/plugins/apm/public/components/app/trace_overview/TraceList.tsx b/x-pack/plugins/apm/public/components/app/trace_overview/trace_list.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/app/trace_overview/TraceList.tsx rename to x-pack/plugins/apm/public/components/app/trace_overview/trace_list.tsx index 774333c35b479e..f1c8df553abf71 100644 --- a/x-pack/plugins/apm/public/components/app/trace_overview/TraceList.tsx +++ b/x-pack/plugins/apm/public/components/app/trace_overview/trace_list.tsx @@ -13,18 +13,18 @@ import { asMillisecondDuration, asTransactionRate, } from '../../../../common/utils/formatters'; -import { fontSizes, truncate } from '../../../style/variables'; +import { APIReturnType } from '../../../services/rest/createCallApmApi'; +import { truncate } from '../../../utils/style'; import { EmptyMessage } from '../../shared/EmptyMessage'; import { ImpactBar } from '../../shared/ImpactBar'; -import { ITableColumn, ManagedTable } from '../../shared/ManagedTable'; -import { LoadingStatePrompt } from '../../shared/LoadingStatePrompt'; import { TransactionDetailLink } from '../../shared/Links/apm/transaction_detail_link'; -import { APIReturnType } from '../../../services/rest/createCallApmApi'; +import { LoadingStatePrompt } from '../../shared/LoadingStatePrompt'; +import { ITableColumn, ManagedTable } from '../../shared/managed_table'; type TraceGroup = APIReturnType<'GET /api/apm/traces'>['items'][0]; const StyledTransactionLink = euiStyled(TransactionDetailLink)` - font-size: ${fontSizes.large}; + font-size: ${({ theme }) => theme.eui.euiFontSizeM}; ${truncate('100%')}; `; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/Distribution/index.tsx index c7dae6ce3d1d43..f59b3ddab7c055 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/Distribution/index.tsx @@ -29,7 +29,7 @@ import type { IUrlParams } from '../../../../context/url_params_context/types'; import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { useTheme } from '../../../../hooks/use_theme'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -import { unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { ChartContainer } from '../../../shared/charts/chart_container'; import { EmptyMessage } from '../../../shared/EmptyMessage'; import { CustomTooltip } from './custom_tooltip'; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/HttpContext.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/HttpContext.tsx deleted file mode 100644 index 3584309ebb20c9..00000000000000 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/HttpContext.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { Fragment } from 'react'; -import { EuiSpacer, EuiTitle } from '@elastic/eui'; -import { euiStyled } from '../../../../../../../../../../../src/plugins/kibana_react/common'; -import { - borderRadius, - fontFamilyCode, - fontSize, - px, - unit, - units, -} from '../../../../../../../style/variables'; -import { Span } from '../../../../../../../../typings/es_schemas/ui/span'; - -const ContextUrl = euiStyled.div` - padding: ${px(units.half)} ${px(unit)}; - background: ${({ theme }) => theme.eui.euiColorLightestShade}; - border-radius: ${borderRadius}; - border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - font-family: ${fontFamilyCode}; - font-size: ${fontSize}; -`; - -interface Props { - httpContext: NonNullable['http']; -} - -export function HttpContext({ httpContext }: Props) { - const url = httpContext?.url?.original; - - if (!url) { - return null; - } - - return ( - - -

HTTP URL

-
- - {url} - -
- ); -} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx index 3cac05ba2d96a8..1e13e224a511a4 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx @@ -19,7 +19,7 @@ import { HeightRetainer } from '../../shared/HeightRetainer'; import { fromQuery, toQuery } from '../../shared/Links/url_helpers'; import { TransactionDistribution } from './Distribution'; import { useWaterfallFetcher } from './use_waterfall_fetcher'; -import { WaterfallWithSummmary } from './WaterfallWithSummmary'; +import { WaterfallWithSummary } from './waterfall_with_summary'; interface Sample { traceId: string; @@ -107,7 +107,7 @@ export function TransactionDetails() { - ; @@ -39,7 +39,7 @@ interface Props { traceSamples: DistributionBucket['samples']; } -export function WaterfallWithSummmary({ +export function WaterfallWithSummary({ urlParams, waterfall, exceedsMax, diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks.test.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks.test.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks.test.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks.test.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks.test.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks.test.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks.test.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks.test.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/index.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/index.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/index.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Marks/index.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/FlyoutTopLevelProperties.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/FlyoutTopLevelProperties.tsx similarity index 97% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/FlyoutTopLevelProperties.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/FlyoutTopLevelProperties.tsx index 5f4ed551597ed6..0ad0fe872a8408 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/FlyoutTopLevelProperties.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/FlyoutTopLevelProperties.tsx @@ -16,7 +16,7 @@ import { import { Transaction } from '../../../../../../../typings/es_schemas/ui/transaction'; import { ServiceOrTransactionsOverviewLink } from '../../../../../shared/Links/apm/service_transactions_overview_link'; import { TransactionDetailLink } from '../../../../../shared/Links/apm/transaction_detail_link'; -import { StickyProperties } from '../../../../../shared/StickyProperties'; +import { StickyProperties } from '../../../../../shared/sticky_properties'; interface Props { transaction?: Transaction; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/ResponsiveFlyout.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/ResponsiveFlyout.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/ResponsiveFlyout.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/ResponsiveFlyout.tsx diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/TransactionFlyout/DroppedSpansWarning.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/TransactionFlyout/DroppedSpansWarning.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/TransactionFlyout/DroppedSpansWarning.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/TransactionFlyout/DroppedSpansWarning.tsx diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/TransactionFlyout/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/TransactionFlyout/index.tsx similarity index 98% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/TransactionFlyout/index.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/TransactionFlyout/index.tsx index 680edf880a70ec..6468e6ed1e2c8c 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/TransactionFlyout/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/TransactionFlyout/index.tsx @@ -18,7 +18,7 @@ import { import { i18n } from '@kbn/i18n'; import React from 'react'; import { Transaction } from '../../../../../../../../typings/es_schemas/ui/transaction'; -import { TransactionActionMenu } from '../../../../../../shared/TransactionActionMenu/TransactionActionMenu'; +import { TransactionActionMenu } from '../../../../../../shared/transaction_action_menu/TransactionActionMenu'; import { TransactionSummary } from '../../../../../../shared/Summary/TransactionSummary'; import { FlyoutTopLevelProperties } from '../FlyoutTopLevelProperties'; import { ResponsiveFlyout } from '../ResponsiveFlyout'; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/WaterfallFlyout.tsx similarity index 97% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/WaterfallFlyout.tsx index fddf4fcb4efc97..ec6d550affb91b 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallFlyout.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/WaterfallFlyout.tsx @@ -8,7 +8,7 @@ import { History } from 'history'; import React from 'react'; import { useHistory } from 'react-router-dom'; -import { SpanFlyout } from './SpanFlyout'; +import { SpanFlyout } from './span_flyout'; import { TransactionFlyout } from './TransactionFlyout'; import { IWaterfall } from './waterfall_helpers/waterfall_helpers'; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/accordion_waterfall.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx similarity index 98% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/accordion_waterfall.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx index b0721791081fac..1935d373caf797 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/accordion_waterfall.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/accordion_waterfall.tsx @@ -10,7 +10,7 @@ import { isEmpty } from 'lodash'; import React, { useState } from 'react'; import { euiStyled } from '../../../../../../../../../../src/plugins/kibana_react/common'; import { Margins } from '../../../../../shared/charts/Timeline'; -import { WaterfallItem } from './WaterfallItem'; +import { WaterfallItem } from './waterfall_item'; import { IWaterfall, IWaterfallSpanOrTransaction, diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/index.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/index.tsx diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/StickySpanProperties.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/StickySpanProperties.tsx similarity index 97% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/StickySpanProperties.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/StickySpanProperties.tsx index 60d328c98a4b7f..9e1174818c43be 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/StickySpanProperties.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/StickySpanProperties.tsx @@ -19,7 +19,7 @@ import { Span } from '../../../../../../../../typings/es_schemas/ui/span'; import { Transaction } from '../../../../../../../../typings/es_schemas/ui/transaction'; import { ServiceOrTransactionsOverviewLink } from '../../../../../../shared/Links/apm/service_transactions_overview_link'; import { TransactionDetailLink } from '../../../../../../shared/Links/apm/transaction_detail_link'; -import { StickyProperties } from '../../../../../../shared/StickyProperties'; +import { StickyProperties } from '../../../../../../shared/sticky_properties'; interface Props { span: Span; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/DatabaseContext.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/database_context.tsx similarity index 76% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/DatabaseContext.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/database_context.tsx index 6fd6873cf565ef..42792057434429 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/DatabaseContext.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/database_context.tsx @@ -9,39 +9,35 @@ import { EuiSpacer, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { tint } from 'polished'; import React, { Fragment } from 'react'; +import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; import sql from 'react-syntax-highlighter/dist/cjs/languages/hljs/sql'; import xcode from 'react-syntax-highlighter/dist/cjs/styles/hljs/xcode'; -import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; import { euiStyled } from '../../../../../../../../../../../src/plugins/kibana_react/common'; import { Span } from '../../../../../../../../typings/es_schemas/ui/span'; -import { - borderRadius, - fontFamilyCode, - fontSize, - px, - unit, - units, -} from '../../../../../../../style/variables'; -import { TruncateHeightSection } from './TruncateHeightSection'; +import { useTheme } from '../../../../../../../hooks/use_theme'; +import { TruncateHeightSection } from './truncate_height_section'; SyntaxHighlighter.registerLanguage('sql', sql); const DatabaseStatement = euiStyled.div` - padding: ${px(units.half)} ${px(unit)}; + padding: ${({ theme }) => + `${theme.eui.paddingSizes.s} ${theme.eui.paddingSizes.m}`}; background: ${({ theme }) => tint(0.9, theme.eui.euiColorWarning)}; - border-radius: ${borderRadius}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - font-family: ${fontFamilyCode}; - font-size: ${fontSize}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; + font-size: ${({ theme }) => theme.eui.euiFontSizeS}; `; -const dbSyntaxLineHeight = unit * 1.5; - interface Props { dbContext?: NonNullable['db']; } export function DatabaseContext({ dbContext }: Props) { + const theme = useTheme(); + const dbSyntaxLineHeight = theme.eui.euiSizeL; + const previewHeight = 240; // 10 * dbSyntaxLineHeight + if (!dbContext || !dbContext.statement) { return null; } @@ -64,7 +60,7 @@ export function DatabaseContext({ dbContext }: Props) { - + theme.eui.euiSizeXS}; `; const HttpInfoContainer = euiStyled('div')` - margin-right: ${px(units.quarter)}; + margin-right: ${({ theme }) => theme.eui.euiSizeXS}; `; interface Props { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/truncate_height_section.tsx similarity index 92% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/truncate_height_section.tsx index 181fcb91ba3e6e..4c845e16348e77 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SpanFlyout/TruncateHeightSection.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/truncate_height_section.tsx @@ -9,10 +9,9 @@ import { EuiIcon, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { Fragment, ReactNode, useEffect, useRef, useState } from 'react'; import { euiStyled } from '../../../../../../../../../../../src/plugins/kibana_react/common'; -import { px, units } from '../../../../../../../style/variables'; const ToggleButtonContainer = euiStyled.div` - margin-top: ${px(units.half)}; + margin-top: ${({ theme }) => theme.eui.euiSizeS} user-select: none; `; @@ -41,7 +40,7 @@ export function TruncateHeightSection({ children, previewHeight }: Props) { ref={contentContainerEl} style={{ overflow: 'hidden', - maxHeight: isOpen ? 'initial' : px(previewHeight), + maxHeight: isOpen ? 'initial' : previewHeight, }} > {children} diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.stories.tsx similarity index 91% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.stories.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.stories.tsx index 8275aa1e5f156c..6b52fbe2d784aa 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.stories.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { SyncBadge, SyncBadgeProps } from './SyncBadge'; +import { SyncBadge, SyncBadgeProps } from './sync_badge'; export default { title: 'app/TransactionDetails/SyncBadge', diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.tsx similarity index 92% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.tsx index b9e4c6951fa06a..cfc369fa12a269 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/SyncBadge.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/sync_badge.tsx @@ -9,11 +9,10 @@ import { EuiBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { euiStyled } from '../../../../../../../../../../src/plugins/kibana_react/common'; -import { px, units } from '../../../../../../style/variables'; const SpanBadge = euiStyled(EuiBadge)` display: inline-block; - margin-right: ${px(units.quarter)}; + margin-right: ${({ theme }) => theme.eui.euiSizeXS}; `; export interface SyncBadgeProps { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/__snapshots__/waterfall_helpers.test.ts.snap b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/__snapshots__/waterfall_helpers.test.ts.snap similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/__snapshots__/waterfall_helpers.test.ts.snap rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/__snapshots__/waterfall_helpers.test.ts.snap diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/mock_responses/spans.json b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/mock_responses/spans.json similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/mock_responses/spans.json rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/mock_responses/spans.json diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/mock_responses/transaction.json b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/mock_responses/transaction.json similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/mock_responses/transaction.json rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/mock_responses/transaction.json diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.test.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.test.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx similarity index 93% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx index f3e1547c4b8b87..a2c2c869a079c2 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Waterfall/WaterfallItem.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_item.tsx @@ -5,20 +5,18 @@ * 2.0. */ -import React, { ReactNode } from 'react'; - import { EuiIcon, EuiText, EuiTitle, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import React, { ReactNode } from 'react'; import { euiStyled } from '../../../../../../../../../../src/plugins/kibana_react/common'; -import { asDuration } from '../../../../../../../common/utils/formatters'; import { isRumAgentName } from '../../../../../../../common/agent_name'; -import { px, unit, units } from '../../../../../../style/variables'; -import { ErrorCount } from '../../ErrorCount'; -import { IWaterfallSpanOrTransaction } from './waterfall_helpers/waterfall_helpers'; -import { ErrorOverviewLink } from '../../../../../shared/Links/apm/ErrorOverviewLink'; import { TRACE_ID } from '../../../../../../../common/elasticsearch_fieldnames'; -import { SyncBadge } from './SyncBadge'; +import { asDuration } from '../../../../../../../common/utils/formatters'; import { Margins } from '../../../../../shared/charts/Timeline'; +import { ErrorOverviewLink } from '../../../../../shared/Links/apm/ErrorOverviewLink'; +import { ErrorCount } from '../../ErrorCount'; +import { SyncBadge } from './sync_badge'; +import { IWaterfallSpanOrTransaction } from './waterfall_helpers/waterfall_helpers'; type ItemType = 'transaction' | 'span' | 'error'; @@ -37,10 +35,10 @@ const Container = euiStyled.div` position: relative; display: block; user-select: none; - padding-top: ${px(units.half)}; - padding-bottom: ${px(units.plus)}; - margin-right: ${(props) => px(props.timelineMargins.right)}; - margin-left: ${(props) => px(props.timelineMargins.left)}; + padding-top: ${({ theme }) => theme.eui.paddingSizes.s}; + padding-bottom: ${({ theme }) => theme.eui.euiSizeM}; + margin-right: ${(props) => props.timelineMargins.right}px; + margin-left: ${(props) => props.timelineMargins.left}px; background-color: ${({ isSelected, theme }) => isSelected ? theme.eui.euiColorLightestShade : 'initial'}; cursor: pointer; @@ -53,7 +51,7 @@ const Container = euiStyled.div` const ItemBar = euiStyled.div` box-sizing: border-box; position: relative; - height: ${px(unit)}; + height: ${({ theme }) => theme.eui.euiSize}; min-width: 2px; background-color: ${(props) => props.color}; `; @@ -63,11 +61,11 @@ const ItemText = euiStyled.span` right: 0; display: flex; align-items: center; - height: ${px(units.plus)}; + height: ${({ theme }) => theme.eui.euiSizeL}; /* add margin to all direct descendants */ & > * { - margin-right: ${px(units.half)}; + margin-right: ${({ theme }) => theme.eui.euiSizeS}; white-space: nowrap; } `; diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallContainer.stories.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallContainer.stories.tsx diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/WaterfallLegends.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallLegends.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/WaterfallLegends.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallLegends.tsx index d6f6de2d9179b5..aaa9b3e45ee22f 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/WaterfallLegends.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/WaterfallLegends.tsx @@ -10,7 +10,7 @@ import { EuiFlexItem } from '@elastic/eui'; import { EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { Legend } from '../../../../shared/charts/Legend'; +import { Legend } from '../../../../shared/charts/Timeline/legend'; import { IWaterfallLegend, WaterfallLegendType, diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/index.tsx rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/index.tsx diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_details/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts rename to x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx index 4f0f92cafa5e7d..041c12822357c5 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx @@ -24,7 +24,7 @@ import { useUrlParams } from '../../../context/url_params_context/use_url_params import { TransactionCharts } from '../../shared/charts/transaction_charts'; import { ElasticDocsLink } from '../../shared/Links/ElasticDocsLink'; import { fromQuery, toQuery } from '../../shared/Links/url_helpers'; -import { TransactionList } from './TransactionList'; +import { TransactionList } from './transaction_list'; import { useRedirect } from './useRedirect'; import { useTransactionListFetcher } from './use_transaction_list'; diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/TransactionList/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_list/index.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/app/transaction_overview/TransactionList/index.tsx rename to x-pack/plugins/apm/public/components/app/transaction_overview/transaction_list/index.tsx index 795a6e66f70a46..dc3bf924d6fdce 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/TransactionList/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_list/index.tsx @@ -15,9 +15,9 @@ import { asMillisecondDuration, asTransactionRate, } from '../../../../../common/utils/formatters'; -import { fontFamilyCode, truncate } from '../../../../style/variables'; +import { truncate } from '../../../../utils/style'; import { ImpactBar } from '../../../shared/ImpactBar'; -import { ITableColumn, ManagedTable } from '../../../shared/ManagedTable'; +import { ITableColumn, ManagedTable } from '../../../shared/managed_table'; import { LoadingStatePrompt } from '../../../shared/LoadingStatePrompt'; import { EmptyMessage } from '../../../shared/EmptyMessage'; import { TransactionDetailLink } from '../../../shared/Links/apm/transaction_detail_link'; @@ -27,7 +27,7 @@ type TransactionGroup = APIReturnType<'GET /api/apm/services/{serviceName}/trans // Truncate both the link and the child span (the tooltip anchor.) The link so // it doesn't overflow, and the anchor so we get the ellipsis. const TransactionNameLink = euiStyled(TransactionDetailLink)` - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; white-space: nowrap; ${truncate('100%')}; diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/TransactionList/TransactionList.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_list/transaction_list.stories.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/app/transaction_overview/TransactionList/TransactionList.stories.tsx rename to x-pack/plugins/apm/public/components/app/transaction_overview/transaction_list/transaction_list.stories.tsx diff --git a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx index 5214489c9142b0..e00b7893b548ee 100644 --- a/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx +++ b/x-pack/plugins/apm/public/components/routing/apm_route_config.tsx @@ -11,14 +11,14 @@ import { RouteComponentProps } from 'react-router-dom'; import { getServiceNodeName } from '../../../common/service_nodes'; import { APMRouteDefinition } from '../../application/routes'; import { toQuery } from '../shared/Links/url_helpers'; -import { ErrorGroupDetails } from '../app/ErrorGroupDetails'; +import { ErrorGroupDetails } from '../app/error_group_details'; import { useApmPluginContext } from '../../context/apm_plugin/use_apm_plugin_context'; import { ServiceNodeMetrics } from '../app/service_node_metrics'; import { SettingsTemplate } from './templates/settings_template'; -import { AgentConfigurations } from '../app/Settings/AgentConfigurations'; +import { AgentConfigurations } from '../app/Settings/agent_configurations'; import { AnomalyDetection } from '../app/Settings/anomaly_detection'; import { ApmIndices } from '../app/Settings/ApmIndices'; -import { CustomizeUI } from '../app/Settings/CustomizeUI'; +import { CustomizeUI } from '../app/Settings/customize_ui'; import { Schema } from '../app/Settings/schema'; import { TraceLink } from '../app/TraceLink'; import { TransactionLink } from '../app/transaction_link'; @@ -37,7 +37,7 @@ import { TransactionOverview } from '../app/transaction_overview'; import { ServiceInventory } from '../app/service_inventory'; import { TraceOverview } from '../app/trace_overview'; import { useFetcher } from '../../hooks/use_fetcher'; -import { AgentConfigurationCreateEdit } from '../app/Settings/AgentConfigurations/AgentConfigurationCreateEdit'; +import { AgentConfigurationCreateEdit } from '../app/Settings/agent_configurations/AgentConfigurationCreateEdit'; // These component function definitions are used below with the `component` // property of the route definitions. diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/Context.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/Context.tsx index ef74894169d727..a03b0b5f2ae016 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/Context.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/Context.tsx @@ -8,14 +8,13 @@ import { size } from 'lodash'; import { tint } from 'polished'; import React from 'react'; +import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; import javascript from 'react-syntax-highlighter/dist/cjs/languages/hljs/javascript'; import python from 'react-syntax-highlighter/dist/cjs/languages/hljs/python'; import ruby from 'react-syntax-highlighter/dist/cjs/languages/hljs/ruby'; import xcode from 'react-syntax-highlighter/dist/cjs/styles/hljs/xcode'; -import { Light as SyntaxHighlighter } from 'react-syntax-highlighter'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { StackframeWithLineContext } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { borderRadius, px, unit, units } from '../../../style/variables'; SyntaxHighlighter.registerLanguage('javascript', javascript); SyntaxHighlighter.registerLanguage('python', python); @@ -23,15 +22,15 @@ SyntaxHighlighter.registerLanguage('ruby', ruby); const ContextContainer = euiStyled.div` position: relative; - border-radius: ${borderRadius}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; `; -const LINE_HEIGHT = units.eighth * 9; +const LINE_HEIGHT = 18; const LineHighlight = euiStyled.div<{ lineNumber: number }>` position: absolute; width: 100%; - height: ${px(units.eighth * 9)}; - top: ${(props) => px(props.lineNumber * LINE_HEIGHT)}; + height: ${LINE_HEIGHT}px; + top: ${(props) => props.lineNumber * LINE_HEIGHT}px; pointer-events: none; background-color: ${({ theme }) => tint(0.9, theme.eui.euiColorWarning)}; `; @@ -40,7 +39,7 @@ const LineNumberContainer = euiStyled.div<{ isLibraryFrame: boolean }>` position: absolute; top: 0; left: 0; - border-radius: ${borderRadius}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; background: ${({ isLibraryFrame, theme }) => isLibraryFrame ? theme.eui.euiColorEmptyShade @@ -49,29 +48,29 @@ const LineNumberContainer = euiStyled.div<{ isLibraryFrame: boolean }>` const LineNumber = euiStyled.div<{ highlight: boolean }>` position: relative; - min-width: ${px(units.eighth * 21)}; - padding-left: ${px(units.half)}; - padding-right: ${px(units.quarter)}; + min-width: 42px; + padding-left: ${({ theme }) => theme.eui.paddingSizes.s}; + padding-right: ${({ theme }) => theme.eui.paddingSizes.xs}; color: ${({ theme }) => theme.eui.euiColorMediumShade}; - line-height: ${px(unit + units.eighth)}; + line-height: ${LINE_HEIGHT}px; text-align: right; border-right: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; background-color: ${({ highlight, theme }) => highlight ? tint(0.9, theme.eui.euiColorWarning) : null}; &:last-of-type { - border-radius: 0 0 0 ${borderRadius}; + border-radius: 0 0 0 ${({ theme }) => theme.eui.euiBorderRadiusSmall}; } `; const LineContainer = euiStyled.div` overflow: auto; - margin: 0 0 0 ${px(units.eighth * 21)}; + margin: 0 0 0 42px; padding: 0; background-color: ${({ theme }) => theme.eui.euiColorEmptyShade}; &:last-of-type { - border-radius: 0 0 ${borderRadius} 0; + border-radius: 0 0 ${({ theme }) => theme.eui.euiBorderRadiusSmall} 0; } `; @@ -83,8 +82,8 @@ const Line = euiStyled.pre` border: 0; border-radius: 0; overflow: initial; - padding: 0 ${px(LINE_HEIGHT)}; - line-height: ${px(LINE_HEIGHT)}; + padding: 0 ${LINE_HEIGHT}px; + line-height: ${LINE_HEIGHT}px; `; const Code = euiStyled.code` diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/Stackframe.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/Stackframe.tsx index d361634759390c..0985153c2d39e2 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/Stackframe.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/Stackframe.tsx @@ -12,22 +12,16 @@ import { Stackframe as StackframeType, StackframeWithLineContext, } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { - borderRadius, - fontFamilyCode, - fontSize, -} from '../../../style/variables'; import { Context } from './Context'; -import { FrameHeading } from './FrameHeading'; +import { FrameHeading } from './frame_heading'; import { Variables } from './Variables'; -import { px, units } from '../../../style/variables'; const ContextContainer = euiStyled.div<{ isLibraryFrame: boolean }>` position: relative; - font-family: ${fontFamilyCode}; - font-size: ${fontSize}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; + font-size: ${({ theme }) => theme.eui.euiFontSizeS}; border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - border-radius: ${borderRadius}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; background: ${({ isLibraryFrame, theme }) => isLibraryFrame ? theme.eui.euiColorEmptyShade @@ -36,7 +30,7 @@ const ContextContainer = euiStyled.div<{ isLibraryFrame: boolean }>` // Indent the non-context frames the same amount as the accordion control const NoContextFrameHeadingWrapper = euiStyled.div` - margin-left: ${px(units.unit + units.half + units.quarter)}; + margin-left: 28px; `; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx index 7c090485937102..a43cd26e7f94a5 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/Variables.tsx @@ -9,15 +9,16 @@ import { EuiAccordion } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; -import { borderRadius, px, unit, units } from '../../../style/variables'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; import { KeyValueTable } from '../KeyValueTable'; import { flattenObject } from '../../../utils/flattenObject'; const VariablesContainer = euiStyled.div` background: ${({ theme }) => theme.eui.euiColorEmptyShade}; - border-radius: 0 0 ${borderRadius} ${borderRadius}; - padding: ${px(units.half)} ${px(unit)}; + border-radius: 0 0 ${({ theme }) => + `${theme.eui.euiBorderRadiusSmall} ${theme.eui.euiBorderRadiusSmall}`}; + padding: ${({ theme }) => + `${theme.eui.paddingSizes.s} ${theme.eui.paddingSizes.m}`}; `; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.test.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.test.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.test.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.test.tsx index a0ca8dd05b87ff..cc23452127fa4e 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.test.tsx @@ -5,10 +5,10 @@ * 2.0. */ -import React from 'react'; import { shallow } from 'enzyme'; -import { CauseStacktrace } from './CauseStacktrace'; +import React from 'react'; import { mountWithTheme } from '../../../utils/testHelpers'; +import { CauseStacktrace } from './cause_stacktrace'; describe('CauseStacktrace', () => { describe('render', () => { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.tsx similarity index 94% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.tsx index 090ba0e8e28cf3..0ee4f66e2c24c0 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/CauseStacktrace.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/cause_stacktrace.tsx @@ -5,17 +5,16 @@ * 2.0. */ -import React from 'react'; -import { i18n } from '@kbn/i18n'; import { EuiAccordion, EuiTitle } from '@elastic/eui'; -import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; -import { px, unit, units } from '../../../style/variables'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; import { Stacktrace } from '.'; +import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; const Accordion = euiStyled(EuiAccordion)` border-top: ${({ theme }) => theme.eui.euiBorderThin}; - margin-top: ${px(units.half)}; + margin-top: ${({ theme }) => theme.eui.euiSizeS}; `; const CausedByContainer = euiStyled('h5')` @@ -31,7 +30,7 @@ const CausedByHeading = euiStyled('span')` `; const FramesContainer = euiStyled('div')` - padding-left: ${px(unit)}; + padding-left: ${({ theme }) => theme.eui.paddingSizes.m}; `; function CausedBy({ message }: { message: string }) { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.test.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.test.tsx similarity index 99% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.test.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.test.tsx index 794d88461358e4..2eb3320ef3aa31 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; import { renderWithTheme } from '../../../utils/testHelpers'; -import { FrameHeading } from './FrameHeading'; +import { FrameHeading } from './frame_heading'; function getRenderedStackframeText( stackframe: Stackframe, diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.tsx similarity index 92% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.tsx index 68b0893e1d8d33..8c9b9ae26c1404 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/FrameHeading.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/frame_heading.tsx @@ -8,7 +8,6 @@ import React, { ComponentType } from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { fontFamilyCode, fontSize, px, units } from '../../../style/variables'; import { CSharpFrameHeadingRenderer, DefaultFrameHeadingRenderer, @@ -21,9 +20,9 @@ import { const FileDetails = euiStyled.div` color: ${({ theme }) => theme.eui.euiColorDarkShade}; line-height: 1.5; /* matches the line-hight of the accordion container button */ - padding: ${px(units.eighth)} 0; - font-family: ${fontFamilyCode}; - font-size: ${fontSize}; + padding: 2px 0; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; + font-size: ${({ theme }) => theme.eui.euiFontSizeS}; `; const LibraryFrameFileDetail = euiStyled.span` diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/index.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/index.tsx index 19af5da30cff24..3395b22988e8cd 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/index.tsx @@ -10,7 +10,7 @@ import { isEmpty, last } from 'lodash'; import React, { Fragment } from 'react'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; import { EmptyMessage } from '../../shared/EmptyMessage'; -import { LibraryStacktrace } from './LibraryStacktrace'; +import { LibraryStacktrace } from './library_stacktrace'; import { Stackframe as StackframeComponent } from './Stackframe'; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.test.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.test.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.test.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.test.tsx index d583d4c7009395..d10e6c46cd12c7 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { renderWithTheme } from '../../../utils/testHelpers'; -import { LibraryStacktrace } from './LibraryStacktrace'; +import { LibraryStacktrace } from './library_stacktrace'; describe('LibraryStacktrace', () => { describe('render', () => { diff --git a/x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.tsx b/x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.tsx similarity index 94% rename from x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.tsx rename to x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.tsx index de417b465638fc..08399d09bed86d 100644 --- a/x-pack/plugins/apm/public/components/shared/Stacktrace/LibraryStacktrace.tsx +++ b/x-pack/plugins/apm/public/components/shared/Stacktrace/library_stacktrace.tsx @@ -10,11 +10,10 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { px, units } from '../../../style/variables'; import { Stackframe as StackframeComponent } from './Stackframe'; const LibraryStacktraceAccordion = euiStyled(EuiAccordion)` - margin: ${px(units.quarter)} 0; + margin: ${({ theme }) => theme.eui.euiSizeXS} 0; `; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx b/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx index 1ceccc5203fb2f..e0710556096c90 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/DurationSummaryItem.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiToolTip, EuiText } from '@elastic/eui'; import { asDuration } from '../../../../common/utils/formatters'; -import { PercentOfParent } from '../../app/transaction_details/WaterfallWithSummmary/PercentOfParent'; +import { PercentOfParent } from '../../app/transaction_details/waterfall_with_summary/PercentOfParent'; interface Props { duration: number; diff --git a/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx b/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx index 8755003c89af2d..6939aaf49373e7 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/TransactionSummary.tsx @@ -10,9 +10,9 @@ import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { Summary } from './'; import { TimestampTooltip } from '../TimestampTooltip'; import { DurationSummaryItem } from './DurationSummaryItem'; -import { ErrorCountSummaryItemBadge } from './ErrorCountSummaryItemBadge'; +import { ErrorCountSummaryItemBadge } from './error_count_summary_item_badge'; import { isRumAgentName } from '../../../../common/agent_name'; -import { HttpInfoSummaryItem } from './HttpInfoSummaryItem'; +import { HttpInfoSummaryItem } from './http_info_summary_item'; import { TransactionResultSummaryItem } from './TransactionResultSummaryItem'; import { UserAgentSummaryItem } from './UserAgentSummaryItem'; diff --git a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.test.tsx b/x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.test.tsx similarity index 90% rename from x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.test.tsx rename to x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.test.tsx index 9996d1ea61a761..c6b77bddbf5449 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { ErrorCountSummaryItemBadge } from './ErrorCountSummaryItemBadge'; +import { ErrorCountSummaryItemBadge } from './error_count_summary_item_badge'; import { expectTextsInDocument, renderWithTheme, diff --git a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx b/x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.tsx similarity index 87% rename from x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx rename to x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.tsx index ec309f2f74d106..17189f1e40d943 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/ErrorCountSummaryItemBadge.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/error_count_summary_item_badge.tsx @@ -10,15 +10,13 @@ import { i18n } from '@kbn/i18n'; import { EuiBadge } from '@elastic/eui'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { useTheme } from '../../../hooks/use_theme'; -import { px } from '../../../../public/style/variables'; -import { units } from '../../../style/variables'; interface Props { count: number; } const Badge = euiStyled(EuiBadge)` - margin-top: ${px(units.eighth)}; + margin-top: 2px; `; export function ErrorCountSummaryItemBadge({ count }: Props) { diff --git a/x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/HttpInfoSummaryItem.test.tsx b/x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/http_info_summary_item.test.tsx similarity index 69% rename from x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/HttpInfoSummaryItem.test.tsx rename to x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/http_info_summary_item.test.tsx index 71d7177051b9d7..3e1848af316fea 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/HttpInfoSummaryItem.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/http_info_summary_item.test.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { shallow, mount } from 'enzyme'; import { HttpInfoSummaryItem } from '.'; import * as exampleTransactions from '../__fixtures__/transactions'; +import { EuiThemeProvider } from '../../../../../../../../src/plugins/kibana_react/common'; describe('HttpInfoSummaryItem', () => { describe('render', () => { @@ -19,18 +20,24 @@ describe('HttpInfoSummaryItem', () => { it('renders', () => { expect(() => - shallow() + shallow(, { + wrappingComponent: EuiThemeProvider, + }) ).not.toThrowError(); }); it('renders empty component if no url is provided', () => { - const component = shallow(); + const component = shallow(, { + wrappingComponent: EuiThemeProvider, + }); expect(component.isEmptyRender()).toBeTruthy(); }); describe('with status code 100', () => { it('shows a success color', () => { - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(100); }); @@ -39,7 +46,9 @@ describe('HttpInfoSummaryItem', () => { describe('with status code 200', () => { it('shows a success color', () => { const p = { ...props, status: 200 }; - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(200); }); @@ -49,7 +58,9 @@ describe('HttpInfoSummaryItem', () => { it('shows a warning color', () => { const p = { ...props, status: 301 }; - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(301); }); @@ -59,7 +70,9 @@ describe('HttpInfoSummaryItem', () => { it('shows a error color', () => { const p = { ...props, status: 404 }; - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(404); }); @@ -69,7 +82,9 @@ describe('HttpInfoSummaryItem', () => { it('shows a error color', () => { const p = { ...props, status: 502 }; - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(502); }); @@ -79,7 +94,9 @@ describe('HttpInfoSummaryItem', () => { it('shows the default color', () => { const p = { ...props, status: 700 }; - const wrapper = mount(); + const wrapper = mount(, { + wrappingComponent: EuiThemeProvider, + }); expect(wrapper.find('HttpStatusBadge').prop('status')).toEqual(700); }); diff --git a/x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/index.tsx b/x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/index.tsx similarity index 87% rename from x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/index.tsx rename to x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/index.tsx index d72f03c386226e..d10d15f8240a1c 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/HttpInfoSummaryItem/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/http_info_summary_item/index.tsx @@ -5,21 +5,21 @@ * 2.0. */ -import React from 'react'; -import { EuiToolTip, EuiBadge } from '@elastic/eui'; +import { EuiBadge, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import React from 'react'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; -import { units, px, truncate, unit } from '../../../../style/variables'; +import { truncate, unit } from '../../../../utils/style'; import { HttpStatusBadge } from '../HttpStatusBadge'; const HttpInfoBadge = euiStyled(EuiBadge)` - margin-right: ${px(units.quarter)}; + margin-right: ${({ theme }) => theme.eui.euiSizeXS}; `; const Url = euiStyled('span')` display: inline-block; vertical-align: bottom; - ${truncate(px(unit * 24))}; + ${truncate(unit * 24)}; `; interface HttpInfoProps { method?: string; diff --git a/x-pack/plugins/apm/public/components/shared/Summary/index.tsx b/x-pack/plugins/apm/public/components/shared/Summary/index.tsx index 395156800dceb5..1880ee00f3de73 100644 --- a/x-pack/plugins/apm/public/components/shared/Summary/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/Summary/index.tsx @@ -5,10 +5,9 @@ * 2.0. */ -import React from 'react'; import { EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; +import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; -import { px, units } from '../../../../public/style/variables'; import { Maybe } from '../../../../typings/common'; interface Props { @@ -18,7 +17,7 @@ interface Props { const Item = euiStyled(EuiFlexItem)` flex-wrap: nowrap; border-right: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - padding-right: ${px(units.half)}; + padding-right: ${({ theme }) => theme.eui.paddingSizes.s}; flex-flow: row nowrap; line-height: 1.5; align-items: center !important; diff --git a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx index 28c000310346d5..b800ef41fbcac5 100644 --- a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx @@ -17,14 +17,14 @@ import { ENVIRONMENT_ALL, getEnvironmentLabel, } from '../../../../common/environment_filter_values'; -import { getAPMHref } from '../Links/apm/APMLink'; import { useAnomalyDetectionJobsContext } from '../../../context/anomaly_detection_jobs/use_anomaly_detection_jobs_context'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { useLicenseContext } from '../../../context/license/use_license_context'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; import { FETCH_STATUS } from '../../../hooks/use_fetcher'; +import { useTheme } from '../../../hooks/use_theme'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; -import { units } from '../../../style/variables'; +import { getAPMHref } from '../Links/apm/APMLink'; export type AnomalyDetectionApiResponse = APIReturnType<'GET /api/apm/settings/anomaly-detection/jobs'>; @@ -39,6 +39,7 @@ export function AnomalyDetectionSetupLink() { const license = useLicenseContext(); const hasValidLicense = license?.isActive && license?.hasAtLeast('platinum'); const { basePath } = core.http; + const theme = useTheme(); return ( )} - + {ANOMALY_DETECTION_LINK_LABEL} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/AgentMarker.test.tsx.snap b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/agent_marker.test.tsx.snap similarity index 100% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/AgentMarker.test.tsx.snap rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/agent_marker.test.tsx.snap diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/index.test.tsx.snap b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/index.test.tsx.snap index f108eb7ebf3ea4..5657732eb241bc 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/__snapshots__/index.test.tsx.snap @@ -4,7 +4,7 @@ exports[`Marker renders agent marker 1`] = ` @@ -25,7 +25,7 @@ exports[`Marker renders error marker 1`] = ` diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.test.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.test.tsx similarity index 81% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.test.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.test.tsx index 1411a264b065ef..0b7e405ae5d953 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.test.tsx @@ -7,9 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { AgentMarker } from './AgentMarker'; -import { AgentMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks'; import { EuiThemeProvider } from '../../../../../../../../../src/plugins/kibana_react/common'; +import { AgentMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks'; +import { AgentMarker } from './agent_marker'; describe('AgentMarker', () => { const mark = { diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.tsx similarity index 80% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.tsx index 3b7f0fab6c2a7c..947c7a93f38b14 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/AgentMarker.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/agent_marker.tsx @@ -5,23 +5,22 @@ * 2.0. */ -import React from 'react'; import { EuiToolTip } from '@elastic/eui'; +import React from 'react'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; import { asDuration } from '../../../../../../common/utils/formatters'; import { useTheme } from '../../../../../hooks/use_theme'; -import { px, units } from '../../../../../style/variables'; -import { Legend } from '../../Legend'; -import { AgentMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks'; +import { AgentMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks'; +import { Legend } from '../legend'; const NameContainer = euiStyled.div` border-bottom: 1px solid ${({ theme }) => theme.eui.euiColorMediumShade}; - padding-bottom: ${px(units.half)}; + padding-bottom: ${({ theme }) => theme.eui.paddingSizes.s}; `; const TimeContainer = euiStyled.div` color: ${({ theme }) => theme.eui.euiColorMediumShade}; - padding-top: ${px(units.half)}; + padding-top: ${({ theme }) => theme.eui.paddingSizes.s}; `; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.test.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.test.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx index 36634f97a3a450..fdb97ea4fadde6 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx @@ -14,8 +14,8 @@ import { expectTextsInDocument, renderWithTheme, } from '../../../../../utils/testHelpers'; -import { ErrorMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks'; -import { ErrorMarker } from './ErrorMarker'; +import { ErrorMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks'; +import { ErrorMarker } from './error_marker'; function Wrapper({ children }: { children?: ReactNode }) { return ( diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.tsx similarity index 88% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.tsx index 044070303d2ff1..b1e902957bfd7a 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/ErrorMarker.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.tsx @@ -5,36 +5,35 @@ * 2.0. */ -import React, { useState } from 'react'; import { EuiPopover, EuiText } from '@elastic/eui'; +import React, { useState } from 'react'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; -import { asDuration } from '../../../../../../common/utils/formatters'; -import { useTheme } from '../../../../../hooks/use_theme'; import { TRACE_ID, TRANSACTION_ID, } from '../../../../../../common/elasticsearch_fieldnames'; +import { asDuration } from '../../../../../../common/utils/formatters'; import { useUrlParams } from '../../../../../context/url_params_context/use_url_params'; -import { px, unit, units } from '../../../../../style/variables'; -import { ErrorMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks'; +import { useTheme } from '../../../../../hooks/use_theme'; +import { ErrorMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks'; import { ErrorDetailLink } from '../../../Links/apm/ErrorDetailLink'; -import { Legend, Shape } from '../../Legend'; +import { Legend, Shape } from '../legend'; interface Props { mark: ErrorMark; } const Popover = euiStyled.div` - max-width: ${px(280)}; + max-width: 280px; `; const TimeLegend = euiStyled(Legend)` - margin-bottom: ${px(unit)}; + margin-bottom: ${({ theme }) => theme.eui.euiSize}; `; const ErrorLink = euiStyled(ErrorDetailLink)` display: block; - margin: ${px(units.half)} 0 ${px(units.half)} 0; + margin: ${({ theme }) => `${theme.eui.euiSizeS} 0 ${theme.eui.euiSizeS} 0`}; overflow-wrap: break-word; `; @@ -102,7 +101,7 @@ export function ErrorMarker({ mark }: Props) { ( -
@
+
@
)} /> { it('renders agent marker', () => { diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx index bece72b398d314..88318eb0e0c2d5 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/index.tsx @@ -7,11 +7,10 @@ import React from 'react'; import { euiStyled } from '../../../../../../../../../src/plugins/kibana_react/common'; -import { px } from '../../../../../style/variables'; -import { AgentMarker } from './AgentMarker'; -import { ErrorMarker } from './ErrorMarker'; -import { AgentMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks'; -import { ErrorMark } from '../../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks'; +import { AgentMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks'; +import { ErrorMark } from '../../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks'; +import { AgentMarker } from './agent_marker'; +import { ErrorMarker } from './error_marker'; interface Props { mark: ErrorMark | AgentMark; @@ -26,7 +25,7 @@ const MarkerContainer = euiStyled.div` export function Marker({ mark, x }: Props) { const legendWidth = 11; return ( - + {mark.type === 'errorMark' ? ( ) : ( diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx index 428da80fb808a4..2dcc969f661b87 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/VerticalLines.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { VerticalGridLines, XYPlot } from 'react-vis'; import { useTheme } from '../../../../hooks/use_theme'; -import { Mark } from '../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks'; +import { Mark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks'; import { PlotValues } from './plotUtils'; interface VerticalLinesProps { diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/index.tsx index 650faa195271c5..6c7cb7a067d2e4 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/index.tsx @@ -8,11 +8,11 @@ import PropTypes from 'prop-types'; import React, { PureComponent, ReactNode } from 'react'; import { makeWidthFlexible } from 'react-vis'; +import { AgentMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_agent_marks'; +import { ErrorMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/Marks/get_error_marks'; import { getPlotValues } from './plotUtils'; -import { TimelineAxis } from './TimelineAxis'; +import { TimelineAxis } from './timeline_axis'; import { VerticalLines } from './VerticalLines'; -import { ErrorMark } from '../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_error_marks'; -import { AgentMark } from '../../../app/transaction_details/WaterfallWithSummmary/WaterfallContainer/Marks/get_agent_marks'; export type Mark = AgentMark | ErrorMark; diff --git a/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/legend.tsx similarity index 75% rename from x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/legend.tsx index f81da48b760e74..c7066565f0b22d 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Legend/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/legend.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; import { useTheme } from '../../../../hooks/use_theme'; -import { fontSizes, px, units } from '../../../../style/variables'; export enum Shape { circle = 'circle', @@ -17,7 +16,6 @@ export enum Shape { interface ContainerProps { onClick: (e: Event) => void; - fontSize?: string; clickable: boolean; disabled: boolean; } @@ -25,7 +23,7 @@ interface ContainerProps { const Container = euiStyled.div` display: flex; align-items: center; - font-size: ${(props) => props.fontSize}; + font-size: ${({ theme }) => theme.eui.euiFontSizeS}; color: ${({ theme }) => theme.eui.euiColorDarkShade}; cursor: ${(props) => (props.clickable ? 'pointer' : 'initial')}; opacity: ${(props) => (props.disabled ? 0.4 : 1)}; @@ -33,16 +31,17 @@ const Container = euiStyled.div` `; interface IndicatorProps { - radius: number; color: string; shape: Shape; withMargin: boolean; } +const radius = 11; + export const Indicator = euiStyled.span` - width: ${(props) => px(props.radius)}; - height: ${(props) => px(props.radius)}; - margin-right: ${(props) => (props.withMargin ? px(props.radius / 2) : 0)}; + width: ${radius}px; + height: ${radius}px; + margin-right: ${(props) => (props.withMargin ? `${radius / 2}px` : 0)}; background: ${(props) => props.color}; border-radius: ${(props) => { return props.shape === Shape.circle ? '100%' : '0'; @@ -53,8 +52,6 @@ interface Props { onClick?: any; text?: string; color?: string; - fontSize?: string; - radius?: number; disabled?: boolean; clickable?: boolean; shape?: Shape; @@ -65,8 +62,6 @@ export function Legend({ onClick, text, color, - fontSize = fontSizes.small, - radius = units.minus - 1, disabled = false, clickable = false, shape = Shape.circle, @@ -81,18 +76,12 @@ export function Legend({ onClick={onClick} disabled={disabled} clickable={clickable || Boolean(onClick)} - fontSize={fontSize} {...rest} > {indicator ? ( indicator() ) : ( - + )} {text} diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/timeline_axis.tsx similarity index 97% rename from x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx rename to x-pack/plugins/apm/public/components/shared/charts/Timeline/timeline_axis.tsx index 32b78bf8818a30..cf942ebb757763 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/TimelineAxis.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/timeline_axis.tsx @@ -5,12 +5,11 @@ * 2.0. */ -import React, { ReactNode } from 'react'; import { inRange } from 'lodash'; +import React, { ReactNode } from 'react'; import { XAxis, XYPlot } from 'react-vis'; import { getDurationFormatter } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; -import { px } from '../../../../style/variables'; import { Mark } from './'; import { LastTickValue } from './LastTickValue'; import { Marker } from './Marker'; @@ -59,7 +58,7 @@ export function TimelineAxis({ position: 'sticky', top: 0, borderBottom: `1px solid ${theme.eui.euiColorMediumShade}`, - height: px(margins.top), + height: margins.top, zIndex: 2, width: '100%', }} diff --git a/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx index 59205ef4985344..6b93fe9605e42b 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/spark_plot/index.tsx @@ -5,9 +5,6 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import React from 'react'; -import { EuiIcon } from '@elastic/eui'; import { AreaSeries, Chart, @@ -16,11 +13,13 @@ import { ScaleType, Settings, } from '@elastic/charts'; +import { EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; import { merge } from 'lodash'; -import { Coordinate } from '../../../../../typings/timeseries'; +import React from 'react'; import { useChartTheme } from '../../../../../../observability/public'; -import { px, unit } from '../../../../style/variables'; +import { Coordinate } from '../../../../../typings/timeseries'; import { useTheme } from '../../../../hooks/use_theme'; +import { unit } from '../../../../utils/style'; import { getComparisonChartTheme } from '../../time_comparison/get_time_range_comparison'; export type Color = @@ -73,8 +72,8 @@ export function SparkPlot({ const colorValue = theme.eui[color]; const chartSize = { - height: px(24), - width: compact ? px(unit * 3) : px(unit * 4), + height: theme.eui.euiSizeL, + width: compact ? unit * 3 : unit * 4, }; const Sparkline = hasComparisonSeries ? LineSeries : AreaSeries; diff --git a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx index 9e7a3ac744ffe6..9667bbd33cc736 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx @@ -40,7 +40,7 @@ import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { useTheme } from '../../../hooks/use_theme'; import { useAnnotationsContext } from '../../../context/annotations/use_annotations_context'; import { useChartPointerEventContext } from '../../../context/chart_pointer_event/use_chart_pointer_event_context'; -import { unit } from '../../../style/variables'; +import { unit } from '../../../utils/style'; import { ChartContainer } from './chart_container'; import { onBrushEnd, isTimeseriesEmpty } from './helper/helper'; import { getLatencyChartSelector } from '../../../selectors/latency_chart_selectors'; diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/transaction_breakdown_chart_contents.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/transaction_breakdown_chart_contents.tsx index 436eca47815023..a68373892e78b8 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/transaction_breakdown_chart_contents.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/transaction_breakdown_chart_contents.tsx @@ -34,7 +34,7 @@ import { useTheme } from '../../../../hooks/use_theme'; import { useUrlParams } from '../../../../context/url_params_context/use_url_params'; import { useAnnotationsContext } from '../../../../context/annotations/use_annotations_context'; import { useChartPointerEventContext } from '../../../../context/chart_pointer_event/use_chart_pointer_event_context'; -import { unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { ChartContainer } from '../../charts/chart_container'; import { isTimeseriesEmpty, onBrushEnd } from '../../charts/helper/helper'; diff --git a/x-pack/plugins/apm/public/components/shared/key_value_filter_list/index.tsx b/x-pack/plugins/apm/public/components/shared/key_value_filter_list/index.tsx index 54d8790c32d33f..d28cc1646f16af 100644 --- a/x-pack/plugins/apm/public/components/shared/key_value_filter_list/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/key_value_filter_list/index.tsx @@ -19,7 +19,6 @@ import { import { i18n } from '@kbn/i18n'; import React, { Fragment } from 'react'; import styled from 'styled-components'; -import { px, units } from '../../../style/variables'; interface KeyValue { key: string; @@ -34,7 +33,8 @@ const StyledEuiAccordion = styled(EuiAccordion)` `; const StyledEuiDescriptionList = styled(EuiDescriptionList)` - margin: ${px(units.half)} ${px(units.half)} 0 ${px(units.half)}; + margin: ${({ theme }) => + `${theme.eui.euiSizeS} ${theme.eui.euiSizeS} 0 ${theme.eui.euiSizeS}`}; .descriptionList__title, .descriptionList__description { border-bottom: ${({ theme }) => theme.eui.euiBorderThin}; diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/ClickOutside.js b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/ClickOutside.js similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/ClickOutside.js rename to x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/ClickOutside.js diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestion.js b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestion.js similarity index 84% rename from x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestion.js rename to x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestion.js index 987daf67b1fc7c..26b99c4e54f656 100644 --- a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestion.js +++ b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestion.js @@ -9,13 +9,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; import { EuiIcon } from '@elastic/eui'; -import { - fontFamilyCode, - px, - units, - fontSizes, - unit, -} from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; import { tint } from 'polished'; function getIconColor(type, theme) { @@ -40,23 +34,23 @@ const Description = euiStyled.div` display: inline; span { - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; color: ${({ theme }) => theme.eui.euiColorFullShade}; - padding: 0 ${px(units.quarter)}; + padding: 0 ${({ theme }) => theme.eui.paddingSizes.xs}; display: inline-block; } } `; const ListItem = euiStyled.li` - font-size: ${fontSizes.small}; - height: ${px(units.double)}; + font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; + height: ${({ theme }) => theme.eui.euiSizeXL}; align-items: center; display: flex; background: ${({ selected, theme }) => selected ? theme.eui.euiColorLightestShade : 'initial'}; cursor: pointer; - border-radius: ${px(units.quarter)}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; ${Description} { p span { @@ -69,19 +63,19 @@ const ListItem = euiStyled.li` `; const Icon = euiStyled.div` - flex: 0 0 ${px(units.double)}; + flex: 0 0 ${({ theme }) => theme.eui.euiSizeXL}; background: ${({ type, theme }) => tint(0.9, getIconColor(type, theme))}; color: ${({ type, theme }) => getIconColor(type, theme)}; width: 100%; height: 100%; text-align: center; - line-height: ${px(units.double)}; + line-height: ${({ theme }) => theme.eui.euiSizeXL}; `; const TextValue = euiStyled.div` - flex: 0 0 ${px(unit * 16)}; + flex: 0 0 ${unit * 16}px; color: ${({ theme }) => theme.eui.euiColorDarkestShade}; - padding: 0 ${px(units.half)}; + padding: 0 ${({ theme }) => theme.eui.paddingSizes.s}; `; function getEuiIconType(type) { diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestions.js b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestions.js similarity index 88% rename from x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestions.js rename to x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestions.js index 405be89c6629ca..386eb7e1e0d7d9 100644 --- a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/Suggestions.js +++ b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/Suggestions.js @@ -5,25 +5,28 @@ * 2.0. */ -import React, { Component } from 'react'; +import { isEmpty } from 'lodash'; +import { tint } from 'polished'; import PropTypes from 'prop-types'; +import React, { Component } from 'react'; import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; -import { isEmpty } from 'lodash'; +import { unit } from '../../../../utils/style'; import Suggestion from './Suggestion'; -import { units, px, unit } from '../../../../style/variables'; -import { tint } from 'polished'; const List = euiStyled.ul` width: 100%; border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - border-radius: ${px(units.quarter)}; - box-shadow: 0px ${px(units.quarter)} ${px(units.double)} - ${({ theme }) => tint(0.9, theme.eui.euiColorFullShade)}; + border-radius: ${({ theme }) => theme.eui.euiBorderRadiusSmall}; + box-shadow: 0 ${({ theme }) => + `${theme.eui.euiSizeXS} ${theme.eui.euiSizeXL} ${tint( + 0.9, + theme.eui.euiColorFullShade + )}`}; position: absolute; background: ${({ theme }) => theme.eui.euiColorEmptyShade}; z-index: 10; left: 0; - max-height: ${px(unit * 20)}; + max-height: ${unit * 20}px; overflow: scroll; `; diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/index.js b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/Typeahead/index.js rename to x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts b/x-pack/plugins/apm/public/components/shared/kuery_bar/get_bool_filter.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/get_bool_filter.ts rename to x-pack/plugins/apm/public/components/shared/kuery_bar/get_bool_filter.ts diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx b/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/index.tsx rename to x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/use_processor_event.ts b/x-pack/plugins/apm/public/components/shared/kuery_bar/use_processor_event.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/use_processor_event.ts rename to x-pack/plugins/apm/public/components/shared/kuery_bar/use_processor_event.ts diff --git a/x-pack/plugins/apm/public/components/shared/KueryBar/utils.ts b/x-pack/plugins/apm/public/components/shared/kuery_bar/utils.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/KueryBar/utils.ts rename to x-pack/plugins/apm/public/components/shared/kuery_bar/utils.ts diff --git a/x-pack/plugins/apm/public/components/shared/ManagedTable/__snapshots__/ManagedTable.test.js.snap b/x-pack/plugins/apm/public/components/shared/managed_table/__snapshots__/managed_table.test.tsx.snap similarity index 90% rename from x-pack/plugins/apm/public/components/shared/ManagedTable/__snapshots__/ManagedTable.test.js.snap rename to x-pack/plugins/apm/public/components/shared/managed_table/__snapshots__/managed_table.test.tsx.snap index 655fc5a25b9ef5..55e0bc0fe24316 100644 --- a/x-pack/plugins/apm/public/components/shared/ManagedTable/__snapshots__/ManagedTable.test.js.snap +++ b/x-pack/plugins/apm/public/components/shared/managed_table/__snapshots__/managed_table.test.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ManagedTable component should render a page-full of items, with defaults 1`] = ` +exports[`ManagedTable should render a page-full of items, with defaults 1`] = ` `; -exports[`ManagedTable component should render when specifying initial values 1`] = ` +exports[`ManagedTable should render when specifying initial values 1`] = ` { field?: string; dataType?: string; align?: string; - width?: string; + width?: string | number; sortable?: boolean; render?: (value: any, item: T) => unknown; } diff --git a/x-pack/plugins/apm/public/components/shared/ManagedTable/ManagedTable.test.js b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx similarity index 54% rename from x-pack/plugins/apm/public/components/shared/ManagedTable/ManagedTable.test.js rename to x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx index ab96eba14b403b..c474d98a3f0d4d 100644 --- a/x-pack/plugins/apm/public/components/shared/ManagedTable/ManagedTable.test.js +++ b/x-pack/plugins/apm/public/components/shared/managed_table/managed_table.test.tsx @@ -7,39 +7,41 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { UnoptimizedManagedTable } from '.'; +import { ITableColumn, UnoptimizedManagedTable } from '.'; -describe('ManagedTable component', () => { - let people; - let columns; +interface Person { + name: string; + age: number; +} - beforeEach(() => { - people = [ - { name: 'Jess', age: 29 }, - { name: 'Becky', age: 43 }, - { name: 'Thomas', age: 31 }, - ]; - columns = [ - { - field: 'name', - name: 'Name', - sortable: true, - render: (name) => `Name: ${name}`, - }, - { field: 'age', name: 'Age', render: (age) => `Age: ${age}` }, - ]; - }); +describe('ManagedTable', () => { + const people: Person[] = [ + { name: 'Jess', age: 29 }, + { name: 'Becky', age: 43 }, + { name: 'Thomas', age: 31 }, + ]; + const columns: Array> = [ + { + field: 'name', + name: 'Name', + sortable: true, + render: (name) => `Name: ${name}`, + }, + { field: 'age', name: 'Age', render: (age) => `Age: ${age}` }, + ]; it('should render a page-full of items, with defaults', () => { expect( - shallow() + shallow( + columns={columns} items={people} /> + ) ).toMatchSnapshot(); }); it('should render when specifying initial values', () => { expect( shallow( - columns={columns} items={people} initialSortField="age" diff --git a/x-pack/plugins/apm/public/components/shared/search_bar.tsx b/x-pack/plugins/apm/public/components/shared/search_bar.tsx index 74374e331ee8e4..4f9e58239855d8 100644 --- a/x-pack/plugins/apm/public/components/shared/search_bar.tsx +++ b/x-pack/plugins/apm/public/components/shared/search_bar.tsx @@ -19,9 +19,8 @@ import { enableInspectEsQueries } from '../../../../observability/public'; import { useApmPluginContext } from '../../context/apm_plugin/use_apm_plugin_context'; import { useKibanaUrl } from '../../hooks/useKibanaUrl'; import { useBreakPoints } from '../../hooks/use_break_points'; -import { px } from '../../style/variables'; import { DatePicker } from './DatePicker'; -import { KueryBar } from './KueryBar'; +import { KueryBar } from './kuery_bar'; import { TimeComparison } from './time_comparison'; import { TransactionTypeSelect } from './transaction_type_select'; @@ -125,7 +124,7 @@ export function SearchBar({ responsive={false} > {showTimeComparison && ( - + )} diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx index 05305558564f13..695c941c61ed4b 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/icon_popover.tsx @@ -14,7 +14,6 @@ import { } from '@elastic/eui'; import React from 'react'; import { FETCH_STATUS } from '../../../hooks/use_fetcher'; -import { px } from '../../../style/variables'; interface IconPopoverProps { title: string; @@ -59,7 +58,7 @@ export function IconPopover({ closePopover={onClose} > {title} -
+
{isLoading ? ( ) : ( diff --git a/x-pack/plugins/apm/public/components/shared/StickyProperties/__snapshots__/StickyProperties.test.js.snap b/x-pack/plugins/apm/public/components/shared/sticky_properties/__snapshots__/sticky_properties.test.tsx.snap similarity index 100% rename from x-pack/plugins/apm/public/components/shared/StickyProperties/__snapshots__/StickyProperties.test.js.snap rename to x-pack/plugins/apm/public/components/shared/sticky_properties/__snapshots__/sticky_properties.test.tsx.snap diff --git a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx b/x-pack/plugins/apm/public/components/shared/sticky_properties/index.tsx similarity index 93% rename from x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx rename to x-pack/plugins/apm/public/components/shared/sticky_properties/index.tsx index ee764db516d721..49488ba09e0683 100644 --- a/x-pack/plugins/apm/public/components/shared/StickyProperties/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/sticky_properties/index.tsx @@ -9,13 +9,7 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { EuiToolTip } from '@elastic/eui'; import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; -import { - fontFamilyCode, - fontSizes, - px, - truncate, - units, -} from '../../../style/variables'; +import { truncate } from '../../../utils/style'; export interface IStickyProperty { val: JSX.Element | string | Date; @@ -26,12 +20,12 @@ export interface IStickyProperty { } const TooltipFieldName = euiStyled.span` - font-family: ${fontFamilyCode}; + font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; const PropertyLabel = euiStyled.div` - margin-bottom: ${px(units.half)}; - font-size: ${fontSizes.small}; + margin-bottom: ${({ theme }) => theme.eui.euiSizeS}; + font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; color: ${({ theme }) => theme.eui.euiColorMediumShade}; span { diff --git a/x-pack/plugins/apm/public/components/shared/StickyProperties/StickyProperties.test.js b/x-pack/plugins/apm/public/components/shared/sticky_properties/sticky_properties.test.tsx similarity index 80% rename from x-pack/plugins/apm/public/components/shared/StickyProperties/StickyProperties.test.js rename to x-pack/plugins/apm/public/components/shared/sticky_properties/sticky_properties.test.tsx index eba70a171a1dfb..d29702752c159b 100644 --- a/x-pack/plugins/apm/public/components/shared/StickyProperties/StickyProperties.test.js +++ b/x-pack/plugins/apm/public/components/shared/sticky_properties/sticky_properties.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { StickyProperties } from './index'; +import { StickyProperties } from '.'; import { shallow } from 'enzyme'; import { USER_ID, URL_FULL } from '../../../../common/elasticsearch_fieldnames'; import { mockMoment } from '../../../utils/testHelpers'; @@ -35,7 +35,7 @@ describe('StickyProperties', () => { { label: 'User ID', fieldName: USER_ID, - val: 1337, + val: '1337', }, ]; @@ -52,7 +52,7 @@ describe('StickyProperties', () => { { label: 'My Number', fieldName: 'myNumber', - val: 1337, + val: '1337', }, ]; @@ -66,25 +66,6 @@ describe('StickyProperties', () => { expect(wrapper).toEqual('1337'); }); - it('should not stringify booleans', () => { - const stickyProperties = [ - { - label: 'My boolean', - fieldName: 'myBoolean', - val: true, - }, - ]; - - const wrapper = shallow( - - ) - .find('PropertyValue') - .dive() - .text(); - - expect(wrapper).toEqual(''); - }); - it('should render nested components', () => { const stickyProperties = [ { diff --git a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx index ed9d1a15cdbcaa..d7dfd3de2b6285 100644 --- a/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/time_comparison/index.tsx @@ -10,13 +10,12 @@ import { i18n } from '@kbn/i18n'; import moment from 'moment'; import React from 'react'; import { useHistory } from 'react-router-dom'; -import { useUiTracker } from '../../../../../observability/public'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; +import { useUiTracker } from '../../../../../observability/public'; import { getDateDifference } from '../../../../common/utils/formatters'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; -import { px, unit } from '../../../style/variables'; -import * as urlHelpers from '../../shared/Links/url_helpers'; import { useBreakPoints } from '../../../hooks/use_break_points'; +import * as urlHelpers from '../../shared/Links/url_helpers'; import { getTimeRangeComparison, TimeRangeComparisonType, @@ -28,7 +27,7 @@ const PrependContainer = euiStyled.div` align-items: center; background-color: ${({ theme }) => theme.eui.euiFormInputGroupLabelBackground}; - padding: 0 ${px(unit)}; + padding: 0 ${({ theme }) => theme.eui.paddingSizes.m}; `; function getDateFormat({ diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.test.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.tsx similarity index 98% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.tsx index b28b364adcf30f..a4f7c2b6634846 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.tsx @@ -22,7 +22,7 @@ import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { useLicenseContext } from '../../../context/license/use_license_context'; import { useUrlParams } from '../../../context/url_params_context/use_url_params'; -import { CustomLinkMenuSection } from './CustomLinkMenuSection'; +import { CustomLinkMenuSection } from './custom_link_menu_section'; import { getSections } from './sections'; interface Props { diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/__fixtures__/mockData.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/__fixtures__/mockData.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/__fixtures__/mockData.ts rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/__fixtures__/mockData.ts diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/__snapshots__/TransactionActionMenu.test.tsx.snap b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/__snapshots__/TransactionActionMenu.test.tsx.snap similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/__snapshots__/TransactionActionMenu.test.tsx.snap rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/__snapshots__/TransactionActionMenu.test.tsx.snap diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkToolbar.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkToolbar.test.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkToolbar.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkToolbar.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.tsx diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.test.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx index c0c4613e033c93..e063fb36b8e9c0 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx @@ -5,15 +5,15 @@ * 2.0. */ -import React from 'react'; import { render } from '@testing-library/react'; -import { CustomLinkList } from './CustomLinkList'; +import React from 'react'; +import { CustomLink } from '../../../../../common/custom_link/custom_link_types'; +import { Transaction } from '../../../../../typings/es_schemas/ui/transaction'; import { expectTextsInDocument, expectTextsNotInDocument, } from '../../../../utils/testHelpers'; -import { Transaction } from '../../../../../typings/es_schemas/ui/transaction'; -import { CustomLink } from '../../../../../common/custom_link/custom_link_types'; +import { CustomLinkList } from './custom_link_list'; describe('CustomLinkList', () => { const customLinks = [ diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.tsx similarity index 89% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.tsx index 02d6dd436040f8..7ea7cd35c443a6 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/CustomLinkList.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.tsx @@ -8,12 +8,12 @@ import Mustache from 'mustache'; import React from 'react'; import { - SectionLinks, SectionLink, + SectionLinks, } from '../../../../../../observability/public'; import { CustomLink } from '../../../../../common/custom_link/custom_link_types'; import { Transaction } from '../../../../../typings/es_schemas/ui/transaction'; -import { px, unit } from '../../../../style/variables'; +import { unit } from '../../../../utils/style'; export function CustomLinkList({ customLinks, @@ -23,7 +23,7 @@ export function CustomLinkList({ transaction: Transaction; }) { return ( - + {customLinks.map((link) => { const href = getHref(link, transaction); return ( diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/index.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/index.test.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/index.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.tsx similarity index 94% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/index.tsx rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.tsx index cbbf34c78c4af6..bc234b88a08e4f 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/CustomLinkMenuSection/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.tsx @@ -5,37 +5,36 @@ * 2.0. */ -import React, { useMemo, useState } from 'react'; import { - EuiText, + EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiSpacer, - EuiButtonEmpty, + EuiText, + EuiToolTip, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isEmpty } from 'lodash'; -import { EuiToolTip } from '@elastic/eui'; -import { NO_PERMISSION_LABEL } from '../../../../../common/custom_link'; -import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; +import React, { useMemo, useState } from 'react'; import { ActionMenuDivider, Section, SectionSubtitle, SectionTitle, } from '../../../../../../observability/public'; -import { Transaction } from '../../../../../typings/es_schemas/ui/transaction'; -import { CustomLinkList } from './CustomLinkList'; -import { CustomLinkToolbar } from './CustomLinkToolbar'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { LoadingStatePrompt } from '../../LoadingStatePrompt'; -import { px } from '../../../../style/variables'; -import { CreateEditCustomLinkFlyout } from '../../../app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout'; -import { convertFiltersToQuery } from '../../../app/Settings/CustomizeUI/CustomLink/CreateEditCustomLinkFlyout/helper'; +import { NO_PERMISSION_LABEL } from '../../../../../common/custom_link'; import { CustomLink, Filter, } from '../../../../../common/custom_link/custom_link_types'; +import { Transaction } from '../../../../../typings/es_schemas/ui/transaction'; +import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; +import { CreateEditCustomLinkFlyout } from '../../../app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout'; +import { convertFiltersToQuery } from '../../../app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper'; +import { LoadingStatePrompt } from '../../LoadingStatePrompt'; +import { CustomLinkToolbar } from './CustomLinkToolbar'; +import { CustomLinkList } from './custom_link_list'; const DEFAULT_LINKS_TO_SHOW = 3; @@ -165,7 +164,7 @@ function BottomSection({ return ( - + {i18n.translate('xpack.apm.customLink.empty', { defaultMessage: 'No custom links found. Set up your own custom links, e.g., a link to a specific Dashboard or external link.', diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/sections.test.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/sections.test.ts rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/sections.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts similarity index 100% rename from x-pack/plugins/apm/public/components/shared/TransactionActionMenu/sections.ts rename to x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.ts diff --git a/x-pack/plugins/apm/public/components/shared/truncate_with_tooltip/index.tsx b/x-pack/plugins/apm/public/components/shared/truncate_with_tooltip/index.tsx index 63e0b84362073d..d9268c14aa2ea3 100644 --- a/x-pack/plugins/apm/public/components/shared/truncate_with_tooltip/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/truncate_with_tooltip/index.tsx @@ -8,7 +8,7 @@ import { EuiToolTip } from '@elastic/eui'; import React from 'react'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; -import { truncate } from '../../../style/variables'; +import { truncate } from '../../../utils/style'; const tooltipAnchorClassname = '_apm_truncate_tooltip_anchor_'; diff --git a/x-pack/plugins/apm/public/style/variables.ts b/x-pack/plugins/apm/public/style/variables.ts deleted file mode 100644 index 07ccf97c0dab06..00000000000000 --- a/x-pack/plugins/apm/public/style/variables.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -// Units -export const unit = 16; - -export const units = { - unit, - eighth: unit / 8, - quarter: unit / 4, - half: unit / 2, - minus: unit * 0.75, - plus: unit * 1.5, - double: unit * 2, - triple: unit * 3, - quadruple: unit * 4, -}; - -export function px(value: number): string { - return `${value}px`; -} - -export function pct(value: number): string { - return `${value}%`; -} - -// Styling -export const borderRadius = '4px'; - -// Fonts -export const fontFamilyCode = - '"Roboto Mono", Consolas, Menlo, Courier, monospace'; - -// Font sizes -export const fontSize = '14px'; - -export const fontSizes = { - tiny: '10px', - small: '12px', - large: '16px', - xlarge: '20px', - xxlarge: '30px', -}; - -export function truncate(width: string) { - return ` - max-width: ${width}; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - `; -} diff --git a/x-pack/plugins/apm/public/utils/style.ts b/x-pack/plugins/apm/public/utils/style.ts new file mode 100644 index 00000000000000..3c8aa5d339c6e9 --- /dev/null +++ b/x-pack/plugins/apm/public/utils/style.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const unit = 16; + +export function truncate(width: string | number) { + return ` + max-width: ${typeof width === 'string' ? width : `${width}px`}; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + `; +} From 6e740407841a92e833bd1feb9a0a96eb2756e8f1 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Thu, 1 Jul 2021 14:33:04 -0600 Subject: [PATCH 31/43] Fixes pipe I did incorrectly (#104162) ## Summary Fixes a Cypress pipe where I was not using the correct selector and methodology. I now use the check boxes for disable-all for the test. ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../timelines/row_renderers.spec.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timelines/row_renderers.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timelines/row_renderers.spec.ts index 77a1775494e6a1..c3e04aaaf6a1f9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timelines/row_renderers.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timelines/row_renderers.spec.ts @@ -78,10 +78,22 @@ describe('Row renderers', () => { }); it('Selected renderer can be disabled with one click', () => { + // Ensure these elements are visible before continuing since sometimes it takes a second for the modal to show up + // and it gives the click handlers a bit of time to be initialized as well to reduce chances of flake but you still + // have to use pipe() below as an additional measure. cy.get(TIMELINE_ROW_RENDERERS_DISABLE_ALL_BTN).should('exist'); - cy.get(TIMELINE_ROW_RENDERERS_DISABLE_ALL_BTN) - .pipe(($el) => $el.trigger('click')) - .should('not.be.visible'); + cy.get(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).should('be.checked'); + + // Keep clicking on the disable all button until the first element of all the elements are no longer checked. + // In cases where the click handler is not present on the page just yet, this will cause the button to be clicked + // multiple times until it sees that the click took effect. You could go through the whole list but I just check + // for the first to be unchecked and then assume the click was successful + cy.root() + .pipe(($el) => { + $el.find(TIMELINE_ROW_RENDERERS_DISABLE_ALL_BTN).trigger('click'); + return $el.find(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).first(); + }) + .should('not.be.checked'); cy.intercept('PATCH', '/api/timeline').as('updateTimeline'); cy.wait('@updateTimeline').its('response.statusCode').should('eq', 200); From 975e361d502c9c23a9d64fdf99a43407bf7955e8 Mon Sep 17 00:00:00 2001 From: Michael Dokolin Date: Thu, 1 Jul 2021 22:48:47 +0200 Subject: [PATCH 32/43] [Expressions] Update expressions public API to expose partial results support (#102403) * Add partial result flag to the execution result * Update expressions plugin run method to return observable * Update data getter in the execution contract to return observable * Update the expression loader to take into account the partial results flag --- ...-expressions-public.execution.interpret.md | 4 +- ...in-plugins-expressions-public.execution.md | 4 +- ...ins-expressions-public.execution.result.md | 2 +- ...gins-expressions-public.execution.start.md | 4 +- ...gins-expressions-public.execution.state.md | 2 +- ...ssions-public.executioncontract.getdata.md | 2 +- ...ns-expressions-public.executioncontract.md | 2 +- ...plugins-expressions-public.executor.run.md | 4 +- ...ressions-public.expressionsservicestart.md | 2 +- ...ions-public.expressionsservicestart.run.md | 2 +- ...ressions-public.iexpressionloaderparams.md | 1 + ...-public.iexpressionloaderparams.partial.md | 11 + ...ons-public.reactexpressionrendererprops.md | 2 +- ...ic.reactexpressionrendererprops.ondata_.md | 2 +- ...-expressions-server.execution.interpret.md | 4 +- ...in-plugins-expressions-server.execution.md | 4 +- ...ins-expressions-server.execution.result.md | 2 +- ...gins-expressions-server.execution.start.md | 4 +- ...gins-expressions-server.execution.state.md | 2 +- ...plugins-expressions-server.executor.run.md | 4 +- .../public/run_expressions.tsx | 19 +- .../execution/execution.abortion.test.ts | 13 +- .../common/execution/execution.test.ts | 235 +++++++++--------- .../expressions/common/execution/execution.ts | 78 ++++-- .../execution/execution_contract.test.ts | 17 +- .../common/execution/execution_contract.ts | 24 +- .../expressions/common/executor/executor.ts | 4 +- .../specs/tests/var_set.test.ts | 2 +- .../service/expressions_services.test.ts | 2 +- .../common/service/expressions_services.ts | 10 +- src/plugins/expressions/public/loader.test.ts | 26 +- src/plugins/expressions/public/loader.ts | 60 ++--- src/plugins/expressions/public/plugin.test.ts | 6 +- src/plugins/expressions/public/public.api.md | 19 +- .../public/react_expression_renderer.test.tsx | 6 +- .../public/react_expression_renderer.tsx | 10 +- src/plugins/expressions/public/types/index.ts | 1 + src/plugins/expressions/server/plugin.test.ts | 6 +- src/plugins/expressions/server/server.api.md | 11 +- .../components/vis_editor_visualization.js | 5 +- .../public/app/components/main.tsx | 6 +- .../kbn_tp_run_pipeline/server/plugin.ts | 12 +- .../canvas/public/lib/run_interpreter.ts | 15 +- 43 files changed, 370 insertions(+), 281 deletions(-) create mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.interpret.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.interpret.md index 46934e119aee09..434f2660e7eff3 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.interpret.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.interpret.md @@ -7,7 +7,7 @@ Signature: ```typescript -interpret(ast: ExpressionAstNode, input: T): Observable; +interpret(ast: ExpressionAstNode, input: T): Observable>; ``` ## Parameters @@ -19,5 +19,5 @@ interpret(ast: ExpressionAstNode, input: T): Observable; Returns: -`Observable` +`Observable>` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md index 30fe9f497f7eeb..edaf1c9a9ce9eb 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.md @@ -26,8 +26,8 @@ export declare class Executionstring | | | [input](./kibana-plugin-plugins-expressions-public.execution.input.md) | | Input | Initial input of the execution.N.B. It is initialized to null rather than undefined for legacy reasons, because in legacy interpreter it was set to null by default. | | [inspectorAdapters](./kibana-plugin-plugins-expressions-public.execution.inspectoradapters.md) | | InspectorAdapters | | -| [result](./kibana-plugin-plugins-expressions-public.execution.result.md) | | Observable<Output | ExpressionValueError> | Future that tracks result or error of this execution. | -| [state](./kibana-plugin-plugins-expressions-public.execution.state.md) | | ExecutionContainer<Output | ExpressionValueError> | Dynamic state of the execution. | +| [result](./kibana-plugin-plugins-expressions-public.execution.result.md) | | Observable<ExecutionResult<Output | ExpressionValueError>> | Future that tracks result or error of this execution. | +| [state](./kibana-plugin-plugins-expressions-public.execution.state.md) | | ExecutionContainer<ExecutionResult<Output | ExpressionValueError>> | Dynamic state of the execution. | ## Methods diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.result.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.result.md index 94f60ccee0f009..a386302a62805e 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.result.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.result.md @@ -9,5 +9,5 @@ Future that tracks result or error of this execution. Signature: ```typescript -readonly result: Observable; +readonly result: Observable>; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.start.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.start.md index 64cf81b376948a..352226da6d72ad 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.start.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.start.md @@ -11,7 +11,7 @@ N.B. `input` is initialized to `null` rather than `undefined` for legacy reasons Signature: ```typescript -start(input?: Input): Observable; +start(input?: Input): Observable>; ``` ## Parameters @@ -22,5 +22,5 @@ start(input?: Input): Observable; Returns: -`Observable` +`Observable>` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.state.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.state.md index ca8b57b760f291..61aa0cf4c5b5dc 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.state.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.execution.state.md @@ -9,5 +9,5 @@ Dynamic state of the execution. Signature: ```typescript -readonly state: ExecutionContainer; +readonly state: ExecutionContainer>; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.getdata.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.getdata.md index dcd96cf5767bf7..852e1f58cc6f3b 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.getdata.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.getdata.md @@ -9,5 +9,5 @@ Returns the final output of expression, if any error happens still wraps that er Signature: ```typescript -getData: () => Promise; +getData: () => Observable>; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.md index f2c050bbfe0ba2..0ac776e4be2b84 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontract.md @@ -25,7 +25,7 @@ export declare class ExecutionContract() => void | Cancel the execution of the expression. This will set abort signal (available in execution context) to aborted state, letting expression functions to stop their execution. | | [execution](./kibana-plugin-plugins-expressions-public.executioncontract.execution.md) | | Execution<Input, Output, InspectorAdapters> | | | [getAst](./kibana-plugin-plugins-expressions-public.executioncontract.getast.md) | | () => ExpressionAstExpression | Get AST used to execute the expression. | -| [getData](./kibana-plugin-plugins-expressions-public.executioncontract.getdata.md) | | () => Promise<Output | ExpressionValueError> | Returns the final output of expression, if any error happens still wraps that error into ExpressionValueError type and returns that. This function never throws. | +| [getData](./kibana-plugin-plugins-expressions-public.executioncontract.getdata.md) | | () => Observable<ExecutionResult<Output | ExpressionValueError>> | Returns the final output of expression, if any error happens still wraps that error into ExpressionValueError type and returns that. This function never throws. | | [getExpression](./kibana-plugin-plugins-expressions-public.executioncontract.getexpression.md) | | () => string | Get string representation of the expression. Returns the original string if execution was started from a string. If execution was started from an AST this method returns a string generated from AST. | | [inspect](./kibana-plugin-plugins-expressions-public.executioncontract.inspect.md) | | () => InspectorAdapters | Get Inspector adapters provided to all functions of expression through execution context. | | [isPending](./kibana-plugin-plugins-expressions-public.executioncontract.ispending.md) | | boolean | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.run.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.run.md index 307e6b6bcd5c80..4eefc63d714d19 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.run.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executor.run.md @@ -9,7 +9,7 @@ Execute expression and return result. Signature: ```typescript -run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable; +run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable>; ``` ## Parameters @@ -22,5 +22,5 @@ run(ast: string | ExpressionAstExpression, input: Input, params?: Returns: -`Observable` +`Observable>` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.md index 6b678fc4fbc264..9821f0f921e4d2 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.md @@ -21,7 +21,7 @@ export interface ExpressionsServiceStart | [getFunction](./kibana-plugin-plugins-expressions-public.expressionsservicestart.getfunction.md) | (name: string) => ReturnType<Executor['getFunction']> | Get a registered ExpressionFunction by its name, which was registered using the registerFunction method. The returned ExpressionFunction instance is an internal representation of the function in Expressions service - do not mutate that object. | | [getRenderer](./kibana-plugin-plugins-expressions-public.expressionsservicestart.getrenderer.md) | (name: string) => ReturnType<ExpressionRendererRegistry['get']> | Get a registered ExpressionRenderer by its name, which was registered using the registerRenderer method. The returned ExpressionRenderer instance is an internal representation of the renderer in Expressions service - do not mutate that object. | | [getType](./kibana-plugin-plugins-expressions-public.expressionsservicestart.gettype.md) | (name: string) => ReturnType<Executor['getType']> | Get a registered ExpressionType by its name, which was registered using the registerType method. The returned ExpressionType instance is an internal representation of the type in Expressions service - do not mutate that object. | -| [run](./kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md) | <Input, Output>(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Promise<Output> | Executes expression string or a parsed expression AST and immediately returns the result.Below example will execute sleep 100 | clog expression with 123 initial input to the first function. +| [run](./kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md) | <Input, Output>(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Observable<ExecutionResult<Output | ExpressionValueError>> | Executes expression string or a parsed expression AST and immediately returns the result.Below example will execute sleep 100 | clog expression with 123 initial input to the first function. ```ts expressions.run('sleep 100 | clog', 123); diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md index 9efca0011174cc..0838d640d54e45 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.expressionsservicestart.run.md @@ -24,5 +24,5 @@ expressions.run('...', null, { elasticsearchClient }); Signature: ```typescript -run: (ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Promise; +run: (ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Observable>; ``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md index 4ef1225ae0d7e3..69f9d380422b66 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md @@ -22,6 +22,7 @@ export interface IExpressionLoaderParams | [hasCompatibleActions](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.hascompatibleactions.md) | ExpressionRenderHandlerParams['hasCompatibleActions'] | | | [inspectorAdapters](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.inspectoradapters.md) | Adapters | | | [onRenderError](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.onrendererror.md) | RenderErrorHandlerFnType | | +| [partial](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md) | boolean | | | [renderMode](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.rendermode.md) | RenderMode | | | [searchContext](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.searchcontext.md) | SerializableState | | | [searchSessionId](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.searchsessionid.md) | string | | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md new file mode 100644 index 00000000000000..84c42c3f59f26d --- /dev/null +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [IExpressionLoaderParams](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.md) > [partial](./kibana-plugin-plugins-expressions-public.iexpressionloaderparams.partial.md) + +## IExpressionLoaderParams.partial property + +Signature: + +```typescript +partial?: boolean; +``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md index 92ea071b23dfce..d38027753a6ff4 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.md @@ -18,7 +18,7 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams | [dataAttrs](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.dataattrs.md) | string[] | | | [debounce](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.debounce.md) | number | | | [expression](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.expression.md) | string | ExpressionAstExpression | | -| [onData$](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md) | <TData, TInspectorAdapters>(data: TData, adapters?: TInspectorAdapters) => void | | +| [onData$](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md) | <TData, TInspectorAdapters>(data: TData, adapters?: TInspectorAdapters, partial?: boolean) => void | | | [onEvent](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.onevent.md) | (event: ExpressionRendererEvent) => void | | | [padding](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.padding.md) | 'xs' | 's' | 'm' | 'l' | 'xl' | | | [reload$](./kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.reload_.md) | Observable<unknown> | An observable which can be used to re-run the expression without destroying the component | diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md index 05ddb0b13a5bee..47559d0f7653c6 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.reactexpressionrendererprops.ondata_.md @@ -7,5 +7,5 @@ Signature: ```typescript -onData$?: (data: TData, adapters?: TInspectorAdapters) => void; +onData$?: (data: TData, adapters?: TInspectorAdapters, partial?: boolean) => void; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.interpret.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.interpret.md index 936e98be589a35..99804dd20841d5 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.interpret.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.interpret.md @@ -7,7 +7,7 @@ Signature: ```typescript -interpret(ast: ExpressionAstNode, input: T): Observable; +interpret(ast: ExpressionAstNode, input: T): Observable>; ``` ## Parameters @@ -19,5 +19,5 @@ interpret(ast: ExpressionAstNode, input: T): Observable; Returns: -`Observable` +`Observable>` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.md index a4e324eef6674c..47963e5e5ef46f 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.md @@ -26,8 +26,8 @@ export declare class Executionstring | | | [input](./kibana-plugin-plugins-expressions-server.execution.input.md) | | Input | Initial input of the execution.N.B. It is initialized to null rather than undefined for legacy reasons, because in legacy interpreter it was set to null by default. | | [inspectorAdapters](./kibana-plugin-plugins-expressions-server.execution.inspectoradapters.md) | | InspectorAdapters | | -| [result](./kibana-plugin-plugins-expressions-server.execution.result.md) | | Observable<Output | ExpressionValueError> | Future that tracks result or error of this execution. | -| [state](./kibana-plugin-plugins-expressions-server.execution.state.md) | | ExecutionContainer<Output | ExpressionValueError> | Dynamic state of the execution. | +| [result](./kibana-plugin-plugins-expressions-server.execution.result.md) | | Observable<ExecutionResult<Output | ExpressionValueError>> | Future that tracks result or error of this execution. | +| [state](./kibana-plugin-plugins-expressions-server.execution.state.md) | | ExecutionContainer<ExecutionResult<Output | ExpressionValueError>> | Dynamic state of the execution. | ## Methods diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.result.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.result.md index 06cf047ac4160f..b3baac5be2fa33 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.result.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.result.md @@ -9,5 +9,5 @@ Future that tracks result or error of this execution. Signature: ```typescript -readonly result: Observable; +readonly result: Observable>; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.start.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.start.md index dd0456ac09950e..0eef7013cb3c61 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.start.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.start.md @@ -11,7 +11,7 @@ N.B. `input` is initialized to `null` rather than `undefined` for legacy reasons Signature: ```typescript -start(input?: Input): Observable; +start(input?: Input): Observable>; ``` ## Parameters @@ -22,5 +22,5 @@ start(input?: Input): Observable; Returns: -`Observable` +`Observable>` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.state.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.state.md index 41e7e693a1da44..b7c26e9dee85af 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.state.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.execution.state.md @@ -9,5 +9,5 @@ Dynamic state of the execution. Signature: ```typescript -readonly state: ExecutionContainer; +readonly state: ExecutionContainer>; ``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.run.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.run.md index 2ab534eac2f3a2..7b169d05dc31da 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.run.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executor.run.md @@ -9,7 +9,7 @@ Execute expression and return result. Signature: ```typescript -run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable; +run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable>; ``` ## Parameters @@ -22,5 +22,5 @@ run(ast: string | ExpressionAstExpression, input: Input, params?: Returns: -`Observable` +`Observable>` diff --git a/examples/expressions_explorer/public/run_expressions.tsx b/examples/expressions_explorer/public/run_expressions.tsx index 05749a0e897351..a635fab7ec8ae9 100644 --- a/examples/expressions_explorer/public/run_expressions.tsx +++ b/examples/expressions_explorer/public/run_expressions.tsx @@ -7,6 +7,7 @@ */ import React, { useState, useEffect, useMemo } from 'react'; +import { pluck } from 'rxjs/operators'; import { EuiCodeBlock, EuiFlexItem, @@ -35,7 +36,7 @@ interface Props { export function RunExpressionsExample({ expressions, inspector }: Props) { const [expression, updateExpression] = useState('markdown "## expressions explorer"'); - const [result, updateResult] = useState({}); + const [result, updateResult] = useState({}); const expressionChanged = (value: string) => { updateExpression(value); @@ -49,17 +50,13 @@ export function RunExpressionsExample({ expressions, inspector }: Props) { ); useEffect(() => { - const runExpression = async () => { - const execution = expressions.execute(expression, null, { - debug: true, - inspectorAdapters, - }); + const execution = expressions.execute(expression, null, { + debug: true, + inspectorAdapters, + }); + const subscription = execution.getData().pipe(pluck('result')).subscribe(updateResult); - const data: any = await execution.getData(); - updateResult(data); - }; - - runExpression(); + return () => subscription.unsubscribe(); }, [expression, expressions, inspectorAdapters]); return ( diff --git a/src/plugins/expressions/common/execution/execution.abortion.test.ts b/src/plugins/expressions/common/execution/execution.abortion.test.ts index 514086e9b19eee..798558ba7ffb6e 100644 --- a/src/plugins/expressions/common/execution/execution.abortion.test.ts +++ b/src/plugins/expressions/common/execution/execution.abortion.test.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { first } from 'rxjs/operators'; import { waitFor } from '@testing-library/react'; import { Execution } from './execution'; import { parseExpression } from '../ast'; @@ -40,9 +39,9 @@ describe('Execution abortion tests', () => { execution.start(); execution.cancel(); - const result = await execution.result.pipe(first()).toPromise(); + const result = await execution.result.toPromise(); - expect(result).toMatchObject({ + expect(result).toHaveProperty('result', { type: 'error', error: { message: 'The expression was aborted.', @@ -58,9 +57,9 @@ describe('Execution abortion tests', () => { jest.advanceTimersByTime(100); execution.cancel(); - const result = await execution.result.pipe(first()).toPromise(); + const result = await execution.result.toPromise(); - expect(result).toMatchObject({ + expect(result).toHaveProperty('result', { type: 'error', error: { message: 'The expression was aborted.', @@ -76,7 +75,7 @@ describe('Execution abortion tests', () => { execution.start(); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); execution.cancel(); @@ -136,7 +135,7 @@ describe('Execution abortion tests', () => { await waitFor(() => expect(started).toHaveBeenCalledTimes(1)); execution.cancel(); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toMatchObject({ type: 'error', error: { diff --git a/src/plugins/expressions/common/execution/execution.test.ts b/src/plugins/expressions/common/execution/execution.test.ts index feff425cc48edd..8c6f457105d426 100644 --- a/src/plugins/expressions/common/execution/execution.test.ts +++ b/src/plugins/expressions/common/execution/execution.test.ts @@ -7,7 +7,7 @@ */ import { of } from 'rxjs'; -import { first, scan } from 'rxjs/operators'; +import { scan } from 'rxjs/operators'; import { TestScheduler } from 'rxjs/testing'; import { Execution } from './execution'; import { parseExpression, ExpressionAstExpression } from '../ast'; @@ -45,7 +45,7 @@ const run = async ( ) => { const execution = createExecution(expression, context); execution.start(input); - return await execution.result.pipe(first()).toPromise(); + return await execution.result.toPromise(); }; let testScheduler: TestScheduler; @@ -84,7 +84,7 @@ describe('Execution', () => { /* eslint-enable no-console */ execution.start(123); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toBe(123); expect(spy).toHaveBeenCalledTimes(1); @@ -102,7 +102,7 @@ describe('Execution', () => { value: -1, }); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -117,7 +117,7 @@ describe('Execution', () => { value: 0, }); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -131,7 +131,7 @@ describe('Execution', () => { // Below 1 is cast to { type: 'num', value: 1 }. execution.start(1); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -143,7 +143,7 @@ describe('Execution', () => { const execution = createExecution('add val=1'); execution.start(Promise.resolve(1)); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -155,7 +155,7 @@ describe('Execution', () => { const execution = createExecution('add val=1'); execution.start(of(1)); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -167,14 +167,14 @@ describe('Execution', () => { const execution = createExecution('add val=1'); testScheduler.run(({ cold, expectObservable }) => { - const input = cold(' -a--b-c-', { a: 1, b: 2, c: 3 }); + const input = cold(' -a--b-c|', { a: 1, b: 2, c: 3 }); const subscription = ' ---^---!'; - const expected = ' ---ab-c-'; + const expected = ' ---ab-c|'; expectObservable(execution.start(input), subscription).toBe(expected, { - a: { type: 'num', value: 2 }, - b: { type: 'num', value: 3 }, - c: { type: 'num', value: 4 }, + a: { partial: false, result: { type: 'num', value: 2 } }, + b: { partial: false, result: { type: 'num', value: 3 } }, + c: { partial: false, result: { type: 'num', value: 4 } }, }); }); }); @@ -187,21 +187,21 @@ describe('Execution', () => { const expected = ' -a-#'; expectObservable(execution.start(input)).toBe(expected, { - a: { type: 'num', value: 2 }, + a: { partial: false, result: { type: 'num', value: 2 } }, }); }); }); - test('does not complete when input completes', () => { + test('completes when input completes', () => { const execution = createExecution('add val=1'); testScheduler.run(({ cold, expectObservable }) => { const input = cold('-a-b|', { a: 1, b: 2 }); - const expected = ' -a-b-'; + const expected = ' -a-b|'; expectObservable(execution.start(input)).toBe(expected, { - a: { type: 'num', value: 2 }, - b: { type: 'num', value: 3 }, + a: expect.objectContaining({ result: { type: 'num', value: 2 } }), + b: expect.objectContaining({ result: { type: 'num', value: 3 } }), }); }); }); @@ -216,9 +216,9 @@ describe('Execution', () => { const input = items.pipe(scan((result, value) => [...result, value], new Array())); expectObservable(execution.start(input), subscription).toBe(expected, { - a: { type: 'num', value: 1 }, - b: { type: 'num', value: 3 }, - c: { type: 'num', value: 6 }, + a: { partial: false, result: { type: 'num', value: 1 } }, + b: { partial: false, result: { type: 'num', value: 3 } }, + c: { partial: false, result: { type: 'num', value: 6 } }, }); }); }); @@ -263,44 +263,51 @@ describe('Execution', () => { describe('execution context', () => { test('context.variables is an object', async () => { const { result } = (await run('introspectContext key="variables"')) as any; - expect(typeof result).toBe('object'); + + expect(result).toHaveProperty('result', expect.any(Object)); }); test('context.types is an object', async () => { const { result } = (await run('introspectContext key="types"')) as any; - expect(typeof result).toBe('object'); + + expect(result).toHaveProperty('result', expect.any(Object)); }); test('context.abortSignal is an object', async () => { const { result } = (await run('introspectContext key="abortSignal"')) as any; - expect(typeof result).toBe('object'); + + expect(result).toHaveProperty('result', expect.any(Object)); }); test('context.inspectorAdapters is an object', async () => { const { result } = (await run('introspectContext key="inspectorAdapters"')) as any; - expect(typeof result).toBe('object'); + + expect(result).toHaveProperty('result', expect.any(Object)); }); test('context.getKibanaRequest is a function if provided', async () => { const { result } = (await run('introspectContext key="getKibanaRequest"', { kibanaRequest: {}, })) as any; - expect(typeof result).toBe('function'); + + expect(result).toHaveProperty('result', expect.any(Function)); }); test('context.getKibanaRequest is undefined if not provided', async () => { const { result } = (await run('introspectContext key="getKibanaRequest"')) as any; - expect(typeof result).toBe('undefined'); + + expect(result).toHaveProperty('result', undefined); }); test('unknown context key is undefined', async () => { const { result } = (await run('introspectContext key="foo"')) as any; - expect(typeof result).toBe('undefined'); + + expect(result).toHaveProperty('result', undefined); }); test('can set context variables', async () => { const variables = { foo: 'bar' }; - const result = await run('var name="foo"', { variables }); + const { result } = await run('var name="foo"', { variables }); expect(result).toBe('bar'); }); }); @@ -308,10 +315,13 @@ describe('Execution', () => { describe('inspector adapters', () => { test('by default, "tables" and "requests" inspector adapters are available', async () => { const { result } = (await run('introspectContext key="inspectorAdapters"')) as any; - expect(result).toMatchObject({ - tables: expect.any(Object), - requests: expect.any(Object), - }); + expect(result).toHaveProperty( + 'result', + expect.objectContaining({ + tables: expect.any(Object), + requests: expect.any(Object), + }) + ); }); test('can set custom inspector adapters', async () => { @@ -319,7 +329,7 @@ describe('Execution', () => { const { result } = (await run('introspectContext key="inspectorAdapters"', { inspectorAdapters, })) as any; - expect(result).toBe(inspectorAdapters); + expect(result).toHaveProperty('result', inspectorAdapters); }); test('can access custom inspector adapters on Execution object', async () => { @@ -335,8 +345,7 @@ describe('Execution', () => { test('context has abortSignal object', async () => { const { result } = (await run('introspectContext key="abortSignal"')) as any; - expect(typeof result).toBe('object'); - expect((result as AbortSignal).aborted).toBe(false); + expect(result).toHaveProperty('result.aborted', false); }); }); @@ -348,7 +357,7 @@ describe('Execution', () => { value: 0, }); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -357,8 +366,8 @@ describe('Execution', () => { }); test('can execute async functions', async () => { - const res = await run('sleep 10 | sleep 10'); - expect(res).toBe(null); + const { result } = await run('sleep 10 | sleep 10'); + expect(result).toBe(null); }); test('result is undefined until execution completes', async () => { @@ -374,7 +383,7 @@ describe('Execution', () => { jest.advanceTimersByTime(10); await new Promise(process.nextTick); - expect(execution.state.get().result).toBe(null); + expect(execution.state.get().result).toHaveProperty('result', null); jest.useRealTimers(); }); @@ -382,7 +391,7 @@ describe('Execution', () => { test('handles functions returning observables', () => { testScheduler.run(({ cold, expectObservable }) => { const arg = cold(' -a-b-c|', { a: 1, b: 2, c: 3 }); - const expected = ' -a-b-c-'; + const expected = ' -a-b-c|'; const observable: ExpressionFunctionDefinition<'observable', any, {}, any> = { name: 'observable', args: {}, @@ -394,14 +403,18 @@ describe('Execution', () => { const result = executor.run('observable', null, {}); - expectObservable(result).toBe(expected, { a: 1, b: 2, c: 3 }); + expectObservable(result).toBe(expected, { + a: { result: 1, partial: true }, + b: { result: 2, partial: true }, + c: { result: 3, partial: false }, + }); }); }); }); describe('when function throws', () => { test('error is reported in output object', async () => { - const result = await run('error "foobar"'); + const { result } = await run('error "foobar"'); expect(result).toMatchObject({ type: 'error', @@ -409,7 +422,7 @@ describe('Execution', () => { }); test('error message is prefixed with function name', async () => { - const result = await run('error "foobar"'); + const { result } = await run('error "foobar"'); expect(result).toMatchObject({ error: { @@ -419,7 +432,7 @@ describe('Execution', () => { }); test('returns error of the first function that throws', async () => { - const result = await run('error "foo" | error "bar"'); + const { result } = await run('error "foo" | error "bar"'); expect(result).toMatchObject({ error: { @@ -432,15 +445,18 @@ describe('Execution', () => { const execution = await createExecution('error "foo"'); execution.start(null); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toMatchObject({ type: 'error', }); expect(execution.state.get().state).toBe('result'); - expect(execution.state.get().result).toMatchObject({ - type: 'error', - }); + expect(execution.state.get().result).toHaveProperty( + 'result', + expect.objectContaining({ + type: 'error', + }) + ); }); test('does not execute remaining functions in pipeline', async () => { @@ -453,7 +469,7 @@ describe('Execution', () => { const executor = createUnitTestExecutor(); executor.registerFunction(spy); - await executor.run('error "..." | spy', null).pipe(first()).toPromise(); + await executor.run('error "..." | spy', null).toPromise(); expect(spy.fn).toHaveBeenCalledTimes(0); }); @@ -483,21 +499,21 @@ describe('Execution', () => { test('execution state is "result" when execution successfully completes', async () => { const execution = createExecution('sleep 1'); execution.start(null); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); expect(execution.state.get().state).toBe('result'); }); test('execution state is "result" when execution successfully completes - 2', async () => { const execution = createExecution('var foo'); execution.start(null); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); expect(execution.state.get().state).toBe('result'); }); }); describe('sub-expressions', () => { test('executes sub-expressions', async () => { - const result = await run('add val={add 5 | access "value"}', {}, null); + const { result } = await run('add val={add 5 | access "value"}', {}, null); expect(result).toMatchObject({ type: 'num', @@ -506,7 +522,7 @@ describe('Execution', () => { }); test('can use global variables', async () => { - const result = await run( + const { result } = await run( 'add val={var foo}', { variables: { @@ -523,7 +539,7 @@ describe('Execution', () => { }); test('can modify global variables', async () => { - const result = await run( + const { result } = await run( 'add val={var_set name=foo value=66 | var bar} | var foo', { variables: { @@ -547,18 +563,20 @@ describe('Execution', () => { const executor = createUnitTestExecutor(); executor.registerFunction(observable); - expect( - executor.run('add val={observable}', 1, {}).pipe(first()).toPromise() - ).resolves.toEqual({ - type: 'num', - value: 2, - }); + expect(executor.run('add val={observable}', 1, {}).toPromise()).resolves.toEqual( + expect.objectContaining({ + result: { + type: 'num', + value: 2, + }, + }) + ); }); test('supports observables in arguments emitting multiple values', () => { testScheduler.run(({ cold, expectObservable }) => { - const arg = cold('-a-b-c-', { a: 1, b: 2, c: 3 }); - const expected = '-a-b-c-'; + const arg = cold('-a-b-c|', { a: 1, b: 2, c: 3 }); + const expected = '-a-b-c|'; const observable = { name: 'observable', args: {}, @@ -571,18 +589,18 @@ describe('Execution', () => { const result = executor.run('add val={observable}', 1, {}); expectObservable(result).toBe(expected, { - a: { type: 'num', value: 2 }, - b: { type: 'num', value: 3 }, - c: { type: 'num', value: 4 }, + a: { partial: true, result: { type: 'num', value: 2 } }, + b: { partial: true, result: { type: 'num', value: 3 } }, + c: { partial: false, result: { type: 'num', value: 4 } }, }); }); }); test('combines multiple observables in arguments', () => { testScheduler.run(({ cold, expectObservable }) => { - const arg1 = cold('--ab-c-', { a: 0, b: 2, c: 4 }); - const arg2 = cold('-a--bc-', { a: 1, b: 3, c: 5 }); - const expected = ' --abc(de)-'; + const arg1 = cold('--ab-c---|', { a: 0, b: 2, c: 4 }); + const arg2 = cold('-a--bc---|', { a: 1, b: 3, c: 5 }); + const expected = ' --abc(de)|'; const observable1 = { name: 'observable1', args: {}, @@ -612,32 +630,11 @@ describe('Execution', () => { const result = executor.run('max val1={observable1} val2={observable2}', {}); expectObservable(result).toBe(expected, { - a: { type: 'num', value: 1 }, - b: { type: 'num', value: 2 }, - c: { type: 'num', value: 3 }, - d: { type: 'num', value: 4 }, - e: { type: 'num', value: 5 }, - }); - }); - }); - - test('does not complete when an argument completes', () => { - testScheduler.run(({ cold, expectObservable }) => { - const arg = cold('-a|', { a: 1 }); - const expected = '-a-'; - const observable = { - name: 'observable', - args: {}, - help: '', - fn: () => arg, - }; - const executor = createUnitTestExecutor(); - executor.registerFunction(observable); - - const result = executor.run('add val={observable}', 1, {}); - - expectObservable(result).toBe(expected, { - a: { type: 'num', value: 2 }, + a: { partial: true, result: { type: 'num', value: 1 } }, + b: { partial: true, result: { type: 'num', value: 2 } }, + c: { partial: true, result: { type: 'num', value: 3 } }, + d: { partial: true, result: { type: 'num', value: 4 } }, + e: { partial: false, result: { type: 'num', value: 5 } }, }); }); }); @@ -645,7 +642,7 @@ describe('Execution', () => { test('handles error in observable arguments', () => { testScheduler.run(({ cold, expectObservable }) => { const arg = cold('-a-#', { a: 1 }, new Error('some error')); - const expected = '-a-b'; + const expected = '-a-(b|)'; const observable = { name: 'observable', args: {}, @@ -658,13 +655,15 @@ describe('Execution', () => { const result = executor.run('add val={observable}', 1, {}); expectObservable(result).toBe(expected, { - a: { type: 'num', value: 2 }, - b: { - error: expect.objectContaining({ - message: '[add] > [observable] > some error', - }), - type: 'error', - }, + a: expect.objectContaining({ result: { type: 'num', value: 2 } }), + b: expect.objectContaining({ + result: { + error: expect.objectContaining({ + message: '[add] > [observable] > some error', + }), + type: 'error', + }, + }), }); }); }); @@ -685,7 +684,7 @@ describe('Execution', () => { }; const executor = createUnitTestExecutor(); executor.registerFunction(requiredArg); - const result = await executor.run('requiredArg', null, {}).pipe(first()).toPromise(); + const { result } = await executor.run('requiredArg', null, {}).toPromise(); expect(result).toMatchObject({ type: 'error', @@ -696,7 +695,7 @@ describe('Execution', () => { }); test('when required argument is missing and has alias, returns error', async () => { - const result = await run('var_set', {}); + const { result } = await run('var_set', {}); expect(result).toMatchObject({ type: 'error', @@ -711,7 +710,7 @@ describe('Execution', () => { test('can execute expression in debug mode', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -726,7 +725,7 @@ describe('Execution', () => { true ); execution.start(0); - const result = await execution.result.pipe(first()).toPromise(); + const { result } = await execution.result.toPromise(); expect(result).toEqual({ type: 'num', @@ -738,7 +737,7 @@ describe('Execution', () => { test('sets "success" flag on all functions to true', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); for (const node of execution.state.get().ast.chain) { expect(node.debug?.success).toBe(true); @@ -748,7 +747,7 @@ describe('Execution', () => { test('stores "fn" reference to the function', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); for (const node of execution.state.get().ast.chain) { expect(node.debug?.fn).toBe('add'); @@ -758,7 +757,7 @@ describe('Execution', () => { test('saves duration it took to execute each function', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); for (const node of execution.state.get().ast.chain) { expect(typeof node.debug?.duration).toBe('number'); @@ -770,7 +769,7 @@ describe('Execution', () => { test('adds .debug field in expression AST on each executed function', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); for (const node of execution.state.get().ast.chain) { expect(typeof node.debug).toBe('object'); @@ -781,7 +780,7 @@ describe('Execution', () => { test('stores input of each function', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const { chain } = execution.state.get().ast; @@ -799,7 +798,7 @@ describe('Execution', () => { test('stores output of each function', async () => { const execution = createExecution('add val=1 | add val=2 | add val=3', {}, true); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const { chain } = execution.state.get().ast; @@ -824,7 +823,7 @@ describe('Execution', () => { true ); execution.start(-1); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const { chain } = execution.state.get().ast; @@ -847,7 +846,7 @@ describe('Execution', () => { true ); execution.start(0); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const { chain } = execution.state.get().ast.chain[0].arguments .val[0] as ExpressionAstExpression; @@ -882,7 +881,7 @@ describe('Execution', () => { params: { debug: true }, }); execution.start(0); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const node1 = execution.state.get().ast.chain[0]; const node2 = execution.state.get().ast.chain[1]; @@ -900,7 +899,7 @@ describe('Execution', () => { params: { debug: true }, }); execution.start(0); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const node2 = execution.state.get().ast.chain[1]; @@ -921,7 +920,7 @@ describe('Execution', () => { params: { debug: true }, }); execution.start(0); - await execution.result.pipe(first()).toPromise(); + await execution.result.toPromise(); const node2 = execution.state.get().ast.chain[1]; diff --git a/src/plugins/expressions/common/execution/execution.ts b/src/plugins/expressions/common/execution/execution.ts index b70f261ea4b201..47209c348257e6 100644 --- a/src/plugins/expressions/common/execution/execution.ts +++ b/src/plugins/expressions/common/execution/execution.ts @@ -20,7 +20,7 @@ import { Observable, ReplaySubject, } from 'rxjs'; -import { catchError, finalize, map, shareReplay, switchMap, tap } from 'rxjs/operators'; +import { catchError, finalize, map, pluck, shareReplay, switchMap, tap } from 'rxjs/operators'; import { Executor } from '../executor'; import { createExecutionContainer, ExecutionContainer } from './container'; import { createError } from '../util'; @@ -45,6 +45,21 @@ import { ExpressionExecutionParams } from '../service'; import { TablesAdapter } from '../util/tables_adapter'; import { ExpressionsInspectorAdapter } from '../util/expressions_inspector_adapter'; +/** + * The result returned after an expression function execution. + */ +export interface ExecutionResult { + /** + * Partial result flag. + */ + partial: boolean; + + /** + * The expression function result. + */ + result: Output; +} + /** * AbortController is not available in Node until v15, so we * need to temporarily mock it for plugins using expressions @@ -91,7 +106,7 @@ export class Execution< /** * Dynamic state of the execution. */ - public readonly state: ExecutionContainer; + public readonly state: ExecutionContainer>; /** * Initial input of the execution. @@ -137,7 +152,7 @@ export class Execution< /** * Future that tracks result or error of this execution. */ - public readonly result: Observable; + public readonly result: Observable>; /** * Keeping track of any child executions @@ -174,7 +189,7 @@ export class Execution< this.expression = execution.expression || formatExpression(execution.ast!); const ast = execution.ast || parseExpression(this.expression); - this.state = createExecutionContainer({ + this.state = createExecutionContainer({ ...executor.state.get(), state: 'not-started', ast, @@ -201,12 +216,40 @@ export class Execution< }; this.result = this.input$.pipe( - switchMap((input) => this.race(this.invokeChain(this.state.get().ast.chain, input))), + switchMap((input) => + this.race(this.invokeChain(this.state.get().ast.chain, input)).pipe( + (source) => + new Observable>((subscriber) => { + let latest: ExecutionResult | undefined; + + subscriber.add( + source.subscribe({ + next: (result) => { + latest = { result, partial: true }; + subscriber.next(latest); + }, + error: (error) => subscriber.error(error), + complete: () => { + if (latest) { + latest.partial = false; + } + + subscriber.complete(); + }, + }) + ); + + subscriber.add(() => { + latest = undefined; + }); + }) + ) + ), catchError((error) => { if (this.abortController.signal.aborted) { this.childExecutions.forEach((childExecution) => childExecution.cancel()); - return of(createAbortErrorValue()); + return of({ result: createAbortErrorValue(), partial: false }); } return throwError(error); @@ -236,25 +279,20 @@ export class Execution< * N.B. `input` is initialized to `null` rather than `undefined` for legacy reasons, * because in legacy interpreter it was set to `null` by default. */ - public start(input: Input = null as any): Observable { + public start( + input: Input = null as any + ): Observable> { if (this.hasStarted) throw new Error('Execution already started.'); this.hasStarted = true; this.input = input; this.state.transitions.start(); if (isObservable(input)) { - // `input$` should never complete - input.subscribe( - (value) => this.input$.next(value), - (error) => this.input$.error(error) - ); + input.subscribe(this.input$); } else if (isPromise(input)) { - input.then( - (value) => this.input$.next(value), - (error) => this.input$.error(error) - ); + from(input).subscribe(this.input$); } else { - this.input$.next(input); + of(input).subscribe(this.input$); } return this.result; @@ -439,6 +477,7 @@ export class Execution< const resolveArgFns = mapValues(dealiasedArgAsts, (asts, argName) => asts.map((item) => (subInput = input) => this.interpret(item, subInput).pipe( + pluck('result'), map((output) => { if (isExpressionValueError(output)) { throw output.error; @@ -486,7 +525,7 @@ export class Execution< }); } - public interpret(ast: ExpressionAstNode, input: T): Observable { + public interpret(ast: ExpressionAstNode, input: T): Observable> { switch (getType(ast)) { case 'expression': const execution = this.execution.executor.createExecution( @@ -494,12 +533,13 @@ export class Execution< this.execution.params ); this.childExecutions.push(execution); + return execution.start(input); case 'string': case 'number': case 'null': case 'boolean': - return of(ast); + return of({ result: ast, partial: false }); default: return throwError(new Error(`Unknown AST object: ${JSON.stringify(ast)}`)); } diff --git a/src/plugins/expressions/common/execution/execution_contract.test.ts b/src/plugins/expressions/common/execution/execution_contract.test.ts index 99a5c80de3c462..de209f1dfb4a19 100644 --- a/src/plugins/expressions/common/execution/execution_contract.test.ts +++ b/src/plugins/expressions/common/execution/execution_contract.test.ts @@ -66,26 +66,23 @@ describe('ExecutionContract', () => { }); }); - test('can get error result of the expression execution', async () => { + test('can get error result of the expression execution', () => { const execution = createExecution('foo bar=123'); const contract = new ExecutionContract(execution); execution.start(); - const result = await contract.getData(); - - expect(result).toMatchObject({ - type: 'error', - }); + expect(contract.getData().toPromise()).resolves.toHaveProperty( + 'result', + expect.objectContaining({ type: 'error' }) + ); }); - test('can get result of the expression execution', async () => { + test('can get result of the expression execution', () => { const execution = createExecution('var_set name="foo" value="bar" | var name="foo"'); const contract = new ExecutionContract(execution); execution.start(); - const result = await contract.getData(); - - expect(result).toBe('bar'); + expect(contract.getData().toPromise()).resolves.toHaveProperty('result', 'bar'); }); describe('isPending', () => { diff --git a/src/plugins/expressions/common/execution/execution_contract.ts b/src/plugins/expressions/common/execution/execution_contract.ts index 3cad9cef5e09ae..445ceb30b58db6 100644 --- a/src/plugins/expressions/common/execution/execution_contract.ts +++ b/src/plugins/expressions/common/execution/execution_contract.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { of } from 'rxjs'; -import { catchError, take } from 'rxjs/operators'; -import { Execution } from './execution'; +import { of, Observable } from 'rxjs'; +import { catchError } from 'rxjs/operators'; +import { Execution, ExecutionResult } from './execution'; import { ExpressionValueError } from '../expression_types/specs'; import { ExpressionAstExpression } from '../ast'; @@ -39,22 +39,22 @@ export class ExecutionContract => { - return this.execution.result - .pipe( - take(1), - catchError(({ name, message, stack }) => - of({ + getData = (): Observable> => { + return this.execution.result.pipe( + catchError(({ name, message, stack }) => + of({ + partial: false, + result: { type: 'error', error: { name, message, stack, }, - } as ExpressionValueError) - ) + } as ExpressionValueError, + }) ) - .toPromise(); + ); }; /** diff --git a/src/plugins/expressions/common/executor/executor.ts b/src/plugins/expressions/common/executor/executor.ts index a307172aff9737..7ca5a005991bd4 100644 --- a/src/plugins/expressions/common/executor/executor.ts +++ b/src/plugins/expressions/common/executor/executor.ts @@ -13,7 +13,7 @@ import { Observable } from 'rxjs'; import { ExecutorState, ExecutorContainer } from './container'; import { createExecutorContainer } from './container'; import { AnyExpressionFunctionDefinition, ExpressionFunction } from '../expression_functions'; -import { Execution, ExecutionParams } from '../execution/execution'; +import { Execution, ExecutionParams, ExecutionResult } from '../execution/execution'; import { IRegistry } from '../types'; import { ExpressionType } from '../expression_types/expression_type'; import { AnyExpressionTypeDefinition } from '../expression_types/types'; @@ -160,7 +160,7 @@ export class Executor = Record { + ): Observable> { return this.createExecution(ast, params).start(input); } diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/var_set.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/var_set.test.ts index cdcae61215fa42..1b060cde7482d6 100644 --- a/src/plugins/expressions/common/expression_functions/specs/tests/var_set.test.ts +++ b/src/plugins/expressions/common/expression_functions/specs/tests/var_set.test.ts @@ -65,7 +65,7 @@ describe('expression_functions', () => { it('sets the variables', async () => { const vars = {}; - const result = await executor + const { result } = await executor .run('var_set name=test1 name=test2 value=1', 2, { variables: vars }) .pipe(first()) .toPromise(); diff --git a/src/plugins/expressions/common/service/expressions_services.test.ts b/src/plugins/expressions/common/service/expressions_services.test.ts index 8f86e81f9d1d53..db73d300e1273d 100644 --- a/src/plugins/expressions/common/service/expressions_services.test.ts +++ b/src/plugins/expressions/common/service/expressions_services.test.ts @@ -114,7 +114,7 @@ describe('ExpressionsService', () => { }, }); - const result = await fork.run('__test__', null); + const { result } = await fork.run('__test__', null).toPromise(); expect(result).toBe('123'); }); diff --git a/src/plugins/expressions/common/service/expressions_services.ts b/src/plugins/expressions/common/service/expressions_services.ts index b3c01672626614..9e569c66bbe16f 100644 --- a/src/plugins/expressions/common/service/expressions_services.ts +++ b/src/plugins/expressions/common/service/expressions_services.ts @@ -6,15 +6,15 @@ * Side Public License, v 1. */ -import { take } from 'rxjs/operators'; +import { Observable } from 'rxjs'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import type { KibanaRequest } from 'src/core/server'; import { Executor } from '../executor'; import { AnyExpressionRenderDefinition, ExpressionRendererRegistry } from '../expression_renderers'; import { ExpressionAstExpression } from '../ast'; -import { ExecutionContract } from '../execution/execution_contract'; -import { AnyExpressionTypeDefinition } from '../expression_types'; +import { ExecutionContract, ExecutionResult } from '../execution'; +import { AnyExpressionTypeDefinition, ExpressionValueError } from '../expression_types'; import { AnyExpressionFunctionDefinition } from '../expression_functions'; import { SavedObjectReference } from '../../../../core/types'; import { PersistableStateService, SerializableState } from '../../../kibana_utils/common'; @@ -136,7 +136,7 @@ export interface ExpressionsServiceStart { ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams - ) => Promise; + ) => Observable>; /** * Starts expression execution and immediately returns `ExecutionContract` @@ -243,7 +243,7 @@ export class ExpressionsService implements PersistableStateService this.renderers.register(definition); public readonly run: ExpressionsServiceStart['run'] = (ast, input, params) => - this.executor.run(ast, input, params).pipe(take(1)).toPromise(); + this.executor.run(ast, input, params); public readonly getFunction: ExpressionsServiceStart['getFunction'] = (name) => this.executor.getFunction(name); diff --git a/src/plugins/expressions/public/loader.test.ts b/src/plugins/expressions/public/loader.test.ts index 98adec285afd5e..86477e53dc1a13 100644 --- a/src/plugins/expressions/public/loader.test.ts +++ b/src/plugins/expressions/public/loader.test.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { of } from 'rxjs'; import { first, skip, toArray } from 'rxjs/operators'; import { loader, ExpressionLoader } from './loader'; import { Observable } from 'rxjs'; @@ -111,8 +112,29 @@ describe('ExpressionLoader', () => { it('emits on $data when data is available', async () => { const expressionLoader = new ExpressionLoader(element, 'var foo', { variables: { foo: 123 } }); - const response = await expressionLoader.data$.pipe(first()).toPromise(); - expect(response).toBe(123); + const { result } = await expressionLoader.data$.pipe(first()).toPromise(); + expect(result).toBe(123); + }); + + it('ignores partial results by default', async () => { + const expressionLoader = new ExpressionLoader(element, 'var foo', { + variables: { foo: of(1, 2) }, + }); + const { result, partial } = await expressionLoader.data$.pipe(first()).toPromise(); + + expect(partial).toBe(false); + expect(result).toBe(2); + }); + + it('emits partial results if enabled', async () => { + const expressionLoader = new ExpressionLoader(element, 'var foo', { + variables: { foo: of(1, 2) }, + partial: true, + }); + const { result, partial } = await expressionLoader.data$.pipe(first()).toPromise(); + + expect(partial).toBe(true); + expect(result).toBe(1); }); it('emits on loading$ on initial load and on updates', async () => { diff --git a/src/plugins/expressions/public/loader.ts b/src/plugins/expressions/public/loader.ts index 4165b8906a20ee..a51ce35c681804 100644 --- a/src/plugins/expressions/public/loader.ts +++ b/src/plugins/expressions/public/loader.ts @@ -6,9 +6,10 @@ * Side Public License, v 1. */ -import { BehaviorSubject, Observable, Subject } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { BehaviorSubject, Observable, Subject, Subscription } from 'rxjs'; +import { filter, map, delay } from 'rxjs/operators'; import { defaults } from 'lodash'; +import { UnwrapObservable } from '@kbn/utility-types'; import { Adapters } from '../../inspector/public'; import { IExpressionLoaderParams } from './types'; import { ExpressionAstExpression } from '../common'; @@ -20,7 +21,7 @@ import { getExpressionsService } from './services'; type Data = any; export class ExpressionLoader { - data$: Observable; + data$: ReturnType; update$: ExpressionRenderHandler['update$']; render$: ExpressionRenderHandler['render$']; events$: ExpressionRenderHandler['events$']; @@ -28,10 +29,11 @@ export class ExpressionLoader { private execution: ExecutionContract | undefined; private renderHandler: ExpressionRenderHandler; - private dataSubject: Subject; + private dataSubject: Subject>; private loadingSubject: Subject; private data: Data; private params: IExpressionLoaderParams = {}; + private subscription?: Subscription; constructor( element: HTMLElement, @@ -67,8 +69,8 @@ export class ExpressionLoader { } }); - this.data$.subscribe((data) => { - this.render(data); + this.data$.subscribe(({ result }) => { + this.render(result); }); this.render$.subscribe(() => { @@ -87,27 +89,20 @@ export class ExpressionLoader { this.dataSubject.complete(); this.loadingSubject.complete(); this.renderHandler.destroy(); - if (this.execution) { - this.execution.cancel(); - } + this.cancel(); + this.subscription?.unsubscribe(); } cancel() { - if (this.execution) { - this.execution.cancel(); - } + this.execution?.cancel(); } getExpression(): string | undefined { - if (this.execution) { - return this.execution.getExpression(); - } + return this.execution?.getExpression(); } getAst(): ExpressionAstExpression | undefined { - if (this.execution) { - return this.execution.getAst(); - } + return this.execution?.getAst(); } getElement(): HTMLElement { @@ -115,27 +110,25 @@ export class ExpressionLoader { } inspect(): Adapters | undefined { - return this.execution ? (this.execution.inspect() as Adapters) : undefined; + return this.execution?.inspect() as Adapters; } - async update( - expression?: string | ExpressionAstExpression, - params?: IExpressionLoaderParams - ): Promise { + update(expression?: string | ExpressionAstExpression, params?: IExpressionLoaderParams): void { this.setParams(params); this.loadingSubject.next(true); if (expression) { - await this.loadData(expression, this.params); + this.loadData(expression, this.params); } else if (this.data) { this.render(this.data); } } - private loadData = async ( + private loadData = ( expression: string | ExpressionAstExpression, params: IExpressionLoaderParams - ): Promise => { + ) => { + this.subscription?.unsubscribe(); if (this.execution && this.execution.isPending) { this.execution.cancel(); } @@ -148,13 +141,13 @@ export class ExpressionLoader { debug: params.debug, syncColors: params.syncColors, }); - - const prevDataHandler = this.execution; - const data = await prevDataHandler.getData(); - if (this.execution !== prevDataHandler) { - return; - } - this.dataSubject.next(data); + this.subscription = this.execution + .getData() + .pipe( + delay(0), // delaying until the next tick since we execute the expression in the constructor + filter(({ partial }) => params.partial || !partial) + ) + .subscribe((value) => this.dataSubject.next(value)); }; private render(data: Data): void { @@ -184,6 +177,7 @@ export class ExpressionLoader { } this.params.syncColors = params.syncColors; this.params.debug = Boolean(params.debug); + this.params.partial = Boolean(params.partial); this.params.inspectorAdapters = (params.inspectorAdapters || this.execution?.inspect()) as Adapters; diff --git a/src/plugins/expressions/public/plugin.test.ts b/src/plugins/expressions/public/plugin.test.ts index 93353ebbb51b61..1963eb1f1b3f7b 100644 --- a/src/plugins/expressions/public/plugin.test.ts +++ b/src/plugins/expressions/public/plugin.test.ts @@ -36,8 +36,10 @@ describe('ExpressionsPublicPlugin', () => { describe('.run()', () => { test('can execute simple expression', async () => { const { setup } = await expressionsPluginMock.createPlugin(); - const bar = await setup.run('var_set name="foo" value="bar" | var name="foo"', null); - expect(bar).toBe('bar'); + const { result } = await setup + .run('var_set name="foo" value="bar" | var name="foo"', null) + .toPromise(); + expect(result).toBe('bar'); }); }); }); diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 97009ae543b974..2d9c6d94cfa6dc 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -112,16 +112,17 @@ export class Execution(ast: ExpressionAstNode, input: T): Observable; + interpret(ast: ExpressionAstNode, input: T): Observable>; // (undocumented) invokeChain(chainArr: ExpressionAstFunction[], input: unknown): Observable; // (undocumented) invokeFunction(fn: ExpressionFunction, input: unknown, args: Record): Observable; // (undocumented) resolveArgs(fnDef: ExpressionFunction, input: unknown, argAsts: any): Observable; - readonly result: Observable; - start(input?: Input): Observable; - readonly state: ExecutionContainer; + readonly result: Observable>; + start(input?: Input): Observable>; + // Warning: (ae-forgotten-export) The symbol "ExecutionResult" needs to be exported by the entry point index.d.ts + readonly state: ExecutionContainer>; } // Warning: (ae-forgotten-export) The symbol "StateContainer" needs to be exported by the entry point index.d.ts @@ -155,7 +156,7 @@ export class ExecutionContract; getAst: () => ExpressionAstExpression; - getData: () => Promise; + getData: () => Observable>; getExpression: () => string; inspect: () => InspectorAdapters; // (undocumented) @@ -230,7 +231,7 @@ export class Executor = Record AnyExpressionFunctionDefinition)): void; // (undocumented) registerType(typeDefinition: AnyExpressionTypeDefinition | (() => AnyExpressionTypeDefinition)): void; - run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable; + run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable>; // (undocumented) readonly state: ExecutorContainer; // (undocumented) @@ -637,7 +638,7 @@ export interface ExpressionsServiceStart { getFunction: (name: string) => ReturnType; getRenderer: (name: string) => ReturnType; getType: (name: string) => ReturnType; - run: (ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Promise; + run: (ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams) => Observable>; } // Warning: (ae-missing-release-tag) "ExpressionsSetup" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -907,6 +908,8 @@ export interface IExpressionLoaderParams { // // (undocumented) onRenderError?: RenderErrorHandlerFnType; + // (undocumented) + partial?: boolean; // Warning: (ae-forgotten-export) The symbol "RenderMode" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -1073,7 +1076,7 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams { // (undocumented) expression: string | ExpressionAstExpression; // (undocumented) - onData$?: (data: TData, adapters?: TInspectorAdapters) => void; + onData$?: (data: TData, adapters?: TInspectorAdapters, partial?: boolean) => void; // (undocumented) onEvent?: (event: ExpressionRendererEvent) => void; // (undocumented) diff --git a/src/plugins/expressions/public/react_expression_renderer.test.tsx b/src/plugins/expressions/public/react_expression_renderer.test.tsx index e7ae6ee45ab600..d31a4c947b09d4 100644 --- a/src/plugins/expressions/public/react_expression_renderer.test.tsx +++ b/src/plugins/expressions/public/react_expression_renderer.test.tsx @@ -255,7 +255,7 @@ describe('ExpressionRenderer', () => { const dataSubject = new Subject(); const data$ = dataSubject.asObservable().pipe(share()); - const newData = {}; + const result = {}; const inspectData = {}; const onData$ = jest.fn(); @@ -275,11 +275,11 @@ describe('ExpressionRenderer', () => { expect(onData$).toHaveBeenCalledTimes(0); act(() => { - dataSubject.next(newData); + dataSubject.next({ result }); }); expect(onData$).toHaveBeenCalledTimes(1); - expect(onData$.mock.calls[0][0]).toBe(newData); + expect(onData$.mock.calls[0][0]).toBe(result); expect(onData$.mock.calls[0][1]).toBe(inspectData); }); diff --git a/src/plugins/expressions/public/react_expression_renderer.tsx b/src/plugins/expressions/public/react_expression_renderer.tsx index ce8547f132c279..719af1b39f89e0 100644 --- a/src/plugins/expressions/public/react_expression_renderer.tsx +++ b/src/plugins/expressions/public/react_expression_renderer.tsx @@ -30,7 +30,11 @@ export interface ReactExpressionRendererProps extends IExpressionLoaderParams { ) => React.ReactElement | React.ReactElement[]; padding?: 'xs' | 's' | 'm' | 'l' | 'xl'; onEvent?: (event: ExpressionRendererEvent) => void; - onData$?: (data: TData, adapters?: TInspectorAdapters) => void; + onData$?: ( + data: TData, + adapters?: TInspectorAdapters, + partial?: boolean + ) => void; /** * An observable which can be used to re-run the expression without destroying the component */ @@ -135,8 +139,8 @@ export const ReactExpressionRenderer = ({ } if (onData$) { subs.push( - expressionLoaderRef.current.data$.subscribe((newData) => { - onData$(newData, expressionLoaderRef.current?.inspect()); + expressionLoaderRef.current.data$.subscribe(({ partial, result }) => { + onData$(result, expressionLoaderRef.current?.inspect(), partial); }) ); } diff --git a/src/plugins/expressions/public/types/index.ts b/src/plugins/expressions/public/types/index.ts index 947b84ec152acb..2375252e827848 100644 --- a/src/plugins/expressions/public/types/index.ts +++ b/src/plugins/expressions/public/types/index.ts @@ -48,6 +48,7 @@ export interface IExpressionLoaderParams { renderMode?: RenderMode; syncColors?: boolean; hasCompatibleActions?: ExpressionRenderHandlerParams['hasCompatibleActions']; + partial?: boolean; } export interface ExpressionRenderError extends Error { diff --git a/src/plugins/expressions/server/plugin.test.ts b/src/plugins/expressions/server/plugin.test.ts index d967f9e614678e..c41cda36e7623a 100644 --- a/src/plugins/expressions/server/plugin.test.ts +++ b/src/plugins/expressions/server/plugin.test.ts @@ -28,8 +28,10 @@ describe('ExpressionsServerPlugin', () => { describe('.run()', () => { test('can execute simple expression', async () => { const { setup } = await expressionsPluginMock.createPlugin(); - const bar = await setup.run('var_set name="foo" value="bar" | var name="foo"', null); - expect(bar).toBe('bar'); + const { result } = await setup + .run('var_set name="foo" value="bar" | var name="foo"', null) + .toPromise(); + expect(result).toBe('bar'); }); }); }); diff --git a/src/plugins/expressions/server/server.api.md b/src/plugins/expressions/server/server.api.md index 8d2e113e6b6ed4..ec16d95ea8a3ff 100644 --- a/src/plugins/expressions/server/server.api.md +++ b/src/plugins/expressions/server/server.api.md @@ -110,16 +110,17 @@ export class Execution(ast: ExpressionAstNode, input: T): Observable; + interpret(ast: ExpressionAstNode, input: T): Observable>; // (undocumented) invokeChain(chainArr: ExpressionAstFunction[], input: unknown): Observable; // (undocumented) invokeFunction(fn: ExpressionFunction, input: unknown, args: Record): Observable; // (undocumented) resolveArgs(fnDef: ExpressionFunction, input: unknown, argAsts: any): Observable; - readonly result: Observable; - start(input?: Input): Observable; - readonly state: ExecutionContainer; + readonly result: Observable>; + start(input?: Input): Observable>; + // Warning: (ae-forgotten-export) The symbol "ExecutionResult" needs to be exported by the entry point index.d.ts + readonly state: ExecutionContainer>; } // Warning: (ae-forgotten-export) The symbol "StateContainer" needs to be exported by the entry point index.d.ts @@ -212,7 +213,7 @@ export class Executor = Record AnyExpressionFunctionDefinition)): void; // (undocumented) registerType(typeDefinition: AnyExpressionTypeDefinition | (() => AnyExpressionTypeDefinition)): void; - run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable; + run(ast: string | ExpressionAstExpression, input: Input, params?: ExpressionExecutionParams): Observable>; // (undocumented) readonly state: ExecutorContainer; // (undocumented) diff --git a/src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js b/src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js index bb264aaacbfbfc..801681dbd531f1 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js +++ b/src/plugins/vis_type_timeseries/public/application/components/vis_editor_visualization.js @@ -10,6 +10,7 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { keys, EuiFlexGroup, EuiFlexItem, EuiButton, EuiText, EuiSwitch } from '@elastic/eui'; import { FormattedMessage, injectI18n } from '@kbn/i18n/react'; +import { pluck } from 'rxjs/operators'; const MIN_CHART_HEIGHT = 300; @@ -55,7 +56,9 @@ class VisEditorVisualizationUI extends Component { await this._handler.render(this._visEl.current); this.props.eventEmitter.emit('embeddableRendered'); - this._subscription = this._handler.handler.data$.subscribe((data) => onDataChange(data.value)); + this._subscription = this._handler.handler.data$ + .pipe(pluck('result')) + .subscribe((data) => onDataChange(data.value)); } /** diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app/components/main.tsx b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app/components/main.tsx index cf720657291f88..b03451bdebad2d 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app/components/main.tsx +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/public/app/components/main.tsx @@ -9,7 +9,7 @@ import './main.scss'; import React from 'react'; import { EuiPage, EuiPageBody, EuiPageContent, EuiPageContentHeader } from '@elastic/eui'; -import { first } from 'rxjs/operators'; +import { first, pluck } from 'rxjs/operators'; import { IInterpreterRenderHandlers, ExpressionValue, @@ -59,7 +59,9 @@ class Main extends React.Component<{}, State> { inspectorAdapters: adapters, searchContext: initialContext as any, }) - .getData(); + .getData() + .pipe(pluck('result')) + .toPromise(); }; let lastRenderHandler: ExpressionRenderHandler; diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/server/plugin.ts b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/server/plugin.ts index 923113cc99ba8f..a4903fedd22d59 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/server/plugin.ts +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/server/plugin.ts @@ -7,6 +7,7 @@ */ import { schema } from '@kbn/config-schema'; +import { pluck } from 'rxjs/operators'; import { CoreSetup, Plugin, HttpResponsePayload } from '../../../../../src/core/server'; import { PluginStart as DataPluginStart } from '../../../../../src/plugins/data/server'; import { ExpressionsServerStart } from '../../../../../src/plugins/expressions/server'; @@ -32,13 +33,12 @@ export class TestPlugin implements Plugin { const [, { expressions }] = await core.getStartServices(); - const output = await expressions.run( - req.body.expression, - req.body.input, - { + const output = await expressions + .run(req.body.expression, req.body.input, { kibanaRequest: req, - } - ); + }) + .pipe(pluck('result')) + .toPromise(); return res.ok({ body: output }); } ); diff --git a/x-pack/plugins/canvas/public/lib/run_interpreter.ts b/x-pack/plugins/canvas/public/lib/run_interpreter.ts index 149e90a8f6b730..d69f89566cfc9f 100644 --- a/x-pack/plugins/canvas/public/lib/run_interpreter.ts +++ b/x-pack/plugins/canvas/public/lib/run_interpreter.ts @@ -6,6 +6,7 @@ */ import { fromExpression, getType } from '@kbn/interpreter/common'; +import { pluck } from 'rxjs/operators'; import { ExpressionValue, ExpressionAstExpression } from 'src/plugins/expressions/public'; import { pluginServices, expressionsService } from '../services'; @@ -21,7 +22,12 @@ export async function interpretAst( variables: Record ): Promise { const context = { variables }; - return await expressionsService.getService().execute(ast, null, context).getData(); + return await expressionsService + .getService() + .execute(ast, null, context) + .getData() + .pipe(pluck('result')) + .toPromise(); } /** @@ -43,7 +49,12 @@ export async function runInterpreter( const context = { variables }; try { - const renderable = await expressionsService.getService().execute(ast, input, context).getData(); + const renderable = await expressionsService + .getService() + .execute(ast, input, context) + .getData() + .pipe(pluck('result')) + .toPromise(); if (getType(renderable) === 'render') { return renderable; From cb163c9139eb268bdf82066775e0522e85a3bb3a Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Thu, 1 Jul 2021 16:49:52 -0400 Subject: [PATCH 33/43] [canvas] Create Platform Service; remove legacy service (#104113) --- .../embeddable_flyout/flyout.component.tsx | 7 +- .../__stories__/share_menu.stories.tsx | 4 +- .../flyout/__stories__/flyout.stories.tsx | 9 +-- .../share_menu/flyout/flyout.component.tsx | 64 ++++++++++++++++-- .../share_menu/flyout/flyout.ts | 67 +------------------ .../share_menu/share_menu.component.tsx | 9 +-- .../workpad_header/share_menu/share_menu.ts | 3 +- .../public/lib/custom_element_service.ts | 4 +- .../plugins/canvas/public/lib/es_service.ts | 11 +-- .../plugins/canvas/public/lib/fullscreen.js | 7 +- .../canvas/public/lib/template_service.ts | 8 ++- .../canvas/public/lib/workpad_service.js | 12 ++-- .../use_fullscreen_presentation_helper.ts | 5 +- .../workpad/workpad_presentation_helper.tsx | 8 +-- .../plugins/canvas/public/services/index.ts | 3 + .../canvas/public/services/kibana/index.ts | 3 + .../services/{legacy => kibana}/platform.ts | 37 +++------- .../canvas/public/services/legacy/context.tsx | 3 - .../canvas/public/services/legacy/index.ts | 5 -- .../public/services/legacy/stubs/index.ts | 2 - .../canvas/public/services/platform.ts | 33 +++++++++ .../canvas/public/services/stubs/index.ts | 3 + .../services/{legacy => }/stubs/platform.ts | 10 ++- .../canvas/public/state/initial_state.js | 5 +- .../canvas/public/state/reducers/workpad.js | 22 ++++-- 25 files changed, 180 insertions(+), 164 deletions(-) rename x-pack/plugins/canvas/public/services/{legacy => kibana}/platform.ts (54%) create mode 100644 x-pack/plugins/canvas/public/services/platform.ts rename x-pack/plugins/canvas/public/services/{legacy => }/stubs/platform.ts (72%) diff --git a/x-pack/plugins/canvas/public/components/embeddable_flyout/flyout.component.tsx b/x-pack/plugins/canvas/public/components/embeddable_flyout/flyout.component.tsx index 716f757b7c25e9..dd7df7059a7a44 100644 --- a/x-pack/plugins/canvas/public/components/embeddable_flyout/flyout.component.tsx +++ b/x-pack/plugins/canvas/public/components/embeddable_flyout/flyout.component.tsx @@ -13,7 +13,7 @@ import { SavedObjectFinderUi, SavedObjectMetaData, } from '../../../../../../src/plugins/saved_objects/public/'; -import { useServices } from '../../services'; +import { usePlatformService, useServices } from '../../services'; const strings = { getNoItemsText: () => @@ -33,9 +33,10 @@ export interface Props { export const AddEmbeddableFlyout: FC = ({ onSelect, availableEmbeddables, onClose }) => { const services = useServices(); - const { embeddables, platform } = services; + const platformService = usePlatformService(); + const { embeddables } = services; const { getEmbeddableFactories } = embeddables; - const { getSavedObjects, getUISettings } = platform; + const { getSavedObjects, getUISettings } = platformService; const onAddPanel = (id: string, savedObjectType: string, name: string) => { const embeddableFactories = getEmbeddableFactories(); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/__stories__/share_menu.stories.tsx b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/__stories__/share_menu.stories.tsx index 59a7f263fea086..1c31676aed75fc 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/__stories__/share_menu.stories.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/__stories__/share_menu.stories.tsx @@ -8,7 +8,6 @@ import { action } from '@storybook/addon-actions'; import { storiesOf } from '@storybook/react'; import React from 'react'; -import { platformService } from '../../../../services/legacy/stubs/platform'; import { reportingService } from '../../../../services/legacy/stubs/reporting'; import { ShareMenu } from '../share_menu.component'; @@ -18,7 +17,7 @@ storiesOf('components/WorkpadHeader/ShareMenu', module).add('minimal', () => ( workpad: { id: 'coolworkpad', name: 'Workpad of Cool', height: 10, width: 7 }, pageCount: 11, }} - sharingServices={{ basePath: platformService.getBasePathInterface() }} + sharingServices={{}} onExport={action('onExport')} /> )); @@ -30,7 +29,6 @@ storiesOf('components/WorkpadHeader/ShareMenu', module).add('with Reporting', () pageCount: 11, }} sharingServices={{ - basePath: platformService.getBasePathInterface(), reporting: reportingService.start, }} onExport={action('onExport')} diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/__stories__/flyout.stories.tsx b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/__stories__/flyout.stories.tsx index 4d38cc9fb88b41..d0c1eb550ea604 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/__stories__/flyout.stories.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/__stories__/flyout.stories.tsx @@ -26,17 +26,12 @@ storiesOf('components/WorkpadHeader/ShareMenu/ShareWebsiteFlyout', module) }, }) .add('default', () => ( - + )) .add('unsupported renderers', () => ( )); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx index 5da009e050a27d..be337a6dcf00c8 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx @@ -24,13 +24,42 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { arrayBufferFetch } from '../../../../../common/lib/fetch'; +import { API_ROUTE_SHAREABLE_ZIP } from '../../../../../common/lib/constants'; +import { CanvasRenderedWorkpad } from '../../../../../shareable_runtime/types'; +import { + downloadRenderedWorkpad, + downloadRuntime, + downloadZippedRuntime, +} from '../../../../lib/download_workpad'; import { ZIP, CANVAS, HTML } from '../../../../../i18n/constants'; import { OnCloseFn } from '../share_menu.component'; import { WorkpadStep } from './workpad_step'; import { RuntimeStep } from './runtime_step'; import { SnippetsStep } from './snippets_step'; +import { useNotifyService, usePlatformService } from '../../../../services'; const strings = { + getCopyShareConfigMessage: () => + i18n.translate('xpack.canvas.workpadHeaderShareMenu.copyShareConfigMessage', { + defaultMessage: 'Copied share markup to clipboard', + }), + getShareableZipErrorTitle: (workpadName: string) => + i18n.translate('xpack.canvas.workpadHeaderShareMenu.shareWebsiteErrorTitle', { + defaultMessage: + "Failed to create {ZIP} file for '{workpadName}'. The workpad may be too large. You'll need to download the files separately.", + values: { + ZIP, + workpadName, + }, + }), + getUnknownExportErrorMessage: (type: string) => + i18n.translate('xpack.canvas.workpadHeaderShareMenu.unknownExportErrorMessage', { + defaultMessage: 'Unknown export type: {type}', + values: { + type, + }, + }), getRuntimeStepTitle: () => i18n.translate('xpack.canvas.shareWebsiteFlyout.snippetsStep.downloadRuntimeTitle', { defaultMessage: 'Download runtime', @@ -66,10 +95,9 @@ export type OnDownloadFn = (type: 'share' | 'shareRuntime' | 'shareZip') => void export type OnCopyFn = () => void; export interface Props { - onCopy: OnCopyFn; - onDownload: OnDownloadFn; onClose: OnCloseFn; unsupportedRenderers?: string[]; + renderedWorkpad: CanvasRenderedWorkpad; } const steps = (onDownload: OnDownloadFn, onCopy: OnCopyFn) => [ @@ -88,11 +116,39 @@ const steps = (onDownload: OnDownloadFn, onCopy: OnCopyFn) => [ ]; export const ShareWebsiteFlyout: FC = ({ - onCopy, - onDownload, onClose, unsupportedRenderers, + renderedWorkpad, }) => { + const notifyService = useNotifyService(); + const platformService = usePlatformService(); + const onCopy = () => { + notifyService.info(strings.getCopyShareConfigMessage()); + }; + + const onDownload = (type: 'share' | 'shareRuntime' | 'shareZip') => { + switch (type) { + case 'share': + downloadRenderedWorkpad(renderedWorkpad); + return; + case 'shareRuntime': + downloadRuntime(platformService.getBasePath()); + case 'shareZip': + const basePath = platformService.getBasePath(); + arrayBufferFetch + .post(`${basePath}${API_ROUTE_SHAREABLE_ZIP}`, JSON.stringify(renderedWorkpad)) + .then((blob) => downloadZippedRuntime(blob.data)) + .catch((err: Error) => { + notifyService.error(err, { + title: strings.getShareableZipErrorTitle(renderedWorkpad.name), + }); + }); + return; + default: + throw new Error(strings.getUnknownExportErrorMessage(type)); + } + }; + const link = ( - i18n.translate('xpack.canvas.workpadHeaderShareMenu.copyShareConfigMessage', { - defaultMessage: 'Copied share markup to clipboard', - }), - getShareableZipErrorTitle: (workpadName: string) => - i18n.translate('xpack.canvas.workpadHeaderShareMenu.shareWebsiteErrorTitle', { - defaultMessage: - "Failed to create {ZIP} file for '{workpadName}'. The workpad may be too large. You'll need to download the files separately.", - values: { - ZIP, - workpadName, - }, - }), - getUnknownExportErrorMessage: (type: string) => - i18n.translate('xpack.canvas.workpadHeaderShareMenu.unknownExportErrorMessage', { - defaultMessage: 'Unknown export type: {type}', - values: { - type, - }, - }), -}; - const getUnsupportedRenderers = (state: State) => { const renderers: string[] = []; const expressions = getRenderedWorkpadExpressions(state); @@ -86,41 +52,10 @@ export const ShareWebsiteFlyout = compose connect(mapStateToProps), withKibana, withProps( - ({ - unsupportedRenderers, + ({ unsupportedRenderers, renderedWorkpad, onClose, workpad }: Props): ComponentProps => ({ renderedWorkpad, - onClose, - workpad, - kibana, - }: Props & WithKibanaProps): ComponentProps => ({ unsupportedRenderers, onClose, - onCopy: () => { - pluginServices.getServices().notify.info(strings.getCopyShareConfigMessage()); - }, - onDownload: (type) => { - switch (type) { - case 'share': - downloadRenderedWorkpad(renderedWorkpad); - return; - case 'shareRuntime': - downloadRuntime(kibana.services.http.basePath.get()); - return; - case 'shareZip': - const basePath = kibana.services.http.basePath.get(); - arrayBufferFetch - .post(`${basePath}${API_ROUTE_SHAREABLE_ZIP}`, JSON.stringify(renderedWorkpad)) - .then((blob) => downloadZippedRuntime(blob.data)) - .catch((err: Error) => { - pluginServices.getServices().notify.error(err, { - title: strings.getShareableZipErrorTitle(workpad.name), - }); - }); - return; - default: - throw new Error(strings.getUnknownExportErrorMessage(type)); - } - }, }) ) )(Component); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.component.tsx b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.component.tsx index 5ccc09bf3586b3..8d150d3d369722 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.component.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.component.tsx @@ -9,11 +9,11 @@ import React, { FunctionComponent, useState } from 'react'; import PropTypes from 'prop-types'; import { EuiButtonEmpty, EuiContextMenu, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { IBasePath } from 'kibana/public'; import { ReportingStart } from '../../../../../reporting/public'; import { PDF, JSON } from '../../../../i18n/constants'; import { flattenPanelTree } from '../../../lib/flatten_panel_tree'; +import { usePlatformService } from '../../../services'; import { ClosePopoverFn, Popover } from '../../popover'; import { ShareWebsiteFlyout } from './flyout'; import { CanvasWorkpadSharingData, getPdfJobParams } from './utils'; @@ -59,8 +59,6 @@ export interface Props { /** Canvas workpad to export as PDF **/ sharingData: CanvasWorkpadSharingData; sharingServices: { - /** BasePath dependency **/ - basePath: IBasePath; /** Reporting dependency **/ reporting?: ReportingStart; }; @@ -76,6 +74,7 @@ export const ShareMenu: FunctionComponent = ({ sharingServices: services, onExport, }) => { + const platformService = usePlatformService(); const [showFlyout, setShowFlyout] = useState(false); const onClose = () => { @@ -102,7 +101,9 @@ export const ShareMenu: FunctionComponent = ({ title: strings.getShareDownloadPDFTitle(), content: ( getPdfJobParams(sharingData, services.basePath)} + getJobParams={() => + getPdfJobParams(sharingData, platformService.getBasePathInterface()) + } layoutOption="canvas" onClose={closePopover} /> diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.ts b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.ts index ef13655b66aca9..f514f813599b68 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/share_menu.ts @@ -41,12 +41,11 @@ export const ShareMenu = compose( withProps( ({ workpad, pageCount, services }: Props & WithServicesProps): ComponentProps => { const { - platform, reporting: { start: reporting }, } = services; return { - sharingServices: { basePath: platform.getBasePathInterface(), reporting }, + sharingServices: { reporting }, sharingData: { workpad, pageCount }, onExport: (type) => { switch (type) { diff --git a/x-pack/plugins/canvas/public/lib/custom_element_service.ts b/x-pack/plugins/canvas/public/lib/custom_element_service.ts index aa3229456ebf65..6da624bb5d3ae0 100644 --- a/x-pack/plugins/canvas/public/lib/custom_element_service.ts +++ b/x-pack/plugins/canvas/public/lib/custom_element_service.ts @@ -9,10 +9,10 @@ import { AxiosPromise } from 'axios'; import { API_ROUTE_CUSTOM_ELEMENT } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; import { CustomElement } from '../../types'; -import { platformService } from '../services'; +import { pluginServices } from '../services'; const getApiPath = function () { - const basePath = platformService.getService().getBasePath(); + const basePath = pluginServices.getServices().platform.getBasePath(); return `${basePath}${API_ROUTE_CUSTOM_ELEMENT}`; }; diff --git a/x-pack/plugins/canvas/public/lib/es_service.ts b/x-pack/plugins/canvas/public/lib/es_service.ts index c1a4a17970ffa7..0ff6c9e5d110f5 100644 --- a/x-pack/plugins/canvas/public/lib/es_service.ts +++ b/x-pack/plugins/canvas/public/lib/es_service.ts @@ -6,28 +6,29 @@ */ // TODO - clint: convert to service abstraction - import { IndexPatternAttributes } from 'src/plugins/data/public'; import { API_ROUTE } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; import { ErrorStrings } from '../../i18n'; import { pluginServices } from '../services'; -import { platformService } from '../services'; const { esService: strings } = ErrorStrings; const getApiPath = function () { - const basePath = platformService.getService().getBasePath(); + const platformService = pluginServices.getServices().platform; + const basePath = platformService.getBasePath(); return basePath + API_ROUTE; }; const getSavedObjectsClient = function () { - return platformService.getService().getSavedObjectsClient(); + const platformService = pluginServices.getServices().platform; + return platformService.getSavedObjectsClient(); }; const getAdvancedSettings = function () { - return platformService.getService().getUISettings(); + const platformService = pluginServices.getServices().platform; + return platformService.getUISettings(); }; export const getFields = (index = '_all') => { diff --git a/x-pack/plugins/canvas/public/lib/fullscreen.js b/x-pack/plugins/canvas/public/lib/fullscreen.js index f3f6e029696ead..fd4e0b65785b98 100644 --- a/x-pack/plugins/canvas/public/lib/fullscreen.js +++ b/x-pack/plugins/canvas/public/lib/fullscreen.js @@ -5,21 +5,22 @@ * 2.0. */ -import { platformService } from '../services'; +import { pluginServices } from '../services'; export const fullscreenClass = 'canvas-isFullscreen'; export function setFullscreen(fullscreen, doc = document) { + const platformService = pluginServices.getServices().platform; const enabled = Boolean(fullscreen); const body = doc.querySelector('body'); const bodyClassList = body.classList; const isFullscreen = bodyClassList.contains(fullscreenClass); if (enabled && !isFullscreen) { - platformService.getService().setFullscreen(false); + platformService.setFullscreen(false); bodyClassList.add(fullscreenClass); } else if (!enabled && isFullscreen) { bodyClassList.remove(fullscreenClass); - platformService.getService().setFullscreen(true); + platformService.setFullscreen(true); } } diff --git a/x-pack/plugins/canvas/public/lib/template_service.ts b/x-pack/plugins/canvas/public/lib/template_service.ts index 6a262d57672e45..d5ec467f18740e 100644 --- a/x-pack/plugins/canvas/public/lib/template_service.ts +++ b/x-pack/plugins/canvas/public/lib/template_service.ts @@ -5,13 +5,16 @@ * 2.0. */ +// TODO - clint: convert to service abstraction + import { API_ROUTE_TEMPLATES } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; -import { platformService } from '../services'; +import { pluginServices } from '../services'; import { CanvasTemplate } from '../../types'; const getApiPath = function () { - const basePath = platformService.getService().getBasePath(); + const platformService = pluginServices.getServices().platform; + const basePath = platformService.getBasePath(); return `${basePath}${API_ROUTE_TEMPLATES}`; }; @@ -21,6 +24,5 @@ interface ListResponse { export async function list() { const templateResponse = await fetch.get(`${getApiPath()}`); - return templateResponse.data.templates; } diff --git a/x-pack/plugins/canvas/public/lib/workpad_service.js b/x-pack/plugins/canvas/public/lib/workpad_service.js index 70aa1c3f1f816e..20ad82860f1fa7 100644 --- a/x-pack/plugins/canvas/public/lib/workpad_service.js +++ b/x-pack/plugins/canvas/public/lib/workpad_service.js @@ -5,6 +5,7 @@ * 2.0. */ +// TODO: clint - move to workpad service. import { API_ROUTE_WORKPAD, API_ROUTE_WORKPAD_ASSETS, @@ -12,7 +13,7 @@ import { DEFAULT_WORKPAD_CSS, } from '../../common/lib/constants'; import { fetch } from '../../common/lib/fetch'; -import { platformService } from '../services'; +import { pluginServices } from '../services'; /* Remove any top level keys from the workpad which will be rejected by validation @@ -46,17 +47,20 @@ const sanitizeWorkpad = function (workpad) { }; const getApiPath = function () { - const basePath = platformService.getService().getBasePath(); + const platformService = pluginServices.getServices().platform; + const basePath = platformService.getBasePath(); return `${basePath}${API_ROUTE_WORKPAD}`; }; const getApiPathStructures = function () { - const basePath = platformService.getService().getBasePath(); + const platformService = pluginServices.getServices().platform; + const basePath = platformService.getBasePath(); return `${basePath}${API_ROUTE_WORKPAD_STRUCTURES}`; }; const getApiPathAssets = function () { - const basePath = platformService.getService().getBasePath(); + const platformService = pluginServices.getServices().platform; + const basePath = platformService.getBasePath(); return `${basePath}${API_ROUTE_WORKPAD_ASSETS}`; }; diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_fullscreen_presentation_helper.ts b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_fullscreen_presentation_helper.ts index ab26625038bc58..9021c6d6c27533 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_fullscreen_presentation_helper.ts +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_fullscreen_presentation_helper.ts @@ -5,15 +5,14 @@ * 2.0. */ import { useContext, useEffect } from 'react'; -import { useServices } from '../../../services'; +import { usePlatformService } from '../../../services'; import { WorkpadRoutingContext } from '..'; const fullscreenClass = 'canvas-isFullscreen'; export const useFullscreenPresentationHelper = () => { const { isFullscreen } = useContext(WorkpadRoutingContext); - const services = useServices(); - const { setFullscreen } = services.platform; + const { setFullscreen } = usePlatformService(); useEffect(() => { const body = document.querySelector('body'); diff --git a/x-pack/plugins/canvas/public/routes/workpad/workpad_presentation_helper.tsx b/x-pack/plugins/canvas/public/routes/workpad/workpad_presentation_helper.tsx index ccb38cd1a1e0f2..bdf84de7a47bd2 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/workpad_presentation_helper.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/workpad_presentation_helper.tsx @@ -14,21 +14,21 @@ import { getWorkpad } from '../../state/selectors/workpad'; import { useFullscreenPresentationHelper } from './hooks/use_fullscreen_presentation_helper'; import { useAutoplayHelper } from './hooks/use_autoplay_helper'; import { useRefreshHelper } from './hooks/use_refresh_helper'; -import { useServices } from '../../services'; +import { usePlatformService } from '../../services'; export const WorkpadPresentationHelper: FC = ({ children }) => { - const services = useServices(); + const platformService = usePlatformService(); const workpad = useSelector(getWorkpad); useFullscreenPresentationHelper(); useAutoplayHelper(); useRefreshHelper(); useEffect(() => { - services.platform.setBreadcrumbs([ + platformService.setBreadcrumbs([ getBaseBreadcrumb(), getWorkpadBreadcrumb({ name: workpad.name }), ]); - }, [workpad.name, workpad.id, services.platform]); + }, [workpad.name, workpad.id, platformService]); useEffect(() => { setDocTitle(workpad.name); diff --git a/x-pack/plugins/canvas/public/services/index.ts b/x-pack/plugins/canvas/public/services/index.ts index 83a54a8a673a1b..0aaef4ef280f0a 100644 --- a/x-pack/plugins/canvas/public/services/index.ts +++ b/x-pack/plugins/canvas/public/services/index.ts @@ -10,13 +10,16 @@ export * from './legacy'; import { PluginServices } from '../../../../../src/plugins/presentation_util/public'; import { CanvasWorkpadService } from './workpad'; import { CanvasNotifyService } from './notify'; +import { CanvasPlatformService } from './platform'; export interface CanvasPluginServices { workpad: CanvasWorkpadService; notify: CanvasNotifyService; + platform: CanvasPlatformService; } export const pluginServices = new PluginServices(); export const useWorkpadService = () => (() => pluginServices.getHooks().workpad.useService())(); export const useNotifyService = () => (() => pluginServices.getHooks().notify.useService())(); +export const usePlatformService = () => (() => pluginServices.getHooks().platform.useService())(); diff --git a/x-pack/plugins/canvas/public/services/kibana/index.ts b/x-pack/plugins/canvas/public/services/kibana/index.ts index 7bb2be3f77e27e..bb0095a3c525ce 100644 --- a/x-pack/plugins/canvas/public/services/kibana/index.ts +++ b/x-pack/plugins/canvas/public/services/kibana/index.ts @@ -14,11 +14,13 @@ import { import { workpadServiceFactory } from './workpad'; import { notifyServiceFactory } from './notify'; +import { platformServiceFactory } from './platform'; import { CanvasPluginServices } from '..'; import { CanvasStartDeps } from '../../plugin'; export { workpadServiceFactory } from './workpad'; export { notifyServiceFactory } from './notify'; +export { platformServiceFactory } from './platform'; export const pluginServiceProviders: PluginServiceProviders< CanvasPluginServices, @@ -26,6 +28,7 @@ export const pluginServiceProviders: PluginServiceProviders< > = { workpad: new PluginServiceProvider(workpadServiceFactory), notify: new PluginServiceProvider(notifyServiceFactory), + platform: new PluginServiceProvider(platformServiceFactory), }; export const pluginServiceRegistry = new PluginServiceRegistry< diff --git a/x-pack/plugins/canvas/public/services/legacy/platform.ts b/x-pack/plugins/canvas/public/services/kibana/platform.ts similarity index 54% rename from x-pack/plugins/canvas/public/services/legacy/platform.ts rename to x-pack/plugins/canvas/public/services/kibana/platform.ts index b867622f5d3023..79eae8d8081bba 100644 --- a/x-pack/plugins/canvas/public/services/legacy/platform.ts +++ b/x-pack/plugins/canvas/public/services/kibana/platform.ts @@ -5,38 +5,17 @@ * 2.0. */ -import { - SavedObjectsStart, - SavedObjectsClientContract, - IUiSettingsClient, - ChromeBreadcrumb, - IBasePath, - ChromeStart, -} from '../../../../../../src/core/public'; -import { CanvasServiceFactory } from '.'; +import { KibanaPluginServiceFactory } from '../../../../../../src/plugins/presentation_util/public'; -export interface PlatformService { - getBasePath: () => string; - getBasePathInterface: () => IBasePath; - getDocLinkVersion: () => string; - getElasticWebsiteUrl: () => string; - getHasWriteAccess: () => boolean; - getUISetting: (key: string, defaultValue?: any) => any; - setBreadcrumbs: (newBreadcrumbs: ChromeBreadcrumb[]) => void; - setRecentlyAccessed: (link: string, label: string, id: string) => void; - setFullscreen: ChromeStart['setIsVisible']; +import { CanvasStartDeps } from '../../plugin'; +import { CanvasPlatformService } from '../platform'; - // TODO: these should go away. We want thin accessors, not entire objects. - // Entire objects are hard to mock, and hide our dependency on the external service. - getSavedObjects: () => SavedObjectsStart; - getSavedObjectsClient: () => SavedObjectsClientContract; - getUISettings: () => IUiSettingsClient; -} +export type CanvaPlatformServiceFactory = KibanaPluginServiceFactory< + CanvasPlatformService, + CanvasStartDeps +>; -export const platformServiceFactory: CanvasServiceFactory = ( - _coreSetup, - coreStart -) => { +export const platformServiceFactory: CanvaPlatformServiceFactory = ({ coreStart }) => { return { getBasePath: coreStart.http.basePath.get, getBasePathInterface: () => coreStart.http.basePath, diff --git a/x-pack/plugins/canvas/public/services/legacy/context.tsx b/x-pack/plugins/canvas/public/services/legacy/context.tsx index dd2e45740f041b..2f472afd7d3c1b 100644 --- a/x-pack/plugins/canvas/public/services/legacy/context.tsx +++ b/x-pack/plugins/canvas/public/services/legacy/context.tsx @@ -22,7 +22,6 @@ export interface WithServicesProps { const defaultContextValue = { embeddables: {}, expressions: {}, - platform: {}, navLink: {}, search: {}, }; @@ -30,7 +29,6 @@ const defaultContextValue = { const context = createContext(defaultContextValue as CanvasServices); export const useServices = () => useContext(context); -export const usePlatformService = () => useServices().platform; export const useEmbeddablesService = () => useServices().embeddables; export const useExpressionsService = () => useServices().expressions; export const useNavLinkService = () => useServices().navLink; @@ -50,7 +48,6 @@ export const LegacyServicesProvider: FC<{ const value = { embeddables: specifiedProviders.embeddables.getService(), expressions: specifiedProviders.expressions.getService(), - platform: specifiedProviders.platform.getService(), navLink: specifiedProviders.navLink.getService(), search: specifiedProviders.search.getService(), reporting: specifiedProviders.reporting.getService(), diff --git a/x-pack/plugins/canvas/public/services/legacy/index.ts b/x-pack/plugins/canvas/public/services/legacy/index.ts index 763fd657ad8004..01f252c8eb0d6e 100644 --- a/x-pack/plugins/canvas/public/services/legacy/index.ts +++ b/x-pack/plugins/canvas/public/services/legacy/index.ts @@ -8,7 +8,6 @@ import { BehaviorSubject } from 'rxjs'; import { CoreSetup, CoreStart, AppUpdater } from '../../../../../../src/core/public'; import { CanvasSetupDeps, CanvasStartDeps } from '../../plugin'; -import { platformServiceFactory } from './platform'; import { navLinkServiceFactory } from './nav_link'; import { embeddablesServiceFactory } from './embeddables'; import { expressionsServiceFactory } from './expressions'; @@ -17,7 +16,6 @@ import { labsServiceFactory } from './labs'; import { reportingServiceFactory } from './reporting'; export { SearchService } from './search'; -export { PlatformService } from './platform'; export { NavLinkService } from './nav_link'; export { EmbeddablesService } from './embeddables'; export { ExpressionsService } from '../../../../../../src/plugins/expressions/common'; @@ -77,7 +75,6 @@ export type ServiceFromProvider

= P extends CanvasServiceProvider ? export const services = { embeddables: new CanvasServiceProvider(embeddablesServiceFactory), expressions: new CanvasServiceProvider(expressionsServiceFactory), - platform: new CanvasServiceProvider(platformServiceFactory), navLink: new CanvasServiceProvider(navLinkServiceFactory), search: new CanvasServiceProvider(searchServiceFactory), reporting: new CanvasServiceProvider(reportingServiceFactory), @@ -89,7 +86,6 @@ export type CanvasServiceProviders = typeof services; export interface CanvasServices { embeddables: ServiceFromProvider; expressions: ServiceFromProvider; - platform: ServiceFromProvider; navLink: ServiceFromProvider; search: ServiceFromProvider; reporting: ServiceFromProvider; @@ -116,7 +112,6 @@ export const stopServices = () => { export const { embeddables: embeddableService, - platform: platformService, navLink: navLinkService, expressions: expressionsService, search: searchService, diff --git a/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts b/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts index cebefdd7682cc9..9857e27d8a3cf2 100644 --- a/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts +++ b/x-pack/plugins/canvas/public/services/legacy/stubs/index.ts @@ -11,7 +11,6 @@ import { expressionsService } from './expressions'; import { reportingService } from './reporting'; import { navLinkService } from './nav_link'; import { labsService } from './labs'; -import { platformService } from './platform'; import { searchService } from './search'; export const stubs: CanvasServices = { @@ -19,7 +18,6 @@ export const stubs: CanvasServices = { expressions: expressionsService, reporting: reportingService, navLink: navLinkService, - platform: platformService, search: searchService, labs: labsService, }; diff --git a/x-pack/plugins/canvas/public/services/platform.ts b/x-pack/plugins/canvas/public/services/platform.ts new file mode 100644 index 00000000000000..7a452d809a6146 --- /dev/null +++ b/x-pack/plugins/canvas/public/services/platform.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + SavedObjectsStart, + SavedObjectsClientContract, + IUiSettingsClient, + ChromeBreadcrumb, + IBasePath, + ChromeStart, +} from '../../../../../src/core/public'; + +export interface CanvasPlatformService { + getBasePath: () => string; + getBasePathInterface: () => IBasePath; + getDocLinkVersion: () => string; + getElasticWebsiteUrl: () => string; + getHasWriteAccess: () => boolean; + getUISetting: (key: string, defaultValue?: any) => any; + setBreadcrumbs: (newBreadcrumbs: ChromeBreadcrumb[]) => void; + setRecentlyAccessed: (link: string, label: string, id: string) => void; + setFullscreen: ChromeStart['setIsVisible']; + + // TODO: these should go away. We want thin accessors, not entire objects. + // Entire objects are hard to mock, and hide our dependency on the external service. + getSavedObjects: () => SavedObjectsStart; + getSavedObjectsClient: () => SavedObjectsClientContract; + getUISettings: () => IUiSettingsClient; +} diff --git a/x-pack/plugins/canvas/public/services/stubs/index.ts b/x-pack/plugins/canvas/public/services/stubs/index.ts index 5c3440cc4cdbce..1aa05647f7e9ea 100644 --- a/x-pack/plugins/canvas/public/services/stubs/index.ts +++ b/x-pack/plugins/canvas/public/services/stubs/index.ts @@ -16,13 +16,16 @@ import { import { CanvasPluginServices } from '..'; import { workpadServiceFactory } from './workpad'; import { notifyServiceFactory } from './notify'; +import { platformServiceFactory } from './platform'; export { workpadServiceFactory } from './workpad'; export { notifyServiceFactory } from './notify'; +export { platformServiceFactory } from './platform'; export const pluginServiceProviders: PluginServiceProviders = { workpad: new PluginServiceProvider(workpadServiceFactory), notify: new PluginServiceProvider(notifyServiceFactory), + platform: new PluginServiceProvider(platformServiceFactory), }; export const pluginServiceRegistry = new PluginServiceRegistry( diff --git a/x-pack/plugins/canvas/public/services/legacy/stubs/platform.ts b/x-pack/plugins/canvas/public/services/stubs/platform.ts similarity index 72% rename from x-pack/plugins/canvas/public/services/legacy/stubs/platform.ts rename to x-pack/plugins/canvas/public/services/stubs/platform.ts index 5776a1d0d69834..181d355df8a1ce 100644 --- a/x-pack/plugins/canvas/public/services/legacy/stubs/platform.ts +++ b/x-pack/plugins/canvas/public/services/stubs/platform.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { PlatformService } from '../platform'; +import { PluginServiceFactory } from '../../../../../../src/plugins/presentation_util/public'; + +import { CanvasPlatformService } from '../platform'; + +type CanvasPlatformServiceFactory = PluginServiceFactory; const noop = (..._args: any[]): any => {}; @@ -15,7 +19,7 @@ const uiSettings: Record = { const getUISetting = (setting: string) => uiSettings[setting]; -export const platformService: PlatformService = { +export const platformServiceFactory: CanvasPlatformServiceFactory = () => ({ getBasePath: () => '/base/path', getBasePathInterface: noop, getDocLinkVersion: () => 'dockLinkVersion', @@ -28,4 +32,4 @@ export const platformService: PlatformService = { getSavedObjectsClient: noop, getUISettings: noop, setFullscreen: noop, -}; +}); diff --git a/x-pack/plugins/canvas/public/state/initial_state.js b/x-pack/plugins/canvas/public/state/initial_state.js index e4909bdb950812..c652cc573abe9d 100644 --- a/x-pack/plugins/canvas/public/state/initial_state.js +++ b/x-pack/plugins/canvas/public/state/initial_state.js @@ -6,11 +6,12 @@ */ import { get } from 'lodash'; -import { platformService } from '../services'; +import { pluginServices } from '../services'; import { getDefaultWorkpad } from './defaults'; export const getInitialState = (path) => { - const { getHasWriteAccess } = platformService.getService(); + const platformService = pluginServices.getServices().platform; + const { getHasWriteAccess } = platformService; const state = { app: {}, // Kibana stuff in here diff --git a/x-pack/plugins/canvas/public/state/reducers/workpad.js b/x-pack/plugins/canvas/public/state/reducers/workpad.js index acd371e9490fb7..ebde0106f9c012 100644 --- a/x-pack/plugins/canvas/public/state/reducers/workpad.js +++ b/x-pack/plugins/canvas/public/state/reducers/workpad.js @@ -6,7 +6,7 @@ */ import { handleActions } from 'redux-actions'; -import { platformService } from '../../services'; +import { pluginServices } from '../../services'; import { getDefaultWorkpad } from '../defaults'; import { setWorkpad, @@ -24,9 +24,13 @@ import { APP_ROUTE_WORKPAD } from '../../../common/lib/constants'; export const workpadReducer = handleActions( { [setWorkpad]: (workpadState, { payload }) => { - platformService - .getService() - .setRecentlyAccessed(`${APP_ROUTE_WORKPAD}/${payload.id}`, payload.name, payload.id); + pluginServices + .getServices() + .platform.setRecentlyAccessed( + `${APP_ROUTE_WORKPAD}/${payload.id}`, + payload.name, + payload.id + ); return payload; }, @@ -39,9 +43,13 @@ export const workpadReducer = handleActions( }, [setName]: (workpadState, { payload }) => { - platformService - .getService() - .setRecentlyAccessed(`${APP_ROUTE_WORKPAD}/${workpadState.id}`, payload, workpadState.id); + pluginServices + .getServices() + .platform.setRecentlyAccessed( + `${APP_ROUTE_WORKPAD}/${workpadState.id}`, + payload, + workpadState.id + ); return { ...workpadState, name: payload }; }, From fb20e0219221034ce1095c83e7e187f131834782 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 1 Jul 2021 15:10:09 -0600 Subject: [PATCH 34/43] [maps][docs] 7.14 doc updates (#103531) * [maps][docs] 7.14 doc updates * more details * timeslider screenshot * Update docs/maps/search.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * Update docs/maps/search.asciidoc Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * review feedback Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../images/enable_filter_by_map_extent.png | Bin 0 -> 724529 bytes docs/maps/images/timeslider.gif | Bin 0 -> 656115 bytes docs/maps/index.asciidoc | 10 ++++++ docs/maps/search.asciidoc | 32 ++++++++++++++---- .../dashboard/enhance-dashboards.asciidoc | 2 +- 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 docs/maps/images/enable_filter_by_map_extent.png create mode 100644 docs/maps/images/timeslider.gif diff --git a/docs/maps/images/enable_filter_by_map_extent.png b/docs/maps/images/enable_filter_by_map_extent.png new file mode 100644 index 0000000000000000000000000000000000000000..5132dc8f73dbef31579e5a939931ddab22726adb GIT binary patch literal 724529 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

38{F%dVJ2PEhj|uceQm=hdCe(C~-eTMdM*8 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%0DEkYtvX=eadk#Ng6v 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

    @3%QYS7Y9G?%QE5CaJ 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%0A)FUpYw!0j9%n=^Nkk5a=g#oApUCn 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

    bPfvt~Nk8C;3^)Q{`S_lDMPR9b!ymssb?MffG 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

    D?oS7HYTP;e>W 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

    jdE#jhAh=C&*ziL> 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

    F1-HPid9d9F_uAP^)E!XRczPkM3bK~8 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

    x2g7su{A0rI&*LYy=i5!T3y zCOz-Cc~ZYLfb8e;ZeddC~ZdT8Xy3Gg0ZUOc&S1*qH0$&R!##n z?^Dt#2Xd!OOUrK99*O%-pBx4xX!$AMpva&8PQ?hq&xJe}XJ$n-%gMUx%NFJC8J(G^}%L{+RWKaZ@kme9<%LLOb;=iL&&@N z!%ity|6;)|h_cPK-c~&)M*bqdKza)Up&e2p1o>bZaiEg@mx`260#uwAk|Va9LnMTx z<42)RrJ!OPec24srC;Br_5YecNGzzo*f0w9Qo^N;UvF*Da-h*Y8MnzS14TGpj{87O7$G=+bOIN|tF_#1>i7^3*0=r0N z!F9{diCI|0?IYn<<&Cl+x(;85$*?a%hK?o$f6uTfalA=9OWdu1kT8bcNRHGK z4RAQ|BZbB6EcC|-P#`3AnDNcpi$pLJ>?6Hg%(`4Cv1BGnX&Gikkb)uQI4HI>Qk>^S z?4f_D;*j9MIQun8c+pEv0`E1W3k%u)YXF41kqpvpUj1~oINP(V*Ha1C3Xmq*!lo^w z2JB}=ioT1leUC3^Sx2w{lI4oL`C<#OBJujUA?}jI5Lpj9M93lq!7vfQi&$Caj4t!M z-i&UfdPNb~31}RCgzsbRB!$NNB|D>4^l3DHYUjq~>SU{5621;dYgwQsxdOweXA}eZ zQvlWpiHYw<$YdC2#-aKgbre|lYinx&>hHcdFn~#dh(#!7orRu&HSx2t)O*zM0EQ}T z4IqKx)Yy+&=7uCG)`|f@=1;)D6*jLmya1B=*Tg# z6CLb7_e9T4Lj%+XM+Hk7CFd~9Fg%p6QgkOpt%gbG>N1`SKj3;cDL1!g>90t8Hb~W^ z;zq7r%uX-9qG$P^@l@Skm&y_@VNvM5O6gNTsBrSw9<&5VtnK2j&hZDeTSaI_7FeMc zsZ@weg2wqJtrjmh-7lnKBE@K;cka}o zC*ssNmu`PEI&lL?cT5`>NM26#m5BDSl<1}NS z6dxIoOUHSa29H$mJy&O6nQ<`%og_*hps_p-f21obS+ooBlPqtTn^<`Ng*t1!acY=7 zQmN7=rzQ?A~w$&cXXG3lPZ}rKk#p5O*u69V9V1 zIv4q$dd)w9A@=xgj?z{d-Ge?N`k|KC3D0p+zFw!bjJN1^TWb_q4BUZ6tk&t0X7?}t zMcPEY{iMGf8>l1Ke5*@#?X7g)xXL?{)}kMVqZ*m+>H2?J98Fj3#;6I~*e zxC-|V-oUdE>lac02)Nc0Ec`JrC8JR1DM}_Gle`?zGtEX2qYh@p{x&$e1-re2`OyPB zozj7&VME5Esw{a}7&xS-)B+VH%O)XhumG7Bh=UTg! zy8brMXIFE|Z%{0I@YjZa%7sse_uptQ%{WL!gv29;lbKTl1`KuQ`ie*l{<>anm zG^Uf;luOS}bkyHB_PdYMHSwBBy^S8-sv{OjR~w>;vJnnn||)Nm@t&^xL0|x_&v>ZeiZ!HZn#}5iM`m%>CIj- zl~>^Xj6w)Stwzn<@pxIWfS7UT;t~2I88(er+JilDR9AO${k8E~0UBA3wRO}R)X01w+wJ=^YQK%>^6jf)OkZ`XI(Xc6B>A}GO8p%Utn1a}{l01S;~OOn z@t|0fgReY+@4bf)f8vkywpPh3*6=z{nn-vLVGH?=9>v+T2RTIQ&d2lLk9`Kh+HTh0 zU^kivA2!eb^EO9=7EjL`V{zdJhTEJWZ|I>gG5v1;QJ7&tww6&0&1 zLa=MkwAK~?(21>GS&IFR)q_*Uj^N;(Hk%FesPn@hskSQDcZW0HoeK>+ZRz(N*8T;2 zwRN7ljwyy1uqYG9p_{?hQy))T-)DBz(y@%2hGNm`ZG3>o1Y}5bd8#3oAX!9A$E-`c zA`Ou(lKqr838$I?#L4qa|LeggPhpsxbkKs&jK)`@Es530ON zt;n7lIPW-@@g`dEnRVu#PtaL-j9qLtw?8~(fpdXo(67??50aD7)ptcNvz3tdFSB{D z9(`b3(9{GnI@LJA%;}jh-eqOmiDT%hh#zt?UP#htxxEhIs+THlevNTS8A{^6aJYIc zb7BiJdniK@6tx$m<%fcg8PsRvK6xfnpbQJFmEFXh$VivR&ONHDP|ia{XA!$cwlhSR z@j~@qhh0w*`R>*X@iS}IvKguNztK;y+6dlaf+6KRM-49&4U4}&4=3b_kJ7V~oJRC`Wo5dJCA z$OOUBLTv-PlFz>5KAKzQ??Rt~AL;7r_cdrX_H_;NW=i`f@tQQj)2}P*ussJbnBSc_ zZb|kQIxKksAhb>C&&TS|&~n`DqPB9A2bY8^+W#*&EVOC@6yAv?MA7QAmqs&Q(sx)E zPnzA$+}ia}fs>NTaea1N*NXiiH-SK{<^|rg-A}S>IY%i>!S#vKw+f9?$FC|@{C)EC z6_!shEC8b=dm}XXF}?au_J-)gL%7WVi2#=jV3qcDTkS4X<_=oxDci=zYSK?;P>*z9 zV&LWb72GmUI93{|UgTqfS#R-A={5h>R7~atb*Jn-!J^CI5W*YG$O(xp|7!*JTN{e6 zw;Z6<=-xoHQA6XbZvE|Cq zzC-{xxwt57+a3_vLf+fDw;DbAuOMI{4r-SlJ{ylgi`z@vZXwrF46~kYBs5dQQTZ2| zjc~j9>)`r~8ou`PT+s4#v#>bwdAF$7&n>BL4%c5DbN7m49sEQE-iTbzu3rQIh_L_X z8fiiQ$CV7cBzMD3ixS@aj8mT(ay^TpeI*i6Q?}`U^u_leKsZ!^K_~e!8`~(KYx`xS z2_`dx2U*&f>bxW5s&Gi=B(^tUp7pp~TTJ@uIMx5KT>3yfV|y$qr^2&C!uy)CpZ~k! zALfr*e4Q7UBWoB&h|VQJExSq3>3#A|G-clo5Q)Hd1_287XBC_oyiK|qK(ud!@l9O6 zUXF;@VyL79pS-p`e~zAJr%U?bCqOb$7PjqT^4u9o1T)15Qsi-#+(@Fq#hW7D={eT2 zqVLE{tj?#|^!w!F7_5%eB(lKj=}%3fCTDZi+K-%y_?Y+v@KvTu=xtJ{ZQDy!J&N&dLBU^@ z(Eq-$0STa^qyON(PaAi-LCXkT7V^;kQCPt>m;GLL3)1v@I!LYDG9-&${Q#wINm5{A z-oNB@@Lq6ZIgpp?xKTY@6iZ~16H|vy+k%!~Q-${SzERqk!A!cJ@^d+SaG|54`&bTb z1;D2xymhoOvo+*Iio(zEvN)86dUu1qe{%@d z35a6Ex}62aEd}%F^Wro~nc38hjgO!Dh1tND1e24KZPxlJ{z6v5M)xC-GfM@bd${Eo zV%NK(PoHRi7s|Q0a&vRTR2$WWgoPja)*f>;JgIvXfLiA4+HDGvUiG1|M(pWfJHX9X z?xE5p+OXS#{UD`oqbt&KpAvBvOIYVp(kHDbmDjP6E!o~84;N=O_Tc4!g>lB>|KV0J z*XNB98q+~J*^m71M{`M4xL_m`l7#aB?P~`ige$A5O;`nHxcu_CAhHi88UpF7LRo2e zwapUv)(S!g`gyvGstmhuxJH?;`fv*kl_IgJTi2J;XAYm&U0{*OURvjBd*=E4v13h| z5DnI|YUsttIs{SLg=!j^tQ_fnuCNRgkP&ipZ89@BTcFasWQPV+q$v4Bt3PU?0qPM|NAUHlWNF)II4lo zb+e7SPQ69``64#w7M2rocbRbcR#7ISbb|ddVb<^Fu*ar5@_&1xTzq_~QvaG1I` zKDzg>Xj0_Cay$BmHscHkbYhbK!3`j^kFih*k@jxQIezBG5ZRx08`B5CljrNHJf_u$ zx%-h_Q$VZP7f2E!4G;;aXZNoI5kpXW6T;T$q^H z>sWTY;pHq5h7nj~w$*2d&{tmL2DL6cQ2`64e$FRPYWo3b_^a2O0QmG^A%8{qm12H|^>#_m z^gJOJ#Y}lIxSDjb+gt~L?dp?kMNxES0DA}!Fb{e!1q9D7FDi%LQ zIB;`X=?(3s#iytbWzS_SXz6G%Fzx&k0rrTYN61ua9ucf%#?R1(;~G9LFmNe*<7#%c zxUf(zw5y<2Xmx$v!9-I#X3Q#~0K)y3`ns{@3ts<6My^arJwllZzKXGlm;ZuuJ zSKKXOtiKG(!xK*cB!Q3H76UE6_QGkX1#;w{>jFSe=K?ENV+QmDgGy*DD!Y-?bHg`|*t2`dun zMwSuUCygNH1E;RHi{lDm2P9 zc&MDZg^)E6o#(=q6=FhOLU=i?uq8ge%w1l|>OwrX3gnxHQa&#KrX8-g)LKHk18a2& z1wKZov(_0ue-5=EKkLJckO|qHIT>~YHdoGTs&Zu{m1}r;_V1AX!>~XdAR}V^BGjNSf*lDB$^l=uxG68xyD5Ko#xXtn zq;x>iU(0@<=1U-B1BDc9sL8fD+wXn?MPDKoaDv=hfASPt@`ct6x25n6jP&;>MZEP? zxzZSG*ZyU}DVG=gh7K(ur)NJZ6=lJ;Ij=yh(2xv4&gGbd7aBa)$w((wU1f6w&|pC` zrkmWc05}p_6W&NOuc|lu4+%Vn=j~=%r{5f3&QKl%Eun!9pIsA-T^BfsTr2C({Q%)j zwKxLTQco9o*2X=GzLuI{9zFY<7wCxTGJ=YONU8mareO|lW0>nCmyn~1Xa-sB+DRYz z(MKj3UQB9SFB0piE&OF~)V(f}|6j+oi(a+N)#gW)7gz23L7EGGQ}Z5elCYsW0c*jF zb&nFCXevNB5g;1`7^$zXFC!HV`XH_L^O#-4njx_E(xFuMi0*EirVQv+P~YSsT9mT{1($Wz(q2S@VaU?y#(ya&5*4C*;I zvySgP1;)sc36Yog(KZ7%7@gOEV|k&+sK++tW6VXeBhRN506D#QwYl8DK!P0}a*Yq* zC`^Eb!UYetn!4ENbIE03MRFtFN(y};MOJ&PsbJfX$Cw)Gab4FC9W`F2T6E#ERDO-z z!Giw5ho@>z#e!AK0n;caY%n2%f-(*WyD8G@bGTFamL(8st+6DbQT>D0xaHAa&WFA8 z>s#7CsAWn{EKt92b>3=LWqJ9don|9!^XHFAzgx124@A%Od()waz}T3+>=LJI!9(2?s zM*!|kXcExkeLcWW%S4xeze7XMNHC6rkXsj=E9*%axdVG-E^OT$x%2xt&-9bW>%|T% z4-%CMmpSr5b8YPpDqk8VMPrR=0on4*aQvxC)3W-)D}rt&+Hbylf7ntfQvb>mtkG~v z;S?Y>!l4C^%YlPn%=}z!@a-GF$wzRMTFbZqn#{O}W|{Q}=v44OTzz#^lW+h33K%`Q zVRU!*0O=HvP{1MG-8C8!knWTg5JW^$x)CYqZlon7jNd*_{GM~Z=RW7&#((TwyYBb( z${(B*wE#R_gn(MRJlt+Wk^~A#XSCd|I8q2maEj72G=0J=?f1EA{$%c%E773%Zs()( zz9c$+uF~#!GH%it=M-ZuWNPt`>hDUDxj)==vRTV+L>A#l z>BncLYo)FK+M8G01K<3#lYht=H*a`EknflZ_;~jCCs}<4;Re``T1G&DP&+ym2-o9c z(^kPw?u@~-k`qQxN^!A}TW4Dn%*sf(-~_gQlwjrSc~zKxjVg-&g9*`#!m-l2yeH+G zgdWxg3OQPRKz!?sKj9a}#`rd6I%1Km&FhU1>>-qBY0^Z40d*2^J7G{b z@Q2YylM=eEnYIhgXe)`Kw2H!A;SI})Rv#?;lRMdIQV@5jRk88(J=0cdLrk7ff;e+V zk2W>If3pDg1}@9Nw8xlf$ zZQ+U6KNNb4d(w|YVqB{0>K<1BBO2|xx7S}y24pf80irHBVF!9JMOW8mp{atNwnRoh zN~71^9`9OzySTKepu_0DiDuI{)uY4yaxlaojXfTnDQRhmA?4sB8KK{zVxnB`;hSqM zr*9OB60l|}w1=d>mN-KoEkv{m2oU}p9!AfPmN_nN?g0r8&S&(DTw?9uK9>A}+{6u> zMyiI_a~GuMX$7)D1eRc@C`3R^Q;wt;c{lOyQ#l2w8FzDuZg5usoI;2rJzZBy?8_fn$R7#+{>MiDM4x|>jr(MaTA*eghlM>fwB7gDwVz=3)uV` zSP2x*TYg^t7<>Llf4f8OYEntBc4s8zgEo}Lqhw1?S{9x(3r!DXEKhWCB6Kt}w2Imt z7IY9&?>-}Zs}QfDo|XXF;sokU9In1gfc{26s3jc%DiX`HiIP_JjZAuX+L_efyRC}; zQaBMl2lAwzfn24Ll-!Up1x^{SOCr~Bi#Bw>Gt$g6^qHv1!AFQbj`2Mx!kmdx9_wwp$g!%O`2LqZUYB2A+5K%*T-$gG_tIrhur}lhOPy>^tx6iK zRVP;|WUJ5n13#@^vW_poLY-E8I|ORzTTKzzCIV^8C@7`wrflqD@!I+@chppMFv8LI zu_%Jj{clo8Z$XleX6=vIYvNmN0H_&LG!i8YT1WdGZ51iKLAt6%*@<@nuRUD)^#X&7 z+{3OO6z4bntEzfmvLo{XZr8R%8Q!`?et&gGwCYNOLOu!p^Js45l2qiiC|jD)GH?X} zlRBb1fHeDSLmQD>_ZKf*8jskrqe}Jzd!qbW!XzM`oeqt`m?-)HDr)^W zbd|17@bgss$Z@PSX9+Iofjnkg zga81N(#Z75JNBvN0XRO_Sg?=Vk^|63WPvar8q%g3#_%FQKwYlM6w8+usr$tq@t8{3 zXbMHbzAu+>Fx1LV_0T|E1W)mw_?~k=MnLEAakl-RA>1}NX=@-aMkxSVUS1Ahb4EoBzPxbaL{)RV z5ez+=t3-TQd~1obH<5=`U+i6u!CG!d@co5Jq!xRU{Fz4#3 z+2#9}4=)CU5_7(z8ZCfO0CKV>2@eW^pR?Kgt-7-Hk1?p!QOEA4Dm!M;<_yQa!fZoV za99VbGjbq^UW=widjxs(DTv&{58N`{g12dYpnbYrnticySBz0Q{=z8nLjZ%wD+Y0q zT=$V3-(D|p5gvfxcFP@}bT}Ja6t$GM+j$o7T1e#Ax97hzg11PDP(Q?#xxPQ-=)chT zGIp++>-~zsLSIDdLfI<1GEQ>pmk4q82C=;hK0s@yS9k~jW4kS;_j}=L|3!>f04z(^ zF2GJ#caiBL;^54J*rvme4*ps3{hG#9HrRLSAdjGQxpgm&w)QlA58g95#cXeF^E}Z^ z7n7*AJDzOrDtIGf@#WQCAtIc1;UtQLjh+Si^O-@qf*d#CR7&v zo;kpb?%koHNsJDo0GoQuPVv#8p4h-5ayNS~b*t9fTpTv5e3M#}(IU2~N}=yt-XeaV zzIfUj#1df_#@Pt5xRaL9dUO)^%M4v?C*ud%@Ql&pSerkf%L*JG?^z;!8|E< zZ!Q~UP8*MU#Fkwv!+#uKGioU2EOq@6s_UpF0YLur38#kacPY3Gc#u-eP_%2;PP%5T zvgPZtKKmOQLvYbTN8BCcCvRe{6M@f2HB`mBXi`KlEM)O9Aw-gv zAB-Ty1AeD(^tvqL9$=>Hq?#5@-*Pz4vvK?fI-<10KBu!!O+o$V>VA}l!bdbbJTZ6{ z`(+ahJJ$2(VJCNoJuJU-l32$?3D7zWP#KkW&ihw;kwu*=n$R zlZNZ?G;K@FGeS!!im|v9bd1C_yq-Z-`ahRpFp9u`fgE1OYUDE$$922$p|BNEfAr*) z3gqV=IQ9WDL)8mkM}OP|Stj_@85@O)05+8y@XHj^G##}9;~Q4Zq1CYO2YTDG6uXxc zwSL zvf#eZ=sy;%FUki=Y~(D2xiSylPp?cf>B?S{;xU`!xMoXw#R##%CcE7U(Y>FKmvpF| zj%Oq9)z(}6&T1ssdBj(}(_(y)RA_+>3TVlR040cPxGV7Y%AXsR@<`YghTKr$|7~#Z zQIvfhKZQoq40q5Kc%GKQvnSHNYTTbSE3`43l)wpp4wFZ?@Cg;7Gf1=`C$biYQN&=` zrab9$mss=c$OhaJL``zW2D&Jss~k4J&CGBY*Kw%r27pevQCBvp}r<=_9J!YKIi(r?t-}{fmy5~L#{-XI+71pvYe=`LvF_#DWzzsBW$1Bn0)_z)vQZk zz;<#>%Y7M7*NA*e!Xu3Q-Y3%u-k^-|C6P=qXQe!z^h@}9` z&jq_7OrQ%s(V6R?WWohtJ`okldQb`CTp$Hl$$!T;i(xY&9(opuTa0DJuT zD!g-RDb}u*)sVy*-E(!?z3=k){{IsWft^5(>i+rSIVl*VOo}TJ_gj`&kQ&gdRz{x2 zK7&8-+^hUn;c$-pIF*OzUe-ZY$j2yW_ER4T@5BVLoN=!86{h8ibC#D+Xtk50D%}XK zVigt?II%#XJ>?8_I494`!42HL^!@&7@6}HrmnvQHN7}@prya}ISroVkWUvmk{X;(k@1fomzHWpd^6`ITTeT+0K{mA!?SX#O=9$1$FaL><9OS^A;()PX9-_!{!R2= z?P#`G7obRyumAxIc%vDM`LX=P58sZEC~8t4k`CBQfC!*L0gQK#{ykta_ka@Z?vK5` zhGR1_-C*UWH4cIkO&(2A#c$oEik~7&FvGTU)gV zEulIMh;plXbQ^<_1%zLLDMX&f3;om3gzLetGMk9|{-{!aTig&4MudRU zbKI781Wnq{JP{6{3CC) zey^FpVemrhwUSKS<8}4dMk{chWvobL%OtF!>3`uv=)y9io3nL(@%7*j!H1g9iL>~1 z2?|})^=^Cp3r=TsE-HZMfIe0BK`eaZRXw9rP_Bg<8m84^!!~>(s>au0sjYQB;{A=J zvOc(w1W!#5B)i~{T>h!@^M^&Phm-_A&==n_O=f|_uP!0JB+kW{o$Ahl>iJ`mwVC}S zC?q}^wHfRO7{!%T%|<}RasV7 zN+I0LH=@v4iV=)=q^LWcMzt0Pk9zaQ%ti?g*s)g1nqI{MaOoPx5F{x#;_IkNB(oxA zkrFTvffRs}N$IH&%V&}$Fe65Tja{BQb5@(Jh#?6~4H;k_^t!{7kH-g^CPIa-eBBix zWK=N%2P4kIunw%+w(C0DW(VSC1T73=o{WLpEnQvtu5c&E!Z+Vbe`Do5mBF6k9A^0k z>0}N^pRy2&35apse|<#%p)9rA9SHUA{?>pCq2DN72Ec#$j`4{)hHMo0y|oZ}3dKah zcoRKVDvU#o0!@~PK7^j7IC8{3SZi2jruTuDQcR({6ixgdb42Z%1u3}oC4;#d4)(ZX ztxM$PhPrd^cv)aZ#QZzb0Yf}Js^=ETICI#6SQeeQx{*&FKVFM_ag*f3T?&Mv(Tb>K zh=pl~{rd=lX@Fd@IG~SIqG!^QMr;;I7+%qRz6K<`mv>%_Kgapf7;tHuBkEOAIES07 z$(E@*G6aJ4Zt6tYG=$@#WfOSa7-s1}07ye!d#qb_3XB<5hc1of<~Dkl%=#)zP1z>e zIm}WT??MmH&aP$}!A-OEdgd^7cPxvM?F%VK4KF5y=1MO{O5H|=3xE#&Ap4o{i5d@c zH=4o%;9sJ$>;L=usNDLyq3HC_a2rPMnMApAbxoGb2m!oBxmX@f{&eUTzC2nDHyVr( zfaVacp<6k)aY08^To>UJN3-~PN>)y4I9{^QEC4gfb7(SitQ3&B2Z8WK<3RuD@O#uQ zM0Og@lw`)AH>l|tJ(M>~R(&mAkn)^aW|fWJr0CvKI0qu|uhQRSrIQ(mipAc!un2gt zA^}j6pG&!gRM;$y5K3D(9+)t3^WtiFKWGJGl1Vm5vIq{ihoPW8=W>-q67-h%Don;8 zLN&W0d_Z?Er%nzK%s;QanjH&Ukj_lMX`s_&PI$!`BCDVLGMRNd+=Bk)WU2&VJ!cxt zcHST&2Ak1e2GaIm<%2u}Q-(9z5l0g#gk#+rq-U^c0%fvO@hcR@+o>jywJ1TWfPg#a z65^3Hy8$G`#}V0k|AP*IG^q2POuE3} z>&C@f9pEzmmEyu1{CI|lZ*|asrbW}{iZTHFDxOUI&amcX(Kz?G9^MH)nIqr|tMBcv zXNFHXW-N#69GG30zs9?b0?aK4WJ;bLarF}t7NwElo0wg*xk$u}g~K>xZIn2Xl*4=0~q5h5TVTUUg#PE6Wv8b_9q;qh2g!$9b2 zTy&cacP}Gq5&8T6TFCD-pF;pZ@5&*Mfd@rrOCdED-fCgbn|a}zVDCk$mylZ$7k=}4 z_w18SMW&YWvzX7>!S+8kM`CRyXzBagV1xir^drg1%WZT!atb=uMacu_1{fukBUbn5 zU8ir|U~<$(an+kj%QgrshH+&dz=5j!Fg**Z=i%W^jt#pFX+8V=AfnY@Yx)6T#u-tv zUTLGxrc~b1A@h%&Y#0Cbsv`L}T)Xi0OFb)~8wg~DSmeuvJoSY?>aVH){1$=TD7+GM z*6G=|M^oNhZZI+1bSMmO{?(LT_~#sVl^8F2>Z`?*cg;D*_G0~tKvg-oeC!UB3Xs%${%jGn z0qzyC|83;hJlF_Peh1I^5-l-w!odxIkC<0nj z0xT{~`7|PJ0un)a`L}MGPCOEWU?p_qi&rXcPXTefBVanSeuue9+rYo|j$7uc4c?du z^#&hitcfTkafD00!p{LmxdO@DBL_eoMj<@#ynlMDdR7)-sPY3t)FkY{h%M@A!;smD zV8C7G;9orUD~?MdM{Cw>LQ1I=XND0Rxngg$VOc9jpNC54lZcp@x|?66we7B&ajx!C zyNA5l?!MNq`fScAwQe<}46DGL*WAT%UiC8i<3ATXfEC?O8G7}K{UeFrS{wPgHzww? zXmct(>L1rT-EwG?cGu7)At%YVv=_7#f>AzJDuj@<#NyOqrxEMHho& zH2uFHx}3M2sl>(N3(+ycmzI{g;~Vhf4;o_hISQWOB=<}LAkWrn>r0u}01*G7YcRt^ zz9ch$=T&NqmI-PS-|lO{jPFFAIAJaRtIfIvhL|2rHf&T_Tgdc`-{&u^(Q>8&+|U0U zO0TDep@Y6M?(YLJ=mj8y11K!t^&dp^+aYH`MIGC8XQ=k#XF~cxy9}T2$!s1M*Jc+L z$JN&IJ!=aXAA0J~jbS zC_xth^yZ1cdYUrGaC*inTLp^7uKu~+WkPNVY!`sjVKYj>wZ!4jt5cg6-U)`l^EGyw zUUkY)8jvjX#F{Gf@Z^i+sXcMgn<~%|0gv~^7k4b1Xo3d1?siI~!-V`u$D`Mt)c*Aq z#Gj~mJo1@$?OIv0RBY1*4MB`3vz!-wG%3{ymWmRml12#fDvNzpN9l6lc52D(AaO$X z2RCKI zgvwZFxgWTCcoxSS1hU3*@`oh3Bu*)GFq{}n1)7A`Gk7gZh%J-a{Fg#iU_mZtI|F+A} zVi3xO;#Vt$z$f8Id^x<8y$DKJbHqFk`v+vxLfo!JY1ApUr^nnlpDp>t)`0@PoF-u zIh+dTfi=qWLHZidWpuF4XKuaTPrZjma~1$FQ&bz80=R z9i{>Y;(bB5!vunMr!wVlzg$S}R@Xh-dC6Xwj8?N?Fp!dx4yUqe!ux2-n`-g&)idrh zVcCRFSxM=od>x)@@GlT9Wkj^dP6DHI%O49fQce&Ge-OQ6nOs<4%aMyJ_n_kM8S%T; zew_#z)CCzq%jgR<%@WU5A9c(;BSbi%J6`Aqo(QXh zmlG$OEWBi4CKNT@yzm@kS9Z>R@^l2=s%;6+Jav(^Og815?aj-tlopXS7r|5$KI%JO ztrojpsU=EPx>ANSoT^T3SFPE@C-kn%{_;D4(*PNF4N1fc$hI${OVHx${$}&v7yD`E ztis$RfGCIQtkYB!1A)FQfb^wO8{Hx?CT^1Yzga~q&T!nlaVygt&j0ST$Z0ffOWW_e z0)V|>6~gRlZJFp{;)0(2r8kkR)Z)*W(<9`dV_#?LOG)8cOD8C|2|KaR2vnT0m&Q5< zP)q?6d&pkuri4m-g%EwZ_Qa_~WXE%Aaz~fIy>JZ30K`Q`W+oaoHj!Edxkbr11s7;+ zLew!vpta%^TW?^DS}eWO$rySSOf%Fx*rtq;l-TdBma7$Z8)l<&djMpZcjV2Q+#We zQZdCK?B7{0d+#K15E$9^Fchr!euUvP!#CKk8#<4j8AVSWIRyvR3ZD<*HvnaaKOiS} z#T|})M(5-i_9;4tM}Bm-uKIIZ2TlFK9M9@qt=3Q8CMPz@5fLNaXdwU{j9%hCDzd{4Z=AC@*lti>jFi;M+ zu9)vg&Ayb6%#HloI}5A9Vm7(H0C|BO#n0l}J>qoGoEPAkq2kdRBbFjoyq@HYXK<<< zjOkdv*TNX{@1(VVrHIJLzk6z+rTp)O3MQsJlRQT#jmP{4`9tWdBPGOgu?Z0izn9cI z{aZhfzg||pYJ=%EjqxkDS~xhnk}w=#(g|1;x~inzXOL{qwRluXkc^Ta+NUh3bmiAN z8K#-9D%gQh*qhDn(`COs;h@_%N;)fui2vj@W56{wembU)#dy(^e%O@D({9 zz^7|hHh8OFeesi9(e3Zh5&q$<)Kp>)Qelx`1)nFP0Ej@9E^mrcz4`LjWE2hQ;DZ_q z(?6+A`4S$AWZ?mK0s2t>u&kN#_#;HIIVilCl#FcT$L<(F$KBim8na&*X2Hc>BO=m2 zU9OqY`KIx$hA*15)2~|#9Q)FH-y$Fpd=PgWvTKvSoqj$4oZsM8rO9YOLXDmP2mfiX zx+&ClJfE?~xQ_Vsa->*<4>y0DSC!7NhqQdQq!ee2m-~WY zbR?o;1s`V@k5avwB@uNPJ+u^Iu8|cW8J$hi9XZ}afWj~C#*e|`%xNp(xOs?7%{Yl9 z>Zi2a4l~XrCNTxoxhSj*>6Az6?D*z3Q=w@WEgo!drU_qFRd&iE+UyyL!8$LqSs@wl zV!i|x+yFF>*QcHz>At3T<`F>veFsMhP3cP`$h6NJzV=FSevPuE{4h52@{V(;ndH() ze68L%SK|1fPIn^$KS@%a)CGl$0_S6a;}8NMY}}SvyL8~hCt;+!otjFZzpyg*Z^^I< z%R;zW($s;~+#<<7|C##4NdUv%o~=%PlKDX4dCst%aM5e@39;iTQRY%JeS&0C%Z_I7 zyY|g0p-&u2nL2)lvPu9QEX5?PvY>EAc*ta!M2Bf=Mq1^jBp3jn{nS%4@E_m-lGXhv zkeKj*$J$eF)k!7-hGe(-M>j!2{Ex= z98~3daY9%<{D2$}d@;sXXN#tT`>OatD?J63>+`%hczB|f;sbXj446DCqN(5Ce#_8e zC9}4T>nc&4n8PZ6H&TD~Q)IkPC)c~09u7Hp6{FSB0f8@&h>CZZ+wK$^%i!lYq)T(x zbfW}V-&4Wthd=c)T92X`B?aI?s}Mj@Rjt|OfjQwf@QZlJl6UsRS9vfGAfk%#b904C z;{E0Rm!qF+eP81K?oSk^ZL=q7YHGgPeG&!3wT2FlkEi$cDxzcgwP!=0hJ@}2lN&Az7XH`M>2 z9T6D!dJIF#j&I4H`_7-r>OUDcC)jPYpJMv*%-p;*0arp(%yk8o3|pLDSSWj_oy66g z`V@d8vMK!9MJ-(H!`sHE1hg`M*VTOJc;xW(64@)Ws{jP!D>QTU$++!aNPwO(4x(Po zDGTj{C5wcMqeE#Cdvj@Pj_{0hYXv==m3{}`2(_;wR&O+m+uDeJhOuoKK5tF2elym8 z^%cFbBac~&0a0ixH9)JKm^zbdQp)NQ5=$udXRIB@)U$m!LX{=^K`3pPT1Upa>kC#=}zBNst3&Ca}!Q^UY^X0wX^S z$~7X&7wRegHSUSV*%@qOKpFT0@C+LiE#*<9)6_43rxQ{i$nvFtb7DN0@iqa)`k&dJ zEds)}9Bj*ECOm`n4{|ob817GbpvuKbgVHmYw_ie$K?n292#MsQ=LxiRcSh#ta{@nOV`Zqp}(8KgV2+Al3NlDH(&*1*;Jtcf0 z-@Vl)!w~;g(0A*dgfZ6FKZ;R6%I$c*<5QcTWn~fg5C-afhwS}6R(^hpbjaRhRvyBG&YTNwN z7y=4b2Bnat>R<63xQc=ckVdq1LosjvCvkt-$!28o9bA`|>AbkL)pSV@>#`!!r|0Mr zdwIL>)85d_5PJjWUfIc4oYKgPmxOKD~xOjPm?#iYo(8eE+f z@zsDDWxqn5m?Ea$F3g($rVOtIYG?Pge0eUDAYAB$uUEgEz$XIv4BvC>kkF4Y2$OSIhiKEW|Vh8CiR z4mK|JZUXec%MrfzL0|1Yy;UlBEDq3Yd}{e=K&nVcdfm^K>Wxgk1`5-ZA|Lu`!;{H^ zW5Nk76#Enbd-MJCXdZ;Yx&njfLFkPZDI-T7^j(}b5v9V@4b}{-_&M*=vIMf%cd|XK zle2LR+H!;)<+TDrBpvM)LH~SD*i1kzQvpBtz0BR-4mMM-r8x8KA~*gQg{UTtvLxdx`t1#m`TP4RM^Aq#UOkL8lp_g z=T9nUo7l)<;jcwO$DI?TIpzm?=iwweB-Z>G+to2}ssa{baq(-ID~d1}sht1_o{VmY zvyfmY3-BBu+<>mPqv?bH0*e2A)e^y`1oS>?f1^HEB*P%nPE%8cL;mY+j2MTsa;hk) z5*YnsIu0l^#Ll|-@h|a73F_ZI10k(X#4|Rg z?(EM#;m_?~KGni7bc5rk*U5WRWC;06-mi8U<6nch|6cB1Gko^8*rPF|Xs1{<%5(^; z-D;}i!liHAh2?$f;+>-K+F1Ex<$IJ~Uea~8Lg7Wzhd<^BhJ`^Ykhp#)1*&^SvBh*Y=Y z4{ru6v@S`piq9|xn6e#Dn5gF;)8{8i1I9%iez9~XJ6S8htr+$t*#=ZWhu7^m{R_wc!-feqgR!5*n(f4D$7q{uJT!wyQ` zF_w|zJoKSwT*76^P#~;K4Xf9Bk_tYsN!Ayd>})*UH2<$N!@sexf9^;L;y4Px=BH=A zQ}%2O{`&=)tGsWCro=v1t@bTxg%jh6X*l&fQYtApD6pET_X1jl+0VXkj$>aCC{uP4 zUo;)}1F56#W44@QXP+1kho@cZ`TANtUSYqCN4g8%WD-5+9Q=0WzZx^=*-xC`LM7{3 zIf!!tR*LMRp{ERi?z(?NK&!~cu}mEpqs-&Fm&++OBF~k3usU!$5!X>fslDa1Z}v(A zJX9+V7xjp%YMe4_c^D{NXqD*19ugpI)sUD#ipet1_rKE&wMq}fE(*+^3nrvp5Hm!> zV^cm>e+0)=(T{xfRd1fB9ExRZvn-&-i@6T2pBJqS-rKp=065Y`1z18=1ikWavE@u+tBxl zzr6_$er)l?K)CsomH2lkc3#b#q^%joLfU4^UnMac?G!+q>K&5)ztZ5piUUM23mSog^-HrPm3Kjpafs_#IWH`R>5c9lX$1}~ zlNNOesbe9sEt&y7C&UCK_j~2b}+@w@vV*W^DNuh|6 zyV8L0(3K>W^zkj6?0iBKJOx`I_g?>SRn0+XT}*6mC2sYn=2n1wJY(s_d;fBhSN?h8 z5|x%}WtZ37G{ki#QtO+cN70qS+4&lN|z_chYoy`uB$2pMl2+WAxpOqw$HsQT{g`Ao19 z+7q?wQeWO~=H$fj+aK_%GEZP<%>$K5!=bbkM0$v3zaU73&Oyw1L!1@UIf{`&rrOe@ z(zj&C0z1<7gD`C?(*TK5d{lQTLRVBcX4~IV>#;gx_5_}J9kfw7Mm?l^ET=9 z0DenYk~e;7H_lIiALjFgk+M|3OkkduO{#k#F8}H>G)xazXKK3kzPdj>aDdnz!-^q1 z69Z$>IDaT#LJ0f3pdcls0&sN|S^)Uzvt4M9f32bI^vDqy;RuG8;Kq1-R=G2>nRa`K z{XIGm8nV4b_#T5^m8;vpK_AorTqKZzeni@_OrjVEpw35_nuq;bj{~_g3RsmiI6=u_ zxnu0C0~o2fn<+@$Tua&P?8xq`(f_*@LH~I!z!Y=T+N*-ffs^|hSgZ7;4L4hY;Zlda z5u%+Rlqcqz(COl1sK=iEmXzMuE9*6o;~j~SJkpz8`-<>Gyvle1xP?l{4Yl0NOt>kRB)?&m@%zreun(#WEDLs1}SH z-EwVUH7S&4cGG>Kw$jwAhV&<{dgqXyf2`H18=EzgkEUCUhyfZowY0zCDDG-yDx7nk zPlXSqIi>GUMaD^#scC4+J3Hw%LO_37eH$5l-VizL;L`;6-ryz5D+$+9zc#|=^I&~S1u6h0;;5Vz-4|?A~dPMsG z3*+?PN%b+k_LJ&YX1Z?oKu`OqJhPVjY` zb55|(k*Z20kG^zB@Q92OXi!!y3*z52QeM>UWhXo~s%Z=So&$p42*|A$}y7st+>g+f1PTWg6gwRk|)8;ul6E4GcZ zrc42AczT6?8sai}dD6AFVZYn>j`}@*jfq_f(Hy>737?PRef_i~*u|6g&CTMoIu z+HN?PI9;Lizoiqib0X@#NrW-P`_|u^51l}osBUlsz&^p=$tm(pr`0(r{#kgFh#tP3 zH9%rJCLBEI6eJY;v*%y|$^%d&#G?uFJxj3~(j8t2@UmV^E#JB}T^mRHFVnzS1c2;~ zjBhnY>Xw$_KzIUD#;5Pu$JTPX!KH>hUvTY#r&NYmo>xqgI|TrzWUVN899JEZq9h&dI!T(*7l0LI}Pxe5n%Z%zhNNeqfb zMc8A-4}Te%{s>OI=aEOX)izjFr-H$R`*3*-4gmchdPYf;P2 zExt8NieXmJ8J3r93~yVDZSk)==QpLGB5mq>+=uhOjU%69g850b6f?mwi`&9pjVo5k zq^Llhjz~{IV6Qap(JH+F&JWpcJ<@z(qTtCif}6+&AcL8&UJl8>(Ut$*+0r3wG62h; zPVCnayAw}kO897{`;<#)j)B(V=Mj4o_~m3*y+*wea-b%u$44vcR9D34dC%_wgnG{E^~g0GP9S_SpzWI1-Nc z)z!a``uvM^$1m(fI~o)Win)s>!83&ICaM_cnhoJwNfUx-7r*G-MU%sf_4o8@z_fMW zByJ`M|0Svc>Ys-vkGA)n+lV#NLP*Y)z|+=(Oo>|h7b64Zx*x>51V=3<~lPAeBn|MGGja-oQBcy&B}(n3)W}sfvGn z%3=hf_GKY-?Hq8Gonrt${2Y7;1e8{CN44s`wT54Ts0e$_kx?kuiGSl`|J^+PwSkPV z{mTUL>J`=_RhW-={BOFDV~tM+8?v}TnKls>;fp#UhRN46Z;2J$!r~-Ok4`e#n~$dr zDC$(`6|L_+h8n|W@U3=gp1iy6|X#V_6R?i)!Bb$^EZgCd!!OkT)of#s+mfj}9F zhQFeEQ>UqsScGa;kz~EySfsuqO^5nVE!en?YW1m?yvUvqpT?--cVnAZ7o(2)2WZ$s z4zGgQdzH$@aKFkjf0esbHEnSJtd(cM^;Nb@DV(%SL>nu_4VbzblH53Lv8fxg2@3O$->ao6Ua!tl+utnfgZqMMnhjn4$K9^f<$vV_te(th`GuAY& z2A?3dSH2}8tm;dww9UtGil=!GLHiKN$jJU-S4}(o1$*iJy)72Ow4G#q=RW2_B6W^i+r)2|MWW{vl z9Pn7+N$%eG4;+qV;JFnx#Z*NK{hRmt-x>CwcPQcpAhcP;(ebFk0RU~5A^x$9ZG`%P zR(M8){8;$=>(j3vDSr)>-x1=NbK&qBLh&P3&lOM8kLuSs!X7TV(u}&EQ$O8E#5{2z ze^KaL8N>=vfqctRxo&!1N&OK^iAe=((CdZo;hoYhouS^}*Hi%b4hVIAS@gU8*U;Bc zraZA#IE`D2X>(VL0h-VLNO+ZNrDYT-yAOO~VPwRH_Il64)L|g9&k(rYNauBRB`i#o z<7m#D8*ROI3gU;r&6)<3MBj(45B%sqoi7|pCkaXl@vrhav9fy5w()%8!+el@`3+48 ze$1IpgsAWXK{S-xIf5nF5dtG>NFj9;X>%Eym{pjN`E~#45!!u)mfwvrpP%AcWK<@tt0x&R=qpQU?xt^d0_RG+i~A}NRkG$@iLfky>9935mrdyD^r z%lzAt{{Qa)sJbL({0H8f$i7&DQR6>Lm$#L%B=$A+Z307DrM#%@@sNKM3HG?Fk$6`uNSdQ7p0 zEA>#3BQ|vV`KLe@<~`}qcG_w^n1MO>bab>)1Ic@|x2(-dWcv*#^*<}=mx*iZwOH%P zjdXeIH~ufYE+$RN03Q3Sy}>{LajwGla!LGJG%m$3nwzss9?@fqBCV6g2$5x_qoWhT zBJI+NCAn6OMIs;WI~VSkM`INJ)`k@e?P2;Uv)1Tl?o%|kwpsT&P=g+Y-JH$*<{97{ zS_)IJu#G+D$iCbcy8NaoE3k*DWGTA$w6Q(VCoeYvqQVqzp=a#t>!Z-Rt!Fi*ad~Nj?jygiyE@LUp1MVRU6B%yMCXC2 z8yJu*knq|n{hL55szG=qC;lerHF%q8`P-)b(+DGp!H9k)hpm=)GG6J z|E&U$1cpdTetzV*MD{V-3kJf?Cy0Hg)Xu!RM1etb^OX?#)Vo!7%RPv-?-27r;d4`L z`;%B-<&5nAP$B;tCeaX9IAm)8b-v8oKCAK&?zdKbKWIPY@keecJwl=^`|M|)i^J-v zuE@d74fjJ!_j`Fm9U-xP5@*WkHy`uvy;y!yD4RarN!8-02>szEpZXl7P>eUaQor)o zCnrJ=L#vsyU|*k}e84(hyUKsV{_-?LYt*6ceVQ9KR7dsh0JgAy0bw= zQ66pHP&0$f*Ls16A=A^dJXo8ue)m_Lb4*V27R;AKs@cWZ+P7@W;N`7hg!KEoW2|Q4 z?32chefx(Y$`^U=N#&Gh>sU<#0eUEWBef4Y$7et9WPV@2q1~GTCMkZL__NM=zBHp@ z!tm!p{<2b0F89>~r?hN$q%pg4gTHOi2$yAQ3PMP&7z?MCAjk6P65Cs3ZyGt> zM6V$|jxwI7*2_;j13zl<=DhXNnm9_Lljl=SqR-%K1OmJf0G`X_r)^l4la!IJBdG(a zS$VO)NuVfHvN;6a;?bGUxBapn?1uL@`FFA40=qfoD~udySMni!-x8bKlr`Db^s8>_ zG~!2~7W&b^$g?KzcWK(W9K;7``xOZGyio{FO1=X|nk2aEYfl#F{r$$xTL(~&krp(X z=|8!CIhMzJNbu>ZEU5TFs=hRzV}A0g@Bg4LXehYppJ%A9>tcy=orM_9dLLm=asvPY zyLB4U`KW`ZAVM)4hhC@p;#wa}f?t0sCMN73q5YcUgur)Tj_^!tvs zkD55b!u`<=gs}wldN${t{%unbboe>zP;t6Tj4Gu9wy^DZItDJehL}um;JtqN+j7k% zAW|=~%Od(R3_ax>i94sGGa2g#2m!qpUiiot2jE+{GEQ)Di?Yq8yNSiZXY+{yS={=J z;MSAoz16^Y~(_dLv_HJm4h8G7nM|uIgZI&C3f85Kj>UjUT&T-^8L%84qCUHyg?j? z>ivL`-WpImR&XHrh~$@k_FiHn&~ZEpWJ3jln~;OgLPpSoWZrZE2`&vgOy zF%n4l`a4%&_v$w?1^X18#Y7mNQu+1KJg0<1m6h%KISVW%llCQ8Oka2?I=i3})*zKwoLeGb&oRP) zOBAdA00k#+S}tG|d0$I@3$PnjByr!L0@sgD*nJw^%9tO{z0M?RCSYQWjj&lr ze565_9VBVfkhE z;)S*gpil`XFu`wb-f*OO{jY}S<*S`N>Ggz<%0D9Vh5|dLKNCe1gda7G*Vcv#{H1(e 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%0D}Mt0}Ke5f}5a= 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