import React, { useState, useEffect } from 'react'; import { Project, Aggregations, Metrics, LabelFilter, GroupBys, Alignments, AlignmentPeriods, AliasBy } from '.'; import { MetricQuery, MetricDescriptor } from '../types'; import { getAlignmentPickerData } from '../functions'; import CloudMonitoringDatasource from '../datasource'; import { SelectableValue } from '@grafana/data'; export interface Props { refId: string; usedAlignmentPeriod?: number; variableOptionGroup: SelectableValue; onChange: (query: MetricQuery) => void; onRunQuery: () => void; query: MetricQuery; datasource: CloudMonitoringDatasource; } interface State { labels: any; [key: string]: any; } export const defaultState: State = { labels: {}, }; export const defaultQuery: (dataSource: CloudMonitoringDatasource) => MetricQuery = dataSource => ({ projectName: dataSource.getDefaultProject(), metricType: '', metricKind: '', valueType: '', unit: '', crossSeriesReducer: 'REDUCE_MEAN', alignmentPeriod: 'cloud-monitoring-auto', perSeriesAligner: 'ALIGN_MEAN', groupBys: [], filters: [], aliasBy: '', }); function Editor({ refId, query, datasource, onChange, usedAlignmentPeriod, variableOptionGroup, }: React.PropsWithChildren) { const [state, setState] = useState(defaultState); useEffect(() => { if (query && query.projectName && query.metricType) { datasource .getLabels(query.metricType, refId, query.projectName, query.groupBys) .then(labels => setState({ ...state, labels })); } }, [query.projectName, query.groupBys, query.metricType]); const onMetricTypeChange = async ({ valueType, metricKind, type, unit }: MetricDescriptor) => { const { perSeriesAligner, alignOptions } = getAlignmentPickerData( { valueType, metricKind, perSeriesAligner: state.perSeriesAligner }, datasource.templateSrv ); setState({ ...state, alignOptions, }); onChange({ ...query, perSeriesAligner, metricType: type, unit, valueType, metricKind }); }; const { labels } = state; const { perSeriesAligner, alignOptions } = getAlignmentPickerData(query, datasource.templateSrv); return ( <> { onChange({ ...query, projectName }); }} /> {metric => ( <> onChange({ ...query, filters })} variableOptionGroup={variableOptionGroup} /> onChange({ ...query, groupBys })} variableOptionGroup={variableOptionGroup} /> onChange({ ...query, crossSeriesReducer })} > {displayAdvancedOptions => displayAdvancedOptions && ( onChange({ ...query, perSeriesAligner })} /> ) } onChange({ ...query, alignmentPeriod })} /> onChange({ ...query, aliasBy })} /> )} ); } export const MetricQueryEditor = React.memo(Editor);