DataSourcePicker.tsx 1.6 KB

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