From 202fba774f604bfcaa41e7451d3731989fcf4b38 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 4 Aug 2021 19:15:06 -0400 Subject: [PATCH 01/77] Initial commit of new NoDataPage and accompanying cards --- .../public/assets/elastic_agent_card.svg | 570 ++++++++++++++++++ .../public/assets/elastic_beats_card_dark.svg | 55 ++ .../assets/elastic_beats_card_light.svg | 55 ++ .../kibana_react/public/assets/texture.svg | 316 ++++++++++ src/plugins/kibana_react/public/index.ts | 1 + .../__snapshots__/no_data_page.test.tsx.snap | 218 +++++++ .../kibana_react/public/no_data_page/index.ts | 10 + .../no_data_card/elastic_agent_card.test.tsx | 33 + .../no_data_card/elastic_agent_card.tsx | 74 +++ .../no_data_card/elastic_beats_card.test.tsx | 33 + .../no_data_card/elastic_beats_card.tsx | 74 +++ .../public/no_data_page/no_data_card/index.ts | 10 + .../public/no_data_page/no_data_page.scss | 10 + .../public/no_data_page/no_data_page.test.tsx | 49 ++ .../public/no_data_page/no_data_page.tsx | 142 +++++ 15 files changed, 1650 insertions(+) create mode 100644 src/plugins/kibana_react/public/assets/elastic_agent_card.svg create mode 100644 src/plugins/kibana_react/public/assets/elastic_beats_card_dark.svg create mode 100644 src/plugins/kibana_react/public/assets/elastic_beats_card_light.svg create mode 100644 src/plugins/kibana_react/public/assets/texture.svg create mode 100644 src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap create mode 100644 src/plugins/kibana_react/public/no_data_page/index.ts create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.scss create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.tsx diff --git a/src/plugins/kibana_react/public/assets/elastic_agent_card.svg b/src/plugins/kibana_react/public/assets/elastic_agent_card.svg new file mode 100644 index 0000000000000..384c092415cf2 --- /dev/null +++ b/src/plugins/kibana_react/public/assets/elastic_agent_card.svg @@ -0,0 +1,570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/kibana_react/public/assets/elastic_beats_card_dark.svg b/src/plugins/kibana_react/public/assets/elastic_beats_card_dark.svg new file mode 100644 index 0000000000000..1f8f6cfc6eb9a --- /dev/null +++ b/src/plugins/kibana_react/public/assets/elastic_beats_card_dark.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/kibana_react/public/assets/elastic_beats_card_light.svg b/src/plugins/kibana_react/public/assets/elastic_beats_card_light.svg new file mode 100644 index 0000000000000..21535a45e0792 --- /dev/null +++ b/src/plugins/kibana_react/public/assets/elastic_beats_card_light.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/kibana_react/public/assets/texture.svg b/src/plugins/kibana_react/public/assets/texture.svg new file mode 100644 index 0000000000000..4648c17d9b125 --- /dev/null +++ b/src/plugins/kibana_react/public/assets/texture.svg @@ -0,0 +1,316 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index 48b96a0a6289a..19468498b1960 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -15,6 +15,7 @@ export * from './overlays'; export * from './ui_settings'; export * from './field_icon'; export * from './field_button'; +export * from './no_data_page'; export * from './table_list_view'; export * from './toolbar_button'; export * from './split_panel'; diff --git a/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap new file mode 100644 index 0000000000000..b50cf9f0127cf --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap @@ -0,0 +1,218 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NoDataPage render 1`] = ` + + +
+ +
+ +

+ +

+ +

+ + + , + "solution": "Elastic", + } + } + /> +

+
+
+ + + + + + + + + + + + + + + +

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

+
+
+`; diff --git a/src/plugins/kibana_react/public/no_data_page/index.ts b/src/plugins/kibana_react/public/no_data_page/index.ts new file mode 100644 index 0000000000000..55661ad6f14f7 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/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 './no_data_page'; +export * from './no_data_card'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx new file mode 100644 index 0000000000000..8451fcb516b17 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx @@ -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 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 { shallow } from 'enzyme'; +import { ElasticAgentCard } from './elastic_agent_card'; + +jest.mock('../../context', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + application: { capabilities: { advancedSettings: { show: true, save: true } } }, + notifications: { toast: { addSuccess: jest.fn() } }, + }, + }), +})); + +jest.mock('../../ui_settings', () => ({ + useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), +})); + +afterEach(() => jest.clearAllMocks()); + +describe('ElasticAgentCard', () => { + test('renders', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx new file mode 100644 index 0000000000000..8679147d8f9b1 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -0,0 +1,74 @@ +/* + * 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 @elastic/eui/href-or-on-click */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { CoreStart } from 'kibana/public'; +import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; +import { useKibana } from '../../context'; + +export type ElasticAgentCardProps = Partial & { + solution: string; + href: string; + recommended?: boolean; + buttonLabel?: string; +}; + +/** + * Applies extra styling to a typical EuiAvatar + */ +export const ElasticAgentCard: FunctionComponent = ({ + solution, + recommended = true, + href = 'app/integrations/browse', + buttonLabel, + ...cardRest +}) => { + const { + services: { http }, + } = useKibana(); + const addBasePath = http.basePath.prepend; + const basePathUrl = '/plugins/kibanaReact/assets/'; + + return ( + // @ts-ignore + + {buttonLabel || + i18n.translate('elasticAgentCard.buttonLabel', { + defaultMessage: 'Find a {solution} integration', + values: { solution }, + })} + + } + {...cardRest} + /> + ); +}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx new file mode 100644 index 0000000000000..64523332aae8b --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx @@ -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 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 { shallow } from 'enzyme'; +import { ElasticBeatsCard } from './elastic_agent_card'; + +jest.mock('../../context', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + application: { capabilities: { advancedSettings: { show: true, save: true } } }, + notifications: { toast: { addSuccess: jest.fn() } }, + }, + }), +})); + +jest.mock('../../ui_settings', () => ({ + useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), +})); + +afterEach(() => jest.clearAllMocks()); + +describe('ElasticBeatsCard', () => { + test('renders', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx new file mode 100644 index 0000000000000..8ec682a1bb8af --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx @@ -0,0 +1,74 @@ +/* + * 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 @elastic/eui/href-or-on-click */ + +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { CoreStart } from 'kibana/public'; +import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; +import { useKibana } from '../../context'; + +export type ElasticBeatsCardProps = Partial & { + href: string; + recommended?: boolean; + buttonLabel?: string; +}; + +/** + * Applies extra styling to a typical EuiAvatar + */ +export const ElasticBeatsCard: FunctionComponent = ({ + recommended, + href = 'app/home#/tutorial', + buttonLabel, + ...cardRest +}) => { + const { + services: { http, uiSettings }, + } = useKibana(); + const addBasePath = http.basePath.prepend; + const basePathUrl = '/plugins/kibanaReact/assets/'; + const IS_DARK_THEME = uiSettings.get('theme:darkMode'); + + return ( + // @ts-ignore + + {buttonLabel || + i18n.translate('elasticBeatsCard.buttonLabel', { + defaultMessage: 'Setup Beats', + })} + + } + {...cardRest} + /> + ); +}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts b/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts new file mode 100644 index 0000000000000..ed250dc7a6c85 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/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 './elastic_agent_card'; +export * from './elastic_beats_card'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.scss b/src/plugins/kibana_react/public/no_data_page/no_data_page.scss new file mode 100644 index 0000000000000..2d542fa76b425 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.scss @@ -0,0 +1,10 @@ +.noDataPageLogo { + @include size(100px); + @include euiBottomShadowMedium; + display: inline-block; + background: $euiColorEmptyShade url('../assets/texture.svg') no-repeat; + background-size: cover, 125%; + text-align: center; + line-height: 100px; + border-radius: 100px; +} diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx new file mode 100644 index 0000000000000..7eec89cb15378 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx @@ -0,0 +1,49 @@ +/* + * 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 { NoDataPage } from './no_data_page'; +import { shallowWithIntl } from '@kbn/test/jest'; + +// jest.mock('../../app_links', () => ({ +// RedirectAppLinks: jest.fn((element: JSX.Element) => element), +// })); + +// jest.mock('../../context', () => ({ +// useKibana: jest.fn().mockReturnValue({ +// services: { +// application: { capabilities: { advancedSettings: { show: true, save: true } } }, +// notifications: { toast: { addSuccess: jest.fn() } }, +// }, +// }), +// })); + +// jest.mock('../../ui_settings', () => ({ +// useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), +// })); + +// afterEach(() => jest.clearAllMocks()); + +// const addBasePathMock = jest.fn((path: string) => (path ? path : 'path')); + +describe('NoDataPage', () => { + test('render', () => { + const component = shallowWithIntl( + + ); + expect(component).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx new file mode 100644 index 0000000000000..8310fa71d837d --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -0,0 +1,142 @@ +/* + * 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 './no_data_page.scss'; + +import React, { useMemo } from 'react'; +import { + EuiFlexItem, + EuiCard, + EuiIcon, + EuiCardProps, + EuiFlexGrid, + EuiSpacer, + EuiText, + EuiTextColor, + EuiLink, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { KibanaPageTemplate, KibanaPageTemplateProps } from '../page_template'; + +import { ElasticAgentCard, ElasticBeatsCard } from './no_data_card'; + +type NoDataPageActions = Partial & { + href: string; + recommended?: boolean; + buttonLabel?: string; +}; + +export type NoDataPageActionsProps = Record; + +export type NoDataPageProps = KibanaPageTemplateProps & { + solution: string; + logo?: string; + actions: NoDataPageActionsProps; + docsLink: string; +}; + +const NoDataPageComponent = React.memo( + ({ solution, logo, actions, title, docsLink, ...rest }) => { + // actions = sort('recommended', sort); + const actionsKeys = Object.keys(actions); + const renderActions = useMemo(() => { + return Object.values(actions).map((action, i) => { + if (actionsKeys[i] === 'elasticAgent') { + return ( + + {/* @ts-ignore */} + + + ); + } else if (actionsKeys[i] === 'beats') { + return ( + + {/* @ts-ignore */} + + + ); + } else { + return ( + + {/* @ts-ignore */} + + + ); + } + }); + }, [actions, actionsKeys]); + + return ( + + +
+ +
+ +

+ +

+ +

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

+
+
+ + + + {renderActions} + + + {actionsKeys.length > 1 ? ( + +

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

+
+ ) : undefined} +
+ ); + } +); + +NoDataPageComponent.displayName = 'NoDataPageComponent'; + +export const NoDataPage = React.memo(NoDataPageComponent); +NoDataPage.displayName = 'NoDataPage'; From e6c12901902ff0c6d197803dc9d6d69277a7f2a8 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 4 Aug 2021 19:15:42 -0400 Subject: [PATCH 02/77] Adding to Security Solution and forcing view in TemplateWrapper --- .../app/home/template_wrapper/index.tsx | 7 ++- .../public/common/translations.ts | 4 ++ .../components/overview_empty/index.tsx | 63 +++++-------------- 3 files changed, 26 insertions(+), 48 deletions(-) diff --git a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx index abffe54ab761c..c0744ef6876b8 100644 --- a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx @@ -23,6 +23,8 @@ import { } from './bottom_bar'; import { useShowTimeline } from '../../../common/utils/timeline/use_show_timeline'; import { gutterTimeline } from '../../../common/lib/helpers'; +import { useSourcererScope } from '../../../common/containers/sourcerer'; +import { OverviewEmpty } from '../../../overview/components/overview_empty'; /* eslint-disable react/display-name */ @@ -74,8 +76,9 @@ export const SecuritySolutionTemplateWrapper: React.FC getTimelineShowStatus(state, TimelineId.active) ); + const { indicesExist } = useSourcererScope(); - return ( + return indicesExist ? ( + ) : ( + ); } ); diff --git a/x-pack/plugins/security_solution/public/common/translations.ts b/x-pack/plugins/security_solution/public/common/translations.ts index 1eefd69d57eb7..16a60301c3205 100644 --- a/x-pack/plugins/security_solution/public/common/translations.ts +++ b/x-pack/plugins/security_solution/public/common/translations.ts @@ -7,6 +7,10 @@ import { i18n } from '@kbn/i18n'; +export const SOLUTION_NAME = i18n.translate('xpack.securitySolution.pages.common.solutionName', { + defaultMessage: 'Security', +}); + export const EMPTY_TITLE = i18n.translate('xpack.securitySolution.pages.common.emptyTitle', { defaultMessage: 'Welcome to Elastic Security. Let’s get you started.', }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 6f885b348cdeb..24b91a0b8fb2f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -9,10 +9,7 @@ import React, { useMemo } from 'react'; import { omit } from 'lodash/fp'; import { createStructuredSelector } from 'reselect'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiLink } from '@elastic/eui'; import * as i18nCommon from '../../../common/translations'; -import { EmptyPage, EmptyPageActionsProps } from '../../../common/components/empty_page'; import { useKibana } from '../../../common/lib/kibana'; import { ADD_DATA_PATH } from '../../../../common/constants'; import { @@ -24,6 +21,11 @@ import { CreateStructuredSelector } from '../../../common/store'; import { endpointPackageVersion as useEndpointPackageVersion } from '../../../management/pages/endpoint_hosts/store/selectors'; import { useUserPrivileges } from '../../../common/components/user_privileges'; +import { + NoDataPage, + NoDataPageActionsProps, +} from '../../../../../../../src/plugins/kibana_react/public'; + const OverviewEmptyComponent: React.FC = () => { const { http, docLinks } = useKibana().services; const basePath = http.basePath.get(); @@ -42,26 +44,20 @@ const OverviewEmptyComponent: React.FC = () => { }); const canAccessFleet = useUserPrivileges().endpointPrivileges.canAccessFleet; - const emptyPageActions: EmptyPageActionsProps = useMemo( + const emptyPageActions: NoDataPageActionsProps = useMemo( () => ({ elasticAgent: { - label: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT, - url: ingestUrl, - description: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT_DESCRIPTION, - fill: false, + href: ingestUrl, + recommended: true, }, beats: { - label: i18nCommon.EMPTY_ACTION_BEATS, - url: `${basePath}${ADD_DATA_PATH}`, - description: i18nCommon.EMPTY_ACTION_BEATS_DESCRIPTION, - fill: false, + href: `${basePath}${ADD_DATA_PATH}`, }, endpoint: { - label: i18nCommon.EMPTY_ACTION_ENDPOINT, - url: endpointIntegrationUrl, + title: i18nCommon.EMPTY_ACTION_ENDPOINT, + href: endpointIntegrationUrl, description: i18nCommon.EMPTY_ACTION_ENDPOINT_DESCRIPTION, onClick: handleEndpointClick, - fill: false, }, }), [basePath, ingestUrl, endpointIntegrationUrl, handleEndpointClick] @@ -72,39 +68,12 @@ const OverviewEmptyComponent: React.FC = () => { [emptyPageActions] ); - return canAccessFleet === true ? ( - - - - {i18nCommon.EMPTY_ACTION_SECONDARY} - - - } - title={i18nCommon.EMPTY_TITLE} - /> - ) : ( - - - - {i18nCommon.EMPTY_ACTION_SECONDARY} - - - } - title={i18nCommon.EMPTY_TITLE} + docsLink={docLinks.links.siem.gettingStarted} /> ); }; From 0ac66b8108310126bdaf3bdaf5a52c4e806be8e8 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 4 Aug 2021 19:29:30 -0400 Subject: [PATCH 03/77] Center page --- .../kibana_react/public/no_data_page/no_data_page.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 8310fa71d837d..659260094446e 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -72,7 +72,12 @@ const NoDataPageComponent = React.memo( }, [actions, actionsKeys]); return ( - +
From 5274c9648e9c3d7622396b670650c2d0b29728e0 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 10:34:31 -0400 Subject: [PATCH 04/77] Better customizations & sorting on `recommended` --- .../no_data_card/elastic_agent_card.tsx | 48 +++++++++-------- .../no_data_card/elastic_beats_card.tsx | 52 +++++++++---------- .../public/no_data_page/no_data_card/index.ts | 1 + .../no_data_card/no_data_card.test.tsx | 33 ++++++++++++ .../no_data_card/no_data_card.tsx | 44 ++++++++++++++++ .../public/no_data_page/no_data_page.tsx | 38 ++++++++++---- .../components/overview_empty/index.tsx | 1 + 7 files changed, 156 insertions(+), 61 deletions(-) create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx index 8679147d8f9b1..cbe912ea6abcd 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -11,14 +11,12 @@ import React, { FunctionComponent } from 'react'; import { i18n } from '@kbn/i18n'; import { CoreStart } from 'kibana/public'; -import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; +import { EuiButton, EuiCard } from '@elastic/eui'; import { useKibana } from '../../context'; +import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; -export type ElasticAgentCardProps = Partial & { +export type ElasticAgentCardProps = NoDataPageActions & { solution: string; - href: string; - recommended?: boolean; - buttonLabel?: string; }; /** @@ -28,7 +26,7 @@ export const ElasticAgentCard: FunctionComponent = ({ solution, recommended = true, href = 'app/integrations/browse', - buttonLabel, + button, ...cardRest }) => { const { @@ -37,6 +35,25 @@ export const ElasticAgentCard: FunctionComponent = ({ const addBasePath = http.basePath.prepend; const basePathUrl = '/plugins/kibanaReact/assets/'; + const footer = + typeof button !== 'string' && typeof button !== 'undefined' ? ( + button + ) : ( + // @ts-ignore + + {button || + i18n.translate('elasticAgentCard.buttonLabel', { + defaultMessage: 'Find a {solution} integration', + values: { solution }, + })} + + ); + return ( // @ts-ignore = ({ data from your hosts.`, })} image={addBasePath(`${basePathUrl}elastic_agent_card.svg`)} - betaBadgeLabel={recommended ? 'Recommended' : undefined} - footer={ - // @ts-ignore - - {buttonLabel || - i18n.translate('elasticAgentCard.buttonLabel', { - defaultMessage: 'Find a {solution} integration', - values: { solution }, - })} - - } + betaBadgeLabel={recommended ? NO_DATA_RECOMMENDED : undefined} + footer={footer} {...cardRest} /> ); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx index 8ec682a1bb8af..e0c1fb7679f78 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx @@ -11,22 +11,14 @@ import React, { FunctionComponent } from 'react'; import { i18n } from '@kbn/i18n'; import { CoreStart } from 'kibana/public'; -import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; +import { EuiButton, EuiCard } from '@elastic/eui'; import { useKibana } from '../../context'; +import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; -export type ElasticBeatsCardProps = Partial & { - href: string; - recommended?: boolean; - buttonLabel?: string; -}; - -/** - * Applies extra styling to a typical EuiAvatar - */ -export const ElasticBeatsCard: FunctionComponent = ({ +export const ElasticBeatsCard: FunctionComponent = ({ recommended, href = 'app/home#/tutorial', - buttonLabel, + button, ...cardRest }) => { const { @@ -36,6 +28,24 @@ export const ElasticBeatsCard: FunctionComponent = ({ const basePathUrl = '/plugins/kibanaReact/assets/'; const IS_DARK_THEME = uiSettings.get('theme:darkMode'); + const footer = + typeof button !== 'string' && typeof button !== 'undefined' ? ( + button + ) : ( + // @ts-ignore + + {button || + i18n.translate('elasticBeatsCard.buttonLabel', { + defaultMessage: 'Setup Beats', + })} + + ); + return ( // @ts-ignore = ({ image={addBasePath( `${basePathUrl}elastic_beats_card_${IS_DARK_THEME ? 'dark' : 'light'}.svg` )} - betaBadgeLabel={recommended ? 'Recommended' : undefined} - footer={ - // @ts-ignore - - {buttonLabel || - i18n.translate('elasticBeatsCard.buttonLabel', { - defaultMessage: 'Setup Beats', - })} - - } + betaBadgeLabel={recommended ? NO_DATA_RECOMMENDED : undefined} + footer={footer} {...cardRest} /> ); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts b/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts index ed250dc7a6c85..3744239d9a472 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts @@ -8,3 +8,4 @@ export * from './elastic_agent_card'; export * from './elastic_beats_card'; +export * from './no_data_card'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx new file mode 100644 index 0000000000000..469b6673b45de --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx @@ -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 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 { shallow } from 'enzyme'; +import { NoDataCard } from './no_data_card'; + +jest.mock('../../context', () => ({ + useKibana: jest.fn().mockReturnValue({ + services: { + application: { capabilities: { advancedSettings: { show: true, save: true } } }, + notifications: { toast: { addSuccess: jest.fn() } }, + }, + }), +})); + +jest.mock('../../ui_settings', () => ({ + useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), +})); + +afterEach(() => jest.clearAllMocks()); + +describe('ElasticAgentCard', () => { + test('renders', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx new file mode 100644 index 0000000000000..12e9fa7f7083c --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.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 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 @elastic/eui/href-or-on-click */ + +import React, { FunctionComponent } from 'react'; +import { EuiButton, EuiCard } from '@elastic/eui'; +import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; + +export const NoDataCard: FunctionComponent = ({ + recommended, + button, + ...cardRest +}) => { + const footer = + typeof button !== 'string' ? ( + button + ) : ( + // @ts-ignore + + {button} + + ); + + return ( + // @ts-ignore + + ); +}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 659260094446e..86dc3c1458ad3 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -8,10 +8,9 @@ import './no_data_page.scss'; -import React, { useMemo } from 'react'; +import React, { ReactNode, useMemo } from 'react'; import { EuiFlexItem, - EuiCard, EuiIcon, EuiCardProps, EuiFlexGrid, @@ -20,15 +19,23 @@ import { EuiTextColor, EuiLink, } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { KibanaPageTemplate, KibanaPageTemplateProps } from '../page_template'; -import { ElasticAgentCard, ElasticBeatsCard } from './no_data_card'; +import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; -type NoDataPageActions = Partial & { +export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', { + defaultMessage: 'Recommended', +}); + +export type NoDataPageActions = Partial & { href: string; recommended?: boolean; - buttonLabel?: string; + /** + * Provide just a string for the button's label, or a whole component + */ + button?: string | ReactNode; }; export type NoDataPageActionsProps = Record; @@ -42,10 +49,22 @@ export type NoDataPageProps = KibanaPageTemplateProps & { const NoDataPageComponent = React.memo( ({ solution, logo, actions, title, docsLink, ...rest }) => { - // actions = sort('recommended', sort); - const actionsKeys = Object.keys(actions); + // Convert obj data into an iterable array + const entries = Object.entries(actions); + + // This sort fn may look nonsensical, but it's some Good Ol' Javascript (TM) + // Sort functions want either a 1, 0, or -1 returned to determine order, + // and it turns out in JS you CAN minus booleans from each other to get a 1, 0, or -1 - e.g., (true - false == 1) :whoa: + const sortedEntries = entries.sort(([, firstObj], [, secondObj]) => { + // The `??` fallbacks are because the recommended key can be missing or undefined + return (secondObj.recommended ?? false) - (firstObj.recommended ?? false); + }); + + // Convert the iterated [[key, value]] array format back into an object + const sortedData = Object.fromEntries(sortedEntries); + const actionsKeys = Object.keys(sortedData); const renderActions = useMemo(() => { - return Object.values(actions).map((action, i) => { + return Object.values(sortedData).map((action, i) => { if (actionsKeys[i] === 'elasticAgent') { return ( @@ -63,8 +82,7 @@ const NoDataPageComponent = React.memo( } else { return ( - {/* @ts-ignore */} - + ); } diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 24b91a0b8fb2f..d3087332d793f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -9,6 +9,7 @@ import React, { useMemo } from 'react'; import { omit } from 'lodash/fp'; import { createStructuredSelector } from 'reselect'; +import { EuiButton } from '@elastic/eui'; import * as i18nCommon from '../../../common/translations'; import { useKibana } from '../../../common/lib/kibana'; import { ADD_DATA_PATH } from '../../../../common/constants'; From 66445f883016718de2e1bc18f32a2b2c1f45fe86 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 11:44:05 -0400 Subject: [PATCH 05/77] Adding custom size to Solution Nav Avatar for reuse and working on pairing down custom styles of Enterprise Search cards --- .../public/components/_overview.scss | 8 -- .../public/components/overview/overview.tsx | 10 +- .../public/no_data_page/no_data_page.scss | 10 -- .../public/no_data_page/no_data_page.tsx | 28 +++-- .../public/page_template/index.ts | 1 + .../solution_nav/solution_nav.scss | 4 + .../solution_nav/solution_nav_avatar.scss | 12 +- .../solution_nav/solution_nav_avatar.tsx | 18 ++- .../license_callout/license_callout.tsx | 17 +-- .../components/product_card/product_card.scss | 50 +------- .../product_selector/product_selector.tsx | 113 +++++++++--------- .../setup_guide/setup_guide_cta.scss | 9 -- .../setup_guide/setup_guide_cta.tsx | 6 +- .../applications/enterprise_search/index.scss | 58 ++++----- .../components/overview_empty/index.tsx | 1 - 15 files changed, 157 insertions(+), 188 deletions(-) diff --git a/src/plugins/kibana_overview/public/components/_overview.scss b/src/plugins/kibana_overview/public/components/_overview.scss index 89f2b6272a4b8..82c84b1032446 100644 --- a/src/plugins/kibana_overview/public/components/_overview.scss +++ b/src/plugins/kibana_overview/public/components/_overview.scss @@ -64,14 +64,6 @@ } } -.kbnOverviewSolution__icon { - background-color: $euiColorEmptyShade !important; - box-shadow: none !important; - height: $euiSizeL * 2; - padding: $euiSizeM; - width: $euiSizeL * 2; -} - .kbnOverviewSupplements--noNews .kbnOverviewMore { h2 { @include euiBreakpoint('m', 'l', 'xl') { diff --git a/src/plugins/kibana_overview/public/components/overview/overview.tsx b/src/plugins/kibana_overview/public/components/overview/overview.tsx index 9bba923371f64..b9bbfff0bc943 100644 --- a/src/plugins/kibana_overview/public/components/overview/overview.tsx +++ b/src/plugins/kibana_overview/public/components/overview/overview.tsx @@ -16,7 +16,6 @@ import { EuiScreenReaderOnly, EuiSpacer, EuiTitle, - EuiToken, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { CoreStart } from 'kibana/public'; @@ -26,6 +25,7 @@ import { KibanaPageTemplate, overviewPageActions, OverviewPageFooter, + KibanaPageTemplateSolutionNavAvatar, } from '../../../../../../src/plugins/kibana_react/public'; import { FetchResult } from '../../../../../../src/plugins/newsfeed/public'; import { @@ -205,12 +205,10 @@ export const Overview: FC = ({ newsFetchResult, solutions, features }) => description={description ? description : ''} href={addBasePath(path)} icon={ - } image={addBasePath(getSolutionGraphicURL(snakeCase(id)))} diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.scss b/src/plugins/kibana_react/public/no_data_page/no_data_page.scss index 2d542fa76b425..e69de29bb2d1d 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.scss +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.scss @@ -1,10 +0,0 @@ -.noDataPageLogo { - @include size(100px); - @include euiBottomShadowMedium; - display: inline-block; - background: $euiColorEmptyShade url('../assets/texture.svg') no-repeat; - background-size: cover, 125%; - text-align: center; - line-height: 100px; - border-radius: 100px; -} diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 86dc3c1458ad3..8ac7964a3983b 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -11,7 +11,6 @@ import './no_data_page.scss'; import React, { ReactNode, useMemo } from 'react'; import { EuiFlexItem, - EuiIcon, EuiCardProps, EuiFlexGrid, EuiSpacer, @@ -21,7 +20,11 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { KibanaPageTemplate, KibanaPageTemplateProps } from '../page_template'; +import { + KibanaPageTemplate, + KibanaPageTemplateProps, + KibanaPageTemplateSolutionNavAvatar, +} from '../page_template'; import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; @@ -30,7 +33,13 @@ export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', }); export type NoDataPageActions = Partial & { + /** + * The cards must lead somewhere + */ href: string; + /** + * Applies the `Recommended` beta badge and makes the button `fill` + */ recommended?: boolean; /** * Provide just a string for the button's label, or a whole component @@ -57,7 +66,7 @@ const NoDataPageComponent = React.memo( // and it turns out in JS you CAN minus booleans from each other to get a 1, 0, or -1 - e.g., (true - false == 1) :whoa: const sortedEntries = entries.sort(([, firstObj], [, secondObj]) => { // The `??` fallbacks are because the recommended key can be missing or undefined - return (secondObj.recommended ?? false) - (firstObj.recommended ?? false); + return Number(secondObj.recommended ?? false) - Number(firstObj.recommended ?? false); }); // Convert the iterated [[key, value]] array format back into an object @@ -68,14 +77,12 @@ const NoDataPageComponent = React.memo( if (actionsKeys[i] === 'elasticAgent') { return ( - {/* @ts-ignore */} ); } else if (actionsKeys[i] === 'beats') { return ( - {/* @ts-ignore */} ); @@ -87,7 +94,7 @@ const NoDataPageComponent = React.memo( ); } }); - }, [actions, actionsKeys]); + }, [actions, sortedData, actionsKeys]); return ( ( {...rest} > -
- -
+ +

& { + /** + * Any EuiAvatar size available, of `xxl` for custom large, brand-focused version + */ + size?: EuiAvatarProps['size'] | 'xxl'; +}; /** * Applies extra styling to a typical EuiAvatar */ export const KibanaPageTemplateSolutionNavAvatar: FunctionComponent = ({ className, + size, ...rest }) => { return ( + // @ts-ignore ); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx index f9f329c859110..bff71e03317fb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText, EuiTitle } from '@elastic/eui'; import { LicensingLogic, ManageLicenseButton } from '../../../shared/licensing'; @@ -23,17 +23,20 @@ export const LicenseCallout: React.FC = () => { if (hasPlatinumLicense && !isTrial) return null; return ( - + - - + +

{PRODUCT_SELECTOR_CALLOUT_HEADING}

+
+ + {LICENSE_CALLOUT_BODY} - {LICENSE_CALLOUT_BODY}
- - +
+ +
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_card/product_card.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_card/product_card.scss index cac03dc053552..7627375e513b6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_card/product_card.scss +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_card/product_card.scss @@ -6,54 +6,10 @@ */ .productCard { - margin: $euiSizeS; - &__imageContainer { - max-height: 115px; - overflow: hidden; - background-color: #0076CC; - - @include euiBreakpoint('s', 'm', 'l', 'xl') { - max-height: none; - } - } - - &__image { - width: 100%; - height: auto; - } - - .euiCard__content { - max-width: 350px; - margin-top: $euiSizeL; - - @include euiBreakpoint('s', 'm', 'l', 'xl') { - margin-top: $euiSizeXL; - } - } - - .euiCard__title { - margin-bottom: $euiSizeM; - font-weight: $euiFontWeightBold; - - @include euiBreakpoint('s', 'm', 'l', 'xl') { - margin-bottom: $euiSizeL; - font-size: $euiSizeL; - } - } - - .euiCard__description { - font-weight: $euiFontWeightMedium; - color: $euiColorMediumShade; - margin-bottom: $euiSize; - } - - .euiCard__footer { - margin-bottom: $euiSizeS; - - @include euiBreakpoint('s', 'm', 'l', 'xl') { - margin-bottom: $euiSizeM; - font-size: $euiSizeL; + @include euiBreakpoint('xs') { + overflow: hidden; + max-height: 115px; } } } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx index 0dd2b0988b3f4..4f8dc33f21ff5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx @@ -9,20 +9,13 @@ import React from 'react'; import { useValues } from 'kea'; -import { - EuiPage, - EuiPageBody, - EuiPageHeader, - EuiPageHeaderSection, - EuiPageContentBody, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTitle, - EuiText, -} from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { + KibanaPageTemplate, + KibanaPageTemplateSolutionNavAvatar, +} from '../../../../../../../../src/plugins/kibana_react/public'; import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { KibanaLogic } from '../../../shared/kibana'; import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; @@ -32,7 +25,6 @@ import AppSearchImage from '../../assets/app_search.png'; import WorkplaceSearchImage from '../../assets/workplace_search.png'; import { LicenseCallout } from '../license_callout'; import { ProductCard } from '../product_card'; -import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; interface ProductSelectorProps { @@ -51,52 +43,59 @@ export const ProductSelector: React.FC = ({ access }) => { const shouldShowWorkplaceSearchCard = !config.host || hasWorkplaceSearchAccess; return ( - + - - - - - -

- {i18n.translate('xpack.enterpriseSearch.overview.heading', { - defaultMessage: 'Welcome to Elastic Enterprise Search', - })} -

-
- - -

- {config.host - ? i18n.translate('xpack.enterpriseSearch.overview.subheading', { - defaultMessage: 'Select a product to get started.', - }) - : i18n.translate('xpack.enterpriseSearch.overview.setupHeading', { - defaultMessage: 'Choose a product to set up and get started.', - })} -

-
-
-
- - - {shouldShowAppSearchCard && ( - - - - )} - {shouldShowWorkplaceSearchCard && ( - - - - )} - - - {config.host ? : } - -
-
+ + + + + + + +

+ {i18n.translate('xpack.enterpriseSearch.overview.heading', { + defaultMessage: 'Welcome to Elastic Enterprise Search', + })} +

+

+ {config.host + ? i18n.translate('xpack.enterpriseSearch.overview.subheading', { + defaultMessage: 'Select a product to get started.', + }) + : i18n.translate('xpack.enterpriseSearch.overview.setupHeading', { + defaultMessage: 'Choose a product to set up and get started.', + })} +

+
+ + + + + {shouldShowAppSearchCard && ( + + + + )} + {shouldShowWorkplaceSearchCard && ( + + + + )} + + + + + {config.host ? : } + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss index 913626fbbd795..0bd9e55eaf25c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss @@ -8,15 +8,6 @@ .enterpriseSearchSetupCta { margin: $euiSize auto $euiSizeXL; - // Clickable EuiPanel override - line panel up with product cards - &.euiPanel--isClickable { - width: calc(100% - #{$euiSize}); - } - - &__text { - max-width: $euiSize * 40; - } - &__image { display: block; max-width: 100%; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx index 0c90f7b998bf8..f4bf669303226 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx @@ -22,13 +22,15 @@ export const SetupGuideCta: React.FC = () => ( paddingSize="l" className="enterpriseSearchSetupCta" data-test-subj="setupGuideLink" + hasBorder + color="transparent" > - +

{PRODUCT_SELECTOR_CALLOUT_HEADING}

- + {i18n.translate('xpack.enterpriseSearch.overview.setupCta.description', { defaultMessage: 'Add search to your app or internal organization with Elastic App Search and Workplace Search. Watch the video to see what you can do when search is made easy.', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss index 4be8d7322b4c8..4e97029a52823 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss @@ -5,37 +5,37 @@ * 2.0. */ -.enterpriseSearchOverview { - padding-top: 78px; - background-image: url('./assets/bg_enterprise_search.png'); - background-repeat: no-repeat; - background-size: 670px; - background-position: center -27px; +// .enterpriseSearchOverview { +// padding-top: 78px; +// background-image: url('./assets/bg_enterprise_search.png'); +// background-repeat: no-repeat; +// background-size: 670px; +// background-position: center -27px; - @include euiBreakpoint('m', 'l', 'xl') { - padding-top: 158px; - background-size: 1160px; - background-position: center -48px; - } +// @include euiBreakpoint('m', 'l', 'xl') { +// padding-top: 158px; +// background-size: 1160px; +// background-position: center -48px; +// } - &__header { - text-align: center; - margin: auto; - @include euiBreakpoint('m', 'l', 'xl') { - margin-bottom: $euiSizeL; - } - } +// &__header { +// text-align: center; +// margin: auto; +// @include euiBreakpoint('m', 'l', 'xl') { +// margin-bottom: $euiSizeL; +// } +// } - // EUI override - .euiTitle + .euiTitle { - margin-top: 0; +// // EUI override +// .euiTitle + .euiTitle { +// margin-top: 0; - @include euiBreakpoint('m', 'l', 'xl') { - margin-top: $euiSizeS; - } - } +// @include euiBreakpoint('m', 'l', 'xl') { +// margin-top: $euiSizeS; +// } +// } - .enterpriseSearchOverview__card { - flex-basis: 50%; - } -} +// .enterpriseSearchOverview__card { +// flex-basis: 50%; +// } +// } diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index d3087332d793f..24b91a0b8fb2f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -9,7 +9,6 @@ import React, { useMemo } from 'react'; import { omit } from 'lodash/fp'; import { createStructuredSelector } from 'reselect'; -import { EuiButton } from '@elastic/eui'; import * as i18nCommon from '../../../common/translations'; import { useKibana } from '../../../common/lib/kibana'; import { ADD_DATA_PATH } from '../../../../common/constants'; From 495e90580174e6884895f94c8997298173d0f36f Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 11:48:59 -0400 Subject: [PATCH 06/77] Put SetupGuideCTA back --- .../components/product_selector/product_selector.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx index 4f8dc33f21ff5..ff1f8d7c037dd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx @@ -25,6 +25,7 @@ import AppSearchImage from '../../assets/app_search.png'; import WorkplaceSearchImage from '../../assets/workplace_search.png'; import { LicenseCallout } from '../license_callout'; import { ProductCard } from '../product_card'; +import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; interface ProductSelectorProps { @@ -95,7 +96,7 @@ export const ProductSelector: React.FC = ({ access }) => { - {config.host ? : } + {config.host ? : } ); }; From 4600e9aeaa29d3ba18abddbf0f0bb7f9e8f3bb9b Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 14:50:42 -0400 Subject: [PATCH 07/77] Fix TS --- .../no_data_card/no_data_card.tsx | 4 +- .../public/no_data_page/no_data_page.tsx | 221 +++++++++--------- .../solution_nav/solution_nav_avatar.tsx | 7 +- 3 files changed, 116 insertions(+), 116 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx index 12e9fa7f7083c..02c0c3f4640b3 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx @@ -21,7 +21,6 @@ export const NoDataCard: FunctionComponent = ({ typeof button !== 'string' ? ( button ) : ( - // @ts-ignore = ({ ); return ( - // @ts-ignore ); }; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 8ac7964a3983b..eaf0bccf3eb52 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -8,7 +8,7 @@ import './no_data_page.scss'; -import React, { ReactNode, useMemo } from 'react'; +import React, { ReactNode, useMemo, FunctionComponent, MouseEventHandler } from 'react'; import { EuiFlexItem, EuiCardProps, @@ -45,6 +45,10 @@ export type NoDataPageActions = Partial & { * Provide just a string for the button's label, or a whole component */ button?: string | ReactNode; + /** + * Remapping `onClick` to any element + */ + onClick?: MouseEventHandler; }; export type NoDataPageActionsProps = Record; @@ -56,120 +60,117 @@ export type NoDataPageProps = KibanaPageTemplateProps & { docsLink: string; }; -const NoDataPageComponent = React.memo( - ({ solution, logo, actions, title, docsLink, ...rest }) => { - // Convert obj data into an iterable array - const entries = Object.entries(actions); +export const NoDataPage: FunctionComponent = ({ + solution, + logo, + actions, + title, + docsLink, + ...rest +}) => { + // Convert obj data into an iterable array + const entries = Object.entries(actions); + + // This sort fn may look nonsensical, but it's some Good Ol' Javascript (TM) + // Sort functions want either a 1, 0, or -1 returned to determine order, + // and it turns out in JS you CAN minus booleans from each other to get a 1, 0, or -1 - e.g., (true - false == 1) :whoa: + const sortedEntries = entries.sort(([, firstObj], [, secondObj]) => { + // The `??` fallbacks are because the recommended key can be missing or undefined + return Number(secondObj.recommended ?? false) - Number(firstObj.recommended ?? false); + }); - // This sort fn may look nonsensical, but it's some Good Ol' Javascript (TM) - // Sort functions want either a 1, 0, or -1 returned to determine order, - // and it turns out in JS you CAN minus booleans from each other to get a 1, 0, or -1 - e.g., (true - false == 1) :whoa: - const sortedEntries = entries.sort(([, firstObj], [, secondObj]) => { - // The `??` fallbacks are because the recommended key can be missing or undefined - return Number(secondObj.recommended ?? false) - Number(firstObj.recommended ?? false); + // Convert the iterated [[key, value]] array format back into an object + const sortedData = Object.fromEntries(sortedEntries); + const actionsKeys = Object.keys(sortedData); + const renderActions = useMemo(() => { + return Object.values(sortedData).map((action, i) => { + if (actionsKeys[i] === 'elasticAgent') { + return ( + + + + ); + } else if (actionsKeys[i] === 'beats') { + return ( + + + + ); + } else { + return ( + + + + ); + } }); + }, [actions, sortedData, actionsKeys]); - // Convert the iterated [[key, value]] array format back into an object - const sortedData = Object.fromEntries(sortedEntries); - const actionsKeys = Object.keys(sortedData); - const renderActions = useMemo(() => { - return Object.values(sortedData).map((action, i) => { - if (actionsKeys[i] === 'elasticAgent') { - return ( - - - - ); - } else if (actionsKeys[i] === 'beats') { - return ( - - - - ); - } else { - return ( - - - - ); - } - }); - }, [actions, sortedData, actionsKeys]); + return ( + + + - return ( - - - +

+ - - -

+

+ +

+ + + ), + }} /> -

- -

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

-
+

+ +
+ + + + {renderActions} + + + {actionsKeys.length > 1 ? ( + +

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

- - - - {renderActions} - - - {actionsKeys.length > 1 ? ( - -

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

-
- ) : undefined} -
- ); - } -); - -NoDataPageComponent.displayName = 'NoDataPageComponent'; - -export const NoDataPage = React.memo(NoDataPageComponent); -NoDataPage.displayName = 'NoDataPage'; + ) : undefined} +
+ ); +}; diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx index 22a1fd229ae77..135c0d598651a 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx @@ -10,9 +10,9 @@ import './solution_nav_avatar.scss'; import React, { FunctionComponent } from 'react'; import classNames from 'classnames'; -import { EuiAvatar, EuiAvatarProps } from '@elastic/eui'; +import { DistributiveOmit, EuiAvatar, EuiAvatarProps } from '@elastic/eui'; -export type KibanaPageTemplateSolutionNavAvatarProps = Omit & { +export type KibanaPageTemplateSolutionNavAvatarProps = DistributiveOmit & { /** * Any EuiAvatar size available, of `xxl` for custom large, brand-focused version */ @@ -28,7 +28,7 @@ export const KibanaPageTemplateSolutionNavAvatar: FunctionComponent { return ( - // @ts-ignore + // @ts-ignore Complains about ExclusiveUnion between `iconSize` and `iconType`, but works fine ); From 80e2063b5a3f9f71c73a7a3b23a9b7263314fb84 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 16:06:37 -0400 Subject: [PATCH 08/77] Added empty state to Infra/Logs --- .../public/no_data_page/no_data_page.tsx | 4 -- .../infra/public/pages/logs/page_template.tsx | 32 +++++++++- .../source_configuration_settings.tsx | 6 +- .../public/pages/logs/stream/page_content.tsx | 14 ++++- .../logs/stream/page_no_indices_content.tsx | 59 +++++-------------- 5 files changed, 61 insertions(+), 54 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index eaf0bccf3eb52..38187cfad2735 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -33,10 +33,6 @@ export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', }); export type NoDataPageActions = Partial & { - /** - * The cards must lead somewhere - */ - href: string; /** * Applies the `Recommended` beta badge and makes the button `fill` */ diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index 42ca992e9402d..c60c939dc6733 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -8,6 +8,8 @@ import React from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; +import { useLogSourceContext } from '../../containers/logs/log_source'; +import { NoDataPage } from '../../../../../../src/plugins/kibana_react/public'; export const LogsPageTemplate: React.FC = ( pageTemplateProps @@ -20,5 +22,33 @@ export const LogsPageTemplate: React.FC = ( }, } = useKibanaContextForPlugin(); - return ; + const { sourceStatus } = useLogSourceContext(); + + return sourceStatus?.logIndexStatus !== 'missing' ? ( + + ) : ( + + + + ); }; 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 a765cf074271c..5843bf15f7dc6 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 @@ -100,7 +100,7 @@ export const LogsSettingsPage = () => { - + { /> - + { /> - + { ); } else { - return ; + return ( + + + + ); } }; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx index bc3bc22f3f1b2..2f28a04d32038 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx @@ -5,61 +5,30 @@ * 2.0. */ -import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import React from 'react'; - -import { NoIndices } from '../../../components/empty_states/no_indices'; -import { ViewSourceConfigurationButton } from '../../../components/source_configuration/view_source_configuration_button'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; +import { NoDataPage } from '../../../../../../../src/plugins/kibana_react/public'; import { useLinkProps } from '../../../hooks/use_link_props'; export const LogsPageNoIndicesContent = () => { - const { - services: { application }, - } = useKibana<{}>(); - - const canConfigureSource = application?.capabilities?.logs?.configureSource ? true : false; - const tutorialLinkProps = useLinkProps({ app: 'home', hash: '/tutorial_directory/logging', }); return ( - - - - {i18n.translate('xpack.infra.logsPage.noLoggingIndicesInstructionsActionLabel', { - defaultMessage: 'View setup instructions', - })} - - - {canConfigureSource ? ( - - - {i18n.translate('xpack.infra.configureSourceActionLabel', { - defaultMessage: 'Change source configuration', - })} - - - ) : null} -
- } + ); }; From d7c2e29b6dea3036735b3b5de5fb8ea97b4ac4d9 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 16:21:27 -0400 Subject: [PATCH 09/77] Added to APM with temp `falsy` statement. Needs hook --- .../routing/templates/apm_main_template.tsx | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 357ba4c3d9f38..aee5a9c7e1180 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -7,9 +7,13 @@ import { EuiPageHeaderProps, EuiPageTemplateProps } from '@elastic/eui'; import React from 'react'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; +import { + NoDataPage, + useKibana, +} from '../../../../../../../src/plugins/kibana_react/public'; import { ApmPluginStartDeps } from '../../../plugin'; import { EnvironmentFilter } from '../../shared/EnvironmentFilter'; +// import { useSourcererScope } from '../../../../../security_solution/public/common/containers/sourcerer'; /* * This template contains: @@ -35,7 +39,7 @@ export function ApmMainTemplate({ const ObservabilityPageTemplate = services.observability.navigation.PageTemplate; - return ( + return false ? ( {children} + ) : ( + + + ); } From 4563cad3cd840267ce4d5e886a374c90cb400f04 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 16:40:34 -0400 Subject: [PATCH 10/77] Added to Metrics template --- .../public/pages/logs/stream/page_content.tsx | 1 - .../pages/metrics/inventory_view/index.tsx | 50 +------------------ .../public/pages/metrics/page_template.tsx | 40 ++++++++++++++- 3 files changed, 40 insertions(+), 51 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx index 8b3ecf96775c3..3d0a7f72db2cc 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx @@ -15,7 +15,6 @@ import { LogsPageNoIndicesContent } from './page_no_indices_content'; import { LogsPageTemplate } from '../page_template'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { APP_WRAPPER_CLASS } from '../../../../../../../src/core/public'; -import { NoDataPage } from '../../../../../../../src/plugins/kibana_react/public'; const streamTitle = i18n.translate('xpack.infra.logs.streamPageTitle', { defaultMessage: 'Stream', diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx index 9671699dadbad..c0e3a50a7a923 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx @@ -5,23 +5,19 @@ * 2.0. */ -import { EuiButton, EuiErrorBoundary, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiErrorBoundary } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useContext } from 'react'; import { FilterBar } from './components/filter_bar'; import { DocumentTitle } from '../../../components/document_title'; -import { NoIndices } from '../../../components/empty_states/no_indices'; import { SourceErrorPage } from '../../../components/source_error_page'; import { SourceLoadingPage } from '../../../components/source_loading_page'; -import { ViewSourceConfigurationButton } from '../../../components/source_configuration/view_source_configuration_button'; import { Source } from '../../../containers/metrics_source'; import { useTrackPageview } from '../../../../../observability/public'; import { useMetricsBreadcrumbs } from '../../../hooks/use_metrics_breadcrumbs'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { LayoutView } from './components/layout_view'; -import { useLinkProps } from '../../../hooks/use_link_props'; import { SavedViewProvider } from '../../../containers/saved_view/saved_view'; import { DEFAULT_WAFFLE_VIEW_STATE } from './hooks/use_waffle_view_state'; import { useWaffleOptionsContext } from './hooks/use_waffle_options'; @@ -31,7 +27,6 @@ import { APP_WRAPPER_CLASS } from '../../../../../../../src/core/public'; import { inventoryTitle } from '../../../translations'; export const SnapshotPage = () => { - const uiCapabilities = useKibana().services.application?.capabilities; const { hasFailedLoadingSource, isLoading, @@ -44,11 +39,6 @@ export const SnapshotPage = () => { useTrackPageview({ app: 'infra_metrics', path: 'inventory', delay: 15000 }); const { source: optionsSource } = useWaffleOptionsContext(); - const tutorialLinkProps = useLinkProps({ - app: 'home', - hash: '/tutorial_directory/metrics', - }); - useMetricsBreadcrumbs([ { text: inventoryTitle, @@ -94,43 +84,7 @@ export const SnapshotPage = () => { ) : hasFailedLoadingSource ? ( ) : ( - - - - {i18n.translate('xpack.infra.homePage.noMetricsIndicesInstructionsActionLabel', { - defaultMessage: 'View setup instructions', - })} - - - {uiCapabilities?.infrastructure?.configureSource ? ( - - - {i18n.translate('xpack.infra.configureSourceActionLabel', { - defaultMessage: 'Change source configuration', - })} - - - ) : null} - - } - data-test-subj="noMetricsIndicesPrompt" - /> + )} ); diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index c32133525e8e8..d03dd3187dba9 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -5,9 +5,12 @@ * 2.0. */ -import React from 'react'; +import React, { useContext } from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; +import { NoDataPage } from '../../../../../../src/plugins/kibana_react/public'; +import { Source } from '../../containers/metrics_source'; +import { useLinkProps } from '../../hooks/use_link_props'; export const MetricsPageTemplate: React.FC = ( pageTemplateProps @@ -20,5 +23,38 @@ export const MetricsPageTemplate: React.FC = }, } = useKibanaContextForPlugin(); - return ; + const { metricIndicesExist } = useContext(Source.Context); + + const tutorialLinkProps = useLinkProps({ + app: 'home', + hash: '/tutorial_directory/metrics', + }); + + return metricIndicesExist ? ( + + ) : ( + + + + ); }; From b774ecb690970588cb7c417e15d2ffff00e61eb3 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 16:56:11 -0400 Subject: [PATCH 11/77] Added to Uptime and fixed layouts --- .../plugins/uptime/public/apps/uptime_app.tsx | 10 +++-- x-pack/plugins/uptime/public/routes.tsx | 37 +++++++++++++++++-- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx index 60717db8af27d..af1fd454c9f96 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -10,6 +10,7 @@ import { Router } from 'react-router-dom'; import { EuiErrorBoundary } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { I18nStart, ChromeBreadcrumb, CoreStart, AppMountParameters } from 'kibana/public'; +import { APP_WRAPPER_CLASS } from '../../../../../src/core/public'; import { KibanaContextProvider, RedirectAppLinks, @@ -118,9 +119,12 @@ const Application = (props: UptimeAppProps) => { -
- -
+
+ +
diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index e19f4bd5f93c1..ff259a66de336 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -6,6 +6,7 @@ */ import React, { FC, useEffect } from 'react'; +import { useSelector } from 'react-redux'; import styled from 'styled-components'; import { Route, Switch } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -30,7 +31,10 @@ import { useKibana } from '../../../../src/plugins/kibana_react/public'; import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; +import { APP_WRAPPER_CLASS } from '../../../../src/core/public'; +import { indexStatusSelector } from './state/selectors'; +import { NoDataPage } from '../../../../src/plugins/kibana_react/public'; interface RouteProps { path: string; component: React.FC; @@ -151,20 +155,45 @@ export const PageRouter: FC = () => { } `; + const { data } = useSelector(indexStatusSelector); + const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; + return ( {Routes.map( ({ title, path, component: RouteComponent, dataTestSubj, telemetryId, pageHeader }) => ( -
+
- {pageHeader ? ( + {noDataInfo ? ( + + + + ) : ( - ) : ( - )}
From b2ce1c3e1dc01c4952558d13881183848d02807b Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 18:06:18 -0400 Subject: [PATCH 12/77] Fixing UX layout --- x-pack/plugins/apm/public/application/uxApp.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/apm/public/application/uxApp.tsx b/x-pack/plugins/apm/public/application/uxApp.tsx index 0dd90efe64068..411d891519c92 100644 --- a/x-pack/plugins/apm/public/application/uxApp.tsx +++ b/x-pack/plugins/apm/public/application/uxApp.tsx @@ -33,6 +33,7 @@ import { UXActionMenu } from '../components/app/RumDashboard/ActionMenu'; import { redirectTo } from '../components/routing/redirect_to'; import { useBreadcrumbs } from '../../../observability/public'; import { useApmPluginContext } from '../context/apm_plugin/use_apm_plugin_context'; +import { APP_WRAPPER_CLASS } from '../../../../../src/core/public'; export const uxRoutes: APMRouteDefinition[] = [ { @@ -66,7 +67,11 @@ function UxApp() { darkMode, })} > -
+
@@ -104,14 +109,17 @@ export function UXAppRoot({ }; return ( - + - + From ab8c4bd7d1e1436174ad8d20eff0864b922259fe Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 19:28:35 -0400 Subject: [PATCH 13/77] Faked in for UX --- .../no_data_card/elastic_beats_card.test.tsx | 2 +- .../components/app/RumDashboard/RumHome.tsx | 78 +++++++++++++------ .../routing/templates/apm_main_template.tsx | 2 +- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx index 64523332aae8b..38f1f696c3c25 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { ElasticBeatsCard } from './elastic_agent_card'; +import { ElasticBeatsCard } from './elastic_beats_card'; jest.mock('../../context', () => ({ useKibana: jest.fn().mockReturnValue({ diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 26a44180b837d..b84e00fb826ef 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -5,17 +5,18 @@ * 2.0. */ -import React from 'react'; +import React, { useContext } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiTitle, EuiFlexItem } from '@elastic/eui'; import { RumOverview } from '../RumDashboard'; -import { CsmSharedContextProvider } from './CsmSharedContext'; +import { CsmSharedContext, CsmSharedContextProvider } from './CsmSharedContext'; import { WebApplicationSelect } from './Panels/WebApplicationSelect'; import { DatePicker } from '../../shared/DatePicker'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { EnvironmentFilter } from '../../shared/EnvironmentFilter'; import { UserPercentile } from './UserPercentile'; import { useBreakPoints } from '../../../hooks/use_break_points'; +import { NoDataPage } from '../../../../../../../src/plugins/kibana_react/public'; export const UX_LABEL = i18n.translate('xpack.apm.ux.title', { defaultMessage: 'User Experience', @@ -29,29 +30,60 @@ export function RumHome() { const envStyle = isSmall ? {} : { maxWidth: 500 }; + // TODO: NOT THE RIGHT METRIC TO CHECK + const { + sharedData: { totalPageViews }, + } = useContext(CsmSharedContext); + return ( - , -
- -
, - , - , - ], - } - : { children: } - } - > - -
+ {totalPageViews > 0 ? ( + , +
+ +
, + , + , + ], + } + : { children: } + } + > + +
+ ) : ( + + + + )}
); } diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index aee5a9c7e1180..e30d42e22d5df 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -13,7 +13,6 @@ import { } from '../../../../../../../src/plugins/kibana_react/public'; import { ApmPluginStartDeps } from '../../../plugin'; import { EnvironmentFilter } from '../../shared/EnvironmentFilter'; -// import { useSourcererScope } from '../../../../../security_solution/public/common/containers/sourcerer'; /* * This template contains: @@ -39,6 +38,7 @@ export function ApmMainTemplate({ const ObservabilityPageTemplate = services.observability.navigation.PageTemplate; + // TODO: GET A CHECK return false ? ( Date: Thu, 5 Aug 2021 19:49:40 -0400 Subject: [PATCH 14/77] Removing outer template from no data page --- .../public/no_data_page/no_data_page.tsx | 58 +++++++++---------- .../components/app/RumDashboard/RumHome.tsx | 7 ++- .../routing/templates/apm_main_template.tsx | 3 +- .../product_selector/product_selector.tsx | 3 +- .../infra/public/pages/logs/page_template.tsx | 7 ++- .../public/pages/logs/stream/page_content.tsx | 3 +- .../public/pages/metrics/page_template.tsx | 7 ++- .../app/home/template_wrapper/index.tsx | 13 ++++- x-pack/plugins/uptime/public/routes.tsx | 4 +- 9 files changed, 60 insertions(+), 45 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 38187cfad2735..e245bae50c5c2 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -20,14 +20,12 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { - KibanaPageTemplate, - KibanaPageTemplateProps, - KibanaPageTemplateSolutionNavAvatar, -} from '../page_template'; +import { KibanaPageTemplateProps, KibanaPageTemplateSolutionNavAvatar } from '../page_template'; import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; +export const NO_DATA_PAGE_MAX_WIDTH = 950; + export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', { defaultMessage: 'Recommended', }); @@ -103,19 +101,13 @@ export const NoDataPage: FunctionComponent = ({ }, [actions, sortedData, actionsKeys]); return ( - +
-

= ({ {renderActions} - {actionsKeys.length > 1 ? ( - -

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

-
+ <> + + +

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

+
+ ) : undefined} - +

); }; diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index b84e00fb826ef..04723deb5eec9 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -16,7 +16,10 @@ import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_ import { EnvironmentFilter } from '../../shared/EnvironmentFilter'; import { UserPercentile } from './UserPercentile'; import { useBreakPoints } from '../../../hooks/use_break_points'; -import { NoDataPage } from '../../../../../../../src/plugins/kibana_react/public'; +import { + NoDataPage, + NO_DATA_PAGE_MAX_WIDTH, +} from '../../../../../../../src/plugins/kibana_react/public'; export const UX_LABEL = i18n.translate('xpack.apm.ux.title', { defaultMessage: 'User Experience', @@ -61,12 +64,12 @@ export function RumHome() { ) : ( = ({ access }) => { return ( diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index c60c939dc6733..789f5605de0a0 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -9,7 +9,10 @@ import React from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { useLogSourceContext } from '../../containers/logs/log_source'; -import { NoDataPage } from '../../../../../../src/plugins/kibana_react/public'; +import { + NoDataPage, + NO_DATA_PAGE_MAX_WIDTH, +} from '../../../../../../src/plugins/kibana_react/public'; export const LogsPageTemplate: React.FC = ( pageTemplateProps @@ -28,12 +31,12 @@ export const LogsPageTemplate: React.FC = ( ) : ( { } else { return ( diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index d03dd3187dba9..d6f8a06bba362 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -8,7 +8,10 @@ import React, { useContext } from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; -import { NoDataPage } from '../../../../../../src/plugins/kibana_react/public'; +import { + NoDataPage, + NO_DATA_PAGE_MAX_WIDTH, +} from '../../../../../../src/plugins/kibana_react/public'; import { Source } from '../../containers/metrics_source'; import { useLinkProps } from '../../hooks/use_link_props'; @@ -34,12 +37,12 @@ export const MetricsPageTemplate: React.FC = ) : ( ) : ( - + + + ); } ); diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index ff259a66de336..446e7bd85ba5a 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -27,7 +27,7 @@ import { SyntheticsCheckSteps } from './pages/synthetics/synthetics_checks'; import { ClientPluginsStart } from './apps/plugin'; import { MonitorPageTitle, MonitorPageTitleContent } from './components/monitor/monitor_title'; import { UptimeDatePicker } from './components/common/uptime_date_picker'; -import { useKibana } from '../../../../src/plugins/kibana_react/public'; +import { NO_DATA_PAGE_MAX_WIDTH, useKibana } from '../../../../src/plugins/kibana_react/public'; import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; @@ -168,12 +168,12 @@ export const PageRouter: FC = () => { {noDataInfo ? ( Date: Thu, 5 Aug 2021 20:40:11 -0400 Subject: [PATCH 15/77] Optimizing some prop usages --- .../public/no_data_page/no_data_page.tsx | 16 ++++++++++++ .../public/page_template/page_template.tsx | 8 +++++- .../components/app/RumDashboard/RumHome.tsx | 11 ++------ .../routing/templates/apm_main_template.tsx | 9 ++----- .../product_selector/product_selector.tsx | 8 ++---- .../infra/public/pages/logs/page_template.tsx | 11 ++------ .../public/pages/logs/stream/page_content.tsx | 11 ++------ .../public/pages/metrics/page_template.tsx | 11 ++------ .../components/app/empty_sections/index.tsx | 4 +-- .../public/pages/overview/index.tsx | 26 ++++++++++++++++++- .../app/home/template_wrapper/index.tsx | 8 ++---- x-pack/plugins/uptime/public/routes.tsx | 16 +++++------- 12 files changed, 70 insertions(+), 69 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index e245bae50c5c2..345f2aa970af3 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -20,11 +20,27 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { euiThemeVars } from '@kbn/ui-shared-deps/theme'; import { KibanaPageTemplateProps, KibanaPageTemplateSolutionNavAvatar } from '../page_template'; import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; export const NO_DATA_PAGE_MAX_WIDTH = 950; +export function getKibanaNoDataPageTemplateProps(hasSidebar: boolean = true) { + return { + restrictWidth: 950, + template: 'centeredBody', + pageContentProps: { + hasShadow: false, + color: 'transparent', + }, + pageBodyProps: hasSidebar && { + style: { + borderLeft: euiThemeVars.euiBorderThin, + }, + }, + } as KibanaPageTemplateProps; +} export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', { defaultMessage: 'Recommended', diff --git a/src/plugins/kibana_react/public/page_template/page_template.tsx b/src/plugins/kibana_react/public/page_template/page_template.tsx index 1e63f2e068508..02ad05ab3bce4 100644 --- a/src/plugins/kibana_react/public/page_template/page_template.tsx +++ b/src/plugins/kibana_react/public/page_template/page_template.tsx @@ -17,6 +17,7 @@ import { EuiPageTemplate, EuiPageTemplateProps, useIsWithinBreakpoints, + DistributiveOmit, } from '@elastic/eui'; import { @@ -27,7 +28,7 @@ import { /** * A thin wrapper around EuiPageTemplate with a few Kibana specific additions */ -export type KibanaPageTemplateProps = EuiPageTemplateProps & { +export type KibanaPageTemplateProps = DistributiveOmit & { /** * Changes the template type depending on other props provided. * With `pageHeader` only: Uses `centeredBody` and fills an EuiEmptyPrompt with `pageHeader` info. @@ -39,6 +40,11 @@ export type KibanaPageTemplateProps = EuiPageTemplateProps & { * Quick creation of EuiSideNav. Hooks up mobile instance too */ solutionNav?: KibanaPageTemplateSolutionNavProps; + /** + * Accepts all the same `template` options of EuiPageTemplate plus custom ones: + * `noData`: Displays Agent, Beats, and custom cards to direct users to the right ingest location + */ + template?: EuiPageTemplateProps['template'] | 'noData'; }; export const KibanaPageTemplate: FunctionComponent = ({ diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 04723deb5eec9..e2ef2dc5a44c8 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -18,7 +18,7 @@ import { UserPercentile } from './UserPercentile'; import { useBreakPoints } from '../../../hooks/use_break_points'; import { NoDataPage, - NO_DATA_PAGE_MAX_WIDTH, + getKibanaNoDataPageTemplateProps, } from '../../../../../../../src/plugins/kibana_react/public'; export const UX_LABEL = i18n.translate('xpack.apm.ux.title', { @@ -63,14 +63,7 @@ export function RumHome() { ) : ( - + = ({ access }) => { const shouldShowWorkplaceSearchCard = !config.host || hasWorkplaceSearchAccess; return ( - + diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index 789f5605de0a0..08a0763b801a8 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -11,7 +11,7 @@ import type { LazyObservabilityPageTemplateProps } from '../../../../observabili import { useLogSourceContext } from '../../containers/logs/log_source'; import { NoDataPage, - NO_DATA_PAGE_MAX_WIDTH, + getKibanaNoDataPageTemplateProps, } from '../../../../../../src/plugins/kibana_react/public'; export const LogsPageTemplate: React.FC = ( @@ -30,14 +30,7 @@ export const LogsPageTemplate: React.FC = ( return sourceStatus?.logIndexStatus !== 'missing' ? ( ) : ( - + { ); } else { return ( - + ); diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index d6f8a06bba362..97fbc0a184ffa 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -10,7 +10,7 @@ import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { NoDataPage, - NO_DATA_PAGE_MAX_WIDTH, + getKibanaNoDataPageTemplateProps, } from '../../../../../../src/plugins/kibana_react/public'; import { Source } from '../../containers/metrics_source'; import { useLinkProps } from '../../hooks/use_link_props'; @@ -36,14 +36,7 @@ export const MetricsPageTemplate: React.FC = return metricIndicesExist ? ( ) : ( - + diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index 71c52c3a51d3b..09960d9c31fab 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -8,6 +8,10 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { + NoDataPage, + getKibanaNoDataPageTemplateProps, +} from '../../../../../../src/plugins/kibana_react/public'; import { useTrackPageview } from '../..'; import { Alert } from '../../../../alerting/common'; import { EmptySections } from '../../components/app/empty_sections'; @@ -72,7 +76,8 @@ export function OverviewPage({ routeParams }: Props) { end: absoluteTime.end, }); - return ( + // TODO: GET THE RIGHT CHECK + return hasAnyData ? ( + ) : ( + + + + + ); } diff --git a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx index 59ecb047813bd..696595b4c0659 100644 --- a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx @@ -12,7 +12,7 @@ import { IS_DRAGGING_CLASS_NAME } from '@kbn/securitysolution-t-grid'; import { AppLeaveHandler } from '../../../../../../../src/core/public'; import { KibanaPageTemplate, - NO_DATA_PAGE_MAX_WIDTH, + getKibanaNoDataPageTemplateProps, } from '../../../../../../../src/plugins/kibana_react/public'; import { useSecuritySolutionNavigation } from '../../../common/components/navigation/use_security_solution_navigation'; import { TimelineId } from '../../../../common/types/timeline'; @@ -103,11 +103,7 @@ export const SecuritySolutionTemplateWrapper: React.FC ) : ( - + ); diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index 446e7bd85ba5a..fdd0e99610873 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -27,7 +27,10 @@ import { SyntheticsCheckSteps } from './pages/synthetics/synthetics_checks'; import { ClientPluginsStart } from './apps/plugin'; import { MonitorPageTitle, MonitorPageTitleContent } from './components/monitor/monitor_title'; import { UptimeDatePicker } from './components/common/uptime_date_picker'; -import { NO_DATA_PAGE_MAX_WIDTH, useKibana } from '../../../../src/plugins/kibana_react/public'; +import { + getKibanaNoDataPageTemplateProps, + useKibana, +} from '../../../../src/plugins/kibana_react/public'; import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; @@ -167,14 +170,7 @@ export const PageRouter: FC = () => { {noDataInfo ? ( - + { }} docsLink={'#'} /> - + ) : ( From 8c0acc46d5854b577af569467b6a9f218ff31e52 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 22:47:03 -0400 Subject: [PATCH 16/77] Making `noDataConfig` a view in KibanaPageTemplate --- .../public/no_data_page/no_data_page.tsx | 29 +++---- .../public/page_template/page_template.scss | 4 + .../public/page_template/page_template.tsx | 47 +++++++++-- .../components/app/RumDashboard/RumHome.tsx | 81 +++++++++---------- .../routing/templates/apm_main_template.tsx | 47 +++++------ .../product_selector/product_selector.tsx | 4 +- .../infra/public/pages/logs/page_template.tsx | 43 +++++----- .../public/pages/logs/stream/page_content.tsx | 7 +- .../logs/stream/page_no_indices_content.tsx | 26 +++--- .../public/pages/metrics/page_template.tsx | 30 +++---- .../shared/page_template/page_template.tsx | 1 + .../public/pages/cases/cases.stories.tsx | 8 +- .../public/pages/overview/index.tsx | 44 +++++----- .../app/home/template_wrapper/index.tsx | 9 +-- .../components/overview_empty/index.tsx | 12 +-- x-pack/plugins/uptime/public/routes.tsx | 48 +++++------ 16 files changed, 217 insertions(+), 223 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 345f2aa970af3..bd476a0c16dc1 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -20,27 +20,19 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { euiThemeVars } from '@kbn/ui-shared-deps/theme'; import { KibanaPageTemplateProps, KibanaPageTemplateSolutionNavAvatar } from '../page_template'; import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; export const NO_DATA_PAGE_MAX_WIDTH = 950; -export function getKibanaNoDataPageTemplateProps(hasSidebar: boolean = true) { - return { - restrictWidth: 950, - template: 'centeredBody', - pageContentProps: { - hasShadow: false, - color: 'transparent', - }, - pageBodyProps: hasSidebar && { - style: { - borderLeft: euiThemeVars.euiBorderThin, - }, - }, - } as KibanaPageTemplateProps; -} +export const NO_DATA_PAGE_TEMPLATE_PROPS: KibanaPageTemplateProps = { + restrictWidth: NO_DATA_PAGE_MAX_WIDTH, + template: 'centeredBody', + pageContentProps: { + hasShadow: false, + color: 'transparent', + }, +}; export const NO_DATA_RECOMMENDED = i18n.translate('kbn.noDataPage.recommended', { defaultMessage: 'Recommended', @@ -63,18 +55,17 @@ export type NoDataPageActions = Partial & { export type NoDataPageActionsProps = Record; -export type NoDataPageProps = KibanaPageTemplateProps & { +export interface NoDataPageProps { solution: string; logo?: string; actions: NoDataPageActionsProps; docsLink: string; -}; +} export const NoDataPage: FunctionComponent = ({ solution, logo, actions, - title, docsLink, ...rest }) => { diff --git a/src/plugins/kibana_react/public/page_template/page_template.scss b/src/plugins/kibana_react/public/page_template/page_template.scss index 63acf168007b7..ce73ba305c43f 100644 --- a/src/plugins/kibana_react/public/page_template/page_template.scss +++ b/src/plugins/kibana_react/public/page_template/page_template.scss @@ -10,4 +10,8 @@ &.kbnPageTemplate__pageSideBar--shrink { min-width: $euiSizeXXL + $euiSize; } + + .kbnPageTemplate--centeredBody & { + border-right: $euiBorderThin; + } } diff --git a/src/plugins/kibana_react/public/page_template/page_template.tsx b/src/plugins/kibana_react/public/page_template/page_template.tsx index 02ad05ab3bce4..951931b98925b 100644 --- a/src/plugins/kibana_react/public/page_template/page_template.tsx +++ b/src/plugins/kibana_react/public/page_template/page_template.tsx @@ -17,7 +17,6 @@ import { EuiPageTemplate, EuiPageTemplateProps, useIsWithinBreakpoints, - DistributiveOmit, } from '@elastic/eui'; import { @@ -25,10 +24,12 @@ import { KibanaPageTemplateSolutionNavProps, } from './solution_nav/solution_nav'; +import { NoDataPage, NoDataPageProps, NO_DATA_PAGE_TEMPLATE_PROPS } from '../no_data_page'; + /** * A thin wrapper around EuiPageTemplate with a few Kibana specific additions */ -export type KibanaPageTemplateProps = DistributiveOmit & { +export type KibanaPageTemplateProps = EuiPageTemplateProps & { /** * Changes the template type depending on other props provided. * With `pageHeader` only: Uses `centeredBody` and fills an EuiEmptyPrompt with `pageHeader` info. @@ -41,14 +42,15 @@ export type KibanaPageTemplateProps = DistributiveOmit = ({ template, + className, pageHeader, children, isEmptyState, @@ -56,6 +58,7 @@ export const KibanaPageTemplate: FunctionComponent = ({ pageSideBar, pageSideBarProps, solutionNav, + noDataConfig, ...rest }) => { /** @@ -92,11 +95,10 @@ export const KibanaPageTemplate: FunctionComponent = ({ ); } - const emptyStateDefaultTemplate = pageSideBar ? 'centeredContent' : 'centeredBody'; - /** * An easy way to create the right content for empty pages */ + const emptyStateDefaultTemplate = pageSideBar ? 'centeredContent' : 'centeredBody'; if (isEmptyState && pageHeader && !children) { template = template ?? emptyStateDefaultTemplate; const { iconType, pageTitle, description, rightSideItems } = pageHeader; @@ -116,9 +118,40 @@ export const KibanaPageTemplate: FunctionComponent = ({ template = template ?? emptyStateDefaultTemplate; } + // Set the template before the classes + template = noDataConfig ? NO_DATA_PAGE_TEMPLATE_PROPS.template : template; + + const classes = classNames( + 'kbnPageTemplate', + { [`kbnPageTemplate--${template}`]: template }, + className + ); + + /** + * If passing the custom template of `noDataConfig` + */ + if (noDataConfig) { + return ( + + + + ); + } + return ( - {totalPageViews > 0 ? ( - , -
- -
, - , - , - ], - } - : { children: } - } - > - -
- ) : ( - - - - )} + 0 ? undefined : noDataConfig} + pageHeader={ + isXXL + ? { + pageTitle: i18n.translate('xpack.apm.ux.overview', { + defaultMessage: 'Overview', + }), + rightSideItems: [ + , +
+ +
, + , + , + ], + } + : { children: } + } + > + +
); } diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 03645ef285c09..26400d6a4c077 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -5,12 +5,11 @@ * 2.0. */ -import { EuiPageHeaderProps, EuiPageTemplateProps } from '@elastic/eui'; +import { EuiPageHeaderProps } from '@elastic/eui'; import React from 'react'; import { - NoDataPage, - getKibanaNoDataPageTemplateProps, useKibana, + KibanaPageTemplateProps, } from '../../../../../../../src/plugins/kibana_react/public'; import { ApmPluginStartDeps } from '../../../plugin'; import { EnvironmentFilter } from '../../shared/EnvironmentFilter'; @@ -33,15 +32,33 @@ export function ApmMainTemplate({ pageTitle?: React.ReactNode; pageHeader?: EuiPageHeaderProps; children: React.ReactNode; -} & EuiPageTemplateProps) { +} & KibanaPageTemplateProps) { const { services } = useKibana(); const ObservabilityPageTemplate = services.observability.navigation.PageTemplate; + // TODO: NEEDS A DATA GET A CHECK + const hasData = false; + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { + solution: 'Observability', + actions: { + elasticAgent: { + href: 'app/integrations/browse', + recommended: false, + }, + beats: { + href: `app/home#/tutorial_directory/logging`, + recommended: true, + }, + }, + docsLink: '#', + }; + // TODO: GET A CHECK - return false ? ( + return ( ], @@ -51,25 +68,5 @@ export function ApmMainTemplate({ > {children} - ) : ( - - - ); } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx index eddc50d0a25a9..06eda4b5daaff 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx @@ -15,7 +15,7 @@ import { i18n } from '@kbn/i18n'; import { KibanaPageTemplate, KibanaPageTemplateSolutionNavAvatar, - getKibanaNoDataPageTemplateProps, + NO_DATA_PAGE_TEMPLATE_PROPS, } from '../../../../../../../../src/plugins/kibana_react/public'; import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { KibanaLogic } from '../../../shared/kibana'; @@ -45,7 +45,7 @@ export const ProductSelector: React.FC = ({ access }) => { const shouldShowWorkplaceSearchCard = !config.host || hasWorkplaceSearchAccess; return ( - + diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index 08a0763b801a8..259e7087bca08 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -9,10 +9,7 @@ import React from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { useLogSourceContext } from '../../containers/logs/log_source'; -import { - NoDataPage, - getKibanaNoDataPageTemplateProps, -} from '../../../../../../src/plugins/kibana_react/public'; +import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; export const LogsPageTemplate: React.FC = ( pageTemplateProps @@ -26,25 +23,23 @@ export const LogsPageTemplate: React.FC = ( } = useKibanaContextForPlugin(); const { sourceStatus } = useLogSourceContext(); - - return sourceStatus?.logIndexStatus !== 'missing' ? ( - - ) : ( - - - - ); + docsLink: '#', + }; + + return ; }; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx index 6b8956571ca1e..527dc79726044 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx @@ -15,7 +15,6 @@ import { LogsPageNoIndicesContent } from './page_no_indices_content'; import { LogsPageTemplate } from '../page_template'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { APP_WRAPPER_CLASS } from '../../../../../../../src/core/public'; -import { getKibanaNoDataPageTemplateProps } from '../../../../../../../src/plugins/kibana_react/public'; const streamTitle = i18n.translate('xpack.infra.logs.streamPageTitle', { defaultMessage: 'Stream', @@ -48,11 +47,7 @@ export const StreamPageContent: React.FunctionComponent = () => { ); } else { - return ( - - - - ); + return ; } }; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx index 2f28a04d32038..4f54c0542cb62 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx @@ -6,8 +6,8 @@ */ import React from 'react'; -import { NoDataPage } from '../../../../../../../src/plugins/kibana_react/public'; import { useLinkProps } from '../../../hooks/use_link_props'; +import { LogsPageTemplate } from '../page_template'; export const LogsPageNoIndicesContent = () => { const tutorialLinkProps = useLinkProps({ @@ -16,19 +16,21 @@ export const LogsPageNoIndicesContent = () => { }); return ( - ); }; diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index 97fbc0a184ffa..b9b92ec2185b4 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -8,10 +8,7 @@ import React, { useContext } from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; -import { - NoDataPage, - getKibanaNoDataPageTemplateProps, -} from '../../../../../../src/plugins/kibana_react/public'; +import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; import { Source } from '../../containers/metrics_source'; import { useLinkProps } from '../../hooks/use_link_props'; @@ -26,20 +23,17 @@ export const MetricsPageTemplate: React.FC = }, } = useKibanaContextForPlugin(); - const { metricIndicesExist } = useContext(Source.Context); - const tutorialLinkProps = useLinkProps({ app: 'home', hash: '/tutorial_directory/metrics', }); - return metricIndicesExist ? ( - - ) : ( - - = ...tutorialLinkProps, recommended: true, }, - }} - docsLink={'#'} - /> - - ); + }, + docsLink: '#', + }; + + return ; }; diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx index 896aca79114d7..fa974cc662762 100644 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx +++ b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx @@ -30,6 +30,7 @@ export type WrappedPageTemplateProps = Pick< | 'restrictWidth' | 'template' | 'isEmptyState' + | 'noDataConfig' >; export interface ObservabilityPageTemplateDependencies { diff --git a/x-pack/plugins/observability/public/pages/cases/cases.stories.tsx b/x-pack/plugins/observability/public/pages/cases/cases.stories.tsx index 1eaaa42f7cc10..731e147358a10 100644 --- a/x-pack/plugins/observability/public/pages/cases/cases.stories.tsx +++ b/x-pack/plugins/observability/public/pages/cases/cases.stories.tsx @@ -5,11 +5,13 @@ * 2.0. */ -import { EuiPageTemplate } from '@elastic/eui'; import React, { ComponentType } from 'react'; import { MemoryRouter } from 'react-router-dom'; import { CoreStart } from '../../../../../../src/core/public'; -import { createKibanaReactContext } from '../../../../../../src/plugins/kibana_react/public'; +import { + createKibanaReactContext, + KibanaPageTemplate, +} from '../../../../../../src/plugins/kibana_react/public'; import { casesFeatureId } from '../../../common'; import { PluginContext, PluginContextValue } from '../../context/plugin_context'; import { AllCasesPage } from './all_cases'; @@ -34,7 +36,7 @@ export default { } as unknown) as Partial); const pluginContextValue = ({ - ObservabilityPageTemplate: EuiPageTemplate, + ObservabilityPageTemplate: KibanaPageTemplate, } as unknown) as PluginContextValue; return ( diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index 09960d9c31fab..bb97b186eb097 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -8,10 +8,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { - NoDataPage, - getKibanaNoDataPageTemplateProps, -} from '../../../../../../src/plugins/kibana_react/public'; +import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; import { useTrackPageview } from '../..'; import { Alert } from '../../../../alerting/common'; import { EmptySections } from '../../components/app/empty_sections'; @@ -77,8 +74,26 @@ export function OverviewPage({ routeParams }: Props) { }); // TODO: GET THE RIGHT CHECK - return hasAnyData ? ( + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = hasAnyData + ? undefined + : { + solution: 'Observability', + actions: { + elasticAgent: { + href: 'app/integrations/browse', + recommended: false, + }, + beats: { + href: `app/home#/tutorial_directory/logging`, + recommended: true, + }, + }, + docsLink: '#', + }; + + return ( - ) : ( - - - - - ); } diff --git a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx index 696595b4c0659..c0744ef6876b8 100644 --- a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx @@ -10,10 +10,7 @@ import styled from 'styled-components'; import { EuiPanel } from '@elastic/eui'; import { IS_DRAGGING_CLASS_NAME } from '@kbn/securitysolution-t-grid'; import { AppLeaveHandler } from '../../../../../../../src/core/public'; -import { - KibanaPageTemplate, - getKibanaNoDataPageTemplateProps, -} from '../../../../../../../src/plugins/kibana_react/public'; +import { KibanaPageTemplate } from '../../../../../../../src/plugins/kibana_react/public'; import { useSecuritySolutionNavigation } from '../../../common/components/navigation/use_security_solution_navigation'; import { TimelineId } from '../../../../common/types/timeline'; import { getTimelineShowStatusByIdSelector } from '../../../timelines/components/flyout/selectors'; @@ -103,9 +100,7 @@ export const SecuritySolutionTemplateWrapper: React.FC ) : ( - - - + ); } ); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 24b91a0b8fb2f..d3be3fb6cd122 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -22,7 +22,7 @@ import { endpointPackageVersion as useEndpointPackageVersion } from '../../../ma import { useUserPrivileges } from '../../../common/components/user_privileges'; import { - NoDataPage, + KibanaPageTemplate, NoDataPageActionsProps, } from '../../../../../../../src/plugins/kibana_react/public'; @@ -69,11 +69,13 @@ const OverviewEmptyComponent: React.FC = () => { ); return ( - ); }; diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index fdd0e99610873..da7973420fce8 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -27,17 +27,13 @@ import { SyntheticsCheckSteps } from './pages/synthetics/synthetics_checks'; import { ClientPluginsStart } from './apps/plugin'; import { MonitorPageTitle, MonitorPageTitleContent } from './components/monitor/monitor_title'; import { UptimeDatePicker } from './components/common/uptime_date_picker'; -import { - getKibanaNoDataPageTemplateProps, - useKibana, -} from '../../../../src/plugins/kibana_react/public'; +import { KibanaPageTemplateProps, useKibana } from '../../../../src/plugins/kibana_react/public'; import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; import { APP_WRAPPER_CLASS } from '../../../../src/core/public'; import { indexStatusSelector } from './state/selectors'; -import { NoDataPage } from '../../../../src/plugins/kibana_react/public'; interface RouteProps { path: string; component: React.FC; @@ -160,6 +156,20 @@ export const PageRouter: FC = () => { const { data } = useSelector(indexStatusSelector); const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { + solution: 'Observability', + actions: { + elasticAgent: { + href: 'app/integrations/browse', + recommended: false, + }, + beats: { + href: `app/home#/tutorial_directory/logging`, + recommended: true, + }, + }, + docsLink: '#', + }; return ( @@ -169,28 +179,12 @@ export const PageRouter: FC = () => {
- {noDataInfo ? ( - - - - ) : ( - - - - )} + + +
) From 67c7b6aba13e2bc1ece650bef06d918ddd4bf8d3 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 5 Aug 2021 23:16:13 -0400 Subject: [PATCH 17/77] Working on links --- .../no_data_card/elastic_agent_card.tsx | 6 ++-- .../no_data_card/elastic_beats_card.tsx | 4 +-- .../public/no_data_page/no_data_page.tsx | 29 +++++++++++++++---- .../components/app/RumDashboard/RumHome.tsx | 5 ++-- .../routing/templates/apm_main_template.tsx | 5 ++-- .../public/pages/metrics/page_template.tsx | 7 ++++- x-pack/plugins/uptime/public/routes.tsx | 5 ++-- 7 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx index cbe912ea6abcd..c90686507d254 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -39,7 +39,6 @@ export const ElasticAgentCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - // @ts-ignore = ({ > {button || i18n.translate('elasticAgentCard.buttonLabel', { - defaultMessage: 'Find a {solution} integration', + defaultMessage: 'Find an integration for {solution}', values: { solution }, })} ); return ( - // @ts-ignore = ({ image={addBasePath(`${basePathUrl}elastic_agent_card.svg`)} betaBadgeLabel={recommended ? NO_DATA_RECOMMENDED : undefined} footer={footer} - {...cardRest} + {...(cardRest as any)} /> ); }; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx index e0c1fb7679f78..9fcf82a972c4b 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx @@ -32,7 +32,6 @@ export const ElasticBeatsCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - // @ts-ignore = ({ ); return ( - // @ts-ignore = ({ )} betaBadgeLabel={recommended ? NO_DATA_RECOMMENDED : undefined} footer={footer} - {...cardRest} + {...(cardRest as any)} /> ); }; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index bd476a0c16dc1..2fc00ca7b765c 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -56,10 +56,26 @@ export type NoDataPageActions = Partial & { export type NoDataPageActionsProps = Record; export interface NoDataPageProps { + /** + * Single name for the current solution + */ solution: string; + /** + * Optionally replace the auto-generated logo + */ logo?: string; + /** + * The array of card configurations + */ actions: NoDataPageActionsProps; + /** + * Link to docs for the whole solution + */ docsLink: string; + /** + * Replace the auto-generated page title (h1) + */ + pageTitle?: string; } export const NoDataPage: FunctionComponent = ({ @@ -67,6 +83,7 @@ export const NoDataPage: FunctionComponent = ({ logo, actions, docsLink, + pageTitle, ...rest }) => { // Convert obj data into an iterable array @@ -117,11 +134,13 @@ export const NoDataPage: FunctionComponent = ({ />

- + {pageTitle || ( + + )}

diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index c67956b0b9d3f..57ace1400746a 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -36,13 +36,14 @@ export function RumHome() { } = useContext(CsmSharedContext); const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { solution: 'Observability', + pageTitle: 'Set up User Experience Tracking for Observability!', actions: { elasticAgent: { - href: 'app/integrations/browse', + href: 'integrations/detail/apm-0.3.0/overview', recommended: false, }, beats: { - href: `app/home#/tutorial_directory/logging`, + href: `home#/tutorial/apm`, recommended: true, }, }, diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 26400d6a4c077..fed574d52358c 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -42,13 +42,14 @@ export function ApmMainTemplate({ const hasData = false; const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { solution: 'Observability', + pageTitle: 'Set up APM for Observability!', actions: { elasticAgent: { - href: 'app/integrations/browse', + href: '/integrations/detail/apm-0.3.0/overview', recommended: false, }, beats: { - href: `app/home#/tutorial_directory/logging`, + href: `/app/home#/tutorial/apm`, recommended: true, }, }, diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index b9b92ec2185b4..16c1a37294ccf 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -28,14 +28,19 @@ export const MetricsPageTemplate: React.FC = hash: '/tutorial_directory/metrics', }); + const integrationLinkProps = useLinkProps({ + app: 'integrations/browse', + }); + const { metricIndicesExist } = useContext(Source.Context); const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = metricIndicesExist ? undefined : { solution: 'Observability', + pageTitle: 'Set up Metrics for Observability!', actions: { elasticAgent: { - href: 'app/integrations/browse', + ...integrationLinkProps, recommended: false, }, beats: { diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index da7973420fce8..aaa5eaf8e0002 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -158,13 +158,14 @@ export const PageRouter: FC = () => { const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { solution: 'Observability', + pageTitle: 'Set up Uptime for Observability!', actions: { elasticAgent: { - href: 'app/integrations/browse', + href: 'integrations/detail/synthetics-0.2.1/overview', recommended: false, }, beats: { - href: `app/home#/tutorial_directory/logging`, + href: `home#/tutorial/uptimeMonitors`, recommended: true, }, }, From 6e4e53b552832d557ce2c69197648780bea05e76 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 9 Aug 2021 11:59:47 -0400 Subject: [PATCH 18/77] Obs Getting Started page (without solution nav) --- .../routing/templates/apm_main_template.tsx | 2 +- .../shared/page_template/page_template.tsx | 19 +- .../public/pages/landing/index.tsx | 166 +++++++++--------- 3 files changed, 97 insertions(+), 90 deletions(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index fed574d52358c..a959ad6699a06 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -38,7 +38,7 @@ export function ApmMainTemplate({ const ObservabilityPageTemplate = services.observability.navigation.PageTemplate; - // TODO: NEEDS A DATA GET A CHECK + // TODO: NEEDS A DATA CHECK const hasData = false; const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { solution: 'Observability', diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx index fa974cc662762..b9ad074c7dea8 100644 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx +++ b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx @@ -31,7 +31,9 @@ export type WrappedPageTemplateProps = Pick< | 'template' | 'isEmptyState' | 'noDataConfig' ->; +> & { + showSolutionNav?: boolean; +}; export interface ObservabilityPageTemplateDependencies { currentAppId$: Observable; @@ -49,6 +51,7 @@ export function ObservabilityPageTemplate({ getUrlForApp, navigateToApp, navigationSections$, + showSolutionNav = true, ...pageTemplateProps }: ObservabilityPageTemplateProps): React.ReactElement | null { const sections = useObservable(navigationSections$, []); @@ -105,11 +108,15 @@ export function ObservabilityPageTemplate({ {children} diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index 28d3784c65c4a..1c443f38eb6c5 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -19,6 +19,7 @@ import { import { i18n } from '@kbn/i18n'; import React, { useContext } from 'react'; import styled, { ThemeContext } from 'styled-components'; +import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; import { FleetPanel } from '../../components/app/fleet_panel'; import { ObservabilityHeaderMenu } from '../../components/app/header'; import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; @@ -27,10 +28,6 @@ import { useTrackPageview } from '../../hooks/use_track_metric'; import { appsSection } from '../home/section'; import './styles.scss'; -const EuiCardWithoutPadding = styled(EuiCard)` - padding: 0; -`; - export function LandingPage() { useTrackPageview({ app: 'observability-overview', path: 'landing' }); useTrackPageview({ app: 'observability-overview', path: 'landing', delay: 15000 }); @@ -45,92 +42,95 @@ export function LandingPage() { const { core, ObservabilityPageTemplate } = usePluginContext(); const theme = useContext(ThemeContext); + // TODO: NEEDS A DATA CHECK + // NO SIDE NAV since nothing is setup + const hasData = false; + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { + solution: 'Observability', + actions: { + elasticAgent: { + href: 'app/integrations/browse', + recommended: false, + }, + beats: { + href: `app/home#/tutorial_directory/logging`, + recommended: true, + }, + }, + docsLink: '#', + }; + return ( - + , + ], + }} + > - - {/* title and description */} - - -

- {i18n.translate('xpack.observability.home.sectionTitle', { - defaultMessage: 'Unified visibility across your entire ecosystem', - })} -

- - - - {i18n.translate('xpack.observability.home.sectionsubtitle', { - defaultMessage: - 'Monitor, analyze, and react to events happening anywhere in your environment by bringing logs, metrics, and traces together at scale in a single stack.', - })} - - - {/* Apps sections */} - - - - - - {appsSection.map((app) => ( - - -

{app.title}

- - } - description={app.description} - /> -
- ))} -
-
- - - -
-
+ - + {/* Apps sections */} + + {appsSection.map((app) => ( + + +

{app.title}

+ + } + description={app.description} + /> +
+ ))} +
- {/* Get started button */} - - - - - {i18n.translate('xpack.observability.home.getStatedButton', { - defaultMessage: 'Get started', - })} - - - - + - + + {/* Get started button */} + +
+ + {i18n.translate('xpack.observability.home.getStatedButton', { + defaultMessage: 'Get started', + })} + - - - - - - + +
+
+ +
From 7850037f9ead9702e5563a807e8d58887c8ffefc Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 9 Aug 2021 13:53:46 -0400 Subject: [PATCH 19/77] Cleanup --- .../solution_nav/solution_nav_avatar.scss | 6 +-- .../license_callout/license_callout.tsx | 15 +++---- .../product_selector.test.tsx | 4 +- .../product_selector/product_selector.tsx | 8 ++-- .../setup_guide/setup_guide_cta.scss | 4 -- .../setup_guide/setup_guide_cta.tsx | 10 ++--- .../applications/enterprise_search/index.scss | 41 ------------------- .../applications/enterprise_search/index.tsx | 2 - .../public/pages/landing/index.tsx | 4 +- .../plugins/uptime/public/apps/uptime_app.tsx | 8 ++-- 10 files changed, 24 insertions(+), 78 deletions(-) delete mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.scss b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.scss index de5e8c6d911a8..4b47fefc65891 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.scss +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.scss @@ -2,13 +2,13 @@ @include euiBottomShadowSmall; &--xxl { - @include size(100px); @include euiBottomShadowMedium; + @include size(100px); + line-height: 100px; + border-radius: 100px; display: inline-block; background: $euiColorEmptyShade url('../../assets/texture.svg') no-repeat; background-size: cover, 125%; text-align: center; - line-height: 100px; - border-radius: 100px; } } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx index bff71e03317fb..0611c5f5ca7a3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/license_callout/license_callout.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { LicensingLogic, ManageLicenseButton } from '../../../shared/licensing'; @@ -25,18 +25,15 @@ export const LicenseCallout: React.FC = () => { return ( - - + +

{PRODUCT_SELECTOR_CALLOUT_HEADING}

-
- - {LICENSE_CALLOUT_BODY} + {LICENSE_CALLOUT_BODY}
+ -
- -
+
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.test.tsx index 90e16fe2d22fa..58a0b1d42ceb9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.test.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiPage } from '@elastic/eui'; +import { KibanaPageTemplate } from '../../../../../../../../src/plugins/kibana_react/public'; import { LicenseCallout } from '../license_callout'; import { ProductCard } from '../product_card'; @@ -25,7 +25,7 @@ describe('ProductSelector', () => { setMockValues({ config: { host: '' } }); const wrapper = shallow(); - expect(wrapper.find(EuiPage).hasClass('enterpriseSearchOverview')).toBe(true); + expect(wrapper.find(KibanaPageTemplate).hasClass('enterpriseSearchOverview')).toBe(true); expect(wrapper.find(ProductCard)).toHaveLength(2); expect(wrapper.find(SetupGuideCta)).toHaveLength(1); expect(wrapper.find(LicenseCallout)).toHaveLength(0); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx index 06eda4b5daaff..8c7704d0b0f4c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx @@ -45,13 +45,13 @@ export const ProductSelector: React.FC = ({ access }) => { const shouldShowWorkplaceSearchCard = !config.host || hasWorkplaceSearchAccess; return ( - + - + = ({ access }) => { {shouldShowAppSearchCard && ( - + )} {shouldShowWorkplaceSearchCard && ( - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss index 0bd9e55eaf25c..09e640d4de83d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.scss @@ -6,11 +6,7 @@ */ .enterpriseSearchSetupCta { - margin: $euiSize auto $euiSizeXL; - &__image { - display: block; - max-width: 100%; width: $euiSize * 10; margin: 0 auto; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx index f4bf669303226..346477b08dbb9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiText } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle, EuiText, EuiImage } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { EuiPanelTo } from '../../../shared/react_router_helpers'; @@ -26,11 +26,11 @@ export const SetupGuideCta: React.FC = () => ( color="transparent" > - - + +

{PRODUCT_SELECTOR_CALLOUT_HEADING}

- + {i18n.translate('xpack.enterpriseSearch.overview.setupCta.description', { defaultMessage: 'Add search to your app or internal organization with Elastic App Search and Workplace Search. Watch the video to see what you can do when search is made easy.', @@ -38,7 +38,7 @@ export const SetupGuideCta: React.FC = () => (
- +
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss deleted file mode 100644 index 4e97029a52823..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.scss +++ /dev/null @@ -1,41 +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. - */ - -// .enterpriseSearchOverview { -// padding-top: 78px; -// background-image: url('./assets/bg_enterprise_search.png'); -// background-repeat: no-repeat; -// background-size: 670px; -// background-position: center -27px; - -// @include euiBreakpoint('m', 'l', 'xl') { -// padding-top: 158px; -// background-size: 1160px; -// background-position: center -48px; -// } - -// &__header { -// text-align: center; -// margin: auto; -// @include euiBreakpoint('m', 'l', 'xl') { -// margin-bottom: $euiSizeL; -// } -// } - -// // EUI override -// .euiTitle + .euiTitle { -// margin-top: 0; - -// @include euiBreakpoint('m', 'l', 'xl') { -// margin-top: $euiSizeS; -// } -// } - -// .enterpriseSearchOverview__card { -// flex-basis: 50%; -// } -// } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.tsx index b21e46429672a..b1aab0dacabde 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/index.tsx @@ -19,8 +19,6 @@ import { ProductSelector } from './components/product_selector'; import { SetupGuide } from './components/setup_guide'; import { ROOT_PATH, SETUP_GUIDE_PATH } from './routes'; -import './index.scss'; - export const EnterpriseSearch: React.FC = ({ access = {} }) => { const { errorConnecting } = useValues(HttpLogic); const { config } = useValues(KibanaLogic); diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index 1c443f38eb6c5..cf769a2a40fbc 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -8,17 +8,15 @@ import { EuiButton, EuiCard, - EuiFlexGrid, EuiFlexGroup, EuiFlexItem, EuiImage, EuiSpacer, - EuiText, EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useContext } from 'react'; -import styled, { ThemeContext } from 'styled-components'; +import { ThemeContext } from 'styled-components'; import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; import { FleetPanel } from '../../components/app/fleet_panel'; import { ObservabilityHeaderMenu } from '../../components/app/header'; diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx index af1fd454c9f96..b31dd068ebb08 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -124,11 +124,9 @@ const Application = (props: UptimeAppProps) => { className={APP_WRAPPER_CLASS} application={core.application} > -
- - - -
+ + +
From a0128dda4a7b7b0fb4a23379176e4901b44b3406 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 9 Aug 2021 14:08:56 -0400 Subject: [PATCH 20/77] Fix i18n --- .../no_data_card/elastic_agent_card.tsx | 6 ++--- .../no_data_card/elastic_beats_card.tsx | 6 ++--- .../public/no_data_page/no_data_page.tsx | 22 ++++++++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx index c90686507d254..0d26e774ab1b1 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -46,7 +46,7 @@ export const ElasticAgentCard: FunctionComponent = ({ fill={recommended} > {button || - i18n.translate('elasticAgentCard.buttonLabel', { + i18n.translate('kibana-react.noDataPage.elasticAgentCard.buttonLabel', { defaultMessage: 'Find an integration for {solution}', values: { solution }, })} @@ -57,10 +57,10 @@ export const ElasticAgentCard: FunctionComponent = ({ = ({ fill={recommended} > {button || - i18n.translate('elasticBeatsCard.buttonLabel', { + i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { defaultMessage: 'Setup Beats', })} @@ -49,10 +49,10 @@ export const ElasticBeatsCard: FunctionComponent = ({ & { /** @@ -136,7 +139,7 @@ export const NoDataPage: FunctionComponent = ({

{pageTitle || ( @@ -145,13 +148,16 @@ export const NoDataPage: FunctionComponent = ({

- + ), }} @@ -170,13 +176,13 @@ export const NoDataPage: FunctionComponent = ({

From 0f3b96b399df1dd6082ab8aa33c64ac6f2bccbeb Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 9 Aug 2021 15:01:47 -0400 Subject: [PATCH 21/77] Dev docs --- .../assets/kibana_template_no_data_config.png | Bin 0 -> 524230 bytes dev_docs/tutorials/kibana_page_template.mdx | 51 ++++++++++++++++++ .../public/no_data_page/no_data_page.tsx | 16 +++--- 3 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 dev_docs/assets/kibana_template_no_data_config.png diff --git a/dev_docs/assets/kibana_template_no_data_config.png b/dev_docs/assets/kibana_template_no_data_config.png new file mode 100644 index 0000000000000000000000000000000000000000..5e54bfdce1938d39bbfa820ed44a66d5955f09e1 GIT binary patch literal 524230 zcmeEuby!sI_Aez!iGqNj2vQ0NDBU4a($X!RGjw+-N=tW158d6}J-`el9W!*-9nblS zo_qhezw@UQXRW2*kB+z_ zM2gpigoL$VCL$s)DI!84Z);_2W@&_kB=Ide7DHZflgRtlZCvD?)K~AQkwl7Qq>t}R z)1@#JFeNF{JHmYfwbiwJ2t`HF`U8ssU#Z1Va&-6t6fCES4Ijx*b^7A6yZMMu&vEWH zx|pmDpRcW4A zN`F<#ok2ot=lfJHt-(o2_YC;_OK5&FqkBt>#(h7DjU(|2O3e-)UNU^;l2L5adWoI& z({kwN?cwN^Rc~*M+}ay)B1sC&P_YV*gDbcR<9+3_SB#Xl5uY1uZf%Hq{FZ6s8H{M; zSi+Xc^P!1kk2rca+k~oELW9Y8d)>{12B@Wo-ZR)`NvRD;u1RDc^p*dNazsuo3{GYK zDigQDr{~^5Emf}nF2`N%L;d^bg$1e1SOp}W zLKrp_PkX%4tc55ZqC8scKMOK67%Uff%FAvfiN6(i! z->NJ2?J!4+WM`%(kQN=@rOPKJm3@YyEt=9Jb$p>qT-8FFxJ0gT4`hg4k(nMb5PY%% zN<+^T!gzv2@Cnn>hsye1N((WX_rr&n`oj2e7&Ssjw&8umzFD6LU!iq=LY+pTZ)GaM zc!m_v`gR0O*2iuUzXl!XTfg{d1Kneh<_Y?4>nk*2uCF)>6l6UQS^O+1#J?iDh#<>9 zd5lXVoF|V??YlDa(G*t+Ct5gq1elA?gO%((B&?byyMa7`iu=wgZTJlqZL5+RIY)p= z8%`W%KwIga78mN!=ffowXMQbY)%Jizv9o9HxJ}qj?aWJ$9t-8AnZBZmVhr@rPp4Gq z&9#q0t9+*HPcN?gV@sYf*Kq=%#A$y27&Amvam2oYah8BAI8?-Lw02{41K*zJ0;%qi z2eQZ0Ilt#(UhUy;U7tJ+#`qE<**| z3|}2Of;zf8s_E(JyXfKc<%oSTDAOy2=4z>IDxAL`qgIbp%X}P>RFP7VI`P3($W@9q zaK+f~SP3{MUN<|~kfs$&jN*+i4{6~*0F?m)+gZx3oepLol-Xcd4 zfJAZ{uxRMxdM>kS@khb*`7D79;Zf_6uM<6^uSU6YZA1-(2y)DdNYZ-8Uyne4xagF} z`eww*t375i!Zl)ErOXNo%+ipbnUFSrd;F%-kEb9jZ?%B1xKaZ2VY@O**f#X=Z^mxEQG zf}aY$eUb1+dQ65Ru_7KPku>2;A`^QdyN9XR8-qB^fvSYcM2|PsZ{*(STFe^?d`btj zR`pcpRytcsRvncNR2Eb<7<{hOS2I$FmDHKxYSyb^7k~<^rdv3QINl|aaU`?8VTGD} zHC7tlD5IHS0UTOd0Ni#=9rYYRu!J3*LAK<0KD*_CllX-l?VWPi>8zmbi2Z#VHQ30{ zy{^&O@7rpt&fVX39&c2%<;`qXmWQw|xa1sq5C=-t^lQXmN?lVc+q(b7t4$i@z}sJEd9)jt9o~@^!ecn(V&Zx7fREIrzkAPP zUVp9oS+EQFHnAq@<*OkU+2>%QVxm-hU4q*et%B*V(|K)-f0lJvNY+WVWv&@&*}5Mz zt$gQ3wyPT0l(Lbeldk0i>%%i@Ro6C$`cs@-5dt@KwVW3>;XmP*r_1#{$$UtHlo#MO z`zE$?uFs?Qa22qId(e1hbai82d{lPigHs$VL*j=*E?oObq6c3EOVsFj!s=S+)fy@C%N_sm7`zQ&B+iF`L!J7!EmND@`l z&$znK>vqs^n13L^6s+s){=JKGG-ErckhoYAno1sbJC1*Z509wI5|dJ8gsFFFRk?9j z@Bv&PSdoPH7%o)M3;9X{Yv?T|nL#ks*h0^0T0I#lAJ5i4-}znNCJ>_%W7K2E!eg!a zZMUP-wq4#S?m|cvT=P-!hIy%njmv&4KCpL^{F!I&nQ*CqhlhBc#pV$1G;Rj&DaVB+ zpM17LjP6uDox9?)@x@xk;BM8xf^8PG)*YN@o2k# zan4>0{%LtL^IgSed!#nlt`Tqud7doC=e6FpgH1*(!mQKu*m={PxBPm?sJK6;$XScq zCfcTQGhw^3YnuuD)YIlXE4{t)$Nm>c$XX(tQ9prgT~0Bc8wxsKzu8^d_z@lUHY_M5SCGyt|Fq&l6{NdeuU#*9dUmSiMRd5M zz+8R0YBjddbVSJaQjmFo&F#X6xed-+xxbkcWu|Uelz-6*IJjpNy7th zPILh)r4&zpXh)s2uYmOVH5WgbH|OQ|b1qCIEEbW6>(T?@WfU1GW*6qw%apj*?oL8) zp7$XkVg)Klp%ne@G)U%6NWmeZrAkK}652oS z$Re)4KH-S(uRj02qDFi{!a)3mkN7&Lq5OUuvnCDocN^mX@eD~=QAAP_aaA<1H8KL) znOfN|9X84%ZeUtVsM{eS5z+kmB1?Xx-b0K(ZKkAVuO=hSV_*ef(lfNuH)3)ISpOOa ziO-n_(F7RT>rprZEP-}B&is`BdV>ei{&ky~lHy;l*jw;Zs>#Sxh*;SgQE)K5VR}O; zfJH$;!Dnk|%=7WR*gxG7fALeA+S^<6Ff%(jIWal0GFjQ0Fu&#I=4O7w!py?Lhnz8f3SmG9SG9(gloBTM!7W&i}u5OWByykTYI`&Wnm7l?foxW{F~7Kx{IK+02Uwf z9oGb~giYo45sZ9h_Fhg2aYcyPuMg@u;^)=BuZT9PUZPQcKjN7XlH_|~C1>QFIZXG* z$Je*}c;P}1@ZZ(!CZZ__*EU4A=Q~?FAAvQ}bCg@F#%8fD#+wVj3Ih1C9z$*}K%XiL zF=928fcxIoJv3;mU;KIfwS?}k++It^89A2sKA$mkiUc1a^YR`h@4ByZzqNN-xICX? zU=J#x@J2$p|3ChDsE2ZVzeaSLOpoh--U%^7j5ot#%oGTZ`oHRR-(NIMr_r^HXPLFy zj=f~h&mL1Ou0?)D|F2fM^pIka=z+t~xBrHii;CXf ziE@;r|6}U^+J?V~x3?zO1ozATh7#U#$S6R8Z>IkZ9Vi|?Ky+G?Ur+k4C?Rm~e$6>` z2J(Niy#LRr-z5Hj$Eb(wC^8X|Sq_ORV{9~{KYtRu*L`35pOSWSKPo1sFE3KmmXA~Q z!E-L^mj?$|+`$~b7xRxS{}O`-I4X~XkdV}zLzoIipEd;?*T}O z5c_CfOnUGaLC`2Q(IDUs8$Hpa%$N;Ry*di}FX~ZbpzY8DUj|_rt>#ZYV&_2ri}FHj_d6y) z%uW@J(m>N>T1Ha#6P^{S9BjkQR=|PIN$kguu0x~Q69r&9J`;9Qgl!gW*VYgITSVjy zP&lF1jT_imM*T5TW_e8`Mt{wXpwzpUX~mpJ4&r&|;eeSkxp&~V{C`nc9s`ZZYF4so z;dl$n50HXJYVQVEHz|XkJs;NQ3#0VmA+vtUe(->V%i0@=4%9rfb5}r`6A@gvoYu%&78KzxLhVGI>7;shGE|ZAkKuZe(bEvhLTh z^*Xiis|#$l)O{g^XN9{pEy0s(6vfH63vLjZgCv*)1$DD! z6JM~JG%6?%RQ<(qZy`qfMZatfd)C^=e=U|$$s0`e$kpHp(cSihIeH%O;2@Ni;N^9-yYk$aGdwvSz4asylN5FACdQwz+ZF_r=G*@^1ajRhnpyGkGJ}RVsB#?#v@eh`FXTA z{T*&2BF5|p*}vt&GzwuwAl_awKOPDG!)E!{Ss&>SRbY`$f)D~_<+&~C7MXT{V#;-) zLoxfbBacN>62Av@y)jG@PP-2itMvsc<}}ieXAkeWJj4Cp^y@5*j%WAj53xUrN|Au( zJoiY(DX8?1XW_5;$-dsx)+xvH1xc5t+f-jtLFJ205D#zd=>?PRLOAdRc9l!0vLCQK zW+$98cJ}~E_}@`R9n{V|8xLII_J# z(`o&1YDbS29^lW+mqsT^F36{?$bZxE;W>)?$m8?VuaEvLiQ*v)r2+o+gtzDHkARwg zTnxKz(p=pFoH$noLWZZB%mmrPvex8G^M7#j;JQ|dCmND?xg}&)V*}~OgyaeoV`aSr z6`Q!j$v4v3X9e<6fuyF10>?&X;G#n8Let$xk{i=)t|`&cj6p=q(WM6P=zM?3&JZkI z)6=sF%6TGQX7yb*UKdX8z9n!aIanmTo`u@M9+G}jb0;8WG0Z%!>&C$i#F zQ;00F3Y+y#`~uNQJ?8}JYw8%s>|8g~*siIiU{`D^Z;mbTf+hU?#a>`m&yYc0R2RlW z3<5m$DTyxv<~0Glv2K=^FpJE|>I;chPOorQ?!7C9`C?E?Uq>?kG|1aH3L%-)dr{Fi8bZ0Me z(S24jsUrn9nA^WRAYvRdyd70Ei|M#2H{JiJ-smb*7*F;_DGF7_(_p~kRKs&NhiB0B z8n?GcO%eV$`W|!(5tDSFW52~V{FdnrDQPm+7*mKvW4SU1fFhU&<{#UPM~fM?$cTvL zgst>eEi}=X1j(v8FW2$&e2f@}NX}n~uk36>u^{)#+lzj3*dFnhIe<>FY+H|>78z{4 zv)*3X$Ll+@!K?W??s{xfcv=6EIO(b~jqEo!Z3+>LGhlDkYCAtkO=4h-4!CXjP(|K@xBLn! zN9KTBtK3I{4I>%96)|}OP!#x*?6&8ohGle%xVjKgn=9L?7z`+St%wQ&R3`MvreMkLILs&t`x+39dh%V zS(-;^U9~-->%IJNP<=CR)0?gi2%lDoU{2Ap$fl!NBuYrdcKu`BzIq}AIPk`;hwv}| z5^<0rH0_ADX0#iZ7 zZ4V*4T;|~hu+*jV*J)>@M4bWkP zX>fjv1k-9g)gy?EX`U!w|6sJ!pW64GAg6D)V2M$I#5$349k4lC8o3j9K~8tY17T1H zK`g7t?5Ep*8lM<%wM60U)CXdU^jTJh{uVIl7$ao~ep3fC}Jms*As-E{$4JGTxeCY$J z<#pKk6!Mk^0pSLnk40BD$8%OYzVUI}Z-kqY+>DL2EWEeom3%BX%2`wA#9Z%{TA-#^ z>wjT;6jH3hsChmIknAN<-&^V~I$_kT3KvGj&={_^oT21(6zk%IYoQhxW;txD*j_t; z)fhi~80xJrUsoDS(EjaN2p!$`zi<#g(&DDN!zmf!LLz`5qU&y~>X{#ovLG|7!&94y z+(#@%2jfL+q_&6+I42jZti7`?$aU(09O2ptMA9i?#1^L~vo>zlc|L$2~YMHD&P zG0ZNH5IA0}XQqBk6BL{93DRr(5p#c^rK4epgl7ePlsRee>`-@gySSMSTtv&c5!8uj z4xxb(R9$B&6+Z))GH7hKl+K!4l{bYzW;vvlz{$2PkIgco*#8vr?WE@C^3O~Fgkx&lfV-Q9lM_6@>e_G+=rcCz z{~Bhrl#vw?Nx+RP@216f=gj$F`5!olr>$r6|2{apy{(Xk%_Nh>xkP{$s}l-T@P~ut z8+A+wJVVXEpt&}XxSP;5!3s4#RaMPqP#!i(y)KMC9sRVB#C>QKnD=E}%aUsSaaJ;q zLsX;Nsk&|%99$83l@FE~5<$`N(%TkC;HDJsFzi)iI!xTvh2~m;C~XxBU5!o{WSBYj zD$*qXn6HT^EWsOMDpQs~?x@XzN7#RHos%Up{$w*8pNdS;V6I3J)hZ<6r4+);vUQ)t zgPwdokffGYm<6dOP_qMHOZLhXNc9i%zEGdRDA0}Z(E#IIau2@8#@%>RKvX z@IhsYinoUkGrtNi)V!AaCibCa5OR#>$|#F5^~XBAV|bX4m%s)+X+ahIer-HEO04VN zX;Ct0x1s@qwPL_yPmFoSiFGdwrr!Z^pK?TL0&ikEI@xV;_oaK)x$~CzB2xlceHy-$ zzAf^&KyljtNn?BEeC{0qQef21+w@M&>S=jX`%OAVvPYcgJ;9`H!CP{pR7rRum0) zvjLBV%4`~$59V6HOaz|O`&`K;t}v4!TrIj5G;Gif)hvpab;zKadC^U*MJ>&BNnnaa%PlGPU4-DqV8 zU@`{7-tyAAn2pk9g^l}FlS$qBoP{kj5B+VbXUO|rSmITIx`=#I6f!ajHW zO)ut*=QKaz6LL+ty6WKQiYZ*0LeT<-JxBP_Bks~0u%`jqSczVcPsH@G@L~UJU0T7* z21o#g&k=#N=Jmb2TRl9M&4oZu^)2RJWm>|5W;BO6@K3pxK~{=2klb9cK=Givi1FZs zxR4S1acq6I-7#@YbCAw@O@P-DR-@UO)tCV>yqR#s?rJ$BZ?iAvvg;-n3J06q3|2CZ z4}9i#={qc1k1h-*bqUxQE=`^;$}QCKyNN%)c$z)284;LJN_J<2(@5{V+ZT>RpG=86 zihITyoqdH{JrkQb2~BandaGEUun>DtYN>6kRzKFEp7SJULapvh#N9 zhb&nhOrLb3nuGZ9<35br^O2cM*#fYA3!v3E4Am8o#rYxu707dQal9>MaM)SY(7@-> zcjvxMVEM>5z;g*7YN6dR-v=duQLSN5aH^+5Bavw+PqYws{k9K!Qh9Fam1kI>!x+Dg zeUzD4(AI*CI&k#EkA}Z6r@Yo;u6!Y#^T8wM#(x!{+O!%(0YF07P4$msLM8FtxR!!Z%jqxVrp-Z{3qh}n2fla`+KFuXXU`z>u$cB_Ck8&YobV?XUN z*JC=TTtV3(Ki|d_vvJ+%ym51JkKPvYa^URBS#mLF$mJ#Dxi zddBSpPXbp}I#3~3FYXoy5<-1gNJx%Y#0)8Xb_r)!C!#A>Gp$*z9 z#X1a*de7W0q}P=ZC_~1jDk6i6bca;%Mi_*jbjY>-ILB_i!RYhi+K`9b^TeZtA>&Hp zxhgwZejdw>hw&W8qT8g&&xeAh!qb(Jww5rba40n-2Xyqe*~1}_FI zCrscU=#UsPDD7c+b5z7wkMlyELnK!`_mT$q$qyq@kKN1m99!yLrRguv_K~Y;f{4@v zONNhC|`Hb7fVu+Z$0 z88gP?dAscvJ_MjjoDXtYBmW`P_VwiWp>;Wp^ZVan6my-ld~!C2H{(G9K>Cu#+g22p z+v_r`^LuuLr%-;4FE}L6>?N4u?6%%sP$~=;O7+gz9l-1D3XTJB>fo~$nP%hJQ}EB& z#4gE!$_&=p_6p3~mD=uF4U<(RB|@Rk`@bXX`~^B!6H1mDfcb=$ znmW$x?Y5MHLi#g)S7}H1EMsl$YR;!)oSI~=?=Q9M?PE9q5RC;PJ`S zLS+Zw#H%5$SZ&pB@hGav_PvArdQJNpC!I9w9(*x&T2n>Z>r=7U)J#mWh`{;#gskij z?O#F=5GDJ#rdBuL0a*kL;#8CUrUY{M^|y%nYo_HRLY4fULt(#fO{gH7RK9h~m%h}1 z1?pe8H(+WrYV0f&SPs33HF+g#;*)qhd#jQ2gll8g+r+A*o2WM|0ri)M#7efQ2;A+R zZRI4Z?gO=P`XSmSR;A$hYwy4|=6oU7{#BurJ0)zEN#F*3zonq?1!N`KTRDDbE? z2{d%_agnRuD>>$ixFMaYuH@s{iU@y@cP9PKz0Rz7huc|eD1k)%;>47S*a=8y6QVET z_RG(HNsnV9w>Ej;{KNST#9##r&XWs&|AHyAD?Y2VXla zBrOlJlJ7Xz8?URW{Yfk2KKIG@95KWgr8 zE6>ck?FuT_JxJC#SW9fC!QHahKRyWhvN2Vp&QO24!`M7-xoJkfq&>Snh7|_(t1|Xv ze98&5<<&vebXs8Vo6T;`y`bHjsxS)#g)~ukZ5KLe4_99AX#yiUI?6bOwRne$O)m#& zGpmfGvLQ?+EwDpo6?H|tj*ci9$kx;d-)MMJ6YYKbJh-=JN!N)34k?>Z1*xW}l*$zH z`BC|>c0I;|bz_C)4D=Xkx4P1+$a33=S1>qqsW!@1qs`+KfxH$Xv@57bIlIs%DmAby zIjp#U7Y(?dD5R|G-*mu;5az0*n2Zf3E!Xao^-Efzf@+P%kkmVKH{II8|G(Ta4)BdV6JZ~E+aaqwPvZ3jFSyT-3WJAJ*~|mp*T`ZZJabg4y!EQb zkBVpU1R7;hAT(xR7uL6*(b9j<(Tap2?12S6jf<{iE2m;s#mYMh#)r(q){x?xhS4kQ zs8o6f|GX6r&-YG>q&D$<*nu<2A!K&N>@Q2N-9uw4lFt0E zCtz>G7h@nk0x8a+>6A}#GX|5dV?fo?hscv22A)sG?8{8<@mMK_*P+X|1~$u{OwHomv@C#nLaYy;Eb|-{U{;tp6i$CB1^Q%)B2W^R33riW-B^aG zo#JPhYqjJ00OyEo3Xf5f$5an{NPd-expDH&bgh(XVJAuO81rGgdt#-jJVGysvKRIe zVY!RhR$A;9Dk|S(pKfu^1qKCWDYSq2xbSEQ!BcL8*Tew;t#c{5cez?_*d+H0o=@bz z%30rY${X_5R1S8y0&Ce-R#-r09q87BE%b!b9d?(0lGavv>CHRO)>}0nUmf%_6BOF# zMxX7Z;vNeaG&pd(uY5Ii(@r`a)odwrIb6#gTl$>(sFIoE#I=5MUgv1O!GxYZg+-9} z^&QrwzOQtQ$U11D8r)^W%zt?E^KVvcdc~NHo76Ck7FDbpcea=I!=vrc-MF%6F$wbX%FCD%ARp-moI+s+8Ci#;Bi3leRn- zDM|d=o*E=z;pYsv_>j0hK$uh``nQ9nEx&^;H{OOXkezm88B%IMLRW9NUUd{`#Hbqc zXtdl_lVV(zN&6}t5|xFDuCvU}wq|9`Fj8u9$qo{Xq*kmHCYAx`hphi35dek0iCgE+ zXI(T7V1;c@n7c(X#JfR&-G9Z$&+g@42#2=$$9bn333Wm?AL@%|qy#t^0sT_5#6}DSBD!*rV{W?NU`uq&xS8u<; zZN_a{;!#zu9M2ib1W}3sv443#Ztc%%~ za&g<5O_rYt+s4;J2ndXFF^4-l*(Y*7nr6dr?6+pOuxgYi)r!~Q^Ws z_T`luY?-QYZka)K=4tZnAtxEi3lloA{Mo(>eaax1c9HnH#}Oi`U)i`+4c)<_c+Q_d zB^Ar)G?$1#kj7hnFN#uM3|nVxQy1LD4fP)8Zf%FY!HHMA3kf*96EZP>`X)`cc9RWe z#=-Ar<&&oL*l@f}n1I}EBH?;TfSh&oo^6wasYShutlSniM}6Sj)Br$*raD-epo^u&orZP=4)vlbm{EMOZ_@!?zXLCJ$>{jm`8%YbM73}sC_m-Xa$k&vPfk+k1z z%8X7Qou5yf8eQHzvsjoA2S#cZ*SxvZD|tCAphGR_Tx%IP{pm8d&*sAOWDDo?5X`z@ z2xjJ&dV`#nkJELihO2G#oIWO&=#pHb{IaASAWCCmxV+?NYt}y%@lf#u1{)WT>D?3| z@1JQyb+juEd)qsgX)`RYwNxe8uv$McKXOyJQfifxxB}Qfkx9|Z3w&oj&(v1#J6jV# z{$14AoM4XeNo197K;2m>_=FW+~2}@bu<9MKZeX(6ZyR0b5f@$f7 zX|y;BkGzBENIqMSao`}}bynY{s>q}Eq+*$Z2cO1H2^ z$ng`aY~RM^6KqA4*Jsx04F2ophAKw_)8nzg8*`BR@g$K&HS40|n)J7Uc;1El2kU$) z&B-qPj0w>U?V5B}_l8B@a(7t$to`nk^2KrefNPUoPCV_T zG$u$&IYhI<^o0nzuE}w9qT4%x3+L~Z@GB{=P$QGa%_>WW@;vjFLGH=TQG@P5 zPOkpuDF7t9Qp*iCITg<5C6=^ocn7(2&3y8k;JKUowgSJy#A!wMr=#2XKm{|coWn4m znrY?5BM*6#@WFXF;9^YZBCMjSDf^{EC|G?-Rs^^#Q`LEcUskToR&3D%fG_*e6fJ!w zkwXAMFUA>ag4?T7!cUi8g3l-ofb?#+V7Qf=N+^_TX?JRT`_eH6OgnG3i*-@Dq4X^{ zp^R-~8RYs2VK*xdR8{oay-|Vf%#z`cV%dmrt7S9~YoD`d+Y zDizg>Af|9n{+yeF+>69!1V}2%DY^$eBHlG8ur4P~20C=)*28lCMECB$uMtufGG*m!XKJg*}6?2&^+LBHb2<$#_eO#HRqiD zk4!c?Q111&_?W{M;oagq9!FDVRUPgg9w4}gKcbYU^5gYYO9sjQ+lkLTGBJMydE__i-kIy zT!#u-nS8}pN&AnQ>{9ac5q|Y?4W7W6JbgY>ZuAO1K7N6BrX8u~-_EeP#xJyD?%I%q zcjpN*pu}rVX~yzck5mH7mz68{9}@HKWhvU2-=64Of!8;Qk1ILFuYU-RNAfU#BqK_6 zm;U(CAfDBvDKFzR)6QuEAwaP99IJu@2h+|nNiX$Rw;Bzj?%&i6mlwLFme0h1*D)XR zpyvy>QOwN(pDJh0i*@T@cx%1ttf1b#9AXSRQ;E=T8{Uaz!55o}0oP5_mqij07Ij_q zpCNpBaB!6$6j~X;u<ire`UCsp~eJZOh+Xqf@4=X^Z7%ucClxGBu>sa5niAH$&8x8A@t-KtB> zqta~p8W&kQ-fs7v!|9HfC}d2q-(d+v5-+R<`?mu;>`C#u2c zEMtW0Ie7@g3AN}nyX3+xWVe_a$iF{D&8?omX+_)HOHBWAIPumeiN~SO9F9}7d6cUm zJOp7GkS3okP*=2w4P_m%x`(jFsa~ZYPGFE-7@KYX;DT+4Llen*@8R;%?6koT#2I@$ zbv*d3FQ(F>IVzdgsWt%(-x|9^P3}{`fW3CNgT^ClPsf4;!4j;;gUwK7qcLgaEvij|^C42+0X=qACR# zjYkf}Ut3x97QEYglGj@%OO2T** z&*zaH?!y5#R;fA9^qFh43pGXLYQ6R^Jx6)WwO@z_`0dCB{**Tfg3v~x5G)-+D{vE)x5hDC z>2{niSGbpG(S9CHH{3{p2-Ppua%ZGiv@kwaj7ni;1=(K?1$pWwqC-`hF1#zGC66wj zSmDNJOeFT50~~7@4&`mK#-q$@V6h^KnFi(srZs@B+2PfRb2Bsg&G|}DC8oYMxD=$N zM_<305e@Oht)}VV40ma6q%~BGnngeP)E)2gg_u!8U+{QaA;(q596D|Ov=0kN`aw!g zigi4vsytgB;N?lGd~KvS^OJEg8^+Jj$bC6Nj|CcF=I|Kk>3NuZqS)_` z21Tirs<=z+wK4y)AUtt&qU2szrSur%J84NOzPygFUtYb@5wo`04O+>VZ+x#Cx6R@- ze`$MhWM**qaT3dBg$FaPPD);NK>{<+7umci^z;SS8@jI<7n`oK3$&OEdA^d78?j{2H5>iJthZ0Fmk8 zu7tJv1sI*bWH?g#gVZMeh14drUZLJCK0|uZL6P6G#oKe$SJ{!h%xwJjHKLsB{#HIB zd?Vi#c9}OYslG^iT@AuZ-Ut3P2-Dz>MC1~BD)|#s-DTuvhgPK4hCD%Sn-Z|)$xm19 z1cswO%aVdstfg4WU0-w5k_-k|K=C(-)!)K^=9+bctC|?aIrn$Ld?Wof56b&=8 zE|L3LspbOTUFij-HpSy&Udn4y67st&K?uq)|0S;lmh>=1B3aE?lJ9y&!i`qW+6#LP zSzJdK6&ld1vo*Qq@3UPG&{R~^2f_B4RY8P?tcvmZjn$nGY8n42u&AbeR4RiC{EgeA zyME~2r0`k9U%~t;r(V;8q#de=lnaK|hP|7h4${xv0Lg+fpe&gVgy;Do?n_Dq%1p&- zZ5bVC`rar9jaZlV!uy1m9O2P3mn((E95pBR>RAdjAn*;PmH;W1w`hh|1kkIs31QvC#%?Idf7n$oxu930sfSRN9bS03Os0tJegv- zao&M{-cJ=J`!THAdo0R%2se&!5g-5ODhWY2Xmbm|b8Q;%09Ke-+3r8-7*9vbpjp(Q zpJuaw9dJ-X zoC2k#r7W%!WGcEev{z^FdiWAISn^M0A*Is41mI}wPrd8INfeD2ma`MYg>NQvN8!<> zJ7ynD8gH^q(-VbaBniA24d9nW=lI2!N13w$=nHH+s|89#|2i4C`8P+N2B>P3k zlaypnuM!W)l6cpC@dCSgv-T$fqI|Om&`^fLz03-qaqDn2hQbdkwV;*X8je2cZWE6! zro#pKnnDXrZ{Hk-9BnG<=9@aTK>ToPHkr|qQPsygP9k*WKY5N0*+u(8>l_ln-tpR> zhXsZfKET~|O2YEXdE3L0>g66D`r`BzgP zd5@8a>fx*dMB=>^#k@Fy-ttDpwmb|{qW2?j{sc@~y#=Wb%RJrzCZ8T{vLZ6`=h2~h zD?PlK3hip3K?G{(1M7Mr@`Y}LlWRdtg@wmtyiUCd?DNetlNDx)o1;GxcQ}OW5a^_4 z$YC|w?|n}Cgb@S`F}l7u&^0w5N%Mg^tV@939+GvTX!?W?hU)_K;U`*Jx_+FgmsAAgfN?GkmreCl(9tpLXI-1Ic z9pZFzqw1hyXm7LIrFV;t>#NrHLr)yCNFH1!?3`Rc%j=SXABdr^yr-Y3dY+n;7+-gc$rPs5F1-XbUuB64iSwG3kvj3)XDk+yt8&Ga#3{%;7XrF@b`U&?dnXH``7^zm*_nm8moP)85`* z1g_w$b7xDca)iZx)W~PnV}4EgtPWmhk!2KQJS8@FnSvRY%t!tP@$WL?&u?LzH7A8< zD~jCKd*R2>8>yU%hU+R#8rtlpO0(g4k1|`MFO~C^7Q`eYx3(5@nrD)Ja-0kHKd5Qg ztLh^^p#U#3&W1**WFF>Q;#>|!m8E(#jZNkhv2hS~1}xY{fjb)UVo;E)t*((D*0P!Y}A@5Cz^-M|ek4OmIeG?I<9b*Oc_< z`ss#NhpRIi)!RDT#&Z(DTwPXWNS^eZsq^pCT94@dDk3PTi0?L)@GM(2awv1 zcapS~F*~mna2j45sWJ@6m^SG_YcK|I98YHh)WU`y#%ebL;Ly{RQpsD`6q81(b7G49 zl*KK>ChfL@0wIT6f`Szy%_0&oPhT;E+$NElp|ooPqP1bMXsditTiGr9xOYzOTFQ~k z+DmR?=A1@bqjy^lN+UxW+bF&bCGK&}i|X_6I#UW=iS}sa3pWs%Dy7Rl zMR>Y}+3@)74D~zT;Nkr|p$csI<+>asNGJ_BtV6M_dF_Txi%YLrNGp=u=d;lW4t1rHOZJfS9zGJ>5TF+FK@(A zsjRGgwF0xXl6^8AQUL@gPmQ6IhL1n|q@eJ9a=x4gVq*tn6!fBG9!87Nh{qa+Q5Pww zA2V$u9jd-T=Hyq&iJG+FaCvP(_xg1ieIFqaQNpGw?}wlm#!TVsvg90D;{FDg-Dq|; zFGSf1PTTa?7uv>!yU^LeiF*mUnlcDzWbQZj(jDgrHSotS-g9H8tGUnP?;i z>>9I|7YoWkhk~GlR%pFd>N6JMz7<-TOoTjIK)FU8ij+Yr{cwIaM1lMrecR|BZh^^` z8i$jLLn{kF1GAbW6je^jrWTcdQcnQXIjExkddCF^Hjdr7HXIv%OHSFD$x z?PB;$FjB5B68gqnEUAlm+f9co%0MM~;OSDq6H=@Szt1TzIFm(JxD~_c78<;`K8>&g zV|Q_$yQ)C#ES|iOJJMc@-6emu2}|%de6KEkxN`1Q6n>r>Gsvayl<2yIr zC<32!CehCmS|+Ia{Cs;WEex;IM}gRSJg5p)k$|X)91FGBgOBx$_FJB+Wp*xIc!yXa zbk=gXkJG1`pp3s>2nYvjTsX>=o&@kfvy-=&d6T7mk4;n-M}dk8w@X+xj5-a{&q;6X+?@Y266oMDlIfF*@VGx9{Hsil z%M+DcM3MTix?-Hld;FsCM3dFRz%CQ3VdzQ7MpXWM3^MA4B$z3=5oQai0?xUf8(%)C z256)-ORdWSA$+M(QAu|9U~5Bey0WPP0QP;t;DeoRZsojnflC+3UUl^fXT<*i^xecN zf8RTCyF)-_{`QlPsk~e)0=w50(|5Txm^}Gd?ZQOLH_mx>;*9yf*n9JEDBC`6{7#`L z+E64)2%)SYOB>l^>}y$)Wri?hCrKp|A^X1XV;S2ZWe-`#GBbve!%M-NgvUu^(4r3 z_RVsufG}l&ljOcG@}+NxWRO&4;@Y#SQ;>po%l zq&pf%I}|gykd|#uf_>`97FsN`9GGurculEJOkItYckev(fZ=rLZ?e8Y5#zuNgXYm55`Z}3&b57Ho z1v%!#W1Z0tBOjq6`AKiJ89K1Ky$qPS<#l&wos!&hqZ#Bqwsy~f9lSk#+Y7|&N_6oW zOU;@}J7>E2gn(D_sK%MswF`z93|Cdm7oS}1H(W62@TA0)zEFdD5VUn;lsr1p^Ewlt zS%iV(N0cz7_du1O#se7hzLxKOIP|y_fDMh&ysr`2ahi*}^%GK^)h^`t2^^@J_Q(dK z%Zstp?IOo_9kA+1km@3&D@%Qz7>c5L-Slkj#lX`$3E`9l<@@>mp|4DDH#dt)&5R&P-7boqiR!gpN zd%ik;yvta0JL8DZO9bUCi{hFX+u@5%6|SJWoxavB~1 zH9C>bpoSh3s{J)w<8>HMN_ZRzdV)b)v7~v*b4A>D@)B1l)Q7aXzk*VzBS-pV=2gp8 z@9B^9!(ph`52xpxmX`E((S7L!@J$YGmQcL-d^w!e5s21j*AQIRtWV||o|O?$)9esQ z;JJfRh$jk>>UZfvi{v_o0js%J0k-d5)5@~V!R&Yw0u}GQDcxhX2HF_n*CkxX?@m@tCUjhH6+!-M9lWmK;^p%^X zd+)N_7DwL`!16jBok!bxwnpX=&27d~*@R(c=y*tDiVvcQw`?77qA#*{@7ku#te2 zkawOaI9gp*qFdK;rWB>2*$3757PBqWV%G%hj8Ma_lhPJIG6qu9O<-q{PZh_(>_VxT zPS#PSuYUZkJ*7fupxUJ53WWKZhf5o+kn6nX79H`fsN*;*7ilqz;g4SSD8`9yr8{NT z#hLq&zJ}f=wb`BhBRTIfLUvOV1zocx{gc!_REY{NZ_O<`(8QGOvA) zm*BpBUE!fswT?XtsmIFkOjn&?jxO#jKs;imbz#fZp2rh00c_TZI_AbOYz&ZUrtsBvngEWPf6$7O-diI zP$l)|dh0Uv-WvEEc+!Eg#s*!Q)=3ic#`p_)W7OkgG5rJ-vWu>4TB`sG-7e1*x^rXo zaqUL5a(R1fyX*D0#{g>F(f#P|J>e*!cOadat?tfaks$R@pZtwNCHpX-idbU(D44w>5Semmh%Pt#F zROj-b9U{zFhQW1cTzy3cO1+-pQn_9zgj6-7@=n!ia46`_>g(&@k(tSZLBsnA8vz;M zG9T7(s|Gl%DA^#d^K&2gSXYd1Y$tNg$gX6+@bePf$M)7CY>8w1e6MMbO=PiqFd909 z>l1TNq*+?d3yWRfQHqjuXS?3)4nl(E3+;enai|7RtO#8!aO(I=TY(zE_2|u47e<_D z?X4$o7q^1PCnoeG2FoqI!Nz6=?&{sA<$!Zn#{J$~w!^i=ZEtJI9dc^Jv%q127`C#T z-Dg4hYMCy^U`M7hud41_3laSgkG0KRVORmqL4h1X1wYAY;zeCSLBG?U9ycv2%%cM= zr-2mUGs>&;VXNg{3@wCpJM>vD`HcOw`gAyO7^fkZ?x0NaZBXUd5{!o%sHMv;GR|_D z5^Nvn=*x4_;~(_qW6lNgQ2`7lx_ci0b8>Q5k~N90p2Yh#+LxB$^wq|eNc5aoLd4V@ z9(xjBEU~&aW&s~aO2n3=H8D+&m9MV3ufVS)6nYPS&5>k3Sn&s&2qmQH&=(Zj2DpQ- zfU<9j1`_;%JfvY>gba^I~9F53F(n(r6}Ota(`IeWxmD!iroN2Bw~DkMh9g z6^*n@dg=C{FsC*j=J3v)sb^(&B=xT7zB|!Krnt0p#mPRIe|T2if$vqlj`wB1a|Wea zBK7^{;8@z-5_NZ;H`DP)+K%F=d@@;(K6aBGUg*O2L)+;-q~=C8Zd@o*J82QB<0V?)lN+wlytiDehP`y5+R2THGn428<(EE+1dOyn&lr`Put-(s) zxn*JGv>jAZ*i@dgWC_VgU%+wSFWJkWy->mQuqX8?8CW0CO>9mTcK^-mgR4em^C@DZ zchsXRg**~#2*^h{JQqVw_UC8rUqFF$AX}+(GV7J*T>;3;#y+Qw4d@sS*ashTbFDns z7Z8ao$rz9U5~o3JOH_4gNt|rZp(;@jS1gYNf?qN|1EJNg=A)<{v%&&WgMAc%ZNf}S z?>@;B>UEe&McjR?+U_73mEGHxGiv?EJW!^oUmaKXIUX!MfM2e;)8^`~Wbd$xa92_iJll#4bxcqnAS6t)nSQuNj&2j_9i9=%z-IUm=Av-lsFchE5bk|!&$lEf zKyE64s^&Mt{#M`qY;T{XpH$(@+0~Kpgv@<`fsfFeOUbQyp2gxPG7DGYG*}#Zb9;Cp zF}~#HNkPkDzdR+uzQp)^)%&(J+1SW~NBA18Xf2m(ecCqT$~3h+jm%iyDz=Y{O!t@- zm8v5eXyC&@u^yL5c}HSFZhkP;n;L$S>fwu_@1x){p5Wz6aD(xQ!17DUIElFn0UwQ+ z`+JKF!=hKK;@2eFM3&8GHHTfW1&YHBpADH2 zpWMG=b=Sh>Dy~9aoPhL_jv;r6<4Pm74^&FL0ZR_26Twl>S2p~*-fb8FS@3)O&Zr;z z7Q@}kev@_&08)&YYXVs1BcCgf-h_#dcDf7{qjzrH_|E+cH?+o%mhWT1FxuDVIzR%I%%fhO9}A6ppL&NosYK$3d8D4Rh4*rDLI$vv);UH! zu;BeRXp_TcW}H$aUzLQV8UR7w=Ci8rActJi{Ju|@LBrKJqp$8vfbF9E0NZ02ah^Nb zo+#JOb(pJfon1)y z58hCF9Kk{=e=+M0r*WUrjDPCfs2gbUVSRU)t~1w+mW^?JN9}HAXBMCj$cmEqa!=wWUO8|1#DoIz1gyZX-2PYn8c z;srQ$cUS(5iz4o*qV2#n$ugCfIy{R#BE`ufHiPvu|J?0^MH`8#`OpV6EPw}D?%bRA zvX3f{K4K|g@=690s~vgx`3cB4@(y|fN+3tE?tazO^<`v&aG{jUz9~KC9Yp%i{_bmN zTr+DVyhCLHC+n9!FMwY(!jo4T0&cma)zPiBuSHqXr&<2g~XJ$PN zw89C5h($g9V)}2(W-Vn;kNXXDIo@Ici-4IotBp{y_)~TE$|V`X3wnyp6Z+(s&Gc79Wq+}Accg4!5fIkWGUw1@MSu6?inK)x|I z(9Gz;OrZY`Rsj%Fbw;i}Utkzqz_9acHVzl%R>Vu{pNXwQwP~e$XLs-2`I`60dk6Gi z?SL$-VrRhUEUZp66Y0C5cNqfBy!c;#hxqKH2d8>*nu@BbW#v=O>4EfYFCILg05}LO zHT&)Z4rb}e$v(8kR1^a&ZitE0GMpSAZvku~KAFeT-x2%|3JAp>4CdljAMk(P8XYX+ zt27>L_||OVPeY~V4X&DHi##U1{^p#L~RJ^YVd z;v@2<|M>FD!vFpmd;Ni}>wJ=v((h1W*9bs!PnPcQH_D&P`!A!ukoaFl{Us{@FKbjF z>17}dttI)xZkROg@d@6up((Nq27%gjCen(J!DsWC#Utml`P1y%#d>%z6dQEu z8^<#-F)4f3-s9s9>&*;GPfJUyQoCMv>geMqPhQ9eGb>%W@&E|#M*{ZNqaxR;9Vf0I z>Gz+M&e}E$kjc!+UN%MeH}PnTH?QX&AG@8{51yDTu+})TeeUT_Z9XF?D0_P2*fr#y zu<-CSx8*x~hI5))y8qdz`P8>8@C_xK_&f=_^DhLoHFskEwBS{28 z)ylVTYv?uCx4z*Bef5f+RkD=6t5t&U2PXXArQJ6c*lWc@P|M@36SV0`pPjW#ZjJ$^ z?eKw-WBtYUBeftUC8Y*QDz%d*{a(E~HjPEt-dF3?{{>#AXx{qN#iTV`5moD`Tt-yK z?Y#yAXmz7jO8XePkkN}BaLeYtzxtUj-?T7c!+S9Q1Bzoyt!+w0ruCWOYGqJ)uwR_=42Bf8;_v0ER5;Q>%j zz{YB0BZdQ+_9XsWfBfTkJ54<~t$l;L;5T&*atpjuX`){Dy8#Gvd2`!~USw`=rpL)R_0LR-k5p=*MAi3JwA1U%hd+b`#@jVlA&s-jrHvRYGJA zZs}Se`fQMjkgmS^-s+yGvH6(=?or0^;cVJn@Tgj7wW%cH(SgX<^uvO|%;LmcglzE4 zm3r`M0%B<#)TMXApNbfDuj##0Yg=1nrq62Jc5w{~8nN%_<_fp$OLxMIepmC>TvS+8 zlzslzRG|69`fNdYzwGAy7aL<8@H|4I^oH-sf@@`2r|Bl3smonYbbcyUe^6LbAQ`R! zLPf5$-!g)MHihgBD>D|P#Z{P_nH0(OmFWL4sw7-hRncs`-*BkKR2i{xxlyp zAN3ekTj2cd52Oh3Pv(U{zNC9C#b9NL6{o9@zP^GLlPan-QfkWzCSpC@QzzVRc{sUk`W{k@$kLSr`=DUla)S>jcuIf9GzqW1q1_4 z$Zov(&a1X_Gw|C25)OU!HHN)TY?ai*oChQ5QqJwYp;7#{;KJ!+jia%8=GTsJq#R-p zH7m^0IHzH5f7dLSiuO>SUeT>LkAhCCx;rsNmbb&|rK}=_-^IsE2*dGM1PP&Tfr@tO z^t>~VAYEFGa{5Ln&pkDlOOwEfATL*>3(&ggDZ#O+gY7dhzsQ!)ZKWsY_@pQ8HH>0C znEL20I4h&K?H<)Y22x>g%vX22ft+&Bh z0INcQ+OXF8UF7_w$$Cr^Oek7*fqNE{n5GzhX}Yi2e+5WyVK!Kn_AoW|UMtgrWWSv3 zh*6g1o2vk9sc5VC-1WhRm|C5Hl`7YTNooE&QVB#eHI+rGUGSs+nqS*&{(YgPk3Kk+59)=0A;4nYvIDJ6o%qK7-k zqBE?lp8z>5I(#>Zu>=4GwsBzM6P914H9Mp)h5bA*Z0n%R&3`M zsI{c*@sDWM7Oa%VVvT8~ruB=@j7BoRi`TCMIg+Yn zm&WSCC-Bu^pOp@U`}SP6h|%>nxTGh8CFKkrsuKf={yvk|D$w~O0>@K)U4Ij@G zNRdO1n8^=e@F&1_$1nN$=q5Mds=L{M-^{YK)c# z14C?X!~mra$*1nc$O+eH*q7JPPP{kX0AMSUq{;bHyDhYlqIFMqZH%$q^N$2VoLRJO z@J6~x0FVouAWb`--CBYNOIv0mUH~N#@rI|F^pb_hRUg#-=MJ?9)GUD3?zkY&Iq@bD zKN9NtuIKQZt~n%Q$Y#iQP$V5>q`StNW9X*N^a&yrrY-;dVCz7gVEU}Mgyn`#jF|OV z%h>Y4z>lo2`L)4uP?Ca>>pdi5c{UZBc?F_waxcrdR2~+@>=5foI@ns)2`Z#EC0|b1 z8u2tX9_?vsYz_9o8q&cUo(z3DJsNqywHwE51Eded_^d72TE1Qp#3#fN>!o`N9CQ;+ zu8(N5?S=rUHBkyDy?QQJy^WdI#tS1-_F($fY~0^F$!{u3I#03FG77v@4CiXcnQ9FS zic-!1Jp;y{<%n%|dW@s(>q=sWT@x=aRgbXRKWB%#cQCts2#A_UeJ)%4JUcXoCU-iD zt|A-E@R$YKnV9BNH;hk02W=&sT|m^CL*}_pdc2RG6zL{9S5NC5c2ExFg?>ww-)SIz zMKu8KhWJ8n)Puc-?o>{gjpW_xahZM5lVUw*XPwN=sdoz_TNeSBH8o4j&)|-~ z-EzEz}5wVil#j9%B06zdWe*Fy0ynN5O{Lw@L1O< zF~_az)E6gamz3fURFFUVjvl?MiV0QEL>M0FID?T_rN&?@S9h&VmTjTP(wmdBmP~xd zBHrcJQew1P^3p7t10hkJ@fH}>0VOpxZ3^)gA)9)B3d1nx zt0D@j`ZMbI;YZ@uMxKI6-lteINWKTgy0zrRt!|d8Vf88KB1Ve0E}! z54}6fP23!pPDB?;=cNP$f?LbSGR7T^R6E#N6eu!7WbSa~kUi86` z@W2T!%KW7`r*a6ID@uALz;lt@)mghKjcP+M%`Mo)>S!XH(7jP@xom+; znq!&u?J39R>puT6UE;)&`ReHrtetB3dO3qLNRUCvbG9>?=x)3f=xg}EHPqMe9L9rQ zhSwCa@f6`yAqt%+s2db7my0tb@Q+S5J2lt`win&5BT9|W1s!%^ksQAvL3nv2-f5++ zk6tEBfi3oy{pRAk-ic3d==uY5_~H7A<>~3R6SMZU5zUGBQ8L)tVYQS8HtQ2~71E1? zyZiTo4-igythw^-k?>mAC9X&48u21rXBnI@h(qbpu4`I_M;w&P&Jup^%^2c8c=T>B zC}?J^^=wusI@L$|EZ3z76)$gG?N*0l<@{pK2obr6?i$wJHZwq4lx;Gxm2FrZj>m{i z`0KFVBtIvk{5Ua4&N=^ z1ox5np4SIWo=W%nWLga!SG>s21ztF;_NPX$)?B^I_Yutg>0c_ z=5+ic7W=YQw#D|V6VDE1N?5kFx8r$Kg6?<=Zrh8>kpfO3(-BF&hJf`jQR^}PzA zS?7@W|ycHFPaVx7Lx#mlCzR2(A9%T+&lpq`A6^Rld~m7;K%dCMUfGxw~9IJ>*L zHJzKVicb{3HAz=NUe2#v8l07t#6@S^g;LLa+*gsFdqDL1)D>IF?#5iPmY$Ennj${I zq6hFa&1w239MKk(yN3(!?}n^nCO9o&x7OS>+J}_;+dNG9!w*NQ`SZ^uF9i%C3meOI389SrQzor7Gv@Vp-8xAl`Hc@+Zj+Tv7E9xB zunYqu3C%CA*Bi9%Gk9%ZMZDC^xuGql;;V)^ZOFc)C=-{6;m!n){h=3_;_VB!N^d1& zJlpSUBnvMn6RhwkC~;nk5_1^bg@$WE03lE3g8qV#3nuNhmP}%FZZz!>h`g|>eSm#j zS3a?DcA3u!XG#o5xHEiaRk9gbhjj?q*=d_x*6u4#ihjn7<<98rh=sSPs^gDU;6|k- z+k$;C?L4XSj4Y0eN3BR3BY1%=*Bh=@Xaww5qr1e|Bz>GQAnPNhF+4{y1&W?$zxcT6 zf!0uySZGV9_nub)F#~cQ0k*?v@z{I9^i0<7zBmUfXkSs{8qLVCB-b+&=F_ufTUBgx zG#N5z-48j?hTZmQ+WX9HmXJnr9ME_(C&?^s%j*;U`N}P?W!YGPBZXC+GT01TCW+-m z>fP<~(l9PA7FP(b`rGVS)RI0*QFwW*kPx z_2X7(TpD1xsCZy!6(_bU5^OY?er~OiDI`NPcH3Om-T2HR+twS7qhe+Bsx9a$9A$gN z*v9r8d%-rwH2NA5vGn0eC8;r`LQNa=JjYsT*^vc>%STt}hg5qi+?c1awdsB>0}9G% z;M0j}Z5=>ZC1!5k13Hos=k`b2Q8xAEf^)f+mVy-qXT7(KR>udHYDFER-5UXE(Ppvj zw+}06Ru9+iC+tD=-M!Bc3r7VWIRG3Wg;)pldaJxooL^7Osd4L-e>TeKd}J`ujY5>c zAs3@1u(jUas0ovP27Mpx6G~Q-xL_T+&gejD^d_~q;dCgQk78jHeB-cUU8#`Er^?Rm z5?`INQw!*Cd#h^_9<{X`gP0Y>#q*Q!)z8nt<)NfmqQ>yjGP(^g)Xr2^2FLgI=Noe4 z;(dw{@lSmXh42#bO215f_t<^F&>c=|a>y1zI2xNqnh+fZ% zd9cDJ=wrWnq1zW-vhXe{&~)u}!BukVC1P<#ptQv;YMwcarpxqTPeRVhJHs6LM)N)5 zflnh;7_y%DqG1bGtt{{m*9#3t*c5j7PmHP>s;kHt|FJvNkz?6Tu z+SREXsr1q}me&;-5!DJo&>(Zj235|{&k!FC5Z3DcD4>RaZ90?Eu>(3bNA`YQ(F($b zStWRN%Ow0oX7%49b6@&y$Yrz%g)z2zq&j~VMAG)1AsAA71f3~Em<5Z*pvo2`pw1-^ z^riFOYrUU+V;?EiYwmv4vN^=7{rGje1sO^q?>_HZVKgnb8cc)7qD-3gOh#RR+nGfdUdYV??bj2C}!-%=)_=r^$)v*gcq1n)YW5H-H;O zjK{J4D-kng&~`?B#Qp4zOFp%Eri2oN`j%4zD_m({7kTB5CV=nSo?8`Lw}JMWf^!EL z&Q?!1*#aS@uHs;32M~9hXOF!l4l-=fiK$$|lGv0K6}3-eq$y`2`3)`m+?bTy+$x73 zF-sJf*3|+%F}T)datkM9kGQIM#r}u*dw*|}eD8dV|1MfNsoi7M0}l1F@d36Tb+rVJ zBiL7X5z?o0YQ@5W{5bGJTYlHOP@Y5`)l)ekWGl>}o{Z~9s$Y4u-7Fi!(ym5rR+pDO zpY{Q&)wr6C7t4=41d)b!!GYb*v5l}W{m~Ef+&xn}7!dQPV%`G$QAY~g2BvXjbGp#l zVf00`&Gmp@dCUfo=Uj}%vN1Z?_7(ZnKyf##^EMSIr$g#ySb54au4)$wdk-ti@1M@5 zmuj!869I9l8Q-!8noa2GwQBikQDamFhEU9Fwu5E5O4TQ;Up;MvKJztX7yzPx6K%PL zt_^poSu5(ET_QaXu>{0BW>YJ0Jnjg*(0Ll8Sb&&Zdi5SdD_DD`P(9`&zm0vawKDX) z0K+bzd1wlL&E@=cDPWu58)oy(^Y()$Kljr~yYJriD^rP2S$SwX5|KEdb>LBNx%Lsa zwI+^duJbIm?%lM;y+I)-unKCM69q(x-lsaP4D`AOCR1HX?GpIt^r(}0FWjw8~p7fFOR zWx+bLf$VYwD1)mfp+KA!(7)-M>1sa>jKxi4Yl_Ogcd64n?t-n_rE zHr8Eyinq>DW0hQyr6nIy*mg3@Nv-&bg%ukbeZPvv1dsXc#J}PGJ{p49K3FLan8t_oM6lbUn>zVMhdt;9| zses?IZ2P353}2V3=lRBX^8_K>CzK~5!9rd-#d!v-v4}<53UE;YZm=EOqdln1u-^`S zT9?b{-eUxLiJEpC>(k}jmNiCNwY5?Op>94sH!Bg;FWJ29c|R6{8v5M0t1d785gfig zUFvFEMlNas0p^h{M||__)q4JTZ*Qo5Nv$yeJPk*npAKej>_pEURq0kzgm< z4(R6lmW_4R%~?@q(QMFhmM#=91&t%=nIv&CmXydU{ZsixQPVZr{eAJgB5-#w@@0%S zG~VqUWa(`hTl`h5Z>;2}F8E}ddEvs@v7^}9lq)7A;*cUXy0#B1oMdHKiQ6C}8lRzC z%P+Lk>2a>x$9HnG5v#KEApWqqRJB1r2 zJOK`6m)Q!+G0n^b)#pp{_4&-|9SiKEcf`0y?-2J%t-qmv%@%SS=U6ije|kO9 zH*XJgx5mh?MCZ~6X^s4Ku9vXv`V193ejzQh1OXYlv)25U&7v(cDBjD46Miqm=>8Si zHDpq!(0CY6XR(5ylpalf_fSn?_DDe}$z-z@b>ps0X?biX^O--vA277lm4WR~O{F{- z0C6E=vY>^ZsAN1Ty#Tth-~!L&M0|LXGkw)iKNW@$n%A8->s&YAB5Ro3x2io72|6XZ z>YN^%H*IY1Ib*xlBD7c=BApd0Ej{yzZ_A2J6DQ*_40zwcAp34fI0E8jmsRK|`ZSD& z^3Fz(Z|oZ5AqQd7LssDOC9apl&HE}WSIHAI--z{tCqFIPJ(N9~Luwv;Su2B<)QUkF z!61DwY8F+It;wjL8p2?hT1lAd)0CX#W~?x{6VMWwhhkTCbV_p_5OcXHfQ(l!4~9ME zPs#8!Hr25Xu8QOXyq=1X)VPZ3N=MboJbkz#3SO201$U>R)(qj0a5v?FCo}f#8Nq1^ zQIS14`j9fmA(;QR^CFB#>Bz&N`^=!1@()w=41i3G^ni$OC4oP}9=|+>8?N=L0qDNF zmWZnIHiN4I`~BGcBmr+w6+2OPpV1QW%#eXN)mW}eyJOzIhs|tmDrIERO8-L`8%?QY z6mWcSTYY%)7Y=V+MYVP%7;{y`TECU@v#5*=PFAvy*DR(5+!XYYo#Gx4fDYQ7E5Lx5 zB*QJd8Z)Z;EHexF9b;P#1RiiHw>7uyjC0cjYT8&-d++emirDns02-xgv?G$-ezdl4 zg73F}`V(@_Y|Tck*i$<5+9bcem1%j5qhnXX8cer~VklSlvRCq`01aKv;mU zd3*@CDD}+?X%^6A*9#se@2qepku)o|<1pJU13Zvs@+8lI;FM4FYqC{HGOmtKOJc8c zVb0Y4`TG7`soyamkbmLCP)V`b8>%&Q^Fn_sEzoAjR4H(>!?tXJfq_BD9;^P>*PoPj zd4a)TP}XsOyOa0FlbHcB)#zX`(Dd-QX`6U^RDX65D%ITT_=Q_H89TDoA~jPhhGp>5LsekI_$ePX;J$_F zU4aAZQ()#G4NU1Zvc8bJA-QtEi07w=)$NE~-vNLw&@mZKO#5?2!O*DM#225|MBP5x zljuVIt6U0OxvruON;0$}1x*hbgit_Dlgyjxwu6pUKBtVnE2#PLLPD%{M?)e;x!~85 zePHT9(mZjvx1P_S__n`Fg1B<6eyvE6it5S1ZO)=n;m&ulHC(Z(75Pt}(yXoF%=D{W zj2oa1W|MnMZIGHSsBAe$Cnw=d(8{k(2voJm15@r-AP?TW3@_9b2$$f@wP;)?!0tI+ zM=7{~ILbtAz&N<$OY@D^Rf_!*U=4w6<@61oZ+iEavpS%U%qXNY@HQM?~TFtcbF zm#SmBe#xEf`B!$j_s5a}NT3NI ze@o%)zkO zEW)lJ?`6Ir9JK}RLOd~;fgUQG#}|*t*dPBrD4X$@^QW5O#rwpyLli`E}~SK|pjukij|E9bD3H4gyP2*rS6k(l$Wo zDEa>Pw}1CmPWq4o^eKHwc&VtAbt75aiH4j0pJ_P8H z?A_g z0R;g+Pt4en?_R3#39#;d>c79D<}*oWYjxe z&ab9lb{KFuNzGZ`FwQQsd0l>A-oB*4ethI5ui$UY!0xdp2XOTafTZ6}BHD^HFe@VI zGc|y^HNjL}5I`CNF@E!MS<7wlYR1j44avTJ-H)HLs42XY#h^pp+m1+nLtb;|xI>t> zHoi;CQB7*HHuN(Y8T`Q#(sxsBrpoVH`p?|jS^WM}&dX)cXayj(7Uo3F#dF&x?Gmd> zbFyMm`n(EgsP7+n)})QU?UyH?z5>M`!eDlZ8$akqm+n#i4G#X{cc1d(@kUi7>oEtkmWDpqU2`~kG$~f# zgNe|CSVMp4Z;ZvxLYX6P(W_f-epC#>eK$LkgK$!p#K$YvIOiho0JJ{O84%-}VgzyB z;ixS#e3xzaJ1D-l@2X$Y&Da!&=Sz&IfG+j#E{hxI*c?|M8WbM-)e@0EN!&uW%T4mCPfl`(II2c`pVxt5d95i{^8fR?{n}Rqi#KaIbZgPA^!3^~%wJE;KKLu%#c%V#wCWRHJ2%VjGq#KYLhFQp@Ne&a z<;ej!W=I_U)&uHSwAdm{?p8h6X+p;~rWqk{^a z7lksX#$W>XR#%Gtp0?je_N6PU%zbteNcEV=Gvuhb@HRH}^|$*1b^^{1K2feh&Ob-Q z@b2p~yCKO0(oyz9IR6HL-;jbNI@-Y}WiMCj7%3n;byU1R&wtv%m6j{OaZUd|sPfEj z%*f8NeKLGwJkGphq<;{v@80^IJIX#986X~^{5wzpy9}HR#W2?kc62rQDGvO*s4vX? zms4M4@L%!!s-XYs)E5N#7byO}1I3-;zNG+8&Gp3-Jc*TBypaWwZ4 zoOrag|LIa1=d$}eFTW2`ed+nUpxZD_Siy6eFM9ul)nBFmzhC&R3*0QEfY{2!aO5U@ zmTL=|Oh41dxbi8h$S`(n^#vXG0+ZIm@7o9cY+pY`K{!2{@c_&>?*?kay`%qd1OGuj zA9W+wocO|p8~-K?lAWF|_J#Q0%+?=00cS0JR)^gDTd}K^8kgbanI}%icggg5JO=;z z7(g$dKm79kL&1On#Oc`#@8b?bWhI7`!!(JKf!!FJz{Fn;j~tXs3fX6241{t~<>NWH zbVq#5GX%q0<_Vr*f#YGt;K7}FgY$R@SCOoz_6bnE{*rLu1ONwPWcnQEO| zR!|LnYT0h{Nr|Fd@P@>RvmxGSE zz3}Iqzfd0gm)R;8vuDN*SemjVX_dZz=molFH9Ry{_u+3yK-K~U6sWHy+;o#r;QT@;L`?;UGnMnaz7I4?; zS0xMK#ksh})z@o9H5f z3q<+Vd1*}FcOAw47yacLD4<-UIxFq>M1@4N!``vE6s=TDe?HcyZSTpa3~@_uQgED= zzLz%+<$F9$%Ti2H(&c`oynru!eoP&fujQK$D^(FY%KzeNV{W=xt4+3%4c^e2|3EK# zGSM;3x!U4}-GtrGqvT({P%eL8ACN-%6eklt0k6|DzcFmjdI}$MQZF9?3ux@W0a+cm z+rnRnE9fDuIpq@4W#+Ta4c{G#3SxExhZ9C3%PciF$vrRC43%5*Wn}cfZ`t5Si+2ra87Lu-GxWSo~s@TO0l~= z9x;qv{N?HPrfIN`?cSDPv2@T)`QrVw6&)wZc`s|XuD{ID)a2rZXRpLx(%IJEuyvv0 zFneOHNNN=lGJbyAlbC!Q$t}5~XW&2K__yE5c^zq)@-?)amgkZDh+?keR`no+dT+@H z77bIvRU@^x-1$D;m!xy9S=lq~u;e|RCCM?f;j)!$iJpv!ejw6D>B_oF4e023C5_By z?!Z03OMazN)@-e_I-_%i_Iz#0uu`Korij5PY?e02`U3kRk4rnC@(+{~qH3`5>7#GG z!V?Ny$CVu%ye&_0?1(G&X8@dua<#CN*f3^Ftwb!lNZTou( z@1|#$1dzg^1zomK{+Wm;UAmI-h%PW}WEa*WvHOMapK1SwUS0xki&cnNBev&=G zeuF)AH-s;Nq!Kx@X?Am@x2kT$R#&Olm;E)&N;ZNMUK`p^L`2{S7;Sf1p8{9ce!DH_ zj%z&eD;oJG>i$h`VZ9>i1}A$2lX-3vL~{A*S4i%+?v6c2dBA2h!(3n+saE3MMJ2y}jqX8tvbOri<6GgS|b9 z04#V+x;ajWZpNHCz$_A~7RAOrxsHb5+#;!^Cu3FXjA*6t zILT@{*jorGQ>RX0G$p(Qox$Q7B)UsdY6bf@aJ19s*Uv6e5iVViSG6nyn^(>`E*$Tv z@%ea4C9~m-PTz9vW_3Ez!+I=gISqEdY{7#E!0DKUI*+ujV+@m83yF;VRtB@D$d=&@ zl2D&VcEd?mLbMn7>k3@gXZQ7Nrp>&zSzS)_)B?aBGu4^`|zZH>%h02h*T#j0^}8 zPlkA)$(Weh-5=c`WAoQ&)NcCt+kH+to83i0Skn=5dqie6-Xvh^S0ml)oHu5RDr9vd z%GM2U^?p1|LYyGN>+{0rqkx3K^yviYwB=W+VeUQ|zOQ(HViw&{+7_j<3)0#Ba~EeW zPP=#Bb{D==*|x6X`Fe2Q1yT><1-|!Xr1vESZ^^CX(hE7C46gFkL>dn2J4)e{#~|Rj z7qQIcoh6YSd2A{98qNJL(SB_kppa)$MrrAjT;vk_$Ya9CTt zFN#j&=oX1~=(FMr`@P&*1zDHr8Iqzs*8OXD`B@a`21w~hueg`ZQ&PI+FsLkt3|UE^ zVyTO|y^uNohTY`HI4p;J6ab2k3VrZOYWcI$q4NE@C|+uK)uG8>FH>>Z;itDJpi zmfIiznA7JUQRaBJurW;6R-tt{P@j+IdK2O=iJi9_E#Qcsov#nJ$qXXw7pz>Gb{0Es z0Ef-5&POCqs8Fu7IA2aBWjlo*Uwh9A=^@`Fiv_=9bPnNhPMKA6$p%M`$K~1YzAz!~VLCHML#xND%wUH3 zyk<1A0CeXKWmsK~ZmXm0BWbJB<|^7g0e>H;)?sqyB6m8LxX*ai)yh`C*73e*%)7Gay;Q=xeLNqm`XnU zh>ez&hqt;5_msGJEgi zM`bSx#!zor>i64pt(;tyYF^lETz?ca_CRsZZG_JmpsfHrv(_=!MTZ0Sb zX`~uS!{ZR{XsB#zPEwJZ&5-jY__~|YqHe`(=1)D z&fIS8Bge}+vj?rxhg-~hiEv-nJ>rRz_&TVKhsEVO@8Yj_V*lVIQMgV08b1#E=3WGt zrXst%ZgA|Qvum;exs34UepyJGTVRZUN?qUCGd6p~7HlUkxE}MDT?`2uW5PV z-Om#-OYMj>tz%mp+vng`I8-`ZVa`3|)pHE=q9P>wra$xTHv7_&3SOH3L)d%AvmLf= zY$}Y&7vq;)Tq68?Y*}|Y0+iW9wlb%Jz_@|%#BNm~tqtMA!_j6r@wMbMTa(nmHOAHVOzYI3IhnmDh#aD;EY zTTCd1hmM@={;$5xe`72-7s+q3dZJ&Rq`6=8Ab=mJ>d(%R)RgEqFl=zGleFU+8z5$% zBM{SGZ8zfh5~u7wezHyVa~2jh5}>N#5y;8L1#Tl{x}Pf|p>JM;fmCd2${bL)25F?x z)+w^<%i=-%Qkl|5i%{hQRcQXMWQ-}_d&;|Q@((cVds6#%owB~_bsn%Z;X$Ps${4im z{Kld4`Q}R#U-LU)8FZyZ}<&BGB45; zJ}2y6D&yG<)~j|UMePVW{60NRYiZ(Xgbx_S3_EO(iQZM`zPknx6my)?V`=QID{?rF zWw<#O;~cH;S)na&iVx~-0Ef6QRK$pGO&Mfhcbw&z5m!a7LqVl0)!1Tci;^t>-*jck zlxD-7ei7z%fUcv4^=w`kb5Tq+vfC6P>4pD54H-H^D|*FkuG4V_?WiLgw~UWsJ&jnG z$ljZ^E(Q3{pf{#pjs(==vh}NS9LB2zpqkN&KCSi1eki8C#u&RiL>Eq^$=m6@tFfi~ z7kl$*JCh6|lL~h+J8H8SEbD#wzvOMbOSZ0GheQEJr2+^&%@sm^!JfPf;A0a1!<0O0 z2|T+RcK8|ir&<8Wxt4g}`eR^>dj5PdM?BsQw9mIGrD1)^z-Eb;yMJ%%}=+*vmO#* z*-b}BRkZ=c0LR<4ypLxC4%Z)n!CKxk_~(%(t67ygfT(~rD^Jy~UK}p(p~js{1}C5V zWY6;2iu5wKZ|chTZG?DeUxyK`cWi>&(TS+Q*e~tvT7tZiP%Zu zFVr88E=4Lp^?K!@;-QddKo&Mu`)YclvuDuuoRN2xJg$0WBtFDQ_lHd3N1pmmhrn^h zXpCVhI+J?TLsdavwlukNzW#CuXve1v{0#b)`a8p>d9E6x#jGvBeJeGXoy8>ouw-<4 zVl$McD)YvTTQP^(?}bZW)ycQ2RVfcMU``~FM^xnJ)4Q8@tJmGN>lgIC}eY^O9psbJ(#)lg1+t>tVE zfY%j@_JesTM98nV;k$^#erNn6Bf%cbm)VvpZhOw7pzCxCWmvbqwVOJJgVEtAa|QSC zwp;%{h~ZzyT1@df?ov=(aqcYs7gt9q-ta3IYj;AZqGZ=ZlEJE#q~-?-TJkTLTswF~ zFxn@|Kkn@mWr??J>J-h0U2@cw-vir(O=!iso5pxfZ>IqY=I<#URjLf2;-I>`Df}Px z4B{B-gMu)Jz;=XcS9WIgatcHi>mP5J^!aQ7lSY1D8|NUk#4zK9?Krw6u|K2j4`O(t zUnQIk__6r8$W>2vzPy{DR7gW3wk4ZcX`HG(AOl|7MQ4vHS55K8C4~K0`qm z3`bOdo>0eXLn=~$dsLAb>f>wO*WCw_tTO$DBB$Dx(&a%;EdnSV8OTWy+e5aO2zbbS zQp?XRiPa!_eB{@Jt$OMfKXxCzwGq%(y6X2Oas<|E1UvRax?KB`Be%8yANciVc^E$ymCDo-&_P{4uR8khf3Ngg^FT*bHA^X)O-#W>! z%I~EsFlhr9#3-gtBjmwX<0k0W_Ra!}Wv(UiLhRhq^-@x12l!nER_PKb%zZ|P_wU?3 z$tsHwk+3TaR7|I3b?n5dRSW;9~NoNIuSq zdL}JG7{{`x=5eJ1FvvRM&7r#kK4P0Ua{c}G($9HP=7C87O?1WQcj89a zDe1^;UXFWj?ON;uGJ#xIb>jt{n}!#aMuOYqxy<8Qh$IsB!>xo-j%Y2khqk|;sopUL`nA+4r_Q!tND1y^T-Zf+Hr-}9j~e~ z^u$EFxqvLM?=uO;Y8sq{&l!IXk#eTK>Fz#^;&i`o3%@4qvbJWc(Bn=u^8!V`NWl{EOml7R^%oE9#JEHwhZk4&K5sz`E1&Xn2NdVe^0bbriv&C=v>@w-|MP zYfQ1c^ms$l4!ROAQ-%-*-eJrLjp)RJvDFZb|E644NhR%moa;^(HpL=LZn7?*$9}f+ z+5;AG_nuf53-n7KgRY@z6Cbcv#J1kV&!{DeG;%3zazXItj8ouS@t7OPX*rZEObTk3 zFdNIV`O~HAC?7Z@qlZ}s1(PlT9tXDQ%DFI>Zeltq+V5DTmzQA5W=lOADZ}UdtZY9ZHhzlg*f(I_m_B1} zjG^Jwb3JvoPx>+0fA^Zbcx1XdN+Vzue3c0U z(9Ui28{g>9NR_>ul_FkjPI8N5(qVkqchTM6n+OY_f>U8^PAB_+7NlgzK^{GYpaAFR-S{Dy{icl;U;UF&=g#J}Kphz+u5u=5Fm7(Z;7qG5-#9CeZ52&JnBE;rK^&kCFX2`e5ZRa19z1{i<%~* z#B<(V&|*zGFL}EaNCD+IMM!Vo8kd>$+b)zi_bLOZOA!|=6AYFWvs1%Z@B$BLX4~rT zR$>!^Wy_R=U74B%yvg zK3M$*5&XB-EUS!G3vA1l&%jZ;4#+sG=T`DmP9`pvSL%mJK!DAZ2HC!C`+0wW)w8+E z0bdR6rLJv+5-n4i_Ry3GYGn-a!4_RRY4Fp<_*1Uaork*)!Au&Mmbi2x(@%UXHO|a$ zn)ITc@X#;S;eQ6$|NQ{NGk(uq(J_#VqQ{+bPiJqJ{WCYIx!NXfH++Zj^v5M0OlO=p zq;+Z^e46_aP$-|@5qMr}TX_ky#Gf4VT+R0P4aKXK+L51c0*-QQm0d>(nixmj7K?Em z!U!zavBvcQe<}tvn1~tw5cS7UdKI z-7x`ANA7z7QHwcJtBY0b(Igu8JGTBliWze`t<$aa6)NC8q^5sNc!yx{>Wp8jxlvs; z`$Why36cZX9ETn>I?Ra!rtlitEE607tiW-PB6N1k{C|$d`VVsSAJBsI448!EP6$HG zzE?};IK*X2oRK?<9`y?6Ty!RFNjOW%?0svkl(#~Sm^0!>SvK9S+syq3;XEc(>T<$m zp5I>Hp;9|h=bJcQe^T<$f{n$|2eQu0`R-bV=ky8$u`%6(71Pd$!uOD7j?zdp4{WXZrG034J2vS1d6|@pRPsjKM32I++9t`*Js3pKRE;3zg8{ z&=J=49Zv$VS}U;RIDi)auZn#))O%**rRkbGk212Kn>);m9YLOI#l!J3TW*RPa&1;e ziipJ@Sgd-3!tUR_=YN17XUuO_NhDHvZ2cjoJzy z-?xP=gr|}&Fa%g(IEw>Zdmd$9sOHO+mmW7nH`xO-kFty6%ADTd+hvtJSW>|c#A0|_ z=#&Uws97Y(eW73n#3Thtf+5MkurM0AxJPNcU8{`%mAZ~NBvu(Hwbi|63h(0yi>Jz4nqBd;rjDH0y>It?c|{kgmGPl ziJ|gxi!7!*18nASK?2KW_5Y4hIpV)li#U&1VyRcILeMoRX1xOVxhaqNwS6 zciy;_Cdzk^$sDFWxXg%Bv21~IXg0N)kRIS0<6g4wd`hxm;o@~=V5M5Bens7M5_vIc z{Pzv+p(L8N!9W8w>+s{os>A0}&P~8okFSG*@ww8Q%+5j-KdxPRSlSq&5YJDyXiANe zn%#fdw!-a~K-c!{5+iO=q;-YmR9WUuoo1V~eL?Sid9HCs;K7p}Ft+r4uKel~C%}a4 zn7t#c7o;l>f&za#!l+g}?v~EDN|c6L$&!S82Pc5wJW;+sO+THPt0q=Ey>K-kIz^Xa z0=geK>!l;)`?TQDI#L~^t*wlqaZzNW$I%H<0P-hT^|&`@y}~S-;QC>jOmYYQgZO@c zS(P%a!1f_f4F+ck7%|AQ$;dVYL^aAeRJ)qgx0qlKPD$Mi-H#C0*<4N0W6?^WXYFNW z=I5mU3{n5%3BNg46$MTkQdg%txVv5z-MX2_+gt=9AiHJ|qS&MMz1FTNnrGrj=RQb2LZ+fK!;~SBf~6Y@6bzd~E`iv&vv< z>MOzPH}8dR?|;NSGzpybnGziySZqB%t$Xq?LpHxnzUV7m{eQW?31?yKoq3&!^BVJD>Ga+D_XV33#*Rj#CR+=cMk3 z$!DNMw=RaY_Y!R@duk)a+6eFWt|48f;Lo3R9yzPu2B;t3Vq7rsf@ikhN!ZE>59VNI z^Q!RBmD2hVGUDKnq#fv+1rA{qRY=lI>^A?{t@$~@Vd?tNHql|cOoKy=qWJbwHgy10 z4_nvumzH7kqNBJs!!)EDm&0u|V5dcR300VbTOg~?5e5^s>(n(+H$|y4@af`!l%O+r zp#~=@rX!$s_)=#yyc*x)KgQe+l0XDc0(MU(?(aaeQ8M4e|BD(%jF-f>NfcUTbU&C> z{g=$>hLPJSipXVGhooSydVl`lw8`Q+q2#@|x_qH+SP~s|WLl*f#eEW0*#^)nUcTDg zhV2)XDS?z*;{aY)IaCR6jA_AcO=8d)W6-XwX?H~)#(D8;MG>*ya(9EoZX)%TU zMAKt>VvOO+7~mo+Bb-5N7duRwtGl@EAEEFF*A!5q;7;Md{@@?#(fhvh3}(kP`WXm# z%Ogy>u4kw0;rI#tmigyY99lK&%27Jw5gUeAW017~U1LZ$qJmmVdZ_hi^_J{ZCWT-x^T$0}bE+f>5P zW4Mti(R2x<7MeR|t-&BS6Ei;o?>EC{Ql0WSF3Apsgg3NWWn^e3yG%$fRl-7tLl^B< zbubMC4*F!K^ZtQlIUR9DvR8t(<#o?nb8(}Zfp^@tw9##LU5%@NI0}k|iDE73m|G8r z@P1wj`rFy1%bF*Hg~xSfk3yUZa`N`;{4deeZ-#(+C#L!?nEA@B8kZvNhkASpe)Z8S zb_HrHbx`9TdPg_r9l?)or43JGp*4(P3iqR!I;e$c~C>kmw+wWgJS%u z#5QTJlNfJ4ezG@%=ue<}p1Y!kl>}o_qG=P@1F~Q7UYoAT!D`$N)4ZQbszqpTHH`t_FYlPAyn#i9cCk+jw3G7M)hS7Y( zvwKP*O|-+%#iIz4z-)VNfcL+6Y6B1H=p}R?b5Gi`DYNmI!zBkHbHC+)M+KyNkFt`i z{RfrKr95IFoD?KdEJ16pI4-0ht}Rqk<8c9>xuBwGl*mj(%FN~nPSt2Ocjv_aCflAUc&bFT!0=3iFtUKF1{6%o5bqR~XVyHk z&+>QBK%_dmZC$M?Whf!f(|r1ede?n)l0mN&XRl z@FNX9CdOi&l%t@oeA_jxlgGLUAKB1Z-nD&Mx)KksH`0ig0=1 z`we{NfO@%nRJs!qcP5NaN$%sxG@nKhHywvLuM|??Phz@=H6Ivm_b$_`^ucv%VC0DI5Q?#Y!7RPh@`w}=+C_OXkwi+TF8|N<9+h0G=5cb&Q$xK$epy*MlMBoG>R-YZYsZnLDIAOKj20!z19pMF;H)X%^nq)W6?Yj%Oh-ZtpZLQy7I1G6n=J4>> z@ICIgK{>aJT+UARm8&Wu11vIpEXd~{k0Rb8V)sL+yyZ#*|1AI*ur0w6SBK0pf3TauYc77`bOCrlj=aA8`w`{sw zwymxA^})m5)O+qi|z3xvXBf-p-K7k(?MKr zQEp{DSH%}fD_I#c0wTG)j#og2u_68Yf_*aX(-=*$z~fj`!QPXs70aG81O`ceCe?v$ zsFNOQ@RQ$cNUn180mWT#^0brmyky^$2!o58F=P{!|N@-y2x!TRtuL!m{fB_M%hH{-Mgv8@5ESSHSYy_ zL)P82BQj(0sPlry0-A63xB*3#nG&k#UTJeN>SUJ=6HFv1dn9(a&F_{+6jfH|xdjp! zv1z=oX5p`($4qCtEUl_jM?)cD_e^0KE(LsBp7B0aW*L}r_*|0;$CyE<&YMu)`;n2J zqUWCA&mQ_1&Tkj^K+a`Y~|oPSBYi@u82 z^_R6vIWli$Mj)L?8l!Dp8ZlKbHuwA+|IH;wf_?+@~H}_9UZN?X; zWSg7zq)%E1Gmy-SCrD=AO+&&AN}AW2?3P z*Urw2MtYXVCLsv7pvWv&*6rDYQQfu?&91hE?R0;ctf)v;bFwF`SqNkm02g8mcv#?_ z?Iy7$x-Gftp~z-$?j2lO>PFl%x2~}&9)xN9gj(o!I9twDS-sYRcgUw+Tpjn(R0^7o@z`)XMk~R?YOUhoo2f^(|?Vb)+OOW1|tl zo5YYB;I9|55pIVJ48^@Q@Kj|nxXA8e6etfn-NQ|tYMd{C<={1LFw^tCK>e`6+Q(#urtbE3Cwz zk%97`L)+uy$~p`7BtT8QW#xJvR%GT;Z&G&0NvmoC6XPY%pLR?(`rd8NfigrhGIpcYb2zk1OASAY`_u!`o82fc2 zll^mcboL=UHq@icn63WDuL*9V)jP`E4FECj4!($O6kY3p;l8=QhaL8qe?fBxZ#Wpa zeO-U+C93d^EKv0auZuQ-rp%MMT>M4@loSeW5MDdqKO1Ff4w2moKq`i<>e`IarS%YC!^@}u?7${Mb`f{@BC}yZJ^<+&o%dEK&g%`8ze@R$5ofO>9 zzG~3Ev3zUTf?VGV3)U%B ze{4O)g8)gL=15PSONz=f>nN%o-tyWth8j~!9QTe?%6cTXG>fP|RtS@7qqbuid@=7n z(|(vO8lf3+rWgydv`C+O0chm_%5RwYI?o6wAZOiz_rs>%=5>~3 zN9hj_U^8^by+L6zO0<1jnu%2rwvQ^ev?gv3PwaFeGAnre?gdBf97GZ5?oR>CzIE{h z>9XYPgam!W;%N3#jVfJ^F&VW#K`3qx-s|9|z_ zxOY)KUdU93SHa^&q0!&8npU@|)ze;Q{%HTz!K$O*p7D<7+Y&OA@6pNpvdllri1lkD zR!Ihf^MnCI=twE$Ez_4KT1mWq>r#}*|L4()(0hvG=sBfhO|;~gx1nEMM?)yi#E!3Z z)=4&|n)a{t2qULZF1fqO){h3wB?~gwLX<)R*EiKAn&W>i{XaB#>Q-de?Z>&4$0^72 zrs7Nt)JuvzO($xrWjAq%c<|fB&cOf4D*rn|X|0f7=UoP;{0radMb z-XU;uk<`^9Fzui2^B>FQ)UqbOF0c#+3TF8wUUr{1uul5EHC#VO`8%w{M+LEccZxUo zlZ6cL6NtY(!F0KbLXIz)uXjUVVcwFKAB}iBa#WY1j2@a6HwzbOmCFh?mdwhKKsZQG z$_Anp$9!X#O+CXp;B!UQ%+?Sg#(zce|J+8sgs*QeH(@+>QyP$q++ETkynVIz0qK5y z(S_)|d(WLdD*a_WFZgmwgwU!w6+=<|<7*LIwAV*q1hY z-=$~Ri0R7gTAjTie8AuGzhE(K`iRF0{5i&5W8AoiymE zx|--eUY$w2975K#tLmXm23fAH?)q|He=#Z;tBMkw?vq8wS>r7byo#nRcAGegjG?kot2Xb(AGHRRJ62|?k3NEpe^qafAZy0ThNLGdbT|x zT>Q-8ETpwP%;dd1B)e!z6{TsBw5VC0V)brl2`h@)k&-SXzI(a#D-o-T@1q%a?Qi+N zKll3$p52wS5i$u(`eiPOPB*)zu~~{gR;8{IJ~}#B{Y5(qvLYtku!ECx(Qf3uZeLbX zc^u*9pVjwxvfo{?t4la97joVh@`V#b+caA;prFj3C0^0r(6okjD|SQX!~1)mIw|`U zJGrHH+c018=Q}aBqxy46Prbu0ad?g^PR7r>fQZ?bsiN3bhJ}DG*W6jW61gaLnp*reo2Wxvefk7IQi%4pGDd*Cf=30BWKT|@eQHs26@4}9PlCG&vb zV(I5sQh;u#HSIZ*dQK;ae4DTz-TgOpOdbU{=>;==O_&X&Tn5#6>AH8O!93?b%a=aO z_~({+5C3>W7G84q3bSh+nYgrmrZzeZcZM6gl0qj_nk$}lD8-qRyx3NqnI0SSs&sO8 z@N71fwt2QB3k6D%+H52&S;V_phU7RZ#^dnW@Q{ja|B>%S*L?@5;@tk?Yqu||XS~id zxs2IQ9+Hr`EkiG(e<5Q`Oxum9v&#mt;N<^^OmQcv0sq*ti|U-=Z4quZ4=S`vgiFdY zGFZ^MGU2hor!7*pr7g6ywCSbp8J7o1qcd~G@rajQ!6v&onRL%_-4g6KAs^hVdp1Fa z<5L3W0cN*p(e^k8^j{PHH}XW@W%~+58`kh}qg0u%Hp3J@%QLXRm#V5^n!hKY`=_5< z^;0vjxRy;hyETaExeTDG4@t|R>#Hu=7PpXxFduAf0EUrT6w9V@1;gFgp0p zf9u8j^gRVPX-376Z|@lYhG4h94AJ%dr9`o%YR~Y&_FZ2mX(#JiS|gf2flAsMIZLHC zboWYuf9cLFR%((V-*B3)P6e9LxrlO)5Sq#{9vOZ^Yyv+Ae0 zTQX5Z{FM#Twh5l-z#lVN*TB{fjYhT2W_Vuy&8sMZ&Bfm-ycK#iM9TWN^xNt6CQcr)KDYK*q1&k4X(v0CZooDfx zsk^&*>S7a9p%FJf9ChB)8J{vr5_kGbr{A>8^h4~vFeA_C? zWO&Y>R}>Z%wdHNm5LtYz)iGq?T{mvUp;*?O9%h1{L!wd<(b?3Mvbk~)kYDW}40!TZ zmQw03$(dBGB+)ccXg(w5gZ^R5%0wv4f(I||s$sV1X5#jbL@?Cj_hL2g<-dzgD0ebHS!2)G?$+cAVpDR5)?BlwVA0M~v^q9-l3 z-5_v$MLjy;xNl?_D!dS4^>`c?#HO=2w@ER}G8ppLCSC5~#h#gbGvErR>IyJ;Zc#|B zTf@rHafYVFiK;uo1s`&q(RX~#gS9fmYE0jKK5WzGI&X7~_D{+`{pfxMX^wcF_Sls_ zPyF?3YFpk~C%Z;Z`mm;<@^#whrD$gtmo`t+Uj~B}cgZR?#2-6G@lS5Mf#It$EMJS8}r(C5=Lzo-g5y({oyy~!b`ZHeswF&@{0Y7O!a>5Q(67_`fEl2 z^DI3>lCNIU)ELcVXP>fGqiW-{(G!DIECJ0B#3{w+OJVmUW=>N1Y^VB3Kl0hfHZL_Su!wV!v1&N?%GBo~-{$v+UNgqFD zY5Uvr9~J&9%U-HqXLkagvYRfywEykG;FSiL^eUflTb+X| zQ7>4R6wj53KdDLhB||lOsOB&8IiE9gE*tpju>27MNH!PyI%-~+46ZhN zCN`P3B5skW`Bc$eQL!s;a=sBrc(m1wbzt<0*Y~5TIc-)TEWEo14aQe`tmt`I|S2W3B#~ zZT`djcG3d0)nWqs3AkpF0(Zpa61j3k6DGFpJ=kblK)ZT!bE@2d`7CKj`5JVZQRBH_)Lq(+j8Aog zTg1Ht!G5jxQQVm5Suki}onrR3qU)n>MH#^1k6PA3J;p_r*vDqEZAiFHaL21ZzkQDE zw>~uWGWt)8C%fQ%At8F6?(z#0bMy7cdEXgTi$qJS9rLpXnJ{llZTkAvt|FDyJjpTO z;Z+@#w4uq8EVxI)Qdqe!Ba#lf@+3WI<5A_J2*;mZ{FL)|Gw=&^AOB{6bQkZ^LS|Q9 z_?ejM@?-3cbS!kAJuQP|IhR5(#|(R~>51dxc0|i;9}Sr&=#OJ2Km3kTsyOy>v=crgdo{&P>Qgh@k7G6x+}Z501}Iro7x z{^3H(%>+I5$;PYb@ewVDQphBOHA?i6^#ygtdZe6h{$|4FaP z1{CP-TAa!vBKn}JIQY**=B~(~ zSnbAPYXKGsXWCO?U21;H1USf0X%p-b0g+cbQ~CLwUPo5#GIzvl@6;3*FJn*-b? z^+0^STz&CR3r_p+8y{e9+`M@Z#oaJD@0(4hrrM-&54=&vkPLU8n_Hjhsp4ndoN6WN ziifSYC!pf2Rn=Y&(*0raRtc9#)?&+()b*EcL)2F}7YyDZ7#15ZbS0Yf*>Iehl0s=c zhno0e{WkOAhMer}JLd`a=A+%xtW_&6`~~}Rrjrt;?aT7WKTTdeIJ|y^Bw{Gh=7Z>K z2D8!$DdfCW3~2-`KbHJ;heu@~uUTh2`%;TjL(_h=Wjw&NWxW_hG=A3egBjztnIgs< zW=PrS9%I?8;^Ju6@>~uIR;d`h{O9otolsnC(jfW_Uj0k>uOUzO%nVeFi>h#qzBg%i z45d>u(N%2XA9UdzB2n3VFqwuU#rFo2Vk-JJZ%D@%*!FJ&MNF)h&oS+;<$-`5dSDmo z;SG^Lzy12@JJRpJ!eIY5PkF%!@-$ThWKB#>so&#{o#e`4oSXt~i}#F;4Z2IZe{S1p z1@)F4uxXYjyDb6Cj-NoJs`ftCjOI#&s@rFu?7tFy{+GtEUkgYXO?*r95!Jgt_q>V1 zwP|R=U1W0Jd%A9N&i6gQ($bL6ZzGzSoHr+Vq;c{1sqrIw%NBJy=-PxHe&OWQ-uMg# zlQtj|nCyOTakBhT?xBxtb3t##*sVW*t&rsJogPN_Yu^mdML;)-EO8S44nd-~#1&aK z?y&LSxE$6l?!Q8#_?V6tf2^Af!7C!aP#k6>@+Qm9@AqV6eO z^Cp2YEVfI4$8W^&UKYL@$Rt&TENLJ`d{QoZaB@tj3K+*d94LIfE|l9V zmb%Cfg$07kInl7t_FJd9zKkOX90X~HPCaY5P43QL#LiZ;GyC z1~m?VFfVx3+TJ`z@>E@HD(M!cPxksNR>Uk1K+q#OT+Gzg5l=^|e(3c}OI?!g?6*D? z?zKJ7n@QXlt`W~5E;~y8kmlgPo4xlq8o+%v2aNf5|L~%p-elgA2L4PMJUOKnS?hjO z(kyzRW<_KvF$F7_&{+7kH3XgY4Gj zRQA5y6h`)oT*EX^zn!rp<%23vz{2}80=Wz z1Fr+RE`vRv*$Tx&XW#ZGPzEG^;dBd`h8wC4P%*t2&y(C30Lk8*sqfl_pMHB{Gkyyq z>(byxdjU5;{nbg|C4aCr*ePM33BV?kx-)EgFNSpM9V-{)v5kx~c;zVL6kh*OR@86l zND_e`(M8BWHyx%65VFqa@vRzR4s;pl*|UBo4@~J+Hx51UA(%E2(}m~>jxm})xcIEJ zs}c2NUveJk|0Tp^wo-y1GME{5mNSc~pOK53Au}2Ai6t6z&r0CaBwzajfXkG_kN_t7&e@4- zI&uG$cwt%e{R;RGl+_yc?Gn z9?f;#h(tZFWDzW?6}n6n=l!2i&UCZ956tI+P%O0@WiTU&&x?TvZF??D^ouPCuq$*s z0bQM4>+u7_H&S_@!eJBh*k<1Om$BT^491|YI7`{7igo!TtsPD&TLEf&_-=cuN93+*3_b)f3^1k9U8g|-K zi*3fd&*oxr)?mTagcl2ebS^j?omNSop$O5N&4ak5qG(Fh@h3J^Q*NI>6Nw}EJ1)^z zIXV^GS!%a{zapQ>+s@a|G3Ez@v%@Mjoh;V_iJMT*HRx7*`55}B|4?w=y`KaxhIdXX zddkQU=9*QBK;0TOxYJC7WaAyQ5`0#k8Duf0YEQ(^z)+!a<4a0oSaF71jlc){`e(qS zwl?4*tiQ4cgoYnSw7%$SH)iGjC6wKhnG;eT@!RXQ$jBRmGqZ551!&*LIsj73qjYh% z3{kPE5Z$wuHqZ}p?&agtX!oS>3e$m$k2GS>s#s~}mWGiMeRFcAc0`D#rTpGntJgo^ zrIXj0wpu&DTKZ4qmor9+zxueF8Mg_hJ}Yv4h^02Ysr*T+A#M6FalVTMUHb0L#P(jR zXoGlFlfqInDh9^N(Gi83vUB$&1;V~+@a2nfOy83M^J+I+b}YZ8^JzZu*pIm!GT}Fz zk`L5NPhJq^tl0u9*YeU+Xkfl@1f4M&Py2gjRl|u|g9yt^t3jfwt@Td#&`!&$w=R@d z;%Vu81#y{HlIVq!sRiCTJdyNog*Xher;S;KsP^G|rM@fi9{)#x+! zhRlSAG_qko{A&p$Iur~$LDozrM6DeKPxpV223hRTmdX6YO|?Pk+kd&Hqx*Dwa9V>B zl{-R94h9+R_k#Sl2_ieSb!yiR$E_VgfIkb+ZN(kZ?odwAK+wix!p^qPj>jVL&RO{v z?DtUdb z@FR2;3a_q3Qf$RJ^v1k4l`o2o`2+A-efW*UUh%Z)&|_h-_>W#&bGtC3N5{__VWoOz z4r5VFKj!#sgY;&;H@0pTS*kGjk2Tf@YvuMp)=lFw1t>wUzuH3gYCKkp|ad$s7bQIJ;nRk?mx~4!<(zh@Y|G|n_u$k+R$1dz zxWXHky^?uKP!m{sB@Zx+s(UC5$W=mDRo7EE@cx;J~S9J{smsQkXQ)tesfjv9jqaq*P%!B zmad$KlI!zwD^LVk!t$X`*i`&SI=LdnruGvoeK%#cnf0A8Ik9Djc~#c_pOAc%rSS

r5wFzD9RnJQkjDPk__X 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≺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

%~ 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%0D+OtS=Q-Li0+x7eLoe& zHNA@^iMPJ#SKcbq&(}Y^_{}`)KQ!X?_19(@yghk!0b486Izc2AG9YofIZpw#GpCOP zI;KUgπ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 qN8r0^^sU5l;Qve22 + {/* Children will be ignored */} + +``` + + +![Screenshot of and example in Observability using the no data configuration and using the corresponding list numbers to point out the UI elements that they adjust.](../assets/kibana_template_no_data_config.png) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 0fbd8a0b7b080..07fb6b1a96cb0 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -60,7 +60,7 @@ export type NoDataPageActionsProps = Record; export interface NoDataPageProps { /** - * Single name for the current solution + * Single name for the current solution, used to auto-generate the title, logo, description, and button label */ solution: string; /** @@ -68,17 +68,19 @@ export interface NoDataPageProps { */ logo?: string; /** - * The array of card configurations - */ - actions: NoDataPageActionsProps; - /** - * Link to docs for the whole solution + * Required to set the docs link for the whole solution */ docsLink: string; /** - * Replace the auto-generated page title (h1) + * Optionally replace the auto-generated page title (h1) */ pageTitle?: string; + /** + * An object of `NoDataPageActions` configurations with unique primary keys. + * Use `elasticAgent` or `beats` as the primary key for pre-configured cards of this type. + * Otherwise use a custom key that contains `EuiCard` props. + */ + actions: NoDataPageActionsProps; } export const NoDataPage: FunctionComponent = ({ From b3152c61285184edc708e2c8b187079a70a6e2bc Mon Sep 17 00:00:00 2001 From: Dave Snider Date: Wed, 11 Aug 2021 08:15:31 -0400 Subject: [PATCH 22/77] Only one link for solutions --- .../no_data_card/elastic_agent_card.tsx | 17 ++++---- .../no_data_card/elastic_beats_card.tsx | 24 ++++++------ .../no_data_page/no_data_card/index.scss | 9 +++++ .../public/no_data_page/no_data_page.tsx | 2 +- .../components/app/RumDashboard/RumHome.tsx | 9 +---- .../routing/templates/apm_main_template.tsx | 9 ++--- .../infra/public/pages/logs/page_template.tsx | 15 +++---- .../logs/stream/page_no_indices_content.tsx | 5 --- .../public/pages/metrics/page_template.tsx | 9 ----- .../public/pages/landing/index.tsx | 7 +--- .../public/pages/overview/index.tsx | 5 --- .../security_solution/common/constants.ts | 1 + .../components/overview_empty/index.test.tsx | 7 ---- .../components/overview_empty/index.tsx | 39 ++----------------- x-pack/plugins/uptime/public/routes.tsx | 9 ++--- 15 files changed, 51 insertions(+), 116 deletions(-) create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/index.scss diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx index 0d26e774ab1b1..78bf46f026336 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -14,6 +14,7 @@ import { CoreStart } from 'kibana/public'; import { EuiButton, EuiCard } from '@elastic/eui'; import { useKibana } from '../../context'; import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; +import './index.scss'; export type ElasticAgentCardProps = NoDataPageActions & { solution: string; @@ -39,15 +40,10 @@ export const ElasticAgentCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - + {button || i18n.translate('kibana-react.noDataPage.elasticAgentCard.buttonLabel', { - defaultMessage: 'Find an integration for {solution}', + defaultMessage: 'Find a {solution} integration', values: { solution }, })} @@ -56,14 +52,15 @@ export const ElasticAgentCard: FunctionComponent = ({ return ( = ({ +export type ElasticBeatsCardProps = NoDataPageActions & { + solution: string; +}; + +export const ElasticBeatsCard: FunctionComponent = ({ recommended, href = 'app/home#/tutorial', button, + solution, ...cardRest }) => { const { @@ -32,15 +38,11 @@ export const ElasticBeatsCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - + {button || i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { - defaultMessage: 'Setup Beats', + defaultMessage: 'Install Beats for {solution}', + values: { solution }, })} ); @@ -48,14 +50,14 @@ export const ElasticBeatsCard: FunctionComponent = ({ return ( = ({ } else if (actionsKeys[i] === 'beats') { return ( - + ); } else { diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 57ace1400746a..906bb276371f6 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -23,7 +23,7 @@ export const UX_LABEL = i18n.translate('xpack.apm.ux.title', { }); export function RumHome() { - const { observability } = useApmPluginContext(); + const { core, observability } = useApmPluginContext(); const PageTemplateComponent = observability.navigation.PageTemplate; const { isSmall, isXXL } = useBreakPoints(); @@ -38,13 +38,8 @@ export function RumHome() { solution: 'Observability', pageTitle: 'Set up User Experience Tracking for Observability!', actions: { - elasticAgent: { - href: 'integrations/detail/apm-0.3.0/overview', - recommended: false, - }, beats: { - href: `home#/tutorial/apm`, - recommended: true, + href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), }, }, docsLink: '#', diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index a959ad6699a06..b4fff28ea2cb7 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -33,6 +33,8 @@ export function ApmMainTemplate({ pageHeader?: EuiPageHeaderProps; children: React.ReactNode; } & KibanaPageTemplateProps) { + const { http } = useKibana().services; + const basePath = http!.basePath.get(); const { services } = useKibana(); const ObservabilityPageTemplate = @@ -44,13 +46,8 @@ export function ApmMainTemplate({ solution: 'Observability', pageTitle: 'Set up APM for Observability!', actions: { - elasticAgent: { - href: '/integrations/detail/apm-0.3.0/overview', - recommended: false, - }, beats: { - href: `/app/home#/tutorial/apm`, - recommended: true, + href: basePath + `/app/home#/tutorial/apm`, }, }, docsLink: '#', diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index 259e7087bca08..fae53a55322df 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -9,7 +9,10 @@ import React from 'react'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { useLogSourceContext } from '../../containers/logs/log_source'; -import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; +import { + KibanaPageTemplateProps, + useKibana, +} from '../../../../../../src/plugins/kibana_react/public'; export const LogsPageTemplate: React.FC = ( pageTemplateProps @@ -22,6 +25,9 @@ export const LogsPageTemplate: React.FC = ( }, } = useKibanaContextForPlugin(); + const { http } = useKibana().services; + const basePath = http!.basePath.get(); + const { sourceStatus } = useLogSourceContext(); const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = sourceStatus?.logIndexStatus !== 'missing' @@ -29,13 +35,8 @@ export const LogsPageTemplate: React.FC = ( : { solution: 'Observability', actions: { - elasticAgent: { - href: 'app/integrations/browse', - recommended: false, - }, beats: { - href: `app/home#/tutorial_directory/logging`, - recommended: true, + href: basePath + `/app/home#/tutorial_directory/logging`, }, }, docsLink: '#', diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx index 4f54c0542cb62..f43d89e0bd80d 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx @@ -20,13 +20,8 @@ export const LogsPageNoIndicesContent = () => { noDataConfig={{ solution: 'Observability', actions: { - elasticAgent: { - href: 'app/integrations/browse', - recommended: false, - }, beats: { ...tutorialLinkProps, - recommended: true, }, }, docsLink: '#', diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index 16c1a37294ccf..38483636f78ad 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -28,10 +28,6 @@ export const MetricsPageTemplate: React.FC = hash: '/tutorial_directory/metrics', }); - const integrationLinkProps = useLinkProps({ - app: 'integrations/browse', - }); - const { metricIndicesExist } = useContext(Source.Context); const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = metricIndicesExist ? undefined @@ -39,13 +35,8 @@ export const MetricsPageTemplate: React.FC = solution: 'Observability', pageTitle: 'Set up Metrics for Observability!', actions: { - elasticAgent: { - ...integrationLinkProps, - recommended: false, - }, beats: { ...tutorialLinkProps, - recommended: true, }, }, docsLink: '#', diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index cf769a2a40fbc..2c8fa4f9f4e1c 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -46,13 +46,8 @@ export function LandingPage() { const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { solution: 'Observability', actions: { - elasticAgent: { - href: 'app/integrations/browse', - recommended: false, - }, beats: { - href: `app/home#/tutorial_directory/logging`, - recommended: true, + href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), }, }, docsLink: '#', diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index bb97b186eb097..8d7400eeb7c5a 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -79,13 +79,8 @@ export function OverviewPage({ routeParams }: Props) { : { solution: 'Observability', actions: { - elasticAgent: { - href: 'app/integrations/browse', - recommended: false, - }, beats: { href: `app/home#/tutorial_directory/logging`, - recommended: true, }, }, docsLink: '#', diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 47e3b5b3ea364..281d70d71933d 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -16,6 +16,7 @@ export const APP_ICON = 'securityAnalyticsApp'; export const APP_ICON_SOLUTION = 'logoSecurity'; export const APP_PATH = `/app/security`; export const ADD_DATA_PATH = `/app/home#/tutorial_directory/security`; +export const ADD_INTEGRATION_PATH = `app/integrations?category=security`; export const DEFAULT_BYTES_FORMAT = 'format:bytes:defaultPattern'; export const DEFAULT_DATE_FORMAT = 'dateFormat'; export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index 2d21ec9565476..2841d499b0c6e 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -43,13 +43,6 @@ describe('OverviewEmpty', () => { test('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ - beats: { - description: - 'Lightweight Beats can send data from hundreds or thousands of machines and systems', - fill: false, - label: 'Add data with Beats', - url: '/app/home#/tutorial_directory/security', - }, elasticAgent: { description: 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index d3be3fb6cd122..a9b26f418d4b5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -7,18 +7,8 @@ import React, { useMemo } from 'react'; import { omit } from 'lodash/fp'; -import { createStructuredSelector } from 'reselect'; - -import * as i18nCommon from '../../../common/translations'; import { useKibana } from '../../../common/lib/kibana'; -import { ADD_DATA_PATH } from '../../../../common/constants'; -import { - useEndpointSelector, - useIngestUrl, -} from '../../../management/pages/endpoint_hosts/view/hooks'; -import { useNavigateToAppEventHandler } from '../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; -import { CreateStructuredSelector } from '../../../common/store'; -import { endpointPackageVersion as useEndpointPackageVersion } from '../../../management/pages/endpoint_hosts/store/selectors'; +import { ADD_INTEGRATION_PATH } from '../../../../common/constants'; import { useUserPrivileges } from '../../../common/components/user_privileges'; import { @@ -29,38 +19,15 @@ import { const OverviewEmptyComponent: React.FC = () => { const { http, docLinks } = useKibana().services; const basePath = http.basePath.get(); - const selector = (createStructuredSelector as CreateStructuredSelector)({ - endpointPackageVersion: useEndpointPackageVersion, - }); - const { endpointPackageVersion } = useEndpointSelector(selector); - const { url: ingestUrl } = useIngestUrl(''); - - const endpointIntegrationUrlPath = endpointPackageVersion - ? `/endpoint-${endpointPackageVersion}/add-integration` - : ''; - const endpointIntegrationUrl = `/integrations${endpointIntegrationUrlPath}`; - const handleEndpointClick = useNavigateToAppEventHandler('fleet', { - path: endpointIntegrationUrl, - }); const canAccessFleet = useUserPrivileges().endpointPrivileges.canAccessFleet; const emptyPageActions: NoDataPageActionsProps = useMemo( () => ({ elasticAgent: { - href: ingestUrl, - recommended: true, - }, - beats: { - href: `${basePath}${ADD_DATA_PATH}`, - }, - endpoint: { - title: i18nCommon.EMPTY_ACTION_ENDPOINT, - href: endpointIntegrationUrl, - description: i18nCommon.EMPTY_ACTION_ENDPOINT_DESCRIPTION, - onClick: handleEndpointClick, + href: `${basePath}${ADD_INTEGRATION_PATH}`, }, }), - [basePath, ingestUrl, endpointIntegrationUrl, handleEndpointClick] + [basePath] ); const emptyPageIngestDisabledActions = useMemo( diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index aaa5eaf8e0002..5863636bfdac5 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -153,6 +153,8 @@ export const PageRouter: FC = () => { flex-wrap: wrap; } `; + const { http } = useKibana().services; + const basePath = http!.basePath.get(); const { data } = useSelector(indexStatusSelector); const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; @@ -160,13 +162,8 @@ export const PageRouter: FC = () => { solution: 'Observability', pageTitle: 'Set up Uptime for Observability!', actions: { - elasticAgent: { - href: 'integrations/detail/synthetics-0.2.1/overview', - recommended: false, - }, beats: { - href: `home#/tutorial/uptimeMonitors`, - recommended: true, + href: basePath + `/app/home#/tutorial/uptimeMonitors`, }, }, docsLink: '#', From 23ad9acd8e83ec31e4b71d14c4767b7f6db22bba Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 11:32:38 -0400 Subject: [PATCH 23/77] Fix double templates in Uptime --- .../synthetics/check_steps/steps_list.tsx | 2 +- .../pages/synthetics/synthetics_checks.tsx | 18 +++++--- x-pack/plugins/uptime/public/routes.tsx | 43 ++++++++++++------- 3 files changed, 40 insertions(+), 23 deletions(-) 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 0da6f034e53bb..9f2e5d609e867 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 @@ -142,7 +142,7 @@ export const StepsList = ({ data, error, loading }: Props) => { return ( <> - +

{statusMessage( steps.reduce(reduceStepStatus, { failed: 0, skipped: 0, succeeded: 0 }), diff --git a/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx b/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx index fe41e72fa4c48..778c6cd280ce3 100644 --- a/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx +++ b/x-pack/plugins/uptime/public/pages/synthetics/synthetics_checks.tsx @@ -32,12 +32,18 @@ export const SyntheticsCheckSteps: React.FC = () => { return ( : null, - ], - }} + pageHeader={ + details?.journey?.monitor + ? { + pageTitle: details?.journey?.monitor.name || details?.journey?.monitor.id, + rightSideItems: [ + details ? ( + + ) : null, + ], + } + : undefined + } > {(!steps || steps.length === 0) && !loading && } diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index 5863636bfdac5..de9685be06c32 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -158,16 +158,20 @@ export const PageRouter: FC = () => { const { data } = useSelector(indexStatusSelector); const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { - solution: 'Observability', - pageTitle: 'Set up Uptime for Observability!', - actions: { - beats: { - href: basePath + `/app/home#/tutorial/uptimeMonitors`, - }, - }, - docsLink: '#', - }; + const noDataPage = ( + + ); return ( @@ -177,12 +181,19 @@ export const PageRouter: FC = () => {
- - - + + {/* Render the No Data config if there is no data */} + {noDataInfo && noDataPage} + + {/* Apply the template component, only if `pageHeader` is defined in the route */} + {!noDataInfo && pageHeader && ( + + + + )} + + {/* Otherwise the template should be in the route page itself */} + {!noDataInfo && !pageHeader && }
) From 6fe3a393830692112cde0ee850ce26b41c275977 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 11:54:21 -0400 Subject: [PATCH 24/77] Move styles to page contents Sass file and only add min width when there is one card --- .../no_data_page/no_data_card/elastic_agent_card.tsx | 2 -- .../no_data_page/no_data_card/elastic_beats_card.tsx | 2 -- .../public/no_data_page/no_data_card/index.scss | 9 --------- .../kibana_react/public/no_data_page/no_data_page.scss | 7 +++++++ .../kibana_react/public/no_data_page/no_data_page.tsx | 10 +++++++--- 5 files changed, 14 insertions(+), 16 deletions(-) delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/index.scss diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx index 78bf46f026336..68b2eea771433 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx @@ -14,7 +14,6 @@ import { CoreStart } from 'kibana/public'; import { EuiButton, EuiCard } from '@elastic/eui'; import { useKibana } from '../../context'; import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; -import './index.scss'; export type ElasticAgentCardProps = NoDataPageActions & { solution: string; @@ -52,7 +51,6 @@ export const ElasticAgentCard: FunctionComponent = ({ return ( = ({ return ( = ({ return Object.values(sortedData).map((action, i) => { if (actionsKeys[i] === 'elasticAgent') { return ( - + ); } else if (actionsKeys[i] === 'beats') { return ( - + ); } else { return ( - + ); From a5defa0adb9cf1881a3c220405909d214f88fa6c Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 12:10:09 -0400 Subject: [PATCH 25/77] cleanup --- src/plugins/kibana_react/public/no_data_page/no_data_page.tsx | 1 - x-pack/plugins/uptime/public/routes.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index b8442d8e60784..6a85a3f112692 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -20,7 +20,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import classNames from 'classnames'; import { KibanaPageTemplateProps, KibanaPageTemplateSolutionNavAvatar } from '../page_template'; import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index de9685be06c32..124f2b5239b94 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -27,7 +27,7 @@ import { SyntheticsCheckSteps } from './pages/synthetics/synthetics_checks'; import { ClientPluginsStart } from './apps/plugin'; import { MonitorPageTitle, MonitorPageTitleContent } from './components/monitor/monitor_title'; import { UptimeDatePicker } from './components/common/uptime_date_picker'; -import { KibanaPageTemplateProps, useKibana } from '../../../../src/plugins/kibana_react/public'; +import { useKibana } from '../../../../src/plugins/kibana_react/public'; import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; From 3e6d6564fe94c3409a2e554c8fdcae24347d977f Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 12:49:54 -0400 Subject: [PATCH 26/77] Adding tests to template. Only shallow rendering right now because of `http` service. --- .../__snapshots__/no_data_page.test.tsx.snap | 141 +++------------- .../elastic_agent_card.test.tsx.snap | 29 ++++ .../elastic_beats_card.test.tsx.snap | 29 ++++ .../__snapshots__/no_data_card.test.tsx.snap | 156 ++++++++++++++++++ .../no_data_card/elastic_agent_card.test.tsx | 43 +++-- .../no_data_card/elastic_beats_card.test.tsx | 36 ++-- .../no_data_card/no_data_card.test.tsx | 42 +++-- .../no_data_card/no_data_card.tsx | 12 +- .../public/no_data_page/no_data_page.test.tsx | 21 --- .../public/no_data_page/no_data_page.tsx | 1 - .../__snapshots__/page_template.test.tsx.snap | 85 ++++++++++ .../page_template/page_template.test.tsx | 32 +++- 12 files changed, 428 insertions(+), 199 deletions(-) create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap create mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap diff --git a/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap index b50cf9f0127cf..b124c818d52f7 100644 --- a/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap +++ b/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap @@ -1,128 +1,22 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`NoDataPage render 1`] = ` - -
- -
+

, @@ -170,6 +64,7 @@ exports[`NoDataPage render 1`] = ` } > - + - + , @@ -214,5 +113,5 @@ exports[`NoDataPage render 1`] = ` />

- +

`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap new file mode 100644 index 0000000000000..25e6588e2a3de --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ElasticAgentCard props button 1`] = ` + +`; + +exports[`ElasticAgentCard props href 1`] = ` + +`; + +exports[`ElasticAgentCard props recommended 1`] = ` + +`; + +exports[`ElasticAgentCard renders 1`] = ` + +`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap new file mode 100644 index 0000000000000..0963e33b1483b --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap @@ -0,0 +1,29 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ElasticBeatsCard props button 1`] = ` + +`; + +exports[`ElasticBeatsCard props href 1`] = ` + +`; + +exports[`ElasticBeatsCard props recommended 1`] = ` + +`; + +exports[`ElasticBeatsCard renders 1`] = ` + +`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap new file mode 100644 index 0000000000000..a8232c209ed73 --- /dev/null +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap @@ -0,0 +1,156 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`NoDataCard props button 1`] = ` +
+
+ + Card title + +
+

+ Description +

+
+
+ +
+`; + +exports[`NoDataCard props href 1`] = ` +
+`; + +exports[`NoDataCard props recommended 1`] = ` +
+
+ + Card title + +
+

+ Description +

+
+
+ + + Recommended + + +
+`; + +exports[`NoDataCard renders 1`] = ` +
+
+ + Card title + +
+

+ Description +

+
+
+
+`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx index 8451fcb516b17..9b042ccef5737 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx @@ -6,28 +6,43 @@ * Side Public License, v 1. */ -import React from 'react'; import { shallow } from 'enzyme'; +import React from 'react'; import { ElasticAgentCard } from './elastic_agent_card'; -jest.mock('../../context', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { capabilities: { advancedSettings: { show: true, save: true } } }, - notifications: { toast: { addSuccess: jest.fn() } }, - }, - }), -})); +// jest.mock('../../context', () => ({ +// useKibana: jest.fn().mockReturnValue({ +// services: { +// application: { capabilities: { advancedSettings: { show: true, save: true } } }, +// notifications: { toast: { addSuccess: jest.fn() } }, +// }, +// }), +// })); -jest.mock('../../ui_settings', () => ({ - useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), -})); - -afterEach(() => jest.clearAllMocks()); +// jest.mock('../../ui_settings', () => ({ +// useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), +// })); describe('ElasticAgentCard', () => { test('renders', () => { const component = shallow(); expect(component).toMatchSnapshot(); }); + + describe('props', () => { + test('recommended', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('button', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('href', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + }); }); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx index 38f1f696c3c25..e48d4b61c19b5 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx @@ -6,28 +6,30 @@ * Side Public License, v 1. */ -import React from 'react'; import { shallow } from 'enzyme'; +import React from 'react'; import { ElasticBeatsCard } from './elastic_beats_card'; -jest.mock('../../context', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { capabilities: { advancedSettings: { show: true, save: true } } }, - notifications: { toast: { addSuccess: jest.fn() } }, - }, - }), -})); - -jest.mock('../../ui_settings', () => ({ - useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), -})); - -afterEach(() => jest.clearAllMocks()); - describe('ElasticBeatsCard', () => { test('renders', () => { - const component = shallow(); + const component = shallow(); expect(component).toMatchSnapshot(); }); + + describe('props', () => { + test('recommended', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('button', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('href', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + }); }); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx index 469b6673b45de..a809ede2dc617 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx @@ -6,28 +6,36 @@ * Side Public License, v 1. */ +import { render } from 'enzyme'; import React from 'react'; -import { shallow } from 'enzyme'; import { NoDataCard } from './no_data_card'; -jest.mock('../../context', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { capabilities: { advancedSettings: { show: true, save: true } } }, - notifications: { toast: { addSuccess: jest.fn() } }, - }, - }), -})); +describe('NoDataCard', () => { + test('renders', () => { + const component = render(); + expect(component).toMatchSnapshot(); + }); -jest.mock('../../ui_settings', () => ({ - useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), -})); + describe('props', () => { + test('recommended', () => { + const component = render( + + ); + expect(component).toMatchSnapshot(); + }); -afterEach(() => jest.clearAllMocks()); + test('button', () => { + const component = render( + + ); + expect(component).toMatchSnapshot(); + }); -describe('ElasticAgentCard', () => { - test('renders', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); + test('href', () => { + const component = render( + + ); + expect(component).toMatchSnapshot(); + }); }); }); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx index 02c0c3f4640b3..0be85f8c8ed1c 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx @@ -9,9 +9,12 @@ /* eslint-disable @elastic/eui/href-or-on-click */ import React, { FunctionComponent } from 'react'; -import { EuiButton, EuiCard } from '@elastic/eui'; +import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; +// Custom cards require all the props the EuiCard does +type NoDataCard = EuiCardProps & NoDataPageActions; + export const NoDataCard: FunctionComponent = ({ recommended, button, @@ -21,12 +24,7 @@ export const NoDataCard: FunctionComponent = ({ typeof button !== 'string' ? ( button ) : ( - + {button} ); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx index 7eec89cb15378..59d6e8280af98 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx @@ -10,27 +10,6 @@ import React from 'react'; import { NoDataPage } from './no_data_page'; import { shallowWithIntl } from '@kbn/test/jest'; -// jest.mock('../../app_links', () => ({ -// RedirectAppLinks: jest.fn((element: JSX.Element) => element), -// })); - -// jest.mock('../../context', () => ({ -// useKibana: jest.fn().mockReturnValue({ -// services: { -// application: { capabilities: { advancedSettings: { show: true, save: true } } }, -// notifications: { toast: { addSuccess: jest.fn() } }, -// }, -// }), -// })); - -// jest.mock('../../ui_settings', () => ({ -// useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), -// })); - -// afterEach(() => jest.clearAllMocks()); - -// const addBasePathMock = jest.fn((path: string) => (path ? path : 'path')); - describe('NoDataPage', () => { test('render', () => { const component = shallowWithIntl( diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx index 6a85a3f112692..2db6f095729d1 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx @@ -89,7 +89,6 @@ export const NoDataPage: FunctionComponent = ({ actions, docsLink, pageTitle, - ...rest }) => { // Convert obj data into an iterable array const entries = Object.entries(actions); diff --git a/src/plugins/kibana_react/public/page_template/__snapshots__/page_template.test.tsx.snap b/src/plugins/kibana_react/public/page_template/__snapshots__/page_template.test.tsx.snap index 9ad2bd73674bd..d90daa33d1686 100644 --- a/src/plugins/kibana_react/public/page_template/__snapshots__/page_template.test.tsx.snap +++ b/src/plugins/kibana_react/public/page_template/__snapshots__/page_template.test.tsx.snap @@ -2,6 +2,7 @@ exports[`KibanaPageTemplate render basic template 1`] = ` `; +exports[`KibanaPageTemplate render noDataContent 1`] = ` + + } + pageSideBarProps={ + Object { + "className": "kbnPageTemplate__pageSideBar", + "paddingSize": "none", + } + } + restrictWidth={950} + template="centeredBody" +> + + +`; + exports[`KibanaPageTemplate render solutionNav 1`] = ` { test('render default empty prompt', () => { const component = shallow( @@ -126,6 +136,26 @@ describe('KibanaPageTemplate', () => { expect(component).toMatchSnapshot(); }); + test('render noDataContent', () => { + const component = shallow( + + ); + expect(component).toMatchSnapshot(); + }); + test('render sidebar classes', () => { const component = shallow( Date: Wed, 11 Aug 2021 13:01:50 -0400 Subject: [PATCH 27/77] Removing a few hard-coded checks to test tests --- .../components/app/RumDashboard/RumHome.tsx | 24 +++++++++-------- .../routing/templates/apm_main_template.tsx | 26 ++++++++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 906bb276371f6..4d3b1852f64ee 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -34,21 +34,23 @@ export function RumHome() { const { sharedData: { totalPageViews }, } = useContext(CsmSharedContext); - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { - solution: 'Observability', - pageTitle: 'Set up User Experience Tracking for Observability!', - actions: { - beats: { - href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), - }, - }, - docsLink: '#', - }; + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = totalPageViews + ? { + solution: 'Observability', + pageTitle: 'Set up User Experience Tracking for Observability!', + actions: { + beats: { + href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), + }, + }, + docsLink: '#', + } + : undefined; return ( 0 ? undefined : noDataConfig} + noDataConfig={noDataConfig} pageHeader={ isXXL ? { diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index b4fff28ea2cb7..d09c03942ed7f 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -41,22 +41,24 @@ export function ApmMainTemplate({ services.observability.navigation.PageTemplate; // TODO: NEEDS A DATA CHECK - const hasData = false; - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { - solution: 'Observability', - pageTitle: 'Set up APM for Observability!', - actions: { - beats: { - href: basePath + `/app/home#/tutorial/apm`, - }, - }, - docsLink: '#', - }; + const hasData = true; + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !hasData + ? { + solution: 'Observability', + pageTitle: 'Set up APM for Observability!', + actions: { + beats: { + href: basePath + `/app/home#/tutorial/apm`, + }, + }, + docsLink: '#', + } + : undefined; // TODO: GET A CHECK return ( ], From fbf326713d551f99671c7167686f17e4f06ecce8 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 14:50:29 -0400 Subject: [PATCH 28/77] Actually fix tests for cards --- .../elastic_agent_card.test.tsx.snap | 74 ++++++++++++++++--- .../elastic_beats_card.test.tsx.snap | 71 +++++++++++++++--- .../no_data_card/elastic_agent_card.test.tsx | 21 +++--- .../no_data_card/elastic_beats_card.test.tsx | 10 +++ 4 files changed, 142 insertions(+), 34 deletions(-) diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap index 25e6588e2a3de..6c9c18d632ff1 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap @@ -1,29 +1,81 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ElasticAgentCard props button 1`] = ` - + Button + + } + href="app/integrations/browse" + image="httpPrepend" + paddingSize="l" + title="Add a Solution integration" /> `; exports[`ElasticAgentCard props href 1`] = ` - + Button + + } href="#" - solution="Solution" + image="httpPrepend" + paddingSize="l" + title="Add a Solution integration" /> `; exports[`ElasticAgentCard props recommended 1`] = ` - + Find a Solution integration + + } + href="app/integrations/browse" + image="httpPrepend" + paddingSize="l" + title="Add a Solution integration" /> `; exports[`ElasticAgentCard renders 1`] = ` - + Find a Solution integration + + } + href="app/integrations/browse" + image="httpPrepend" + paddingSize="l" + title="Add a Solution integration" /> `; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap index 0963e33b1483b..1146e4f676eb6 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap @@ -1,29 +1,78 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`ElasticBeatsCard props button 1`] = ` - + Button + + } + href="app/home#/tutorial" + image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" + paddingSize="l" + title="Add data with Beats" /> `; exports[`ElasticBeatsCard props href 1`] = ` - + Button + + } href="#" - solution="Solution" + image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" + paddingSize="l" + title="Add data with Beats" /> `; exports[`ElasticBeatsCard props recommended 1`] = ` - + Install Beats for Solution + + } + href="app/home#/tutorial" + image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" + paddingSize="l" + title="Add data with Beats" /> `; exports[`ElasticBeatsCard renders 1`] = ` - + Install Beats for Solution + + } + href="app/home#/tutorial" + image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" + paddingSize="l" + title="Add data with Beats" /> `; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx index 9b042ccef5737..13e5f08af6b95 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx @@ -10,18 +10,15 @@ import { shallow } from 'enzyme'; import React from 'react'; import { ElasticAgentCard } from './elastic_agent_card'; -// jest.mock('../../context', () => ({ -// useKibana: jest.fn().mockReturnValue({ -// services: { -// application: { capabilities: { advancedSettings: { show: true, save: true } } }, -// notifications: { toast: { addSuccess: jest.fn() } }, -// }, -// }), -// })); - -// jest.mock('../../ui_settings', () => ({ -// useUiSetting$: jest.fn().mockReturnValue(['path-to-default-route', jest.fn()]), -// })); +jest.mock('../../context', () => ({ + ...jest.requireActual('../../context'), + useKibana: jest.fn().mockReturnValue({ + services: { + http: { basePath: { prepend: jest.fn((path: string) => (path ? path : 'path')) } }, + uiSettings: { get: jest.fn() }, + }, + }), +})); describe('ElasticAgentCard', () => { test('renders', () => { diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx index e48d4b61c19b5..eba8f208842cd 100644 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx +++ b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx @@ -10,6 +10,16 @@ import { shallow } from 'enzyme'; import React from 'react'; import { ElasticBeatsCard } from './elastic_beats_card'; +jest.mock('../../context', () => ({ + ...jest.requireActual('../../context'), + useKibana: jest.fn().mockReturnValue({ + services: { + http: { basePath: { prepend: jest.fn((path: string) => (path ? path : 'path')) } }, + uiSettings: { get: jest.fn() }, + }, + }), +})); + describe('ElasticBeatsCard', () => { test('renders', () => { const component = shallow(); From 20b0e4e4fb9dfdef77dffcd38996a5ccf8e4c669 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 11 Aug 2021 15:03:48 -0400 Subject: [PATCH 29/77] i18n --- .../translations/translations/ja-JP.json | 6 --- .../translations/translations/zh-CN.json | 44 ++++++++----------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index d805f68db9870..29a9368552bc9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11798,9 +11798,7 @@ "xpack.infra.homePage.documentTitle": "メトリック", "xpack.infra.homePage.inventoryTabTitle": "インベントリ", "xpack.infra.homePage.metricsExplorerTabTitle": "メトリックエクスプローラー", - "xpack.infra.homePage.noMetricsIndicesDescription": "追加しましょう!", "xpack.infra.homePage.noMetricsIndicesInstructionsActionLabel": "セットアップの手順を表示", - "xpack.infra.homePage.noMetricsIndicesTitle": "メトリックインデックスがないようです。", "xpack.infra.homePage.settingsTabTitle": "設定", "xpack.infra.homePage.toolbar.kqlSearchFieldPlaceholder": "インフラストラクチャデータを検索… (例:host.name:host-1) ", "xpack.infra.homePage.toolbar.showingLastOneMinuteDataText": "指定期間のデータの最後の{duration}", @@ -12072,9 +12070,6 @@ "xpack.infra.logSourceErrorPage.resolveLogSourceConfigurationErrorTitle": "ログソース構成を解決できませんでした", "xpack.infra.logSourceErrorPage.savedObjectNotFoundErrorMessage": "{savedObjectType}:{savedObjectId}が見つかりませんでした", "xpack.infra.logSourceErrorPage.tryAgainButtonLabel": "再試行", - "xpack.infra.logsPage.noLoggingIndicesDescription": "追加しましょう!", - "xpack.infra.logsPage.noLoggingIndicesInstructionsActionLabel": "セットアップの手順を表示", - "xpack.infra.logsPage.noLoggingIndicesTitle": "ログインデックスがないようです。", "xpack.infra.logsPage.toolbar.kqlSearchFieldPlaceholder": "ログエントリーを検索中… (例:host.name:host-1) ", "xpack.infra.logStream.kqlErrorTitle": "無効なKQL式", "xpack.infra.logStream.unknownErrorTitle": "エラーが発生しました", @@ -21414,7 +21409,6 @@ "xpack.securitySolution.editDataProvider.valueLabel": "値", "xpack.securitySolution.editDataProvider.valuePlaceholder": "値", "xpack.securitySolution.effectedPolicySelect.viewPolicyLinkLabel": "ポリシーを表示", - "xpack.securitySolution.emptyMessage": "Elastic Securityは無料かつオープンのElastic SIEMに、Endpoint Securityを搭載。脅威の防御と検知、脅威への対応を支援します。開始するには、セキュリティソリューション関連データをElastic Stackに追加する必要があります。詳細については、以下をご覧ください ", "xpack.securitySolution.emptyString.emptyStringDescription": "空の文字列", "xpack.securitySolution.endpoint.actions.agentDetails": "エージェント詳細を表示", "xpack.securitySolution.endpoint.actions.agentPolicy": "エージェントポリシーを表示", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1f13b453c2c6f..e704fb3598d25 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -1886,6 +1886,25 @@ "expressions.functions.varset.val.help": "指定变量的值。如果未指定,则使用输入上下文。", "expressions.types.number.fromStringConversionErrorMessage": "无法将“{string}”字符串的类型转换为数字", "flot.pie.unableToDrawLabelsInsideCanvasErrorMessage": "无法用画布内包含的标签绘制饼图", + "flot.time.aprLabel": "四月", + "flot.time.augLabel": "八月", + "flot.time.decLabel": "十二月", + "flot.time.febLabel": "二月", + "flot.time.friLabel": "周五", + "flot.time.janLabel": "一月", + "flot.time.julLabel": "七月", + "flot.time.junLabel": "六月", + "flot.time.marLabel": "三月", + "flot.time.mayLabel": "五月", + "flot.time.monLabel": "周一", + "flot.time.novLabel": "十一月", + "flot.time.octLabel": "十月", + "flot.time.satLabel": "周六", + "flot.time.sepLabel": "九月", + "flot.time.sunLabel": "周日", + "flot.time.thuLabel": "周四", + "flot.time.tueLabel": "周二", + "flot.time.wedLabel": "周三", "fieldFormats.advancedSettings.shortenFieldsText": "缩短长字段,例如,不显示 foo.bar.baz,而显示 f.b.baz", "fieldFormats.advancedSettings.shortenFieldsTitle": "缩短字段", "fieldFormats.advancedSettings.format.bytesFormat.numeralFormatLinkText": "数值格式", @@ -1961,25 +1980,6 @@ "fieldFormats.url.types.audio": "音频", "fieldFormats.url.types.img": "图像", "fieldFormats.url.types.link": "链接", - "flot.time.aprLabel": "四月", - "flot.time.augLabel": "八月", - "flot.time.decLabel": "十二月", - "flot.time.febLabel": "二月", - "flot.time.friLabel": "周五", - "flot.time.janLabel": "一月", - "flot.time.julLabel": "七月", - "flot.time.junLabel": "六月", - "flot.time.marLabel": "三月", - "flot.time.mayLabel": "五月", - "flot.time.monLabel": "周一", - "flot.time.novLabel": "十一月", - "flot.time.octLabel": "十月", - "flot.time.satLabel": "周六", - "flot.time.sepLabel": "九月", - "flot.time.sunLabel": "周日", - "flot.time.thuLabel": "周四", - "flot.time.tueLabel": "周二", - "flot.time.wedLabel": "周三", "home.addData.sampleDataButtonLabel": "试用我们的样例数据", "home.addData.sectionTitle": "采集您的数据", "home.breadcrumbs.addDataTitle": "添加数据", @@ -12120,9 +12120,7 @@ "xpack.infra.homePage.documentTitle": "指标", "xpack.infra.homePage.inventoryTabTitle": "库存", "xpack.infra.homePage.metricsExplorerTabTitle": "指标浏览器", - "xpack.infra.homePage.noMetricsIndicesDescription": "让我们添加一些!", "xpack.infra.homePage.noMetricsIndicesInstructionsActionLabel": "查看设置说明", - "xpack.infra.homePage.noMetricsIndicesTitle": "似乎您没有任何指标索引。", "xpack.infra.homePage.settingsTabTitle": "设置", "xpack.infra.homePage.toolbar.kqlSearchFieldPlaceholder": "搜索基础设施数据……(例如 host.name:host-1)", "xpack.infra.homePage.toolbar.showingLastOneMinuteDataText": "选定时间过去 {duration}的数据", @@ -12407,9 +12405,6 @@ "xpack.infra.logSourceErrorPage.resolveLogSourceConfigurationErrorTitle": "无法解决日志源配置", "xpack.infra.logSourceErrorPage.savedObjectNotFoundErrorMessage": "无法找到该{savedObjectType}:{savedObjectId}", "xpack.infra.logSourceErrorPage.tryAgainButtonLabel": "重试", - "xpack.infra.logsPage.noLoggingIndicesDescription": "让我们添加一些!", - "xpack.infra.logsPage.noLoggingIndicesInstructionsActionLabel": "查看设置说明", - "xpack.infra.logsPage.noLoggingIndicesTitle": "似乎您没有任何日志索引。", "xpack.infra.logsPage.toolbar.kqlSearchFieldPlaceholder": "搜索日志条目……(例如 host.name:host-1)", "xpack.infra.logStream.kqlErrorTitle": "KQL 表达式无效", "xpack.infra.logStream.unknownErrorTitle": "发生错误", @@ -21903,7 +21898,6 @@ "xpack.securitySolution.editDataProvider.valueLabel": "值", "xpack.securitySolution.editDataProvider.valuePlaceholder": "值", "xpack.securitySolution.effectedPolicySelect.viewPolicyLinkLabel": "查看策略", - "xpack.securitySolution.emptyMessage": "Elastic Security 将免费开放的 Elastic SIEM 和 Endpoint Security 相集成,以预防、检测并响应威胁。首先,您需要将安全解决方案相关数据添加到 Elastic Stack。有关更多信息,您可以查看我们的 ", "xpack.securitySolution.emptyString.emptyStringDescription": "空字符串", "xpack.securitySolution.endpoint.actions.agentDetails": "查看代理详情", "xpack.securitySolution.endpoint.actions.agentPolicy": "查看代理策略", From 64661d7075848c247fd4138a08877d8066687f0d Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 12 Aug 2021 22:43:38 -0400 Subject: [PATCH 30/77] Rebase fixes --- .../public/components/_overview.scss | 8 + .../public/components/overview/overview.tsx | 10 +- .../__snapshots__/no_data_page.test.tsx.snap | 117 ------------- .../kibana_react/public/no_data_page/index.ts | 10 -- .../elastic_agent_card.test.tsx.snap | 81 --------- .../elastic_beats_card.test.tsx.snap | 78 --------- .../__snapshots__/no_data_card.test.tsx.snap | 156 ------------------ .../no_data_card/elastic_agent_card.test.tsx | 45 ----- .../no_data_card/elastic_agent_card.tsx | 69 -------- .../no_data_card/elastic_beats_card.test.tsx | 45 ----- .../no_data_card/elastic_beats_card.tsx | 68 -------- .../public/no_data_page/no_data_card/index.ts | 11 -- .../no_data_card/no_data_card.test.tsx | 41 ----- .../no_data_card/no_data_card.tsx | 40 ----- .../public/no_data_page/no_data_page.test.tsx | 28 ---- 15 files changed, 14 insertions(+), 793 deletions(-) delete mode 100644 src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap delete mode 100644 src/plugins/kibana_react/public/no_data_page/index.ts delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx diff --git a/src/plugins/kibana_overview/public/components/_overview.scss b/src/plugins/kibana_overview/public/components/_overview.scss index 82c84b1032446..89f2b6272a4b8 100644 --- a/src/plugins/kibana_overview/public/components/_overview.scss +++ b/src/plugins/kibana_overview/public/components/_overview.scss @@ -64,6 +64,14 @@ } } +.kbnOverviewSolution__icon { + background-color: $euiColorEmptyShade !important; + box-shadow: none !important; + height: $euiSizeL * 2; + padding: $euiSizeM; + width: $euiSizeL * 2; +} + .kbnOverviewSupplements--noNews .kbnOverviewMore { h2 { @include euiBreakpoint('m', 'l', 'xl') { diff --git a/src/plugins/kibana_overview/public/components/overview/overview.tsx b/src/plugins/kibana_overview/public/components/overview/overview.tsx index b9bbfff0bc943..9bba923371f64 100644 --- a/src/plugins/kibana_overview/public/components/overview/overview.tsx +++ b/src/plugins/kibana_overview/public/components/overview/overview.tsx @@ -16,6 +16,7 @@ import { EuiScreenReaderOnly, EuiSpacer, EuiTitle, + EuiToken, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { CoreStart } from 'kibana/public'; @@ -25,7 +26,6 @@ import { KibanaPageTemplate, overviewPageActions, OverviewPageFooter, - KibanaPageTemplateSolutionNavAvatar, } from '../../../../../../src/plugins/kibana_react/public'; import { FetchResult } from '../../../../../../src/plugins/newsfeed/public'; import { @@ -205,10 +205,12 @@ export const Overview: FC = ({ newsFetchResult, solutions, features }) => description={description ? description : ''} href={addBasePath(path)} icon={ - } image={addBasePath(getSolutionGraphicURL(snakeCase(id)))} diff --git a/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap deleted file mode 100644 index b124c818d52f7..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/__snapshots__/no_data_page.test.tsx.snap +++ /dev/null @@ -1,117 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`NoDataPage render 1`] = ` -
- - - -

- -

- -

- - - , - "solution": "Elastic", - } - } - /> -

-
-
- - - - - - - - - - - - - - - -

- - - , - } - } - /> -

-
-
-`; diff --git a/src/plugins/kibana_react/public/no_data_page/index.ts b/src/plugins/kibana_react/public/no_data_page/index.ts deleted file mode 100644 index 55661ad6f14f7..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/index.ts +++ /dev/null @@ -1,10 +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 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 './no_data_page'; -export * from './no_data_card'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap deleted file mode 100644 index 6c9c18d632ff1..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap +++ /dev/null @@ -1,81 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ElasticAgentCard props button 1`] = ` - - Button - - } - href="app/integrations/browse" - image="httpPrepend" - paddingSize="l" - title="Add a Solution integration" -/> -`; - -exports[`ElasticAgentCard props href 1`] = ` - - Button - - } - href="#" - image="httpPrepend" - paddingSize="l" - title="Add a Solution integration" -/> -`; - -exports[`ElasticAgentCard props recommended 1`] = ` - - Find a Solution integration - - } - href="app/integrations/browse" - image="httpPrepend" - paddingSize="l" - title="Add a Solution integration" -/> -`; - -exports[`ElasticAgentCard renders 1`] = ` - - Find a Solution integration - - } - href="app/integrations/browse" - image="httpPrepend" - paddingSize="l" - title="Add a Solution integration" -/> -`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap deleted file mode 100644 index 1146e4f676eb6..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap +++ /dev/null @@ -1,78 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ElasticBeatsCard props button 1`] = ` - - Button - - } - href="app/home#/tutorial" - image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" - paddingSize="l" - title="Add data with Beats" -/> -`; - -exports[`ElasticBeatsCard props href 1`] = ` - - Button - - } - href="#" - image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" - paddingSize="l" - title="Add data with Beats" -/> -`; - -exports[`ElasticBeatsCard props recommended 1`] = ` - - Install Beats for Solution - - } - href="app/home#/tutorial" - image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" - paddingSize="l" - title="Add data with Beats" -/> -`; - -exports[`ElasticBeatsCard renders 1`] = ` - - Install Beats for Solution - - } - href="app/home#/tutorial" - image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" - paddingSize="l" - title="Add data with Beats" -/> -`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap b/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap deleted file mode 100644 index a8232c209ed73..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap +++ /dev/null @@ -1,156 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`NoDataCard props button 1`] = ` -
-
- - Card title - -
-

- Description -

-
-
- -
-`; - -exports[`NoDataCard props href 1`] = ` -
-
- - - Card title - - -
-

- Description -

-
-
- -
-`; - -exports[`NoDataCard props recommended 1`] = ` -
-
- - Card title - -
-

- Description -

-
-
- - - Recommended - - -
-`; - -exports[`NoDataCard renders 1`] = ` -
-
- - Card title - -
-

- Description -

-
-
-
-`; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx deleted file mode 100644 index 13e5f08af6b95..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.test.tsx +++ /dev/null @@ -1,45 +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 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 { shallow } from 'enzyme'; -import React from 'react'; -import { ElasticAgentCard } from './elastic_agent_card'; - -jest.mock('../../context', () => ({ - ...jest.requireActual('../../context'), - useKibana: jest.fn().mockReturnValue({ - services: { - http: { basePath: { prepend: jest.fn((path: string) => (path ? path : 'path')) } }, - uiSettings: { get: jest.fn() }, - }, - }), -})); - -describe('ElasticAgentCard', () => { - test('renders', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - describe('props', () => { - test('recommended', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - test('button', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - test('href', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - }); -}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx deleted file mode 100644 index 68b2eea771433..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_agent_card.tsx +++ /dev/null @@ -1,69 +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 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 @elastic/eui/href-or-on-click */ - -import React, { FunctionComponent } from 'react'; -import { i18n } from '@kbn/i18n'; -import { CoreStart } from 'kibana/public'; -import { EuiButton, EuiCard } from '@elastic/eui'; -import { useKibana } from '../../context'; -import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; - -export type ElasticAgentCardProps = NoDataPageActions & { - solution: string; -}; - -/** - * Applies extra styling to a typical EuiAvatar - */ -export const ElasticAgentCard: FunctionComponent = ({ - solution, - recommended = true, - href = 'app/integrations/browse', - button, - ...cardRest -}) => { - const { - services: { http }, - } = useKibana(); - const addBasePath = http.basePath.prepend; - const basePathUrl = '/plugins/kibanaReact/assets/'; - - const footer = - typeof button !== 'string' && typeof button !== 'undefined' ? ( - button - ) : ( - - {button || - i18n.translate('kibana-react.noDataPage.elasticAgentCard.buttonLabel', { - defaultMessage: 'Find a {solution} integration', - values: { solution }, - })} - - ); - - return ( - - ); -}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx deleted file mode 100644 index eba8f208842cd..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.test.tsx +++ /dev/null @@ -1,45 +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 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 { shallow } from 'enzyme'; -import React from 'react'; -import { ElasticBeatsCard } from './elastic_beats_card'; - -jest.mock('../../context', () => ({ - ...jest.requireActual('../../context'), - useKibana: jest.fn().mockReturnValue({ - services: { - http: { basePath: { prepend: jest.fn((path: string) => (path ? path : 'path')) } }, - uiSettings: { get: jest.fn() }, - }, - }), -})); - -describe('ElasticBeatsCard', () => { - test('renders', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - describe('props', () => { - test('recommended', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - test('button', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - - test('href', () => { - const component = shallow(); - expect(component).toMatchSnapshot(); - }); - }); -}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx deleted file mode 100644 index 832a9617d2542..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/elastic_beats_card.tsx +++ /dev/null @@ -1,68 +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 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 @elastic/eui/href-or-on-click */ - -import React, { FunctionComponent } from 'react'; -import { i18n } from '@kbn/i18n'; -import { CoreStart } from 'kibana/public'; -import { EuiButton, EuiCard } from '@elastic/eui'; -import { useKibana } from '../../context'; -import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; - -export type ElasticBeatsCardProps = NoDataPageActions & { - solution: string; -}; - -export const ElasticBeatsCard: FunctionComponent = ({ - recommended, - href = 'app/home#/tutorial', - button, - solution, - ...cardRest -}) => { - const { - services: { http, uiSettings }, - } = useKibana(); - const addBasePath = http.basePath.prepend; - const basePathUrl = '/plugins/kibanaReact/assets/'; - const IS_DARK_THEME = uiSettings.get('theme:darkMode'); - - const footer = - typeof button !== 'string' && typeof button !== 'undefined' ? ( - button - ) : ( - - {button || - i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { - defaultMessage: 'Install Beats for {solution}', - values: { solution }, - })} - - ); - - return ( - - ); -}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts b/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts deleted file mode 100644 index 3744239d9a472..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/index.ts +++ /dev/null @@ -1,11 +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 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 './elastic_agent_card'; -export * from './elastic_beats_card'; -export * from './no_data_card'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx deleted file mode 100644 index a809ede2dc617..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.test.tsx +++ /dev/null @@ -1,41 +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 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 { render } from 'enzyme'; -import React from 'react'; -import { NoDataCard } from './no_data_card'; - -describe('NoDataCard', () => { - test('renders', () => { - const component = render(); - expect(component).toMatchSnapshot(); - }); - - describe('props', () => { - test('recommended', () => { - const component = render( - - ); - expect(component).toMatchSnapshot(); - }); - - test('button', () => { - const component = render( - - ); - expect(component).toMatchSnapshot(); - }); - - test('href', () => { - const component = render( - - ); - expect(component).toMatchSnapshot(); - }); - }); -}); diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx deleted file mode 100644 index 0be85f8c8ed1c..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_card/no_data_card.tsx +++ /dev/null @@ -1,40 +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 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 @elastic/eui/href-or-on-click */ - -import React, { FunctionComponent } from 'react'; -import { EuiButton, EuiCard, EuiCardProps } from '@elastic/eui'; -import { NoDataPageActions, NO_DATA_RECOMMENDED } from '../no_data_page'; - -// Custom cards require all the props the EuiCard does -type NoDataCard = EuiCardProps & NoDataPageActions; - -export const NoDataCard: FunctionComponent = ({ - recommended, - button, - ...cardRest -}) => { - const footer = - typeof button !== 'string' ? ( - button - ) : ( - - {button} - - ); - - return ( - - ); -}; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.test.tsx deleted file mode 100644 index 59d6e8280af98..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.test.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 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 { NoDataPage } from './no_data_page'; -import { shallowWithIntl } from '@kbn/test/jest'; - -describe('NoDataPage', () => { - test('render', () => { - const component = shallowWithIntl( - - ); - expect(component).toMatchSnapshot(); - }); -}); From 7e3e60a4ec5da734d1e144762292bc2fabf330a1 Mon Sep 17 00:00:00 2001 From: cchaos Date: Thu, 12 Aug 2021 23:42:29 -0400 Subject: [PATCH 31/77] Mroe rebase fixes, cleanup, and links --- src/plugins/kibana_react/public/index.ts | 1 - .../public/no_data_page/no_data_page.scss | 7 - .../public/no_data_page/no_data_page.tsx | 202 ------------------ .../elastic_agent_card.test.tsx.snap | 13 +- .../elastic_beats_card.test.tsx.snap | 10 +- .../__snapshots__/no_data_card.test.tsx.snap | 7 +- .../no_data_card/elastic_agent_card.tsx | 12 +- .../no_data_card/elastic_beats_card.tsx | 10 +- .../no_data_card/no_data_card.tsx | 8 +- .../components/app/RumDashboard/RumHome.tsx | 5 +- .../routing/templates/apm_main_template.tsx | 5 +- .../infra/public/pages/logs/page_template.tsx | 2 +- .../logs/stream/page_no_indices_content.tsx | 2 +- .../public/pages/metrics/page_template.tsx | 2 +- .../public/pages/landing/index.tsx | 2 +- .../public/pages/overview/index.tsx | 4 +- .../security_solution/common/constants.ts | 2 +- .../components/overview_empty/index.test.tsx | 12 -- x-pack/plugins/uptime/public/routes.tsx | 34 +-- 19 files changed, 47 insertions(+), 293 deletions(-) delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.scss delete mode 100644 src/plugins/kibana_react/public/no_data_page/no_data_page.tsx diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index 19468498b1960..48b96a0a6289a 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -15,7 +15,6 @@ export * from './overlays'; export * from './ui_settings'; export * from './field_icon'; export * from './field_button'; -export * from './no_data_page'; export * from './table_list_view'; export * from './toolbar_button'; export * from './split_panel'; diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.scss b/src/plugins/kibana_react/public/no_data_page/no_data_page.scss deleted file mode 100644 index f1bc12e74cf4e..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.scss +++ /dev/null @@ -1,7 +0,0 @@ -.kbnNoDataPageContents__item:only-child { - min-width: 400px; - - @include euiBreakpoint('xs', 's') { - min-width: auto; - } -} diff --git a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx deleted file mode 100644 index 2db6f095729d1..0000000000000 --- a/src/plugins/kibana_react/public/no_data_page/no_data_page.tsx +++ /dev/null @@ -1,202 +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 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 './no_data_page.scss'; - -import React, { ReactNode, useMemo, FunctionComponent, MouseEventHandler } from 'react'; -import { - EuiFlexItem, - EuiCardProps, - EuiFlexGrid, - EuiSpacer, - EuiText, - EuiTextColor, - EuiLink, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { KibanaPageTemplateProps, KibanaPageTemplateSolutionNavAvatar } from '../page_template'; - -import { ElasticAgentCard, ElasticBeatsCard, NoDataCard } from './no_data_card'; - -export const NO_DATA_PAGE_MAX_WIDTH = 950; -export const NO_DATA_PAGE_TEMPLATE_PROPS: KibanaPageTemplateProps = { - restrictWidth: NO_DATA_PAGE_MAX_WIDTH, - template: 'centeredBody', - pageContentProps: { - hasShadow: false, - color: 'transparent', - }, -}; - -export const NO_DATA_RECOMMENDED = i18n.translate( - 'kibana-react.noDataPage.noDataPage.recommended', - { - defaultMessage: 'Recommended', - } -); - -export type NoDataPageActions = Partial & { - /** - * Applies the `Recommended` beta badge and makes the button `fill` - */ - recommended?: boolean; - /** - * Provide just a string for the button's label, or a whole component - */ - button?: string | ReactNode; - /** - * Remapping `onClick` to any element - */ - onClick?: MouseEventHandler; -}; - -export type NoDataPageActionsProps = Record; - -export interface NoDataPageProps { - /** - * Single name for the current solution, used to auto-generate the title, logo, description, and button label - */ - solution: string; - /** - * Optionally replace the auto-generated logo - */ - logo?: string; - /** - * Required to set the docs link for the whole solution - */ - docsLink: string; - /** - * Optionally replace the auto-generated page title (h1) - */ - pageTitle?: string; - /** - * An object of `NoDataPageActions` configurations with unique primary keys. - * Use `elasticAgent` or `beats` as the primary key for pre-configured cards of this type. - * Otherwise use a custom key that contains `EuiCard` props. - */ - actions: NoDataPageActionsProps; -} - -export const NoDataPage: FunctionComponent = ({ - solution, - logo, - actions, - docsLink, - pageTitle, -}) => { - // Convert obj data into an iterable array - const entries = Object.entries(actions); - - // This sort fn may look nonsensical, but it's some Good Ol' Javascript (TM) - // Sort functions want either a 1, 0, or -1 returned to determine order, - // and it turns out in JS you CAN minus booleans from each other to get a 1, 0, or -1 - e.g., (true - false == 1) :whoa: - const sortedEntries = entries.sort(([, firstObj], [, secondObj]) => { - // The `??` fallbacks are because the recommended key can be missing or undefined - return Number(secondObj.recommended ?? false) - Number(firstObj.recommended ?? false); - }); - - // Convert the iterated [[key, value]] array format back into an object - const sortedData = Object.fromEntries(sortedEntries); - const actionsKeys = Object.keys(sortedData); - const renderActions = useMemo(() => { - return Object.values(sortedData).map((action, i) => { - if (actionsKeys[i] === 'elasticAgent') { - return ( - - - - ); - } else if (actionsKeys[i] === 'beats') { - return ( - - - - ); - } else { - return ( - - - - ); - } - }); - }, [actions, sortedData, actionsKeys]); - - return ( -
- - - -

- {pageTitle || ( - - )} -

- -

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

-
-
- - - - {renderActions} - - {actionsKeys.length > 1 ? ( - <> - - -

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

-
- - ) : undefined} -
- ); -}; diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap index c8fda1d036439..53f5c082e1511 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_agent_card.test.tsx.snap @@ -2,18 +2,16 @@ exports[`ElasticAgentCard props button 1`] = ` Button } - href="app/integrations/browse" + href="/app/integrations/browse" image="/plugins/kibanaReact/assets/elastic_agent_card.svg" paddingSize="l" title="Add a Solution integration" @@ -22,13 +20,11 @@ exports[`ElasticAgentCard props button 1`] = ` exports[`ElasticAgentCard props href 1`] = ` Button @@ -48,12 +44,11 @@ exports[`ElasticAgentCard props recommended 1`] = ` footer={ Find an integration for Solution } - href="app/integrations/browse" + href="/app/integrations/browse" image="/plugins/kibanaReact/assets/elastic_agent_card.svg" paddingSize="l" title="Add a Solution integration" @@ -62,18 +57,16 @@ exports[`ElasticAgentCard props recommended 1`] = ` exports[`ElasticAgentCard renders 1`] = ` Find an integration for Solution } - href="app/integrations/browse" + href="/app/integrations/browse" image="/plugins/kibanaReact/assets/elastic_agent_card.svg" paddingSize="l" title="Add a Solution integration" diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap index 1146e4f676eb6..0781d9f29e745 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap @@ -7,12 +7,11 @@ exports[`ElasticBeatsCard props button 1`] = ` footer={ Button } - href="app/home#/tutorial" + href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" title="Add data with Beats" @@ -26,7 +25,6 @@ exports[`ElasticBeatsCard props href 1`] = ` footer={ Button @@ -46,12 +44,11 @@ exports[`ElasticBeatsCard props recommended 1`] = ` footer={ Install Beats for Solution } - href="app/home#/tutorial" + href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" title="Add data with Beats" @@ -65,12 +62,11 @@ exports[`ElasticBeatsCard renders 1`] = ` footer={ Install Beats for Solution } - href="app/home#/tutorial" + href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" title="Add data with Beats" diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap index a8232c209ed73..fccbbe3a9e8ee 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/no_data_card.test.tsx.snap @@ -75,10 +75,9 @@ exports[`NoDataCard props href 1`] = `
+
+ + + Card title + + +
+

+ Description +

+
+
+ +
`; diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx index f0ee2fc2739d9..b889a53a889ef 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_agent_card.tsx @@ -6,8 +6,6 @@ * Side Public License, v 1. */ -/* eslint-disable @elastic/eui/href-or-on-click */ - import React, { FunctionComponent } from 'react'; import { i18n } from '@kbn/i18n'; import { CoreStart } from 'kibana/public'; @@ -24,8 +22,8 @@ export type ElasticAgentCardProps = NoDataPageActions & { */ export const ElasticAgentCard: FunctionComponent = ({ solution, - recommended = true, - href = 'app/integrations/browse', + recommended, + href, button, ...cardRest }) => { @@ -39,7 +37,9 @@ export const ElasticAgentCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - + // The href and/or onClick are attached to the whole Card, so the button is just for show. + // Do not add the behavior here too or else it will propogate through + {button || i18n.translate('kibana-react.noDataPage.elasticAgentCard.buttonLabel', { defaultMessage: 'Find an integration for {solution}', @@ -51,7 +51,7 @@ export const ElasticAgentCard: FunctionComponent = ({ return ( = ({ recommended, - href = 'app/home#/tutorial', button, + href, solution, ...cardRest }) => { @@ -37,7 +35,9 @@ export const ElasticBeatsCard: FunctionComponent = ({ typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( - + // The href and/or onClick are attached to the whole Card, so the button is just for show. + // Do not add the behavior here too or else it will propogate through + {button || i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { defaultMessage: 'Install Beats for {solution}', @@ -49,7 +49,7 @@ export const ElasticBeatsCard: FunctionComponent = ({ return ( = ({ typeof button !== 'string' ? ( button ) : ( - - {button} - + // The href and/or onClick are attached to the whole Card, so the button is just for show. + // Do not add the behavior here too or else it will propogate through + {button} ); return ( diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 4d3b1852f64ee..078869a0efaf1 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -34,7 +34,7 @@ export function RumHome() { const { sharedData: { totalPageViews }, } = useContext(CsmSharedContext); - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = totalPageViews + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !totalPageViews ? { solution: 'Observability', pageTitle: 'Set up User Experience Tracking for Observability!', @@ -43,7 +43,8 @@ export function RumHome() { href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), }, }, - docsLink: '#', + docsLink: + 'https://www.elastic.co/guide/en/kibana/master/observability.html', } : undefined; diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index d09c03942ed7f..19f19f94fc6e1 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -34,7 +34,7 @@ export function ApmMainTemplate({ children: React.ReactNode; } & KibanaPageTemplateProps) { const { http } = useKibana().services; - const basePath = http!.basePath.get(); + const basePath = http?.basePath.get(); const { services } = useKibana(); const ObservabilityPageTemplate = @@ -51,7 +51,8 @@ export function ApmMainTemplate({ href: basePath + `/app/home#/tutorial/apm`, }, }, - docsLink: '#', + docsLink: + 'https://www.elastic.co/guide/en/kibana/master/observability.html', } : undefined; diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index fae53a55322df..b4deebb005a90 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -39,7 +39,7 @@ export const LogsPageTemplate: React.FC = ( href: basePath + `/app/home#/tutorial_directory/logging`, }, }, - docsLink: '#', + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', }; return ; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx index f43d89e0bd80d..36057313bbf98 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx @@ -24,7 +24,7 @@ export const LogsPageNoIndicesContent = () => { ...tutorialLinkProps, }, }, - docsLink: '#', + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', }} /> ); diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index 38483636f78ad..bee939c2ba82b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -39,7 +39,7 @@ export const MetricsPageTemplate: React.FC = ...tutorialLinkProps, }, }, - docsLink: '#', + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', }; return ; diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index 2c8fa4f9f4e1c..10c7c954b0e2c 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -50,7 +50,7 @@ export function LandingPage() { href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), }, }, - docsLink: '#', + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', }; return ( diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index 8d7400eeb7c5a..3926956d6c96c 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -80,10 +80,10 @@ export function OverviewPage({ routeParams }: Props) { solution: 'Observability', actions: { beats: { - href: `app/home#/tutorial_directory/logging`, + href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), }, }, - docsLink: '#', + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', }; return ( diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 281d70d71933d..76f3bd4926ede 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -16,7 +16,7 @@ export const APP_ICON = 'securityAnalyticsApp'; export const APP_ICON_SOLUTION = 'logoSecurity'; export const APP_PATH = `/app/security`; export const ADD_DATA_PATH = `/app/home#/tutorial_directory/security`; -export const ADD_INTEGRATION_PATH = `app/integrations?category=security`; +export const ADD_INTEGRATION_PATH = `/app/integrations?category=security`; export const DEFAULT_BYTES_FORMAT = 'format:bytes:defaultPattern'; export const DEFAULT_DATE_FORMAT = 'dateFormat'; export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index 2841d499b0c6e..db10c2c911293 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -44,20 +44,8 @@ describe('OverviewEmpty', () => { test('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ elasticAgent: { - description: - 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', - fill: false, - label: 'Add data with Elastic Agent', url: 'ingestUrl', }, - endpoint: { - description: - 'Protect your hosts with threat prevention, detection, and deep security data visibility.', - fill: false, - label: 'Add Endpoint Security', - onClick: undefined, - url: `/integrations/endpoint-${endpointPackageVersion}/add-integration`, - }, }); }); }); diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index c2259de6157a3..1e5bab39fc304 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { FC, useEffect } from 'react'; +import React, { FC, useEffect, useContext } from 'react'; import { useSelector } from 'react-redux'; import styled from 'styled-components'; import { Route, Switch } from 'react-router-dom'; @@ -42,6 +42,7 @@ import { StepDetailPageHeader, StepDetailPageRightSideItem, } from './pages/synthetics/step_detail_page'; +import { UptimeSettingsContext } from './contexts'; interface RouteProps { path: string; @@ -171,14 +172,12 @@ export const PageRouter: FC = () => { flex-wrap: wrap; } `; - const { http } = useKibana().services; - const basePath = http!.basePath.get(); + const { basePath } = useContext(UptimeSettingsContext); const { data } = useSelector(indexStatusSelector); const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; - const noDataPage = ( - { href: basePath + `/app/home#/tutorial/uptimeMonitors`, }, }, - docsLink: '#', - }} - /> - ); + docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + } + : undefined; return ( @@ -199,19 +197,9 @@ export const PageRouter: FC = () => {
- - {/* Render the No Data config if there is no data */} - {noDataInfo && noDataPage} - - {/* Apply the template component, only if `pageHeader` is defined in the route */} - {!noDataInfo && pageHeader && ( - - - - )} - - {/* Otherwise the template should be in the route page itself */} - {!noDataInfo && !pageHeader && } + + +
) From 81a444bbbea7c372623b3bb1d745f52f63f2a384 Mon Sep 17 00:00:00 2001 From: cchaos Date: Fri, 13 Aug 2021 00:05:10 -0400 Subject: [PATCH 32/77] Fix ES test --- .../product_selector/product_selector.tsx | 14 +++++++------- .../setup_guide/setup_guide_cta.test.tsx | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx index f0b862a0e0d31..1b6521394bda9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/product_selector/product_selector.tsx @@ -64,13 +64,13 @@ export const ProductSelector: React.FC = ({ access }) => { })}

- {config.host - ? i18n.translate('xpack.enterpriseSearch.overview.subheading', { - defaultMessage: 'Add search to your app or organization.', - }) - : i18n.translate('xpack.enterpriseSearch.overview.setupHeading', { - defaultMessage: 'Choose a product to set up and get started.', - })} + {config.host + ? i18n.translate('xpack.enterpriseSearch.overview.subheading', { + defaultMessage: 'Add search to your app or organization.', + }) + : i18n.translate('xpack.enterpriseSearch.overview.setupHeading', { + defaultMessage: 'Choose a product to set up and get started.', + })}

diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.test.tsx index 659af6d23c6d0..dd18d0d59c056 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide_cta.test.tsx @@ -16,6 +16,6 @@ describe('SetupGuideCta', () => { const wrapper = shallow(); expect(wrapper.find('.enterpriseSearchSetupCta')).toHaveLength(1); - expect(wrapper.find('img')).toHaveLength(1); + expect(wrapper.find('EuiImage')).toHaveLength(1); }); }); From da83c6c32db15567c577e0c3143bf641d71a626a Mon Sep 17 00:00:00 2001 From: cchaos Date: Fri, 13 Aug 2021 00:55:33 -0400 Subject: [PATCH 33/77] Skipping security solution test for now --- .../components/overview_empty/index.test.tsx | 12 +++++------- .../components/overview_empty/index.tsx | 17 ++++++++++------- .../public/overview/pages/overview.test.tsx | 3 ++- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index db10c2c911293..770b626703341 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -41,7 +41,8 @@ describe('OverviewEmpty', () => { (useUserPrivileges as jest.Mock).mockReset(); }); - test('render with correct actions ', () => { + /** TODO: Need help fixing tests because of nested props */ + it.skip('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ elasticAgent: { url: 'ingestUrl', @@ -59,14 +60,11 @@ describe('OverviewEmpty', () => { wrapper = shallow(); }); - test('render with correct actions ', () => { + /** TODO: Need help fixing tests because of nested props */ + it.skip('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ beats: { - description: - 'Lightweight Beats can send data from hundreds or thousands of machines and systems', - fill: false, - label: 'Add data with Beats', - url: '/app/home#/tutorial_directory/security', + href: '/app/home#/tutorial_directory/security', }, }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index a9b26f418d4b5..2501aa20de0fd 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -6,9 +6,8 @@ */ import React, { useMemo } from 'react'; -import { omit } from 'lodash/fp'; import { useKibana } from '../../../common/lib/kibana'; -import { ADD_INTEGRATION_PATH } from '../../../../common/constants'; +import { ADD_INTEGRATION_PATH, ADD_DATA_PATH } from '../../../../common/constants'; import { useUserPrivileges } from '../../../common/components/user_privileges'; import { @@ -21,7 +20,7 @@ const OverviewEmptyComponent: React.FC = () => { const basePath = http.basePath.get(); const canAccessFleet = useUserPrivileges().endpointPrivileges.canAccessFleet; - const emptyPageActions: NoDataPageActionsProps = useMemo( + const agentAction: NoDataPageActionsProps = useMemo( () => ({ elasticAgent: { href: `${basePath}${ADD_INTEGRATION_PATH}`, @@ -30,9 +29,13 @@ const OverviewEmptyComponent: React.FC = () => { [basePath] ); - const emptyPageIngestDisabledActions = useMemo( - () => omit(['elasticAgent', 'endpoint'], emptyPageActions), - [emptyPageActions] + const beatsAction: NoDataPageActionsProps = useMemo( + () => ({ + beats: { + href: `${basePath}${ADD_DATA_PATH}`, + }, + }), + [basePath] ); return ( @@ -40,7 +43,7 @@ const OverviewEmptyComponent: React.FC = () => { data-test-subj="empty-page" noDataConfig={{ solution: 'Security', - actions: canAccessFleet ? emptyPageActions : emptyPageIngestDisabledActions, + actions: canAccessFleet ? agentAction : beatsAction, docsLink: docLinks.links.siem.gettingStarted, }} /> diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index d40f43c81aead..9556f4c66f018 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -298,7 +298,8 @@ describe('Overview', () => { expect(wrapper.find('[data-test-subj="empty-page-endpoint-action"]').exists()).toBe(false); }); - it('shows Endpoint get ready button when ingest is enabled', () => { + /** Skip endpoint for now as the option has been removed via https://github.com/elastic/kibana/issues/107682 */ + it.skip('shows Endpoint get ready button when ingest is enabled', () => { mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState({ canAccessFleet: true })); const wrapper = mount( From 82d2f40bad0986bf97c18a5a5d193a8ca480402d Mon Sep 17 00:00:00 2001 From: cchaos Date: Fri, 13 Aug 2021 01:03:44 -0400 Subject: [PATCH 34/77] Hopefully fixing some tests --- x-pack/plugins/apm/public/application/uxApp.tsx | 2 +- .../plugins/infra/public/pages/metrics/inventory_view/index.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/application/uxApp.tsx b/x-pack/plugins/apm/public/application/uxApp.tsx index 411d891519c92..f4aace72d1ebe 100644 --- a/x-pack/plugins/apm/public/application/uxApp.tsx +++ b/x-pack/plugins/apm/public/application/uxApp.tsx @@ -119,7 +119,7 @@ export function UXAppRoot({ > - + diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx index 8cdbf29e69852..a4db6db23145b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx @@ -86,7 +86,7 @@ export const SnapshotPage = () => { ) : hasFailedLoadingSource ? ( ) : ( - + )} ); From 82e564948c2e8c1859e1807272d4dea6dd541b62 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 15:04:56 -0400 Subject: [PATCH 35/77] Revert "Skipping security solution test for now" This reverts commit da83c6c32db15567c577e0c3143bf641d71a626a. --- .../components/overview_empty/index.test.tsx | 12 +++++++----- .../components/overview_empty/index.tsx | 17 +++++++---------- .../public/overview/pages/overview.test.tsx | 3 +-- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index 770b626703341..db10c2c911293 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -41,8 +41,7 @@ describe('OverviewEmpty', () => { (useUserPrivileges as jest.Mock).mockReset(); }); - /** TODO: Need help fixing tests because of nested props */ - it.skip('render with correct actions ', () => { + test('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ elasticAgent: { url: 'ingestUrl', @@ -60,11 +59,14 @@ describe('OverviewEmpty', () => { wrapper = shallow(); }); - /** TODO: Need help fixing tests because of nested props */ - it.skip('render with correct actions ', () => { + test('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ beats: { - href: '/app/home#/tutorial_directory/security', + description: + 'Lightweight Beats can send data from hundreds or thousands of machines and systems', + fill: false, + label: 'Add data with Beats', + url: '/app/home#/tutorial_directory/security', }, }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 2501aa20de0fd..a9b26f418d4b5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -6,8 +6,9 @@ */ import React, { useMemo } from 'react'; +import { omit } from 'lodash/fp'; import { useKibana } from '../../../common/lib/kibana'; -import { ADD_INTEGRATION_PATH, ADD_DATA_PATH } from '../../../../common/constants'; +import { ADD_INTEGRATION_PATH } from '../../../../common/constants'; import { useUserPrivileges } from '../../../common/components/user_privileges'; import { @@ -20,7 +21,7 @@ const OverviewEmptyComponent: React.FC = () => { const basePath = http.basePath.get(); const canAccessFleet = useUserPrivileges().endpointPrivileges.canAccessFleet; - const agentAction: NoDataPageActionsProps = useMemo( + const emptyPageActions: NoDataPageActionsProps = useMemo( () => ({ elasticAgent: { href: `${basePath}${ADD_INTEGRATION_PATH}`, @@ -29,13 +30,9 @@ const OverviewEmptyComponent: React.FC = () => { [basePath] ); - const beatsAction: NoDataPageActionsProps = useMemo( - () => ({ - beats: { - href: `${basePath}${ADD_DATA_PATH}`, - }, - }), - [basePath] + const emptyPageIngestDisabledActions = useMemo( + () => omit(['elasticAgent', 'endpoint'], emptyPageActions), + [emptyPageActions] ); return ( @@ -43,7 +40,7 @@ const OverviewEmptyComponent: React.FC = () => { data-test-subj="empty-page" noDataConfig={{ solution: 'Security', - actions: canAccessFleet ? agentAction : beatsAction, + actions: canAccessFleet ? emptyPageActions : emptyPageIngestDisabledActions, docsLink: docLinks.links.siem.gettingStarted, }} /> diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index 9556f4c66f018..d40f43c81aead 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -298,8 +298,7 @@ describe('Overview', () => { expect(wrapper.find('[data-test-subj="empty-page-endpoint-action"]').exists()).toBe(false); }); - /** Skip endpoint for now as the option has been removed via https://github.com/elastic/kibana/issues/107682 */ - it.skip('shows Endpoint get ready button when ingest is enabled', () => { + it('shows Endpoint get ready button when ingest is enabled', () => { mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState({ canAccessFleet: true })); const wrapper = mount( From 3be7b0df275f873fab580d436652c413aebf9c87 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 15:08:14 -0400 Subject: [PATCH 36/77] Revert "Adding to Security Solution and forcing view in TemplateWrapper" This reverts commit e6c12901902ff0c6d197803dc9d6d69277a7f2a8. # Conflicts: # x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx # x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx --- .../app/home/template_wrapper/index.tsx | 7 +- .../public/common/translations.ts | 4 - .../components/overview_empty/index.tsx | 94 +++++++++++++++---- 3 files changed, 79 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx index db2b329b5ab79..67d9943fabe83 100644 --- a/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx +++ b/x-pack/plugins/security_solution/public/app/home/template_wrapper/index.tsx @@ -23,8 +23,6 @@ import { } from './bottom_bar'; import { useShowTimeline } from '../../../common/utils/timeline/use_show_timeline'; import { gutterTimeline } from '../../../common/lib/helpers'; -import { useSourcererScope } from '../../../common/containers/sourcerer'; -import { OverviewEmpty } from '../../../overview/components/overview_empty'; /* eslint-disable react/display-name */ @@ -76,12 +74,11 @@ export const SecuritySolutionTemplateWrapper: React.FC getTimelineShowStatus(state, TimelineId.active) ); - const { indicesExist } = useSourcererScope(); /* StyledKibanaPageTemplate is a styled EuiPageTemplate. Security solution currently passes the header and page content as the children of StyledKibanaPageTemplate, as opposed to using the pageHeader prop, which may account for any style discrepancies, such as the bottom border not extending the full width of the page, between EuiPageTemplate and the security solution pages. */ - return indicesExist ? ( + return ( - ) : ( - ); } ); diff --git a/x-pack/plugins/security_solution/public/common/translations.ts b/x-pack/plugins/security_solution/public/common/translations.ts index 16a60301c3205..1eefd69d57eb7 100644 --- a/x-pack/plugins/security_solution/public/common/translations.ts +++ b/x-pack/plugins/security_solution/public/common/translations.ts @@ -7,10 +7,6 @@ import { i18n } from '@kbn/i18n'; -export const SOLUTION_NAME = i18n.translate('xpack.securitySolution.pages.common.solutionName', { - defaultMessage: 'Security', -}); - export const EMPTY_TITLE = i18n.translate('xpack.securitySolution.pages.common.emptyTitle', { defaultMessage: 'Welcome to Elastic Security. Let’s get you started.', }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index a9b26f418d4b5..6f885b348cdeb 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -7,27 +7,64 @@ import React, { useMemo } from 'react'; import { omit } from 'lodash/fp'; -import { useKibana } from '../../../common/lib/kibana'; -import { ADD_INTEGRATION_PATH } from '../../../../common/constants'; -import { useUserPrivileges } from '../../../common/components/user_privileges'; +import { createStructuredSelector } from 'reselect'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiLink } from '@elastic/eui'; +import * as i18nCommon from '../../../common/translations'; +import { EmptyPage, EmptyPageActionsProps } from '../../../common/components/empty_page'; +import { useKibana } from '../../../common/lib/kibana'; +import { ADD_DATA_PATH } from '../../../../common/constants'; import { - KibanaPageTemplate, - NoDataPageActionsProps, -} from '../../../../../../../src/plugins/kibana_react/public'; + useEndpointSelector, + useIngestUrl, +} from '../../../management/pages/endpoint_hosts/view/hooks'; +import { useNavigateToAppEventHandler } from '../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; +import { CreateStructuredSelector } from '../../../common/store'; +import { endpointPackageVersion as useEndpointPackageVersion } from '../../../management/pages/endpoint_hosts/store/selectors'; +import { useUserPrivileges } from '../../../common/components/user_privileges'; const OverviewEmptyComponent: React.FC = () => { const { http, docLinks } = useKibana().services; const basePath = http.basePath.get(); + const selector = (createStructuredSelector as CreateStructuredSelector)({ + endpointPackageVersion: useEndpointPackageVersion, + }); + const { endpointPackageVersion } = useEndpointSelector(selector); + const { url: ingestUrl } = useIngestUrl(''); + + const endpointIntegrationUrlPath = endpointPackageVersion + ? `/endpoint-${endpointPackageVersion}/add-integration` + : ''; + const endpointIntegrationUrl = `/integrations${endpointIntegrationUrlPath}`; + const handleEndpointClick = useNavigateToAppEventHandler('fleet', { + path: endpointIntegrationUrl, + }); const canAccessFleet = useUserPrivileges().endpointPrivileges.canAccessFleet; - const emptyPageActions: NoDataPageActionsProps = useMemo( + const emptyPageActions: EmptyPageActionsProps = useMemo( () => ({ elasticAgent: { - href: `${basePath}${ADD_INTEGRATION_PATH}`, + label: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT, + url: ingestUrl, + description: i18nCommon.EMPTY_ACTION_ELASTIC_AGENT_DESCRIPTION, + fill: false, + }, + beats: { + label: i18nCommon.EMPTY_ACTION_BEATS, + url: `${basePath}${ADD_DATA_PATH}`, + description: i18nCommon.EMPTY_ACTION_BEATS_DESCRIPTION, + fill: false, + }, + endpoint: { + label: i18nCommon.EMPTY_ACTION_ENDPOINT, + url: endpointIntegrationUrl, + description: i18nCommon.EMPTY_ACTION_ENDPOINT_DESCRIPTION, + onClick: handleEndpointClick, + fill: false, }, }), - [basePath] + [basePath, ingestUrl, endpointIntegrationUrl, handleEndpointClick] ); const emptyPageIngestDisabledActions = useMemo( @@ -35,14 +72,39 @@ const OverviewEmptyComponent: React.FC = () => { [emptyPageActions] ); - return ( - + + + {i18nCommon.EMPTY_ACTION_SECONDARY} + + + } + title={i18nCommon.EMPTY_TITLE} + /> + ) : ( + + + + {i18nCommon.EMPTY_ACTION_SECONDARY} + + + } + title={i18nCommon.EMPTY_TITLE} /> ); }; From 255acbe8df9216538b1c587ed875c7731d1a5224 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 15:25:05 -0400 Subject: [PATCH 37/77] More Security Solution reverts --- .../plugins/security_solution/common/constants.ts | 1 - .../components/overview_empty/index.test.tsx | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 68b66d9c3b678..d9452a537826d 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -16,7 +16,6 @@ export const APP_ICON = 'securityAnalyticsApp'; export const APP_ICON_SOLUTION = 'logoSecurity'; export const APP_PATH = `/app/security`; export const ADD_DATA_PATH = `/app/home#/tutorial_directory/security`; -export const ADD_INTEGRATION_PATH = `/app/integrations?category=security`; export const DEFAULT_BYTES_FORMAT = 'format:bytes:defaultPattern'; export const DEFAULT_DATE_FORMAT = 'dateFormat'; export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index db10c2c911293..0d40c52c4140f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -68,6 +68,21 @@ describe('OverviewEmpty', () => { label: 'Add data with Beats', url: '/app/home#/tutorial_directory/security', }, + elasticAgent: { + description: + 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', + fill: false, + label: 'Add data with Elastic Agent', + url: 'ingestUrl', + }, + endpoint: { + description: + 'Protect your hosts with threat prevention, detection, and deep security data visibility.', + fill: false, + label: 'Add Endpoint Security', + onClick: undefined, + url: `/integrations/endpoint-${endpointPackageVersion}/add-integration`, + }, }); }); }); From 33f922fa1f9cd37025d7f29ab5f4f3c1ea82ba9a Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 15:38:06 -0400 Subject: [PATCH 38/77] Update beats card default text to just `Add data` --- .../__snapshots__/elastic_beats_card.test.tsx.snap | 12 ++++++------ .../no_data_page/no_data_card/elastic_beats_card.tsx | 5 ++--- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap index 0781d9f29e745..006fbda834d9b 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/__snapshots__/elastic_beats_card.test.tsx.snap @@ -14,7 +14,7 @@ exports[`ElasticBeatsCard props button 1`] = ` href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" - title="Add data with Beats" + title="Add data" /> `; @@ -32,7 +32,7 @@ exports[`ElasticBeatsCard props href 1`] = ` href="#" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" - title="Add data with Beats" + title="Add data" /> `; @@ -45,13 +45,13 @@ exports[`ElasticBeatsCard props recommended 1`] = ` - Install Beats for Solution + Add data } href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" - title="Add data with Beats" + title="Add data" /> `; @@ -63,12 +63,12 @@ exports[`ElasticBeatsCard renders 1`] = ` - Install Beats for Solution + Add data } href="/app/home#/tutorial_directory" image="/plugins/kibanaReact/assets/elastic_beats_card_light.svg" paddingSize="l" - title="Add data with Beats" + title="Add data" /> `; diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx index e88483e65d4c0..a498be03a111a 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx @@ -40,8 +40,7 @@ export const ElasticBeatsCard: FunctionComponent = ({ {button || i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { - defaultMessage: 'Install Beats for {solution}', - values: { solution }, + defaultMessage: 'Add data', })} ); @@ -51,7 +50,7 @@ export const ElasticBeatsCard: FunctionComponent = ({ paddingSize="l" href={href ?? addBasePath('/app/home#/tutorial_directory')} title={i18n.translate('kibana-react.noDataPage.elasticBeatsCard.title', { - defaultMessage: 'Add data with Beats', + defaultMessage: 'Add data', })} description={i18n.translate('kibana-react.noDataPage.elasticBeatsCard.description', { defaultMessage: ` From ab018d7ea83763f509f9958ada5a232ed6b1731c Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 15:51:36 -0400 Subject: [PATCH 39/77] Updated RUM copy --- .../components/app/RumDashboard/RumHome.tsx | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index ffaf4c6f93c04..50fe23e90e815 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -36,15 +36,31 @@ export function RumHome() { } = useContext(CsmSharedContext); const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !totalPageViews ? { - solution: 'Observability', - pageTitle: 'Set up User Experience Tracking for Observability!', + solution: i18n.translate('xpack.apm.ux.overview.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + title: i18n.translate('xpack.apm.ux.overview.beatsCard.title', { + defaultMessage: 'Add RUM data', + }), + description: i18n.translate( + 'xpack.apm.ux.overview.beatsCard.description', + { + defaultMessage: + 'Use the RUM (JS) agent to collect user experience data.', + } + ), + button: i18n.translate( + 'xpack.apm.ux.overview.beatsCard.buttonLabel', + { + defaultMessage: 'Add RUM data', + } + ), href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), }, }, - docsLink: - 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: core.docLinks.links.observability.guide, } : undefined; From 54d0d49f97631cf0d75d602fee53a3c4b23d1fd8 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:04:23 -0400 Subject: [PATCH 40/77] Updating Uptime copy --- x-pack/plugins/uptime/public/routes.tsx | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index 1e5bab39fc304..9fcafcfad3fb9 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -163,7 +163,7 @@ const RouteInit: React.FC> = export const PageRouter: FC = () => { const { - services: { observability }, + services: { observability, docLinks }, } = useKibana(); const PageTemplateComponent = observability.navigation.PageTemplate; @@ -178,14 +178,24 @@ export const PageRouter: FC = () => { const noDataInfo = !data || data?.docCount === 0 || data?.indexExists === false; const noDataConfig = noDataInfo ? { - solution: 'Observability', - pageTitle: 'Set up Uptime for Observability!', + solution: i18n.translate('xpack.uptime.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + title: i18n.translate('xpack.uptime.noDataConfig.beatsCard.title', { + defaultMessage: 'Add monitors with Heartbeat', + }), + description: i18n.translate('xpack.uptime.noDataConfig.beatsCard.description', { + defaultMessage: 'Use Heartbeat to create uptime monitors.', + }), + button: i18n.translate('xpack.uptime.noDataConfig.beatsCard.buttonLabel', { + defaultMessage: 'Add monitors with Heartbeat', + }), href: basePath + `/app/home#/tutorial/uptimeMonitors`, }, }, - docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: docLinks!.links.observability.guide, } : undefined; From 5c852fb1262b4ee2d5ac6e33a27d9757e331e66d Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:12:20 -0400 Subject: [PATCH 41/77] Update APM copy --- .../routing/templates/apm_main_template.tsx | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 19f19f94fc6e1..1c978590028a7 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -6,6 +6,7 @@ */ import { EuiPageHeaderProps } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React from 'react'; import { useKibana, @@ -33,7 +34,7 @@ export function ApmMainTemplate({ pageHeader?: EuiPageHeaderProps; children: React.ReactNode; } & KibanaPageTemplateProps) { - const { http } = useKibana().services; + const { http, docLinks } = useKibana().services; const basePath = http?.basePath.get(); const { services } = useKibana(); @@ -44,15 +45,31 @@ export function ApmMainTemplate({ const hasData = true; const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !hasData ? { - solution: 'Observability', - pageTitle: 'Set up APM for Observability!', + solution: i18n.translate('xpack.apm.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + title: i18n.translate('xpack.apm.noDataConfig.beatsCard.title', { + defaultMessage: 'Add data with APM Agents', + }), + description: i18n.translate( + 'xpack.apm.noDataConfig.beatsCard.description', + { + defaultMessage: + 'Use APM agents to collect APM data. We make it easy with agents for many popular languages.', + } + ), + button: i18n.translate( + 'xpack.apm.noDataConfig.beatsCard.buttonLabel', + { + defaultMessage: 'Add data with APM Agents', + } + ), href: basePath + `/app/home#/tutorial/apm`, }, }, - docsLink: - 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: docLinks!.links.observability.guide, } : undefined; From 6e9c8ce90881f9be1be2ccc366fdd30692dddef2 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:24:33 -0400 Subject: [PATCH 42/77] =?UTF-8?q?Updating=20Logs=20copy=20and=20reverting?= =?UTF-8?q?=20changes=20to=20`page=5Fno=5Findices=5Fcontent`=20since=20it?= =?UTF-8?q?=20won=E2=80=99t=20be=20displayed=20any=20more?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infra/public/pages/logs/page_template.tsx | 18 +++++- .../public/pages/logs/stream/page_content.tsx | 6 +- .../logs/stream/page_no_indices_content.tsx | 56 +++++++++++++++---- 3 files changed, 62 insertions(+), 18 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index b4deebb005a90..06289a7add818 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -6,6 +6,7 @@ */ import React from 'react'; +import { i18n } from '@kbn/i18n'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { useLogSourceContext } from '../../containers/logs/log_source'; @@ -22,6 +23,7 @@ export const LogsPageTemplate: React.FC = ( observability: { navigation: { PageTemplate }, }, + docLinks, }, } = useKibanaContextForPlugin(); @@ -33,13 +35,25 @@ export const LogsPageTemplate: React.FC = ( sourceStatus?.logIndexStatus !== 'missing' ? undefined : { - solution: 'Observability', + solution: i18n.translate('xpack.logs.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + title: i18n.translate('xpack.logs.noDataConfig.beatsCard.title', { + defaultMessage: 'Add logs with Beats', + }), + description: i18n.translate('xpack.logs.noDataConfig.beatsCard.description', { + defaultMessage: + 'Use Beats to send logs to Elasticsearch. We make it easy with modules for many popular systems and apps.', + }), + button: i18n.translate('xpack.logs.noDataConfig.beatsCard.buttonLabel', { + defaultMessage: 'Add logs with Beats', + }), href: basePath + `/app/home#/tutorial_directory/logging`, }, }, - docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: docLinks.links.observability.guide, }; return ; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx index 527dc79726044..c104acf396f54 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx @@ -11,7 +11,6 @@ import { LogSourceErrorPage } from '../../../components/logging/log_source_error import { SourceLoadingPage } from '../../../components/source_loading_page'; import { useLogSourceContext } from '../../../containers/logs/log_source'; import { LogsPageLogsContent } from './page_logs_content'; -import { LogsPageNoIndicesContent } from './page_no_indices_content'; import { LogsPageTemplate } from '../page_template'; import { euiStyled } from '../../../../../../../src/plugins/kibana_react/common'; import { APP_WRAPPER_CLASS } from '../../../../../../../src/core/public'; @@ -27,14 +26,13 @@ export const StreamPageContent: React.FunctionComponent = () => { isUninitialized, loadSource, latestLoadSourceFailures, - sourceStatus, } = useLogSourceContext(); if (isLoading || isUninitialized) { return ; } else if (hasFailedLoading) { return ; - } else if (sourceStatus?.logIndexStatus !== 'missing') { + } else { return ( { ); - } else { - return ; } }; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx index 36057313bbf98..bc3bc22f3f1b2 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_no_indices_content.tsx @@ -5,27 +5,61 @@ * 2.0. */ +import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import React from 'react'; + +import { NoIndices } from '../../../components/empty_states/no_indices'; +import { ViewSourceConfigurationButton } from '../../../components/source_configuration/view_source_configuration_button'; +import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; import { useLinkProps } from '../../../hooks/use_link_props'; -import { LogsPageTemplate } from '../page_template'; export const LogsPageNoIndicesContent = () => { + const { + services: { application }, + } = useKibana<{}>(); + + const canConfigureSource = application?.capabilities?.logs?.configureSource ? true : false; + const tutorialLinkProps = useLinkProps({ app: 'home', hash: '/tutorial_directory/logging', }); return ( - + + + {i18n.translate('xpack.infra.logsPage.noLoggingIndicesInstructionsActionLabel', { + defaultMessage: 'View setup instructions', + })} + + + {canConfigureSource ? ( + + + {i18n.translate('xpack.infra.configureSourceActionLabel', { + defaultMessage: 'Change source configuration', + })} + + + ) : null} + + } /> ); }; From 25e711a4fd382bbce0cc109ac18ea230aaa85242 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:31:19 -0400 Subject: [PATCH 43/77] Updated copy for Metrics --- .../public/pages/metrics/page_template.tsx | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index bee939c2ba82b..ac90d2f41341e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -6,6 +6,7 @@ */ import React, { useContext } from 'react'; +import { i18n } from '@kbn/i18n'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; @@ -20,6 +21,7 @@ export const MetricsPageTemplate: React.FC = observability: { navigation: { PageTemplate }, }, + docLinks, }, } = useKibanaContextForPlugin(); @@ -32,14 +34,25 @@ export const MetricsPageTemplate: React.FC = const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = metricIndicesExist ? undefined : { - solution: 'Observability', - pageTitle: 'Set up Metrics for Observability!', + solution: i18n.translate('xpack.metrics.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + title: i18n.translate('xpack.metrics.noDataConfig.beatsCard.title', { + defaultMessage: 'Add metrics with Beats', + }), + description: i18n.translate('xpack.metrics.noDataConfig.beatsCard.description', { + defaultMessage: + 'Use Beats to send metrics data to Elasticsearch. We make it easy with modules for many popular systems and apps.', + }), + button: i18n.translate('xpack.metrics.noDataConfig.beatsCard.buttonLabel', { + defaultMessage: 'Add metrics with Beats', + }), ...tutorialLinkProps, }, }, - docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: docLinks.links.observability.guide, }; return ; From 4f0613c12143cfab186d458ad938087ff378474d Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:40:39 -0400 Subject: [PATCH 44/77] Updated copy for landing and overview pages --- .../observability/public/pages/landing/index.tsx | 10 ++++++++-- .../observability/public/pages/overview/index.tsx | 13 +++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/observability/public/pages/landing/index.tsx b/x-pack/plugins/observability/public/pages/landing/index.tsx index 10c7c954b0e2c..b0e3a64a893eb 100644 --- a/x-pack/plugins/observability/public/pages/landing/index.tsx +++ b/x-pack/plugins/observability/public/pages/landing/index.tsx @@ -44,13 +44,19 @@ export function LandingPage() { // NO SIDE NAV since nothing is setup const hasData = false; const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = { - solution: 'Observability', + solution: i18n.translate('xpack.observability.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + description: i18n.translate('xpack.observability.noDataConfig.beatsCard.description', { + defaultMessage: + 'Use Beats and APM agents to send observability data to Elasticsearch. We make it easy with support for many popular systems, apps, and languages.', + }), href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), }, }, - docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: core.docLinks.links.observability.guide, }; return ( diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index 3926956d6c96c..e889a5a375732 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -77,13 +77,22 @@ export function OverviewPage({ routeParams }: Props) { const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = hasAnyData ? undefined : { - solution: 'Observability', + solution: i18n.translate('xpack.observability.overview.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), actions: { beats: { + description: i18n.translate( + 'xpack.observability.overview.noDataConfig.beatsCard.description', + { + defaultMessage: + 'Use Beats and APM agents to send observability data to Elasticsearch. We make it easy with support for many popular systems, apps, and languages.', + } + ), href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), }, }, - docsLink: 'https://www.elastic.co/guide/en/kibana/master/observability.html', + docsLink: core.docLinks.links.observability.guide, }; return ( From 7ef38f3fba9a663382d077c7c54e39d5e5580cba Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:48:09 -0400 Subject: [PATCH 45/77] [ElasticBeatsCard] Reuse `title` as default button label --- .../no_data_card/elastic_beats_card.tsx | 16 +++++++--------- .../components/app/RumDashboard/RumHome.tsx | 6 ------ .../routing/templates/apm_main_template.tsx | 6 ------ .../infra/public/pages/logs/page_template.tsx | 9 +++------ .../infra/public/pages/metrics/page_template.tsx | 9 +++------ x-pack/plugins/uptime/public/routes.tsx | 3 --- 6 files changed, 13 insertions(+), 36 deletions(-) diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx index a498be03a111a..23ca984302296 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_card/elastic_beats_card.tsx @@ -19,6 +19,7 @@ export type ElasticBeatsCardProps = NoDataPageActions & { export const ElasticBeatsCard: FunctionComponent = ({ recommended, + title, button, href, solution, @@ -31,27 +32,24 @@ export const ElasticBeatsCard: FunctionComponent = ({ const basePathUrl = '/plugins/kibanaReact/assets/'; const IS_DARK_THEME = uiSettings.get('theme:darkMode'); + const defaultCTAtitle = i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { + defaultMessage: 'Add data', + }); + const footer = typeof button !== 'string' && typeof button !== 'undefined' ? ( button ) : ( // The href and/or onClick are attached to the whole Card, so the button is just for show. // Do not add the behavior here too or else it will propogate through - - {button || - i18n.translate('kibana-react.noDataPage.elasticBeatsCard.buttonLabel', { - defaultMessage: 'Add data', - })} - + {button || title || defaultCTAtitle} ); return ( = ( sourceStatus?.logIndexStatus !== 'missing' ? undefined : { - solution: i18n.translate('xpack.logs.noDataConfig.solutionName', { + solution: i18n.translate('xpack.infra.logs.noDataConfig.solutionName', { defaultMessage: 'Observability', }), actions: { beats: { - title: i18n.translate('xpack.logs.noDataConfig.beatsCard.title', { + title: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.title', { defaultMessage: 'Add logs with Beats', }), - description: i18n.translate('xpack.logs.noDataConfig.beatsCard.description', { + description: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.description', { defaultMessage: 'Use Beats to send logs to Elasticsearch. We make it easy with modules for many popular systems and apps.', }), - button: i18n.translate('xpack.logs.noDataConfig.beatsCard.buttonLabel', { - defaultMessage: 'Add logs with Beats', - }), href: basePath + `/app/home#/tutorial_directory/logging`, }, }, diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index ac90d2f41341e..1379eacfa495d 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -34,21 +34,18 @@ export const MetricsPageTemplate: React.FC = const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = metricIndicesExist ? undefined : { - solution: i18n.translate('xpack.metrics.noDataConfig.solutionName', { + solution: i18n.translate('xpack.infra.metrics.noDataConfig.solutionName', { defaultMessage: 'Observability', }), actions: { beats: { - title: i18n.translate('xpack.metrics.noDataConfig.beatsCard.title', { + title: i18n.translate('xpack.infra.metrics.noDataConfig.beatsCard.title', { defaultMessage: 'Add metrics with Beats', }), - description: i18n.translate('xpack.metrics.noDataConfig.beatsCard.description', { + description: i18n.translate('xpack.infra.metrics.noDataConfig.beatsCard.description', { defaultMessage: 'Use Beats to send metrics data to Elasticsearch. We make it easy with modules for many popular systems and apps.', }), - button: i18n.translate('xpack.metrics.noDataConfig.beatsCard.buttonLabel', { - defaultMessage: 'Add metrics with Beats', - }), ...tutorialLinkProps, }, }, diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index 9fcafcfad3fb9..f8b257fa72fcf 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -189,9 +189,6 @@ export const PageRouter: FC = () => { description: i18n.translate('xpack.uptime.noDataConfig.beatsCard.description', { defaultMessage: 'Use Heartbeat to create uptime monitors.', }), - button: i18n.translate('xpack.uptime.noDataConfig.beatsCard.buttonLabel', { - defaultMessage: 'Add monitors with Heartbeat', - }), href: basePath + `/app/home#/tutorial/uptimeMonitors`, }, }, From 2e9346f090f09e67936df9f9326cee4be92ee99b Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 16:48:22 -0400 Subject: [PATCH 46/77] Better SS revert --- .../components/overview_empty/index.test.tsx | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index 0d40c52c4140f..2d21ec9565476 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -43,9 +43,28 @@ describe('OverviewEmpty', () => { test('render with correct actions ', () => { expect(wrapper.find('[data-test-subj="empty-page"]').prop('actions')).toEqual({ + beats: { + description: + 'Lightweight Beats can send data from hundreds or thousands of machines and systems', + fill: false, + label: 'Add data with Beats', + url: '/app/home#/tutorial_directory/security', + }, elasticAgent: { + description: + 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', + fill: false, + label: 'Add data with Elastic Agent', url: 'ingestUrl', }, + endpoint: { + description: + 'Protect your hosts with threat prevention, detection, and deep security data visibility.', + fill: false, + label: 'Add Endpoint Security', + onClick: undefined, + url: `/integrations/endpoint-${endpointPackageVersion}/add-integration`, + }, }); }); }); @@ -68,21 +87,6 @@ describe('OverviewEmpty', () => { label: 'Add data with Beats', url: '/app/home#/tutorial_directory/security', }, - elasticAgent: { - description: - 'The Elastic Agent provides a simple, unified way to add monitoring to your hosts.', - fill: false, - label: 'Add data with Elastic Agent', - url: 'ingestUrl', - }, - endpoint: { - description: - 'Protect your hosts with threat prevention, detection, and deep security data visibility.', - fill: false, - label: 'Add Endpoint Security', - onClick: undefined, - url: `/integrations/endpoint-${endpointPackageVersion}/add-integration`, - }, }); }); }); From d041c815b22b5cdc64c129d411a1ea5ef0077d38 Mon Sep 17 00:00:00 2001 From: cchaos Date: Mon, 16 Aug 2021 18:32:29 -0400 Subject: [PATCH 47/77] `agent` not `Agent` --- .../public/components/routing/templates/apm_main_template.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index dd2040aac3e7a..983dd78bcbab6 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -51,7 +51,7 @@ export function ApmMainTemplate({ actions: { beats: { title: i18n.translate('xpack.apm.noDataConfig.beatsCard.title', { - defaultMessage: 'Add data with APM Agents', + defaultMessage: 'Add data with APM agents', }), description: i18n.translate( 'xpack.apm.noDataConfig.beatsCard.description', From 683c1f18b221d890fdaacf4fc7fc815ccbaf2349 Mon Sep 17 00:00:00 2001 From: cauemarcondes Date: Wed, 8 Sep 2021 13:43:10 -0400 Subject: [PATCH 48/77] logic to show no data screen --- .../app/service_inventory/index.tsx | 13 +---- .../service_inventory/no_services_message.tsx | 57 +++---------------- .../routing/templates/apm_main_template.tsx | 38 ++++--------- .../routing/templates/no_data_config.ts | 44 ++++++++++++++ .../server/lib/services/get_services/index.ts | 8 --- .../get_global_apm_server_route_repository.ts | 4 +- .../apm/server/routes/historical_data.ts | 25 ++++++++ .../tests/historical_data/has_data.ts | 41 +++++++++++++ .../test/apm_api_integration/tests/index.ts | 4 ++ .../tests/services/top_services.ts | 5 -- 10 files changed, 138 insertions(+), 101 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/routing/templates/no_data_config.ts create mode 100644 x-pack/plugins/apm/server/routes/historical_data.ts create mode 100644 x-pack/test/apm_api_integration/tests/historical_data/has_data.ts 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 c822e32ea1fc6..dc8a063b85486 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 @@ -179,8 +179,6 @@ export function ServiceInventory() { canCreateJob && !userHasDismissedCallout; - const isLoading = mainStatisticsStatus === FETCH_STATUS.LOADING; - return ( <> @@ -192,17 +190,10 @@ export function ServiceInventory() { )} - ) - } + noItemsMessage={} /> diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx index a2dc5feec44f8..872359262cf02 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/no_services_message.tsx @@ -5,76 +5,35 @@ * 2.0. */ -import { EuiEmptyPrompt, EuiLink } from '@elastic/eui'; +import { EuiEmptyPrompt } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { ErrorStatePrompt } from '../../shared/ErrorStatePrompt'; -import { useUpgradeAssistantHref } from '../../shared/Links/kibana'; -import { SetupInstructionsLink } from '../../shared/Links/SetupInstructionsLink'; interface Props { - // any data submitted from APM agents found (not just in the given time range) - historicalDataFound: boolean; status: FETCH_STATUS | undefined; } -export function NoServicesMessage({ historicalDataFound, status }: Props) { - const upgradeAssistantHref = useUpgradeAssistantHref(); - - if (status === 'failure') { - return ; +export function NoServicesMessage({ status }: Props) { + if (status === FETCH_STATUS.LOADING) { + return null; } - if (historicalDataFound) { - return ( - - {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { - defaultMessage: 'No services found', - })} -
- } - titleSize="s" - /> - ); + if (status === FETCH_STATUS.FAILURE) { + return ; } return ( - {i18n.translate('xpack.apm.servicesTable.noServicesLabel', { - defaultMessage: `Looks like you don't have any APM services installed. Let's add some!`, + {i18n.translate('xpack.apm.servicesTable.notFoundLabel', { + defaultMessage: 'No services found', })} } titleSize="s" - body={ - -

- {i18n.translate('xpack.apm.servicesTable.7xUpgradeServerMessage', { - defaultMessage: `Upgrading from a pre-7.x version? Make sure you've also upgraded - your APM Server instance(s) to at least 7.0.`, - })} -

-

- {i18n.translate('xpack.apm.servicesTable.7xOldDataMessage', { - defaultMessage: - 'You may also have old data that needs to be migrated.', - })}{' '} - - {i18n.translate('xpack.apm.servicesTable.UpgradeAssistantLink', { - defaultMessage: - 'Learn more by visiting the Kibana Upgrade Assistant', - })} - - . -

-
- } - actions={} /> ); } diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 4423a53b96a30..56f77c6bfcc63 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -6,14 +6,15 @@ */ import { EuiPageHeaderProps } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import React from 'react'; import { useKibana, KibanaPageTemplateProps, } from '../../../../../../../src/plugins/kibana_react/public'; +import { useFetcher } from '../../../hooks/use_fetcher'; import { ApmPluginStartDeps } from '../../../plugin'; import { ApmEnvironmentFilter } from '../../shared/EnvironmentFilter'; +import { getNoDataConfig } from './no_data_config'; /* * This template contains: @@ -41,33 +42,16 @@ export function ApmMainTemplate({ const ObservabilityPageTemplate = services.observability.navigation.PageTemplate; - // TODO: NEEDS A DATA CHECK - const hasData = true; - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !hasData - ? { - solution: i18n.translate('xpack.apm.noDataConfig.solutionName', { - defaultMessage: 'Observability', - }), - actions: { - beats: { - title: i18n.translate('xpack.apm.noDataConfig.beatsCard.title', { - defaultMessage: 'Add data with APM agents', - }), - description: i18n.translate( - 'xpack.apm.noDataConfig.beatsCard.description', - { - defaultMessage: - 'Use APM agents to collect APM data. We make it easy with agents for many popular languages.', - } - ), - href: basePath + `/app/home#/tutorial/apm`, - }, - }, - docsLink: docLinks!.links.observability.guide, - } - : undefined; + const { data } = useFetcher((callApmApi) => { + return callApmApi({ endpoint: 'GET /api/apm/has_data' }); + }, []); + + const noDataConfig = getNoDataConfig({ + basePath, + docsLink: docLinks!.links.observability.guide, + hasData: data?.hasData, + }); - // TODO: GET A CHECK return ( { const repository = createApmServerRouteRepository() @@ -56,7 +57,8 @@ const getTypedGlobalApmServerRouteRepository = () => { .merge(sourceMapsRouteRepository) .merge(apmFleetRouteRepository) .merge(backendsRouteRepository) - .merge(fallbackToTransactionsRouteRepository); + .merge(fallbackToTransactionsRouteRepository) + .merge(historicalDataRouteRepository); return repository; }; diff --git a/x-pack/plugins/apm/server/routes/historical_data.ts b/x-pack/plugins/apm/server/routes/historical_data.ts new file mode 100644 index 0000000000000..bd36213b06d5c --- /dev/null +++ b/x-pack/plugins/apm/server/routes/historical_data.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 { setupRequest } from '../lib/helpers/setup_request'; +import { hasHistoricalAgentData } from '../lib/services/get_services/has_historical_agent_data'; +import { createApmServerRoute } from './create_apm_server_route'; +import { createApmServerRouteRepository } from './create_apm_server_route_repository'; + +const hasDataRoute = createApmServerRoute({ + endpoint: 'GET /api/apm/has_data', + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const setup = await setupRequest(resources); + const hasData = await hasHistoricalAgentData(setup); + return { hasData }; + }, +}); + +export const historicalDataRouteRepository = createApmServerRouteRepository().add( + hasDataRoute +); diff --git a/x-pack/test/apm_api_integration/tests/historical_data/has_data.ts b/x-pack/test/apm_api_integration/tests/historical_data/has_data.ts new file mode 100644 index 0000000000000..ec3f0e5e7f362 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/historical_data/has_data.ts @@ -0,0 +1,41 @@ +/* + * 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 { registry } from '../../common/registry'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const archiveName = 'apm_8.0.0'; + + registry.when( + 'Historical data when data is not loaded', + { config: 'basic', archives: [] }, + () => { + it('handles the empty state', async () => { + const response = await supertest.get(`/api/apm/has_data`); + + expect(response.status).to.be(200); + expect(response.body.hasData).to.be(false); + }); + } + ); + + registry.when( + 'Historical data when data is loaded', + { config: 'basic', archives: [archiveName] }, + () => { + it('returns hasData: true', async () => { + const response = await supertest.get(`/api/apm/has_data`); + + expect(response.status).to.be(200); + expect(response.body.hasData).to.be(true); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/index.ts b/x-pack/test/apm_api_integration/tests/index.ts index c8a57bc613a92..be3860aebd401 100644 --- a/x-pack/test/apm_api_integration/tests/index.ts +++ b/x-pack/test/apm_api_integration/tests/index.ts @@ -221,6 +221,10 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte loadTestFile(require.resolve('./csm/web_core_vitals')); }); + describe('historical_data/has_data', function () { + loadTestFile(require.resolve('./historical_data/has_data')); + }); + registry.run(providerContext); }); } diff --git a/x-pack/test/apm_api_integration/tests/services/top_services.ts b/x-pack/test/apm_api_integration/tests/services/top_services.ts index 86d5db591a6ba..bd4152fc8e2f3 100644 --- a/x-pack/test/apm_api_integration/tests/services/top_services.ts +++ b/x-pack/test/apm_api_integration/tests/services/top_services.ts @@ -35,7 +35,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { ); expect(response.status).to.be(200); - expect(response.body.hasHistoricalData).to.be(false); expect(response.body.hasLegacyData).to.be(false); expect(response.body.items.length).to.be(0); }); @@ -64,10 +63,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(response.status).to.eql(200); }); - it('returns hasHistoricalData: true', () => { - expect(response.body.hasHistoricalData).to.be(true); - }); - it('returns hasLegacyData: false', () => { expect(response.body.hasLegacyData).to.be(false); }); From a72d42e510c6e141ce2864e358b16d063ce17d5a Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 8 Sep 2021 14:30:04 -0400 Subject: [PATCH 49/77] i18n --- x-pack/plugins/translations/translations/ja-JP.json | 8 +------- x-pack/plugins/translations/translations/zh-CN.json | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c857c98d5b398..f06f3eb37bc8e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -6895,20 +6895,16 @@ "xpack.apm.serviceProfiling.valueTypeLabel.samples": "サンプル", "xpack.apm.serviceProfiling.valueTypeLabel.unknown": "その他", "xpack.apm.serviceProfiling.valueTypeLabel.wallTime": "Wall", - "xpack.apm.servicesTable.7xOldDataMessage": "また、移行が必要な古いデータがある可能性もあります。", - "xpack.apm.servicesTable.7xUpgradeServerMessage": "バージョン7.xより前からのアップグレードですか?また、\n APM Server インスタンスを7.0以降にアップグレードしていることも確認してください。", "xpack.apm.servicesTable.environmentColumnLabel": "環境", "xpack.apm.servicesTable.healthColumnLabel": "ヘルス", "xpack.apm.servicesTable.latencyAvgColumnLabel": "レイテンシ(平均)", "xpack.apm.servicesTable.metricsExplanationLabel": "これらのメトリックは何か。", "xpack.apm.servicesTable.nameColumnLabel": "名前", - "xpack.apm.servicesTable.noServicesLabel": "APM サービスがインストールされていないようです。追加しましょう!", "xpack.apm.servicesTable.notFoundLabel": "サービスが見つかりません", "xpack.apm.servicesTable.throughputColumnLabel": "スループット", "xpack.apm.servicesTable.tooltip.metricsExplanation": "サービスメトリックは、トランザクションタイプ「要求」、「ページ読み込み」、または上位の使用可能なトランザクションタイプのいずれかで集計されます。", "xpack.apm.servicesTable.transactionColumnLabel": "トランザクションタイプ", "xpack.apm.servicesTable.transactionErrorRate": "失敗したトランザクション率", - "xpack.apm.servicesTable.UpgradeAssistantLink": "Kibana アップグレードアシスタントで詳細をご覧ください", "xpack.apm.settings.agentConfig": "エージェントの編集", "xpack.apm.settings.agentConfig.createConfigButton.tooltip": "エージェント構成を作成する権限がありません", "xpack.apm.settings.agentConfig.descriptionText": "APMアプリ内からエージェント構成を微調整してください。変更はAPMエージェントに自動的に伝達されるので、再デプロイする必要はありません。", @@ -13026,9 +13022,7 @@ "xpack.infra.homePage.documentTitle": "メトリック", "xpack.infra.homePage.inventoryTabTitle": "インベントリ", "xpack.infra.homePage.metricsExplorerTabTitle": "メトリックエクスプローラー", - "xpack.infra.homePage.noMetricsIndicesDescription": "追加しましょう!", "xpack.infra.homePage.noMetricsIndicesInstructionsActionLabel": "セットアップの手順を表示", - "xpack.infra.homePage.noMetricsIndicesTitle": "メトリックインデックスがないようです。", "xpack.infra.homePage.settingsTabTitle": "設定", "xpack.infra.homePage.toolbar.kqlSearchFieldPlaceholder": "インフラストラクチャデータを検索…(例:host.name:host-1)", "xpack.infra.homePage.toolbar.showingLastOneMinuteDataText": "指定期間のデータの最後の{duration}", @@ -27093,4 +27087,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 d5022fb43da04..5a4c1bfe44919 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -6949,21 +6949,17 @@ "xpack.apm.serviceProfiling.valueTypeLabel.samples": "样例", "xpack.apm.serviceProfiling.valueTypeLabel.unknown": "其他", "xpack.apm.serviceProfiling.valueTypeLabel.wallTime": "现实时间", - "xpack.apm.servicesTable.7xOldDataMessage": "可能还有需要迁移的旧数据。", - "xpack.apm.servicesTable.7xUpgradeServerMessage": "从 7.x 之前的版本升级?另外,确保您已将\n APM Server 实例升级到至少 7.0。", "xpack.apm.servicesTable.environmentColumnLabel": "环境", "xpack.apm.servicesTable.environmentCount": "{environmentCount, plural, one {1 个环境} other {# 个环境}}", "xpack.apm.servicesTable.healthColumnLabel": "运行状况", "xpack.apm.servicesTable.latencyAvgColumnLabel": "延迟(平均值)", "xpack.apm.servicesTable.metricsExplanationLabel": "这些指标是什么?", "xpack.apm.servicesTable.nameColumnLabel": "名称", - "xpack.apm.servicesTable.noServicesLabel": "似乎您没有安装任何 APM 服务。让我们添加一些!", "xpack.apm.servicesTable.notFoundLabel": "未找到任何服务", "xpack.apm.servicesTable.throughputColumnLabel": "吞吐量", "xpack.apm.servicesTable.tooltip.metricsExplanation": "服务指标将基于事务类型“request”、“page-load”或排名靠前的可用事务类型进行聚合。", "xpack.apm.servicesTable.transactionColumnLabel": "事务类型", "xpack.apm.servicesTable.transactionErrorRate": "失败事务率", - "xpack.apm.servicesTable.UpgradeAssistantLink": "通过访问 Kibana 升级助手来了解详情", "xpack.apm.settings.agentConfig": "代理配置", "xpack.apm.settings.agentConfig.createConfigButton.tooltip": "您无权创建代理配置", "xpack.apm.settings.agentConfig.descriptionText": "从 APM 应用中微调您的代理配置。更改将自动传播到 APM 代理,因此无需重新部署。", @@ -13200,9 +13196,7 @@ "xpack.infra.homePage.documentTitle": "指标", "xpack.infra.homePage.inventoryTabTitle": "库存", "xpack.infra.homePage.metricsExplorerTabTitle": "指标浏览器", - "xpack.infra.homePage.noMetricsIndicesDescription": "让我们添加一些!", "xpack.infra.homePage.noMetricsIndicesInstructionsActionLabel": "查看设置说明", - "xpack.infra.homePage.noMetricsIndicesTitle": "似乎您没有任何指标索引。", "xpack.infra.homePage.settingsTabTitle": "设置", "xpack.infra.homePage.toolbar.kqlSearchFieldPlaceholder": "搜索基础设施数据……(例如 host.name:host-1)", "xpack.infra.homePage.toolbar.showingLastOneMinuteDataText": "选定时间过去 {duration}的数据", @@ -27540,4 +27534,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "此字段必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} \ No newline at end of file +} From 5f39a8fadf98c8ab7cc69483ad19033f6e1ef3e6 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Mon, 13 Sep 2021 11:59:01 -0400 Subject: [PATCH 50/77] Fixing bad rebase in APM template --- .../public/components/routing/templates/apm_main_template.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index b97560ae813c8..abb9f53395b83 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -35,8 +35,6 @@ export function ApmMainTemplate({ pageHeader?: EuiPageHeaderProps; children: React.ReactNode; } & KibanaPageTemplateProps) { - const { http, docLinks } = useKibana().services; - const basePath = http?.basePath.get(); const { services } = useKibana(); const { http, docLinks } = services; const basePath = http?.basePath.get(); From b92fca97b9c6bfe6fad3d5a61b87a92967e8d9ee Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Mon, 13 Sep 2021 12:02:17 -0400 Subject: [PATCH 51/77] Delete historical_data.ts --- .../apm/server/routes/historical_data.ts | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 x-pack/plugins/apm/server/routes/historical_data.ts diff --git a/x-pack/plugins/apm/server/routes/historical_data.ts b/x-pack/plugins/apm/server/routes/historical_data.ts deleted file mode 100644 index bd36213b06d5c..0000000000000 --- a/x-pack/plugins/apm/server/routes/historical_data.ts +++ /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 { setupRequest } from '../lib/helpers/setup_request'; -import { hasHistoricalAgentData } from '../lib/services/get_services/has_historical_agent_data'; -import { createApmServerRoute } from './create_apm_server_route'; -import { createApmServerRouteRepository } from './create_apm_server_route_repository'; - -const hasDataRoute = createApmServerRoute({ - endpoint: 'GET /api/apm/has_data', - options: { tags: ['access:apm'] }, - handler: async (resources) => { - const setup = await setupRequest(resources); - const hasData = await hasHistoricalAgentData(setup); - return { hasData }; - }, -}); - -export const historicalDataRouteRepository = createApmServerRouteRepository().add( - hasDataRoute -); From 33dc8dc745308c7d427b7ef6e0df48e6793ba760 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Mon, 13 Sep 2021 12:05:10 -0400 Subject: [PATCH 52/77] Fix from rebase to Overview page --- .../public/pages/overview/index.tsx | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/x-pack/plugins/observability/public/pages/overview/index.tsx b/x-pack/plugins/observability/public/pages/overview/index.tsx index d7f92444b9818..26dbf5ece400c 100644 --- a/x-pack/plugins/observability/public/pages/overview/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/index.tsx @@ -8,7 +8,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; -import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; import { useTrackPageview } from '../..'; import { Alert } from '../../../../alerting/common'; import { EmptySections } from '../../components/app/empty_sections'; @@ -82,28 +81,6 @@ export function OverviewPage({ routeParams }: Props) { end: absoluteTime.end, }); - // TODO: GET THE RIGHT CHECK - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = hasAnyData - ? undefined - : { - solution: i18n.translate('xpack.observability.overview.noDataConfig.solutionName', { - defaultMessage: 'Observability', - }), - actions: { - beats: { - description: i18n.translate( - 'xpack.observability.overview.noDataConfig.beatsCard.description', - { - defaultMessage: - 'Use Beats and APM agents to send observability data to Elasticsearch. We make it easy with support for many popular systems, apps, and languages.', - } - ), - href: core.http.basePath.prepend(`/app/home#/tutorial_directory/logging`), - }, - }, - docsLink: core.docLinks.links.observability.guide, - }; - return ( Date: Thu, 16 Sep 2021 19:58:04 -0400 Subject: [PATCH 53/77] Fix RumHome from rebase --- .../apm/public/components/app/RumDashboard/RumHome.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 8ce33a4543a7e..0371f7eb669e5 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -5,11 +5,11 @@ * 2.0. */ -import React, { useContext } from 'react'; +import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiTitle, EuiFlexItem } from '@elastic/eui'; import { RumOverview } from '../RumDashboard'; -import { CsmSharedContext, CsmSharedContextProvider } from './CsmSharedContext'; +import { CsmSharedContextProvider } from './CsmSharedContext'; import { WebApplicationSelect } from './Panels/WebApplicationSelect'; import { DatePicker } from '../../shared/DatePicker'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; From fdd84aa7e0050fa65b4154d32649957214b0fa25 Mon Sep 17 00:00:00 2001 From: Caroline Horn <549577+cchaos@users.noreply.github.com> Date: Thu, 16 Sep 2021 20:00:24 -0400 Subject: [PATCH 54/77] Use KibanaPageTemplateProps --- .../public/components/routing/templates/apm_main_template.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 4516a0f041104..0e05a1dc67b30 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -8,7 +8,7 @@ import { EuiPageHeaderProps } from '@elastic/eui'; import React from 'react'; import { useLocation } from 'react-router-dom'; -import { useKibana } from '../../../../../../../src/plugins/kibana_react/public'; +import { useKibana, KibanaPageTemplateProps } from '../../../../../../../src/plugins/kibana_react/public'; import { useFetcher } from '../../../hooks/use_fetcher'; import { ApmPluginStartDeps } from '../../../plugin'; import { ApmEnvironmentFilter } from '../../shared/EnvironmentFilter'; @@ -35,7 +35,7 @@ export function ApmMainTemplate({ pageTitle?: React.ReactNode; pageHeader?: EuiPageHeaderProps; children: React.ReactNode; -} & EuiPageTemplateProps) { +} & KibanaPageTemplateProps) { const location = useLocation(); const { services } = useKibana(); From 30b7d6f8ea25ec4141cc0de1b081f6a1cc494845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Tue, 21 Sep 2021 11:45:47 +0200 Subject: [PATCH 55/77] Add `hasData` prop to `LogsPageTemplate` --- .../infra/public/pages/logs/page_template.tsx | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/logs/page_template.tsx b/x-pack/plugins/infra/public/pages/logs/page_template.tsx index d7a6e3104a032..08f7bddce1daf 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_template.tsx @@ -9,15 +9,19 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; -import { useLogSourceContext } from '../../containers/logs/log_source'; import { KibanaPageTemplateProps, useKibana, } from '../../../../../../src/plugins/kibana_react/public'; -export const LogsPageTemplate: React.FC = ( - pageTemplateProps -) => { +interface LogsPageTemplateProps extends LazyObservabilityPageTemplateProps { + hasData?: boolean; +} + +export const LogsPageTemplate: React.FC = ({ + hasData = true, + ...pageTemplateProps +}) => { const { services: { observability: { @@ -30,28 +34,26 @@ export const LogsPageTemplate: React.FC = ( const { http } = useKibana().services; const basePath = http!.basePath.get(); - const { sourceStatus } = useLogSourceContext(); - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = - sourceStatus?.logIndexStatus !== 'missing' - ? undefined - : { - solution: i18n.translate('xpack.infra.logs.noDataConfig.solutionName', { - defaultMessage: 'Observability', - }), - actions: { - beats: { - title: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.title', { - defaultMessage: 'Add logs with Beats', - }), - description: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.description', { - defaultMessage: - 'Use Beats to send logs to Elasticsearch. We make it easy with modules for many popular systems and apps.', - }), - href: basePath + `/app/home#/tutorial_directory/logging`, - }, + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = hasData + ? undefined + : { + solution: i18n.translate('xpack.infra.logs.noDataConfig.solutionName', { + defaultMessage: 'Observability', + }), + actions: { + beats: { + title: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.title', { + defaultMessage: 'Add logs with Beats', + }), + description: i18n.translate('xpack.infra.logs.noDataConfig.beatsCard.description', { + defaultMessage: + 'Use Beats to send logs to Elasticsearch. We make it easy with modules for many popular systems and apps.', + }), + href: basePath + `/app/home#/tutorial_directory/logging`, }, - docsLink: docLinks.links.observability.guide, - }; + }, + docsLink: docLinks.links.observability.guide, + }; return ; }; From edf7e976da50769558a1dda657d8719597bda621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Tue, 21 Sep 2021 12:06:50 +0200 Subject: [PATCH 56/77] Check for data in log pages --- .../public/pages/logs/log_entry_categories/page_content.tsx | 3 +++ .../pages/logs/log_entry_categories/page_results_content.tsx | 3 +++ .../infra/public/pages/logs/log_entry_rate/page_content.tsx | 3 +++ .../public/pages/logs/log_entry_rate/page_results_content.tsx | 3 ++- x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx | 2 ++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx index a8d98ea843c96..542b1dcd21d80 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx @@ -25,6 +25,7 @@ import { LogEntryCategoriesResultsContent } from './page_results_content'; import { LogEntryCategoriesSetupContent } from './page_setup_content'; import { LogsPageTemplate } from '../page_template'; import type { LazyObservabilityPageTemplateProps } from '../../../../../observability/public'; +import { useLogSourceContext } from '../../../containers/logs/log_source'; const logCategoriesTitle = i18n.translate('xpack.infra.logs.logCategoriesTitle', { defaultMessage: 'Categories', @@ -114,8 +115,10 @@ const CategoriesPageTemplate: React.FC = ({ children, ...rest }) => { + const { sourceStatus } = useLogSourceContext(); return ( = ({ children, ...rest }) => { + const { sourceStatus } = useLogSourceContext(); return ( ], diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx index c104acf396f54..7f8ed4fa6a951 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_content.tsx @@ -26,6 +26,7 @@ export const StreamPageContent: React.FunctionComponent = () => { isUninitialized, loadSource, latestLoadSourceFailures, + sourceStatus, } = useLogSourceContext(); if (isLoading || isUninitialized) { @@ -36,6 +37,7 @@ export const StreamPageContent: React.FunctionComponent = () => { return ( Date: Tue, 21 Sep 2021 12:09:02 +0200 Subject: [PATCH 57/77] Add `hasData` prop to `MetricsPageTemplate` --- .../public/pages/metrics/page_template.tsx | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index 1379eacfa495d..96782fe7b37da 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -5,17 +5,21 @@ * 2.0. */ -import React, { useContext } from 'react'; +import React from 'react'; import { i18n } from '@kbn/i18n'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import type { LazyObservabilityPageTemplateProps } from '../../../../observability/public'; import { KibanaPageTemplateProps } from '../../../../../../src/plugins/kibana_react/public'; -import { Source } from '../../containers/metrics_source'; import { useLinkProps } from '../../hooks/use_link_props'; -export const MetricsPageTemplate: React.FC = ( - pageTemplateProps -) => { +interface MetricsPageTemplateProps extends LazyObservabilityPageTemplateProps { + hasData?: boolean; +} + +export const MetricsPageTemplate: React.FC = ({ + hasData = true, + ...pageTemplateProps +}) => { const { services: { observability: { @@ -30,8 +34,7 @@ export const MetricsPageTemplate: React.FC = hash: '/tutorial_directory/metrics', }); - const { metricIndicesExist } = useContext(Source.Context); - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = metricIndicesExist + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = hasData ? undefined : { solution: i18n.translate('xpack.infra.metrics.noDataConfig.solutionName', { From 89c16eb849e42bd76aaac5b438a25007059787a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Tue, 21 Sep 2021 13:38:39 +0200 Subject: [PATCH 58/77] Check for data in metrics pages --- .../infra/public/pages/metrics/inventory_view/index.tsx | 3 ++- .../metrics/metric_detail/components/node_details_page.tsx | 5 ++++- .../infra/public/pages/metrics/metric_detail/index.tsx | 4 ++-- .../infra/public/pages/metrics/metrics_explorer/index.tsx | 6 ++++-- .../metrics/settings/source_configuration_settings.tsx | 2 ++ 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx index a4db6db23145b..67e39a11c12e7 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/index.tsx @@ -69,6 +69,7 @@ export const SnapshotPage = () => { defaultViewState={DEFAULT_WAFFLE_VIEW_STATE} > ], @@ -86,7 +87,7 @@ export const SnapshotPage = () => { ) : hasFailedLoadingSource ? ( ) : ( - + )} ); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/node_details_page.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/node_details_page.tsx index 496a57cf7273a..8da96586be979 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/node_details_page.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/node_details_page.tsx @@ -5,10 +5,11 @@ * 2.0. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState, useContext } from 'react'; import dateMath from '@elastic/datemath'; import moment from 'moment'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { Source } from '../../../../containers/metrics_source'; import { InventoryMetric, InventoryItemType } from '../../../../../common/inventory_models/types'; import { useNodeDetails } from '../hooks/use_node_details'; import { MetricsSideNav } from './side_nav'; @@ -52,6 +53,7 @@ const parseRange = (range: MetricsTimeInput) => { }; export const NodeDetailsPage = (props: Props) => { + const { metricIndicesExist } = useContext(Source.Context); const [parsedTimeRange, setParsedTimeRange] = useState(parseRange(props.timeRange)); const { metrics, loading, makeRequest, error } = useNodeDetails( props.requiredMetrics, @@ -80,6 +82,7 @@ export const NodeDetailsPage = (props: Props) => { return ( + { if (currentView) { onViewStateChange(currentView); @@ -85,6 +86,7 @@ export const MetricsExplorerPage = ({ source, derivedIndexPattern }: MetricsExpl } /> Date: Tue, 21 Sep 2021 09:58:50 -0400 Subject: [PATCH 59/77] Fix bad rebase to routes --- x-pack/plugins/uptime/public/routes.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx index c1859610e1a02..e151e19180dd4 100644 --- a/x-pack/plugins/uptime/public/routes.tsx +++ b/x-pack/plugins/uptime/public/routes.tsx @@ -32,7 +32,6 @@ import { CertRefreshBtn } from './components/certificates/cert_refresh_btn'; import { CertificateTitle } from './components/certificates/certificate_title'; import { SyntheticsCallout } from './components/overview/synthetics_callout'; import { APP_WRAPPER_CLASS } from '../../../../src/core/public'; -import { indexStatusSelector } from './state/selectors'; import { StepDetailPageChildren, StepDetailPageHeader, From 1493eab1af334d9d16433c65b2ff35ab2e97b38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Wed, 22 Sep 2021 13:23:33 +0200 Subject: [PATCH 60/77] Add test subject to no data screen --- .../public/page_template/no_data_page/no_data_page.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx index 56eb0f34617d6..03aab4808e503 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx @@ -33,6 +33,7 @@ export const NO_DATA_PAGE_TEMPLATE_PROPS: KibanaPageTemplateProps = { hasShadow: false, color: 'transparent', }, + 'data-test-subj': 'noDataPage', }; export const NO_DATA_RECOMMENDED = i18n.translate( From bbfc4e5af2a91132847fbd87779cc237d6b7ec81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Wed, 22 Sep 2021 13:27:54 +0200 Subject: [PATCH 61/77] Fix log entry categories tab test --- .../apps/infra/log_entry_categories_tab.ts | 13 ++++++++++++- .../services/logs_ui/log_entry_categories.ts | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts b/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts index 33133e6306efe..11587845aae9c 100644 --- a/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts +++ b/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts @@ -10,6 +10,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); const logsUi = getService('logsUi'); const retry = getService('retry'); @@ -17,12 +18,22 @@ export default ({ getService }: FtrProviderContext) => { this.tags('includeFirefox'); describe('with a trial license', () => { - it('is visible', async () => { + it('Shows no data page when indices do not exist', async () => { + await logsUi.logEntryCategoriesPage.navigateTo(); + + await retry.try(async () => { + expect(await logsUi.logEntryCategoriesPage.getNoDataScreen()).to.be.ok(); + }); + }); + + it('shows setup page when indices exist', async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/simple_logs'); await logsUi.logEntryCategoriesPage.navigateTo(); await retry.try(async () => { expect(await logsUi.logEntryCategoriesPage.getSetupScreen()).to.be.ok(); }); + await esArchiver.unload('x-pack/test/functional/es_archives/infra/simple_logs'); }); }); }); diff --git a/x-pack/test/functional/services/logs_ui/log_entry_categories.ts b/x-pack/test/functional/services/logs_ui/log_entry_categories.ts index b244360ce4ce4..0aec1cbea2210 100644 --- a/x-pack/test/functional/services/logs_ui/log_entry_categories.ts +++ b/x-pack/test/functional/services/logs_ui/log_entry_categories.ts @@ -17,6 +17,10 @@ export function LogEntryCategoriesPageProvider({ getPageObjects, getService }: F await pageObjects.infraLogs.navigateToTab('log-categories'); }, + async getNoDataScreen(): Promise { + return await testSubjects.find('noDataPage'); + }, + async getSetupScreen(): Promise { return await testSubjects.find('logEntryCategoriesSetupPage'); }, From fa13307e91aee5458d6ea98d599b1bd45e11d400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Wed, 22 Sep 2021 13:43:48 +0200 Subject: [PATCH 62/77] Fix infrastructure_security test --- .../apps/infra/feature_controls/infrastructure_security.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts index 0118cfdafc2b3..f454d5469dea9 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts @@ -169,7 +169,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); - await testSubjects.existOrFail('~infrastructureViewSetupInstructionsButton'); + await testSubjects.existOrFail('~noDataPage'); await testSubjects.missingOrFail('~configureSourceButton'); }); From 9d6e9af6c58d1188982e5bc4538a13d004ac0c50 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 22 Sep 2021 09:41:15 -0400 Subject: [PATCH 63/77] Remove hard-coded DTS on NoDataPage and ensure one is passed through to the KibanaPageTemplate --- .../public/page_template/no_data_page/no_data_page.tsx | 1 - .../kibana_react/public/page_template/page_template.tsx | 1 + x-pack/plugins/infra/public/pages/logs/page_template.tsx | 9 ++++++++- .../plugins/infra/public/pages/metrics/page_template.tsx | 9 ++++++++- .../components/shared/page_template/page_template.tsx | 1 + .../plugins/uptime/public/apps/uptime_page_template.tsx | 2 +- 6 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx index 03aab4808e503..56eb0f34617d6 100644 --- a/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx +++ b/src/plugins/kibana_react/public/page_template/no_data_page/no_data_page.tsx @@ -33,7 +33,6 @@ export const NO_DATA_PAGE_TEMPLATE_PROPS: KibanaPageTemplateProps = { hasShadow: false, color: 'transparent', }, - 'data-test-subj': 'noDataPage', }; export const NO_DATA_RECOMMENDED = i18n.translate( diff --git a/src/plugins/kibana_react/public/page_template/page_template.tsx b/src/plugins/kibana_react/public/page_template/page_template.tsx index 1132d1dc6b4ed..cf2b27c3b00da 100644 --- a/src/plugins/kibana_react/public/page_template/page_template.tsx +++ b/src/plugins/kibana_react/public/page_template/page_template.tsx @@ -133,6 +133,7 @@ export const KibanaPageTemplate: FunctionComponent = ({ if (noDataConfig) { return ( = ({ hasData = true, + 'data-test-subj': _dataTestSubj, ...pageTemplateProps }) => { const { @@ -55,5 +56,11 @@ export const LogsPageTemplate: React.FC = ({ docsLink: docLinks.links.observability.guide, }; - return ; + return ( + + ); }; diff --git a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx index 96782fe7b37da..41ea12c280841 100644 --- a/x-pack/plugins/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/page_template.tsx @@ -18,6 +18,7 @@ interface MetricsPageTemplateProps extends LazyObservabilityPageTemplateProps { export const MetricsPageTemplate: React.FC = ({ hasData = true, + 'data-test-subj': _dataTestSubj, ...pageTemplateProps }) => { const { @@ -55,5 +56,11 @@ export const MetricsPageTemplate: React.FC = ({ docsLink: docLinks.links.observability.guide, }; - return ; + return ( + + ); }; diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx index 36b69782a424e..c966e187ce2a6 100644 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx +++ b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx @@ -121,6 +121,7 @@ export function ObservabilityPageTemplate({ return ( = ({ path, pageHeader, return ( <> -
{loading && path === OVERVIEW_ROUTE && } From 0372ce09aac55f54cf1f54e82e935a1c1eec5683 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 22 Sep 2021 09:46:39 -0400 Subject: [PATCH 64/77] Fix lint error --- .../components/routing/templates/apm_main_template.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 0e05a1dc67b30..ac0b8a1517b20 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -8,7 +8,10 @@ import { EuiPageHeaderProps } from '@elastic/eui'; import React from 'react'; import { useLocation } from 'react-router-dom'; -import { useKibana, KibanaPageTemplateProps } from '../../../../../../../src/plugins/kibana_react/public'; +import { + useKibana, + KibanaPageTemplateProps, +} from '../../../../../../../src/plugins/kibana_react/public'; import { useFetcher } from '../../../hooks/use_fetcher'; import { ApmPluginStartDeps } from '../../../plugin'; import { ApmEnvironmentFilter } from '../../shared/EnvironmentFilter'; From cc4ae52bf68c67519db2f86b1f75d8cadbe54c02 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 22 Sep 2021 09:51:11 -0400 Subject: [PATCH 65/77] =?UTF-8?q?Remove=20DTS=20test=20=F0=9F=A4=A6?= =?UTF-8?q?=E2=80=8D=E2=99=80=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/components/shared/page_template/page_template.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx index c966e187ce2a6..36b69782a424e 100644 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx +++ b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx @@ -121,7 +121,6 @@ export function ObservabilityPageTemplate({ return ( Date: Wed, 22 Sep 2021 16:02:26 +0200 Subject: [PATCH 66/77] enable no data view on tls certificate route --- .../uptime/public/apps/uptime_page_template.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/uptime/public/apps/uptime_page_template.tsx b/x-pack/plugins/uptime/public/apps/uptime_page_template.tsx index 3d199d326366d..ded81075141ff 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_page_template.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_page_template.tsx @@ -8,7 +8,7 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import { EuiPageHeaderProps } from '@elastic/eui'; -import { OVERVIEW_ROUTE } from '../../common/constants'; +import { CERTIFICATES_ROUTE, OVERVIEW_ROUTE } from '../../common/constants'; import { useKibana } from '../../../../../src/plugins/kibana_react/public'; import { ClientPluginsStart } from './plugin'; import { useNoDataConfig } from './use_no_data_config'; @@ -44,16 +44,18 @@ export const UptimePageTemplateComponent: React.FC = ({ path, pageHeader, return ; } + const isMainRoute = path === OVERVIEW_ROUTE || path === CERTIFICATES_ROUTE; + return ( <> - {loading && path === OVERVIEW_ROUTE && } + {loading && isMainRoute && }
{children} From 45b00703958bb848f3cc86724f132e2ab4dd0228 Mon Sep 17 00:00:00 2001 From: cchaos Date: Wed, 22 Sep 2021 10:56:54 -0400 Subject: [PATCH 67/77] Fix uptime page layout --- x-pack/plugins/uptime/public/apps/uptime_app.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/uptime/public/apps/uptime_app.tsx b/x-pack/plugins/uptime/public/apps/uptime_app.tsx index f82a312ef91f5..73f228f621540 100644 --- a/x-pack/plugins/uptime/public/apps/uptime_app.tsx +++ b/x-pack/plugins/uptime/public/apps/uptime_app.tsx @@ -126,11 +126,9 @@ const Application = (props: UptimeAppProps) => { className={APP_WRAPPER_CLASS} application={core.application} > -
- - - -
+ + +
From d5fc41f999c3af9e612857e74dea24cd4dd39dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Mon, 27 Sep 2021 14:55:53 +0200 Subject: [PATCH 68/77] Remove unnecessary check for the metrics settings page --- .../pages/metrics/settings/source_configuration_settings.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx index 7278b3f9a4880..0adf4ed6b5b45 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx @@ -49,7 +49,6 @@ export const SourceConfigurationSettings = ({ isLoading, isUninitialized, updateSourceConfiguration, - metricIndicesExist, } = useContext(Source.Context); const { @@ -93,7 +92,6 @@ export const SourceConfigurationSettings = ({ return ( Date: Fri, 1 Oct 2021 14:50:49 +0200 Subject: [PATCH 69/77] Fix metrics no indices test --- x-pack/test/functional/page_objects/infra_home_page.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/page_objects/infra_home_page.ts b/x-pack/test/functional/page_objects/infra_home_page.ts index 0790c694e772c..726668e3b1b0a 100644 --- a/x-pack/test/functional/page_objects/infra_home_page.ts +++ b/x-pack/test/functional/page_objects/infra_home_page.ts @@ -141,7 +141,7 @@ export function InfraHomePageProvider({ getService, getPageObjects }: FtrProvide }, async getNoMetricsIndicesPrompt() { - return await testSubjects.find('noMetricsIndicesPrompt'); + return await testSubjects.find('noDataPage'); }, async getNoMetricsDataPrompt() { From d2fbe0ffc42fbf950a8e9387cd9322500c17345b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Fri, 1 Oct 2021 14:59:46 +0200 Subject: [PATCH 70/77] Fix more tests --- .../infra/feature_controls/infrastructure_security.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts index f454d5469dea9..65b9019f556fd 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_security.ts @@ -66,13 +66,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('infrastructure landing page without data', () => { - it(`shows 'Change source configuration' button`, async () => { + it('shows no data page', async () => { await PageObjects.common.navigateToUrlWithBrowserHistory('infraOps', '', undefined, { ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); - await testSubjects.existOrFail('~infrastructureViewSetupInstructionsButton'); - await testSubjects.existOrFail('~configureSourceButton'); + await testSubjects.existOrFail('~noDataPage'); }); it(`doesn't show read-only badge`, async () => { @@ -164,13 +163,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('infrastructure landing page without data', () => { - it(`doesn't show 'Change source configuration' button`, async () => { + it('shows No data page', async () => { await PageObjects.common.navigateToUrlWithBrowserHistory('infraOps', '', undefined, { ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); await testSubjects.existOrFail('~noDataPage'); - await testSubjects.missingOrFail('~configureSourceButton'); }); it(`shows read-only badge`, async () => { From e976f05ecc80b24c067d619ab6328a4f9bff1d15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Mon, 4 Oct 2021 13:19:48 +0200 Subject: [PATCH 71/77] Fix logEntryRate test --- .../functional/apps/infra/log_entry_rate_tab.ts | 13 ++++++++++++- .../functional/services/logs_ui/log_entry_rate.ts | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts b/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts index 1635824529749..632b1e6917ca0 100644 --- a/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts +++ b/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts @@ -12,17 +12,28 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getService }: FtrProviderContext) => { const logsUi = getService('logsUi'); const retry = getService('retry'); + const esArchiver = getService('esArchiver'); describe('Log Entry Rate Tab', function () { this.tags('includeFirefox'); describe('with a trial license', () => { - it('is visible', async () => { + it('Shows no data page when indices do not exist', async () => { + await logsUi.logEntryRatePage.navigateTo(); + + await retry.try(async () => { + expect(await logsUi.logEntryRatePage.getNoDataScreen()).to.be.ok(); + }); + }); + + it('shows setup page when indices exist', async () => { + await esArchiver.load('x-pack/test/functional/es_archives/infra/simple_logs'); await logsUi.logEntryRatePage.navigateTo(); await retry.try(async () => { expect(await logsUi.logEntryRatePage.getSetupScreen()).to.be.ok(); }); + await esArchiver.unload('x-pack/test/functional/es_archives/infra/simple_logs'); }); }); }); diff --git a/x-pack/test/functional/services/logs_ui/log_entry_rate.ts b/x-pack/test/functional/services/logs_ui/log_entry_rate.ts index e517fd76a06dc..6be84edeb1940 100644 --- a/x-pack/test/functional/services/logs_ui/log_entry_rate.ts +++ b/x-pack/test/functional/services/logs_ui/log_entry_rate.ts @@ -20,5 +20,9 @@ export function LogEntryRatePageProvider({ getPageObjects, getService }: FtrProv async getSetupScreen(): Promise { return await testSubjects.find('logEntryRateSetupPage'); }, + + async getNoDataScreen() { + return await testSubjects.find('noDataPage'); + }, }; } From a6507b2b041d725861749aff0fba262dbb69a208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Mon, 4 Oct 2021 13:25:19 +0200 Subject: [PATCH 72/77] Fix spaces tests --- .../apps/infra/feature_controls/infrastructure_spaces.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts index 94886a89002b2..545eb08223693 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/infrastructure_spaces.ts @@ -51,7 +51,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToApp('infraOps', { basePath: '/s/custom_space', }); - await testSubjects.existOrFail('~noMetricsIndicesPrompt'); + await testSubjects.existOrFail('~noDataPage'); }); }); @@ -118,7 +118,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToApp('infraOps', { basePath: '/s/custom_space', }); - await testSubjects.existOrFail('~noMetricsIndicesPrompt'); + await testSubjects.existOrFail('~noDataPage'); }); }); @@ -143,7 +143,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.common.navigateToApp('infraOps', { basePath: '/s/custom_space', }); - await testSubjects.existOrFail('~noMetricsIndicesPrompt'); + await testSubjects.existOrFail('~noDataPage'); }); }); }); From 94cc373de0c42e74335c96d21619a9f097989770 Mon Sep 17 00:00:00 2001 From: shahzad31 Date: Tue, 5 Oct 2021 09:37:33 +0200 Subject: [PATCH 73/77] update timeout --- x-pack/plugins/uptime/e2e/playwright_start.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/uptime/e2e/playwright_start.ts b/x-pack/plugins/uptime/e2e/playwright_start.ts index 99ceb591b90c8..aedb255b058be 100644 --- a/x-pack/plugins/uptime/e2e/playwright_start.ts +++ b/x-pack/plugins/uptime/e2e/playwright_start.ts @@ -42,7 +42,7 @@ async function playwrightStart(getService: any) { const res = await playwrightRun({ params: { kibanaUrl }, - playwrightOptions: { chromiumSandbox: false }, + playwrightOptions: { chromiumSandbox: false, timeout: 60 * 1000 }, }); console.log('Removing esArchiver...'); From 83b50e0bd35fda1646ec715407a81f53a7d47099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Tue, 5 Oct 2021 12:26:37 +0200 Subject: [PATCH 74/77] Fix even more tests --- .../apps/infra/feature_controls/logs_security.ts | 10 ++++------ .../apps/infra/feature_controls/logs_spaces.ts | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts index d5e22af657d6a..d120a6c582c7b 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_security.ts @@ -63,14 +63,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('logs landing page without data', () => { - it(`shows 'Change source configuration' button`, async () => { + it(`shows the 'No data' page`, async () => { await PageObjects.common.navigateToUrlWithBrowserHistory('infraLogs', '', undefined, { ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); await testSubjects.existOrFail('~infraLogsPage'); - await testSubjects.existOrFail('~logsViewSetupInstructionsButton'); - await testSubjects.existOrFail('~configureSourceButton'); + await testSubjects.existOrFail('~noDataPage'); }); it(`doesn't show read-only badge`, async () => { @@ -126,14 +125,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('logs landing page without data', () => { - it(`doesn't show 'Change source configuration' button`, async () => { + it(`Shows the 'No data' page`, async () => { await PageObjects.common.navigateToUrlWithBrowserHistory('infraLogs', '', undefined, { ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); await testSubjects.existOrFail('~infraLogsPage'); - await testSubjects.existOrFail('~logsViewSetupInstructionsButton'); - await testSubjects.missingOrFail('~configureSourceButton'); + await testSubjects.existOrFail('~noDataPage'); }); it(`shows read-only badge`, async () => { diff --git a/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts b/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts index a67d7d1858af3..9c5e5667cf39c 100644 --- a/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts +++ b/x-pack/test/functional/apps/infra/feature_controls/logs_spaces.ts @@ -43,15 +43,14 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('logs landing page without data', () => { - it(`shows 'Change source configuration' button`, async () => { + it(`shows 'No data' page`, async () => { await PageObjects.common.navigateToUrlWithBrowserHistory('infraLogs', '', undefined, { basePath: '/s/custom_space', ensureCurrentUrl: true, shouldLoginIfPrompted: false, }); await testSubjects.existOrFail('~infraLogsPage'); - await testSubjects.existOrFail('~logsViewSetupInstructionsButton'); - await testSubjects.existOrFail('~configureSourceButton'); + await testSubjects.existOrFail('~noDataPage'); }); }); }); From 1a9bf5891296c217564b6a1f31beba2707b2a69f Mon Sep 17 00:00:00 2001 From: shahzad31 Date: Tue, 5 Oct 2021 14:28:59 +0200 Subject: [PATCH 75/77] update test --- x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts b/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts index 7407a1433ffaa..433487796b10c 100644 --- a/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts +++ b/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts @@ -69,6 +69,8 @@ journey('uptime', ({ page, params }) => { }); step('Navigates to details page', async () => { - await page.click('[data-test-subj=uptimeMonitorPage]'); + await waitForLoadingToFinish(); + + await page.click('[data-test-subj=uptimeMonitorPage]', { timeout: 60 * 1000 }); }); }); From 7ac8c56d3c025ec8880ef530bd3ee15e5b21efef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Tue, 5 Oct 2021 14:53:32 +0200 Subject: [PATCH 76/77] Fix test for new index patterns --- .../test/functional/apps/infra/logs_source_configuration.ts | 2 +- x-pack/test/functional/services/logs_ui/log_stream.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/logs_source_configuration.ts b/x-pack/test/functional/apps/infra/logs_source_configuration.ts index b84109637885c..dcbe30864640b 100644 --- a/x-pack/test/functional/apps/infra/logs_source_configuration.ts +++ b/x-pack/test/functional/apps/infra/logs_source_configuration.ts @@ -60,7 +60,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await logsUi.logStreamPage.navigateTo(); await retry.try(async () => { - await logsUi.logStreamPage.getNoLogsIndicesPrompt(); + await logsUi.logStreamPage.getNoDataPage(); }); }); diff --git a/x-pack/test/functional/services/logs_ui/log_stream.ts b/x-pack/test/functional/services/logs_ui/log_stream.ts index 89afae57507d9..214290bd21ef4 100644 --- a/x-pack/test/functional/services/logs_ui/log_stream.ts +++ b/x-pack/test/functional/services/logs_ui/log_stream.ts @@ -46,5 +46,9 @@ export function LogStreamPageProvider({ getPageObjects, getService }: FtrProvide async getNoLogsIndicesPrompt() { return await testSubjects.find('noLogsIndicesPrompt'); }, + + async getNoDataPage() { + return await testSubjects.find('noDataPage'); + }, }; } From 0707c302d9d2af9ad8770add3bfdc9969faa300a Mon Sep 17 00:00:00 2001 From: shahzad31 Date: Wed, 6 Oct 2021 11:33:00 +0200 Subject: [PATCH 77/77] remove uptime flaky test --- x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts b/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts index 433487796b10c..59a289ef21e7b 100644 --- a/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts +++ b/x-pack/plugins/uptime/e2e/journeys/uptime.journey.ts @@ -67,10 +67,4 @@ journey('uptime', ({ page, params }) => { step('Click on my monitor', async () => { await page.click('[data-test-subj=monitor-page-link-0001-up]'); }); - - step('Navigates to details page', async () => { - await waitForLoadingToFinish(); - - await page.click('[data-test-subj=uptimeMonitorPage]', { timeout: 60 * 1000 }); - }); });