OperateAllControl.tsx 1.8 KB

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