DataSourceDashboards.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 { PluginDashboard, StoreState } from 'app/types';
  17. import { DataSourceSettings } from '@grafana/ui';
  18. import { NavModel } from '@grafana/data';
  19. export interface Props {
  20. navModel: NavModel;
  21. dashboards: PluginDashboard[];
  22. dataSource: DataSourceSettings;
  23. pageId: number;
  24. importDashboard: typeof importDashboard;
  25. loadDataSource: typeof loadDataSource;
  26. loadPluginDashboards: typeof loadPluginDashboards;
  27. removeDashboard: typeof removeDashboard;
  28. isLoading: boolean;
  29. }
  30. export class DataSourceDashboards extends PureComponent<Props> {
  31. async componentDidMount() {
  32. const { loadDataSource, pageId } = this.props;
  33. await loadDataSource(pageId);
  34. this.props.loadPluginDashboards();
  35. }
  36. onImport = (dashboard: PluginDashboard, overwrite: boolean) => {
  37. const { dataSource, importDashboard } = this.props;
  38. const data: any = {
  39. pluginId: dashboard.pluginId,
  40. path: dashboard.path,
  41. overwrite,
  42. inputs: [],
  43. };
  44. if (dataSource) {
  45. data.inputs.push({
  46. name: '*',
  47. type: 'datasource',
  48. pluginId: dataSource.type,
  49. value: dataSource.name,
  50. });
  51. }
  52. importDashboard(data, dashboard.title);
  53. };
  54. onRemove = (dashboard: PluginDashboard) => {
  55. this.props.removeDashboard(dashboard.importedUri);
  56. };
  57. render() {
  58. const { dashboards, navModel, isLoading } = this.props;
  59. return (
  60. <Page navModel={navModel}>
  61. <Page.Contents isLoading={isLoading}>
  62. <DashboardTable
  63. dashboards={dashboards}
  64. onImport={(dashboard, overwrite) => this.onImport(dashboard, overwrite)}
  65. onRemove={dashboard => this.onRemove(dashboard)}
  66. />
  67. </Page.Contents>
  68. </Page>
  69. );
  70. }
  71. }
  72. function mapStateToProps(state: StoreState) {
  73. const pageId = getRouteParamsId(state.location);
  74. return {
  75. navModel: getNavModel(state.navIndex, `datasource-dashboards-${pageId}`),
  76. pageId: pageId,
  77. dashboards: state.plugins.dashboards,
  78. dataSource: getDataSource(state.dataSources, pageId),
  79. isLoading: state.plugins.isLoadingPluginDashboards,
  80. };
  81. }
  82. const mapDispatchToProps = {
  83. importDashboard,
  84. loadDataSource,
  85. loadPluginDashboards,
  86. removeDashboard,
  87. };
  88. export default hot(module)(
  89. connect(
  90. mapStateToProps,
  91. mapDispatchToProps
  92. )(DataSourceDashboards)
  93. );