Skip to content

Commit 629ca4f

Browse files
committed
json query
1 parent f69259a commit 629ca4f

File tree

2 files changed

+53
-19
lines changed

2 files changed

+53
-19
lines changed

src/buttonPanel.tsx

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,62 @@
1-
import { PanelProps } from '@grafana/data';
1+
import { AppEvents, PanelProps } from '@grafana/data';
2+
import { getBackendSrv, getDataSourceSrv, SystemJS } from '@grafana/runtime';
23
import { Button, HorizontalGroup, VerticalGroup } from '@grafana/ui';
34
import React from 'react';
45
import { ButtonOptions, Options } from 'types';
56

67
interface Props extends PanelProps<Options> {}
78

8-
const Buttons: React.FC<Options> = ({ buttons }) => {
9-
return (
10-
<React.Fragment>
11-
{buttons.map((b: ButtonOptions, index: number) => (
12-
<Button key={index} variant={b.variant}>
13-
{b.text || 'Button'}
14-
</Button>
15-
))}
16-
</React.Fragment>
17-
);
18-
};
19-
209
export const ButtonPanel: React.FC<Props> = ({ options }) => {
10+
const renderButtons = (buttons: ButtonOptions[]) => {
11+
return buttons.map((b: ButtonOptions, index: number) => (
12+
<Button
13+
key={index}
14+
variant={b.variant}
15+
onClick={async () => {
16+
const payload = JSON.parse(b.query || '');
17+
const ds = await getDataSourceSrv().get(b.datasource);
18+
try {
19+
const resp = await getBackendSrv().datasourceRequest({
20+
method: 'POST',
21+
url: 'api/tsdb/query',
22+
data: {
23+
queries: [
24+
{
25+
datasourceId: ds.id,
26+
refId: '1',
27+
...payload,
28+
},
29+
],
30+
},
31+
});
32+
SystemJS.load('app/core/app_events').then((appEvents: any) => {
33+
appEvents.emit(AppEvents.alertSuccess, [
34+
b.text + ': ' + resp.status + ' (' + resp.statusText + ')',
35+
]);
36+
});
37+
} catch (error) {
38+
SystemJS.load('app/core/app_events').then((appEvents: any) => {
39+
appEvents.emit(AppEvents.alertError, [
40+
b.text + ': ' + error.status + ' (' + error.statusText + ')',
41+
error.data.message,
42+
]);
43+
});
44+
}
45+
}}
46+
>
47+
{b.text || 'Button'}
48+
</Button>
49+
));
50+
};
51+
2152
return (
2253
(options.orientation === 'vertical' && (
2354
<VerticalGroup justify="center" align="center">
24-
<Buttons {...options} />
55+
{renderButtons(options.buttons)}
2556
</VerticalGroup>
2657
)) || (
2758
<HorizontalGroup justify="center" align="center">
28-
<Buttons {...options} />
59+
{renderButtons(options.buttons)}
2960
</HorizontalGroup>
3061
)
3162
);

src/editor.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
Input,
88
RadioButtonGroup,
99
Select,
10+
TextArea,
1011
} from '@grafana/ui';
1112
import React from 'react';
1213
import { ButtonOptions, Options } from 'types';
@@ -77,18 +78,20 @@ const Editor: React.FC<EditorProps> = ({ buttons, onChange }) => {
7778
onChange={(e: SelectableValue<string>) =>
7879
updateButtons(i, { datasource: e.value })
7980
}
81+
value={b.datasource}
8082
options={elems}
8183
/>
8284
</Field>
8385
<Field
8486
label="Query"
85-
description="Query to be triggered on Button Click"
87+
description="JSON query to be triggered on Button Click"
8688
>
87-
<Input
89+
<TextArea
8890
id={'q-' + i.toString()}
8991
value={b.query}
90-
placeholder="Query"
91-
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
92+
placeholder="{ query: 'your query' }"
93+
rows={5}
94+
onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) =>
9295
updateButtons(i, { query: e.target.value })
9396
}
9497
/>

0 commit comments

Comments
 (0)