{"version":3,"file":"DataSourcePicker.mjs","sources":["../../../src/components/DataSourcePicker.tsx"],"sourcesContent":["// Libraries\nimport { memo, useEffect, useState } from 'react';\n\n// Components\nimport {\n  type DataSourceInstanceSettings,\n  getDataSourceUID,\n  isUnsignedPluginSignature,\n  type SelectableValue,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { type DataSourceRef } from '@grafana/schema';\nimport { type ActionMeta, PluginSignatureBadge, Select, Stack } from '@grafana/ui';\n\nimport { getDataSourceSrv } from '../services/dataSourceSrv';\n\nimport { ExpressionDatasourceRef } from './../utils/DataSourceWithBackend';\n\n/**\n * Component props description for the {@link DataSourcePicker}\n *\n * @internal\n */\nexport interface DataSourcePickerProps {\n  onChange: (ds: DataSourceInstanceSettings) => void;\n  current: DataSourceRef | string | undefined | null; // uid\n  hideTextValue?: boolean;\n  onBlur?: () => void;\n  autoFocus?: boolean;\n  openMenuOnFocus?: boolean;\n  placeholder?: string;\n  tracing?: boolean;\n  mixed?: boolean;\n  dashboard?: boolean;\n  metrics?: boolean;\n  type?: string | string[];\n  annotations?: boolean;\n  variables?: boolean;\n  alerting?: boolean;\n  pluginId?: string;\n  /** If true,we show only DSs with logs; and if true, pluginId shouldnt be passed in */\n  logs?: boolean;\n  // If set to true and there is no value select will be empty, otherwise it will preselect default data source\n  noDefault?: boolean;\n  width?: number;\n  inputId?: string;\n  filter?: (dataSource: DataSourceInstanceSettings) => boolean;\n  onClear?: () => void;\n  invalid?: boolean;\n  disabled?: boolean;\n  isLoading?: boolean;\n}\n\n/**\n * Component to be able to select a datasource from the list of installed and enabled\n * datasources in the current Grafana instance.\n *\n * @internal\n */\nexport const DataSourcePicker = memo(function DataSourcePicker({\n  onChange,\n  current = null,\n  hideTextValue,\n  onBlur,\n  autoFocus = false,\n  openMenuOnFocus = false,\n  placeholder = 'Select data source',\n  tracing,\n  mixed,\n  dashboard,\n  metrics,\n  type,\n  annotations,\n  variables,\n  alerting,\n  pluginId,\n  logs,\n  noDefault,\n  width,\n  inputId,\n  filter,\n  onClear,\n  invalid,\n  disabled = false,\n  isLoading = false,\n}: DataSourcePickerProps) {\n  const dataSourceSrv = getDataSourceSrv();\n  const [error, setError] = useState<string | undefined>(undefined);\n\n  useEffect(() => {\n    const dsSettings = dataSourceSrv.getInstanceSettings(current);\n    if (!dsSettings) {\n      setError('Could not find data source ' + current);\n    }\n  }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n  function handleChange(item: SelectableValue<string>, actionMeta: ActionMeta) {\n    if (actionMeta.action === 'clear' && onClear) {\n      onClear();\n      return;\n    }\n    const dsSettings = dataSourceSrv.getInstanceSettings(item.value);\n    if (dsSettings) {\n      onChange(dsSettings);\n      setError(undefined);\n    }\n  }\n\n  function getCurrentValue(): SelectableValue<string> | undefined {\n    if (!current && noDefault) {\n      return;\n    }\n    const ds = dataSourceSrv.getInstanceSettings(current);\n    if (ds) {\n      return {\n        label: ds.name,\n        value: ds.uid,\n        imgUrl: ds.meta.info.logos.small,\n        hideText: hideTextValue,\n        meta: ds.meta,\n      };\n    }\n    const uid = getDataSourceUID(current);\n    if (uid === ExpressionDatasourceRef.uid || uid === ExpressionDatasourceRef.name) {\n      return { label: uid, value: uid, hideText: hideTextValue };\n    }\n    return {\n      label: (uid ?? 'no name') + ' - not found',\n      value: uid ?? undefined,\n      imgUrl: '',\n      hideText: hideTextValue,\n    };\n  }\n\n  function getDataSourceOptions() {\n    return dataSourceSrv\n      .getList({ alerting, tracing, metrics, logs, dashboard, mixed, variables, annotations, pluginId, filter, type })\n      .map((ds) => ({\n        value: ds.name,\n        label: `${ds.name}${ds.isDefault ? ' (default)' : ''}`,\n        imgUrl: ds.meta.info.logos.small,\n        meta: ds.meta,\n      }));\n  }\n\n  const options = getDataSourceOptions();\n  const value = getCurrentValue();\n  const isClearable = typeof onClear === 'function';\n\n  return (\n    <div aria-label=\"Data source picker select container\" data-testid={selectors.components.DataSourcePicker.container}>\n      <Select\n        isLoading={isLoading}\n        disabled={disabled}\n        aria-label={'Select a data source'}\n        data-testid={selectors.components.DataSourcePicker.inputV2}\n        inputId={inputId || 'data-source-picker'}\n        className=\"ds-picker select-container\"\n        isMulti={false}\n        isClearable={isClearable}\n        backspaceRemovesValue={false}\n        onChange={handleChange}\n        options={options}\n        autoFocus={autoFocus}\n        onBlur={onBlur}\n        width={width}\n        openMenuOnFocus={openMenuOnFocus}\n        maxMenuHeight={500}\n        placeholder={placeholder}\n        noOptionsMessage=\"No datasources found\"\n        value={value ?? null}\n        invalid={Boolean(error) || Boolean(invalid)}\n        getOptionLabel={(o) => {\n          if (o.meta && isUnsignedPluginSignature(o.meta.signature) && o !== value) {\n            return (\n              <Stack alignItems=\"center\" justifyContent=\"space-between\">\n                <span>{o.label}</span> <PluginSignatureBadge status={o.meta.signature} />\n              </Stack>\n            );\n          }\n          return o.label || '';\n        }}\n      />\n    </div>\n  );\n});\n"],"names":["DataSourcePicker"],"mappings":"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"}