SelectActionDropdown.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import React, { FC, useCallback } from 'react';
  2. import { SupportedActionType } from '~/interfaces/activity';
  3. type Props = {
  4. dropdownItems: Array<{actionCategory: string, actionNames: SupportedActionType[]}>
  5. actionMap: Map<SupportedActionType, boolean>
  6. onChangeAction: (action: SupportedActionType) => void
  7. onChangeMultipleAction: (actions: SupportedActionType[], isChecked: boolean) => void
  8. }
  9. export const SelectActionDropdown: FC<Props> = (props: Props) => {
  10. const {
  11. dropdownItems, actionMap, onChangeAction, onChangeMultipleAction,
  12. } = props;
  13. const actionCheckboxChangedHandler = useCallback((action) => {
  14. if (onChangeAction != null) {
  15. onChangeAction(action);
  16. }
  17. }, [onChangeAction]);
  18. const multipleActionCheckboxChangedHandler = useCallback((actions, isChecked) => {
  19. if (onChangeMultipleAction != null) {
  20. onChangeMultipleAction(actions, isChecked);
  21. }
  22. }, [onChangeMultipleAction]);
  23. return (
  24. <div className="btn-group mr-2">
  25. <button className="btn btn-outline-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown">
  26. <i className="fa fa-fw fa-bolt" />Action
  27. </button>
  28. <ul className="dropdown-menu" aria-labelledby="dropdownMenuButton">
  29. {dropdownItems.map(item => (
  30. <div key={item.actionCategory}>
  31. <div className="dropdown-item">
  32. <div className="form-group px-2 m-0">
  33. <input
  34. type="checkbox"
  35. className="form-check-input"
  36. defaultChecked
  37. onChange={(e) => { multipleActionCheckboxChangedHandler(item.actionNames, e.target.checked) }}
  38. />
  39. <label className="form-check-label">{item.actionCategory}</label>
  40. </div>
  41. </div>
  42. {
  43. item.actionNames.map(action => (
  44. <div className="dropdown-item" key={action}>
  45. <div className="form-group px-4 m-0">
  46. <input
  47. type="checkbox"
  48. className="form-check-input"
  49. id={`checkbox${action}`}
  50. onChange={() => { actionCheckboxChangedHandler(action) }}
  51. checked={actionMap.get(action)}
  52. />
  53. <label
  54. className="form-check-label"
  55. htmlFor={`checkbox${action}`}
  56. >
  57. {action}
  58. </label>
  59. </div>
  60. </div>
  61. ))
  62. }
  63. </div>
  64. ))}
  65. </ul>
  66. </div>
  67. );
  68. };