DataSourcePicker.tsx 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Libraries
  2. import React, { PureComponent } from 'react';
  3. // Components
  4. import { Select, SelectOptionItem } from '@grafana/ui';
  5. // Types
  6. import { DataSourceSelectItem } from '@grafana/ui/src/types';
  7. export interface Props {
  8. onChange: (ds: DataSourceSelectItem) => void;
  9. datasources: DataSourceSelectItem[];
  10. current: DataSourceSelectItem;
  11. onBlur?: () => void;
  12. autoFocus?: boolean;
  13. openMenuOnFocus?: boolean;
  14. }
  15. export class DataSourcePicker extends PureComponent<Props> {
  16. static defaultProps: Partial<Props> = {
  17. autoFocus: false,
  18. openMenuOnFocus: false,
  19. };
  20. searchInput: HTMLElement;
  21. constructor(props: Props) {
  22. super(props);
  23. }
  24. onChange = (item: SelectOptionItem) => {
  25. const ds = this.props.datasources.find(ds => ds.name === item.value);
  26. this.props.onChange(ds);
  27. };
  28. render() {
  29. const { datasources, current, autoFocus, onBlur, openMenuOnFocus } = this.props;
  30. const options = datasources.map(ds => ({
  31. value: ds.name,
  32. label: ds.name,
  33. imgUrl: ds.meta.info.logos.small,
  34. }));
  35. const value = current && {
  36. label: current.name,
  37. value: current.name,
  38. imgUrl: current.meta.info.logos.small,
  39. };
  40. return (
  41. <div className="gf-form-inline">
  42. <Select
  43. className="ds-picker"
  44. isMulti={false}
  45. isClearable={false}
  46. backspaceRemovesValue={false}
  47. onChange={this.onChange}
  48. options={options}
  49. autoFocus={autoFocus}
  50. onBlur={onBlur}
  51. openMenuOnFocus={openMenuOnFocus}
  52. maxMenuHeight={500}
  53. placeholder="Select datasource"
  54. noOptionsMessage={() => 'No datasources found'}
  55. value={value}
  56. />
  57. </div>
  58. );
  59. }
  60. }
  61. export default DataSourcePicker;