AuditLogManagement.tsx 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import React, { FC, useState, useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import {
  4. SupportedActionType, AllSupportedPageAction, AllSupportedCommentAction, AllSupportedActionType,
  5. } from '~/interfaces/activity';
  6. import { useSWRxActivityList } from '~/stores/activity';
  7. import PaginationWrapper from '../PaginationWrapper';
  8. import { ActivityTable } from './AuditLog/ActivityTable';
  9. import { SelectActionDropdown } from './AuditLog/SelectActionDropdown';
  10. const PAGING_LIMIT = 10;
  11. export const AuditLogManagement: FC = () => {
  12. const { t } = useTranslation();
  13. /*
  14. * State
  15. */
  16. const [activePage, setActivePage] = useState<number>(1);
  17. const offset = (activePage - 1) * PAGING_LIMIT;
  18. const [actionMap, setActionMap] = useState(
  19. new Map<SupportedActionType, boolean>(AllSupportedActionType.map(action => [action, true])),
  20. );
  21. /*
  22. * Fetch
  23. */
  24. const selectedActionList = Array.from(actionMap.entries()).filter(v => v[1]).map(v => v[0]);
  25. const searchFilter = { action: selectedActionList };
  26. const { data: activityListData, error } = useSWRxActivityList(PAGING_LIMIT, offset, searchFilter);
  27. const activityList = activityListData?.docs != null ? activityListData.docs : [];
  28. const totalActivityNum = activityListData?.totalDocs != null ? activityListData.totalDocs : 0;
  29. const isLoading = activityListData === undefined && error == null;
  30. /*
  31. * Functions
  32. */
  33. const setActivePageHandler = useCallback((selectedPageNum: number) => {
  34. setActivePage(selectedPageNum);
  35. }, []);
  36. const selectActionCheckboxChangedHandler = useCallback((action: SupportedActionType) => {
  37. actionMap.set(action, !actionMap.get(action));
  38. setActionMap(new Map(actionMap.entries()));
  39. }, [actionMap, setActionMap]);
  40. const selectAllActionCheckboxChangedHandler = useCallback((actions: SupportedActionType[], isChecked) => {
  41. actions.forEach(action => actionMap.set(action, isChecked));
  42. setActionMap(new Map(actionMap.entries()));
  43. }, [actionMap, setActionMap]);
  44. return (
  45. <div data-testid="admin-auditlog">
  46. <h2>{t('AuditLog')}</h2>
  47. <SelectActionDropdown
  48. dropdownItems={[
  49. { actionCategory: 'Page', actionNames: AllSupportedPageAction },
  50. { actionCategory: 'Comment', actionNames: AllSupportedCommentAction },
  51. ]}
  52. actionMap={actionMap}
  53. onSelectAction={selectActionCheckboxChangedHandler}
  54. onSelectAllACtion={selectAllActionCheckboxChangedHandler}
  55. />
  56. { isLoading
  57. ? (
  58. <div className="text-muted text-center mb-5">
  59. <i className="fa fa-2x fa-spinner fa-pulse mr-1"></i>
  60. </div>
  61. )
  62. : (
  63. <>
  64. <ActivityTable activityList={activityList} />
  65. <PaginationWrapper
  66. activePage={activePage}
  67. changePage={setActivePageHandler}
  68. totalItemsCount={totalActivityNum}
  69. pagingLimit={PAGING_LIMIT}
  70. align="center"
  71. size="sm"
  72. />
  73. </>
  74. )
  75. }
  76. </div>
  77. );
  78. };