import React, { useState } from 'react'; import { CoreApp, isValidDuration, SelectableValue } from '@grafana/data'; import { EditorField, EditorRow } from '@grafana/experimental'; import { config, reportInteraction } from '@grafana/runtime'; import { AutoSizeInput, RadioButtonGroup, Select } from '@grafana/ui'; import { QueryOptionGroup } from 'app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup'; import { preprocessMaxLines, queryTypeOptions, RESOLUTION_OPTIONS } from '../../components/LokiOptionFields'; import { LokiDatasource } from '../../datasource'; import { isLogsQuery } from '../../queryUtils'; import { LokiQuery, LokiQueryType, QueryStats } from '../../types'; export interface Props { query: LokiQuery; onChange: (update: LokiQuery) => void; onRunQuery: () => void; maxLines: number; app?: CoreApp; datasource: LokiDatasource; queryStats: QueryStats | undefined; } export const LokiQueryBuilderOptions = React.memo( ({ app, query, onChange, onRunQuery, maxLines, datasource, queryStats }) => { const [chunkRangeValid, setChunkRangeValid] = useState(true); const onQueryTypeChange = (value: LokiQueryType) => { onChange({ ...query, queryType: value }); onRunQuery(); }; const onResolutionChange = (option: SelectableValue) => { reportInteraction('grafana_loki_resolution_clicked', { app, resolution: option.value, }); onChange({ ...query, resolution: option.value }); onRunQuery(); }; const onChunkRangeChange = (evt: React.FormEvent) => { const value = evt.currentTarget.value; if (!isValidDuration(value)) { setChunkRangeValid(false); return; } setChunkRangeValid(true); onChange({ ...query, chunkDuration: value }); onRunQuery(); }; const onLegendFormatChanged = (evt: React.FormEvent) => { onChange({ ...query, legendFormat: evt.currentTarget.value }); onRunQuery(); }; function onMaxLinesChange(e: React.SyntheticEvent) { const newMaxLines = preprocessMaxLines(e.currentTarget.value); if (query.maxLines !== newMaxLines) { onChange({ ...query, maxLines: newMaxLines }); onRunQuery(); } } let queryType = query.queryType ?? (query.instant ? LokiQueryType.Instant : LokiQueryType.Range); let showMaxLines = isLogsQuery(query.expr); return ( {showMaxLines && ( )}