11import React , { ChangeEvent , ReactNode } from 'react' ;
22import { AsyncSelect , Button , Form , Icon , InlineField , Input , VerticalGroup } from '@grafana/ui' ;
3- import { DataFrame , DataQueryRequest , Field , getDefaultTimeRange , QueryEditorProps , SelectableValue , Vector } from '@grafana/data' ;
4- import { DataSource } from '../datasource' ;
5- import { DEFAULT_QUERY , HaystackDataSourceOptions , HaystackQuery } from '../types' ;
3+ import { QueryEditorProps } from '@grafana/data' ;
4+ import { DataSource , queryTypes } from '../datasource' ;
5+ import { DEFAULT_QUERY , HaystackDataSourceOptions , HaystackQuery , QueryType } from '../types' ;
66
77type Props = QueryEditorProps < DataSource , HaystackQuery , HaystackDataSourceOptions > ;
88
9- export function QueryEditor ( { datasource, query, onChange, onRunQuery, range , app } : Props ) {
10- const onTypeChange = ( event : SelectableValue < string > ) => {
11- onChange ( { ...query , type : event . value ?? queryTypeDefault . value ! } ) ;
9+ export function QueryEditor ( { datasource, query, onChange, onRunQuery } : Props ) {
10+ const onTypeChange = ( event : QueryType | null ) => {
11+ onChange ( { ...query , type : event ? .value ?? queryTypeDefault . value ! } ) ;
1212 } ;
1313 const onEvalChange = ( event : ChangeEvent < HTMLInputElement > ) => {
1414 onChange ( { ...query , type : 'eval' , eval : event . target . value } ) ;
@@ -20,83 +20,31 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery, range, ap
2020 onChange ( { ...query , type : 'read' , read : event . target . value } ) ;
2121 } ;
2222
23- interface QueryType extends SelectableValue < string > {
24- apiRequirements : string [ ] ;
25- }
26-
27- const queryTypes : QueryType [ ] = [
28- { label : 'Read' , value : "read" , apiRequirements : [ "read" ] , description : 'Read the records matched by a filter' } ,
29- { label : 'HisRead' , value : "hisRead" , apiRequirements : [ "hisRead" ] , description : 'Read the history of a point' } ,
30- { label : 'Eval' , value : "eval" , apiRequirements : [ "eval" ] , description : 'Evaluate an Axon expression' } ,
31- ] ;
3223 const queryTypeDefault = queryTypes [ 0 ] ;
33- function queryTypeFromLabel ( label : string ) {
34- return queryTypes . find ( ( queryType ) => queryType . value === label ) ;
24+ function queryTypeFromValue ( value : string ) : QueryType | null {
25+ return queryTypes . find ( ( queryType ) => queryType . value === value ) ?? null ;
3526 }
3627
3728 const SelectComponent = ( ) => {
3829 return (
3930 < InlineField label = "Type" >
4031 < AsyncSelect
41- loadOptions = { loadOps }
32+ loadOptions = { ( ) => { return datasource . loadOps ( query . refId ) ; } }
4233 defaultOptions
43- value = { queryTypeFromLabel ( query . type ) }
34+ value = { queryTypeFromValue ( query . type ) }
4435 width = { 30 }
4536 onChange = { ( queryType ) => {
46- onTypeChange ( queryType ) ;
37+ // QueryType comes back as a SelectableValue, so we just convert it to the QueryType
38+ onTypeChange ( queryTypeFromValue ( queryType . value ?? "" ) ) ;
4739 } }
4840 />
4941 </ InlineField >
5042 ) ;
5143 } ;
5244
53- // Queries the available ops from the datasource on only returns the ones that are supported.
54- const loadOps = ( ) => {
55- let opsRequest : DataQueryRequest < HaystackQuery > = {
56- requestId : 'ops' ,
57- dashboardId : 0 ,
58- interval : '0' ,
59- intervalMs : 0 ,
60- panelId : 0 ,
61- range : range ?? getDefaultTimeRange ( ) ,
62- scopedVars : { } ,
63- targets : [ { type : 'ops' , eval : "" , read : "" , hisRead : "" , refId : query . refId } ] ,
64- timezone : 'UTC' ,
65- app : 'ops' ,
66- startTime : 0 ,
67- }
68- return datasource . query ( opsRequest ) . toPromise ( ) . then ( ( result ) => {
69- if ( result ?. state === 'Error' ) {
70- return [ ] ;
71- }
72- let frame = result ?. data ?. find ( ( frame : DataFrame ) => {
73- return frame . refId === query . refId
74- } )
75- let opSymbols = frame ?. fields ?. find ( ( field : Field < any , Vector < string > > ) => {
76- return field . name === 'def'
77- } ) . values ?? [ ] ;
78- let ops : string [ ] = opSymbols . map ( ( opSymbol : string ) => {
79- if ( opSymbol . startsWith ( '^op:' ) ) {
80- return opSymbol . substring ( 4 ) ;
81- } else {
82- return opSymbol ;
83- }
84- } ) ;
85-
86- return queryTypes . filter ( ( queryType ) => {
87- return queryType . apiRequirements . every ( ( apiRequirement ) => {
88- return ops . find ( ( op ) => {
89- return op === apiRequirement
90- } ) !== undefined ;
91- } ) ;
92- } ) ;
93- } ) ;
94- }
95-
9645 function renderQuery ( ) : ReactNode {
9746 let width = 100 ;
98- let queryType = queryTypeFromLabel ( query . type ) ;
99- switch ( queryType ?. value ) {
47+ switch ( query . type ) {
10048 case "eval" :
10149 return (
10250 < InlineField >
0 commit comments