ToggleButtonGroup.tsx 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import React, { PureComponent, ReactElement } from 'react';
  2. interface ToggleButtonGroupProps {
  3. onChange: (value) => void;
  4. value?: any;
  5. label?: string;
  6. }
  7. export default class ToggleButtonGroup extends PureComponent<ToggleButtonGroupProps> {
  8. getValues() {
  9. const { children } = this.props;
  10. return React.Children.toArray(children).map(c => c['props'].value);
  11. }
  12. handleToggle(toggleValue) {
  13. const { value, onChange } = this.props;
  14. if (value && value === toggleValue) {
  15. return;
  16. }
  17. onChange(toggleValue);
  18. }
  19. render() {
  20. const { children, value, label } = this.props;
  21. const values = this.getValues();
  22. const selectedValue = value || values[0];
  23. const childClones = React.Children.map(children, (child: ReactElement<any>) => {
  24. const { value: buttonValue } = child.props;
  25. return React.cloneElement(child, {
  26. selected: buttonValue === selectedValue,
  27. onChange: this.handleToggle.bind(this),
  28. });
  29. });
  30. return (
  31. <div className="gf-form">
  32. <div className="toggle-button-group">
  33. {label && <label className="gf-form-label">{label}</label>}
  34. {childClones}
  35. </div>
  36. </div>
  37. );
  38. }
  39. }