import React, { FC, useState, useMemo } from 'react'; import _ from 'lodash'; import { SelectableValue } from '@grafana/data'; import { Segment, Icon } from '@grafana/ui'; import { getAggregationOptionsByMetric } from '../functions'; import { ValueTypes, MetricKind } from '../constants'; import { MetricDescriptor } from '../types'; export interface Props { onChange: (metricDescriptor: string) => void; metricDescriptor?: MetricDescriptor; crossSeriesReducer: string; groupBys: string[]; children: (displayAdvancedOptions: boolean) => React.ReactNode; templateVariableOptions: Array>; } export const Aggregations: FC = (props) => { const [displayAdvancedOptions, setDisplayAdvancedOptions] = useState(false); const aggOptions = useAggregationOptionsByMetric(props); const selected = useSelectedFromOptions(aggOptions, props); return (
props.onChange(value!)} value={selected} options={[ { label: 'Template Variables', options: props.templateVariableOptions, }, { label: 'Aggregations', expanded: true, options: aggOptions, }, ]} placeholder="Select Reducer" />
{props.children(displayAdvancedOptions)}
); }; const useAggregationOptionsByMetric = ({ metricDescriptor }: Props): Array> => { return useMemo(() => { if (!metricDescriptor) { return []; } return getAggregationOptionsByMetric( metricDescriptor.valueType as ValueTypes, metricDescriptor.metricKind as MetricKind ).map((a) => ({ ...a, label: a.text, })); }, [metricDescriptor?.metricKind, metricDescriptor?.valueType]); }; const useSelectedFromOptions = (aggOptions: Array>, props: Props) => { return useMemo(() => { const allOptions = [...aggOptions, ...props.templateVariableOptions]; return allOptions.find((s) => s.value === props.crossSeriesReducer); }, [aggOptions, props.crossSeriesReducer, props.templateVariableOptions]); };