2
0

OperateAllControl.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import React, {
  2. ChangeEvent, forwardRef, ForwardRefRenderFunction, useImperativeHandle, useRef,
  3. } from 'react';
  4. import { CustomInput } 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. <CustomInput
  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. <span className="ml-2">
  58. {children}
  59. </span>
  60. </div>
  61. );
  62. };
  63. export const OperateAllControl = React.memo(forwardRef(OperateAllControlSubstance));