{"version":3,"file":"VariableQueryEditor.cjs","sources":["../../../src/components/VariableQueryEditor.tsx"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx\nimport debounce from 'debounce-promise';\nimport { type FormEvent, useCallback, useEffect, useState } from 'react';\n\nimport { getDefaultTimeRange, type QueryEditorProps, type SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t, Trans } from '@grafana/i18n';\nimport { AsyncSelect, InlineField, InlineFieldRow, Input, Select, TextArea } from '@grafana/ui';\n\nimport { type PrometheusDatasource } from '../datasource';\nimport { truncateResult } from '../language_utils';\nimport {\n  migrateVariableEditorBackToVariableSupport,\n  migrateVariableQueryToEditor,\n} from '../migrations/variableMigration';\nimport { MetricsLabelsSection } from '../querybuilder/components/MetricsLabelsSection';\nimport { promQueryModeller } from '../querybuilder/shared/modeller_instance';\nimport { type QueryBuilderLabelFilter } from '../querybuilder/shared/types';\nimport { type PromVisualQuery } from '../querybuilder/types';\nimport {\n  type PromOptions,\n  type PromQuery,\n  type PromVariableQuery,\n  PromVariableQueryType as QueryType,\n  type StandardPromVariableQuery,\n} from '../types';\n\nconst variableOptions = [\n  { label: 'Label names', value: QueryType.LabelNames },\n  { label: 'Label values', value: QueryType.LabelValues },\n  { label: 'Metrics', value: QueryType.MetricNames },\n  { label: 'Query result', value: QueryType.VarQueryResult },\n  { label: 'Series query', value: QueryType.SeriesQuery },\n  { label: 'Classic query', value: QueryType.ClassicQuery },\n];\n\nexport type Props = QueryEditorProps<PrometheusDatasource, PromQuery, PromOptions, PromVariableQuery>;\n\nconst refId = 'PrometheusVariableQueryEditor-VariableQuery';\n\nexport const PromVariableQueryEditor = ({ onChange, query, datasource, range }: Props) => {\n  // to select the query type, i.e. label_names, label_values, etc.\n  const [qryType, setQryType] = useState<number | undefined>(undefined);\n  // list of variables for each function\n  const [label, setLabel] = useState('');\n\n  const [labelNamesMatch, setLabelNamesMatch] = useState('');\n\n  // metric is used for both label_values() and metric()\n  // label_values() metric requires a whole/complete metric\n  // metric() is expected to be a part of a metric string\n  const [metric, setMetric] = useState('');\n  // varQuery is a whole query, can include math/rates/etc\n  const [varQuery, setVarQuery] = useState('');\n  // seriesQuery is only a whole\n  const [seriesQuery, setSeriesQuery] = useState('');\n\n  // the original variable query implementation, e.g. label_value(metric, label_name)\n  const [classicQuery, setClassicQuery] = useState('');\n\n  // list of label names for label_values(), /api/v1/labels, contains the same results as label_names() function\n  const [truncatedLabelOptions, setTruncatedLabelOptions] = useState<Array<SelectableValue<string>>>([]);\n  const [allLabelOptions, setAllLabelOptions] = useState<Array<SelectableValue<string>>>([]);\n\n  /**\n   * Set the both allLabels and truncatedLabels\n   *\n   * @param names\n   * @param variables\n   */\n  function setLabels(names: SelectableValue[], variables: SelectableValue[]) {\n    setAllLabelOptions([...variables, ...names]);\n    const truncatedNames = truncateResult(names);\n    setTruncatedLabelOptions([...variables, ...truncatedNames]);\n  }\n\n  // label filters have been added as a filter for metrics in label values query type\n  const [labelFilters, setLabelFilters] = useState<QueryBuilderLabelFilter[]>([]);\n\n  useEffect(() => {\n    if (!query) {\n      return;\n    }\n\n    if (query.qryType === QueryType.ClassicQuery) {\n      setQryType(query.qryType);\n      setClassicQuery(query.query ?? '');\n    } else {\n      // 1. Changing from standard to custom variable editor changes the string attr from expr to query\n      // 2. jsonnet grafana as code passes a variable as a string\n      const variableQuery = variableMigration(query);\n\n      setLabelNamesMatch(variableQuery.match ?? '');\n      setQryType(variableQuery.qryType);\n      setLabel(variableQuery.label ?? '');\n      setMetric(variableQuery.metric ?? '');\n      setLabelFilters(variableQuery.labelFilters ?? []);\n      setVarQuery(variableQuery.varQuery ?? '');\n      setSeriesQuery(variableQuery.seriesQuery ?? '');\n      setClassicQuery(variableQuery.classicQuery ?? '');\n    }\n  }, [query]);\n\n  // set the label names options for the label values var query\n  useEffect(() => {\n    if (qryType !== QueryType.LabelValues) {\n      return;\n    }\n    const variables = datasource.getVariables().map((variable: string) => ({ label: variable, value: variable }));\n    let timeRange = range;\n    if (!timeRange) {\n      timeRange = getDefaultTimeRange();\n    }\n\n    if (!metric) {\n      // get all the labels\n      datasource.getTagKeys({ timeRange, filters: [] }).then((labelNames: Array<{ text: string }>) => {\n        const names = labelNames.map(({ text }) => ({ label: text, value: text }));\n        setLabels(names, variables);\n      });\n    } else {\n      // fetch the labels filtered by the metric\n      // eslint-disable-next-line @grafana/i18n/no-untranslated-strings\n      const labelToConsider = [{ label: '__name__', op: '=', value: metric }];\n      const expr = promQueryModeller.renderLabels(labelToConsider);\n\n      datasource.languageProvider.queryLabelKeys(timeRange, expr).then((labelNames: string[]) => {\n        const names = labelNames.map((value) => ({ label: value, value: value }));\n        setLabels(names, variables);\n      });\n    }\n  }, [datasource, qryType, metric, range]);\n\n  const onChangeWithVariableString = (\n    updateVar: { [key: string]: QueryType | string },\n    updLabelFilters?: QueryBuilderLabelFilter[]\n  ) => {\n    const queryVar = {\n      qryType,\n      label,\n      metric,\n      match: labelNamesMatch,\n      varQuery,\n      seriesQuery,\n      classicQuery,\n      refId: 'PrometheusVariableQueryEditor-VariableQuery',\n    };\n\n    let updateLabelFilters = updLabelFilters ? { labelFilters: updLabelFilters } : { labelFilters: labelFilters };\n\n    const updatedVar = { ...queryVar, ...updateVar, ...updateLabelFilters };\n\n    const queryString = migrateVariableEditorBackToVariableSupport(updatedVar);\n\n    // setting query.query property allows for update of variable definition\n    onChange({\n      query: queryString,\n      qryType: updatedVar.qryType,\n      refId,\n    });\n  };\n\n  /** Call onchange for label names query type change */\n  const onQueryTypeChange = (newType: SelectableValue<QueryType>) => {\n    setQryType(newType.value);\n    if (newType.value !== QueryType.SeriesQuery) {\n      onChangeWithVariableString({ qryType: newType.value ?? 0 });\n    }\n  };\n\n  /** Call onchange for label select when query type is label values */\n  const onLabelChange = (newLabel: SelectableValue<string>) => {\n    const newLabelvalue = newLabel && newLabel.value ? newLabel.value : '';\n    setLabel(newLabelvalue);\n    if (qryType === QueryType.LabelValues && newLabelvalue) {\n      onChangeWithVariableString({ label: newLabelvalue });\n    }\n  };\n\n  /**\n   * Call onChange for MetricsLabels component change for label values query type\n   * if there is a label (required) and\n   * if the labels or metric are updated.\n   */\n  const metricsLabelsChange = (update: PromVisualQuery) => {\n    setMetric(update.metric);\n    setLabelFilters(update.labels);\n\n    const updMetric = update.metric;\n    const updLabelFilters = update.labels ?? [];\n\n    if (qryType === QueryType.LabelValues && label && (updMetric || updLabelFilters)) {\n      onChangeWithVariableString({ qryType, metric: updMetric }, updLabelFilters);\n    }\n  };\n\n  const onLabelNamesMatchChange = (regex: string) => {\n    if (qryType === QueryType.LabelNames) {\n      onChangeWithVariableString({ qryType, match: regex });\n    }\n  };\n\n  /**\n   * Call onchange for metric change if metrics names (regex) query type\n   * Debounce this because to not call the API for every keystroke.\n   */\n  const onMetricChange = (value: string) => {\n    if (qryType === QueryType.MetricNames && value) {\n      onChangeWithVariableString({ metric: value });\n    }\n  };\n\n  /**\n   *  Do not call onchange for variable query result when query type is var query result\n   *  because the query may not be finished typing and an error is returned\n   *  for incorrectly formatted series. Call onchange for blur instead.\n   */\n  const onVarQueryChange = (e: FormEvent<HTMLTextAreaElement>) => {\n    setVarQuery(e.currentTarget.value);\n  };\n\n  /**\n   *  Do not call onchange for seriesQuery when query type is series query\n   *  because the series may not be finished typing and an error is returned\n   *  for incorrectly formatted series. Call onchange for blur instead.\n   */\n  const onSeriesQueryChange = (e: FormEvent<HTMLInputElement>) => {\n    setSeriesQuery(e.currentTarget.value);\n  };\n\n  const onClassicQueryChange = (e: FormEvent<HTMLInputElement>) => {\n    setClassicQuery(e.currentTarget.value);\n  };\n\n  const promVisualQuery = useCallback(() => {\n    return { metric: metric, labels: labelFilters, operations: [] };\n  }, [metric, labelFilters]);\n\n  /**\n   * Debounce a search through all the labels possible and truncate by .\n   */\n  const labelNamesSearch = debounce((query: string) => {\n    // we limit the select to show 1000 options,\n    // but we still search through all the possible options\n    const results = allLabelOptions.filter((label) => {\n      return label.value?.includes(query);\n    });\n    return truncateResult(results);\n  }, 300);\n\n  return (\n    <>\n      <InlineFieldRow>\n        <InlineField\n          label={t('grafana-prometheus.components.prom-variable-query-editor.label-query-type', 'Query type')}\n          labelWidth={20}\n          tooltip={\n            <div>\n              <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-query-type\">\n                The Prometheus data source plugin provides the following query types for template variables.\n              </Trans>\n            </div>\n          }\n        >\n          <Select\n            placeholder={t(\n              'grafana-prometheus.components.prom-variable-query-editor.placeholder-select-query-type',\n              'Select query type'\n            )}\n            aria-label={t(\n              'grafana-prometheus.components.prom-variable-query-editor.aria-label-query-type',\n              'Query type'\n            )}\n            onChange={onQueryTypeChange}\n            value={qryType}\n            options={variableOptions}\n            width={25}\n            data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.queryType}\n          />\n        </InlineField>\n      </InlineFieldRow>\n\n      {qryType === QueryType.LabelValues && (\n        <>\n          <InlineFieldRow>\n            <InlineField\n              label={t('grafana-prometheus.components.prom-variable-query-editor.label-label', 'Label')}\n              labelWidth={20}\n              required\n              aria-labelledby=\"label-select\"\n              tooltip={\n                <div>\n                  <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-label\">\n                    Returns a list of label values for the label name in all metrics unless the metric is specified.\n                  </Trans>\n                </div>\n              }\n            >\n              <AsyncSelect\n                onChange={onLabelChange}\n                value={label ? toOption(label) : null}\n                defaultOptions={truncatedLabelOptions}\n                width={25}\n                allowCustomValue\n                isClearable={true}\n                loadOptions={labelNamesSearch}\n                data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.labelValues.labelSelect}\n              />\n            </InlineField>\n          </InlineFieldRow>\n          {/* Used to select an optional metric with optional label filters */}\n          <MetricsLabelsSection\n            query={promVisualQuery()}\n            datasource={datasource}\n            onChange={metricsLabelsChange}\n            variableEditor={true}\n            timeRange={range ?? getDefaultTimeRange()}\n          />\n        </>\n      )}\n\n      {qryType === QueryType.LabelNames && (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.components.prom-variable-query-editor.label-metric-regex', 'Metric regex')}\n            labelWidth={20}\n            aria-labelledby=\"Metric regex\"\n            tooltip={\n              <div>\n                <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-metric-regex\">\n                  Returns a list of label names, optionally filtering by specified metric regex.\n                </Trans>\n              </div>\n            }\n          >\n            <Input\n              type=\"text\"\n              aria-label={t(\n                'grafana-prometheus.components.prom-variable-query-editor.aria-label-metric-regex',\n                'Metric regex'\n              )}\n              placeholder={t(\n                'grafana-prometheus.components.prom-variable-query-editor.placeholder-metric-regex',\n                'Metric regex'\n              )}\n              value={labelNamesMatch}\n              onBlur={(event) => {\n                setLabelNamesMatch(event.currentTarget.value);\n                onLabelNamesMatchChange(event.currentTarget.value);\n              }}\n              onChange={(e) => {\n                setLabelNamesMatch(e.currentTarget.value);\n              }}\n              width={25}\n              data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.labelnames.metricRegex}\n            />\n          </InlineField>\n        </InlineFieldRow>\n      )}\n\n      {qryType === QueryType.MetricNames && (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.components.prom-variable-query-editor.label-metric-regex', 'Metric regex')}\n            labelWidth={20}\n            aria-labelledby=\"Metric selector\"\n            tooltip={\n              <div>\n                <Trans i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.returns-metrics-matching-specified-metric-regex\">\n                  Returns a list of metrics matching the specified metric regex.\n                </Trans>\n              </div>\n            }\n          >\n            <Input\n              type=\"text\"\n              aria-label={t(\n                'grafana-prometheus.components.prom-variable-query-editor.aria-label-metric-selector',\n                'Metric selector'\n              )}\n              placeholder={t(\n                'grafana-prometheus.components.prom-variable-query-editor.placeholder-metric-regex',\n                'Metric regex'\n              )}\n              value={metric}\n              onChange={(e) => {\n                setMetric(e.currentTarget.value);\n              }}\n              onBlur={(e) => {\n                setMetric(e.currentTarget.value);\n                onMetricChange(e.currentTarget.value);\n              }}\n              width={25}\n              data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.metricNames.metricRegex}\n            />\n          </InlineField>\n        </InlineFieldRow>\n      )}\n\n      {qryType === QueryType.VarQueryResult && (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.components.prom-variable-query-editor.label-query', 'Query')}\n            labelWidth={20}\n            tooltip={\n              <div>\n                <Trans\n                  i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-query\"\n                  values={{ exampleQuery: 'sum(go_goroutines)' }}\n                >\n                  Returns a list of Prometheus query results for the query. This can include Prometheus functions, i.e.\n                  {'{{exampleQuery}}'}.\n                </Trans>\n              </div>\n            }\n          >\n            <TextArea\n              type=\"text\"\n              aria-label={t(\n                'grafana-prometheus.components.prom-variable-query-editor.aria-label-prometheus-query',\n                'Prometheus Query'\n              )}\n              placeholder={t(\n                'grafana-prometheus.components.prom-variable-query-editor.placeholder-prometheus-query',\n                'Prometheus Query'\n              )}\n              value={varQuery}\n              onChange={onVarQueryChange}\n              onBlur={() => {\n                if (qryType === QueryType.VarQueryResult && varQuery) {\n                  onChangeWithVariableString({ qryType });\n                }\n              }}\n              cols={100}\n              data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.varQueryResult}\n            />\n          </InlineField>\n        </InlineFieldRow>\n      )}\n\n      {qryType === QueryType.SeriesQuery && (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.components.prom-variable-query-editor.label-series-query', 'Series Query')}\n            labelWidth={20}\n            tooltip={\n              <div>\n                <Trans\n                  i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-series-query\"\n                  values={{\n                    example1: 'go_goroutines{instance=\"localhost:9090\"}',\n                    example2: 'go_goroutines',\n                    example3: '{instance=\"localhost:9090\"}',\n                  }}\n                >\n                  Enter a metric with labels, only a metric or only labels, i.e.\n                  {'{{example1}}'}, {'{{example2}}'}, or {'{{example3}}'}. Returns a list of time series associated with\n                  the entered data.\n                </Trans>\n              </div>\n            }\n          >\n            <Input\n              type=\"text\"\n              aria-label={t(\n                'grafana-prometheus.components.prom-variable-query-editor.aria-label-series-query',\n                'Series Query'\n              )}\n              placeholder={t(\n                'grafana-prometheus.components.prom-variable-query-editor.placeholder-series-query',\n                'Series Query'\n              )}\n              value={seriesQuery}\n              onChange={onSeriesQueryChange}\n              onBlur={() => {\n                if (qryType === QueryType.SeriesQuery && seriesQuery) {\n                  onChangeWithVariableString({ qryType });\n                }\n              }}\n              width={100}\n              data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.seriesQuery}\n            />\n          </InlineField>\n        </InlineFieldRow>\n      )}\n\n      {qryType === QueryType.ClassicQuery && (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.components.prom-variable-query-editor.label-classic-query', 'Classic Query')}\n            labelWidth={20}\n            tooltip={\n              <div>\n                <Trans\n                  i18nKey=\"grafana-prometheus.components.prom-variable-query-editor.tooltip-classic-query\"\n                  values={{\n                    exampleQuery: 'label_values(metric, label)',\n                  }}\n                >\n                  The original implementation of the Prometheus variable query editor. Enter a string with the correct\n                  query type and parameters as described in these docs. For example, {'{{exampleQuery}}'}.\n                </Trans>\n              </div>\n            }\n          >\n            <Input\n              type=\"text\"\n              aria-label={t(\n                'grafana-prometheus.components.prom-variable-query-editor.aria-label-classic-query',\n                'Classic Query'\n              )}\n              placeholder={t(\n                'grafana-prometheus.components.prom-variable-query-editor.placeholder-classic-query',\n                'Classic Query'\n              )}\n              value={classicQuery}\n              onChange={onClassicQueryChange}\n              onBlur={() => {\n                if (qryType === QueryType.ClassicQuery && classicQuery) {\n                  onChangeWithVariableString({ qryType });\n                }\n              }}\n              width={100}\n              data-testid={selectors.components.DataSource.Prometheus.variableQueryEditor.classicQuery}\n            />\n          </InlineField>\n        </InlineFieldRow>\n      )}\n    </>\n  );\n};\n\nexport function variableMigration(query: string | PromVariableQuery | StandardPromVariableQuery): PromVariableQuery {\n  if (typeof query === 'string') {\n    return migrateVariableQueryToEditor(query);\n  } else if (query.query) {\n    return migrateVariableQueryToEditor(query.query);\n  } else {\n    return query;\n  }\n}\n"],"names":["QueryType","useState","truncateResult","useEffect","getDefaultTimeRange","promQueryModeller","migrateVariableEditorBackToVariableSupport","useCallback","debounce","query","label","jsxs","Fragment","jsx","InlineFieldRow","InlineField","t","Trans","Select","selectors","AsyncSelect","toOption","MetricsLabelsSection","Input","TextArea","migrateVariableQueryToEditor"],"mappings":"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"}