2
0

OperateAllControl.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, {
  2. ChangeEvent, FC, useEffect, useMemo, useRef, useState,
  3. } from 'react';
  4. import { IndeterminateInputElement } from '~/interfaces/indeterminate-input-elm';
  5. import { CheckboxType } from '~/interfaces/search';
  6. export type SelectAllHook = {
  7. checkboxType: CheckboxType,
  8. setSelectedCount: (selectedCount: number) => void,
  9. }
  10. export const useSelectAll = (totalItemsCount: number | undefined): SelectAllHook => {
  11. const [selectedCount, setSelectedCount] = useState(0);
  12. const checkboxType = useMemo(() => {
  13. if (selectedCount === 0) {
  14. return CheckboxType.NONE_CHECKED;
  15. }
  16. if (selectedCount === totalItemsCount) {
  17. return CheckboxType.ALL_CHECKED;
  18. }
  19. return CheckboxType.INDETERMINATE;
  20. }, [selectedCount, totalItemsCount]);
  21. return {
  22. checkboxType,
  23. setSelectedCount,
  24. };
  25. };
  26. type Props = {
  27. checkboxType: CheckboxType,
  28. isCheckboxDisabled?: boolean,
  29. onCheckboxChanged?: (isChecked: boolean) => void,
  30. children?: React.ReactNode,
  31. }
  32. export const OperateAllControl :FC<Props> = React.memo((props: Props) => {
  33. const {
  34. checkboxType,
  35. isCheckboxDisabled,
  36. onCheckboxChanged,
  37. children,
  38. } = props;
  39. const checkboxChangedHandler = (e: ChangeEvent<HTMLInputElement>) => {
  40. if (onCheckboxChanged != null) {
  41. onCheckboxChanged(e.target.checked);
  42. }
  43. };
  44. const selectAllCheckboxElm = useRef<IndeterminateInputElement>(null);
  45. useEffect(() => {
  46. const checkbox = selectAllCheckboxElm.current;
  47. if (checkbox == null) {
  48. return;
  49. }
  50. switch (checkboxType) {
  51. case CheckboxType.NONE_CHECKED:
  52. checkbox.indeterminate = false;
  53. checkbox.checked = false;
  54. break;
  55. case CheckboxType.ALL_CHECKED:
  56. checkbox.indeterminate = false;
  57. checkbox.checked = true;
  58. break;
  59. case CheckboxType.INDETERMINATE:
  60. checkbox.indeterminate = true;
  61. break;
  62. }
  63. }, [checkboxType]);
  64. return (
  65. <div className="d-flex align-items-center">
  66. <input
  67. id="check-all-pages"
  68. type="checkbox"
  69. name="check-all-pages"
  70. className="grw-indeterminate-checkbox"
  71. ref={selectAllCheckboxElm}
  72. disabled={isCheckboxDisabled}
  73. onChange={checkboxChangedHandler}
  74. />
  75. {children}
  76. </div>
  77. );
  78. });