[Fleet + Integrations UI] Integrations UI Cleanup (#104641)

* Remove Beta wording from Fleet messaging in ingestion tutorials

* Rename fleet feature registration to include integrations

* Pluralize + sentence case assets and expand dashboards by default

* Update global search from packages -> integrations

* Expand auth settings by default in package policy add agent flyout

* Update wording for various fleet modules

* Fix i18n

* Fix unit test

* Fix failing tests
This commit is contained in:
Kyle Pollich 2021-07-07 13:57:51 -04:00 committed by GitHub
parent e3b6c1f9c7
commit 7907b6ad45
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 76 additions and 61 deletions

View file

@ -22,20 +22,20 @@ export const DisplayedAssets: ServiceNameToAssetTypes = {
export type DisplayedAssetType = ElasticsearchAssetType | KibanaAssetType | 'view';
export const AssetTitleMap: Record<DisplayedAssetType, string> = {
dashboard: 'Dashboard',
ilm_policy: 'ILM Policy',
ingest_pipeline: 'Ingest Pipeline',
transform: 'Transform',
index_pattern: 'Index Pattern',
index_template: 'Index Template',
component_template: 'Component Template',
search: 'Saved Search',
visualization: 'Visualization',
map: 'Map',
data_stream_ilm_policy: 'Data Stream ILM Policy',
dashboard: 'Dashboards',
ilm_policy: 'ILM policies',
ingest_pipeline: 'Ingest pipelines',
transform: 'Transforms',
index_pattern: 'Index patterns',
index_template: 'Index templates',
component_template: 'Component templates',
search: 'Saved searches',
visualization: 'Visualizations',
map: 'Maps',
data_stream_ilm_policy: 'Data stream ILM policies',
lens: 'Lens',
security_rule: 'Security Rule',
ml_module: 'ML Module',
security_rule: 'Security rules',
ml_module: 'ML modules',
view: 'Views',
};

View file

@ -24,6 +24,8 @@ import { AssetTitleMap } from '../../../constants';
import { getHrefToObjectInKibanaApp, useStartServices } from '../../../../../hooks';
import { KibanaAssetType } from '../../../../../types';
import type { AllowedAssetType, AssetSavedObject } from './types';
interface Props {
@ -33,8 +35,12 @@ interface Props {
export const AssetsAccordion: FunctionComponent<Props> = ({ savedObjects, type }) => {
const { http } = useStartServices();
const isDashboard = type === KibanaAssetType.dashboard;
return (
<EuiAccordion
initialIsOpen={isDashboard}
buttonContent={
<EuiFlexGroup justifyContent="center" alignItems="center" gutterSize="s" responsive={false}>
<EuiFlexItem grow={false}>

View file

@ -22,12 +22,14 @@ import {
interface Props {
agentPolicyId?: string;
selectedApiKeyId?: string;
initialAuthenticationSettingsOpen?: boolean;
onKeyChange: (key?: string) => void;
}
export const AdvancedAgentAuthenticationSettings: FunctionComponent<Props> = ({
agentPolicyId,
selectedApiKeyId,
initialAuthenticationSettingsOpen = false,
onKeyChange,
}) => {
const { notifications } = useStartServices();
@ -35,7 +37,9 @@ export const AdvancedAgentAuthenticationSettings: FunctionComponent<Props> = ({
[]
);
const [isLoadingEnrollmentKey, setIsLoadingEnrollmentKey] = useState(false);
const [isAuthenticationSettingsOpen, setIsAuthenticationSettingsOpen] = useState<boolean>(false);
const [isAuthenticationSettingsOpen, setIsAuthenticationSettingsOpen] = useState<boolean>(
initialAuthenticationSettingsOpen
);
const onCreateEnrollmentTokenClick = async () => {
setIsLoadingEnrollmentKey(true);

View file

@ -137,14 +137,14 @@ export const AgentEnrollmentKeySelectionStep = ({
}) => {
return {
title: i18n.translate('xpack.fleet.agentEnrollment.stepConfigurePolicyAuthenticationTitle', {
defaultMessage: 'Configure agent authentication',
defaultMessage: 'Select enrollment token',
}),
children: (
<>
<EuiText>
<FormattedMessage
id="xpack.fleet.agentEnrollment.agentAuthenticationSettings"
defaultMessage="{agentPolicyName} has been selected. Configure agent authentication based on the available policy options."
defaultMessage="{agentPolicyName} has been selected. Select which enrollment token to use when enrolling agents."
values={{
agentPolicyName: <strong>{agentPolicy.name}</strong>,
}}
@ -154,6 +154,7 @@ export const AgentEnrollmentKeySelectionStep = ({
<AdvancedAgentAuthenticationSettings
agentPolicyId={agentPolicy.id}
selectedApiKeyId={selectedApiKeyId}
initialAuthenticationSettingsOpen
onKeyChange={setSelectedAPIKeyId}
/>
</>

View file

@ -33,10 +33,10 @@ const TutorialDirectoryHeaderLink: TutorialDirectoryHeaderLinkComponent = memo((
return hasIngestManager && noticeState.settingsDataLoaded && noticeState.hasSeenNotice ? (
<RedirectAppLinks application={application}>
<EuiButtonEmpty size="s" iconType="link" flush="right" href={getHref('overview')}>
<EuiButtonEmpty size="s" iconType="link" flush="right" href={getHref('integrations')}>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.fleetAppButtonText"
defaultMessage="Try Fleet Beta"
defaultMessage="Try Integrations"
/>
</EuiButtonEmpty>
</RedirectAppLinks>

View file

@ -71,13 +71,13 @@ const TutorialDirectoryNotice: TutorialDirectoryNoticeComponent = memo(() => {
title={
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.noticeTitle"
defaultMessage="{newPrefix} Elastic Agent and Fleet Beta"
defaultMessage="{newPrefix} Elastic Agent integrations"
values={{
newPrefix: (
<strong>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.noticeTitle.newPrefix"
defaultMessage="New:"
defaultMessage="Now generally available:"
/>
</strong>
),
@ -88,12 +88,16 @@ const TutorialDirectoryNotice: TutorialDirectoryNoticeComponent = memo(() => {
<p>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.noticeText"
defaultMessage="The Elastic Agent provides a simple, unified way to add monitoring for logs, metrics, and other types of data to your hosts.
You no longer need to install multiple Beats and other agents, which makes it easier and faster to deploy policies across your infrastructure.
For more information, read our {blogPostLink}."
defaultMessage="Elastic Agent integrations provide a simple, unified way to add monitoring for logs, metrics, and other types of data to your hosts.
You no longer need to install multiple Beats, which makes it easier and faster to deploy policies across your infrastructure.
For more information, read our {blogPostLink}."
values={{
blogPostLink: (
<EuiLink href="https://ela.st/ingest-manager-announcement" external target="_blank">
<EuiLink
href="https://ela.st/elastic-agent-ga-announcement"
external
target="_blank"
>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.noticeText.blogPostLink"
defaultMessage="announcement blog post"
@ -107,10 +111,10 @@ const TutorialDirectoryNotice: TutorialDirectoryNoticeComponent = memo(() => {
<FlexItemButtonWrapper grow={false}>
<div>
<RedirectAppLinks application={application}>
<EuiButton size="s" href={getHref('overview')}>
<EuiButton size="s" href={getHref('integrations')}>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialDirectory.fleetAppButtonText"
defaultMessage="Try Fleet Beta"
defaultMessage="Try Integrations"
/>
</EuiButton>
</RedirectAppLinks>

View file

@ -31,8 +31,8 @@ const TutorialModuleNotice: TutorialModuleNoticeComponent = memo(({ moduleName }
<p>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialModule.noticeText"
defaultMessage="{notePrefix} a newer version of this module is {availableAsIntegrationLink} in Fleet Beta.
To learn more about agent policies and the new Elastic Agent, read our {blogPostLink}."
defaultMessage="{notePrefix} a newer version of this module is {availableAsIntegrationLink}.
To learn more about integrations and the new Elastic Agent, read our {blogPostLink}."
values={{
notePrefix: (
<strong>
@ -50,13 +50,13 @@ const TutorialModuleNotice: TutorialModuleNoticeComponent = memo(({ moduleName }
>
<FormattedMessage
id="xpack.fleet.homeIntegration.tutorialModule.noticeText.integrationLink"
defaultMessage="available as an Integration"
defaultMessage="available as an Elastic Agent integration"
/>
</EuiLink>
),
blogPostLink: (
<EuiLink
href="https://ela.st/ingest-manager-announcement"
href="https://ela.st/elastic-agent-ga-announcement"
external
target="_blank"
>

View file

@ -32,7 +32,7 @@ import type { CheckPermissionsResponse, PostIngestSetupResponse } from '../commo
import type { FleetConfigType } from '../common/types';
import { CUSTOM_LOGS_INTEGRATION_NAME, FLEET_BASE_PATH } from './constants';
import { CUSTOM_LOGS_INTEGRATION_NAME, INTEGRATIONS_BASE_PATH } from './constants';
import { licenseService } from './hooks';
import { setHttpClient } from './hooks/use_request';
import { createPackageSearchProvider } from './search_provider';
@ -183,14 +183,14 @@ export class FleetPlugin implements Plugin<FleetSetup, FleetStart, FleetSetupDep
deps.home.featureCatalogue.register({
id: 'fleet',
title: i18n.translate('xpack.fleet.featureCatalogueTitle', {
defaultMessage: 'Add Elastic Agent',
defaultMessage: 'Add Elastic Agent integrations',
}),
description: i18n.translate('xpack.fleet.featureCatalogueDescription', {
defaultMessage: 'Add and manage your fleet of Elastic Agents and integrations.',
defaultMessage: 'Add and manage integrations with Elastic Agent',
}),
icon: 'indexManagementApp',
showOnHomePage: true,
path: FLEET_BASE_PATH,
path: INTEGRATIONS_BASE_PATH,
category: FeatureCatalogueCategory.DATA,
order: 510,
});

View file

@ -90,7 +90,7 @@ describe('Package search provider', () => {
id: 'test-test',
score: 80,
title: 'test',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test-test/overview',
prependBasePath: false,
@ -100,7 +100,7 @@ describe('Package search provider', () => {
id: 'test1-test1',
score: 80,
title: 'test1',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test1-test1/overview',
prependBasePath: false,
@ -173,7 +173,7 @@ describe('Package search provider', () => {
id: 'test-test',
score: 80,
title: 'test',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test-test/overview',
prependBasePath: false,
@ -209,7 +209,7 @@ describe('Package search provider', () => {
expect(sendGetPackages).toHaveBeenCalledTimes(0);
});
test('with packages tag, with no search term', () => {
test('with integration tag, with no search term', () => {
getTestScheduler().run(({ hot, expectObservable }) => {
mockSendGetPackages.mockReturnValue(
hot('--(a|)', { a: { data: { response: testResponse } } })
@ -220,7 +220,7 @@ describe('Package search provider', () => {
const packageSearchProvider = createPackageSearchProvider(setupMock);
expectObservable(
packageSearchProvider.find(
{ types: ['package'] },
{ types: ['integration'] },
{ aborted$: NEVER, maxResults: 100, preference: '' }
)
).toBe('--(a|)', {
@ -229,7 +229,7 @@ describe('Package search provider', () => {
id: 'test-test',
score: 80,
title: 'test',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test-test/overview',
prependBasePath: false,
@ -239,7 +239,7 @@ describe('Package search provider', () => {
id: 'test1-test1',
score: 80,
title: 'test1',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test1-test1/overview',
prependBasePath: false,
@ -252,7 +252,7 @@ describe('Package search provider', () => {
expect(sendGetPackages).toHaveBeenCalledTimes(1);
});
test('with packages tag, with search term', () => {
test('with integration tag, with search term', () => {
getTestScheduler().run(({ hot, expectObservable }) => {
mockSendGetPackages.mockReturnValue(
hot('--(a|)', { a: { data: { response: testResponse } } })
@ -263,7 +263,7 @@ describe('Package search provider', () => {
const packageSearchProvider = createPackageSearchProvider(setupMock);
expectObservable(
packageSearchProvider.find(
{ term: 'test1', types: ['package'] },
{ term: 'test1', types: ['integration'] },
{ aborted$: NEVER, maxResults: 100, preference: '' }
)
).toBe('--(a|)', {
@ -272,7 +272,7 @@ describe('Package search provider', () => {
id: 'test1-test1',
score: 80,
title: 'test1',
type: 'package',
type: 'integration',
url: {
path: 'undefined#/detail/test1-test1/overview',
prependBasePath: false,

View file

@ -21,7 +21,7 @@ import { sendGetPackages } from './hooks';
import type { GetPackagesResponse } from './types';
import { pagePathGetters } from './constants';
const packageType = 'package';
const packageType = 'integration';
const createPackages$ = () =>
from(sendGetPackages()).pipe(
@ -70,7 +70,7 @@ export const createPackageSearchProvider = (core: CoreSetup): GlobalSearchResult
};
return {
id: 'packages',
id: 'integrations',
getSearchableTypes: () => [packageType],
find: ({ term, types }, { maxResults, aborted$ }) => {
if (types?.includes(packageType) === false) {

View file

@ -218,7 +218,7 @@ export class FleetPlugin
if (deps.features) {
deps.features.registerKibanaFeature({
id: PLUGIN_ID,
name: 'Fleet',
name: 'Fleet and Integrations',
category: DEFAULT_APP_CATEGORIES.management,
app: [PLUGIN_ID, INTEGRATIONS_PLUGIN_ID, 'kibana'],
catalogue: ['fleet'],

View file

@ -6340,11 +6340,6 @@
"xpack.canvas.functions.repeatImage.args.maxHelpText": "画像が繰り返される最高回数です。",
"xpack.canvas.functions.repeatImage.args.sizeHelpText": "画像の高さまたは幅のピクセル単位での最高値です。画像が縦長の場合、この関数は高さを制限します。",
"xpack.canvas.functions.repeatImageHelpText": "繰り返し画像エレメントを構成します。",
"expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "表示される背景画像です。画像アセットは「{BASE64}」データ {URL} として提供するか、部分式で渡します。",
"expressionRevealImage.functions.revealImage.args.imageHelpText": "表示する画像です。画像アセットは{BASE64}データ{URL}として提供するか、部分式で渡します。",
"expressionRevealImage.functions.revealImage.args.originHelpText": "画像で埋め始める位置です。たとえば、{list}、または {end}です。",
"expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "無効な値:「{percent}」。パーセンテージは 0 と 1 の間でなければなりません ",
"expressionRevealImage.functions.revealImageHelpText": "画像表示エレメントを構成します。",
"xpack.canvas.functions.replace.args.flagsHelpText": "フラグを指定します。{url}を参照してください。",
"xpack.canvas.functions.replace.args.patternHelpText": "{JS} 正規表現のテキストまたはパターンです。例:{example}。ここではキャプチャグループを使用できます。",
"xpack.canvas.functions.replace.args.replacementHelpText": "文字列の一致する部分の代わりです。キャプチャグループはノードによってアクセス可能です。例:{example}。",
@ -6543,8 +6538,6 @@
"xpack.canvas.renderer.progress.helpDescription": "エレメントのパーセンテージを示す進捗インジケーターをレンダリングします",
"xpack.canvas.renderer.repeatImage.displayName": "画像の繰り返し",
"xpack.canvas.renderer.repeatImage.helpDescription": "画像を指定回数繰り返し表示します",
"expressionRevealImage.renderer.revealImage.displayName": "画像の部分表示",
"expressionRevealImage.renderer.revealImage.helpDescription": "カスタムゲージスタイルチャートを作成するため、画像のパーセンテージを表示します",
"xpack.canvas.renderer.shape.displayName": "形状",
"xpack.canvas.renderer.shape.helpDescription": "基本的な図形をレンダリングします",
"xpack.canvas.renderer.table.displayName": "データテーブル",
@ -7014,6 +7007,13 @@
"xpack.canvas.workpadTemplates.table.descriptionColumnTitle": "説明",
"xpack.canvas.workpadTemplates.table.nameColumnTitle": "テンプレート名",
"xpack.canvas.workpadTemplates.table.tagsColumnTitle": "タグ",
"expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "表示される背景画像です。画像アセットは「{BASE64}」データ {URL} として提供するか、部分式で渡します。",
"expressionRevealImage.functions.revealImage.args.imageHelpText": "表示する画像です。画像アセットは{BASE64}データ{URL}として提供するか、部分式で渡します。",
"expressionRevealImage.functions.revealImage.args.originHelpText": "画像で埋め始める位置です。たとえば、{list}、または {end}です。",
"expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "無効な値:「{percent}」。パーセンテージは 0 と 1 の間でなければなりません ",
"expressionRevealImage.functions.revealImageHelpText": "画像表示エレメントを構成します。",
"expressionRevealImage.renderer.revealImage.displayName": "画像の部分表示",
"expressionRevealImage.renderer.revealImage.helpDescription": "カスタムゲージスタイルチャートを作成するため、画像のパーセンテージを表示します",
"xpack.cases.connectors.cases.externalIncidentAdded": " ({date}に{user}が追加) ",
"xpack.cases.connectors.cases.externalIncidentCreated": " ({date}に{user}が作成) ",
"xpack.cases.connectors.cases.externalIncidentDefault": " ({date}に{user}が作成) ",

View file

@ -6385,11 +6385,6 @@
"xpack.canvas.functions.replace.args.replacementHelpText": "字符串匹配部分的替代。捕获组可以通过其索引进行访问。例如,{example}。",
"xpack.canvas.functions.rounddate.args.formatHelpText": "用于存储桶存储的 {MOMENTJS} 格式。例如,{example} 四舍五入到月份。请参见 {url}。",
"xpack.canvas.functions.replaceImageHelpText": "使用正则表达式替换字符串的各部分。",
"expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "要显示的可选背景图像。以 `{BASE64}` 数据 {URL} 的形式提供图像资产或传入子表达式。",
"expressionRevealImage.functions.revealImage.args.imageHelpText": "要显示的图像。以 {BASE64} 数据 {URL} 的形式提供图像资产或传入子表达式。",
"expressionRevealImage.functions.revealImage.args.originHelpText": "要开始图像填充的位置。例如 {list} 或 {end}。",
"expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "无效值:“{percent}”。百分比必须介于 0 和 1 之间",
"expressionRevealImage.functions.revealImageHelpText": "配置图像显示元素。",
"xpack.canvas.functions.rounddateHelpText": "使用 {MOMENTJS} 格式字符串舍入自 Epoch 起毫秒数,并返回自 Epoch 起毫秒数。",
"xpack.canvas.functions.rowCountHelpText": "返回行数。与 {plyFn} 搭配使用,可获取唯一列值的计数或唯一列值的组合。",
"xpack.canvas.functions.savedLens.args.idHelpText": "已保存 Lens 可视化对象的 ID",
@ -6583,8 +6578,6 @@
"xpack.canvas.renderer.progress.helpDescription": "呈现显示元素百分比的进度指示",
"xpack.canvas.renderer.repeatImage.displayName": "图像重复",
"xpack.canvas.renderer.repeatImage.helpDescription": "重复图像给定次数",
"expressionRevealImage.renderer.revealImage.displayName": "图像显示",
"expressionRevealImage.renderer.revealImage.helpDescription": "显示一定百分比的图像,以制作定制的仪表样式图表",
"xpack.canvas.renderer.shape.displayName": "形状",
"xpack.canvas.renderer.shape.helpDescription": "呈现基本形状",
"xpack.canvas.renderer.table.displayName": "数据表",
@ -7062,6 +7055,13 @@
"xpack.canvas.workpadTemplates.table.descriptionColumnTitle": "描述",
"xpack.canvas.workpadTemplates.table.nameColumnTitle": "模板名称",
"xpack.canvas.workpadTemplates.table.tagsColumnTitle": "标签",
"expressionRevealImage.functions.revealImage.args.emptyImageHelpText": "要显示的可选背景图像。以 `{BASE64}` 数据 {URL} 的形式提供图像资产或传入子表达式。",
"expressionRevealImage.functions.revealImage.args.imageHelpText": "要显示的图像。以 {BASE64} 数据 {URL} 的形式提供图像资产或传入子表达式。",
"expressionRevealImage.functions.revealImage.args.originHelpText": "要开始图像填充的位置。例如 {list} 或 {end}。",
"expressionRevealImage.functions.revealImage.invalidPercentErrorMessage": "无效值:“{percent}”。百分比必须介于 0 和 1 之间",
"expressionRevealImage.functions.revealImageHelpText": "配置图像显示元素。",
"expressionRevealImage.renderer.revealImage.displayName": "图像显示",
"expressionRevealImage.renderer.revealImage.helpDescription": "显示一定百分比的图像,以制作定制的仪表样式图表",
"xpack.cases.connectors.cases.externalIncidentAdded": " (由 {user} 于 {date}添加) ",
"xpack.cases.connectors.cases.externalIncidentCreated": " (由 {user} 于 {date}创建) ",
"xpack.cases.connectors.cases.externalIncidentDefault": " (由 {user} 于 {date}创建) ",