TableContainer.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { Collapse } from '@grafana/ui';
  5. import { ExploreId, ExploreItemState } from 'app/types/explore';
  6. import { StoreState } from 'app/types';
  7. import { toggleTable } from './state/actions';
  8. import Table from './Table';
  9. import TableModel from 'app/core/table_model';
  10. interface TableContainerProps {
  11. exploreId: ExploreId;
  12. loading: boolean;
  13. onClickCell: (key: string, value: string) => void;
  14. showingTable: boolean;
  15. tableResult?: TableModel;
  16. toggleTable: typeof toggleTable;
  17. }
  18. export class TableContainer extends PureComponent<TableContainerProps> {
  19. onClickTableButton = () => {
  20. this.props.toggleTable(this.props.exploreId, this.props.showingTable);
  21. };
  22. render() {
  23. const { loading, onClickCell, showingTable, tableResult } = this.props;
  24. return (
  25. <Collapse label="Table" loading={loading} collapsible isOpen={showingTable} onToggle={this.onClickTableButton}>
  26. {tableResult && <Table data={tableResult} loading={loading} onClickCell={onClickCell} />}
  27. </Collapse>
  28. );
  29. }
  30. }
  31. function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }) {
  32. const explore = state.explore;
  33. // @ts-ignore
  34. const item: ExploreItemState = explore[exploreId];
  35. const { loading: loadingInState, showingTable, tableResult } = item;
  36. const loading = tableResult && tableResult.rows.length > 0 ? false : loadingInState;
  37. return { loading, showingTable, tableResult };
  38. }
  39. const mapDispatchToProps = {
  40. toggleTable,
  41. };
  42. export default hot(module)(
  43. connect(
  44. mapStateToProps,
  45. mapDispatchToProps
  46. )(TableContainer)
  47. );