EditDataSourcePage.tsx 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 DataSourcePermissions from './DataSourcePermissions';
  6. import DataSourceSettings from './DataSourceSettings';
  7. import { DataSource, NavModel } from 'app/types';
  8. import { loadDataSource } from './state/actions';
  9. import { getNavModel } from '../../core/selectors/navModel';
  10. import { getRouteParamsId, getRouteParamsPage } from '../../core/selectors/location';
  11. import { getDataSourceLoadingNav } from './state/navModel';
  12. import { getDataSource } from './state/selectors';
  13. export interface Props {
  14. navModel: NavModel;
  15. dataSource: DataSource;
  16. dataSourceId: number;
  17. pageName: string;
  18. loadDataSource: typeof loadDataSource;
  19. }
  20. enum PageTypes {
  21. Settings = 'settings',
  22. Permissions = 'permissions',
  23. Dashboards = 'dashboards',
  24. }
  25. const fallBackPage = PageTypes.Settings;
  26. export class EditDataSourcePage extends PureComponent<Props> {
  27. componentDidMount() {
  28. this.fetchDataSource();
  29. }
  30. async fetchDataSource() {
  31. await this.props.loadDataSource(this.props.dataSourceId);
  32. }
  33. isValidPage(currentPage) {
  34. return (Object as any).values(PageTypes).includes(currentPage);
  35. }
  36. getCurrentPage() {
  37. const currentPage = this.props.pageName;
  38. return this.isValidPage(currentPage) ? currentPage : fallBackPage;
  39. }
  40. renderPage() {
  41. switch (this.getCurrentPage()) {
  42. case PageTypes.Settings:
  43. return <DataSourceSettings />;
  44. case PageTypes.Permissions:
  45. return <DataSourcePermissions />;
  46. }
  47. return null;
  48. }
  49. render() {
  50. const { navModel } = this.props;
  51. return (
  52. <div>
  53. <PageHeader model={navModel} />
  54. <div className="page-container page-body">{this.renderPage()}</div>
  55. </div>
  56. );
  57. }
  58. }
  59. function mapStateToProps(state) {
  60. const pageName = getRouteParamsPage(state.location) || fallBackPage;
  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));