EditDataSourcePage.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import PageHeader from '../../core/components/PageHeader/PageHeader';
  5. import { DataSource, NavModel } from 'app/types';
  6. import { loadDataSource } from './state/actions';
  7. import { getNavModel } from '../../core/selectors/navModel';
  8. import { getRouteParamsId, getRouteParamsPage } from '../../core/selectors/location';
  9. import { getDataSourceLoadingNav } from './state/navModel';
  10. import { getDataSource } from './state/selectors';
  11. export interface Props {
  12. navModel: NavModel;
  13. dataSource: DataSource;
  14. dataSourceId: number;
  15. pageName: string;
  16. loadDataSource: typeof loadDataSource;
  17. }
  18. enum PageTypes {
  19. Settings = 'settings',
  20. Permissions = 'permissions',
  21. Dashboards = 'dashboards',
  22. }
  23. export class EditDataSourcePage extends PureComponent<Props> {
  24. componentDidMount() {
  25. this.fetchDataSource();
  26. }
  27. async fetchDataSource() {
  28. await this.props.loadDataSource(this.props.dataSourceId);
  29. }
  30. isValidPage(currentPage) {
  31. return (Object as any).values(PageTypes).includes(currentPage);
  32. }
  33. getCurrentPage() {
  34. const currentPage = this.props.pageName;
  35. return this.isValidPage(currentPage) ? currentPage : PageTypes.Settings;
  36. }
  37. renderPage() {
  38. switch (this.getCurrentPage()) {
  39. case PageTypes.Settings:
  40. return <div>Settings</div>;
  41. case PageTypes.Permissions:
  42. return <div>Permissions</div>;
  43. case PageTypes.Dashboards:
  44. return <div>Dashboards</div>;
  45. }
  46. return null;
  47. }
  48. render() {
  49. const { navModel } = this.props;
  50. return (
  51. <div>
  52. <PageHeader model={navModel} />
  53. <div className="page-container page-body" />
  54. {this.renderPage()}
  55. </div>
  56. );
  57. }
  58. }
  59. function mapStateToProps(state) {
  60. const pageName = getRouteParamsPage(state.location) || 'settings';
  61. const dataSourceId = getRouteParamsId(state.location);
  62. const dataSourceLoadingNav = getDataSourceLoadingNav(pageName);
  63. return {
  64. navModel: getNavModel(state.navIndex, `datasource-${pageName}-${dataSourceId}`, dataSourceLoadingNav),
  65. dataSourceId: dataSourceId,
  66. dataSource: getDataSource(state.dataSources, dataSourceId),
  67. pageName: pageName,
  68. };
  69. }
  70. const mapDispatchToProps = {
  71. loadDataSource,
  72. };
  73. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(EditDataSourcePage));