PluginListPage.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import Page from 'app/core/components/Page/Page';
  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. hasFetched: boolean;
  18. loadPlugins: typeof loadPlugins;
  19. setPluginsLayoutMode: typeof setPluginsLayoutMode;
  20. setPluginsSearchQuery: typeof setPluginsSearchQuery;
  21. }
  22. export class PluginListPage extends PureComponent<Props> {
  23. componentDidMount() {
  24. this.fetchPlugins();
  25. }
  26. async fetchPlugins() {
  27. await this.props.loadPlugins();
  28. }
  29. render() {
  30. const {
  31. hasFetched,
  32. navModel,
  33. plugins,
  34. layoutMode,
  35. setPluginsLayoutMode,
  36. setPluginsSearchQuery,
  37. searchQuery,
  38. } = this.props;
  39. const linkButton = {
  40. href: 'https://grafana.com/plugins?utm_source=grafana_plugin_list',
  41. title: 'Find more plugins on Grafana.com',
  42. };
  43. return (
  44. <Page title="Configuration: Plugins">
  45. <Page.Header model={navModel} />
  46. <Page.Contents isLoading={!hasFetched}>
  47. <>
  48. <OrgActionBar
  49. searchQuery={searchQuery}
  50. layoutMode={layoutMode}
  51. onSetLayoutMode={mode => setPluginsLayoutMode(mode)}
  52. setSearchQuery={query => setPluginsSearchQuery(query)}
  53. linkButton={linkButton}
  54. />
  55. {hasFetched && plugins && (
  56. plugins && <PluginList plugins={plugins} layoutMode={layoutMode} />
  57. )}
  58. </>
  59. </Page.Contents>
  60. </Page>
  61. );
  62. }
  63. }
  64. function mapStateToProps(state) {
  65. return {
  66. navModel: getNavModel(state.navIndex, 'plugins'),
  67. plugins: getPlugins(state.plugins),
  68. layoutMode: getLayoutMode(state.plugins),
  69. searchQuery: getPluginsSearchQuery(state.plugins),
  70. hasFetched: state.plugins.hasFetched,
  71. };
  72. }
  73. const mapDispatchToProps = {
  74. loadPlugins,
  75. setPluginsLayoutMode,
  76. setPluginsSearchQuery,
  77. };
  78. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(PluginListPage));