From 30a1a136c1e0340cbb500b8bcbf9547f51aba82d Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Thu, 1 Oct 2020 20:27:22 +0200 Subject: [PATCH] [ML] DF Analytics: Collapsable sections on results pages (#76641) - Fixes cell color coding based on influence score for outlier detection results page data grid. (Part of #77046) - Introduces expandable sections (). In contrast to plain accordions, the main idea of this component is that it should also provide some sort of useful summary when collapsed instead of just being an expandable title. For example, the "Analysis" section is collapsed by default, but still offers information like analysis type, source and destination index. This concept should allow us to keep the analytics results pages usable with more content (additional results, evaluations, visualizations) being added over time. - The "Analysis" section is a reuse of the expandable row from the analytics jobs list. Some design adjustments have been made to make it usable in both places. --- .../color_range_legend/color_range_legend.tsx | 18 +- .../data_frame_analytics/common/fields.ts | 2 + .../expandable_section.scss | 3 + .../expandable_section/expandable_section.tsx | 94 +++++++ .../components/expandable_section/index.ts | 7 + .../outlier_exploration.tsx | 247 ++++++++++++++---- .../outlier_exploration/use_outlier_data.ts | 24 +- .../pages/analytics_exploration/page.tsx | 28 +- .../expanded_row_details_pane.scss | 8 + .../expanded_row_details_pane.tsx | 39 ++- .../expanded_row_messages_pane.scss | 9 + .../expanded_row_messages_pane.tsx | 16 +- .../translations/translations/ja-JP.json | 4 - .../translations/translations/zh-CN.json | 4 - .../ml/data_frame_analytics_results.ts | 2 +- 15 files changed, 390 insertions(+), 115 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/index.ts create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.scss diff --git a/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx b/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx index 25af3f0ec2f7f..a3b68b85aa9fa 100644 --- a/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx +++ b/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx @@ -7,7 +7,7 @@ import React, { useEffect, useRef, FC } from 'react'; import d3 from 'd3'; -import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiText } from '@elastic/eui'; const COLOR_RANGE_RESOLUTION = 10; @@ -134,15 +134,11 @@ export const ColorRangeLegend: FC = ({ } return ( - - - - {title} - - - - - - + <> + +

{title}

+
+ + ); }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts index f9c9bf26a9d16..e4581f0a87bdd 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts @@ -48,6 +48,8 @@ export const EXTENDED_NUMERICAL_TYPES = new Set([ // eslint-disable-next-line @typescript-eslint/naming-convention export const ML__ID_COPY = 'ml__id_copy'; +// eslint-disable-next-line @typescript-eslint/naming-convention +export const ML__INCREMENTAL_ID = 'ml__incremental_id'; export const isKeywordAndTextType = (fieldName: string): boolean => { const { fields } = newJobCapsService; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss new file mode 100644 index 0000000000000..e296744b2737d --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss @@ -0,0 +1,3 @@ +.mlExpandableSection { + padding: 0 $euiSizeS $euiSizeS $euiSizeS; +} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx new file mode 100644 index 0000000000000..97fb8fd29e5a7 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import './expandable_section.scss'; + +import React, { useState, FC, ReactNode } from 'react'; + +import { + EuiBadge, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingContent, + EuiPanel, + EuiText, +} from '@elastic/eui'; + +interface HeaderItem { + // id is used as the React key and to construct a data-test-subj + id: string; + label?: ReactNode; + value: ReactNode; +} + +const isHeaderItems = (arg: any): arg is HeaderItem[] => { + return Array.isArray(arg); +}; + +export interface ExpandableSectionProps { + content: ReactNode; + headerItems?: HeaderItem[] | 'loading'; + isExpanded?: boolean; + dataTestId: string; + title: ReactNode; +} + +export const ExpandableSection: FC = ({ + headerItems, + // For now we don't have a need for complete external control + // and just want to pass in a default value. If we wanted + // full external control we'd also need to add a onToggleExpanded() + // callback. + isExpanded: isExpandedDefault = true, + content, + dataTestId, + title, +}) => { + const [isExpanded, setIsExpanded] = useState(isExpandedDefault); + const toggleExpanded = () => { + setIsExpanded(!isExpanded); + }; + + return ( + +
+ + {title} + + {headerItems === 'loading' && } + {isHeaderItems(headerItems) && ( + + {headerItems.map(({ label, value, id }) => ( + + {label !== undefined && value !== undefined && ( + <> + +

{label}

+
+ {value} + + )} + {label === undefined && value} +
+ ))} +
+ )} +
+ {isExpanded && content} +
+ ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/index.ts new file mode 100644 index 0000000000000..ad7ce84902e87 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ExpandableSection, ExpandableSectionProps } from './expandable_section'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx index e165ee54acab8..7d7f5efcae321 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx @@ -4,11 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useState, FC } from 'react'; +import React, { useEffect, useState, FC } from 'react'; import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiPanel, EuiSpacer } from '@elastic/eui'; +import { + EuiDataGridColumn, + EuiHorizontalRule, + EuiLoadingSpinner, + EuiSpacer, + EuiText, +} from '@elastic/eui'; + +import type { DataFrameAnalysisConfigType } from '../../../../../../../common/types/data_frame_analytics'; import { useColorRange, @@ -19,18 +28,100 @@ import { ColorRangeLegend } from '../../../../../components/color_range_legend'; import { DataGrid } from '../../../../../components/data_grid'; import { SavedSearchQuery } from '../../../../../contexts/ml'; import { getToastNotifications } from '../../../../../util/dependency_cache'; +import { ml } from '../../../../../services/ml_api_service'; -import { defaultSearchQuery, useResultsViewConfig } from '../../../../common'; +import { getAnalysisType, defaultSearchQuery, useResultsViewConfig } from '../../../../common'; -import { getTaskStateBadge } from '../../../analytics_management/components/analytics_list/use_columns'; +import { isGetDataFrameAnalyticsStatsResponseOk } from '../../../analytics_management/services/analytics_service/get_analytics'; + +import { + DataFrameAnalyticsListRow, + DATA_FRAME_MODE, +} from '../../../analytics_management/components/analytics_list/common'; +import { ExpandedRow } from '../../../analytics_management/components/analytics_list/expanded_row'; +import { ExpandableSection, ExpandableSectionProps } from '../expandable_section'; import { ExplorationQueryBar } from '../exploration_query_bar'; -import { ExplorationTitle } from '../exploration_title'; import { IndexPatternPrompt } from '../index_pattern_prompt'; import { getFeatureCount } from './common'; import { useOutlierData } from './use_outlier_data'; +const getAnalyticsSectionHeaderItems = ( + expandedRowItem: DataFrameAnalyticsListRow | undefined +): ExpandableSectionProps['headerItems'] => { + return expandedRowItem !== undefined + ? [ + { + id: 'analysisTypeLabel', + label: ( + + ), + value: expandedRowItem.job_type, + }, + { + id: 'analysisSourceIndexLabel', + label: ( + + ), + value: expandedRowItem.config.source.index, + }, + { + id: 'analysisDestinationIndexLabel', + label: ( + + ), + value: expandedRowItem.config.dest.index, + }, + ] + : 'loading'; +}; + +const getResultsSectionHeaderItems = ( + columnsWithCharts: EuiDataGridColumn[], + tableItems: Array>, + rowCount: number, + colorRange: ReturnType +): ExpandableSectionProps['headerItems'] => { + return columnsWithCharts.length > 0 && tableItems.length > 0 + ? [ + { + id: 'explorationTableTotalDocs', + label: ( + + ), + value: rowCount, + }, + { + id: 'colorRangeLegend', + value: ( + + ), + }, + ] + : 'loading'; +}; + export type TableItem = Record; interface ExplorationProps { @@ -38,12 +129,7 @@ interface ExplorationProps { } export const OutlierExploration: FC = React.memo(({ jobId }) => { - const explorationTitle = i18n.translate('xpack.ml.dataframe.analytics.exploration.jobIdTitle', { - defaultMessage: 'Outlier detection job ID {jobId}', - values: { jobId }, - }); - - const { indexPattern, jobConfig, jobStatus, needsDestIndexPattern } = useResultsViewConfig(jobId); + const { indexPattern, jobConfig, needsDestIndexPattern } = useResultsViewConfig(jobId); const [searchQuery, setSearchQuery] = useState(defaultSearchQuery); const outlierData = useOutlierData(indexPattern, jobConfig, searchQuery); @@ -55,47 +141,74 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = jobConfig !== undefined ? getFeatureCount(jobConfig.dest.results_field, tableItems) : 1 ); - return ( - + const [expandedRowItem, setExpandedRowItem] = useState(); + + const fetchStats = async () => { + const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + const analyticsStats = await ml.dataFrameAnalytics.getDataFrameAnalyticsStats(jobId); + + const config = analyticsConfigs.data_frame_analytics[0]; + const stats = isGetDataFrameAnalyticsStatsResponseOk(analyticsStats) + ? analyticsStats.data_frame_analytics[0] + : undefined; + + if (stats === undefined) { + return; + } + + const newExpandedRowItem: DataFrameAnalyticsListRow = { + checkpointing: {}, + config, + id: config.id, + job_type: getAnalysisType(config.analysis) as DataFrameAnalysisConfigType, + mode: DATA_FRAME_MODE.BATCH, + state: stats.state, + stats, + }; + + setExpandedRowItem(newExpandedRowItem); + }; + + useEffect(() => { + fetchStats(); + }, [jobConfig?.id]); + + // Analytics section header items and content + const analyticsSectionHeaderItems = getAnalyticsSectionHeaderItems(expandedRowItem); + const analyticsSectionContent = ( + <> + + {expandedRowItem === undefined && ( + + + + + + )} + {(columnsWithCharts.length > 0 || searchQuery !== defaultSearchQuery) && + indexPattern !== undefined && + jobConfig !== undefined && + columnsWithCharts.length > 0 && + tableItems.length > 0 && + expandedRowItem !== undefined && } + + ); + + // Results section header items and content + const resultsSectionHeaderItems = getResultsSectionHeaderItems( + columnsWithCharts, + tableItems, + outlierData.rowCount, + colorRange + ); + const resultsSectionContent = ( + <> {jobConfig !== undefined && needsDestIndexPattern && ( )} - - - - - {jobStatus !== undefined && ( - - {getTaskStateBadge(jobStatus)} - - )} - - {(columnsWithCharts.length > 0 || searchQuery !== defaultSearchQuery) && indexPattern !== undefined && ( <> - - - - - - - - - {columnsWithCharts.length > 0 && tableItems.length > 0 && ( = React.memo(({ jobId }) = )} )} - + + ); + + return ( + <> + {(columnsWithCharts.length > 0 || searchQuery !== defaultSearchQuery) && + indexPattern !== undefined && ( + <> + + + + )} + + + } + /> + + + + + } + /> + + ); }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 151e5ea4e6feb..eded8e82a7919 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -31,10 +31,19 @@ import { getToastNotifications } from '../../../../../util/dependency_cache'; import { getIndexData, getIndexFields, DataFrameAnalyticsConfig } from '../../../../common'; import { FEATURE_INFLUENCE } from '../../../../common/constants'; import { DEFAULT_RESULTS_FIELD } from '../../../../../../../common/constants/data_frame_analytics'; -import { sortExplorationResultsFields, ML__ID_COPY } from '../../../../common/fields'; +import { + sortExplorationResultsFields, + ML__ID_COPY, + ML__INCREMENTAL_ID, +} from '../../../../common/fields'; import { getFeatureCount, getOutlierScoreFieldName } from './common'; +interface FeatureInfluence { + feature_name: string; + influence: number; +} + export const useOutlierData = ( indexPattern: IndexPattern | undefined, jobConfig: DataFrameAnalyticsConfig | undefined, @@ -61,7 +70,7 @@ export const useOutlierData = ( // reduce default selected rows from 20 to 8 for performance reasons. 8, // by default, hide feature-influence columns and the doc id copy - (d) => !d.includes(`.${FEATURE_INFLUENCE}.`) && d !== ML__ID_COPY + (d) => !d.includes(`.${FEATURE_INFLUENCE}.`) && d !== ML__ID_COPY && d !== ML__INCREMENTAL_ID ); useEffect(() => { @@ -138,9 +147,16 @@ export const useOutlierData = ( // column with feature values get color coded by its corresponding influencer value if ( fullItem[resultsField] !== undefined && - fullItem[resultsField][`${FEATURE_INFLUENCE}.${columnId}`] !== undefined + fullItem[resultsField][FEATURE_INFLUENCE] !== undefined && + fullItem[resultsField][FEATURE_INFLUENCE].find( + (d: FeatureInfluence) => d.feature_name === columnId + ) !== undefined ) { - backgroundColor = colorRange(fullItem[resultsField][`${FEATURE_INFLUENCE}.${columnId}`]); + backgroundColor = colorRange( + fullItem[resultsField][FEATURE_INFLUENCE].find( + (d: FeatureInfluence) => d.feature_name === columnId + ).influence + ); } // column with influencer values get color coded by its own value diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx index 4620bbd969fab..d2767a9612e3b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx @@ -6,11 +6,7 @@ import React, { Fragment, FC } from 'react'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { i18n } from '@kbn/i18n'; - import { - EuiBetaBadge, EuiPage, EuiPageBody, EuiPageContentBody, @@ -41,32 +37,12 @@ export const Page: FC<{ -

- -   - -

+

{jobId}

- + {analysisType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION && ( )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss new file mode 100644 index 0000000000000..efc9296350232 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss @@ -0,0 +1,8 @@ +.mlExpandedRowDetails { + padding: 0 $euiSizeS $euiSizeS $euiSizeS; +} + +/* Hide the basic table's header */ +.mlExpandedRowDetailsSection thead { + display: none; +} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx index 71ca2b6f60492..41722f7559de2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx @@ -4,16 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +import './expanded_row_details_pane.scss'; + import React, { Fragment, FC, ReactElement } from 'react'; -import { - EuiDescriptionList, - EuiFlexGroup, - EuiFlexItem, - EuiPanel, - EuiTitle, - EuiSpacer, -} from '@elastic/eui'; +import { EuiBasicTable, EuiFlexGroup, EuiFlexItem, EuiTitle, EuiSpacer } from '@elastic/eui'; export interface SectionItem { title: string; @@ -34,13 +29,33 @@ export const Section: FC = ({ section }) => { return null; } + const columns = [ + { + field: 'title', + name: '', + render: (v: SectionItem['title']) => {v}, + }, + { + field: 'description', + name: '', + render: (v: SectionItem['description']) => <>{v}, + }, + ]; + return ( - + <> {section.title} - - + + compressed + items={section.items} + columns={columns} + tableCaption={section.title} + tableLayout="auto" + className="mlExpandedRowDetailsSection" + /> + ); }; @@ -50,7 +65,7 @@ interface ExpandedRowDetailsPaneProps { export const ExpandedRowDetailsPane: FC = ({ sections }) => { return ( - + {sections .filter((s) => s.position === 'left') diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.scss new file mode 100644 index 0000000000000..5a4d1b3190402 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.scss @@ -0,0 +1,9 @@ +.mlExpandedRowJobMessages { + padding: 0 $euiSizeS $euiSizeS $euiSizeS; +} + +/* override ML legacy class "job-messages-table" */ +.mlExpandedRowJobMessages .euiTable, .mlExpandedRowJobMessages .euiTableRowCell { + background-color: transparent !important; +} + diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx index 942e335526d68..91925b7f0afe1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import './expanded_row_messages_pane.scss'; + import React, { FC, useState, useEffect, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { ml } from '../../../../../services/ml_api_service'; @@ -43,11 +45,13 @@ export const ExpandedRowMessagesPane: FC = ({ analyticsId }) => { useRefreshAnalyticsList({ onRefresh: getMessages }); return ( - +
+ +
); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index cc404e2dc7bff..9a08713b2c71f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10765,10 +10765,6 @@ "xpack.ml.dataframe.analytics.errorCallout.queryParsingErrorBody": "クエリ構文が無効であり、結果を返しませんでした。クエリ構文を確認し、再試行してください。", "xpack.ml.dataframe.analytics.errorCallout.queryParsingErrorTitle": "クエリをパースできません。", "xpack.ml.dataframe.analytics.exploration.colorRangeLegendTitle": "機能影響スコア", - "xpack.ml.dataframe.analytics.exploration.experimentalBadgeLabel": "実験的", - "xpack.ml.dataframe.analytics.exploration.experimentalBadgeTooltipContent": "データフレーム分析は実験段階の機能です。フィードバックをお待ちしています。", - "xpack.ml.dataframe.analytics.exploration.jobIdTitle": "外れ値検出ジョブID {jobId}", - "xpack.ml.dataframe.analytics.exploration.title": "分析の探索", "xpack.ml.dataframe.analytics.explorationResults.documentsShownHelpText": "予測があるドキュメントを示す", "xpack.ml.dataframe.analytics.explorationResults.fieldSelection": "{docFieldsCount, number}件中 showing {selectedFieldsLength, number}件の{docFieldsCount, plural, one {フィールド} other {フィールド}}", "xpack.ml.dataframe.analytics.explorationResults.firstDocumentsShownHelpText": "予測がある最初の{searchSize}のドキュメントを示す", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 0dafc247bc2a6..08e6109b73572 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10771,10 +10771,6 @@ "xpack.ml.dataframe.analytics.errorCallout.queryParsingErrorBody": "查询语法无效,未返回任何结果。请检查查询语法并重试。", "xpack.ml.dataframe.analytics.errorCallout.queryParsingErrorTitle": "无法解析查询。", "xpack.ml.dataframe.analytics.exploration.colorRangeLegendTitle": "功能影响分数", - "xpack.ml.dataframe.analytics.exploration.experimentalBadgeLabel": "实验性", - "xpack.ml.dataframe.analytics.exploration.experimentalBadgeTooltipContent": "数据帧分析为实验功能。我们很乐意听取您的反馈意见。", - "xpack.ml.dataframe.analytics.exploration.jobIdTitle": "离群值检测作业 ID {jobId}", - "xpack.ml.dataframe.analytics.exploration.title": "分析浏览", "xpack.ml.dataframe.analytics.explorationResults.documentsShownHelpText": "正在显示有相关预测存在的文档", "xpack.ml.dataframe.analytics.explorationResults.fieldSelection": "已选择 {docFieldsCount, number} 个{docFieldsCount, plural, one {字段} other {字段}}中的 {selectedFieldsLength, number} 个", "xpack.ml.dataframe.analytics.explorationResults.firstDocumentsShownHelpText": "正在显示有相关预测存在的前 {searchSize} 个文档", diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_results.ts b/x-pack/test/functional/services/ml/data_frame_analytics_results.ts index b6a6ff8eb6c63..8a72badebd923 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_results.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_results.ts @@ -36,7 +36,7 @@ export function MachineLearningDataFrameAnalyticsResultsProvider({ }, async assertOutlierTablePanelExists() { - await testSubjects.existOrFail('mlDFAnalyticsOutlierExplorationTablePanel'); + await testSubjects.existOrFail('mlDFExpandableSection-results'); }, async assertResultsTableExists() {