{"version":3,"file":"MetricCombobox.cjs","sources":["../../../../src/querybuilder/components/MetricCombobox.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useState } from 'react';\n\nimport { type GrafanaTheme2, type SelectableValue, type TimeRange } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Trans, t } from '@grafana/i18n';\nimport { EditorField, EditorFieldGroup } from '@grafana/plugin-ui';\nimport { Button, InlineField, InlineFieldRow, Combobox, type ComboboxOption, useTheme2 } from '@grafana/ui';\n\nimport { METRIC_LABEL } from '../../constants';\nimport { type PrometheusDatasource } from '../../datasource';\nimport { type QueryBuilderLabelFilter } from '../shared/types';\nimport { type PromVisualQuery } from '../types';\n\nimport { formatKeyValueStrings } from './formatter';\nimport { MetricsModal } from './metrics-modal/MetricsModal';\n\nexport interface MetricComboboxProps {\n  metricLookupDisabled: boolean;\n  query: PromVisualQuery;\n  onChange: (query: PromVisualQuery) => void;\n  onGetMetrics: () => Promise<SelectableValue[]>;\n  datasource: PrometheusDatasource;\n  labelsFilters: QueryBuilderLabelFilter[];\n  onBlur?: () => void;\n  variableEditor?: boolean;\n  timeRange: TimeRange;\n}\n\nexport function MetricCombobox({\n  datasource,\n  query,\n  onChange,\n  onGetMetrics,\n  labelsFilters,\n  variableEditor,\n  timeRange,\n}: Readonly<MetricComboboxProps>) {\n  const [metricsModalOpen, setMetricsModalOpen] = useState(false);\n  const styles = getStyles(useTheme2());\n\n  /**\n   * Gets label_values response from prometheus API for current autocomplete query string and any existing labels filters\n   */\n  const getMetricLabels = useCallback(\n    async (query: string) => {\n      const match = formatKeyValueStrings(query, labelsFilters);\n      const results = await datasource.languageProvider.queryLabelValues(timeRange, METRIC_LABEL, match);\n\n      const resultsOptions = results.map((result) => {\n        return {\n          label: result,\n          value: result,\n        };\n      });\n      return resultsOptions;\n    },\n    [datasource.languageProvider, labelsFilters, timeRange]\n  );\n\n  const onComboboxChange = useCallback(\n    (opt: ComboboxOption<string> | null) => {\n      onChange({ ...query, metric: opt?.value ?? '' });\n    },\n    [onChange, query]\n  );\n\n  const loadOptions = useCallback(\n    async (input: string): Promise<ComboboxOption[]> => {\n      const metrics = input.length ? await getMetricLabels(input) : await onGetMetrics();\n\n      return metrics.map((option) => ({\n        label: option.label ?? option.value,\n        value: option.value,\n      }));\n    },\n    [getMetricLabels, onGetMetrics]\n  );\n\n  const asyncSelect = () => {\n    return (\n      <div className={styles.wrapper}>\n        <Combobox\n          placeholder={t(\n            'grafana-prometheus.querybuilder.metric-combobox.async-select.placeholder-select-metric',\n            'Select metric'\n          )}\n          width=\"auto\"\n          minWidth={25}\n          options={loadOptions}\n          value={query.metric}\n          onChange={onComboboxChange}\n          createCustomValue\n          data-testid={selectors.components.DataSource.Prometheus.queryEditor.builder.metricSelect}\n        />\n        <Button\n          tooltip={t(\n            'grafana-prometheus.querybuilder.metric-combobox.async-select.tooltip-open-metrics-explorer',\n            'Open metrics explorer'\n          )}\n          aria-label={t(\n            'grafana-prometheus.querybuilder.metric-combobox.async-select.aria-label-open-metrics-explorer',\n            'Open metrics explorer'\n          )}\n          variant=\"secondary\"\n          icon=\"book-open\"\n          className={styles.button}\n          onClick={() => setMetricsModalOpen(true)}\n        />\n      </div>\n    );\n  };\n\n  return (\n    <>\n      {!datasource.lookupsDisabled && metricsModalOpen && (\n        <MetricsModal\n          datasource={datasource}\n          isOpen={metricsModalOpen}\n          onClose={() => setMetricsModalOpen(false)}\n          query={query}\n          onChange={onChange}\n          timeRange={timeRange}\n        />\n      )}\n      {variableEditor ? (\n        <InlineFieldRow>\n          <InlineField\n            label={t('grafana-prometheus.querybuilder.metric-combobox.label-metric', 'Metric')}\n            labelWidth={20}\n            tooltip={\n              <div>\n                <Trans i18nKey=\"grafana-prometheus.querybuilder.metric-combobox.tooltip-metric\">\n                  Optional: returns a list of label values for the label name in the specified metric.\n                </Trans>\n              </div>\n            }\n          >\n            {asyncSelect()}\n          </InlineField>\n        </InlineFieldRow>\n      ) : (\n        <EditorFieldGroup>\n          <EditorField label={t('grafana-prometheus.querybuilder.metric-combobox.label-metric', 'Metric')}>\n            {asyncSelect()}\n          </EditorField>\n        </EditorFieldGroup>\n      )}\n    </>\n  );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n  return {\n    wrapper: css({\n      display: 'flex',\n      input: {\n        borderTopRightRadius: 'unset',\n        borderBottomRightRadius: 'unset',\n      },\n    }),\n    button: css({\n      borderTopLeftRadius: 'unset',\n      borderBottomLeftRadius: 'unset',\n    }),\n  };\n};\n"],"names":["useState","useTheme2","useCallback","query","formatKeyValueStrings","METRIC_LABEL","jsxs","jsx","Combobox","t","selectors","Button","Fragment","MetricsModal","InlineFieldRow","InlineField","Trans","EditorFieldGroup","EditorField","css"],"mappings":"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"}