{"version":3,"file":"DataSourcePicker.mjs","sources":["../../../src/components/DataSourcePicker.tsx"],"sourcesContent":["// Libraries\nimport { PureComponent } from 'react';\n\n// Components\nimport {\n  type DataSourceInstanceSettings,\n  type DataSourceRef,\n  getDataSourceUID,\n  isUnsignedPluginSignature,\n  type SelectableValue,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\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 | 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 state description for the {@link DataSourcePicker}\n *\n * @internal\n */\nexport interface DataSourcePickerState {\n  error?: string;\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 class DataSourcePicker extends PureComponent<DataSourcePickerProps, DataSourcePickerState> {\n  dataSourceSrv = getDataSourceSrv();\n\n  static defaultProps: Partial<DataSourcePickerProps> = {\n    autoFocus: false,\n    openMenuOnFocus: false,\n    placeholder: 'Select data source',\n  };\n\n  state: DataSourcePickerState = {};\n\n  constructor(props: DataSourcePickerProps) {\n    super(props);\n  }\n\n  componentDidMount() {\n    const { current } = this.props;\n    const dsSettings = this.dataSourceSrv.getInstanceSettings(current);\n    if (!dsSettings) {\n      this.setState({ error: 'Could not find data source ' + current });\n    }\n  }\n\n  onChange = (item: SelectableValue<string>, actionMeta: ActionMeta) => {\n    if (actionMeta.action === 'clear' && this.props.onClear) {\n      this.props.onClear();\n      return;\n    }\n\n    const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value);\n\n    if (dsSettings) {\n      this.props.onChange(dsSettings);\n      this.setState({ error: undefined });\n    }\n  };\n\n  private getCurrentValue(): SelectableValue<string> | undefined {\n    const { current, hideTextValue, noDefault } = this.props;\n    if (!current && noDefault) {\n      return;\n    }\n\n    const ds = this.dataSourceSrv.getInstanceSettings(current);\n\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\n    const uid = getDataSourceUID(current);\n\n    if (uid === ExpressionDatasourceRef.uid || uid === ExpressionDatasourceRef.name) {\n      return { label: uid, value: uid, hideText: hideTextValue };\n    }\n\n    return {\n      label: (uid ?? 'no name') + ' - not found',\n      value: uid ?? undefined,\n      imgUrl: '',\n      hideText: hideTextValue,\n    };\n  }\n\n  getDataSourceOptions() {\n    const { alerting, tracing, metrics, mixed, dashboard, variables, annotations, pluginId, type, filter, logs } =\n      this.props;\n\n    const options = this.dataSourceSrv\n      .getList({\n        alerting,\n        tracing,\n        metrics,\n        logs,\n        dashboard,\n        mixed,\n        variables,\n        annotations,\n        pluginId,\n        filter,\n        type,\n      })\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    return options;\n  }\n\n  render() {\n    const {\n      autoFocus,\n      onBlur,\n      onClear,\n      openMenuOnFocus,\n      placeholder,\n      width,\n      inputId,\n      disabled = false,\n      isLoading = false,\n    } = this.props;\n    const { error } = this.state;\n    const options = this.getDataSourceOptions();\n    const value = this.getCurrentValue();\n    const isClearable = typeof onClear === 'function';\n\n    return (\n      <div\n        aria-label=\"Data source picker select container\"\n        data-testid={selectors.components.DataSourcePicker.container}\n      >\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={this.onChange}\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(this.props.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}\n"],"names":[],"mappings":"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"}