OptionGroup.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import React, { PureComponent } from 'react';
  2. import { GroupProps } from 'react-select/lib/components/Group';
  3. interface ExtendedGroupProps extends GroupProps<any> {
  4. data: {
  5. label: string;
  6. expanded: boolean;
  7. options: any[];
  8. };
  9. }
  10. interface State {
  11. expanded: boolean;
  12. }
  13. export default class OptionGroup extends PureComponent<ExtendedGroupProps, State> {
  14. state = {
  15. expanded: false,
  16. };
  17. componentDidMount() {
  18. if (this.props.data.expanded) {
  19. this.setState({ expanded: true });
  20. } else if (this.props.selectProps && this.props.selectProps.value) {
  21. const { value } = this.props.selectProps.value;
  22. if (value && this.props.options.some(option => option.value === value)) {
  23. this.setState({ expanded: true });
  24. }
  25. }
  26. }
  27. componentDidUpdate(nextProps) {
  28. if (nextProps.selectProps.inputValue !== '') {
  29. this.setState({ expanded: true });
  30. }
  31. }
  32. onToggleChildren = () => {
  33. this.setState(prevState => ({
  34. expanded: !prevState.expanded,
  35. }));
  36. };
  37. render() {
  38. const { children, label } = this.props;
  39. const { expanded } = this.state;
  40. return (
  41. <div className="gf-form-select-box__option-group">
  42. <div className="gf-form-select-box__option-group__header" onClick={this.onToggleChildren}>
  43. <span className="flex-grow">{label}</span>
  44. <i className={`fa ${expanded ? 'fa-caret-left' : 'fa-caret-down'}`} />{' '}
  45. </div>
  46. {expanded && children}
  47. </div>
  48. );
  49. }
  50. }