NewDataSourcePage.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import { hot } from 'react-hot-loader';
  4. import PageHeader from 'app/core/components/PageHeader/PageHeader';
  5. import { NavModel, Plugin } from 'app/types';
  6. import { addDataSource, loadDataSourceTypes, setDataSourceTypeSearchQuery } from './state/actions';
  7. import { getNavModel } from 'app/core/selectors/navModel';
  8. import { getDataSourceTypes } from './state/selectors';
  9. export interface Props {
  10. navModel: NavModel;
  11. dataSourceTypes: Plugin[];
  12. addDataSource: typeof addDataSource;
  13. loadDataSourceTypes: typeof loadDataSourceTypes;
  14. dataSourceTypeSearchQuery: string;
  15. setDataSourceTypeSearchQuery: typeof setDataSourceTypeSearchQuery;
  16. }
  17. class NewDataSourcePage extends PureComponent<Props> {
  18. componentDidMount() {
  19. this.props.loadDataSourceTypes();
  20. }
  21. onDataSourceTypeClicked = type => {
  22. this.props.addDataSource(type);
  23. };
  24. onSearchQueryChange = event => {
  25. this.props.setDataSourceTypeSearchQuery(event.target.value);
  26. };
  27. render() {
  28. const { navModel, dataSourceTypes, dataSourceTypeSearchQuery } = this.props;
  29. return (
  30. <div>
  31. <PageHeader model={navModel} />
  32. <div className="page-container page-body">
  33. <h2 className="add-data-source-header">Choose data source type</h2>
  34. <div className="add-data-source-search">
  35. <label className="gf-form--has-input-icon">
  36. <input
  37. type="text"
  38. className="gf-form-input width-20"
  39. value={dataSourceTypeSearchQuery}
  40. onChange={this.onSearchQueryChange}
  41. placeholder="Filter by name or type"
  42. />
  43. <i className="gf-form-input-icon fa fa-search" />
  44. </label>
  45. </div>
  46. <div className="add-data-source-grid">
  47. {dataSourceTypes.map((type, index) => {
  48. return (
  49. <div
  50. onClick={() => this.onDataSourceTypeClicked(type)}
  51. className="add-data-source-grid-item"
  52. key={`${type.id}-${index}`}
  53. >
  54. <img className="add-data-source-grid-item-logo" src={type.info.logos.small} />
  55. <span className="add-data-source-grid-item-text">{type.name}</span>
  56. </div>
  57. );
  58. })}
  59. </div>
  60. </div>
  61. </div>
  62. );
  63. }
  64. }
  65. function mapStateToProps(state) {
  66. return {
  67. navModel: getNavModel(state.navIndex, 'datasources'),
  68. dataSourceTypes: getDataSourceTypes(state.dataSources),
  69. };
  70. }
  71. const mapDispatchToProps = {
  72. addDataSource,
  73. loadDataSourceTypes,
  74. setDataSourceTypeSearchQuery,
  75. };
  76. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(NewDataSourcePage));