lineContainerComponent.tsx 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import * as React from "react";
  2. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  3. import { faChevronDown } from '@fortawesome/free-solid-svg-icons';
  4. interface ILineContainerComponentProps {
  5. title: string,
  6. children: any[] | any,
  7. closed?: boolean
  8. }
  9. export class LineContainerComponent extends React.Component<ILineContainerComponentProps, { isExpanded: boolean }> {
  10. private static _InMemoryStorage: {[key: string]: boolean};
  11. constructor(props: ILineContainerComponentProps) {
  12. super(props);
  13. let initialState: boolean;
  14. try
  15. {
  16. if (LineContainerComponent._InMemoryStorage && LineContainerComponent._InMemoryStorage[this.props.title] !== undefined) {
  17. initialState = LineContainerComponent._InMemoryStorage[this.props.title];
  18. } else if (typeof (Storage) !== "undefined" && localStorage.getItem(this.props.title) !== null) {
  19. initialState = localStorage.getItem(this.props.title) === "true";
  20. } else {
  21. initialState = !this.props.closed;
  22. }
  23. }
  24. catch (e) {
  25. LineContainerComponent._InMemoryStorage = {};
  26. LineContainerComponent._InMemoryStorage[this.props.title] = !this.props.closed
  27. initialState = !this.props.closed;
  28. }
  29. this.state = { isExpanded: initialState };
  30. }
  31. switchExpandedState(): void {
  32. const newState = !this.state.isExpanded;
  33. try
  34. {
  35. if (LineContainerComponent._InMemoryStorage) {
  36. LineContainerComponent._InMemoryStorage[this.props.title] = newState;
  37. } else if (typeof (Storage) !== "undefined") {
  38. localStorage.setItem(this.props.title, newState ? "true" : "false");
  39. }
  40. }
  41. catch (e) {
  42. LineContainerComponent._InMemoryStorage = {};
  43. LineContainerComponent._InMemoryStorage[this.props.title] = newState;
  44. }
  45. this.setState({ isExpanded: newState });
  46. }
  47. renderHeader() {
  48. const className = this.state.isExpanded ? "collapse" : "collapse closed";
  49. return (
  50. <div className="header" onClick={() => this.switchExpandedState()}>
  51. <div className="title">
  52. {this.props.title}
  53. </div>
  54. <div className={className}>
  55. <FontAwesomeIcon icon={faChevronDown} />
  56. </div>
  57. </div>
  58. )
  59. }
  60. render() {
  61. if (!this.state.isExpanded) {
  62. return (
  63. <div className="paneContainer">
  64. {
  65. this.renderHeader()
  66. }
  67. </div>
  68. )
  69. }
  70. return (
  71. <div className="paneContainer">
  72. {
  73. this.renderHeader()
  74. }
  75. <div className="paneList">
  76. {this.props.children}
  77. </div >
  78. </div>
  79. );
  80. }
  81. }