Skip to content

Commit c926cd6

Browse files
committed
Use defaults for all properties
1 parent 7a2d887 commit c926cd6

File tree

4 files changed

+27
-34
lines changed

4 files changed

+27
-34
lines changed

src/components/QueryEditor.tsx

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,27 @@ import {
1313
InfoBox,
1414
} from '@grafana/ui';
1515
import { SelectableValue, FieldType, QueryEditorProps } from '@grafana/data';
16-
import { JsonApiQuery, defaultQuery, JsonApiDataSourceOptions } from '../types';
16+
import { JsonApiQuery, JsonApiDataSourceOptions, defaultQuery } from '../types';
1717
import { JsonPathQueryField } from './JsonPathQueryField';
1818
import { KeyValueEditor } from './KeyValueEditor';
1919
import AutoSizer from 'react-virtualized-auto-sizer';
2020
import { css } from 'emotion';
2121
import { Pair } from '../types';
2222
import { JsonDataSource } from 'datasource';
2323

24+
// Display a warning message when user adds any of the following headers.
25+
const sensitiveHeaders = ['authorization', 'proxy-authorization', 'x-api-key'];
26+
2427
interface Props extends QueryEditorProps<JsonDataSource, JsonApiQuery, JsonApiDataSourceOptions> {
2528
limitFields?: number;
2629
}
2730

28-
export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limitFields, datasource, range }) => {
31+
export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, limitFields, datasource, range, ...props }) => {
2932
const [bodyType, setBodyType] = useState('plaintext');
3033
const [tabIndex, setTabIndex] = useState(0);
3134
const theme = useTheme();
3235

33-
const { fields } = defaults(query, { ...defaultQuery, fields: [{ name: '', jsonPath: '' }] }) as JsonApiQuery;
34-
35-
// Display a warning message when user adds any of the following headers.
36-
const sensitiveHeaders = ['authorization', 'proxy-authorization', 'x-api-key'];
37-
38-
const params: Array<Pair<string, string>> = query.params ?? [];
39-
40-
// Backwards-compatibility with old queryString property.
41-
if (!query.params) {
42-
new URLSearchParams('?' + query.queryParams).forEach((value: string, key: string) => {
43-
params.push([key, value]);
44-
});
45-
}
36+
const query = defaults(props.query, defaultQuery);
4637

4738
const onMethodChange = (method: string) => {
4839
onChange({ ...query, method });
@@ -56,20 +47,25 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
5647

5748
const onParamsChange = (params: Array<Pair<string, string>>) => {
5849
onChange({ ...query, params });
50+
onRunQuery();
5951
};
6052

6153
const onHeadersChange = (headers: Array<Pair<string, string>>) => {
6254
onChange({ ...query, headers });
55+
onRunQuery();
6356
};
6457

6558
const onChangePath = (i: number) => (e: string) => {
59+
const { fields } = query;
6660
onChange({
6761
...query,
6862
fields: fields.map((field, n) => (i === n ? { ...fields[i], jsonPath: e } : field)),
6963
});
64+
onRunQuery();
7065
};
7166

7267
const onChangeType = (i: number) => (e: SelectableValue<string>) => {
68+
const { fields } = query;
7369
onChange({
7470
...query,
7571
fields: fields.map((field, n) =>
@@ -80,15 +76,18 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
8076
};
8177

8278
const addField = (i: number) => () => {
79+
const { fields } = query;
8380
if (!limitFields || fields.length < limitFields) {
8481
onChange({
8582
...query,
8683
fields: [...fields.slice(0, i + 1), { name: '', jsonPath: '' }, ...fields.slice(i + 1)],
8784
});
85+
onRunQuery();
8886
}
8987
};
9088

9189
const removeField = (i: number) => () => {
90+
const { fields } = query;
9291
onChange({
9392
...query,
9493
fields: [...fields.slice(0, i), ...fields.slice(i + 1)],
@@ -99,8 +98,8 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
9998
const tabs = [
10099
{
101100
title: 'Fields',
102-
content: fields
103-
? fields.map((field, index) => (
101+
content: query.fields
102+
? query.fields.map((field, index) => (
104103
<InlineFieldRow key={index}>
105104
<InlineField
106105
label="Field"
@@ -137,13 +136,13 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
137136
/>
138137
</InlineField>
139138

140-
{(!limitFields || fields.length < limitFields) && (
139+
{(!limitFields || query.fields.length < limitFields) && (
141140
<a className="gf-form-label" onClick={addField(index)}>
142141
<Icon name="plus" />
143142
</a>
144143
)}
145144

146-
{fields.length > 1 ? (
145+
{query.fields.length > 1 ? (
147146
<a className="gf-form-label" onClick={removeField(index)}>
148147
<Icon name="minus" />
149148
</a>
@@ -182,7 +181,7 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
182181
<KeyValueEditor
183182
addRowLabel={'Add param'}
184183
columns={['Key', 'Value']}
185-
values={params ?? []}
184+
values={query.params ?? []}
186185
onChange={onParamsChange}
187186
onBlur={() => onRunQuery()}
188187
/>
@@ -287,9 +286,7 @@ export const QueryEditor: React.FC<Props> = ({ onRunQuery, onChange, query, limi
287286
);
288287
};
289288

290-
const defaultCacheDuration = 300;
291-
292-
export const formatCacheTimeLabel = (s: number = defaultCacheDuration) => {
289+
export const formatCacheTimeLabel = (s: number) => {
293290
if (s < 60) {
294291
return s + 's';
295292
} else if (s < 3600) {
Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { TimeRange } from '@grafana/data';
22
import { JsonDataSource } from 'datasource';
3-
import React, { useState } from 'react';
3+
import React from 'react';
44
import { JsonApiQuery } from '../types';
55
import { QueryEditor } from './QueryEditor';
66

@@ -15,16 +15,11 @@ interface VariableQueryProps {
1515
export const VariableQueryEditor: React.FC<VariableQueryProps> = (props) => {
1616
const { query, onChange } = props;
1717

18-
// Backwards compatibility with previous query editor for variables.
19-
const compatQuery = query.jsonPath ? { ...query, fields: [{ jsonPath: query.jsonPath }] } : query;
20-
21-
const [state, setState] = useState<JsonApiQuery>(compatQuery);
22-
23-
const saveQuery = () => {
24-
if (state && state.fields[0].jsonPath) {
25-
onChange(state, state.fields[0].jsonPath);
18+
const saveQuery = (newQuery: JsonApiQuery) => {
19+
if (newQuery) {
20+
onChange(newQuery, newQuery.fields[0].jsonPath);
2621
}
2722
};
2823

29-
return <QueryEditor {...props} onRunQuery={saveQuery} onChange={setState} query={state} limitFields={1} />;
24+
return <QueryEditor {...props} onRunQuery={() => {}} onChange={saveQuery} query={query} limitFields={1} />;
3025
};

src/datasource.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export class JsonDataSource extends DataSourceApi<JsonApiQuery, JsonApiDataSourc
5454
*/
5555
async metricFindQuery?(query: JsonApiQuery): Promise<MetricFindValue[]> {
5656
const frame = await this.doRequest(query);
57-
return frame.fields[0].values.toArray().map((_) => ({ text: _ }));
57+
return frame.fields.length > 0 ? frame.fields[0].values.toArray().map((_) => ({ text: _ })) : [];
5858
}
5959

6060
/**

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export const defaultQuery: Partial<JsonApiQuery> = {
2727
method: 'GET',
2828
queryParams: '',
2929
urlPath: '',
30+
fields: [{ jsonPath: '' }],
3031
};
3132

3233
export interface JsonApiDataSourceOptions extends DataSourceJsonData {

0 commit comments

Comments
 (0)