[Cloud Posture] I18n guidelines findings (#135188)

This commit is contained in:
Jordan 2022-06-28 13:34:26 +03:00 committed by GitHub
parent 1aba5428b3
commit 2fd780b549
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 235 additions and 501 deletions

View file

@ -22,10 +22,10 @@ import {
EuiIcon,
} from '@elastic/eui';
import { assertNever } from '@kbn/std';
import { i18n } from '@kbn/i18n';
import cisLogoIcon from '../../../assets/icons/cis_logo.svg';
import type { CspFinding } from '../types';
import { CspEvaluationBadge } from '../../../components/csp_evaluation_badge';
import * as TEXT from '../translations';
import { ResourceTab } from './resource_tab';
import { JsonTab } from './json_tab';
import { OverviewTab } from './overview_tab';
@ -33,10 +33,30 @@ import { RuleTab } from './rule_tab';
import k8sLogoIcon from '../../../assets/icons/k8s_logo.svg';
const tabs = [
{ title: TEXT.OVERVIEW, id: 'overview' },
{ title: TEXT.RULE, id: 'rule' },
{ title: TEXT.RESOURCE, id: 'resource' },
{ title: TEXT.JSON, id: 'json' },
{
id: 'overview',
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTabTitle', {
defaultMessage: 'Overview',
}),
},
{
id: 'rule',
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTabTitle', {
defaultMessage: 'Rule',
}),
},
{
id: 'resource',
title: i18n.translate('xpack.csp.findings.findingsFlyout.resourceTabTitle', {
defaultMessage: 'Resource',
}),
},
{
id: 'json',
title: i18n.translate('xpack.csp.findings.findingsFlyout.jsonTabTitle', {
defaultMessage: 'JSON',
}),
},
] as const;
type FindingsTab = typeof tabs[number];

View file

@ -9,7 +9,7 @@ import { EuiAccordion, EuiDescriptionList, EuiPanel, EuiSpacer, EuiText } from '
import React, { useMemo } from 'react';
import moment from 'moment';
import type { EuiDescriptionListProps, EuiAccordionProps } from '@elastic/eui';
import * as TEXT from '../translations';
import { i18n } from '@kbn/i18n';
import { CspFinding } from '../types';
import { CisKubernetesIcons, Markdown, CodeBlock } from './findings_flyout';
@ -18,23 +18,33 @@ type Accordion = Pick<EuiAccordionProps, 'title' | 'id' | 'initialIsOpen'> &
const getDetailsList = (data: CspFinding) => [
{
title: TEXT.RULE_NAME,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.ruleNameTitle', {
defaultMessage: 'Rule Name',
}),
description: data.rule.name,
},
{
title: TEXT.EVALUATED_AT,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.evaluatedAtTitle', {
defaultMessage: 'Evaluated at',
}),
description: moment(data['@timestamp']).format('MMMM D, YYYY @ HH:mm:ss.SSS'),
},
{
title: TEXT.RESOURCE_NAME,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.resourceNameTitle', {
defaultMessage: 'Resource Name',
}),
description: data.resource.name,
},
{
title: TEXT.FRAMEWORK_SOURCES,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.frameworkSourcesTitle', {
defaultMessage: 'Framework Sources',
}),
description: <CisKubernetesIcons />,
},
{
title: TEXT.CIS_SECTION,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.cisSectionTitle', {
defaultMessage: 'CIS Section',
}),
description: data.rule.section,
},
];
@ -47,7 +57,9 @@ export const getRemediationList = (rule: CspFinding['rule']) => [
...(rule.impact
? [
{
title: TEXT.IMPACT,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.impactTitle', {
defaultMessage: 'Impact',
}),
description: <Markdown>{rule.impact}</Markdown>,
},
]
@ -55,13 +67,17 @@ export const getRemediationList = (rule: CspFinding['rule']) => [
...(rule.default_value
? [
{
title: TEXT.DEFAULT_VALUE,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.defaultValueTitle', {
defaultMessage: 'Default Value',
}),
description: <Markdown>{rule.default_value}</Markdown>,
},
]
: []),
{
title: TEXT.RATIONALE,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.rationaleTitle', {
defaultMessage: 'Rationale',
}),
description: <Markdown>{rule.rationale}</Markdown>,
},
];
@ -69,11 +85,15 @@ export const getRemediationList = (rule: CspFinding['rule']) => [
const getEvidenceList = ({ result }: CspFinding) =>
[
result.expected && {
title: TEXT.EXPECTED,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.expectedTitle', {
defaultMessage: 'Expected',
}),
description: <CodeBlock>{JSON.stringify(result.expected, null, 2)}</CodeBlock>,
},
{
title: TEXT.ACTUAL,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.actualTitle', {
defaultMessage: 'Actual',
}),
description: <CodeBlock>{JSON.stringify(result.evidence, null, 2)}</CodeBlock>,
},
].filter(Boolean) as EuiDescriptionListProps['listItems'];
@ -83,19 +103,26 @@ export const OverviewTab = ({ data }: { data: CspFinding }) => {
() => [
{
initialIsOpen: true,
title: TEXT.DETAILS,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.detailsTitle', {
defaultMessage: 'Details',
}),
id: 'detailsAccordion',
listItems: getDetailsList(data),
},
{
initialIsOpen: true,
title: TEXT.REMEDIATION,
title: i18n.translate('xpack.csp.findings.findingsFlyout.overviewTab.remediationTitle', {
defaultMessage: 'Remediation',
}),
id: 'remediationAccordion',
listItems: getRemediationList(data.rule),
},
{
initialIsOpen: false,
title: TEXT.EVIDENCE,
title: i18n.translate(
'xpack.csp.findings.findingsFlyout.overviewTab.evidenceSourcesTitle',
{ defaultMessage: 'Evidence' }
),
id: 'evidenceAccordion',
listItems: getEvidenceList(data),
},

View file

@ -17,8 +17,8 @@ import {
} from '@elastic/eui';
import React, { useMemo } from 'react';
import { getFlattenedObject } from '@kbn/std';
import { i18n } from '@kbn/i18n';
import { CspFinding } from '../types';
import * as TEXT from '../translations';
const getDescriptionDisplay = (value: unknown) => {
if (value === undefined) return 'undefined';
@ -55,12 +55,17 @@ export const ResourceTab = ({ data }: { data: CspFinding }) => {
const accordions = useMemo(
() => [
{
title: TEXT.RESOURCE,
title: i18n.translate(
'xpack.csp.findings.findingsFlyout.resourceTab.resourceAccordionTitle',
{ defaultMessage: 'Resource' }
),
id: 'resourceAccordion',
listItems: prepareDescriptionList(data.resource),
},
{
title: TEXT.HOST,
title: i18n.translate('xpack.csp.findings.findingsFlyout.resourceTab.hostAccordionTitle', {
defaultMessage: 'Host',
}),
id: 'hostAccordion',
listItems: prepareDescriptionList(data.host),
},

View file

@ -6,44 +6,60 @@
*/
import { EuiDescriptionList } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import React from 'react';
import * as TEXT from '../translations';
import { CspFinding } from '../types';
import { CisKubernetesIcons, Markdown } from './findings_flyout';
export const getRuleList = (rule: CspFinding['rule']) => [
{
title: TEXT.NAME,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.nameTitle', {
defaultMessage: 'Name',
}),
description: rule.name,
},
{
title: TEXT.DESCRIPTION,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.descriptionTitle', {
defaultMessage: 'Description',
}),
description: <Markdown>{rule.description}</Markdown>,
},
{
title: TEXT.FRAMEWORK_SOURCES,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.frameworkSourcesTitle', {
defaultMessage: 'Framework Sources',
}),
description: <CisKubernetesIcons />,
},
{
title: TEXT.CIS_SECTION,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.cisSectionTitle', {
defaultMessage: 'CIS Section',
}),
description: rule.section,
},
{
title: TEXT.PROFILE_APPLICABILITY,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.profileApplicabilityTitle', {
defaultMessage: 'Profile Applicability',
}),
description: <Markdown>{rule.profile_applicability}</Markdown>,
},
{
title: TEXT.BENCHMARK,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.benchmarkTitle', {
defaultMessage: 'Benchmark',
}),
description: rule.benchmark.name,
},
{
title: TEXT.AUDIT,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.auditTitle', {
defaultMessage: 'Audit',
}),
description: <Markdown>{rule.audit}</Markdown>,
},
...(rule.references
? [
{
title: TEXT.REFERENCES,
title: i18n.translate('xpack.csp.findings.findingsFlyout.ruleTab.referencesTitle', {
defaultMessage: 'References',
}),
description: <Markdown>{rule.references}</Markdown>,
},
]

View file

@ -125,7 +125,12 @@ export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => {
const LatestFindingsPageTitle = () => (
<PageTitle>
<PageTitleText
title={<FormattedMessage id="xpack.csp.findings.findingsTitle" defaultMessage="Findings" />}
title={
<FormattedMessage
id="xpack.csp.findings.latestFindings.latestFindingsPageTitle"
defaultMessage="Findings"
/>
}
/>
</PageTitle>
);

View file

@ -83,7 +83,9 @@ describe('<FindingsTable />', () => {
</TestProvider>
);
expect(screen.getByTestId(TEST_SUBJECTS.FINDINGS_TABLE_ZERO_STATE)).toBeInTheDocument();
expect(
screen.getByTestId(TEST_SUBJECTS.LATEST_FINDINGS_TABLE_NO_FINDINGS_EMPTY_STATE)
).toBeInTheDocument();
});
it('renders the table with provided items', () => {

View file

@ -14,8 +14,8 @@ import {
type CriteriaWithPagination,
type EuiTableActionsColumnType,
} from '@elastic/eui';
import { FormattedMessage } from '@kbn/i18n-react';
import * as TEST_SUBJECTS from '../test_subjects';
import * as TEXT from '../translations';
import type { CspFinding } from '../types';
import { FindingsRuleFlyout } from '../findings_flyout/findings_flyout';
import { getExpandColumn, getFindingsColumns } from '../layout/findings_layout';
@ -53,8 +53,15 @@ const FindingsTableComponent = ({
return (
<EuiEmptyPrompt
iconType="logoKibana"
title={<h2>{TEXT.NO_FINDINGS}</h2>}
data-test-subj={TEST_SUBJECTS.FINDINGS_TABLE_ZERO_STATE}
data-test-subj={TEST_SUBJECTS.LATEST_FINDINGS_TABLE_NO_FINDINGS_EMPTY_STATE}
title={
<h2>
<FormattedMessage
id="xpack.csp.findings.latestFindings.noFindingsTitle"
defaultMessage="There are no Findings"
/>
</h2>
}
/>
);

View file

@ -12,9 +12,9 @@ import type { IKibanaSearchRequest, IKibanaSearchResponse } from '@kbn/data-plug
import type { CoreStart } from '@kbn/core/public';
import type { Criteria, Pagination } from '@elastic/eui';
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { i18n } from '@kbn/i18n';
import { FindingsEsPitContext } from '../es_pit/findings_es_pit_context';
import { extractErrorMessage } from '../../../../common/utils/helpers';
import * as TEXT from '../translations';
import type { CspFinding } from '../types';
import { useKibana } from '../../../common/hooks/use_kibana';
import type { FindingsBaseEsQuery } from '../types';
@ -56,12 +56,17 @@ const FIELDS_WITHOUT_KEYWORD_MAPPING = new Set([
const getSortKey = (key: string): string =>
FIELDS_WITHOUT_KEYWORD_MAPPING.has(key) ? key : `${key}.keyword`;
const SEARCH_FAILED_TEXT = i18n.translate(
'xpack.csp.findings.findingsErrorToast.searchFailedTitle',
{ defaultMessage: 'Search failed' }
);
export const showErrorToast = (
toasts: CoreStart['notifications']['toasts'],
error: unknown
): void => {
if (error instanceof Error) toasts.addError(error, { title: TEXT.SEARCH_FAILED });
else toasts.addDanger(extractErrorMessage(error, TEXT.SEARCH_FAILED));
if (error instanceof Error) toasts.addError(error, { title: SEARCH_FAILED_TEXT });
else toasts.addDanger(extractErrorMessage(error, SEARCH_FAILED_TEXT));
};
export const getFindingsQuery = ({

View file

@ -90,14 +90,13 @@ const LatestFindingsByResource = ({ dataView }: FindingsBaseProps) => {
<PageTitleText
title={
<FormattedMessage
id="xpack.csp.findings.findingsByResourceTitle"
id="xpack.csp.findings.findingsByResource.findingsByResourcePageTitle"
defaultMessage="Findings"
/>
}
/>
</PageTitle>
{error && <ErrorCallout error={error} />}
{!error && (
<>
<FindingsGroupBySelector type="resource" />

View file

@ -8,7 +8,6 @@ import React from 'react';
import { render, screen, within } from '@testing-library/react';
import * as TEST_SUBJECTS from '../test_subjects';
import { FindingsByResourceTable, formatNumber, getResourceId } from './findings_by_resource_table';
import * as TEXT from '../translations';
import type { PropsOf } from '@elastic/eui';
import Chance from 'chance';
import numeral from '@elastic/numeral';
@ -55,7 +54,9 @@ describe('<FindingsByResourceTable />', () => {
</TestProvider>
);
expect(screen.getByText(TEXT.NO_FINDINGS)).toBeInTheDocument();
expect(
screen.getByTestId(TEST_SUBJECTS.FINDINGS_BY_RESOURCE_TABLE_NO_FINDINGS_EMPTY_STATE)
).toBeInTheDocument();
});
it('renders the table with provided items', () => {

View file

@ -20,7 +20,6 @@ import numeral from '@elastic/numeral';
import { Link, generatePath } from 'react-router-dom';
import { ColumnNameWithTooltip } from '../../../components/column_name_with_tooltip';
import * as TEST_SUBJECTS from '../test_subjects';
import * as TEXT from '../translations';
import type { FindingsByResourcePage } from './use_findings_by_resource';
import { findingsNavigation } from '../../../common/navigation/constants';
@ -48,7 +47,20 @@ const FindingsByResourceTableComponent = ({
});
if (!loading && !items.length)
return <EuiEmptyPrompt iconType="logoKibana" title={<h2>{TEXT.NO_FINDINGS}</h2>} />;
return (
<EuiEmptyPrompt
data-test-subj={TEST_SUBJECTS.FINDINGS_BY_RESOURCE_TABLE_NO_FINDINGS_EMPTY_STATE}
iconType="logoKibana"
title={
<h2>
<FormattedMessage
id="xpack.csp.findings.findingsByResource.noFindingsTitle"
defaultMessage="There are no Findings"
/>
</h2>
}
/>
);
return (
<EuiBasicTable
@ -67,12 +79,13 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
field: 'resource_id',
name: (
<ColumnNameWithTooltip
columnName={TEXT.RESOURCE_ID}
columnName={i18n.translate(
'xpack.csp.findings.findingsByResourceTable.findingsByResourceTableColumn.resourceIdColumnLabel',
{ defaultMessage: 'Resource ID' }
)}
tooltipContent={i18n.translate(
'xpack.csp.findings.resourceTable.resourceTableColumn.resourceIdColumnTooltipLabel',
{
defaultMessage: 'Custom Elastic Resource ID',
}
'xpack.csp.findings.findingsByResourceTable.findingsByResourceTableColumn.resourceIdColumnTooltipLabel',
{ defaultMessage: 'Custom Elastic Resource ID' }
)}
/>
),
@ -87,7 +100,7 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
truncateText: true,
name: (
<FormattedMessage
id="xpack.csp.findings.groupByResourceTable.resourceTypeColumnLabel"
id="xpack.csp.findings.findingsByResourceTable.resourceTypeColumnLabel"
defaultMessage="Resource Type"
/>
),
@ -97,7 +110,7 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
truncateText: true,
name: (
<FormattedMessage
id="xpack.csp.findings.groupByResourceTable.resourceNameColumnLabel"
id="xpack.csp.findings.findingsByResourceTable.resourceNameColumnLabel"
defaultMessage="Resource Name"
/>
),
@ -107,7 +120,7 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
truncateText: true,
name: (
<FormattedMessage
id="xpack.csp.findings.groupByResourceTable.cisSectionsColumnLabel"
id="xpack.csp.findings.findingsByResourceTable.cisSectionsColumnLabel"
defaultMessage="CIS Sections"
/>
),
@ -117,12 +130,13 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
field: 'cluster_id',
name: (
<ColumnNameWithTooltip
columnName={TEXT.CLUSTER_ID}
columnName={i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.clusterIdColumnLabel',
{ defaultMessage: 'Cluster ID' }
)}
tooltipContent={i18n.translate(
'xpack.csp.findings.resourceTable.resourceTableColumn.clusterIdColumnTooltipLabel',
{
defaultMessage: 'Kube-System Namespace ID',
}
'xpack.csp.findings.findingsTable.findingsTableColumn.clusterIdColumnTooltipLabel',
{ defaultMessage: 'Kube-System Namespace ID' }
)}
/>
),
@ -134,19 +148,22 @@ const columns: Array<EuiTableFieldDataColumnType<FindingsByResourcePage>> = [
truncateText: true,
name: (
<FormattedMessage
id="xpack.csp.findings.groupByResourceTable.failedFindingsColumnLabel"
id="xpack.csp.findings.findingsByResourceTable.failedFindingsColumnLabel"
defaultMessage="Failed Findings"
/>
),
render: (failedFindings: FindingsByResourcePage['failed_findings']) => (
<EuiToolTip
content={i18n.translate('xpack.csp.findings.groupByResourceTable.failedFindingsToolTip', {
defaultMessage: '{failed} out of {total}',
values: {
failed: failedFindings.count,
total: failedFindings.total_findings,
},
})}
content={i18n.translate(
'xpack.csp.findings.findingsByResourceTable.failedFindingsToolTip',
{
defaultMessage: '{failed} out of {total}',
values: {
failed: failedFindings.count,
total: failedFindings.total_findings,
},
}
)}
>
<>
<EuiTextColor color={failedFindings.count === 0 ? '' : 'danger'}>

View file

@ -96,7 +96,7 @@ export const ResourceFindings = ({ dataView }: FindingsBaseProps) => {
title={
<div style={{ padding: euiTheme.size.s }}>
<FormattedMessage
id="xpack.csp.findings.resourceFindingsTitle"
id="xpack.csp.findings.resourceFindings.resourceFindingsPageTitle"
defaultMessage="{resourceId} - Findings"
values={{ resourceId: params.resourceId }}
/>

View file

@ -13,7 +13,7 @@ import {
EuiBasicTableColumn,
EuiTableActionsColumnType,
} from '@elastic/eui';
import * as TEXT from '../../translations';
import { FormattedMessage } from '@kbn/i18n-react';
import { getExpandColumn, getFindingsColumns } from '../../layout/findings_layout';
import type { CspFinding } from '../../types';
import { FindingsRuleFlyout } from '../../findings_flyout/findings_flyout';
@ -36,7 +36,19 @@ const ResourceFindingsTableComponent = ({ items, loading, pagination, setTableOp
[]
);
if (!loading && !items.length)
return <EuiEmptyPrompt iconType="logoKibana" title={<h2>{TEXT.NO_FINDINGS}</h2>} />;
return (
<EuiEmptyPrompt
iconType="logoKibana"
title={
<h2>
<FormattedMessage
id="xpack.csp.findings.resourceFindings.noFindingsTitle"
defaultMessage="There are no Findings"
/>
</h2>
}
/>
);
return (
<>

View file

@ -15,7 +15,7 @@ import {
} from '@elastic/eui';
import React from 'react';
import { FormattedMessage } from '@kbn/i18n-react';
import { PAGE_SEARCH_ERROR_MESSAGE } from '../translations';
import { i18n } from '@kbn/i18n';
import { useKibana } from '../../../common/hooks/use_kibana';
export const ErrorCallout = ({ error }: { error: Error }) => {
@ -27,11 +27,17 @@ export const ErrorCallout = ({ error }: { error: Error }) => {
<EuiFlexGroup justifyContent="center" alignItems="center">
<EuiFlexItem grow={false}>
<EuiPanel paddingSize="l" grow>
<EuiCallOut title={PAGE_SEARCH_ERROR_MESSAGE} color="danger" iconType="alert">
<EuiCallOut
title={i18n.translate('xpack.csp.findings.errorCallout.pageSearchErrorTitle', {
defaultMessage: 'We encountered an error retrieving search results',
})}
color="danger"
iconType="alert"
>
<EuiSpacer />
<EuiButton size="s" color="danger" onClick={() => search.showError(error)}>
<FormattedMessage
id="xpack.csp.findings.showErrorButtonLabel"
id="xpack.csp.findings.errorCallout.showErrorButtonLabel"
defaultMessage="Show error message"
/>
</EuiButton>

View file

@ -19,7 +19,6 @@ import moment from 'moment';
import { i18n } from '@kbn/i18n';
import { ColumnNameWithTooltip } from '../../../components/column_name_with_tooltip';
import { CspEvaluationBadge } from '../../../components/csp_evaluation_badge';
import * as TEXT from '../translations';
import { CspFinding } from '../types';
export const PageWrapper: React.FC = ({ children }) => {
@ -70,12 +69,13 @@ export const getFindingsColumns = (): Array<EuiBasicTableColumn<CspFinding>> =>
field: 'resource.id',
name: (
<ColumnNameWithTooltip
columnName={TEXT.RESOURCE_ID}
columnName={i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel',
{ defaultMessage: 'Resource ID' }
)}
tooltipContent={i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnTooltipLabel',
{
defaultMessage: 'Custom Elastic Resource ID',
}
{ defaultMessage: 'Custom Elastic Resource ID' }
)}
/>
),
@ -90,7 +90,9 @@ export const getFindingsColumns = (): Array<EuiBasicTableColumn<CspFinding>> =>
},
{
field: 'result.evaluation',
name: TEXT.RESULT,
name: i18n.translate('xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel', {
defaultMessage: 'Result',
}),
width: '100px',
sortable: true,
render: (type: PropsOf<typeof CspEvaluationBadge>['type']) => (
@ -99,23 +101,34 @@ export const getFindingsColumns = (): Array<EuiBasicTableColumn<CspFinding>> =>
},
{
field: 'resource.sub_type',
name: TEXT.RESOURCE_TYPE,
name: i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel',
{ defaultMessage: 'Resource Type' }
),
sortable: true,
width: '150px',
},
{
field: 'resource.name',
name: TEXT.RESOURCE_NAME,
name: i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceNameColumnLabel',
{ defaultMessage: 'Resource Name' }
),
sortable: true,
},
{
field: 'rule.name',
name: TEXT.RULE,
name: i18n.translate('xpack.csp.findings.findingsTable.findingsTableColumn.ruleColumnLabel', {
defaultMessage: 'Rule',
}),
sortable: true,
},
{
field: 'rule.section',
name: TEXT.CIS_SECTION,
name: i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel',
{ defaultMessage: 'CIS Section' }
),
sortable: true,
truncateText: true,
},
@ -123,12 +136,13 @@ export const getFindingsColumns = (): Array<EuiBasicTableColumn<CspFinding>> =>
field: 'cluster_id',
name: (
<ColumnNameWithTooltip
columnName={TEXT.CLUSTER_ID}
columnName={i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.clusterIdColumnLabel',
{ defaultMessage: 'Cluster ID' }
)}
tooltipContent={i18n.translate(
'xpack.csp.findings.resourceTable.resourceTableColumn.clusterIdColumnTooltipLabel',
{
defaultMessage: 'Kube-System Namespace ID',
}
'xpack.csp.findings.findingsTable.findingsTableColumn.clusterIdColumnTooltipLabel',
{ defaultMessage: 'Kube-System Namespace ID' }
)}
/>
),
@ -138,7 +152,10 @@ export const getFindingsColumns = (): Array<EuiBasicTableColumn<CspFinding>> =>
{
field: '@timestamp',
width: '150px',
name: TEXT.LAST_CHECKED,
name: i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel',
{ defaultMessage: 'Last Checked' }
),
truncateText: true,
sortable: true,
render: (timestamp: number) => (

View file

@ -9,11 +9,11 @@ import { css } from '@emotion/react';
import { EuiThemeComputed, useEuiTheme } from '@elastic/eui';
import { useKibana } from '@kbn/kibana-react-plugin/public';
import type { DataView } from '@kbn/data-plugin/common';
import { i18n } from '@kbn/i18n';
import * as TEST_SUBJECTS from '../test_subjects';
import type { FindingsBaseURLQuery } from '../types';
import type { CspClientPluginStartDeps } from '../../../types';
import { PLUGIN_NAME } from '../../../../common';
import { FINDINGS_SEARCH_PLACEHOLDER } from '../translations';
type SearchBarQueryProps = Pick<FindingsBaseURLQuery, 'query' | 'filters'>;
@ -49,7 +49,9 @@ export const FindingsSearchBar = ({
onQuerySubmit={setQuery}
// @ts-expect-error onFiltersUpdated is a valid prop on SearchBar
onFiltersUpdated={(value: Filter[]) => setQuery({ filters: value })}
placeholder={FINDINGS_SEARCH_PLACEHOLDER}
placeholder={i18n.translate('xpack.csp.findings.searchBar.searchPlaceholder', {
defaultMessage: 'Search findings (eg. rule.section.keyword : "API Server" )',
})}
/>
</div>
);

View file

@ -7,7 +7,10 @@
export const FINDINGS_SEARCH_BAR = 'findings_search_bar';
export const FINDINGS_TABLE = 'findings_table';
export const FINDINGS_BY_RESOURCE_TABLE_NO_FINDINGS_EMPTY_STATE =
'findings-by-resource-table-no-findings-empty-state';
export const FINDINGS_CONTAINER = 'findings_container';
export const FINDINGS_TABLE_ZERO_STATE = 'findings_table_zero_state';
export const LATEST_FINDINGS_TABLE_NO_FINDINGS_EMPTY_STATE =
'latest-findings-table-no-findings-empty-state';
export const getFindingsByResourceTableRowTestId = (id: string) =>
`findings_resource_table_row_${id}`;

View file

@ -1,275 +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 { i18n } from '@kbn/i18n';
export const NAME = i18n.translate('xpack.csp.findings.nameLabel', {
defaultMessage: 'Name',
});
export const IMPACT = i18n.translate('xpack.csp.findings.impactLabel', {
defaultMessage: 'Impact',
});
export const DEFAULT_VALUE = i18n.translate('xpack.csp.findings.defaultValueLabel', {
defaultMessage: 'Default Value',
});
export const RATIONALE = i18n.translate('xpack.csp.findings.rationaleLabel', {
defaultMessage: 'Rationale',
});
export const SEARCH_FAILED = i18n.translate('xpack.csp.findings.searchFailedLabel', {
defaultMessage: 'Search failed',
});
export const TAGS = i18n.translate('xpack.csp.findings.tagsLabel', {
defaultMessage: 'Tags',
});
export const RULE_NAME = i18n.translate('xpack.csp.findings.ruleNameLabel', {
defaultMessage: 'Rule Name',
});
export const OS = i18n.translate('xpack.csp.findings.osLabel', {
defaultMessage: 'OS',
});
export const RESOURCE = i18n.translate('xpack.csp.findings.resourceLabel', {
defaultMessage: 'Resource',
});
export const RESOURCE_NAME = i18n.translate('xpack.csp.findings.resourceNameLabel', {
defaultMessage: 'Resource Name',
});
export const GENERAL = i18n.translate('xpack.csp.findings.findingsFlyout.generalTabLabel', {
defaultMessage: 'General',
});
export const OVERVIEW = i18n.translate('xpack.csp.findings.findingsFlyout.overviewTabLabel', {
defaultMessage: 'Overview',
});
export const JSON = i18n.translate('xpack.csp.findings.findingsFlyout.jsonTabLabel', {
defaultMessage: 'JSON',
});
export const RESOURCE_ID = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceIdColumnLabel',
{
defaultMessage: 'Resource ID',
}
);
export const RESULT = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resultColumnLabel',
{
defaultMessage: 'Result',
}
);
export const RESOURCE_TYPE = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.resourceTypeColumnLabel',
{
defaultMessage: 'Resource Type',
}
);
export const CLUSTER_ID = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.clusterIdColumnLabel',
{
defaultMessage: 'Cluster ID',
}
);
export const CIS_SECTION = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.ruleSectionColumnLabel',
{
defaultMessage: 'CIS Section',
}
);
export const LAST_CHECKED = i18n.translate(
'xpack.csp.findings.findingsTable.findingsTableColumn.lastCheckedColumnLabel',
{
defaultMessage: 'Last Checked',
}
);
export const FILENAME = i18n.translate('xpack.csp.findings.filenameLabel', {
defaultMessage: 'Filename',
});
export const MODE = i18n.translate('xpack.csp.findings.modeLabel', {
defaultMessage: 'Mode',
});
export const TYPE = i18n.translate('xpack.csp.findings.typeLabel', {
defaultMessage: 'Type',
});
export const PATH = i18n.translate('xpack.csp.findings.pathLabel', {
defaultMessage: 'Path',
});
export const UID = i18n.translate('xpack.csp.findings.uidLabel', {
defaultMessage: 'UID',
});
export const GID = i18n.translate('xpack.csp.findings.gidLabel', {
defaultMessage: 'GID',
});
export const RULE = i18n.translate('xpack.csp.findings.ruleLabel', {
defaultMessage: 'Rule',
});
export const DESCRIPTION = i18n.translate('xpack.csp.findings.descriptionLabel', {
defaultMessage: 'Description',
});
export const REMEDIATION = i18n.translate('xpack.csp.findings.remediationLabel', {
defaultMessage: 'Remediation',
});
export const BENCHMARK = i18n.translate('xpack.csp.findings.benchmarkLabel', {
defaultMessage: 'Benchmark',
});
export const SEVERITY = i18n.translate('xpack.csp.findings.severityLabel', {
defaultMessage: 'Severity',
});
export const INDEX = i18n.translate('xpack.csp.findings.indexLabel', {
defaultMessage: 'Index',
});
export const RULE_EVALUATED_AT = i18n.translate('xpack.csp.findings.ruleEvaluatedAt', {
defaultMessage: 'Rule evaluated at',
});
export const EVALUATED_AT = i18n.translate('xpack.csp.findings.evaluatedAt', {
defaultMessage: 'Evaluated at',
});
export const FRAMEWORK_SOURCES = i18n.translate('xpack.csp.findings.frameworkSourcesLabel', {
defaultMessage: 'Framework Sources',
});
export const SECTION = i18n.translate('xpack.csp.findings.sectionLabel', {
defaultMessage: 'Section',
});
export const AUDIT = i18n.translate('xpack.csp.findings.auditLabel', {
defaultMessage: 'Audit',
});
export const REFERENCES = i18n.translate(
'xpack.csp.findings.findingsFlyout.generalTab.referencesLabel',
{
defaultMessage: 'References',
}
);
export const RESULT_DETAILS = i18n.translate('xpack.csp.findings.resultLabel', {
defaultMessage: 'Result Details',
});
export const PROFILE_APPLICABILITY = i18n.translate(
'xpack.csp.findings.profileApplicabilityLabel',
{ defaultMessage: 'Profile Applicability' }
);
export const EVALUATION = i18n.translate('xpack.csp.findings.evaluationLabel', {
defaultMessage: 'Evaluation',
});
export const EXPECTED = i18n.translate('xpack.csp.findings.expectedLabel', {
defaultMessage: 'Expected',
});
export const ACTUAL = i18n.translate('xpack.csp.findings.actualLabel', {
defaultMessage: 'Actual',
});
export const EVIDENCE = i18n.translate('xpack.csp.findings.evidenceLabel', {
defaultMessage: 'Evidence',
});
export const TIMESTAMP = i18n.translate('xpack.csp.findings.timestampLabel', {
defaultMessage: 'Timestamp',
});
export const AGENT = i18n.translate('xpack.csp.findings.agentLabel', {
defaultMessage: 'Agent',
});
export const VERSION = i18n.translate('xpack.csp.findings.versionLabel', {
defaultMessage: 'Version',
});
export const ID = i18n.translate('xpack.csp.findings.idLabel', {
defaultMessage: 'ID',
});
export const HOST = i18n.translate('xpack.csp.findings.hostLabel', {
defaultMessage: 'Host',
});
export const ARCHITECTURE = i18n.translate('xpack.csp.findings.architectureLabel', {
defaultMessage: 'Architecture',
});
export const CONTAINERIZED = i18n.translate('xpack.csp.findings.containerizedLabel', {
defaultMessage: 'Containerized',
});
export const HOSTNAME = i18n.translate('xpack.csp.findings.hostnameLabel', {
defaultMessage: 'Hostname',
});
export const MAC = i18n.translate('xpack.csp.findings.macLabel', {
defaultMessage: 'Mac',
});
export const IP = i18n.translate('xpack.csp.findings.ipLabel', {
defaultMessage: 'IP',
});
export const CODENAME = i18n.translate('xpack.csp.findings.codenameLabel', {
defaultMessage: 'Codename',
});
export const FAMILY = i18n.translate('xpack.csp.findings.familyLabel', {
defaultMessage: 'Family',
});
export const KERNEL = i18n.translate('xpack.csp.findings.kernelLabel', {
defaultMessage: 'Kernel',
});
export const PLATFORM = i18n.translate('xpack.csp.findings.platformLabel', {
defaultMessage: 'Platform',
});
export const NO_FINDINGS = i18n.translate('xpack.csp.findings.nonFindingsLabel', {
defaultMessage: 'There are no Findings',
});
export const DETAILS = i18n.translate('xpack.csp.findings.findingsFlyout.detailsTabLabel', {
defaultMessage: 'Details',
});
export const FINDINGS_SEARCH_PLACEHOLDER = i18n.translate(
'xpack.csp.findings.searchBar.searchPlaceholder',
{ defaultMessage: 'Search findings (eg. rule.section.keyword : "API Server" )' }
);
export const PAGE_SEARCH_ERROR_MESSAGE = i18n.translate(
'xpack.csp.findings.errorCallout.pageSearchErrorTitle',
{ defaultMessage: 'We encountered an error retrieving search results' }
);

View file

@ -10001,51 +10001,6 @@
"xpack.csp.cspPageTemplate.packageNotInstalled.pageTitle": "Installer l'intégration pour commencer",
"xpack.csp.cspPageTemplate.packageNotInstalled.solutionNameLabel": "Niveau de sécurité du cloud",
"xpack.csp.cspSettings.rules": "Règles de sécurité du CSP - ",
"xpack.csp.findings.agentLabel": "Agent",
"xpack.csp.findings.architectureLabel": "Architecture",
"xpack.csp.findings.auditLabel": "Audit",
"xpack.csp.findings.benchmarkLabel": "Benchmark",
"xpack.csp.findings.codenameLabel": "Nom de code",
"xpack.csp.findings.containerizedLabel": "Conteneurisé",
"xpack.csp.findings.defaultValueLabel": "Valeur par défaut",
"xpack.csp.findings.descriptionLabel": "Description",
"xpack.csp.findings.evaluationLabel": "Évaluation",
"xpack.csp.findings.evidenceLabel": "Preuve",
"xpack.csp.findings.expectedLabel": "Attendus",
"xpack.csp.findings.familyLabel": "Famille",
"xpack.csp.findings.filenameLabel": "Nom de fichier",
"xpack.csp.findings.frameworkSourcesLabel": "Sources du framework",
"xpack.csp.findings.gidLabel": "GID",
"xpack.csp.findings.hostLabel": "HÔTE",
"xpack.csp.findings.hostnameLabel": "Nom d'hôte",
"xpack.csp.findings.idLabel": "ID",
"xpack.csp.findings.impactLabel": "Impact",
"xpack.csp.findings.indexLabel": "Index",
"xpack.csp.findings.ipLabel": "IP",
"xpack.csp.findings.kernelLabel": "Kernel",
"xpack.csp.findings.macLabel": "Mac",
"xpack.csp.findings.modeLabel": "Mode",
"xpack.csp.findings.nameLabel": "Nom",
"xpack.csp.findings.nonFindingsLabel": "Il n'y a aucun résultat",
"xpack.csp.findings.osLabel": "Système d'exploitation",
"xpack.csp.findings.pathLabel": "Chemin",
"xpack.csp.findings.platformLabel": "Plateforme",
"xpack.csp.findings.profileApplicabilityLabel": "Applicabilité du profil",
"xpack.csp.findings.rationaleLabel": "Environnement",
"xpack.csp.findings.remediationLabel": "Résolution",
"xpack.csp.findings.resourceLabel": "Ressource",
"xpack.csp.findings.resultLabel": "Détails du résultat",
"xpack.csp.findings.ruleEvaluatedAt": "Règle évaluée à",
"xpack.csp.findings.ruleLabel": "Règle",
"xpack.csp.findings.ruleNameLabel": "Nom de règle",
"xpack.csp.findings.searchFailedLabel": "Échec de la recherche",
"xpack.csp.findings.sectionLabel": "Section",
"xpack.csp.findings.severityLabel": "Sévérité",
"xpack.csp.findings.tagsLabel": "Balises",
"xpack.csp.findings.timestampLabel": "Horodatage",
"xpack.csp.findings.typeLabel": "Type",
"xpack.csp.findings.uidLabel": "UID",
"xpack.csp.findings.versionLabel": "Version",
"xpack.csp.pageTemplate.errorDetails.errorBodyTitle": "{body}",
"xpack.csp.pageTemplate.errorDetails.errorCodeTitle": "{error} {statusCode}",
"xpack.csp.pageTemplate.loadErrorMessage": "Nous n'avons pas pu récupérer vos données sur le niveau de sécurité du cloud.",

View file

@ -10099,51 +10099,6 @@
"xpack.csp.cspPageTemplate.packageNotInstalled.pageTitle": "開始するには統合をインストールしてください",
"xpack.csp.cspPageTemplate.packageNotInstalled.solutionNameLabel": "クラウドセキュリティ態勢",
"xpack.csp.cspSettings.rules": "CSPセキュリティルール - ",
"xpack.csp.findings.agentLabel": "エージェント",
"xpack.csp.findings.architectureLabel": "アーキテクチャー",
"xpack.csp.findings.auditLabel": "監査",
"xpack.csp.findings.benchmarkLabel": "ベンチマーク",
"xpack.csp.findings.codenameLabel": "コード名",
"xpack.csp.findings.containerizedLabel": "コンテナー化",
"xpack.csp.findings.defaultValueLabel": "デフォルト値",
"xpack.csp.findings.descriptionLabel": "説明",
"xpack.csp.findings.evaluationLabel": "評価",
"xpack.csp.findings.evidenceLabel": "証拠",
"xpack.csp.findings.expectedLabel": "期待値",
"xpack.csp.findings.familyLabel": "ファミリー",
"xpack.csp.findings.filenameLabel": "ファイル名",
"xpack.csp.findings.frameworkSourcesLabel": "フレームワークソース",
"xpack.csp.findings.gidLabel": "GID",
"xpack.csp.findings.hostLabel": "ホスト",
"xpack.csp.findings.hostnameLabel": "ホスト名",
"xpack.csp.findings.idLabel": "ID",
"xpack.csp.findings.impactLabel": "インパクト",
"xpack.csp.findings.indexLabel": "インデックス",
"xpack.csp.findings.ipLabel": "IP",
"xpack.csp.findings.kernelLabel": "カーネル",
"xpack.csp.findings.macLabel": "Mac",
"xpack.csp.findings.modeLabel": "モード",
"xpack.csp.findings.nameLabel": "名前",
"xpack.csp.findings.nonFindingsLabel": "調査結果はありません",
"xpack.csp.findings.osLabel": "OS",
"xpack.csp.findings.pathLabel": "パス",
"xpack.csp.findings.platformLabel": "プラットフォーム",
"xpack.csp.findings.profileApplicabilityLabel": "プロファイル適用性",
"xpack.csp.findings.rationaleLabel": "根拠",
"xpack.csp.findings.remediationLabel": "修正",
"xpack.csp.findings.resourceLabel": "リソース",
"xpack.csp.findings.resultLabel": "結果詳細",
"xpack.csp.findings.ruleEvaluatedAt": "ルール評価日",
"xpack.csp.findings.ruleLabel": "ルール",
"xpack.csp.findings.ruleNameLabel": "ルール名",
"xpack.csp.findings.searchFailedLabel": "検索失敗",
"xpack.csp.findings.sectionLabel": "セクション",
"xpack.csp.findings.severityLabel": "深刻度",
"xpack.csp.findings.tagsLabel": "タグ",
"xpack.csp.findings.timestampLabel": "タイムスタンプ",
"xpack.csp.findings.typeLabel": "型",
"xpack.csp.findings.uidLabel": "UID",
"xpack.csp.findings.versionLabel": "バージョン",
"xpack.csp.pageTemplate.errorDetails.errorBodyTitle": "{body}",
"xpack.csp.pageTemplate.errorDetails.errorCodeTitle": "{error} {statusCode}",
"xpack.csp.pageTemplate.loadErrorMessage": "クラウドセキュリティ態勢データを取得できませんでした",

View file

@ -10115,51 +10115,6 @@
"xpack.csp.cspPageTemplate.packageNotInstalled.pageTitle": "安装集成以开始",
"xpack.csp.cspPageTemplate.packageNotInstalled.solutionNameLabel": "云安全态势",
"xpack.csp.cspSettings.rules": "CSP 安全规则 - ",
"xpack.csp.findings.agentLabel": "代理",
"xpack.csp.findings.architectureLabel": "架构",
"xpack.csp.findings.auditLabel": "审计",
"xpack.csp.findings.benchmarkLabel": "基准",
"xpack.csp.findings.codenameLabel": "代号",
"xpack.csp.findings.containerizedLabel": "容器化",
"xpack.csp.findings.defaultValueLabel": "默认值",
"xpack.csp.findings.descriptionLabel": "描述",
"xpack.csp.findings.evaluationLabel": "评估",
"xpack.csp.findings.evidenceLabel": "证据",
"xpack.csp.findings.expectedLabel": "预期",
"xpack.csp.findings.familyLabel": "系列",
"xpack.csp.findings.filenameLabel": "文件名",
"xpack.csp.findings.frameworkSourcesLabel": "框架源",
"xpack.csp.findings.gidLabel": "GID",
"xpack.csp.findings.hostLabel": "主机",
"xpack.csp.findings.hostnameLabel": "主机名",
"xpack.csp.findings.idLabel": "ID",
"xpack.csp.findings.impactLabel": "影响",
"xpack.csp.findings.indexLabel": "索引",
"xpack.csp.findings.ipLabel": "IP",
"xpack.csp.findings.kernelLabel": "内核",
"xpack.csp.findings.macLabel": "Mac",
"xpack.csp.findings.modeLabel": "模式",
"xpack.csp.findings.nameLabel": "名称",
"xpack.csp.findings.nonFindingsLabel": "无结果",
"xpack.csp.findings.osLabel": "OS",
"xpack.csp.findings.pathLabel": "路径",
"xpack.csp.findings.platformLabel": "平台",
"xpack.csp.findings.profileApplicabilityLabel": "配置文件适用性",
"xpack.csp.findings.rationaleLabel": "理由",
"xpack.csp.findings.remediationLabel": "补救",
"xpack.csp.findings.resourceLabel": "资源",
"xpack.csp.findings.resultLabel": "结果详情",
"xpack.csp.findings.ruleEvaluatedAt": "规则评估时间",
"xpack.csp.findings.ruleLabel": "规则",
"xpack.csp.findings.ruleNameLabel": "规则名称",
"xpack.csp.findings.searchFailedLabel": "搜索失败",
"xpack.csp.findings.sectionLabel": "部分",
"xpack.csp.findings.severityLabel": "严重性",
"xpack.csp.findings.tagsLabel": "标签",
"xpack.csp.findings.timestampLabel": "时间戳",
"xpack.csp.findings.typeLabel": "类型",
"xpack.csp.findings.uidLabel": "UID",
"xpack.csp.findings.versionLabel": "版本",
"xpack.csp.pageTemplate.errorDetails.errorBodyTitle": "{body}",
"xpack.csp.pageTemplate.errorDetails.errorCodeTitle": "{error} {statusCode}",
"xpack.csp.pageTemplate.loadErrorMessage": "我们无法提取您的云安全态势数据",