Skip to content

Commit 36558a0

Browse files
committed
Refactor variable editor
1 parent 22febe5 commit 36558a0

File tree

6 files changed

+66
-54
lines changed

6 files changed

+66
-54
lines changed

src/components/QueryEditor.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import {
1111
} from '@grafana/ui';
1212
import { EditorHeader, InlineSelect, FlexItem } from '@grafana/plugin-ui';
1313
import { CoreApp, QueryEditorProps, SelectableValue, LoadingState } from '@grafana/data';
14-
import { DataSource } from '../datasource';
14+
import { MongoDBDataSource } from '../datasource';
1515
import { MongoDataSourceOptions, MongoQuery, QueryLanguage, QueryType, DEFAULT_QUERY } from '../types';
1616
import { parseJsQuery, parseJsQueryLegacy } from '../utils';
1717
import { QueryEditorRaw } from './QueryEditorRaw';
1818
import { QueryToolbox } from './QueryToolbox';
1919
import validator from 'validator';
2020

21-
type Props = QueryEditorProps<DataSource, MongoQuery, MongoDataSourceOptions>;
21+
type Props = QueryEditorProps<MongoDBDataSource, MongoQuery, MongoDataSourceOptions>;
2222

2323
const queryTypes: Array<SelectableValue<string>> = [
2424
{

src/components/QueryToolbox.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import React from 'react';
1+
import React, { useMemo, useState } from 'react';
22
import { css } from '@emotion/css';
3-
import { useMemo, useState } from 'react';
43
import { Stack, IconButton, useTheme2 } from '@grafana/ui';
54

65
interface QueryToolboxProps {
Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useState } from 'react';
22
import { VariableQuery } from '../types';
3-
import { CodeEditor, Field, InlineField, Input, Button, Alert } from '@grafana/ui';
3+
import { InlineField, Input, Alert, InlineFieldRow, Button } from '@grafana/ui';
4+
import { QueryEditorRaw } from './QueryEditorRaw';
45

56
interface VariableQueryProps {
67
query: VariableQuery;
@@ -9,53 +10,44 @@ interface VariableQueryProps {
910

1011
export const VariableQueryEditor = ({ onChange, query }: VariableQueryProps) => {
1112
const [state, setState] = useState(query);
12-
13-
const saveQuery = () => {
14-
onChange(state, `${state.collection} (${state.queryText})`);
15-
};
16-
17-
const handleCollectionChange = (event: React.FormEvent<HTMLInputElement>) =>
18-
setState({
19-
...state,
20-
collection: event.currentTarget.value,
21-
});
22-
23-
const handleQueryTextChange = (text: string) =>
24-
setState({
25-
...state,
26-
queryText: text,
27-
});
28-
2913
return (
3014
<>
31-
<InlineField
32-
label="Collection"
33-
tooltip="Enter the MongoDB collection"
34-
error="Please enter the collection"
35-
invalid={!query.collection}
36-
>
37-
<Input name="collection" onChange={handleCollectionChange} value={state.collection}></Input>
38-
</InlineField>
39-
<Field label="Query Text" description="MongoDB aggregate (JSON)">
40-
<CodeEditor
41-
width="100%"
42-
height={300}
43-
language="json"
44-
onBlur={saveQuery}
45-
value={query.queryText || ''}
46-
showMiniMap={false}
47-
showLineNumbers={true}
48-
onChange={handleQueryTextChange}
49-
monacoOptions={{ fontSize: 14 }}
50-
/>
51-
</Field>
52-
<Alert title="Query info" severity="info">
15+
<InlineFieldRow>
16+
<InlineField
17+
label="Collection"
18+
tooltip="Name of MongoDB collection to query"
19+
error="Collection is required"
20+
invalid={!state.collection}
21+
>
22+
<Input
23+
name="collection"
24+
onChange={(evt) => setState({ ...state, collection: evt.currentTarget.value })}
25+
value={state.collection}
26+
></Input>
27+
</InlineField>
28+
<Button
29+
onClick={() => {
30+
onChange(
31+
{ queryText: state.queryText, collection: state.collection },
32+
`${state.collection} (${state.queryText})`,
33+
);
34+
}}
35+
>
36+
Save and Query
37+
</Button>
38+
</InlineFieldRow>
39+
40+
<QueryEditorRaw
41+
query={query.queryText ?? ''}
42+
language="json"
43+
onBlur={(queryText) => setState({ ...query, queryText: queryText })}
44+
height={300}
45+
fontSize={14}
46+
/>
47+
<Alert title="Query info" severity="info" style={{ marginTop: 2 }}>
5348
The query result is expected to contain <code>value</code> field which has elements of type <code>string</code>{' '}
5449
or <code>number</code>
5550
</Alert>
56-
<Button onClick={saveQuery} variant="primary">
57-
Query
58-
</Button>
5951
</>
6052
);
6153
};

src/datasource.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
DataQueryResponse,
1111
LoadingState
1212
} from '@grafana/data';
13-
import { DataSourceWithBackend, getGrafanaLiveSrv, getTemplateSrv } from '@grafana/runtime';
13+
import { DataSourceWithBackend, getGrafanaLiveSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime';
1414
import {
1515
parseJsQuery,
1616
getBucketCount,
@@ -23,10 +23,13 @@ import {
2323
} from './utils';
2424
import { MongoQuery, MongoDataSourceOptions, DEFAULT_QUERY, QueryLanguage, VariableQuery } from './types';
2525
import { firstValueFrom, merge, Observable, of } from 'rxjs';
26+
import { MongoDBVariableSupport } from 'variables'
2627

27-
export class DataSource extends DataSourceWithBackend<MongoQuery, MongoDataSourceOptions> {
28-
constructor(instanceSettings: DataSourceInstanceSettings<MongoDataSourceOptions>) {
28+
export class MongoDBDataSource extends DataSourceWithBackend<MongoQuery, MongoDataSourceOptions> {
29+
constructor(instanceSettings: DataSourceInstanceSettings<MongoDataSourceOptions>,
30+
private readonly templateSrv: TemplateSrv = getTemplateSrv()) {
2931
super(instanceSettings);
32+
this.variables = new MongoDBVariableSupport(this, this.templateSrv);
3033
}
3134

3235
getDefaultQuery(_: CoreApp): Partial<MongoQuery> {

src/module.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { DataSourcePlugin } from '@grafana/data';
2-
import { DataSource } from './datasource';
2+
import { MongoDBDataSource } from './datasource';
33
import { ConfigEditor } from './components/ConfigEditor';
44
import { QueryEditor } from './components/QueryEditor';
55
import { QueryHelper } from './components/QueryHelper';
6-
import { VariableQueryEditor } from './components/VariableQueryEditor';
76
import { MongoQuery, MongoDataSourceOptions } from './types';
87

9-
export const plugin = new DataSourcePlugin<DataSource, MongoQuery, MongoDataSourceOptions>(DataSource)
8+
export const plugin = new DataSourcePlugin<MongoDBDataSource, MongoQuery, MongoDataSourceOptions>(MongoDBDataSource)
109
.setConfigEditor(ConfigEditor)
1110
.setQueryEditor(QueryEditor)
1211
.setQueryEditorHelp(QueryHelper)
13-
.setVariableQueryEditor(VariableQueryEditor);

src/variables.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { CustomVariableSupport, DataQueryRequest, DataQueryResponse, QueryEditorProps, StandardVariableQuery, StandardVariableSupport } from '@grafana/data';
2+
import { getTemplateSrv, TemplateSrv } from '@grafana/runtime';
3+
import { MongoDBDataSource } from 'datasource';
4+
import { Observable } from 'rxjs';
5+
import { VariableQueryEditor } from './components/VariableQueryEditor';
6+
7+
8+
export class MongoDBVariableSupport extends CustomVariableSupport<MongoDBDataSource> {
9+
constructor(
10+
private readonly datasource: MongoDBDataSource,
11+
private readonly templateSrv: TemplateSrv = getTemplateSrv()
12+
) {
13+
super();
14+
}
15+
query(request: DataQueryRequest<any>): Observable<DataQueryResponse> {
16+
throw new Error('Method not implemented.');
17+
}
18+
19+
editor = VariableQueryEditor
20+
}

0 commit comments

Comments
 (0)