DataSourcesListPage.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import { hot } from 'react-hot-loader';
  4. import PageHeader from '../../core/components/PageHeader/PageHeader';
  5. import DataSourcesActionBar from './DataSourcesActionBar';
  6. import DataSourcesList from './DataSourcesList';
  7. import { loadDataSources } from './state/actions';
  8. import { getDataSources, getDataSourcesLayoutMode } from './state/selectors';
  9. import { getNavModel } from '../../core/selectors/navModel';
  10. import { DataSource, NavModel } from 'app/types';
  11. import { LayoutMode } from '../../core/components/LayoutSelector/LayoutSelector';
  12. import EmptyListCTA from '../../core/components/EmptyListCTA/EmptyListCTA';
  13. export interface Props {
  14. navModel: NavModel;
  15. dataSources: DataSource[];
  16. layoutMode: LayoutMode;
  17. loadDataSources: typeof loadDataSources;
  18. }
  19. const emptyListModel = {
  20. title: 'There are no data sources defined yet',
  21. buttonIcon: 'gicon gicon-add-datasources',
  22. buttonLink: 'datasources/new',
  23. buttonTitle: 'Add data source',
  24. proTip: 'You can also define data sources through configuration files.',
  25. proTipLink: 'http://docs.grafana.org/administration/provisioning/#datasources?utm_source=grafana_ds_list',
  26. proTipLinkTitle: 'Learn more',
  27. proTipTarget: '_blank',
  28. };
  29. export class DataSourcesListPage extends PureComponent<Props> {
  30. componentDidMount() {
  31. this.fetchDataSources();
  32. }
  33. async fetchDataSources() {
  34. return await this.props.loadDataSources();
  35. }
  36. render() {
  37. const { navModel, dataSources, layoutMode } = this.props;
  38. if (dataSources.length === 0) {
  39. return <EmptyListCTA model={emptyListModel} />;
  40. }
  41. return (
  42. <div>
  43. <PageHeader model={navModel} />
  44. <div className="page-container page-body">
  45. <DataSourcesActionBar />
  46. <DataSourcesList dataSources={dataSources} layoutMode={layoutMode} />
  47. </div>
  48. </div>
  49. );
  50. }
  51. }
  52. function mapStateToProps(state) {
  53. return {
  54. navModel: getNavModel(state.navIndex, 'datasources'),
  55. dataSources: getDataSources(state.dataSources),
  56. layoutMode: getDataSourcesLayoutMode(state.dataSources),
  57. };
  58. }
  59. const mapDispatchToProps = {
  60. loadDataSources,
  61. };
  62. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourcesListPage));