import { trim } from 'lodash'; import React, { useMemo, useState } from 'react'; import { CoreApp, isValidDuration, isValidGrafanaDuration, SelectableValue } from '@grafana/data'; import { EditorField, EditorRow } from '@grafana/experimental'; import { config, reportInteraction } from '@grafana/runtime'; import { Alert, 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 { getLokiQueryType, isLogsQuery } from '../../queryUtils'; import { LokiQuery, LokiQueryType, QueryStats } from '../../types'; export interface Props { query: LokiQuery; onChange: (update: LokiQuery) => void; onRunQuery: () => void; maxLines: number; app?: CoreApp; queryStats: QueryStats | null; } export const LokiQueryBuilderOptions = React.memo( ({ app, query, onChange, onRunQuery, maxLines, queryStats }) => { const [splitDurationValid, setSplitDurationValid] = 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)) { setSplitDurationValid(false); return; } setSplitDurationValid(true); onChange({ ...query, splitDuration: 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(); } } function onStepChange(e: React.SyntheticEvent) { onChange({ ...query, step: trim(e.currentTarget.value) }); onRunQuery(); } const queryType = getLokiQueryType(query); const isLogQuery = isLogsQuery(query.expr); const isValidStep = useMemo(() => { if (!query.step || isValidGrafanaDuration(query.step) || !isNaN(Number(query.step))) { return true; } return false; }, [query.step]); return ( {isLogQuery && ( )} {!isLogQuery && ( <> {query.resolution !== undefined && query.resolution > 1 && ( <>