mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Expression: Filter query, mixed mode fixes and panel error message (#50218)
* implement filterQuery to support query.hide * Fixed - expression ds name in mixed mode * Execute expression query on blur * show actual error message when ds return Query data error
This commit is contained in:
@@ -14,6 +14,8 @@ import { ActionMeta, HorizontalGroup, PluginSignatureBadge, Select } from '@graf
|
|||||||
|
|
||||||
import { getDataSourceSrv } from '../services/dataSourceSrv';
|
import { getDataSourceSrv } from '../services/dataSourceSrv';
|
||||||
|
|
||||||
|
import { ExpressionDatasourceRef } from './../utils/DataSourceWithBackend';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component props description for the {@link DataSourcePicker}
|
* Component props description for the {@link DataSourcePicker}
|
||||||
*
|
*
|
||||||
@@ -117,6 +119,11 @@ export class DataSourcePicker extends PureComponent<DataSourcePickerProps, DataS
|
|||||||
}
|
}
|
||||||
|
|
||||||
const uid = getDataSourceUID(current);
|
const uid = getDataSourceUID(current);
|
||||||
|
|
||||||
|
if (uid === ExpressionDatasourceRef.uid || uid === ExpressionDatasourceRef.name) {
|
||||||
|
return { label: uid, value: uid, hideText: hideTextValue };
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: (uid ?? 'no name') + ' - not found',
|
label: (uid ?? 'no name') + ' - not found',
|
||||||
value: uid ?? undefined,
|
value: uid ?? undefined,
|
||||||
|
@@ -17,8 +17,10 @@ export function toDataQueryError(err: DataQueryError | string | Object): DataQue
|
|||||||
let message = 'Query error';
|
let message = 'Query error';
|
||||||
if (error.message) {
|
if (error.message) {
|
||||||
message = error.message;
|
message = error.message;
|
||||||
} else if (error.data && error.data.message) {
|
} else if (error.data && error.data.message && error.data?.message !== 'Query data error') {
|
||||||
message = error.data.message;
|
message = error.data.message;
|
||||||
|
} else if (error?.data?.message === 'Query data error' && error?.data?.error) {
|
||||||
|
message = error.data.error;
|
||||||
} else if (error.data && error.data.error) {
|
} else if (error.data && error.data.error) {
|
||||||
message = error.data.error;
|
message = error.data.error;
|
||||||
} else if (error.status) {
|
} else if (error.status) {
|
||||||
|
@@ -35,6 +35,13 @@ export class ExpressionDatasourceApi extends DataSourceWithBackend<ExpressionQue
|
|||||||
return `Expression: ${query.type}`;
|
return `Expression: ${query.type}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filterQuery(query: ExpressionQuery) {
|
||||||
|
if (query.hide) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
query(request: DataQueryRequest<ExpressionQuery>): Observable<DataQueryResponse> {
|
query(request: DataQueryRequest<ExpressionQuery>): Observable<DataQueryResponse> {
|
||||||
let targets = request.targets.map(async (query: ExpressionQuery): Promise<ExpressionQuery> => {
|
let targets = request.targets.map(async (query: ExpressionQuery): Promise<ExpressionQuery> => {
|
||||||
const ds = await getDataSourceSrv().get(query.datasource);
|
const ds = await getDataSourceSrv().get(query.datasource);
|
||||||
|
@@ -21,12 +21,12 @@ export class ExpressionQueryEditor extends PureComponent<Props> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
renderExpressionType() {
|
renderExpressionType() {
|
||||||
const { onChange, query, queries } = this.props;
|
const { onChange, onRunQuery, query, queries } = this.props;
|
||||||
const refIds = queries!.filter((q) => query.refId !== q.refId).map((q) => ({ value: q.refId, label: q.refId }));
|
const refIds = queries!.filter((q) => query.refId !== q.refId).map((q) => ({ value: q.refId, label: q.refId }));
|
||||||
|
|
||||||
switch (query.type) {
|
switch (query.type) {
|
||||||
case ExpressionQueryType.math:
|
case ExpressionQueryType.math:
|
||||||
return <Math onChange={onChange} query={query} labelWidth={labelWidth} />;
|
return <Math onChange={onChange} query={query} labelWidth={labelWidth} onRunQuery={onRunQuery} />;
|
||||||
|
|
||||||
case ExpressionQueryType.reduce:
|
case ExpressionQueryType.reduce:
|
||||||
return <Reduce refIds={refIds} onChange={onChange} labelWidth={labelWidth} query={query} />;
|
return <Reduce refIds={refIds} onChange={onChange} labelWidth={labelWidth} query={query} />;
|
||||||
|
@@ -12,14 +12,15 @@ interface Props {
|
|||||||
labelWidth: number;
|
labelWidth: number;
|
||||||
query: ExpressionQuery;
|
query: ExpressionQuery;
|
||||||
onChange: (query: ExpressionQuery) => void;
|
onChange: (query: ExpressionQuery) => void;
|
||||||
|
onRunQuery: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
const mathPlaceholder =
|
const mathPlaceholder =
|
||||||
'Math operations on one or more queries. You reference the query by ${refId} ie. $A, $B, $C etc\n' +
|
'Math operations on one or more queries. You reference the query by ${refId} ie. $A, $B, $C etc\n' +
|
||||||
'The sum of two scalar values: $A + $B > 10';
|
'The sum of two scalar values: $A + $B > 10';
|
||||||
|
|
||||||
export const Math: FC<Props> = ({ labelWidth, onChange, query }) => {
|
export const Math: FC<Props> = ({ labelWidth, onChange, query, onRunQuery }) => {
|
||||||
const [showHelp, toggleShowHelp] = useToggle(true);
|
const [showHelp, toggleShowHelp] = useToggle(false);
|
||||||
|
|
||||||
const onExpressionChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
|
const onExpressionChange = (event: ChangeEvent<HTMLTextAreaElement>) => {
|
||||||
onChange({ ...query, expression: event.target.value });
|
onChange({ ...query, expression: event.target.value });
|
||||||
@@ -27,6 +28,12 @@ export const Math: FC<Props> = ({ labelWidth, onChange, query }) => {
|
|||||||
|
|
||||||
const styles = useStyles2((theme) => getStyles(theme, showHelp));
|
const styles = useStyles2((theme) => getStyles(theme, showHelp));
|
||||||
|
|
||||||
|
const executeQuery = () => {
|
||||||
|
if (query.expression) {
|
||||||
|
onRunQuery();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Stack direction="row">
|
<Stack direction="row">
|
||||||
<InlineField
|
<InlineField
|
||||||
@@ -40,7 +47,13 @@ export const Math: FC<Props> = ({ labelWidth, onChange, query }) => {
|
|||||||
`}
|
`}
|
||||||
>
|
>
|
||||||
<>
|
<>
|
||||||
<TextArea value={query.expression} onChange={onExpressionChange} rows={5} placeholder={mathPlaceholder} />
|
<TextArea
|
||||||
|
value={query.expression}
|
||||||
|
onChange={onExpressionChange}
|
||||||
|
rows={5}
|
||||||
|
placeholder={mathPlaceholder}
|
||||||
|
onBlur={executeQuery}
|
||||||
|
/>
|
||||||
<Button variant="secondary" size="sm" onClick={toggleShowHelp}>
|
<Button variant="secondary" size="sm" onClick={toggleShowHelp}>
|
||||||
{showHelp === false ? 'Show' : 'Hide'} help
|
{showHelp === false ? 'Show' : 'Hide'} help
|
||||||
</Button>
|
</Button>
|
||||||
|
Reference in New Issue
Block a user