import React from 'react'; import _ from 'lodash'; import { getAggregationOptionsByMetric } from '../functions'; import { StackdriverPicker } from './StackdriverPicker'; export interface Props { onChange: (metricDescriptor) => void; templateSrv: any; metricDescriptor: { valueType: string; metricKind: string; }; crossSeriesReducer: string; groupBys: string[]; children?: (renderProps: any) => JSX.Element; } interface State { aggOptions: any[]; displayAdvancedOptions: boolean; } export class Aggregations extends React.Component { state: State = { aggOptions: [], displayAdvancedOptions: false, }; constructor(props) { super(props); } componentDidMount() { if (this.props.metricDescriptor !== null) { this.setAggOptions(this.props); } } componentWillReceiveProps(nextProps: Props) { if (nextProps.metricDescriptor !== null) { this.setAggOptions(nextProps); } } setAggOptions({ metricDescriptor, crossSeriesReducer, groupBys, templateSrv }) { let aggregations = getAggregationOptionsByMetric(metricDescriptor.valueType, metricDescriptor.metricKind).map( a => ({ ...a, label: a.text, }) ); if (aggregations.length > 0 && !aggregations.find(o => o.value === templateSrv.replace(crossSeriesReducer))) { this.deselectAggregationOption('REDUCE_NONE'); } if (groupBys.length > 0) { aggregations = aggregations.filter(o => o.value !== 'REDUCE_NONE'); if (crossSeriesReducer === 'REDUCE_NONE') { this.deselectAggregationOption('REDUCE_NONE'); } } this.setState({ aggOptions: aggregations }); } deselectAggregationOption(notValidOptionValue: string) { const aggregations = getAggregationOptionsByMetric( this.props.metricDescriptor.valueType, this.props.metricDescriptor.metricKind ); const newValue = aggregations.find(o => o.value !== notValidOptionValue); this.props.onChange(newValue ? newValue.value : ''); } handleToggleDisplayAdvanced() { this.setState(state => ({ displayAdvancedOptions: !state.displayAdvancedOptions, })); } render() { const { aggOptions, displayAdvancedOptions } = this.state; const { templateSrv, onChange, crossSeriesReducer } = this.props; return (
onChange(value)} selected={crossSeriesReducer} templateVariables={templateSrv.variables} options={aggOptions} searchable={true} placeholder="Select Aggregation" className="width-15" groupName="Aggregations" />
{this.props.children(this.state.displayAdvancedOptions)}
); } }