mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Loki: Allow setting of timeRange when using languageProvider functions * Loki: Use timerange where available for start * Loki: Use timerange where available for fetchLabels * Loki: Use timerange where available for fetchSeriesLabels * Loki: Use timerange where available for fetchLabelValues * Loki: Use timerange where available for getParserAndLabelKeys * Loki: Update and add tests for fetchLabels * Loki: Update and add tests for fetchSeriesLabels * Loki: Update and add tests for fetchSeries * Loki: Update and add tests for fetchLabelValues * Loki: Update and add tests for fetchLabelValues * Loki: Update and add tests for getParserAndLabelKeys * Update public/app/plugins/datasource/loki/LanguageProvider.test.ts Co-authored-by: Matias Chomicki <matyax@gmail.com> * Update public/app/plugins/datasource/loki/LanguageProvider.test.ts Co-authored-by: Matias Chomicki <matyax@gmail.com> * Not needing to use languageProvider.getDefaultTime in Monaco * Update comment * Update getDefaultTimeRange to be ptivate --------- Co-authored-by: Matias Chomicki <matyax@gmail.com>
94 lines
2.6 KiB
TypeScript
94 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;
|
|
}
|
|
|
|
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(this.props.range);
|
|
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({ timeRange: range });
|
|
}
|
|
}
|
|
|
|
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, range } = 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}
|
|
timeRange={range}
|
|
/>
|
|
</div>
|
|
</div>
|
|
{ExtraFieldElement}
|
|
</>
|
|
);
|
|
}
|
|
}
|