lineContainerComponent.tsx 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import * as React from "react";
  2. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  3. import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
  4. import { DataStorage } from '../dataStorage';
  5. interface ILineContainerComponentProps {
  6. title: string;
  7. children: any[] | any;
  8. closed?: boolean;
  9. }
  10. export class LineContainerComponent extends React.Component<ILineContainerComponentProps, { isExpanded: boolean }> {
  11. constructor(props: ILineContainerComponentProps) {
  12. super(props);
  13. let initialState = DataStorage.ReadBoolean(this.props.title, !this.props.closed);
  14. this.state = { isExpanded: initialState };
  15. }
  16. switchExpandedState(): void {
  17. const newState = !this.state.isExpanded;
  18. DataStorage.StoreBoolean(this.props.title, newState);
  19. this.setState({ isExpanded: newState });
  20. }
  21. renderHeader() {
  22. const className = this.state.isExpanded ? "collapse" : "collapse closed";
  23. return (
  24. <div className="header" onClick={() => this.switchExpandedState()}>
  25. <div className="title">
  26. {this.props.title}
  27. </div>
  28. <div className={className}>
  29. <FontAwesomeIcon icon={faChevronDown} />
  30. </div>
  31. </div>
  32. );
  33. }
  34. render() {
  35. if (!this.state.isExpanded) {
  36. return (
  37. <div className="paneContainer">
  38. <div className="paneContainer-content">
  39. {
  40. this.renderHeader()
  41. }
  42. </div>
  43. </div>
  44. );
  45. }
  46. return (
  47. <div className="paneContainer">
  48. <div className="paneContainer-content">
  49. {
  50. this.renderHeader()
  51. }
  52. <div className="paneList">
  53. {this.props.children}
  54. </div >
  55. </div>
  56. </div>
  57. );
  58. }
  59. }