/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import React, { Component } from "react"; import { EuiFlexGrid, EuiSpacer, EuiFlexItem, EuiText, EuiFlexGroup, EuiTableFieldDataColumnType, //@ts-ignore Criteria, //@ts-ignore Pagination, EuiTableSortingType, } from "@elastic/eui"; import { ContentPanel } from "../../../../components/ContentPanel"; import { DEFAULT_PAGE_SIZE_OPTIONS } from "../../../Rollups/utils/constants"; import { parseTimeunit } from "../../../CreateRollup/utils/helpers"; import { DimensionItem, FieldItem, MetricItem } from "../../../../../models/interfaces"; import { additionalMetricsComponent, AGGREGATION_AND_METRIC_SETTINGS, BaseAggregationAndMetricsState, BaseAggregationColumns, BaseMetricsColumns, sequenceTableComponents, sourceFieldComponents } from "../../../Commons/BaseAggregationAndMetricSettings"; interface AggregationAndMetricsSettingsProps { timestamp: string; histogramInterval: string; timezone: string; selectedDimensionField: DimensionItem[]; selectedMetrics: MetricItem[]; metricsShown: MetricItem[]; dimensionsShown: DimensionItem[]; onChangeDimensionsShown: (from: number, size: number) => void; onChangeMetricsShown: (from: number, size: number) => void; } interface AggregationAndMetricsSettingsState extends BaseAggregationAndMetricsState { } const aggregationColumns: Readonly>[] = BaseAggregationColumns; const metricsColumns = BaseMetricsColumns; export default class AggregationAndMetricsSettings extends Component< AggregationAndMetricsSettingsProps, AggregationAndMetricsSettingsState > { constructor(props: AggregationAndMetricsSettingsProps) { super(props); this.state = { from: 0, size: 10, sortField: "sequence", sortDirection: "desc", dimensionFrom: 0, dimensionSize: 10, dimensionSortField: "sequence", dimensionSortDirection: "desc", }; } onTableChange = ({ page: tablePage, sort }: Criteria): void => { const { index: page, size } = tablePage; const { field: sortField, direction: sortDirection } = sort; const { onChangeMetricsShown } = this.props; this.setState({ from: page * size, size, sortField, sortDirection, }); onChangeMetricsShown(page * size, page * size + size); }; onDimensionTableChange = ({ page: tablePage, sort }: Criteria): void => { const { index: page, size } = tablePage; const { field: sortField, direction: sortDirection } = sort; const { onChangeDimensionsShown } = this.props; this.setState({ dimensionFrom: page * size, dimensionSize: size, dimensionSortField: sortField, dimensionSortDirection: sortDirection, }); onChangeDimensionsShown(page * size, size); }; render() { const { timestamp, histogramInterval, timezone, selectedDimensionField, selectedMetrics, dimensionsShown, metricsShown } = this.props; const { from, size, sortDirection, sortField, dimensionFrom, dimensionSize, dimensionSortDirection, dimensionSortField } = this.state; const page = Math.floor(from / size); const dimensionPage = Math.floor(dimensionFrom / dimensionSize); const pagination: Pagination = { pageIndex: page, pageSize: size, pageSizeOptions: DEFAULT_PAGE_SIZE_OPTIONS, totalItemCount: selectedMetrics.length, }; const sorting: EuiTableSortingType = { sort: { direction: sortDirection, field: sortField, }, }; const dimensionPagination: Pagination = { pageIndex: dimensionPage, pageSize: dimensionSize, pageSizeOptions: DEFAULT_PAGE_SIZE_OPTIONS, totalItemCount: selectedDimensionField.length, }; const dimensionSorting: EuiTableSortingType = { sort: { direction: dimensionSortDirection, field: dimensionSortField, }, }; const intervalValue = histogramInterval.match(/(\d+)/); const intervalUnit = histogramInterval.match(/[a-zA-Z]+/g); let interval = ""; if (intervalValue && intervalUnit) { interval = intervalValue[0] + " " + parseTimeunit(intervalUnit[0]); } return (

Additional metrics

Timestamp field
{timestamp}
Interval
{interval}
Timezone
{timezone}

Additional aggregations

{`(${selectedDimensionField.length})`}

{ sequenceTableComponents(selectedDimensionField, dimensionsShown, aggregationColumns, dimensionPagination, dimensionSorting, this.onDimensionTableChange) } { additionalMetricsComponent(selectedMetrics) } { sourceFieldComponents(selectedMetrics, metricsShown, metricsColumns, pagination, sorting, this.onTableChange) }
); } }