PluginListPage.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import PageHeader from 'app/core/components/PageHeader/PageHeader';
  5. import OrgActionBar from 'app/core/components/OrgActionBar/OrgActionBar';
  6. import PluginList from './PluginList';
  7. import { NavModel, Plugin } from 'app/types';
  8. import { loadPlugins, setPluginsLayoutMode, setPluginsSearchQuery } from './state/actions';
  9. import { getNavModel } from '../../core/selectors/navModel';
  10. import { getLayoutMode, getPlugins, getPluginsSearchQuery } from './state/selectors';
  11. import { LayoutMode } from '../../core/components/LayoutSelector/LayoutSelector';
  12. export interface Props {
  13. navModel: NavModel;
  14. plugins: Plugin[];
  15. layoutMode: LayoutMode;
  16. searchQuery: string;
  17. loadPlugins: typeof loadPlugins;
  18. setPluginsLayoutMode: typeof setPluginsLayoutMode;
  19. setPluginsSearchQuery: typeof setPluginsSearchQuery;
  20. }
  21. export class PluginListPage extends PureComponent<Props> {
  22. componentDidMount() {
  23. this.fetchPlugins();
  24. }
  25. async fetchPlugins() {
  26. await this.props.loadPlugins();
  27. }
  28. render() {
  29. const { navModel, plugins, layoutMode, setPluginsLayoutMode, setPluginsSearchQuery, searchQuery } = this.props;
  30. const linkButton = {
  31. href: 'https://grafana.com/plugins?utm_source=grafana_plugin_list',
  32. title: 'Find more plugins on Grafana.com',
  33. };
  34. return (
  35. <div>
  36. <PageHeader model={navModel} />
  37. <div className="page-container page-body">
  38. <OrgActionBar
  39. searchQuery={searchQuery}
  40. layoutMode={layoutMode}
  41. setLayoutMode={mode => setPluginsLayoutMode(mode)}
  42. setSearchQuery={query => setPluginsSearchQuery(query)}
  43. linkButton={linkButton}
  44. />
  45. {plugins && <PluginList plugins={plugins} layoutMode={layoutMode} />}
  46. </div>
  47. </div>
  48. );
  49. }
  50. }
  51. function mapStateToProps(state) {
  52. return {
  53. navModel: getNavModel(state.navIndex, 'plugins'),
  54. plugins: getPlugins(state.plugins),
  55. layoutMode: getLayoutMode(state.plugins),
  56. searchQuery: getPluginsSearchQuery(state.plugins),
  57. };
  58. }
  59. const mapDispatchToProps = {
  60. loadPlugins,
  61. setPluginsLayoutMode,
  62. setPluginsSearchQuery,
  63. };
  64. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(PluginListPage));