import { SelectableValue } from '@grafana/data'; import { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui'; import React, { useEffect, useState } from 'react'; import { JaegerDatasource } from '../datasource'; import { JaegerQuery } from '../types'; import { transformToLogfmt } from '../util'; import { AdvancedOptions } from './AdvancedOptions'; type Props = { datasource: JaegerDatasource; query: JaegerQuery; onChange: (value: JaegerQuery) => void; }; export const ALL_OPERATIONS_KEY = 'All'; const allOperationsOption: SelectableValue = { label: ALL_OPERATIONS_KEY, value: undefined, }; export function SearchForm({ datasource, query, onChange }: Props) { const [serviceOptions, setServiceOptions] = useState>>(); const [operationOptions, setOperationOptions] = useState>>(); useEffect(() => { const getServices = async () => { const services = await loadServices({ dataSource: datasource, url: '/api/services', notFoundLabel: 'No service found', }); setServiceOptions(services); }; getServices(); }, [datasource]); useEffect(() => { const getOperations = async () => { const operations = await loadServices({ dataSource: datasource, url: `/api/services/${encodeURIComponent(query.service!)}/operations`, notFoundLabel: 'No operation found', }); setOperationOptions([allOperationsOption, ...operations]); }; if (query.service) { getOperations(); } }, [datasource, query.service]); return ( <> v.value === query.operation) || null} onChange={(v) => onChange({ ...query, operation: v.value!, }) } menuPlacement="bottom" /> onChange({ ...query, tags: v.currentTarget.value, }) } /> ); } type Options = { dataSource: JaegerDatasource; url: string; notFoundLabel: string }; const loadServices = async ({ dataSource, url, notFoundLabel }: Options): Promise>> => { const services: string[] | null = await dataSource.metadataRequest(url); if (!services) { return [{ label: notFoundLabel, value: notFoundLabel }]; } const serviceOptions: SelectableValue[] = services.sort().map((service) => ({ label: service, value: service, })); return serviceOptions; };