EditorTabBody.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import React, { PureComponent } from 'react';
  2. import CustomScrollbar from 'app/core/components/CustomScrollbar/CustomScrollbar';
  3. import { FadeIn } from 'app/core/components/Animations/FadeIn';
  4. interface Props {
  5. children: JSX.Element;
  6. main: EditorToolBarView;
  7. toolbarItems: EditorToolBarView[];
  8. }
  9. export interface EditorToolBarView {
  10. title: string;
  11. imgSrc?: string;
  12. icon?: string;
  13. render: () => JSX.Element;
  14. }
  15. interface State {
  16. openView?: EditorToolBarView;
  17. }
  18. export class EditorTabBody extends PureComponent<Props, State> {
  19. constructor(props) {
  20. super(props);
  21. this.state = {
  22. openView: null,
  23. };
  24. }
  25. onToggleToolBarView = (item: EditorToolBarView) => {
  26. this.setState({
  27. openView: item === this.state.openView ? null : item,
  28. });
  29. };
  30. onCloseOpenView = () => {
  31. this.setState({ openView: null });
  32. };
  33. renderMainSelection(view: EditorToolBarView) {
  34. return (
  35. <div className="toolbar__main" onClick={() => this.onToggleToolBarView(view)} key={view.title}>
  36. <img className="toolbar__main-image" src={view.imgSrc} />
  37. <div className="toolbar__main-name">{view.title}</div>
  38. <i className="fa fa-caret-down" />
  39. </div>
  40. );
  41. }
  42. renderButton(view: EditorToolBarView) {
  43. return (
  44. <div className="nav-buttons" key={view.title}>
  45. <button className="btn navbar-button" onClick={() => this.onToggleToolBarView(view)}>
  46. {view.icon && <i className={view.icon} />} {view.title}
  47. </button>
  48. </div>
  49. );
  50. }
  51. renderOpenView(view: EditorToolBarView) {
  52. return (
  53. <div className="toolbar-subview">
  54. <button className="toolbar-subview__close" onClick={this.onCloseOpenView}>
  55. <i className="fa fa-chevron-up" />
  56. </button>
  57. {view.render()}
  58. </div>
  59. );
  60. }
  61. render() {
  62. const { children, toolbarItems, main } = this.props;
  63. const { openView } = this.state;
  64. return (
  65. <>
  66. <div className="toolbar">
  67. {this.renderMainSelection(main)}
  68. <div className="gf-form--grow" />
  69. {toolbarItems.map(item => this.renderButton(item))}
  70. </div>
  71. <div className="panel-editor__scroll">
  72. <CustomScrollbar autoHide={false}>
  73. <div className="panel-editor__content">
  74. <FadeIn in={openView !== null} duration={200}>
  75. {openView && this.renderOpenView(openView)}
  76. </FadeIn>
  77. {children}
  78. </div>
  79. </CustomScrollbar>
  80. </div>
  81. </>
  82. );
  83. }
  84. }