1
1
import React , { ChangeEvent , useRef , useState } from "react" ;
2
- import { Button , CodeEditor , Divider , Field , InlineField , InlineFieldRow , InlineSwitch , Input , Select } from "@grafana/ui" ;
2
+ import {
3
+ ActionMeta ,
4
+ Button ,
5
+ CodeEditor ,
6
+ Divider ,
7
+ Field ,
8
+ InlineField ,
9
+ InlineFieldRow ,
10
+ Input ,
11
+ Select ,
12
+
13
+ } from "@grafana/ui" ;
3
14
import { QueryEditorProps , SelectableValue } from "@grafana/data" ;
4
15
import { DataSource } from "../datasource" ;
5
16
import { MongoDataSourceOptions , MongoQuery , QueryLanguage , QueryType , DEFAULT_QUERY } from "../types" ;
6
- import { parseJsQuery , validateJsonQueryText } from "../utils" ;
17
+ import { parseJsQuery , parseJsQueryLegacy , validateJsonQueryText } from "../utils" ;
7
18
import * as monacoType from "monaco-editor/esm/vs/editor/editor.api" ;
8
19
9
20
type Props = QueryEditorProps < DataSource , MongoQuery , MongoDataSourceOptions > ;
@@ -25,10 +36,18 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) {
25
36
const codeEditorRef = useRef < monacoType . editor . IStandaloneCodeEditor | null > ( null ) ;
26
37
const [ queryTextError , setQueryTextError ] = useState < string | null > ( null ) ;
27
38
39
+ const optionsLanguage = [
40
+ { label : "JSON" , value : QueryLanguage . JSON } ,
41
+ { label : "JavaScript" , value : QueryLanguage . JAVASCRIPT , description : "javascript legacy" } ,
42
+ { label : "JavaScriptShadow" , value : QueryLanguage . JAVASCRIPT_SHADOW , description : "javascript with evaluation" }
43
+ ] ;
44
+
28
45
const onQueryTextChange = ( queryText : string ) => {
29
- if ( query . queryLanguage === QueryLanguage . JAVASCRIPT ) {
30
- const { collection, error } = parseJsQuery ( queryText ) ;
31
- onChange ( { ...query , collection : collection , queryText : queryText } ) ;
46
+ if ( query . queryLanguage === QueryLanguage . JAVASCRIPT || query . queryLanguage === QueryLanguage . JAVASCRIPT_SHADOW ) {
47
+ // parse the JavaScript query
48
+ const { error, collection } = query . queryLanguage === QueryLanguage . JAVASCRIPT_SHADOW ? parseJsQuery ( queryText ) : parseJsQueryLegacy ( queryText ) ;
49
+ // let the same query text as it is
50
+ onChange ( { ...query , queryText : queryText , ...( collection ? { collection} : { } ) } ) ;
32
51
setQueryTextError ( error ) ;
33
52
if ( ! error ) {
34
53
onRunQuery ( ) ;
@@ -43,13 +62,8 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) {
43
62
}
44
63
} ;
45
64
46
- const onQueryLanguageChange = ( e : React . FormEvent < HTMLInputElement > ) => {
47
- if ( e . currentTarget . checked ) {
48
- onChange ( { ...query , queryLanguage : QueryLanguage . JAVASCRIPT } ) ;
49
-
50
- } else {
51
- onChange ( { ...query , queryLanguage : QueryLanguage . JSON } ) ;
52
- }
65
+ const onQueryLanguageChange = ( value : SelectableValue < string > , actionMeta : ActionMeta ) => {
66
+ onChange ( { ...query , queryLanguage : value . value } ) ;
53
67
} ;
54
68
55
69
const onQueryTypeChange = ( sv : SelectableValue < string > ) => {
@@ -80,18 +94,18 @@ export function QueryEditor({ query, onChange, onRunQuery }: Props) {
80
94
< InlineField label = "Query Type" >
81
95
< Select id = "query-editor-query-type" options = { queryTypes } value = { query . queryType || QueryType . TIMESERIES } onChange = { onQueryTypeChange } > </ Select >
82
96
</ InlineField >
83
- { query . queryLanguage === QueryLanguage . JSON && < InlineField label = "Collection" tooltip = "Enter the collection to query"
84
- error = "Please enter the collection" invalid = { ! query . collection } >
97
+ < InlineField label = "Collection" tooltip = "Enter the collection to query"
98
+ error = "Please enter the collection" invalid = { ! query . collection } >
85
99
< Input id = "query-editor-collection" onChange = { onCollectionChange } value = { query . collection } required />
86
- </ InlineField > }
100
+ </ InlineField >
87
101
</ InlineFieldRow >
88
102
< Divider />
89
- < InlineField label = "Use JavaScript Query" >
90
- < InlineSwitch id = "query-editor-use-js-query" value = { query . queryLanguage === QueryLanguage . JAVASCRIPT } onChange = { onQueryLanguageChange } />
103
+ < InlineField label = "Query language " >
104
+ < Select id = "query-editor-use-js-query" onChange = { onQueryLanguageChange } options = { optionsLanguage } value = { query . queryLanguage } />
91
105
</ InlineField >
92
- < Field label = "Query Text" description = { `Enter the Mongo Aggregation Pipeline (${ query . queryLanguage === QueryLanguage . JSON ? "JSON" : "JavaScript" } )` }
106
+ < Field label = "Query Text" description = { `Enter the Mongo Aggregation Pipeline (${ query . queryLanguage } )` }
93
107
error = { queryTextError } invalid = { queryTextError != null } >
94
- < CodeEditor onEditorDidMount = { onCodeEditorDidMount } width = "100%" height = { 300 } language = { query . queryLanguage || " "}
108
+ < CodeEditor onEditorDidMount = { onCodeEditorDidMount } width = "100%" height = { 300 } language = { query . queryLanguage === QueryLanguage . JAVASCRIPT || query . queryLanguage === QueryLanguage . JAVASCRIPT_SHADOW ? "javascript" : "json "}
95
109
onBlur = { onQueryTextChange } value = { query . queryText || "" } showMiniMap = { false } showLineNumbers = { true } />
96
110
</ Field >
97
111
< Button onClick = { onFormatQueryText } > Format</ Button >
0 commit comments