ToggleButtonGroup.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React, { SFC, ReactNode, PureComponent } from 'react';
  2. import Tooltip from 'app/core/components/Tooltip/Tooltip';
  3. interface ToggleButtonGroupProps {
  4. label?: string;
  5. children: JSX.Element[];
  6. transparent?: boolean;
  7. }
  8. export default class ToggleButtonGroup extends PureComponent<ToggleButtonGroupProps> {
  9. render() {
  10. const { children, label, transparent } = this.props;
  11. return (
  12. <div className="gf-form">
  13. {label && <label className={`gf-form-label ${transparent ? 'gf-form-label--transparent' : ''}`}>{label}</label>}
  14. <div className={`toggle-button-group ${transparent ? 'toggle-button-group--transparent' : ''}`}>{children}</div>
  15. </div>
  16. );
  17. }
  18. }
  19. interface ToggleButtonProps {
  20. onChange?: (value) => void;
  21. selected?: boolean;
  22. value: any;
  23. className?: string;
  24. children: ReactNode;
  25. tooltip?: string;
  26. }
  27. export const ToggleButton: SFC<ToggleButtonProps> = ({
  28. children,
  29. selected,
  30. className = '',
  31. value = null,
  32. tooltip,
  33. onChange,
  34. }) => {
  35. const handleChange = event => {
  36. event.stopPropagation();
  37. if (onChange) {
  38. onChange(value);
  39. }
  40. };
  41. const btnClassName = `btn ${className} ${selected ? 'active' : ''}`;
  42. const button = (
  43. <button className={btnClassName} onClick={handleChange}>
  44. <span>{children}</span>
  45. </button>
  46. );
  47. if (tooltip) {
  48. return (
  49. <Tooltip content={tooltip} placement="bottom">
  50. {button}
  51. </Tooltip>
  52. );
  53. } else {
  54. return button;
  55. }
  56. };