SelectActionDropdown.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import React, { FC, useMemo, useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import {
  4. SupportedActionType, SupportedActionCategoryType, SupportedActionCategory,
  5. PageActions, CommentActions, TagActions, ShareLinkActions, AttachmentActions, InAppNotificationActions, SearchActions, UserActions, AdminActions,
  6. } from '~/interfaces/activity';
  7. type Props = {
  8. actionMap: Map<SupportedActionType, boolean>
  9. availableActions: SupportedActionType[]
  10. onChangeAction: (action: SupportedActionType) => void
  11. onChangeMultipleAction: (actions: SupportedActionType[], isChecked: boolean) => void
  12. }
  13. export const SelectActionDropdown: FC<Props> = (props: Props) => {
  14. const { t } = useTranslation();
  15. const {
  16. actionMap, availableActions, onChangeAction, onChangeMultipleAction,
  17. } = props;
  18. const dropdownItems = useMemo<Array<{actionCategory: SupportedActionCategoryType, actions: SupportedActionType[]}>>(() => {
  19. return (
  20. [
  21. {
  22. actionCategory: SupportedActionCategory.PAGE,
  23. actions: PageActions.filter(action => availableActions.includes(action)),
  24. },
  25. {
  26. actionCategory: SupportedActionCategory.COMMENT,
  27. actions: CommentActions.filter(action => availableActions.includes(action)),
  28. },
  29. {
  30. actionCategory: SupportedActionCategory.TAG,
  31. actions: TagActions.filter(action => availableActions.includes(action)),
  32. },
  33. {
  34. actionCategory: SupportedActionCategory.ATTACHMENT,
  35. actions: AttachmentActions.filter(action => availableActions.includes(action)),
  36. },
  37. {
  38. actionCategory: SupportedActionCategory.SHARE_LINK,
  39. actions: ShareLinkActions.filter(action => availableActions.includes(action)),
  40. },
  41. {
  42. actionCategory: SupportedActionCategory.IN_APP_NOTIFICATION,
  43. actions: InAppNotificationActions.filter(action => availableActions.includes(action)),
  44. },
  45. {
  46. actionCategory: SupportedActionCategory.SEARCH,
  47. actions: SearchActions.filter(action => availableActions.includes(action)),
  48. },
  49. {
  50. actionCategory: SupportedActionCategory.USER,
  51. actions: UserActions.filter(action => availableActions.includes(action)),
  52. },
  53. {
  54. actionCategory: SupportedActionCategory.ADMIN,
  55. actions: AdminActions.filter(action => availableActions.includes(action)),
  56. },
  57. ]
  58. );
  59. }, [availableActions]).filter(item => item.actions.length !== 0);
  60. const actionCheckboxChangedHandler = useCallback((action) => {
  61. if (onChangeAction != null) {
  62. onChangeAction(action);
  63. }
  64. }, [onChangeAction]);
  65. const multipleActionCheckboxChangedHandler = useCallback((actions, isChecked) => {
  66. if (onChangeMultipleAction != null) {
  67. onChangeMultipleAction(actions, isChecked);
  68. }
  69. }, [onChangeMultipleAction]);
  70. return (
  71. <div className="btn-group mr-2 admin-audit-log">
  72. <button className="btn btn-outline-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown">
  73. <i className="fa fa-fw fa-bolt" />{t('admin:audit_log_management.action')}
  74. </button>
  75. <ul className="dropdown-menu select-action-dropdown" aria-labelledby="dropdownMenuButton">
  76. {dropdownItems.map(item => (
  77. <div key={item.actionCategory}>
  78. <div className="dropdown-item">
  79. <div className="form-group px-2 m-0">
  80. <input
  81. type="checkbox"
  82. className="form-check-input"
  83. defaultChecked
  84. onChange={(e) => { multipleActionCheckboxChangedHandler(item.actions, e.target.checked) }}
  85. />
  86. <label className="form-check-label">{t(`admin:audit_log_action_category.${item.actionCategory}`)}</label>
  87. </div>
  88. </div>
  89. {
  90. item.actions.map(action => (
  91. <div className="dropdown-item" key={action}>
  92. <div className="form-group px-4 m-0">
  93. <input
  94. type="checkbox"
  95. className="form-check-input"
  96. id={`checkbox${action}`}
  97. onChange={() => { actionCheckboxChangedHandler(action) }}
  98. checked={actionMap.get(action)}
  99. />
  100. <label
  101. className="form-check-label"
  102. htmlFor={`checkbox${action}`}
  103. >
  104. {t(`admin:audit_log_action.${action}`)}
  105. </label>
  106. </div>
  107. </div>
  108. ))
  109. }
  110. </div>
  111. ))}
  112. </ul>
  113. </div>
  114. );
  115. };