DataSourcesListPage.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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, getDataSourcesCount, 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. dataSourcesCount: number;
  17. layoutMode: LayoutMode;
  18. loadDataSources: typeof loadDataSources;
  19. }
  20. const emptyListModel = {
  21. title: 'There are no data sources defined yet',
  22. buttonIcon: 'gicon gicon-add-datasources',
  23. buttonLink: 'datasources/new',
  24. buttonTitle: 'Add data source',
  25. proTip: 'You can also define data sources through configuration files.',
  26. proTipLink: 'http://docs.grafana.org/administration/provisioning/#datasources?utm_source=grafana_ds_list',
  27. proTipLinkTitle: 'Learn more',
  28. proTipTarget: '_blank',
  29. };
  30. export class DataSourcesListPage extends PureComponent<Props> {
  31. componentDidMount() {
  32. this.fetchDataSources();
  33. }
  34. async fetchDataSources() {
  35. return await this.props.loadDataSources();
  36. }
  37. render() {
  38. const { dataSources, dataSourcesCount, navModel, layoutMode } = this.props;
  39. return (
  40. <div>
  41. <PageHeader model={navModel} />
  42. <div className="page-container page-body">
  43. {dataSourcesCount === 0 ? (
  44. <EmptyListCTA model={emptyListModel} />
  45. ) : (
  46. [
  47. <DataSourcesActionBar key="action-bar" />,
  48. <DataSourcesList dataSources={dataSources} layoutMode={layoutMode} key="list" />,
  49. ]
  50. )}
  51. </div>
  52. </div>
  53. );
  54. }
  55. }
  56. function mapStateToProps(state) {
  57. return {
  58. navModel: getNavModel(state.navIndex, 'datasources'),
  59. dataSources: getDataSources(state.dataSources),
  60. layoutMode: getDataSourcesLayoutMode(state.dataSources),
  61. dataSourcesCount: getDataSourcesCount(state.dataSources),
  62. };
  63. }
  64. const mapDispatchToProps = {
  65. loadDataSources,
  66. };
  67. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourcesListPage));