OperateAllControl.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React, {
  2. ChangeEvent, forwardRef, ForwardRefRenderFunction, useImperativeHandle, useRef,
  3. } from 'react';
  4. import { Input } from 'reactstrap';
  5. import { ISelectableAndIndeterminatable } from '~/client/interfaces/selectable-all';
  6. import { IndeterminateInputElement } from '~/interfaces/indeterminate-input-elm';
  7. type Props = {
  8. isCheckboxDisabled?: boolean,
  9. onCheckboxChanged?: (isChecked: boolean) => void,
  10. children?: React.ReactNode,
  11. }
  12. const OperateAllControlSubstance: ForwardRefRenderFunction<ISelectableAndIndeterminatable, Props> = (props: Props, ref): JSX.Element => {
  13. const {
  14. isCheckboxDisabled,
  15. onCheckboxChanged,
  16. children,
  17. } = props;
  18. const selectAllCheckboxElm = useRef<IndeterminateInputElement>(null);
  19. // publish ISelectable methods
  20. useImperativeHandle(ref, () => ({
  21. select: () => {
  22. const input = selectAllCheckboxElm.current;
  23. if (input != null) {
  24. input.checked = true;
  25. input.indeterminate = false;
  26. }
  27. },
  28. deselect: () => {
  29. const input = selectAllCheckboxElm.current;
  30. if (input != null) {
  31. input.checked = false;
  32. input.indeterminate = false;
  33. }
  34. },
  35. setIndeterminate: () => {
  36. const input = selectAllCheckboxElm.current;
  37. if (input != null) {
  38. input.indeterminate = true;
  39. }
  40. },
  41. }));
  42. const checkboxChangedHandler = (e: ChangeEvent<HTMLInputElement>) => {
  43. if (onCheckboxChanged != null) {
  44. onCheckboxChanged(e.target.checked);
  45. }
  46. };
  47. return (
  48. <div className="d-flex align-items-center">
  49. <Input
  50. type="checkbox"
  51. id="cb-check-all"
  52. data-testid="cb-select-all"
  53. innerRef={selectAllCheckboxElm}
  54. disabled={isCheckboxDisabled}
  55. onChange={checkboxChangedHandler}
  56. />
  57. {children}
  58. </div>
  59. );
  60. };
  61. export const OperateAllControl = React.memo(forwardRef(OperateAllControlSubstance));