{"version":3,"file":"DataSourcePicker.mjs","sources":["../../../src/components/DataSourcePicker.tsx"],"sourcesContent":["// Libraries\nimport { PureComponent } from 'react';\n\n// Components\nimport {\n  DataSourceInstanceSettings,\n  DataSourceRef,\n  getDataSourceUID,\n  isUnsignedPluginSignature,\n  SelectableValue,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { 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.slice(0, 37),\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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"}