@ -1,11 +1,13 @@
import deepEqual from 'fast-deep-equal' ;
import { isEqual } from 'lodash' ;
import React , { useEffect , useMemo , use State } from 'react' ;
import React , { useEffect , useState } from 'react' ;
import { QueryEditorProps , getDefaultTimeRange , toOption } from '@grafana/data' ;
import { EditorRows } from '@grafana/experimental' ;
import { ConfirmModal } from '@grafana/ui' ;
import CloudMonitoringDatasource from '../datasource' ;
import { selectors } from '../e2e/selectors' ;
import { CloudMonitoringQuery , PromQLQuery , QueryType , SLOQuery } from '../types/query' ;
import { CloudMonitoringOptions } from '../types/types' ;
@ -19,24 +21,16 @@ import { MetricQueryEditor, SLOQueryEditor } from './';
export type Props = QueryEditorProps < CloudMonitoringDatasource , CloudMonitoringQuery , CloudMonitoringOptions > ;
export const QueryEditor = ( props : Props ) = > {
const { datasource , query : oldQ , onRunQuery , onChange , range } = props ;
const { datasource , query , onRunQuery , onChange , range } = props ;
const [ modalIsOpen , setModalIsOpen ] = useState < boolean > ( false ) ;
const [ migratedQuery , setMigratedQuery ] = useState < CloudMonitoringQuery | undefined > ( ) ;
const query = useMemo ( ( ) = > {
if ( ! migratedQuery ) {
const migratedQuery = datasource . migrateQuery ( oldQ ) ;
setMigratedQuery ( migratedQuery ) ;
// Update the query once the migrations have been completed.
onChange ( { . . . migratedQuery } ) ;
return migratedQuery ;
}
if ( migratedQuery ) {
return migratedQuery ;
useEffect ( ( ) = > {
const migrated = datasource . migrateQuery ( query ) ;
if ( ! deepEqual ( migrated , query ) ) {
onChange ( { . . . migrated } ) ;
}
} , [ query , datasource , onChange ] ) ;
return oldQ ;
} , [ oldQ , datasource , onChange , migratedQuery ] ) ;
const [ currentQuery , setCurrentQuery ] = useState < CloudMonitoringQuery > ( query ) ;
const [ queryHasBeenEdited , setQueryHasBeenEdited ] = useState < boolean > ( false ) ;
@ -95,62 +89,64 @@ export const QueryEditor = (props: Props) => {
} ;
return (
< EditorRows >
< ConfirmModal
data - testid = "switch-query-type-modal"
title = "Warning"
body = "By switching your query type, your current query will be lost."
isOpen = { modalIsOpen }
onConfirm = { ( ) = > {
setModalIsOpen ( false ) ;
onChange ( currentQuery ) ;
setQueryHasBeenEdited ( false ) ;
} }
confirmText = "Confirm"
onDismiss = { ( ) = > {
setModalIsOpen ( false ) ;
setCurrentQuery ( query ) ;
} }
/ >
< QueryHeader query = { query } onChange = { checkForModalDisplay } onRunQuery = { onRunQuery } / >
{ queryType === QueryType . PROMQL && (
< PromQLQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
onChange = { onPromQLQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { promQLQuery }
/ >
) }
{ queryType !== QueryType . SLO && (
< MetricQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
customMetaData = { customMetaData }
onChange = { onMetricQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { query }
range = { range || getDefaultTimeRange ( ) }
/ >
) }
{ queryType === QueryType . SLO && (
< SLOQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
customMetaData = { customMetaData }
onChange = { onSLOQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { sloQuery }
aliasBy = { query . aliasBy }
onChangeAliasBy = { ( aliasBy : string ) = > onChange ( { . . . query , aliasBy } ) }
< span data - testid = { selectors . components . queryEditor . container } >
< EditorRows >
< ConfirmModal
data - testid = "switch-query-type-modal"
title = "Warning"
body = "By switching your query type, your current query will be lost."
isOpen = { modalIsOpen }
onConfirm = { ( ) = > {
setModalIsOpen ( false ) ;
onChange ( currentQuery ) ;
setQueryHasBeenEdited ( false ) ;
} }
confirmText = "Confirm"
onDismiss = { ( ) = > {
setModalIsOpen ( false ) ;
setCurrentQuery ( query ) ;
} }
/ >
) }
< / EditorRows >
< QueryHeader query = { query } onChange = { checkForModalDisplay } onRunQuery = { onRunQuery } / >
{ queryType === QueryType . PROMQL && (
< PromQLQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
onChange = { onPromQLQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { promQLQuery }
/ >
) }
{ queryType !== QueryType . SLO && (
< MetricQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
customMetaData = { customMetaData }
onChange = { onMetricQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { query }
range = { range || getDefaultTimeRange ( ) }
/ >
) }
{ queryType === QueryType . SLO && (
< SLOQueryEditor
refId = { query . refId }
variableOptionGroup = { variableOptionGroup }
customMetaData = { customMetaData }
onChange = { onSLOQueryChange }
onRunQuery = { onRunQuery }
datasource = { datasource }
query = { sloQuery }
aliasBy = { query . aliasBy }
onChangeAliasBy = { ( aliasBy : string ) = > onChange ( { . . . query , aliasBy } ) }
/ >
) }
< / EditorRows >
< / span >
) ;
} ;