DataSourceDashboards.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // Libraries
  2. import React, { PureComponent } from 'react';
  3. import { hot } from 'react-hot-loader';
  4. import { connect } from 'react-redux';
  5. // Components
  6. import Page from 'app/core/components/Page/Page';
  7. import DashboardTable from './DashboardsTable';
  8. // Actions & Selectors
  9. import { getNavModel } from 'app/core/selectors/navModel';
  10. import { getRouteParamsId } from 'app/core/selectors/location';
  11. import { loadDataSource } from './state/actions';
  12. import { loadPluginDashboards } from '../plugins/state/actions';
  13. import { importDashboard, removeDashboard } from '../dashboard/state/actions';
  14. import { getDataSource } from './state/selectors';
  15. // Types
  16. import { NavModel, PluginDashboard, StoreState } from 'app/types';
  17. import { DataSourceSettings } from '@grafana/ui/src/types';
  18. export interface Props {
  19. navModel: NavModel;
  20. dashboards: PluginDashboard[];
  21. dataSource: DataSourceSettings;
  22. pageId: number;
  23. importDashboard: typeof importDashboard;
  24. loadDataSource: typeof loadDataSource;
  25. loadPluginDashboards: typeof loadPluginDashboards;
  26. removeDashboard: typeof removeDashboard;
  27. isLoading: boolean;
  28. }
  29. export class DataSourceDashboards extends PureComponent<Props> {
  30. async componentDidMount() {
  31. const { loadDataSource, pageId } = this.props;
  32. await loadDataSource(pageId);
  33. this.props.loadPluginDashboards();
  34. }
  35. onImport = (dashboard: PluginDashboard, overwrite: boolean) => {
  36. const { dataSource, importDashboard } = this.props;
  37. const data = {
  38. pluginId: dashboard.pluginId,
  39. path: dashboard.path,
  40. overwrite: overwrite,
  41. inputs: [],
  42. };
  43. if (dataSource) {
  44. data.inputs.push({
  45. name: '*',
  46. type: 'datasource',
  47. pluginId: dataSource.type,
  48. value: dataSource.name,
  49. });
  50. }
  51. importDashboard(data, dashboard.title);
  52. };
  53. onRemove = (dashboard: PluginDashboard) => {
  54. this.props.removeDashboard(dashboard.importedUri);
  55. };
  56. render() {
  57. const { dashboards, navModel, isLoading } = this.props;
  58. return (
  59. <Page navModel={navModel}>
  60. <Page.Contents isLoading={isLoading}>
  61. <DashboardTable
  62. dashboards={dashboards}
  63. onImport={(dashboard, overwrite) => this.onImport(dashboard, overwrite)}
  64. onRemove={dashboard => this.onRemove(dashboard)}
  65. />
  66. </Page.Contents>
  67. </Page>
  68. );
  69. }
  70. }
  71. function mapStateToProps(state: StoreState) {
  72. const pageId = getRouteParamsId(state.location);
  73. return {
  74. navModel: getNavModel(state.navIndex, `datasource-dashboards-${pageId}`),
  75. pageId: pageId,
  76. dashboards: state.plugins.dashboards,
  77. dataSource: getDataSource(state.dataSources, pageId),
  78. isLoading: state.plugins.isLoadingPluginDashboards
  79. };
  80. }
  81. const mapDispatchToProps = {
  82. importDashboard,
  83. loadDataSource,
  84. loadPluginDashboards,
  85. removeDashboard,
  86. };
  87. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(DataSourceDashboards));