import React, { PureComponent } from 'react'; import { css } from '@emotion/css'; import { QueryEditorProps } from '@grafana/data'; import { Button, Select } from '@grafana/ui'; import { MetricQueryEditor, SLOQueryEditor, QueryEditorRow } from './'; import { CloudMonitoringQuery, MetricQuery, QueryType, SLOQuery, EditorMode } from '../types'; import { SELECT_WIDTH, QUERY_TYPES } from '../constants'; import { defaultQuery } from './MetricQueryEditor'; import { defaultQuery as defaultSLOQuery } from './SLO/SLOQueryEditor'; import { toOption } from '../functions'; import CloudMonitoringDatasource from '../datasource'; export type Props = QueryEditorProps; export class QueryEditor extends PureComponent { async UNSAFE_componentWillMount() { const { datasource, query } = this.props; // Unfortunately, migrations like this need to go UNSAFE_componentWillMount. As soon as there's // migration hook for this module.ts, we can do the migrations there instead. if (!this.props.query.hasOwnProperty('metricQuery')) { const { hide, refId, datasource, key, queryType, maxLines, metric, ...metricQuery } = this.props.query as any; this.props.query.metricQuery = metricQuery; } if (!this.props.query.hasOwnProperty('queryType')) { this.props.query.queryType = QueryType.METRICS; } await datasource.ensureGCEDefaultProject(); if (!query.metricQuery.projectName) { this.props.query.metricQuery.projectName = datasource.getDefaultProject(); } } onQueryChange(prop: string, value: MetricQuery | SLOQuery) { this.props.onChange({ ...this.props.query, [prop]: value }); this.props.onRunQuery(); } render() { const { datasource, query, onRunQuery, onChange } = this.props; const metricQuery = { ...defaultQuery(datasource), ...query.metricQuery }; const sloQuery = { ...defaultSLOQuery(datasource), ...query.sloQuery }; const queryType = query.queryType || QueryType.METRICS; const meta = this.props.data?.series.length ? this.props.data?.series[0].meta : {}; const customMetaData = meta?.custom ?? {}; const variableOptionGroup = { label: 'Template Variables', expanded: false, options: datasource.getVariables().map(toOption), }; return ( <> this.onQueryChange('metricQuery', { ...metricQuery, editorMode: metricQuery.editorMode === EditorMode.MQL ? EditorMode.Visual : EditorMode.MQL, }) } > {metricQuery.editorMode === EditorMode.MQL ? 'Switch to builder' : 'Edit MQL'} ) } >