| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- import _ from 'lodash';
- import React, { PureComponent } from 'react';
- // Types
- import { FormLabel, Select, Switch, QueryEditorProps, DataSourceStatus } from '@grafana/ui';
- import { SelectableValue } from '@grafana/data';
- import { PrometheusDatasource } from '../datasource';
- import { PromQuery, PromOptions } from '../types';
- import PromQueryField from './PromQueryField';
- import PromLink from './PromLink';
- export type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions>;
- const FORMAT_OPTIONS: Array<SelectableValue<string>> = [
- { label: 'Time series', value: 'time_series' },
- { label: 'Table', value: 'table' },
- { label: 'Heatmap', value: 'heatmap' },
- ];
- const INTERVAL_FACTOR_OPTIONS: Array<SelectableValue<number>> = _.map([1, 2, 3, 4, 5, 10], (value: number) => ({
- value,
- label: '1/' + value,
- }));
- interface State {
- legendFormat: string;
- formatOption: SelectableValue<string>;
- interval: string;
- intervalFactorOption: SelectableValue<number>;
- instant: boolean;
- }
- export class PromQueryEditor extends PureComponent<Props, State> {
- // Query target to be modified and used for queries
- query: PromQuery;
- constructor(props: Props) {
- super(props);
- const { query } = props;
- this.query = query;
- // Query target properties that are fully controlled inputs
- this.state = {
- // Fully controlled text inputs
- interval: query.interval,
- legendFormat: query.legendFormat,
- // Select options
- formatOption: FORMAT_OPTIONS.find(option => option.value === query.format) || FORMAT_OPTIONS[0],
- intervalFactorOption:
- INTERVAL_FACTOR_OPTIONS.find(option => option.value === query.intervalFactor) || INTERVAL_FACTOR_OPTIONS[0],
- // Switch options
- instant: Boolean(query.instant),
- };
- }
- onFieldChange = (query: PromQuery, override?: any) => {
- this.query.expr = query.expr;
- };
- onFormatChange = (option: SelectableValue<string>) => {
- this.query.format = option.value;
- this.setState({ formatOption: option }, this.onRunQuery);
- };
- onInstantChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- const instant = e.target.checked;
- this.query.instant = instant;
- this.setState({ instant }, this.onRunQuery);
- };
- onIntervalChange = (e: React.SyntheticEvent<HTMLInputElement>) => {
- const interval = e.currentTarget.value;
- this.query.interval = interval;
- this.setState({ interval });
- };
- onIntervalFactorChange = (option: SelectableValue<number>) => {
- this.query.intervalFactor = option.value;
- this.setState({ intervalFactorOption: option }, this.onRunQuery);
- };
- onLegendChange = (e: React.SyntheticEvent<HTMLInputElement>) => {
- const legendFormat = e.currentTarget.value;
- this.query.legendFormat = legendFormat;
- this.setState({ legendFormat });
- };
- onRunQuery = () => {
- const { query } = this;
- this.props.onChange(query);
- this.props.onRunQuery();
- };
- render() {
- const { datasource, query, panelData, queryResponse } = this.props;
- const { formatOption, instant, interval, intervalFactorOption, legendFormat } = this.state;
- return (
- <div>
- <PromQueryField
- datasource={datasource}
- query={query}
- onRunQuery={this.onRunQuery}
- onChange={this.onFieldChange}
- history={[]}
- panelData={panelData}
- queryResponse={queryResponse}
- datasourceStatus={DataSourceStatus.Connected} // TODO: replace with real DataSourceStatus
- />
- <div className="gf-form-inline">
- <div className="gf-form">
- <FormLabel
- width={7}
- tooltip="Controls the name of the time series, using name or pattern. For example
- {{hostname}} will be replaced with label value for the label hostname."
- >
- Legend
- </FormLabel>
- <input
- type="text"
- className="gf-form-input"
- placeholder="legend format"
- value={legendFormat}
- onChange={this.onLegendChange}
- onBlur={this.onRunQuery}
- />
- </div>
- <div className="gf-form">
- <FormLabel
- width={7}
- tooltip="Leave blank for auto handling based on time range and panel width.
- Note that the actual dates used in the query will be adjusted
- to a multiple of the interval step."
- >
- Min step
- </FormLabel>
- <input
- type="text"
- className="gf-form-input width-8"
- placeholder={interval}
- onChange={this.onIntervalChange}
- onBlur={this.onRunQuery}
- value={interval}
- />
- </div>
- <div className="gf-form">
- <div className="gf-form-label">Resolution</div>
- <Select
- isSearchable={false}
- options={INTERVAL_FACTOR_OPTIONS}
- onChange={this.onIntervalFactorChange}
- value={intervalFactorOption}
- />
- </div>
- <div className="gf-form">
- <div className="gf-form-label">Format</div>
- <Select isSearchable={false} options={FORMAT_OPTIONS} onChange={this.onFormatChange} value={formatOption} />
- <Switch label="Instant" checked={instant} onChange={this.onInstantChange} />
- <FormLabel width={10} tooltip="Link to Graph in Prometheus">
- <PromLink
- datasource={datasource}
- query={this.query} // Use modified query
- panelData={panelData}
- />
- </FormLabel>
- </div>
- </div>
- </div>
- );
- }
- }
|