{"version":3,"file":"LabelFilterItem.cjs","sources":["../../../../src/querybuilder/components/LabelFilterItem.tsx"],"sourcesContent":["// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/LabelFilterItem.tsx\nimport debounce from 'debounce-promise';\nimport { useState } from 'react';\n\nimport { type SelectableValue, toOption } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { t } from '@grafana/i18n';\nimport { AccessoryButton, InputGroup } from '@grafana/plugin-ui';\nimport { AsyncSelect, Select } from '@grafana/ui';\n\nimport { truncateResult } from '../../language_utils';\nimport { type QueryBuilderLabelFilter } from '../shared/types';\n\ninterface LabelFilterItemProps {\n  defaultOp: string;\n  item: Partial<QueryBuilderLabelFilter>;\n  onChange: (value: QueryBuilderLabelFilter) => void;\n  onGetLabelNames: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n  onGetLabelValues: (forLabel: Partial<QueryBuilderLabelFilter>) => Promise<SelectableValue[]>;\n  onDelete: () => void;\n  invalidLabel?: boolean;\n  invalidValue?: boolean;\n  getLabelValuesAutofillSuggestions: (query: string, labelName?: string) => Promise<SelectableValue[]>;\n  debounceDuration: number;\n}\n\nexport function LabelFilterItem({\n  item,\n  defaultOp,\n  onChange,\n  onDelete,\n  onGetLabelNames,\n  onGetLabelValues,\n  invalidLabel,\n  invalidValue,\n  getLabelValuesAutofillSuggestions,\n  debounceDuration,\n}: LabelFilterItemProps) {\n  const [state, setState] = useState<{\n    labelNames?: SelectableValue[];\n    labelValues?: SelectableValue[];\n    isLoadingLabelNames?: boolean;\n    isLoadingLabelValues?: boolean;\n  }>({});\n  // there's a bug in react-select where the menu doesn't recalculate its position when the options are loaded asynchronously\n  // see https://github.com/grafana/grafana/issues/63558\n  // instead, we explicitly control the menu visibility and prevent showing it until the options have fully loaded\n  const [labelNamesMenuOpen, setLabelNamesMenuOpen] = useState(false);\n  const [labelValuesMenuOpen, setLabelValuesMenuOpen] = useState(false);\n  const [allLabels, setAllLabels] = useState<SelectableValue[]>([]);\n\n  const isMultiSelect = (operator = item.op) => {\n    return operators.find((op) => op.label === operator)?.isMultiValue;\n  };\n\n  const getSelectOptionsFromString = (item?: string): string[] => {\n    if (item) {\n      const regExp = /\\(([^)]+)\\)/;\n      const matches = item?.match(regExp);\n\n      if (matches && matches[0].indexOf('|') > 0) {\n        return [item];\n      }\n\n      if (item.indexOf('|') > 0) {\n        return item.split('|');\n      }\n      return [item];\n    }\n    return [];\n  };\n\n  const labelValueSearch = debounce(\n    (query: string) => getLabelValuesAutofillSuggestions(query, item.label),\n    debounceDuration\n  );\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 = allLabels.filter((label) => {\n      return label.value.includes(query);\n    });\n    return truncateResult(results);\n  }, debounceDuration);\n\n  const itemValue = item?.value ?? '';\n\n  return (\n    <div key={itemValue} data-testid=\"prometheus-dimensions-filter-item\">\n      <InputGroup>\n        {/* Label name select, loads all values at once */}\n        <AsyncSelect\n          placeholder={t('grafana-prometheus.querybuilder.label-filter-item.placeholder-select-label', 'Select label')}\n          data-testid={selectors.components.QueryBuilder.labelSelect}\n          inputId=\"prometheus-dimensions-filter-item-key\"\n          width=\"auto\"\n          value={item.label ? toOption(item.label) : null}\n          allowCustomValue\n          onOpenMenu={async () => {\n            setState({ isLoadingLabelNames: true });\n            const labelNames = await onGetLabelNames(item);\n            // store all label names to allow for full label searching by typing in the select option, see loadOptions function labelNamesSearch\n            setAllLabels(labelNames);\n            setLabelNamesMenuOpen(true);\n            // truncate the results the same amount as the metric select\n            const truncatedLabelNames = truncateResult(labelNames);\n            setState({ labelNames: truncatedLabelNames, isLoadingLabelNames: undefined });\n          }}\n          onCloseMenu={() => {\n            setLabelNamesMenuOpen(false);\n          }}\n          isOpen={labelNamesMenuOpen}\n          isLoading={state.isLoadingLabelNames ?? false}\n          loadOptions={labelNamesSearch}\n          defaultOptions={state.labelNames}\n          onChange={(change) => {\n            if (change.label) {\n              onChange({\n                ...item,\n                op: item.op ?? defaultOp,\n                label: change.label,\n                // eslint-ignore\n              } as QueryBuilderLabelFilter);\n            }\n          }}\n          invalid={invalidLabel}\n        />\n\n        {/* Operator select i.e.   = =~ != !~   */}\n        <Select\n          data-testid={selectors.components.QueryBuilder.matchOperatorSelect}\n          className=\"query-segment-operator\"\n          value={toOption(item.op ?? defaultOp)}\n          options={operators}\n          width=\"auto\"\n          onChange={(change) => {\n            if (change.value != null) {\n              onChange({\n                ...item,\n                op: change.value,\n                value: isMultiSelect(change.value) ? item.value : getSelectOptionsFromString(item?.value)[0],\n                // eslint-ignore\n              } as QueryBuilderLabelFilter);\n            }\n          }}\n        />\n\n        {/* Label value async select: autocomplete calls prometheus API */}\n        <AsyncSelect\n          placeholder={t('grafana-prometheus.querybuilder.label-filter-item.placeholder-select-value', 'Select value')}\n          data-testid={selectors.components.QueryBuilder.valueSelect}\n          inputId=\"prometheus-dimensions-filter-item-value\"\n          width=\"auto\"\n          value={\n            isMultiSelect()\n              ? getSelectOptionsFromString(itemValue).map(toOption)\n              : getSelectOptionsFromString(itemValue).map(toOption)[0]\n          }\n          allowCustomValue\n          formatCreateLabel={(input) => input} // to avoid confusion, opt out of using the `defaultFormatCreateLabel`\n          createOptionPosition={item.op?.includes('~') ? 'first' : 'last'}\n          onOpenMenu={async () => {\n            setState({ isLoadingLabelValues: true });\n            const labelValues = await onGetLabelValues(item);\n            truncateResult(labelValues);\n            setLabelValuesMenuOpen(true);\n            setState({\n              ...state,\n              labelValues,\n              isLoadingLabelValues: undefined,\n            });\n          }}\n          onCloseMenu={() => {\n            setLabelValuesMenuOpen(false);\n          }}\n          isOpen={labelValuesMenuOpen}\n          defaultOptions={state.labelValues}\n          isMulti={isMultiSelect()}\n          isLoading={state.isLoadingLabelValues}\n          loadOptions={labelValueSearch}\n          onChange={(change) => {\n            if (change.value) {\n              onChange({\n                ...item,\n                value: change.value,\n                op: item.op ?? defaultOp,\n                // eslint-ignore\n              } as QueryBuilderLabelFilter);\n            } else {\n              const changes = change\n                .map((change: { label?: string }) => {\n                  return change.label;\n                })\n                .join('|');\n              // eslint-ignore\n              onChange({ ...item, value: changes, op: item.op ?? defaultOp } as QueryBuilderLabelFilter);\n            }\n          }}\n          invalid={invalidValue}\n        />\n        <AccessoryButton\n          aria-label={t('grafana-prometheus.querybuilder.label-filter-item.aria-label-remove', 'Remove {{name}}', {\n            name: item.label,\n          })}\n          icon=\"times\"\n          variant=\"secondary\"\n          onClick={onDelete}\n        />\n      </InputGroup>\n    </div>\n  );\n}\n\nconst operators = [\n  { label: '=', value: '=', isMultiValue: false },\n  { label: '!=', value: '!=', isMultiValue: false },\n  { label: '=~', value: '=~', isMultiValue: true },\n  { label: '!~', value: '!~', isMultiValue: true },\n];\n"],"names":["useState","_a","item","debounce","truncateResult","jsx","InputGroup","AsyncSelect","t","selectors","toOption","Select","_b","change","AccessoryButton"],"mappings":"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"}