mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
* pushed to get help of a genius * fix: error response is not json * feat: make request on click * refactor: remove print statement * refactor: remove unnecessary code * feat: convert grafana variables to value for API request * use the parser to interpolate and recover the original query (#64591) * Prettify query: use the parser to interpolate and recover the original query * Fix typo Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * Fix typo Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * fix: reverse transformation not working --------- Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Co-authored-by: Gareth Dawson <gwdawson.work@gmail.com> * fix: bugs created from merge * refactor: move prettify code out of monaco editor * fix: variables with the same value get converted back to the incorect variable * refactor * use consistent styling with bigquery * fix: only allow text/plain and application/json * fix: only make the request if the query is valid * endpoint now returns application/json * prettify from js * WIP: not all cases are handles, code still needs cleaning up * WIP * large refactor, finished support for all pipeline expressions * add tests for all format functions * idk why these files changed * add support for range aggregation expr & refactor * add support for vector aggregation expressions * add support for bin op expression * add support for literal and vector expressions * add tests and fix some bugs * add support for distinct and decolorize * feat: update variable replace and return * fix: lezer throws an errow when using a range variable * remove api implementation * remove api implementation * remove type assertions * add feature flag * update naming * fix: bug incorrectly formatting unwrap with labelfilter * support label replace expr * remove duplicate code (after migration) * add more tests * validate query before formatting * move tests to lezer repo * add feature tracking * populate feature tracking with some data * upgrade lezer version to 0.1.7 * bump lezer to 0.1.8 * add tests --------- Co-authored-by: Matias Chomicki <matyax@gmail.com> Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>
95 lines
2.6 KiB
TypeScript
95 lines
2.6 KiB
TypeScript
import React, { ReactNode } from 'react';
|
|
|
|
import { QueryEditorProps } from '@grafana/data';
|
|
|
|
import { LokiDatasource } from '../datasource';
|
|
import { shouldRefreshLabels } from '../languageUtils';
|
|
import { LokiQuery, LokiOptions } from '../types';
|
|
|
|
import { MonacoQueryFieldWrapper } from './monaco-query-field/MonacoQueryFieldWrapper';
|
|
|
|
export interface LokiQueryFieldProps extends QueryEditorProps<LokiDatasource, LokiQuery, LokiOptions> {
|
|
ExtraFieldElement?: ReactNode;
|
|
placeholder?: string;
|
|
'data-testid'?: string;
|
|
onQueryType?: (query: string) => void;
|
|
}
|
|
|
|
interface LokiQueryFieldState {
|
|
labelsLoaded: boolean;
|
|
}
|
|
|
|
export class LokiQueryField extends React.PureComponent<LokiQueryFieldProps, LokiQueryFieldState> {
|
|
_isMounted = false;
|
|
|
|
constructor(props: LokiQueryFieldProps) {
|
|
super(props);
|
|
|
|
this.state = { labelsLoaded: false };
|
|
}
|
|
|
|
async componentDidMount() {
|
|
this._isMounted = true;
|
|
await this.props.datasource.languageProvider.start();
|
|
if (this._isMounted) {
|
|
this.setState({ labelsLoaded: true });
|
|
}
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this._isMounted = false;
|
|
}
|
|
|
|
componentDidUpdate(prevProps: LokiQueryFieldProps) {
|
|
const {
|
|
range,
|
|
datasource: { languageProvider },
|
|
} = this.props;
|
|
const refreshLabels = shouldRefreshLabels(range, prevProps.range);
|
|
// We want to refresh labels when range changes (we round up intervals to a minute)
|
|
if (refreshLabels) {
|
|
languageProvider.fetchLabels();
|
|
}
|
|
}
|
|
|
|
onChangeQuery = (value: string, override?: boolean) => {
|
|
// Send text change to parent
|
|
const { query, onChange, onRunQuery } = this.props;
|
|
if (onChange) {
|
|
const nextQuery = { ...query, expr: value };
|
|
onChange(nextQuery);
|
|
|
|
if (override && onRunQuery) {
|
|
onRunQuery();
|
|
}
|
|
}
|
|
};
|
|
|
|
render() {
|
|
const { ExtraFieldElement, query, datasource, history, onRunQuery, onQueryType } = this.props;
|
|
const placeholder = this.props.placeholder ?? 'Enter a Loki query (run with Shift+Enter)';
|
|
|
|
return (
|
|
<>
|
|
<div
|
|
className="gf-form-inline gf-form-inline--xs-view-flex-column flex-grow-1"
|
|
data-testid={this.props['data-testid']}
|
|
>
|
|
<div className="gf-form--grow flex-shrink-1 min-width-15">
|
|
<MonacoQueryFieldWrapper
|
|
datasource={datasource}
|
|
history={history ?? []}
|
|
onChange={this.onChangeQuery}
|
|
onRunQuery={onRunQuery}
|
|
initialValue={query.expr ?? ''}
|
|
placeholder={placeholder}
|
|
onQueryType={onQueryType}
|
|
/>
|
|
</div>
|
|
</div>
|
|
{ExtraFieldElement}
|
|
</>
|
|
);
|
|
}
|
|
}
|