DataSourcePicker.tsx 1.8 KB

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